gspiceui-1.0.00+dfsg/0000755000000000000000000000000011752030331013010 5ustar rootrootgspiceui-1.0.00+dfsg/ToDo0000644000000000000000000000524511640453662013622 0ustar rootroot ToDo ------ Start Date : 05/04/2004 Last Update : 28/09/2011 ------------------------------------------------------------------------------- gSpiceUI - A Graphical User Interface (GUI) to various freely available electronic circuit simulator engines. Author : Mike Waters Email : M.Waters@bom.gov.au ------------------------------------------------------------------------------- The following list contains "things to do" in the medium to long term. Bugs wont tend to appear here unless they're particular thorny. (Tasks and bug fixes to be addressed in the short term are listed in src/Version.hpp) : * After a simulation has run, if the data viewer utility is open tell it to reload the results file. * Could an existing opamp symbol be used in schematics instead of my symbol in the file opamp-3.sym? * Maybe all Open dialogs should accommodate upper case file extensions as well as lower case. * For AC analysis if results magnitudes are in dB chosen how about displaying Signal Source magnitude in dB. * If user envokes either of the schematic editor or data viewer utilities and it is already running bring it to the foreground instead of displaying an error message dialog. * Add a preferences setting for the desired units of angle. * When a simulation is ends prematurely because of problems encountered by the simulation engine, notify the user that this has happened. Need a mechanism to determining if the end of the sweep range was actually been reached. * Add a mechanism for envoking a calculator which the user may nominate in the preferences dialog (the best one I've found so far is galculator). * Create a dialog which shows which utilities have or haven't been found. * Use standard component values in PnlValue controls displaying R, L or C. * Automatically add ".MODEL" statements to netlist file if they are missing. * Create a class for circuit description models. * Create a class for circuit description sub-circuits. * Complete the implementation of status message. * Complete the implementation of tool tips. * Remove the discontinuity at 360 degrees from the phase results. * Remember the position of gWave or Gaw and place it there when it's envoked. * PnlValue & SpinCtrl classes should object if non-numeric chars are entered. * Allow the SpinCtrl class to be changed using the up and down arrow keys. * Develop a mechanism by which the user may set the initial conditions for the transient analysis. * Provide complete documentation. * Fix bugs, bugs and more bugs. ------------------------------------------------------------------------------- gspiceui-1.0.00+dfsg/Makefile0000644000000000000000000001506711640616363014474 0ustar rootroot#****************************************************************************** # Makefile * # ---------- * # Description : Makefile for GNU Spice GUI project house-keeping. * # Started : 08/01/2004 * # Last update : 29/09/2011 * # Copyright : (C) 2004 by MSWaters * # Email : M.Waters@bom.gov.au * #****************************************************************************** #****************************************************************************** # * # This program is free software; you can redistribute it and/or modify * # it under the terms of the GNU General Public License as published by * # the Free Software Foundation; either version 2 of the License, or * # (at your option) any later version. * # * #****************************************************************************** #****************************************************************************** # Any or all of the values in this section may be set below or on the command # line when envoking make eg. : # # make INSTALLDIR=/new/dest/dir install # make INSTALLDIR=/new/dest/dir uninstall # # Note : Values specified on the command line over-ride those specified below. #****************************************************************************** #DESTDIR = /new/dest/dir # Install directory ifndef DESTDIR INSTALLDIR = /usr/local else INSTALLDIR = $(DESTDIR) endif #****************************************************************************** # Specify string values #****************************************************************************** # Root directory ROOT := $(shell pwd) #****************************************************************************** # Make these targets #****************************************************************************** all : $(MAKE) config cd $(ROOT)/src ; $(MAKE) #****************************************************************************** # Calculate the size of the various sources making up this project #****************************************************************************** size : $(ROOT)/charcnt.sh >> charcnt.txt #****************************************************************************** # Create an archive of the essential project files as follows : # # 1. Change the make variable "TAR_NAME" (below) to the current version no. # 2. Execute "make tar" from the project root directory. #****************************************************************************** TAR_NAME=gspiceui-v1.0.00 TAR_DEST= $(TAR_NAME)/$(TAR_NAME).tar.gz TAR_SRCS =$(TAR_NAME)/Authors TAR_SRCS+=$(TAR_NAME)/ChangeLog TAR_SRCS+=$(TAR_NAME)/Install TAR_SRCS+=$(TAR_NAME)/License TAR_SRCS+=$(TAR_NAME)/Makefile TAR_SRCS+=$(TAR_NAME)/ReadMe TAR_SRCS+=$(TAR_NAME)/ToDo TAR_SRCS+=$(TAR_NAME)/gspiceui.1 TAR_SRCS+=$(TAR_NAME)/gspiceui.lsm TAR_SRCS+=$(TAR_NAME)/src/* TAR_SRCS+=$(TAR_NAME)/html/Makefile TAR_SRCS+=$(TAR_NAME)/html/*.html TAR_SRCS+=$(TAR_NAME)/html/*.jpg TAR_SRCS+=$(TAR_NAME)/sch/Makefile TAR_SRCS+=$(TAR_NAME)/sch/*/*.sch TAR_SRCS+=$(TAR_NAME)/lib/Makefile TAR_SRCS+=$(TAR_NAME)/lib/*/*.ckt TAR_SRCS+=$(TAR_NAME)/lib/*/*.mod TAR_SRCS+=$(TAR_NAME)/lib/sym/* TAR_SRCS+=$(TAR_NAME)/mac/Info.plist TAR_SRCS+=$(TAR_NAME)/mac/GSpiceUI.icns TAR_SRCS+=$(TAR_NAME)/fig/Makefile TAR_SRCS+=$(TAR_NAME)/fig/*.fig tar : make clean cd fig ; make ; cd .. cd .. ; mv gspiceui $(TAR_NAME) cd .. ; tar --totals --exclude .svn -zcf $(TAR_DEST) $(TAR_SRCS) cd .. ; mv $(TAR_NAME) gspiceui #****************************************************************************** # Perform configuration tasks #****************************************************************************** # Everyone should call this once config : ifneq ($(ROOT)/bin,$(wildcard $(ROOT)/bin)) mkdir $(ROOT)/bin endif ifneq ($(ROOT)/src/obj,$(wildcard $(ROOT)/src/obj)) mkdir $(ROOT)/src/obj endif # You should also call this once if running on a MAC maccfg : $(ROOT)/mac/Info.plist $(ROOT)/mac/GSpiceUI.icns ifneq ($(ROOT)/GSpiceUI.app,$(wildcard $(ROOT)/GSpiceUI.app)) -mkdir $(ROOT)/GSpiceUI.app -mkdir $(ROOT)/GSpiceUI.app/Contents -mkdir $(ROOT)/GSpiceUI.app/Contents/MacOS -mkdir $(ROOT)/GSpiceUI.app/Contents/Resources cp $(ROOT)/mac/Info.plist $(ROOT)/GSpiceUI.app/Contents/ echo -n 'APPL????' > $(ROOT)/GSpiceUI.app/Contents/PkgInfo cp $(ROOT)/mac/GSpiceUI.icns $(ROOT)/GSpiceUI.app/Contents/Resources/ endif #****************************************************************************** # Perform installation tasks #****************************************************************************** install : mkdir -p $(INSTALLDIR)/share/gspiceui cp ReadMe $(INSTALLDIR)/share/gspiceui cp Install $(INSTALLDIR)/share/gspiceui cp ChangeLog $(INSTALLDIR)/share/gspiceui mkdir -p $(INSTALLDIR)/share/gspiceui/icons cp src/icons/gspiceui-*.xpm $(INSTALLDIR)/share/gspiceui/icons mkdir -p $(INSTALLDIR)/share/man/man1 cp gspiceui.1 $(INSTALLDIR)/share/man/man1 cd $(ROOT)/src ; $(MAKE) install INSTALLDIR=$(INSTALLDIR) cd $(ROOT)/html ; $(MAKE) install INSTALLDIR=$(INSTALLDIR) cd $(ROOT)/sch ; $(MAKE) install INSTALLDIR=$(INSTALLDIR) cd $(ROOT)/lib ; $(MAKE) install INSTALLDIR=$(INSTALLDIR) #****************************************************************************** # Perform uninstall tasks #****************************************************************************** uninstall : rm -fr $(INSTALLDIR)/share/gspiceui rm -f $(INSTALLDIR)/share/man/man1/gspiceui.1 #****************************************************************************** # Remove temporary files and backup files #****************************************************************************** clean : rm -f Makefile~ charcnt~ cd $(ROOT)/src ; $(MAKE) cleanall cd $(ROOT)/html ; $(MAKE) clean cd $(ROOT)/sch ; $(MAKE) clean cd $(ROOT)/lib ; $(MAKE) clean #****************************************************************************** # Specify phony targets #****************************************************************************** .PHONY : size tar config install uninstall clean #****************************************************************************** gspiceui-1.0.00+dfsg/src/0000755000000000000000000000000011752030331013577 5ustar rootrootgspiceui-1.0.00+dfsg/src/gnucap/0000755000000000000000000000000011631151627015064 5ustar rootrootgspiceui-1.0.00+dfsg/src/gnucap/NbkGnuCap.cpp0000644000000000000000000002756211631151627017414 0ustar rootroot//***************************************************************************** // NbkGnuCap.cpp * // --------------- * // Started : 05/09/2003 * // Last Update : 06/09/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/NbkGnuCap.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( NbkGnuCap, NbkSimrBase ) EVT_NOTEBOOK_PAGE_CHANGED( -1, NbkGnuCap::OnPageChangd ) EVT_BUTTON( PnlAnaBase::ID_BTN_OPTIONS, NbkGnuCap::OnBtnOptions ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Arguments: // poParent - The parent window // oWinID - The display object ID // roPosn - The notebook position // roSize - The notebook size NbkGnuCap::NbkGnuCap( wxWindow * poParent, wxWindowID oWinID ) : NbkSimrBase( poParent, oWinID ), m_oDlgCfgOPT( poParent ) { // Set the simulator engine type specifier m_eSimEng = eSIMR_GNUCAP; // Create the various display objects m_poPnlGnuCapOP = new PnlGnuCapOP( this ); m_poPnlGnuCapDC = new PnlGnuCapDC( this ); m_poPnlGnuCapAC = new PnlGnuCapAC( this ); m_poPnlGnuCapTR = new PnlGnuCapTR( this ); m_poPnlGnuCapFO = new PnlGnuCapFO( this ); // Add the display objects to the note book AddPage( m_poPnlGnuCapOP, wxT( " Quiescent " ) ); AddPage( m_poPnlGnuCapDC, wxT( " DC " ) ); AddPage( m_poPnlGnuCapAC, wxT( " AC " ) ); AddPage( m_poPnlGnuCapTR, wxT( " Transient " ) ); AddPage( m_poPnlGnuCapFO, wxT( " Fourier " ) ); // Specify the default page to be displayed SetSelection( 0 ); } //***************************************************************************** // Destructor. NbkGnuCap::~NbkGnuCap( ) { } //***************************************************************************** // Clear the object attributes. // // Return Values: // TRUE - Success // FALSE - Failure bool NbkGnuCap::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! NbkSimrBase ::bClear( ) ) bRtn = FALSE; if( ! m_poPnlGnuCapOP->bClear( ) ) bRtn = FALSE; if( ! m_poPnlGnuCapDC->bClear( ) ) bRtn = FALSE; if( ! m_poPnlGnuCapAC->bClear( ) ) bRtn = FALSE; if( ! m_poPnlGnuCapTR->bClear( ) ) bRtn = FALSE; if( ! m_poPnlGnuCapFO->bClear( ) ) bRtn = FALSE; if( ! m_oDlgCfgOPT .bClear( ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List: // roSimn - The simulation object // // Return Values: // TRUE - Success // FALSE - Failure bool NbkGnuCap::bLoad( const SimnBase & roSimn ) { bool bRtn=TRUE; if( roSimn.eGetSimEng( ) != eSIMR_GNUCAP ) return( FALSE ); PnlAnaBase::m_oCpntSwpSrcs = roSimn.m_oCpntSwpSrc; SimnGnuCap & roSimnGcp = (SimnGnuCap &) roSimn; if( ! bSetPage( roSimnGcp.eGetAnaType( ) ) ) bRtn = FALSE; if( ! m_poPnlGnuCapOP->bLoad( roSimnGcp ) ) bRtn = FALSE; if( ! m_poPnlGnuCapDC->bLoad( roSimnGcp ) ) bRtn = FALSE; if( ! m_poPnlGnuCapAC->bLoad( roSimnGcp ) ) bRtn = FALSE; if( ! m_poPnlGnuCapTR->bLoad( roSimnGcp ) ) bRtn = FALSE; if( ! m_poPnlGnuCapFO->bLoad( roSimnGcp ) ) bRtn = FALSE; if( ! m_oDlgCfgOPT.bSetValues( roSimnGcp.m_oCmdOPT ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List: // roSimn - The simulation object // // Return Values: // TRUE - Success // FALSE - Failure bool NbkGnuCap::bSave( SimnBase & roSimn ) { wxString os1; // Only proceed if this is an GNU-Cap simulation object if( roSimn.eGetSimEng( ) != eSIMR_GNUCAP ) return( FALSE ); SimnGnuCap & roSimnGcp = (SimnGnuCap &) roSimn; // Clear the error string NbkSimrBase::m_osErrMsg.Empty( ); // Create the analysis command/s switch( GetSelection( ) ) { case 0 : // OP analysis if( m_poPnlGnuCapOP->bSave( roSimnGcp ) ) os1.Empty( ); else SetErrMsg( m_poPnlGnuCapOP->rosGetErrMsg( ) ); break; case 1 : // DC analysis if( m_poPnlGnuCapDC->bSave( roSimnGcp ) ) os1 = roSimnGcp.m_oCmdDC.m_osTempC; else SetErrMsg( m_poPnlGnuCapDC->rosGetErrMsg( ) ); break; case 2 : // AC analysis if( m_poPnlGnuCapAC->bSave( roSimnGcp ) ) os1 = roSimnGcp.m_oCmdAC.m_osTempC; else SetErrMsg( m_poPnlGnuCapAC->rosGetErrMsg( ) ); break; case 3 : // TR analysis if( m_poPnlGnuCapTR->bSave( roSimnGcp ) ) os1 = roSimnGcp.m_oCmdTR.m_osTempC; else SetErrMsg( m_poPnlGnuCapTR->rosGetErrMsg( ) ); break; case 4 : // FO analysis if( m_poPnlGnuCapFO->bSave( roSimnGcp ) ) os1 = roSimnGcp.m_oCmdFO.m_osTempC; else SetErrMsg( m_poPnlGnuCapFO->rosGetErrMsg( ) ); break; default: return( FALSE ); } if( ! bIsOk( ) ) return( FALSE ); // Create the OPTIONS command m_oDlgCfgOPT.bGetValues( roSimnGcp.m_oCmdOPT ); if( ! os1.IsEmpty( ) ) roSimnGcp.m_oCmdOPT.m_osTEMPAMB = os1; roSimnGcp.m_oCmdOPT.bFormat( ); if( ! roSimnGcp.m_oCmdOPT.bIsValid( ) ) { os1 = wxT("OPTIONS command fault :\n\n "); SetErrMsg( os1 + roSimnGcp.m_oCmdOPT.rosGetErrMsg( ) ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Set the page to be displayed. // // Argument List: // eCmdType - The enumerated analysis type specifier // // Return Values: // TRUE - Success // FALSE - Failure bool NbkGnuCap::bSetPage( eCmdType eAnalysis ) { int iPage; switch( eAnalysis ) { case eCMD_OP : iPage = 0; break; case eCMD_DC : iPage = 1; break; case eCMD_AC : iPage = 2; break; case eCMD_TR : iPage = 3; break; case eCMD_FO : iPage = 4; break; default : return( FALSE ); } SetSelection( iPage ); // Specify the page to be displayed return( TRUE ); } //***************************************************************************** // Set the page to be displayed. // // Argument List: // psAnalysis - The two letter analysis type specifier (case ignored) // // Return Values: // TRUE - Success // FALSE - Failure bool NbkGnuCap::bSetPage( const wxChar * psAnalysis ) { eCmdType ePage=eCMD_NONE; wxString osAnalysis; osAnalysis = wxString( psAnalysis ).Upper( ); if( osAnalysis.Length( ) == 2 ) { if( osAnalysis == wxT("OP") ) ePage = eCMD_OP; else if( osAnalysis == wxT("DC") ) ePage = eCMD_DC; else if( osAnalysis == wxT("AC") ) ePage = eCMD_AC; else if( osAnalysis == wxT("TR") ) ePage = eCMD_TR; else if( osAnalysis == wxT("FO") ) ePage = eCMD_FO; else if( osAnalysis == wxT("DI") ) ePage = eCMD_DI; else if( osAnalysis == wxT("NO") ) ePage = eCMD_NO; else if( osAnalysis == wxT("PZ") ) ePage = eCMD_PZ; else if( osAnalysis == wxT("SE") ) ePage = eCMD_SE; else if( osAnalysis == wxT("TF") ) ePage = eCMD_TF; } return( bSetPage( ePage ) ); } //***************************************************************************** // Get the two letter page specifier. // // Return Values: // Success - The two letter analysis type specifier (lower case) // Failure - An empty string const wxString & NbkGnuCap::rosGetPage( void ) { static wxString osPage; switch( eGetPage( ) ) { case eCMD_OP : osPage = wxT("op"); break; case eCMD_DC : osPage = wxT("dc"); break; case eCMD_AC : osPage = wxT("ac"); break; case eCMD_TR : osPage = wxT("tr"); break; case eCMD_FO : osPage = wxT("fo"); break; default : osPage.Empty( ); } return( osPage ); } //***************************************************************************** // Get the enumerated page specifier. // // Return Values: // Success - The enumerated analysis specifier // Failure - eCMD_NONE eCmdType NbkGnuCap::eGetPage( void ) { eCmdType ePage; switch( GetSelection( ) ) { case 0 : ePage = eCMD_OP; break; case 1 : ePage = eCMD_DC; break; case 2 : ePage = eCMD_AC; break; case 3 : ePage = eCMD_TR; break; case 4 : ePage = eCMD_FO; break; default : ePage = eCMD_NONE; } return( ePage ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // This event is generated when a notebook page has just changed. // // Argument List: // roEvtNbk - An object holding information about the event void NbkGnuCap::OnPageChangd( wxNotebookEvent & roEvtNbk ) { PnlAnaBase * poPnlAna; wxString os1; int i1; // Transfer the ambient temperature from the previous page to OPTIONS dialog i1 = roEvtNbk.GetOldSelection( ); if( i1 != -1 ) { poPnlAna = (PnlAnaBase *) GetPage( (size_t) i1 ); if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) ) { os1 = poPnlAna->m_oPnlTemp.rosGetValue( ); m_oDlgCfgOPT.bSetValue( DlgGcpCfgOPT::ID_PNL_TEMPAMB, os1 ); } } // Transfer the ambient temperature from the OPTIONS dialog to current page poPnlAna = (PnlAnaBase *) GetCurrentPage( ); if( poPnlAna != NULL ) { if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) ) { os1 = m_oDlgCfgOPT.rosGetValue( DlgGcpCfgOPT::ID_PNL_TEMPAMB ); poPnlAna->m_oPnlTemp.bSetValue( os1 ); } } // Allow additional event handlers to be called roEvtNbk.Skip( ); } //***************************************************************************** // Setup .OPTIONS command button event handler. // // Argument List: // roEvtCmd - An object holding information about the event void NbkGnuCap::OnBtnOptions( wxCommandEvent & roEvtCmd ) { PnlAnaBase * poPnlAna; wxString os1; int i1; // Get a pointer to the currently displayed analysis page poPnlAna = (PnlAnaBase *) GetCurrentPage( ); if( poPnlAna == NULL ) return; // Set the temperature in the OPTIONS dialog if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) ) { os1 = poPnlAna->m_oPnlTemp.rosGetValue( ); m_oDlgCfgOPT.bSetValue( DlgGcpCfgOPT::ID_PNL_TEMPAMB, os1 ); } // Display the OPTIONS dialog m_oDlgCfgOPT.CenterOnParent( ); i1 = m_oDlgCfgOPT.ShowModal( ); // Set the temperature in the analysis panel if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) && i1==wxID_OK ) { os1 = m_oDlgCfgOPT.rosGetValue( DlgGcpCfgOPT::ID_PNL_TEMPAMB ); poPnlAna->m_oPnlTemp.bSetValue( os1 ); } } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/0000755000000000000000000000000011627430513016664 5ustar rootrootgspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapOPT.cpp0000644000000000000000000007335211620762764021577 0ustar rootroot//***************************************************************************** // CmdGnuCapOPT.cpp * // ------------------ * // Started : 11/09/2006 * // Last Update : 12/08/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapOPT.hpp" //***************************************************************************** // Constructor. CmdGnuCapOPT::CmdGnuCapOPT( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapOPT::~CmdGnuCapOPT( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOPT::bValidate( void ) { double df1; long li1; CmdBase::bValidate( ); if( ! ConvertType::bStrToDFlt( m_osABSTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for ABSTOL.") ); if( ! ConvertType::bStrToDFlt( m_osCHGTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for CHGTOL.") ); if( ! ConvertType::bStrToDFlt( m_osDEFAD, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFAD.") ); if( ! ConvertType::bStrToDFlt( m_osDEFAS, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFAS.") ); if( ! ConvertType::bStrToDFlt( m_osDEFL, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFL.") ); if( ! ConvertType::bStrToDFlt( m_osDEFW, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFW.") ); if( ! ConvertType::bStrToDFlt( m_osGMIN, &df1 ) ) SetErrMsg( wxT("Invalid value for GMIN.") ); if( ! ConvertType::bStrToDFlt( m_osRELTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for RELTOL.") ); if( ! ConvertType::bStrToDFlt( m_osTNOM, &df1 ) ) SetErrMsg( wxT("Invalid value for TNOM.") ); if( ! ConvertType::bStrToDFlt( m_osTRTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for TRTOL.") ); if( ! ConvertType::bStrToDFlt( m_osVNTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for VNTOL.") ); if( ! ConvertType::bStrToDFlt( m_osDAMPMAX, &df1 ) ) SetErrMsg( wxT("Invalid value for DAMPMAX.") ); if( ! ConvertType::bStrToDFlt( m_osDAMPMIN, &df1 ) ) SetErrMsg( wxT("Invalid value for DAMPMIN.") ); if( ! ConvertType::bStrToDFlt( m_osDTMIN, &df1 ) ) SetErrMsg( wxT("Invalid value for DTMIN.") ); if( ! ConvertType::bStrToDFlt( m_osDTRATIO, &df1 ) ) SetErrMsg( wxT("Invalid value for DTRATIO.") ); if( ! ConvertType::bStrToDFlt( m_osFLOOR, &df1 ) ) SetErrMsg( wxT("Invalid value for FLOOR.") ); if( ! ConvertType::bStrToDFlt( m_osLIMIT, &df1 ) ) SetErrMsg( wxT("Invalid value for LIMIT.") ); if( ! ConvertType::bStrToDFlt( m_osSEED, &df1 ) ) SetErrMsg( wxT("Invalid value for SEED.") ); if( ! ConvertType::bStrToDFlt( m_osSHORT, &df1 ) ) SetErrMsg( wxT("Invalid value for SHORT.") ); if( ! ConvertType::bStrToDFlt( m_osTEMPAMB, &df1 ) ) SetErrMsg( wxT("Invalid value for TEMPAMB.") ); if( ! ConvertType::bStrToDFlt( m_osTRREJECT, &df1 ) ) SetErrMsg( wxT("Invalid value for TRREJECT.") ); if( ! ConvertType::bStrToDFlt( m_osTRSTEPG, &df1 ) ) SetErrMsg( wxT("Invalid value for TRSTEPG.") ); if( ! ConvertType::bStrToDFlt( m_osTRSTEPS, &df1 ) ) SetErrMsg( wxT("Invalid value for TRSTEPS.") ); if( ! ConvertType::bStrToDFlt( m_osVFLOOR, &df1 ) ) SetErrMsg( wxT("Invalid value for VFLOOR.") ); if( ! ConvertType::bStrToDFlt( m_osVMAX, &df1 ) ) SetErrMsg( wxT("Invalid value for VMAX.") ); if( ! ConvertType::bStrToDFlt( m_osVMIN, &df1 ) ) SetErrMsg( wxT("Invalid value for VMIN.") ); if( ! ConvertType::bStrToDFlt( m_osWCZERO, &df1 ) ) SetErrMsg( wxT("Invalid value for WCZERO.") ); if( ! ConvertType::bStrToLong( m_osITL1, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL1.") ); if( ! ConvertType::bStrToLong( m_osITL2, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL2.") ); if( ! ConvertType::bStrToLong( m_osITL4, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL4.") ); if( ! ConvertType::bStrToLong( m_osDAMPST, &li1 ) ) SetErrMsg( wxT("Invalid value for DAMPST.") ); if( ! ConvertType::bStrToLong( m_osHARMS, &li1 ) ) SetErrMsg( wxT("Invalid value for HARMS.") ); if( ! ConvertType::bStrToLong( m_osITL7, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL7.") ); if( ! ConvertType::bStrToLong( m_osITL8, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL8.") ); if( ! ConvertType::bStrToLong( m_osNUMDGT, &li1 ) ) SetErrMsg( wxT("Invalid value for NUMDGT.") ); if( ! ConvertType::bStrToLong( m_osTRANSITS, &li1 ) ) SetErrMsg( wxT("Invalid value for TRANSITS.") ); if( m_osMETHOD.IsEmpty( ) ) SetErrMsg( wxT("Invalid value for METHOD.") ); if( m_osMODE .IsEmpty( ) ) SetErrMsg( wxT("Invalid value for MODE.") ); if( m_osORDER .IsEmpty( ) ) SetErrMsg( wxT("Invalid value for ORDER.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOPT::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_OPT; ConvertType::bDFltToStr( GCP_ABSTOL , m_osABSTOL ); ConvertType::bDFltToStr( GCP_CHGTOL , m_osCHGTOL ); ConvertType::bDFltToStr( GCP_DEFAD , m_osDEFAD ); ConvertType::bDFltToStr( GCP_DEFAS , m_osDEFAS ); ConvertType::bDFltToStr( GCP_DEFL , m_osDEFL ); ConvertType::bDFltToStr( GCP_DEFW , m_osDEFW ); ConvertType::bDFltToStr( GCP_GMIN , m_osGMIN ); ConvertType::bDFltToStr( GCP_ITL1 , m_osITL1 ); ConvertType::bDFltToStr( GCP_ITL2 , m_osITL2 ); ConvertType::bDFltToStr( GCP_ITL4 , m_osITL4 ); ConvertType::bDFltToStr( GCP_RELTOL , m_osRELTOL ); ConvertType::bDFltToStr( GCP_TNOM , m_osTNOM ); ConvertType::bDFltToStr( GCP_TRTOL , m_osTRTOL ); ConvertType::bDFltToStr( GCP_VNTOL , m_osVNTOL ); ConvertType::bDFltToStr( GCP_DAMPMAX , m_osDAMPMAX ); ConvertType::bDFltToStr( GCP_DAMPMIN , m_osDAMPMIN ); ConvertType::bDFltToStr( GCP_DAMPST , m_osDAMPST ); ConvertType::bDFltToStr( GCP_DTMIN , m_osDTMIN ); ConvertType::bDFltToStr( GCP_DTRATIO , m_osDTRATIO ); ConvertType::bDFltToStr( GCP_FLOOR , m_osFLOOR ); ConvertType::bDFltToStr( GCP_HARMS , m_osHARMS ); ConvertType::bDFltToStr( GCP_ITL7 , m_osITL7 ); ConvertType::bDFltToStr( GCP_ITL8 , m_osITL8 ); ConvertType::bDFltToStr( GCP_LIMIT , m_osLIMIT ); ConvertType::bDFltToStr( GCP_NUMDGT , m_osNUMDGT ); ConvertType::bDFltToStr( GCP_SEED , m_osSEED ); ConvertType::bDFltToStr( GCP_SHORT , m_osSHORT ); ConvertType::bDFltToStr( GCP_TEMPAMB , m_osTEMPAMB ); ConvertType::bDFltToStr( GCP_TRANSITS, m_osTRANSITS ); ConvertType::bDFltToStr( GCP_TRREJECT, m_osTRREJECT ); ConvertType::bDFltToStr( GCP_TRSTEPG , m_osTRSTEPG ); ConvertType::bDFltToStr( GCP_TRSTEPS , m_osTRSTEPS ); ConvertType::bDFltToStr( GCP_VFLOOR , m_osVFLOOR ); ConvertType::bDFltToStr( GCP_VMAX , m_osVMAX ); ConvertType::bDFltToStr( GCP_VMIN , m_osVMIN ); ConvertType::bDFltToStr( GCP_WCZERO , m_osWCZERO ); m_bBYPASS = GCP_BYPASS; m_bCSTRAY = GCP_CSTRAY; m_bINCMODE = GCP_INCMODE; m_bLUBYPASS = GCP_LUBYPASS; m_bRSTRAY = GCP_RSTRAY; m_bTRACEL = GCP_TRACEL; m_bVBYPASS = GCP_VBYPASS; m_osMETHOD = GCP_METHOD; m_osMODE = GCP_MODE; m_osORDER = GCP_ORDER; return( TRUE ); } //***************************************************************************** // Parse the OPTIONS command string. // // Eg.s : .OPTIONS NOPAGE // .OPTIONS NOPAGE ABSTOL=1.20p NOBYP CHGTOL=12.00f NOCSTRAY // DAMPMAX=900.00m DAMPMIN=600.00m DAMPST=1 DEFAD=11.00f // DEFAS=11.00f DEFL=120.00u DEFW=120.00u DTMIN=1.10p // DTRATIO=1.10Giga FLOOR=1.10E-21 GMIN=1.20p HARMS=10 NOINC // ITL1=200 ITL2=70 ITL4=30 ITL7=2 ITL8=200 LIMIT=11.00Giga // NOLUBYP METHOD=EULER MODE=ANALOG NUMDGT=6 ORDER=FORWARD // RELTOL=3.00m RSTRAY SEED=2.00 SHORT=110.00n TEMPAMB=30.00 // TNOM=35.00 NOTRACEL TRANSITS=3 TRREJECT=600.00m TRSTEPG=3.00 // TRSTEPS=9.00 TRTOL=9.00 VBYPASS VFLOOR=1.10f VMAX=40.00 // VMIN=-20.00 VNTOL=3.00u WCZERO=1.10n // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOPT::bParse( void ) { wxStringTokenizer ostk1; wxString os1, os2; size_t szt1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) < 2 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 4 ).Upper( ); if( os1 != wxT(".OPT") ) return( bValidate( ) ); // Extract each parameter value while( ostk1.HasMoreTokens( ) ) { // Extract the field name and the associated value os1 = ostk1.GetNextToken( ); os2 = wxT(""); if( ( szt1=os1.find( wxT("=") ) ) != wxString::npos ) { os2 = os1.Right( os1.Length( )-szt1-1 ); os1 = os1.Left( szt1 ); } // Set the object attribute values if( os1 == wxT("ABSTOL") ) m_osABSTOL = os2; else if( os1 == wxT("BYPASS") ) m_bBYPASS = TRUE; else if( os1 == wxT("CHGTOL") ) m_osCHGTOL = os2; else if( os1 == wxT("CSTRAY" ) ) m_bCSTRAY = TRUE; else if( os1 == wxT("DAMPMAX") ) m_osDAMPMAX = os2; else if( os1 == wxT("DAMPMIN") ) m_osDAMPMIN = os2; else if( os1 == wxT("DAMPST") ) m_osDAMPST = os2; else if( os1 == wxT("DEFAD") ) m_osDEFAD = os2; else if( os1 == wxT("DEFAS") ) m_osDEFAS = os2; else if( os1 == wxT("DEFL") ) m_osDEFL = os2; else if( os1 == wxT("DEFW") ) m_osDEFW = os2; else if( os1 == wxT("DTMIN") ) m_osDTMIN = os2; else if( os1 == wxT("DTRATIO") ) m_osDTRATIO = os2; else if( os1 == wxT("FLOOR") ) m_osFLOOR = os2; else if( os1 == wxT("GMIN") ) m_osGMIN = os2; else if( os1 == wxT("HARMS") ) m_osHARMS = os2; else if( os1 == wxT("INCMODE") ) m_bINCMODE = TRUE; else if( os1 == wxT("ITL1") ) m_osITL1 = os2; else if( os1 == wxT("ITL2") ) m_osITL2 = os2; else if( os1 == wxT("ITL4") ) m_osITL4 = os2; else if( os1 == wxT("ITL7") ) m_osITL7 = os2; else if( os1 == wxT("ITL8") ) m_osITL8 = os2; else if( os1 == wxT("LIMIT") ) m_osLIMIT = os2; else if( os1 == wxT("LUBYPASS") ) m_bLUBYPASS = TRUE; else if( os1 == wxT("METHOD") ) m_osMETHOD = os2; else if( os1 == wxT("MODE") ) m_osMODE = os2; else if( os1 == wxT("NOBYP") ) m_bBYPASS = FALSE; else if( os1 == wxT("NOCSTRAY") ) m_bCSTRAY = FALSE; else if( os1 == wxT("NOINC") ) m_bINCMODE = FALSE; else if( os1 == wxT("NOLUBYP") ) m_bLUBYPASS = FALSE; else if( os1 == wxT("NOPAGE") ) ; else if( os1 == wxT("NORSTRAY") ) m_bRSTRAY = FALSE; else if( os1 == wxT("NOTRACEL") ) m_bTRACEL = FALSE; else if( os1 == wxT("NOVBYP") ) m_bVBYPASS = FALSE; else if( os1 == wxT("NUMDGT") ) m_osNUMDGT = os2; else if( os1 == wxT("ORDER") ) m_osORDER = os2; else if( os1 == wxT("RELTOL") ) m_osRELTOL = os2; else if( os1 == wxT("RSTRAY") ) m_bRSTRAY = TRUE; else if( os1 == wxT("SEED") ) m_osSEED = os2; else if( os1 == wxT("SHORT") ) m_osSHORT = os2; else if( os1 == wxT("TEMPAMB") ) m_osTEMPAMB = os2; else if( os1 == wxT("TNOM") ) m_osTNOM = os2; else if( os1 == wxT("TRACEL") ) m_bTRACEL = TRUE; else if( os1 == wxT("TRANSITS") ) m_osTRANSITS = os2; else if( os1 == wxT("TRREJECT") ) m_osTRREJECT = os2; else if( os1 == wxT("TRSTEPG") ) m_osTRSTEPG = os2; else if( os1 == wxT("TRSTEPS") ) m_osTRSTEPS = os2; else if( os1 == wxT("TRTOL") ) m_osTRTOL = os2; else if( os1 == wxT("VBYPASS") ) m_bVBYPASS = TRUE; else if( os1 == wxT("VFLOOR") ) m_osVFLOOR = os2; else if( os1 == wxT("VMAX") ) m_osVMAX = os2; else if( os1 == wxT("VMIN") ) m_osVMIN = os2; else if( os1 == wxT("VNTOL") ) m_osVNTOL = os2; else if( os1 == wxT("WCZERO") ) m_osWCZERO = os2; } return( bValidate( ) ); } //***************************************************************************** // Format the OPTIONS command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOPT::bFormat( void ) { wxString os1, os2; double df1; long li1; os1 = wxT(".OPTIONS NOPAGE"); ConvertType::bStrToDFlt( m_osABSTOL, &df1 ); if( df1 != GCP_ABSTOL ) os1 << wxT(" ABSTOL=") << m_osABSTOL; os2 = m_bBYPASS ? wxT(" BYPASS") : wxT(" NOBYP"); if( m_bBYPASS != GCP_BYPASS ) os1 << os2; ConvertType::bStrToDFlt( m_osCHGTOL, &df1 ); if( df1 != GCP_CHGTOL ) os1 << wxT(" CHGTOL=") << m_osCHGTOL; os2 = m_bCSTRAY ? wxT(" CSTRAY") : wxT(" NOCSTRAY"); if( m_bCSTRAY != GCP_CSTRAY ) os1 << os2; ConvertType::bStrToDFlt( m_osDAMPMAX, &df1 ); if( df1 != GCP_DAMPMAX ) os1 << wxT(" DAMPMAX=") << m_osDAMPMAX; ConvertType::bStrToDFlt( m_osDAMPMIN, &df1 ); if( df1 != GCP_DAMPMIN ) os1 << wxT(" DAMPMIN=") << m_osDAMPMIN; ConvertType::bStrToLong( m_osDAMPST, &li1 ); if( li1 != GCP_DAMPST ) os1 << wxT(" DAMPST=") << m_osDAMPST; ConvertType::bStrToDFlt( m_osDEFAD, &df1 ); if( df1 != GCP_DEFAD ) os1 << wxT(" DEFAD=") << m_osDEFAD; ConvertType::bStrToDFlt( m_osDEFAS, &df1 ); if( df1 != GCP_DEFAS ) os1 << wxT(" DEFAS=") << m_osDEFAS; ConvertType::bStrToDFlt( m_osDEFL, &df1 ); if( df1 != GCP_DEFL ) os1 << wxT(" DEFL=") << m_osDEFL; ConvertType::bStrToDFlt( m_osDEFW, &df1 ); if( df1 != GCP_DEFW ) os1 << wxT(" DEFW=") << m_osDEFW; ConvertType::bStrToDFlt( m_osDTMIN, &df1 ); if( df1 != GCP_DTMIN ) os1 << wxT(" DTMIN=") << m_osDTMIN; ConvertType::bStrToDFlt( m_osDTRATIO, &df1 ); if( df1 != GCP_DTRATIO ) os1 << wxT(" DTRATIO=") << m_osDTRATIO; ConvertType::bStrToDFlt( m_osFLOOR, &df1 ); if( df1 != GCP_FLOOR ) os1 << wxT(" FLOOR=") << m_osFLOOR; ConvertType::bStrToDFlt( m_osGMIN, &df1 ); if( df1 != GCP_GMIN ) os1 << wxT(" GMIN=") << m_osGMIN; ConvertType::bStrToLong( m_osHARMS, &li1 ); if( li1 != GCP_HARMS ) os1 << wxT(" HARMS=") << m_osHARMS; os2 = m_bINCMODE ? wxT(" INCMODE") : wxT(" NOINC"); if( m_bINCMODE != GCP_INCMODE ) os1 << os2; ConvertType::bStrToLong( m_osITL1, &li1 ); if( li1 != GCP_ITL1 ) os1 << wxT(" ITL1=") << m_osITL1; ConvertType::bStrToLong( m_osITL2, &li1 ); if( li1 != GCP_ITL2 ) os1 << wxT(" ITL2=") << m_osITL2; ConvertType::bStrToLong( m_osITL4, &li1 ); if( li1 != GCP_ITL4 ) os1 << wxT(" ITL4=") << m_osITL4; ConvertType::bStrToLong( m_osITL7, &li1 ); if( li1 != GCP_ITL7 ) os1 << wxT(" ITL7=") << m_osITL7; ConvertType::bStrToLong( m_osITL8, &li1 ); if( li1 != GCP_ITL8 ) os1 << wxT(" ITL8=") << m_osITL8; ConvertType::bStrToDFlt( m_osLIMIT, &df1 ); if( df1 != GCP_LIMIT ) os1 << wxT(" LIMIT=") << m_osLIMIT; os2 = m_bLUBYPASS ? wxT(" LUBYP") : wxT(" NOLUBYP"); if( m_bLUBYPASS != GCP_LUBYPASS ) os1 << os2; os2 = m_osMETHOD.Upper( ); if( os2.CmpNoCase( GCP_METHOD ) ) os1 << wxT(" METHOD=") << os2; os2 = m_osMODE.Upper( ); if( os2.CmpNoCase( GCP_MODE ) ) os1 << wxT(" MODE=") << os2; ConvertType::bStrToLong( m_osNUMDGT, &li1 ); if( li1 != GCP_NUMDGT ) os1 << wxT(" NUMDGT=") << m_osNUMDGT; os2 = m_osORDER.Upper( ); if( os2.CmpNoCase( GCP_ORDER ) ) os1 << wxT(" ORDER=") << os2; ConvertType::bStrToDFlt( m_osRELTOL, &df1 ); if( df1 != GCP_RELTOL ) os1 << wxT(" RELTOL=") << m_osRELTOL; os2 = ( m_bRSTRAY ? wxT(" RSTRAY") : wxT(" NORSTRAY") ); if( m_bRSTRAY != GCP_RSTRAY ) os1 << os2; ConvertType::bStrToDFlt( m_osSEED, &df1 ); if( df1 != GCP_SEED ) os1 << wxT(" SEED=") << m_osSEED; ConvertType::bStrToDFlt( m_osSHORT, &df1 ); if( df1 != GCP_SHORT ) os1 << wxT(" SHORT=") << m_osSHORT; ConvertType::bStrToDFlt( m_osTEMPAMB, &df1 ); if( df1 != GCP_TEMPAMB ) os1 << wxT(" TEMPAMB=") << m_osTEMPAMB; ConvertType::bStrToDFlt( m_osTNOM, &df1 ); if( df1 != GCP_TNOM ) os1 << wxT(" TNOM=") << m_osTNOM; os2 = ( m_bTRACEL ? wxT(" TRACEL") : wxT(" NOTRACEL") ); if( m_bTRACEL != GCP_TRACEL ) os1 << os2; ConvertType::bStrToDFlt( m_osTRANSITS, &df1 ); if( df1 != GCP_TRANSITS ) os1 << wxT(" TRANSITS=") << m_osTRANSITS; ConvertType::bStrToDFlt( m_osTRREJECT, &df1 ); if( df1 != GCP_TRREJECT ) os1 << wxT(" TRREJECT=") << m_osTRREJECT; ConvertType::bStrToDFlt( m_osTRSTEPG, &df1 ); if( df1 != GCP_TRSTEPG ) os1 << wxT(" TRSTEPG=") << m_osTRSTEPG; ConvertType::bStrToDFlt( m_osTRSTEPS, &df1 ); if( df1 != GCP_TRSTEPS ) os1 << wxT(" TRSTEPS=") << m_osTRSTEPS; ConvertType::bStrToDFlt( m_osTRTOL, &df1 ); if( df1 != GCP_TRTOL ) os1 << wxT(" TRTOL=") << m_osTRTOL; os2 = ( m_bVBYPASS ? wxT(" VBYPASS") : wxT(" NOVBYP") ); if( m_bVBYPASS != GCP_VBYPASS ) os1 << os2; ConvertType::bStrToDFlt( m_osVFLOOR, &df1 ); if( df1 != GCP_VFLOOR ) os1 << wxT(" VFLOOR=") << m_osVFLOOR; ConvertType::bStrToDFlt( m_osVMAX, &df1 ); if( df1 != GCP_VMAX ) os1 << wxT(" VMAX=") << m_osVMAX; ConvertType::bStrToDFlt( m_osVMIN, &df1 ); if( df1 != GCP_VMIN ) os1 << wxT(" VMIN=") << m_osVMIN; ConvertType::bStrToDFlt( m_osVNTOL, &df1 ); if( df1 != GCP_VNTOL ) os1 << wxT(" VNTOL=") << m_osVNTOL; ConvertType::bStrToDFlt( m_osWCZERO, &df1 ); if( df1 != GCP_WCZERO ) os1 << wxT(" WCZERO=") << m_osWCZERO; assign( os1 ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdNgSpiceOPT object. // // Argument List : // roCmdOPT - A reference to a CmdNgSpiceOPT object // // Return Values : // A reference to this object CmdGnuCapOPT & CmdGnuCapOPT::operator = ( const CmdNgSpiceOPT & roCmdOPT ) { (CmdBase &) *this = (CmdBase &) roCmdOPT; m_osABSTOL = roCmdOPT.m_osABSTOL; m_osCHGTOL = roCmdOPT.m_osCHGTOL; m_osDEFAD = roCmdOPT.m_osDEFAD; m_osDEFAS = roCmdOPT.m_osDEFAS; m_osDEFL = roCmdOPT.m_osDEFL; m_osDEFW = roCmdOPT.m_osDEFW; m_osGMIN = roCmdOPT.m_osGMIN; m_osITL1 = roCmdOPT.m_osITL1; m_osITL2 = roCmdOPT.m_osITL2; m_osITL4 = roCmdOPT.m_osITL4; m_osMETHOD = roCmdOPT.m_osMETHOD; m_osRELTOL = roCmdOPT.m_osRELTOL; m_osTNOM = roCmdOPT.m_osTNOM; m_osTRTOL = roCmdOPT.m_osTRTOL; m_osVNTOL = roCmdOPT.m_osVNTOL; m_osTEMPAMB = roCmdOPT.m_osTEMP; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapOPT::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix .mb_str( ) << "m_osABSTOL : " << m_osABSTOL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osCHGTOL : " << m_osCHGTOL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFAD : " << m_osDEFAD .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFAS : " << m_osDEFAS .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFL : " << m_osDEFL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFW : " << m_osDEFW .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osGMIN : " << m_osGMIN .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL1 : " << m_osITL1 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL2 : " << m_osITL2 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL4 : " << m_osITL4 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osMETHOD : " << m_osMETHOD .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osRELTOL : " << m_osRELTOL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTNOM : " << m_osTNOM .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTRTOL : " << m_osTRTOL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osVNTOL : " << m_osVNTOL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bBYPASS : " << ( m_bBYPASS ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bCSTRAY : " << ( m_bCSTRAY ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDAMPMAX : " << m_osDAMPMAX .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDAMPMIN : " << m_osDAMPMIN .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDAMPST : " << m_osDAMPST .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDTMIN : " << m_osDTMIN .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDTRATIO : " << m_osDTRATIO .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osFLOOR : " << m_osFLOOR .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osHARMS : " << m_osHARMS .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bINCMODE : " << ( m_bINCMODE ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL7 : " << m_osITL7 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL8 : " << m_osITL8 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osLIMIT : " << m_osLIMIT .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bLUBYPASS : " << ( m_bLUBYPASS ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osMODE : " << m_osMODE .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osNUMDGT : " << m_osNUMDGT .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osORDER : " << m_osORDER .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bRSTRAY : " << ( m_bRSTRAY ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osSEED : " << m_osSEED .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osSHORT : " << m_osSHORT .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTEMPAMB : " << m_osTEMPAMB .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bTRACEL : " << ( m_bTRACEL ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTRANSITS : " << m_osTRANSITS.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTRREJECT : " << m_osTRREJECT.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTRSTEPG : " << m_osTRSTEPG .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTRSTEPS : " << m_osTRSTEPS .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bVBYPASS : " << ( m_bVBYPASS ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osVFLOOR : " << m_osVFLOOR .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osVMAX : " << m_osVMAX .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osVMIN : " << m_osVMIN .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osWCZERO : " << m_osWCZERO .mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPOPT // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapOPT Test Utility" << "\n Version 1.03 (12/08/2011)\n"; // Create a NG-SPICE OPTIONS command object CmdGnuCapOPT oCmd_OPT; // Use the following command example to check the formatter and the parser : osCmd << wxT(".OPTIONS NOPAGE ABSTOL=1.20p NOBYP CHGTOL=12.00f NOCSTRAY ") << wxT("DAMPMAX=900.00m DAMPMIN=600.00m DAMPST=1 DEFAD=11.00f ") << wxT("DEFAS=11.00f DEFL=120.00u DEFW=120.00u DTMIN=1.10p ") << wxT("DTRATIO=1.10Giga FLOOR=1.10E-21 GMIN=1.20p HARMS=10 NOINC ") << wxT("ITL1=200 ITL2=70 ITL4=30 ITL7=2 ITL8=200 LIMIT=11.00Giga ") << wxT("NOLUBYP METHOD=EULER MODE=ANALOG NUMDGT=6 ORDER=FORWARD ") << wxT("RELTOL=3.00m RSTRAY SEED=2.00 SHORT=110.00n TEMPAMB=30.00 ") << wxT("TNOM=35.00 NOTRACEL TRANSITS=3 TRREJECT=600.00m TRSTEPG=3.00 ") << wxT("TRSTEPS=9.00 TRTOL=9.00 VBYPASS VFLOOR=1.10f VMAX=40.00 ") << wxT("VMIN=-20.00 VNTOL=3.00u WCZERO=1.10n"); // Set things up for a formatter test oCmd_OPT.m_osABSTOL = wxT("1.20p"); oCmd_OPT.m_bBYPASS = FALSE; oCmd_OPT.m_osCHGTOL = wxT("12.00f"); oCmd_OPT.m_bCSTRAY = FALSE; oCmd_OPT.m_osDAMPMAX = wxT("900.00m"); oCmd_OPT.m_osDAMPMIN = wxT("600.00m"); oCmd_OPT.m_osDAMPST = wxT("1"); oCmd_OPT.m_osDEFAD = wxT("11.00f"); oCmd_OPT.m_osDEFAS = wxT("11.00f"); oCmd_OPT.m_osDEFL = wxT("120.00u"); oCmd_OPT.m_osDEFW = wxT("120.00u"); oCmd_OPT.m_osDTMIN = wxT("1.10p"); oCmd_OPT.m_osDTRATIO = wxT("1.10Giga"); oCmd_OPT.m_osFLOOR = wxT("1.10E-21"); oCmd_OPT.m_osGMIN = wxT("1.20p"); oCmd_OPT.m_osHARMS = wxT("10"); oCmd_OPT.m_bINCMODE = FALSE; oCmd_OPT.m_osITL1 = wxT("200"); oCmd_OPT.m_osITL2 = wxT("70"); oCmd_OPT.m_osITL4 = wxT("30"); oCmd_OPT.m_osITL7 = wxT("2"); oCmd_OPT.m_osITL8 = wxT("200"); oCmd_OPT.m_osLIMIT = wxT("11.00Giga"); oCmd_OPT.m_bLUBYPASS = FALSE; oCmd_OPT.m_osMETHOD = wxT("EULER"); oCmd_OPT.m_osMODE = wxT("ANALOG"); oCmd_OPT.m_osNUMDGT = wxT("6"); oCmd_OPT.m_osORDER = wxT("FORWARD"); oCmd_OPT.m_osRELTOL = wxT("3.00m"); oCmd_OPT.m_bRSTRAY = TRUE; oCmd_OPT.m_osSEED = wxT("2.00"); oCmd_OPT.m_osSHORT = wxT("110.00n"); oCmd_OPT.m_osTEMPAMB = wxT("30.00"); oCmd_OPT.m_osTNOM = wxT("35.00"); oCmd_OPT.m_bTRACEL = FALSE; oCmd_OPT.m_osTRANSITS = wxT("3"); oCmd_OPT.m_osTRREJECT = wxT("600.00m"); oCmd_OPT.m_osTRSTEPG = wxT("3.00"); oCmd_OPT.m_osTRSTEPS = wxT("9.00"); oCmd_OPT.m_osTRTOL = wxT("9.00"); oCmd_OPT.m_bVBYPASS = TRUE; oCmd_OPT.m_osVFLOOR = wxT("1.10f"); oCmd_OPT.m_osVMAX = wxT("40.00"); oCmd_OPT.m_osVMIN = wxT("-20.00"); oCmd_OPT.m_osVNTOL = wxT("3.00u"); oCmd_OPT.m_osWCZERO = wxT("1.10n"); cout << "\nRun Formatter : " << ( oCmd_OPT.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_OPT == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_OPT Contents : " << oCmd_OPT.mb_str( ) << '\n'; // Set things up for a parser test oCmd_OPT.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_OPT.bParse( ) ? "OK" : "FAULT" ); oCmd_OPT.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_OPT == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_OPT Contents : " << oCmd_OPT.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPOPT //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapOP.hpp0000644000000000000000000000522311504646100021432 0ustar rootroot//***************************************************************************** // CmdGnuCapOP.hpp * // ----------------- * // Description : This class contains values associated with the GNU-Cap * // OP (Operating Point) command. It inherits from the class * // CmdBase. * // Started : 05/03/2008 * // Last Update : 24/12/2010 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPOP_HPP #define CMDGCPOP_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "ngspice/commands/CmdNgSpiceDC.hpp" #include "utility/ConvertType.hpp" struct CmdNgSpiceDC; // Local Macro and Constant Declarations //***************************************************************************** struct CmdGnuCapOP : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // Sweep start value wxString m_osStop; // Sweep stop value wxString m_osStep; // Sweep step value eScaleType m_eScale; // The sweep scale type CmdGnuCapOP( void ); virtual ~CmdGnuCapOP( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapOP & operator = ( const CmdNgSpiceDC & roCmdDC ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPOP_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapTR.cpp0000644000000000000000000002475111621056546021454 0ustar rootroot//***************************************************************************** // CmdGnuCapTR.cpp * // ----------------- * // Started : 07/03/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapTR.hpp" //***************************************************************************** // Constructor. CmdGnuCapTR::CmdGnuCapTR( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapTR::~CmdGnuCapTR( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapTR::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and initial conditions if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eInitC ) { case eINITC_WARM : case eINITC_UICS : case eINITC_COLD : break; default : SetErrMsg( wxT("Invalid initial conditions value.") ); } // Set the analysis temperature if( ! ConvertType::bStrToDFlt( m_osTempC, &df3 ) ) SetErrMsg( wxT("Invalid analysis temperature value.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapTR::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_TR; m_osStart = wxT("0.0m"); m_osStop = wxT("100.0m"); m_osStep = wxT("10.0m"); m_eInitC = eINITC_WARM; m_osTempC = wxT("27.0"); return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .TR 0.00 100.00m 10.00m TE 30.00 COLD BASIC // .TR 0.00 100.00m 10.00m TE 30.00 UIC BASIC // .TR 0.00 100.00m 10.00m TE 30.00 BASIC // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapTR::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1; int i1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); i1 = ostk1.CountTokens( ); if( i1!=7 && i1!=8 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".TR") ) return( bValidate( ) ); // Extract the start time os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); // Extract the stop time os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the step increment os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); // Extract the analysis temperature os1 = ostk1.GetNextToken( ); if( os1.Upper( ) == wxT("TE") ) { os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osTempC = os1; else return( bValidate( ) ); } // Extract the initial conditions if( ostk1.CountTokens( ) > 1 ) { os1 = ostk1.GetNextToken( ); os1.MakeUpper( ); if( os1 == wxT("COLD") ) m_eInitC = eINITC_COLD; else if( os1 == wxT("UIC") ) m_eInitC = eINITC_UICS; else return( bValidate( ) ); } else m_eInitC = eINITC_WARM; // Check that the last field is "BASIC" if( ostk1.GetNextToken( ).Upper( ) != wxT("BASIC") ) return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapTR::bFormat( void ) { wxString osCmd, os1; // Set the command name osCmd = wxT(".TR"); // Set sweep parameters osCmd << wxT(' ') << m_osStart; osCmd << wxT(' ') << m_osStop; osCmd << wxT(' ') << m_osStep; // Set analysis temperature osCmd << wxT(" TE ") << m_osTempC; // Set the initial conditions switch( m_eInitC ) { case eINITC_COLD : osCmd << wxT(" COLD"); break; case eINITC_UICS : osCmd << wxT(" UICS"); break; case eINITC_WARM : break; default : break; } // Append format modifier osCmd << wxT(" BASIC"); assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdNgSpiceTR object. // // Argument List : // roCmdTR - A reference to a CmdNgSpiceTR object // // Return Values : // A reference to this object CmdGnuCapTR & CmdGnuCapTR::operator = ( const CmdNgSpiceTR & roCmdTR ) { (CmdBase &) *this = (CmdBase &) roCmdTR; m_osStart = roCmdTR.m_osStart; m_osStop = roCmdTR.m_osStop; m_osStep = roCmdTR.m_osStep; m_eInitC = roCmdTR.m_eInitC; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapTR::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_osStart : " << m_osStart.mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_eInitC : "; switch( m_eInitC ) { case eINITC_WARM : cout << "eINITC_COLD\n"; break; case eINITC_UICS : cout << "eINITC_UICS\n"; break; case eINITC_COLD : cout << "eINITC_COLD\n"; break; case eINITC_NONE : cout << "eINITC_NONE\n"; break; default : cout << "Invalid\n"; break; } cout << rosPrefix.mb_str( ) << "m_osTempC : " << m_osTempC.mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPTR // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapTR Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a GNU-CAP Transient command object CmdGnuCapTR tCmd_TR; // Use the following command example to check the formatter and the parser : osCmd = wxT(".TR 0.00 100.00m 10.00m TE 30.00 COLD BASIC"); // Set things up for a formatter test tCmd_TR.m_osStart = wxT("0.00"); tCmd_TR.m_osStop = wxT("100.00m"); tCmd_TR.m_osStep = wxT("10.00m"); tCmd_TR.m_osTempC = wxT("30.00"); tCmd_TR.m_eInitC = eINITC_COLD; cout << "\nRun Formatter : " << ( tCmd_TR.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( tCmd_TR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_TR Contents : " << tCmd_TR.mb_str( ) << '\n'; // Set things up for a parser test tCmd_TR.bSetString( osCmd ); cout << "\nRun Parser : " << ( tCmd_TR.bParse( ) ? "OK" : "FAULT" ); tCmd_TR.bFormat( ); cout << "\nTest Cmd Format : " << ( tCmd_TR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_TR Contents : " << tCmd_TR.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPTR //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapGEN.cpp0000644000000000000000000003356311621056674021543 0ustar rootroot//***************************************************************************** // CmdGnuCapGEN.cpp * // ------------------ * // Started : 11/03/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapGEN.hpp" //***************************************************************************** // Constructor. CmdGnuCapGEN::CmdGnuCapGEN( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapGEN::~CmdGnuCapGEN( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapGEN::bValidate( void ) { double df1, df2, df3, df4; CmdBase::bValidate( ); // Overall source characteristics if( ! ConvertType::bStrToDFlt( m_osAmplitude, &df1 ) ) SetErrMsg( wxT("overall amplitude value is invalid") ); // if( df1 <= 0.0 ) ??? 05/10/2009 // SetErrMsg( wxT("overall amplitude value must be greater than zero") ); if( ! ConvertType::bStrToDFlt( m_osOffset, &df1 ) ) SetErrMsg( wxT("overall offset value is invalid") ); // Sinusoidal source characteristics if( ! ConvertType::bStrToDFlt( m_osSinFreq, &df1 ) ) SetErrMsg( wxT("sinusoid frequency value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osSinPhase, &df1 ) ) SetErrMsg( wxT("sinusoid phase value is invalid") ); // Check the pulse time values if( ! ConvertType::bStrToDFlt( m_osPulRise, &df1 ) ) SetErrMsg( wxT("pulse rise time value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulWidth, &df2 ) ) SetErrMsg( wxT("pulse width value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulFall, &df3 ) ) SetErrMsg( wxT("pulse fall time value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulPeriod, &df4 ) ) SetErrMsg( wxT("pulse period value is invalid") ); if( df4 < df2 ) SetErrMsg( wxT("pulse rise time is greater than the pulse period") ); else if( df4 < df3 ) SetErrMsg( wxT("pulse width is greater than the pulse period") ); else if( df4 < df4 ) SetErrMsg( wxT("pulse fall time is greater than the pulse period") ); else if( df4 < df1+df2+df3 ) SetErrMsg( wxT("pulse period is less then the pulse width") ); // Check the pulse level values if( ! ConvertType::bStrToDFlt( m_osPulInitial, &df1 ) ) SetErrMsg( wxT("initial pulse value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulMin, &df2 ) ) SetErrMsg( wxT("minimum pulse value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulMax, &df3 ) ) SetErrMsg( wxT("maximum pulse value is invalid") ); if( df1 < df2 ) SetErrMsg( wxT("initial pulse value is less than the minimum pulse value") ); else if( df1 > df3 ) SetErrMsg( wxT("initial pulse value is greater than the maximum pulse value") ); else if( df2 > df3 ) SetErrMsg( wxT("minimum pulse value is less than the maximum pulse value") ); // Check overall pulse source logic if( df4!=0.0 && (df2==0.0 && df3==0.0) ) SetErrMsg( wxT("pulse timing has been defined but no pulse levels") ); if( df4==0.0 && (df2!=0.0 || df3!=0.0) ) SetErrMsg( wxT("pulse levels have been defined but no pulse timing") ); return( TRUE ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapGEN::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_GEN; m_osAmplitude = GCP_AMPLITUDE; m_osOffset = GCP_OFFSET; m_osSinFreq = GCP_SINFREQ; m_osSinPhase = GCP_SINPHASE; m_osPulInitial = GCP_PULINITIAL; m_osPulMin = GCP_PULMIN; m_osPulMax = GCP_PULMAX; m_osPulDelay = GCP_PULDELAY; m_osPulRise = GCP_PULRISE; m_osPulWidth = GCP_PULWIDTH; m_osPulFall = GCP_PULFALL; m_osPulPeriod = GCP_PULPERIOD; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .GENERATOR AMP=2.00K OFFSET=1.00 FREQ=1.00K PHASE=50.00 INIT=5.00m // MIN=2.00m MAX=10.00m DELAY=4.00m RISE=2.00m WIDTH=8.00m // FALL=1.00m PERIOD=20.00m // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapGEN::bParse( void ) { wxStringTokenizer ostk1; wxString os1, os2; size_t szt1; int i1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); i1 = ostk1.CountTokens( ); if( i1<2 && i1>13 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 4 ).Upper( ); if( os1 != wxT(".GEN") ) return( bValidate( ) ); // Extract each parameter value while( ostk1.HasMoreTokens( ) ) { // Extract the field name and the associated value os1 = ostk1.GetNextToken( ); os2 = wxT(""); if( ( szt1=os1.find( wxT("=") ) ) != wxString::npos ) { os2 = os1.Right( os1.Length( )-szt1-1 ); os1 = os1.Left( szt1 ); } // Set the object attribute values if( os1 == wxT("AMP") ) m_osAmplitude = os2; else if( os1 == wxT("OFFSET") ) m_osOffset = os2; else if( os1 == wxT("FREQ") ) m_osSinFreq = os2; else if( os1 == wxT("PHASE") ) m_osSinPhase = os2; else if( os1 == wxT("INIT") ) m_osPulInitial = os2; else if( os1 == wxT("MIN") ) m_osPulMin = os2; else if( os1 == wxT("MAX") ) m_osPulMax = os2; else if( os1 == wxT("DELAY") ) m_osPulDelay = os2; else if( os1 == wxT("RISE") ) m_osPulRise = os2; else if( os1 == wxT("WIDTH") ) m_osPulWidth = os2; else if( os1 == wxT("FALL") ) m_osPulFall = os2; else if( os1 == wxT("PERIOD") ) m_osPulPeriod = os2; else return( bValidate( ) ); } return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapGEN::bFormat( void ) { wxString os1; float f1; bool b1; os1 = wxT(".GENERATOR"); if( ! m_osAmplitude .IsEmpty( ) ) os1 << wxT(" AMP=") << m_osAmplitude; if( ! m_osOffset .IsEmpty( ) ) os1 << wxT(" OFFSET=") << m_osOffset; f1 = 0.0; b1 = ConvertType::bStrToFlt( m_osSinFreq, &f1 ); if( b1==TRUE && f1!=0.0 ) { os1 << wxT(" FREQ=") << m_osSinFreq; os1 << wxT(" PHASE=") << m_osSinPhase; } f1 = 0.0; b1 = ConvertType::bStrToFlt( m_osPulMax, &f1 ); if( b1==TRUE && f1!=0.0 ) { os1 << wxT(" INIT=") << m_osPulInitial; os1 << wxT(" MIN=") << m_osPulMin; os1 << wxT(" MAX=") << m_osPulMax; os1 << wxT(" DELAY=") << m_osPulDelay; os1 << wxT(" RISE=") << m_osPulRise; os1 << wxT(" WIDTH=") << m_osPulWidth; os1 << wxT(" FALL=") << m_osPulFall; os1 << wxT(" PERIOD=") << m_osPulPeriod; } assign( os1 ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CpntNgsIndSrc object. // // Argument List : // roIndSrc - A reference to a CpntNgsIndSrc object // // Return Values : // A reference to this object CmdGnuCapGEN & CmdGnuCapGEN::operator = ( const CpntNgsIndSrc & roIndSrc ) { double df1, df2; if( ! roIndSrc.m_osSinAmp.IsEmpty( ) ) m_osAmplitude = roIndSrc.m_osSinAmp; else m_osAmplitude = wxT("1.0"); m_osOffset = roIndSrc.m_osSinOffset; m_osSinFreq = roIndSrc.m_osSinFreq; if( ConvertType::bStrToDFlt( roIndSrc.m_osSinFreq, &df1 ) && ConvertType::bStrToDFlt( roIndSrc.m_osSinDelay, &df2 ) ) ConvertType::bDFltToStr( 360.0 * df2 * df1, m_osSinPhase ); else m_osSinPhase = wxT("0.0"); m_osPulInitial = roIndSrc.m_osPulInitial; m_osPulMax = roIndSrc.m_osPulMax; m_osPulDelay = roIndSrc.m_osPulDelay; m_osPulRise = roIndSrc.m_osPulRise; m_osPulWidth = roIndSrc.m_osPulWidth; m_osPulFall = roIndSrc.m_osPulFall; m_osPulPeriod = roIndSrc.m_osPulPeriod; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapGEN::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix .mb_str( ) << "m_osAmplitude : " << m_osAmplitude .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osOffset : " << m_osOffset .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osSinFreq : " << m_osSinFreq .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osSinPhase : " << m_osSinPhase .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulInitial : " << m_osPulInitial.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulMin : " << m_osPulMin .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulMax : " << m_osPulMax .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulDelay : " << m_osPulDelay .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulRise : " << m_osPulRise .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulWidth : " << m_osPulWidth .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulFall : " << m_osPulFall .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPulPeriod : " << m_osPulPeriod .mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPGEN // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapGEN Test Utility" << "\n Version 1.04 (12/08/2011)\n"; // Create a GNU-CAP Transient command object CmdGnuCapGEN tCmd_GEN; // Use the following command example to check the formatter and the parser : osCmd << wxT(".GENERATOR AMP=2.00K OFFSET=1.00 FREQ=1.00K PHASE=50.00 ") << wxT("INIT=5.00m MIN=2.00m MAX=10.00m DELAY=4.00m RISE=2.00m ") << wxT("WIDTH=8.00m FALL=1.00m PERIOD=20.00m"); // Set things up for a formatter test tCmd_GEN.m_osAmplitude = wxT("2.00K"); tCmd_GEN.m_osOffset = wxT("1.00"); tCmd_GEN.m_osSinFreq = wxT("1.00K"); tCmd_GEN.m_osSinPhase = wxT("50.00"); tCmd_GEN.m_osPulInitial = wxT("5.00m"); tCmd_GEN.m_osPulMin = wxT("2.00m"); tCmd_GEN.m_osPulMax = wxT("10.00m"); tCmd_GEN.m_osPulDelay = wxT("4.00m"); tCmd_GEN.m_osPulRise = wxT("2.00m"); tCmd_GEN.m_osPulWidth = wxT("8.00m"); tCmd_GEN.m_osPulFall = wxT("1.00m"); tCmd_GEN.m_osPulPeriod = wxT("20.00m"); cout << "\nRun Formatter : " << ( tCmd_GEN.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( tCmd_GEN == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_GEN Contents : " << tCmd_GEN.mb_str( ) << '\n'; // Set things up for a parser test tCmd_GEN.bSetString( osCmd ); cout << "\nRun Parser : " << ( tCmd_GEN.bParse( ) ? "OK" : "FAULT" ); tCmd_GEN.bFormat( ); cout << "\nTest Cmd Format : " << ( tCmd_GEN == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_GEN Contents : " << tCmd_GEN.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPGEN //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapDC.hpp0000644000000000000000000000525211504646100021404 0ustar rootroot//***************************************************************************** // CmdGnuCapDC.hpp * // ----------------- * // Description : This class contains values associated with the GNU-Cap * // DC command. It inherits from the class CmdBase. * // Started : 29/01/2008 * // Last Update : 24/12/2010 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPDC_HPP #define CMDGCPDC_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "ngspice/commands/CmdNgSpiceDC.hpp" #include "utility/ConvertType.hpp" struct CmdNgSpiceDC; // Local Macro and Constant Declarations //***************************************************************************** struct CmdGnuCapDC : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // Sweep start value wxString m_osStop; // Sweep stop value wxString m_osStep; // Sweep step value eScaleType m_eScale; // Step scale wxString m_osSource; // Sweep source wxString m_osTempC; // Analysis temperature in Celcius CmdGnuCapDC( void ); virtual ~CmdGnuCapDC( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapDC & operator = ( const CmdNgSpiceDC & roCmdDC ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPDC_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapAC.cpp0000644000000000000000000002575611621056475021421 0ustar rootroot//***************************************************************************** // CmdGnuCapAC.cpp * // ----------------- * // Started : 21/02/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapAC.hpp" //***************************************************************************** // Constructor. CmdGnuCapAC::CmdGnuCapAC( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapAC::~CmdGnuCapAC( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapAC::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and sweep scale if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eScale ) { case eSCALE_LIN : if( df1!=df2 && df3>fabs( df2 - df1 ) ) SetErrMsg( wxT("Step value is greater than sweep range.") ); break; case eSCALE_LOG : if( df1!=df2 && df3==1.0 ) SetErrMsg( wxT("Invalid step multiplier, must be non-unity.") ); break; case eSCALE_DEC : case eSCALE_OCT : break; default : SetErrMsg( wxT("Invalid step scale value.") ); } // Set the analysis temperature if( ! ConvertType::bStrToDFlt( m_osTempC, &df3 ) ) SetErrMsg( wxT("Invalid analysis temperature value.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapAC::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_AC; m_osStart = wxT("1.0K"); m_osStop = wxT("100.0K"); m_osStep = wxT("10"); m_eScale = eSCALE_DEC; m_osTempC = wxT("27.0"); return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .AC 1.00K 100.00K BY 10.00K TE 27.00 BASIC // .AC 1.00K 100.00K TI 10.00 TE 27.00 BASIC // .AC 1.00K 100.00K DE 10 TE 27.00 BASIC // .AC 1.00K 100.00K OC 10 TE 27.00 BASIC // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapAC::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1, df2; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) != 8 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".AC") ) return( bValidate( ) ); // Extract the start value os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); // Is the next field a number? os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df2 ) ) { // Extract the stop value if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the sweep type os1 = ostk1.GetNextToken( ).Upper( ); if( os1 == wxT("BY") ) m_eScale = eSCALE_LIN; else if( os1 == wxT("TI") ) m_eScale = eSCALE_LOG; else if( os1 == wxT("DE") ) m_eScale = eSCALE_DEC; else if( os1 == wxT("OC") ) m_eScale = eSCALE_OCT; else return( bValidate( ) ); // Extract the step size/count os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); os1 = ostk1.GetNextToken( ); } else { // Use default values for the remaining parameters m_osStop = os1; m_osStep = wxT("1.0"); m_eScale = eSCALE_LIN; } // Extract the analysis temperature if( os1.Upper( ) == wxT("TE") ) { os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osTempC = os1; else return( bValidate( ) ); } // Check that the last field is "BASIC" if( ostk1.GetNextToken( ).Upper( ) != wxT("BASIC") ) return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapAC::bFormat( void ) { wxString osCmd, os1; // Set the command name osCmd = wxT(".AC"); // Set sweep parameters osCmd << wxT(' ') << m_osStart; osCmd << wxT(' ') << m_osStop; switch( m_eScale ) { case eSCALE_LIN : osCmd << wxT(" BY"); break; case eSCALE_LOG : osCmd << wxT(" TI"); break; case eSCALE_DEC : osCmd << wxT(" DE"); break; case eSCALE_OCT : osCmd << wxT(" OC"); break; default : return( FALSE ); } osCmd << wxT(' ') << m_osStep; // Set analysis temperature osCmd << wxT(" TE ") << m_osTempC; // Append format modifier osCmd << wxT(" BASIC"); assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdNgSpiceAC object. // // Argument List : // roCmdAC - A reference to a CmdNgSpiceAC object // // Return Values : // A reference to this object CmdGnuCapAC & CmdGnuCapAC::operator = ( const CmdNgSpiceAC & roCmdAC ) { (CmdBase &) *this = (CmdBase &) roCmdAC; m_osStart = roCmdAC.m_osStart; m_osStop = roCmdAC.m_osStop; m_osStep = roCmdAC.m_osStep; m_eScale = roCmdAC.m_eScale; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapAC::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_osStart : " << m_osStart.mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_eScale : "; switch( m_eScale ) { case eSCALE_LIN : cout << "eSCALE_LIN\n"; break; case eSCALE_LOG : cout << "eSCALE_LOG\n"; break; case eSCALE_DEC : cout << "eSCALE_DEC\n"; break; case eSCALE_OCT : cout << "eSCALE_OCT\n"; break; case eSCALE_NONE : cout << "eSCALE_NONE\n"; break; default : cout << "Invalid\n"; break; } cout << rosPrefix.mb_str( ) << "m_osTempC : " << m_osTempC.mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPAC // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapAC Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a GNU-CAP AC command object CmdGnuCapAC tCmd_AC; // Use the following command example to check the formatter and the parser : osCmd = wxT(".AC 1.00K 200.00K TI 1.01 TE 30.00 BASIC"); // Set things up for a formatter test tCmd_AC.m_osStart = wxT("1.00K"); tCmd_AC.m_osStop = wxT("200.00K"); tCmd_AC.m_osStep = wxT("1.01"); tCmd_AC.m_eScale = eSCALE_LOG; tCmd_AC.m_osTempC = wxT("30.00"); cout << "\nRun Formatter : " << ( tCmd_AC.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( tCmd_AC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_AC Contents : " << tCmd_AC.mb_str( ) << '\n'; // Set things up for a parser test tCmd_AC.bSetString( osCmd ); cout << "\nRun Parser : " << ( tCmd_AC.bParse( ) ? "OK" : "FAULT" ); tCmd_AC.bFormat( ); cout << "\nTest Cmd Format : " << ( tCmd_AC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_AC Contents : " << tCmd_AC.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPAC //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapPR.hpp0000644000000000000000000000520511544076653021453 0ustar rootroot//***************************************************************************** // CmdGnuCapPR.hpp * // ----------------- * // Description : This class contains values associated with the GNU-Cap * // PRINT command. It inherits from the class CmdBase. * // Started : 17/03/2008 * // Last Update : 29/03/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPPR_HPP #define CMDGCPPR_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "netlist/Component.hpp" #include "netlist/NetList.hpp" #include "ngspice/commands/CmdNgSpicePR.hpp" struct CmdNgSpicePR; // Local Macro and Constant Declarations //***************************************************************************** struct CmdGnuCapPR : public CmdBase { private : virtual bool bValidate( void ); public : eCmdType m_eAnaType; wxArrayString m_osaNodes; wxArrayString m_osaCpnts; bool m_bParmtrs[ ePAR_LST+1 ]; bool m_bCpxPrts[ eCPX_LST+1 ]; CmdGnuCapPR( void ); virtual ~CmdGnuCapPR( ); virtual bool bSetDefaults( void ); bool bSetAnaType( eCmdType eAnaType ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapPR & operator = ( const CmdNgSpicePR & roCmdPR ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPPR_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapFO.cpp0000644000000000000000000002361111621056620021416 0ustar rootroot//***************************************************************************** // CmdGnuCapFO.cpp * // ----------------- * // Started : 11/03/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapFO.hpp" //***************************************************************************** // Constructor. CmdGnuCapFO::CmdGnuCapFO( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapFO::~CmdGnuCapFO( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapFO::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and initial conditions if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eInitC ) { case eINITC_WARM : case eINITC_UICS : case eINITC_COLD : break; default : SetErrMsg( wxT("Invalid initial conditions value.") ); } // Set the analysis temperature if( ! ConvertType::bStrToDFlt( m_osTempC, &df3 ) ) SetErrMsg( wxT("Invalid analysis temperature value.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapFO::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_FO; m_osStart = wxT("1.0K"); m_osStop = wxT("100K"); m_osStep = wxT("10K"); m_eInitC = eINITC_WARM; m_osTempC = wxT("27.0"); return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .FO 1.00K 100.00K 10.00K TE 27.00 COLD BASIC // .FO 1.00K 100.00K 10.00K TE 27.00 BASIC // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapFO::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1; int i1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); i1 = ostk1.CountTokens( ); if( i1!=7 && i1!=8 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".FO") ) return( bValidate( ) ); // Extract the start time os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); // Extract the stop time os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the step increment os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); // Extract the analysis temperature os1 = ostk1.GetNextToken( ); if( os1.Upper( ) == wxT("TE") ) { os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osTempC = os1; else return( bValidate( ) ); } // Extract the initial conditions if( ostk1.CountTokens( ) > 1 ) { os1 = ostk1.GetNextToken( ); os1.MakeUpper( ); if( os1 == wxT("COLD") ) m_eInitC = eINITC_COLD; else if( os1 == wxT("UIC") ) m_eInitC = eINITC_UICS; else return( bValidate( ) ); } else m_eInitC = eINITC_WARM; // Check that the last field is "BASIC" if( ostk1.GetNextToken( ).Upper( ) != wxT("BASIC") ) return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapFO::bFormat( void ) { wxString osCmd, os1; // Set the command name osCmd = wxT(".FO"); // Set sweep parameters osCmd << wxT(' ') << m_osStart; osCmd << wxT(' ') << m_osStop; osCmd << wxT(' ') << m_osStep; // Set analysis temperature osCmd << wxT(" TE ") << m_osTempC; // Set the initial conditions switch( m_eInitC ) { case eINITC_COLD : osCmd << wxT(" COLD"); break; case eINITC_UICS : osCmd << wxT(" UICS"); break; case eINITC_WARM : break; default : break; } // Append format modifier osCmd << wxT(" BASIC"); assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapFO::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_osStart : " << m_osStart.mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_eInitC : "; switch( m_eInitC ) { case eINITC_WARM : cout << "eINITC_COLD\n"; break; case eINITC_UICS : cout << "eINITC_UICS\n"; break; case eINITC_COLD : cout << "eINITC_COLD\n"; break; case eINITC_NONE : cout << "eINITC_NONE\n"; break; default : cout << "Invalid\n"; break; } cout << rosPrefix.mb_str( ) << "m_osTempC : " << m_osTempC.mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPFO // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapFO Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a GNU-CAP Transient command object CmdGnuCapFO tCmd_FO; // Use the following command example to check the formatter and the parser : osCmd = wxT(".FO 1.00K 100.00K 10.00K TE 30.00 COLD BASIC"); // Set things up for a formatter test tCmd_FO.m_osStart = wxT("1.00K"); tCmd_FO.m_osStop = wxT("100.00K"); tCmd_FO.m_osStep = wxT("10.00K"); tCmd_FO.m_osTempC = wxT("30.00"); tCmd_FO.m_eInitC = eINITC_COLD; cout << "\nRun Formatter : " << ( tCmd_FO.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( tCmd_FO == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_FO Contents : " << tCmd_FO.mb_str( ) << '\n'; // Set things up for a parser test tCmd_FO.bSetString( osCmd ); cout << "\nRun Parser : " << ( tCmd_FO.bParse( ) ? "OK" : "FAULT" ); tCmd_FO.bFormat( ); cout << "\nTest Cmd Format : " << ( tCmd_FO == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_FO Contents : " << tCmd_FO.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPFO //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapDC.cpp0000644000000000000000000002644011621056370021405 0ustar rootroot//***************************************************************************** // CmdGnuCapDC.cpp * // ----------------- * // Started : 29/01/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapDC.hpp" //***************************************************************************** // Constructor. CmdGnuCapDC::CmdGnuCapDC( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapDC::~CmdGnuCapDC( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapDC::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and sweep scale if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eScale ) { case eSCALE_LIN : if( df1!=df2 && df3>fabs( df2 - df1 ) ) SetErrMsg( wxT("Step value is greater than sweep range.") ); break; case eSCALE_LOG : if( df1!=df2 && df3==1.0 ) SetErrMsg( wxT("Invalid step multiplier, must be non-unity.") ); break; case eSCALE_DEC : break; default : SetErrMsg( wxT("Invalid step scale value.") ); } // Check the component to be used as the sweep source // (21/04/2011) ??? A sweep source isn't compulsory for a GNU-Cap DC sweep // if( m_osSource.IsEmpty( ) ) // SetErrMsg( wxT("No source component has been selected.") ); // Set the analysis temperature if( ! ConvertType::bStrToDFlt( m_osTempC, &df3 ) ) SetErrMsg( wxT("Invalid analysis temperature value.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapDC::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_DC; m_osStart = wxT("0.0"); m_osStop = wxT("100.0"); m_osStep = wxT("10.0"); m_osSource = wxT("None"); m_eScale = eSCALE_LIN; m_osTempC = wxT("0.0"); return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .DC Vin 0.00 100.00m BY 10.00m TE 27.00 BASIC // .DC Vin 0.00 100.00m TI 1.01 TE 27.00 BASIC // .DC Vin 0.00 100.00m DE 100 TE 27.00 BASIC // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapDC::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1; int i1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); i1 = ostk1.CountTokens( ); if( i1!=6 && i1!=9 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".DC") ) return( bValidate( ) ); // Extract the sweep source label m_osSource = ostk1.GetNextToken( ); if( m_osSource.IsEmpty( ) ) return( bValidate( ) ); // Extract the start value os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); // Extract the stop voltage os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the sweep type: linear, log or steps per decade os1 = ostk1.GetNextToken( ); os1.MakeUpper( ); if( os1 == wxT("BY") ) m_eScale = eSCALE_LIN; else if( os1 == wxT("TI") ) m_eScale = eSCALE_LOG; else if( os1 == wxT("DE") ) m_eScale = eSCALE_DEC; else return( bValidate( ) ); // Extract the step size/count os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); // Extract the analysis temperature os1 = ostk1.GetNextToken( ); if( os1.Upper( ) == wxT("TE") ) { os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osTempC = os1; else return( bValidate( ) ); } // Check that the last field is "BASIC" if( ostk1.GetNextToken( ).Upper( ) != wxT("BASIC") ) return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapDC::bFormat( void ) { wxString osCmd, os1; // Set the command name osCmd = wxT(".DC"); // Set signal source osCmd << wxT(' ') << m_osSource; // Set sweep parameters osCmd << wxT(' ') << m_osStart; osCmd << wxT(' ') << m_osStop; switch( m_eScale ) { case eSCALE_LIN : osCmd << wxT(" BY"); break; case eSCALE_LOG : osCmd << wxT(" TI"); break; case eSCALE_DEC : osCmd << wxT(" DE"); break; default : break; } osCmd << wxT(' ') << m_osStep; // Set analysis temperature osCmd << wxT(" TE ") << m_osTempC; // Append format modifier osCmd << wxT(" BASIC"); assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdNgSpiceDC object. // // Argument List : // roCmdDC - A reference to a CmdNgSpiceDC object // // Return Values : // A reference to this object CmdGnuCapDC & CmdGnuCapDC::operator = ( const CmdNgSpiceDC & roCmdDC ) { (CmdBase &) *this = (CmdBase &) roCmdDC; m_osStart = roCmdDC.m_osStart; m_osStop = roCmdDC.m_osStop; m_osStep = roCmdDC.m_osStep; m_osSource = roCmdDC.m_osSource; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapDC::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix .mb_str( ) << "m_osStart : " << m_osStart .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osSource : " << m_osSource.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_eScale : "; switch( m_eScale ) { case eSCALE_LIN : cout << "eSCALE_LIN\n"; break; case eSCALE_LOG : cout << "eSCALE_LOG\n"; break; case eSCALE_DEC : cout << "eSCALE_DEC\n"; break; case eSCALE_OCT : cout << "eSCALE_OCT\n"; break; case eSCALE_NONE : cout << "eSCALE_NONE\n"; break; default : cout << "Invalid\n"; break; } cout << rosPrefix .mb_str( ) << "m_osTempC : " << m_osTempC .mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPDC // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapDC Test Utility" << "\n Version 1.04 (12/08/2011)\n"; // Create a GNU-CAP DC command object CmdGnuCapDC tCmd_DC; // Use the following command example to check the formatter and the parser : osCmd = wxT(".DC Vin 0.00 100.00m TI 10.00m TE 27.00 BASIC"); // Set things up for a formatter test tCmd_DC.m_osStart = wxT("0.00"); tCmd_DC.m_osStop = wxT("100.00m"); tCmd_DC.m_osStep = wxT("10.00m"); tCmd_DC.m_osSource = wxT("Vin"); tCmd_DC.m_eScale = eSCALE_LOG; tCmd_DC.m_osTempC = wxT("27.00"); cout << "\nRun Formatter : " << ( tCmd_DC.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( tCmd_DC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_DC Contents : " << tCmd_DC.mb_str( ) << '\n'; // Set things up for a parser test tCmd_DC.bSetString( osCmd ); cout << "\nRun Parser : " << ( tCmd_DC.bParse( ) ? "OK" : "FAULT" ); tCmd_DC.bFormat( ); cout << "\nTest Cmd Format : " << ( tCmd_DC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_DC Contents : " << tCmd_DC.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPDC //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapOPT.hpp0000644000000000000000000001524511504644177021577 0ustar rootroot//***************************************************************************** // CmdGnuCapOPT.hpp * // ------------------ * // Description : This class contains values associated with the GNU-Cap * // OPTIONS command. It inherits from the class CmdBase. * // Started : 11/09/2006 * // Last Update : 24/12/2010 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPOPT_HPP #define CMDGCPOPT_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "ngspice/commands/CmdNgSpiceOPT.hpp" #include "utility/ConvertType.hpp" struct CmdNgSpiceOPT; // Local Macro and/or Constant Declarations #define GCP_ABSTOL 1.0E-12 #define GCP_CHGTOL 1.0E-14 #define GCP_DEFAD 0.0 #define GCP_DEFAS 0.0 #define GCP_DEFL 100.0E-06 #define GCP_DEFW 100.0E-06 #define GCP_GMIN 1.0E-12 #define GCP_ITL1 100 #define GCP_ITL2 50 #define GCP_ITL4 10 #define GCP_METHOD wxT("Trap") #define GCP_RELTOL 0.001 #define GCP_TNOM 27.0 #define GCP_TRTOL 7.0 #define GCP_VNTOL 1.0E-06 #define GCP_BYPASS TRUE #define GCP_CSTRAY TRUE #define GCP_DAMPMAX 1.0 #define GCP_DAMPMIN 0.5 #define GCP_DAMPST 0 #define GCP_DTMIN 1.0E-12 #define GCP_DTRATIO 1.0E+09 #define GCP_FLOOR 1.0E-21 #define GCP_HARMS 9 #define GCP_INCMODE TRUE #define GCP_ITL7 1 #define GCP_ITL8 100 #define GCP_LIMIT 1.0E+10 #define GCP_LUBYPASS TRUE #define GCP_MODE wxT("Mixed") #define GCP_NUMDGT 5 #define GCP_ORDER wxT("Auto") #define GCP_RSTRAY FALSE #define GCP_SEED 1.0 #define GCP_SHORT 1.0E-07 #define GCP_TEMPAMB 27.0 #define GCP_TRACEL TRUE #define GCP_TRANSITS 2 #define GCP_TRREJECT 0.5 #define GCP_TRSTEPG 2.0 #define GCP_TRSTEPS 8.0 #define GCP_VBYPASS FALSE #define GCP_VFLOOR 1.0E-15 #define GCP_VMAX 30.0 #define GCP_VMIN -30.0 #define GCP_WCZERO 1.0E-09 //***************************************************************************** struct CmdGnuCapOPT : public CmdBase { private : virtual bool bValidate( void ); public : // Options used by both NG-Spice and GNU-Cap wxString m_osABSTOL; // Absolute current error tolerance wxString m_osCHGTOL; // Charge tolerance wxString m_osDEFAD; // MOS drain diffusion area wxString m_osDEFAS; // MOS source diffusion area wxString m_osDEFL; // MOS channel length wxString m_osDEFW; // MOS channel width wxString m_osGMIN; // Minimum allowable conductance wxString m_osITL1; // DC iteration limit wxString m_osITL2; // DC transfer curve iteration limit wxString m_osITL4; // TR analysis timepoint iteration limit wxString m_osMETHOD; // Numerical integration method wxString m_osRELTOL; // Relative error tolerance wxString m_osTNOM; // Nominal temp. at which device parameters measured wxString m_osTRTOL; // TR error tolerance wxString m_osVNTOL; // Absolute voltage error tolerance // Options specific to GNU-Cap bool m_bBYPASS; // Bypass model evaluation if appropriate bool m_bCSTRAY; // Include capacitance in device models wxString m_osDAMPMAX; // Normal Newton damping factor (when all is well) wxString m_osDAMPMIN; // Newton damping factor when there's a problem wxString m_osDAMPST; // Damping strategy wxString m_osDTMIN; // Minimum time step wxString m_osDTRATIO; // The ratio between minimum and maximum time step wxString m_osFLOOR; // Effective zero value wxString m_osHARMS; // Harmonics in Fourier analysis bool m_bINCMODE; // Incrementally update the matrix wxString m_osITL7; // Worst case analysis iteration limit wxString m_osITL8; // Convergence diagnostic iteration threshold wxString m_osLIMIT; // Internal differential branch voltage limit bool m_bLUBYPASS; // Bypass parts of LU decomposition if appropriate wxString m_osMODE; // Simulation mode selection wxString m_osNUMDGT; // No. of digits to print for analysis results wxString m_osORDER; // Equation ordering bool m_bRSTRAY; // Include series resistance in device models wxString m_osSEED; // Seed used by the random number generator wxString m_osSHORT; // Resistance of voltage source or short wxString m_osTEMPAMB; // Simulation temperature bool m_bTRACEL; // Use a queue to only load changed elements to the matrix wxString m_osTRANSITS; // Mixed mode transition count wxString m_osTRREJECT; // Transient error rejection threshold wxString m_osTRSTEPG; // Maximum internal step size growth in transient analysis wxString m_osTRSTEPS; // Amount to decrease the transient step size by when convergence fails bool m_bVBYPASS; // Check only voltage to bypass model evaluation wxString m_osVFLOOR; // Effective zero value for voltage probes wxString m_osVMAX; // Positive node voltage limit wxString m_osVMIN; // Negative node voltage limit wxString m_osWCZERO; // Worst case zero window CmdGnuCapOPT( void ); virtual ~CmdGnuCapOPT( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapOPT & operator = ( const CmdNgSpiceOPT & roCmdOPT ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPOPT_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapFO.hpp0000644000000000000000000000476411504646100021431 0ustar rootroot//***************************************************************************** // CmdGnuCapFO.hpp * // ----------------- * // Description : This class contains values associated with the GNU-Cap * // FOURIER command. It inherits from the class CmdBase. * // Started : 11/03/2008 * // Last Update : 24/12/2010 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPFO_HPP #define CMDGCPFO_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "utility/ConvertType.hpp" // Local Macro and Constant Declarations //***************************************************************************** struct CmdGnuCapFO : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // The sweep start value wxString m_osStop; // The sweep stop value wxString m_osStep; // The sweep step value eInitCType m_eInitC; // The sweep scale type wxString m_osTempC; // The analysis temperature CmdGnuCapFO( void ); virtual ~CmdGnuCapFO( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPFO_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapTR.hpp0000644000000000000000000000516011504646100021441 0ustar rootroot//***************************************************************************** // CmdGnuCapTR.hpp * // ----------------- * // Description : This class contains values associated with the GNU-Cap * // TRANSIENT command. It inherits from the class CmdBase. * // Started : 07/03/2008 * // Last Update : 24/12/2010 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPTR_HPP #define CMDGCPTR_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "ngspice/commands/CmdNgSpiceTR.hpp" #include "utility/ConvertType.hpp" struct CmdNgSpiceTR; // Local Macro and Constant Declarations //***************************************************************************** struct CmdGnuCapTR : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // The sweep start value wxString m_osStop; // The sweep stop value wxString m_osStep; // The sweep step value eInitCType m_eInitC; // The sweep scale type wxString m_osTempC; // The analysis temperature CmdGnuCapTR( void ); virtual ~CmdGnuCapTR( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapTR & operator = ( const CmdNgSpiceTR & roCmdTR ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPTR_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapPR.cpp0000644000000000000000000003446611627430513021450 0ustar rootroot//*************************************"*************************************** // CmdGnuCapPR.cpp * // ----------------- * // Started : 17/03/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapPR.hpp" //***************************************************************************** // Constructor. CmdGnuCapPR::CmdGnuCapPR( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapPR::~CmdGnuCapPR( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapPR::bValidate( void ) { size_t sz1; bool b1; CmdBase::bValidate( ); if( ( m_osaNodes.GetCount( ) + m_osaCpnts.GetCount( ) ) <= 0 ) SetErrMsg( wxT("No components or nodes have been selected.") ); for( sz1=(size_t)ePAR_FST, b1=FALSE; sz1<=(size_t)ePAR_LST; sz1++ ) if( m_bParmtrs[ sz1 ] ) b1 = TRUE; if( ! b1 ) SetErrMsg( wxT("No parameters selected.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapPR::bSetDefaults( void ) { int i1; CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_PR; m_eAnaType = eCMD_NONE; m_osaNodes.Empty( ); m_osaCpnts.Empty( ); for( i1=(int)ePAR_FST; i1<=(int)ePAR_LST; i1++ ) m_bParmtrs[ i1 ] = FALSE; for( i1=(int)eCPX_FST; i1<=(int)eCPX_LST; i1++ ) m_bCpxPrts[ i1 ] = FALSE; return( TRUE ); } //***************************************************************************** // Set the analysis. // // Argument List : // eAnaType - An analysis command type // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapPR::bSetAnaType( eCmdType eAnaType ) { // Does anything actually need to be done? if( eAnaType == m_eAnaType ) return( TRUE ); // Check that the desired analysis type is supported switch( eAnaType ) { case eCMD_OP : case eCMD_DC : case eCMD_AC : case eCMD_TR : case eCMD_FO : break; default : return( FALSE ); } m_eAnaType = eAnaType; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .PRINT AC VM(R1) VM(C1) VM(2) VP(C1) VP(R1) VP(2) // .PRINT AC VDB(2) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapPR::bParse( void ) { wxStringTokenizer ostk1; wxString os1, os2; int i1, i2; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) < 3 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".PR") ) return( bValidate( ) ); // Extract the analysis type os1 = ostk1.GetNextToken( ).Left( 2 ).Upper( ); if( os1 == wxT("OP") ) m_eAnaType = eCMD_OP; else if( os1 == wxT("DC") ) m_eAnaType = eCMD_DC; else if( os1 == wxT("AC") ) m_eAnaType = eCMD_AC; else if( os1 == wxT("TR") ) m_eAnaType = eCMD_TR; else if( os1 == wxT("FO") ) m_eAnaType = eCMD_FO; else return( bValidate( ) ); // Extract the parameters to derive, any complex parts and the test component // and/or test node labels while( ostk1.HasMoreTokens( ) ) { // Extract the next field os1 = ostk1.GetNextToken( ); // Extract the parameter specifiers switch( (char) os1.GetChar( 0 ) ) { case wxT('V') : m_bParmtrs[ ePAR_VLT ] = TRUE; break; case wxT('I') : m_bParmtrs[ ePAR_CUR ] = TRUE; break; case wxT('P') : m_bParmtrs[ ePAR_PWR ] = TRUE; break; case wxT('R') : m_bParmtrs[ ePAR_RES ] = TRUE; break; default : return( bValidate( ) ); } // Extract the complex parts if the analysis type is AC if( m_eAnaType == eCMD_AC ) { switch( (char) os1.GetChar( 1 ) ) { case wxT('M') : m_bCpxPrts[ eCPX_MAG ] = TRUE; break; case wxT('P') : m_bCpxPrts[ eCPX_PHASE ] = TRUE; break; case wxT('R') : m_bCpxPrts[ eCPX_REAL ] = TRUE; break; case wxT('I') : m_bCpxPrts[ eCPX_IMAG ] = TRUE; break; case wxT('D') : if( os1.Mid( 1, 2 ).Upper( ) == wxT("DB") ) { m_bCpxPrts[ eCPX_MAG ] = TRUE; m_bCpxPrts[ eCPX_MAGDB ] = TRUE; break; } default : return( bValidate( ) ); } } // Extract the node or component label/s eg. V(1) or V(C1) i1 = os1.Index( wxT('(') ); i2 = os1.Index( wxT(')') ); if( i1!=-1 && i2!=-1 && i2>(i1+1) ) { // Get the label os1 = os1.Mid( (size_t) i1+1, (size_t) i2-i1-1 ); // Add the label to the node or component label lists if( wxIsdigit( os1.GetChar( 0 ) ) || Component::eGetCpntType( os1 ) == eCPNT_NONE || NetList::m_osaNodeLbls.Index( os1 ) != wxNOT_FOUND ) { if( m_osaNodes.Index( os1 ) == wxNOT_FOUND ) m_osaNodes.Add( os1 ); } else { if( m_osaCpnts.Index( os1 ) == wxNOT_FOUND ) m_osaCpnts.Add( os1 ); } } else return( bValidate( ) ); } return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapPR::bFormat( void ) { wxString osCmd, osParm, osCpxPrt, os1; wxStringTokenizer ostk1; int i1, i2, i3; // Set the command name osCmd = wxT(".PRINT "); // Append the analysis type switch( m_eAnaType ) { case eCMD_OP : osCmd << wxT("OP"); break; case eCMD_DC : osCmd << wxT("DC"); break; case eCMD_AC : osCmd << wxT("AC"); break; case eCMD_TR : osCmd << wxT("TR"); break; case eCMD_FO : osCmd << wxT("FO"); break; default : break; } // Sequence through the various parameter types for( i1=ePAR_FST; i1<=ePAR_LST; i1++ ) { if( ! m_bParmtrs[ i1 ] ) continue; switch( (eParType) i1 ) { case ePAR_VLT : osParm = wxT('V'); break; case ePAR_CUR : osParm = wxT('I'); break; case ePAR_PWR : osParm = wxT('P'); break; case ePAR_RES : osParm = wxT('R'); break; default : break; } if( m_eAnaType != eCMD_AC ) { // Sequence throught all the components and nodes for( i3=0; i3<(int)m_osaCpnts.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << wxT('(') << m_osaCpnts.Item( i3 ) << wxT(')'); for( i3=0; i3<(int)m_osaNodes.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << wxT('(') << m_osaNodes.Item( i3 ) << wxT(')'); } else { // Sequence through the various complex parts for( i2=eCPX_FST; i2<=eCPX_LST-1; i2++ ) { if( ! m_bCpxPrts[ i2 ] ) continue; switch( (eCpxType) i2 ) { case eCPX_MAG : osCpxPrt = ( m_bCpxPrts[ eCPX_MAGDB ] ? wxT("DB") : wxT("M") ); break; case eCPX_PHASE : osCpxPrt = wxT('P'); break; case eCPX_REAL : osCpxPrt = wxT('R'); break; case eCPX_IMAG : osCpxPrt = wxT('I'); break; default : break; } // Sequence throught all the components and nodes for( i3=0; i3<(int)m_osaCpnts.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << osCpxPrt << wxT('(') << m_osaCpnts.Item( i3 ) << wxT(')'); for( i3=0; i3<(int)m_osaNodes.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << osCpxPrt << wxT('(') << m_osaNodes.Item( i3 ) << wxT(')'); } } } assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdNgSpicePR object. // // Argument List : // roCmdPR - A reference to a CmdNgSpicePR object // // Return Values : // A reference to this object CmdGnuCapPR & CmdGnuCapPR::operator = ( const CmdNgSpicePR & roCmdPR ) { int i1; (CmdBase &) *this = (CmdBase &) roCmdPR; bSetAnaType( roCmdPR.m_eAnaType ); m_osaNodes = roCmdPR.m_osaNodes; m_osaCpnts = roCmdPR.m_osaCpnts; for( i1=(int)ePAR_FST; i1<=(int)ePAR_LST; i1++ ) m_bParmtrs[ i1 ] = roCmdPR.m_bParmtrs[ i1 ]; for( i1=(int)eCPX_FST; i1<=(int)eCPX_LST; i1++ ) m_bCpxPrts[ i1 ] = roCmdPR.m_bCpxPrts[ i1 ]; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapPR::Print( const wxString & rosPrefix ) { int i1; size_t sz1; CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_eAnaType : "; switch( m_eAnaType ) { case eCMD_OP : cout << "eCMD_OP"; break; // Operating point analysis case eCMD_DC : cout << "eCMD_DC"; break; // DC analysis case eCMD_AC : cout << "eCMD_AC"; break; // AC analysis case eCMD_TR : cout << "eCMD_TR"; break; // Transient analysis case eCMD_FO : cout << "eCMD_FO"; break; // Fourier analysis case eCMD_DI : cout << "eCMD_DI"; break; // Distortion analysis case eCMD_NO : cout << "eCMD_NO"; break; // Noise analysis case eCMD_PZ : cout << "eCMD_PZ"; break; // Pole-zero analysis case eCMD_SE : cout << "eCMD_SE"; break; // Sensitivity analysis case eCMD_TF : cout << "eCMD_TF"; break; // Transfer function analysis case eCMD_NONE : cout << "eCMD_NONE"; break; // Analysis type not set default : cout << "Invalid"; break; } cout << '\n'; cout << rosPrefix.mb_str( ) << "m_osaCpnts[ n ] :"; for( sz1=0; sz1 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapPR Test Utility" << "\n Version 1.01 (12/08/2011)\n"; // Create a NG-SPICE PRINT command object CmdGnuCapPR oCmd_PR; // Use the following command example to check the formatter and the parser : osCmd = wxT(".PRINT AC VM(C1) VM(R1) VM(2) VP(C1) VP(R1) VP(2)"); // Set things up for a formatter test oCmd_PR.m_eAnaType = eCMD_AC; oCmd_PR.m_osaCpnts.Add( wxT("C1") ); oCmd_PR.m_osaCpnts.Add( wxT("R1") ); oCmd_PR.m_osaNodes.Add( wxT("2") ); oCmd_PR.m_bParmtrs[ ePAR_VLT ] = TRUE; oCmd_PR.m_bCpxPrts[ eCPX_MAG ] = TRUE; oCmd_PR.m_bCpxPrts[ eCPX_PHASE ] = TRUE; cout << "\nRun Formatter : " << ( oCmd_PR.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_PR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmdPR Contents : " << oCmd_PR.mb_str( ) << '\n'; // Set things up for a parser test oCmd_PR.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_PR.bParse( ) ? "OK" : "FAULT" ); oCmd_PR.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_PR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmdPR Contents : " << oCmd_PR.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPPR //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapGEN.hpp0000644000000000000000000000634111504646100021527 0ustar rootroot//***************************************************************************** // CmdGnuCapGEN.hpp * // ------------------ * // Description : This class contains values associated with the GNU-Cap * // GENERATOR command. It inherits from the class CmdBase. * // Started : 11/03/2008 * // Last Update : 24/12/2010 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPGEN_HPP #define CMDGCPGEN_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "utility/ConvertType.hpp" #include "netlist/CpntNgsIndSrc.hpp" struct CpntNgsIndSrc; // Local Macro and/or Constant Declarations #define GCP_AMPLITUDE wxT("1.0") #define GCP_OFFSET wxT("0.0") #define GCP_SINFREQ wxT("0.0") #define GCP_SINPHASE wxT("0.0") #define GCP_PULINITIAL wxT("0.0") #define GCP_PULMIN wxT("0.0") #define GCP_PULMAX wxT("0.0") #define GCP_PULDELAY wxT("0.0m") #define GCP_PULRISE wxT("0.0m") #define GCP_PULWIDTH wxT("0.0m") #define GCP_PULFALL wxT("0.0m") #define GCP_PULPERIOD wxT("0.0m") //***************************************************************************** struct CmdGnuCapGEN : public CmdBase { private : virtual bool bValidate( void ); public : // Overall source characteristics wxString m_osAmplitude; wxString m_osOffset; // Sinusoidal source characteristics wxString m_osSinFreq; wxString m_osSinPhase; // Pulse source characteristics wxString m_osPulInitial; wxString m_osPulMin; wxString m_osPulMax; wxString m_osPulDelay; wxString m_osPulRise; wxString m_osPulWidth; wxString m_osPulFall; wxString m_osPulPeriod; CmdGnuCapGEN( void ); virtual ~CmdGnuCapGEN( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapGEN & operator = ( const CpntNgsIndSrc & roIndSrc ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPGEN_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapAC.hpp0000644000000000000000000000515611504646100021404 0ustar rootroot//***************************************************************************** // CmdGnuCapAC.hpp * // ----------------- * // Description : This class contains values associated with the GNU-Cap * // AC command. It inherits from the class CmdBase. * // Started : 21/02/2008 * // Last Update : 24/12/2010 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDGCPAC_HPP #define CMDGCPAC_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "ngspice/commands/CmdNgSpiceAC.hpp" #include "utility/ConvertType.hpp" struct CmdNgSpiceAC; // Local Macro and Constant Declarations //***************************************************************************** struct CmdGnuCapAC : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // The sweep start value wxString m_osStop; // The sweep stop value wxString m_osStep; // The sweep step value eScaleType m_eScale; // The sweep scale type wxString m_osTempC; // The analysis temperature CmdGnuCapAC( void ); virtual ~CmdGnuCapAC( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdGnuCapAC & operator = ( const CmdNgSpiceAC & roCmdAC ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDGCPAC_HPP gspiceui-1.0.00+dfsg/src/gnucap/commands/CmdGnuCapOP.cpp0000644000000000000000000002447111621056240021433 0ustar rootroot//***************************************************************************** // CmdGnuCapOP.cpp * // ----------------- * // Started : 05/03/2008 * // Last Update : 12/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/commands/CmdGnuCapOP.hpp" //***************************************************************************** // Constructor. CmdGnuCapOP::CmdGnuCapOP( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdGnuCapOP::~CmdGnuCapOP( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOP::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and sweep scale if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eScale ) { case eSCALE_LIN : if( df1!=df2 && df3>fabs( df2 - df1 ) ) SetErrMsg( wxT("Step value is greater than sweep range.") ); break; case eSCALE_LOG : if( df1!=df2 && df3==1.0 ) SetErrMsg( wxT("Invalid step multiplier, must be non-unity.") ); break; case eSCALE_DEC : break; default : SetErrMsg( wxT("Invalid step scale value.") ); } return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOP::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_GNUCAP; m_eCmdType = eCMD_OP; m_osStart = wxT("20.0"); m_osStop = wxT("30.0"); m_osStep = wxT("1.0"); m_eScale = eSCALE_LIN; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s: .OP 27.0 BASIC // .OP 27.0 60.0 BY 1.0 BASIC // .OP 27.0 60.0 TI 1.01 BASIC // .OP 27.0 60.0 DE 10 BASIC // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOP::bParse( void ) { wxStringTokenizer ostk1; wxString os1; int i1; double df1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); i1 = ostk1.CountTokens( ); if( i1!=3 && i1!=6 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".OP") ) return( bValidate( ) ); // Extract the start temperature os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); if( ostk1.CountTokens( ) > 1 ) { // Extract the stop temperature os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the sweep type os1 = ostk1.GetNextToken( ); os1.MakeUpper( ); if( os1 == wxT("BY") ) m_eScale = eSCALE_LIN; else if( os1 == wxT("TI") ) m_eScale = eSCALE_LOG; else if( os1 == wxT("DE") ) m_eScale = eSCALE_DEC; else return( bValidate( ) ); // Extract the step size os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); } else { // Use default values for the remaining parameters m_osStop = os1; m_osStep = wxT("1.0"); m_eScale = eSCALE_LIN; } // Check that the last field is "BASIC" if( ostk1.GetNextToken( ).Upper( ) != wxT("BASIC") ) return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdGnuCapOP::bFormat( void ) { wxString osCmd, os1; // Set the command name osCmd = wxT(".OP"); // Set sweep parameters osCmd << wxT(' ') << m_osStart; if( m_osStop != m_osStart ) { osCmd << wxT(' ') << m_osStop; switch( m_eScale ) { case eSCALE_LIN : osCmd << wxT(" BY"); break; case eSCALE_LOG : osCmd << wxT(" TI"); break; case eSCALE_DEC : osCmd << wxT(" DE"); break; default : break; } osCmd << wxT(' ') << m_osStep; } // Append format modifier osCmd << wxT(" BASIC"); assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdNgSpiceDC object. // // Argument List : // roCmdDC - A reference to a CmdNgSpiceDC object // // Return Values : // A reference to this object CmdGnuCapOP & CmdGnuCapOP::operator = ( const CmdNgSpiceDC & roCmdDC ) { (CmdBase &) *this = (CmdBase &) roCmdDC; m_osStart = roCmdDC.m_osStart; m_osStop = roCmdDC.m_osStop; m_osStep = roCmdDC.m_osStep; m_eScale = eSCALE_LIN; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdGnuCapOP::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_osStart : " << m_osStart.mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_eScale : "; switch( m_eScale ) { case eSCALE_LIN : cout << "eSCALE_LIN\n"; break; case eSCALE_LOG : cout << "eSCALE_LOG\n"; break; case eSCALE_DEC : cout << "eSCALE_DEC\n"; break; case eSCALE_NONE : cout << "eSCALE_NONE\n"; break; default : cout << "Invalid\n"; break; } } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDGCPOP // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdGnuCapOP Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a GNU-CAP OP command object CmdGnuCapOP tCmd_OP; // Use the following command example to check the formatter and the parser : osCmd = wxT(".OP 20.00 30.00 TI 1.01 BASIC"); // osCmd = wxT(".OP 20.00 BASIC"); // Set things up for a formatter test tCmd_OP.m_osStart = wxT("20.00"); tCmd_OP.m_osStop = wxT("30.00"); tCmd_OP.m_osStep = wxT("1.01"); tCmd_OP.m_eScale = eSCALE_LOG; // tCmd_OP.m_osStop = wxT("20.00"); // tCmd_OP.m_osStep = wxT("1.00"); // tCmd_OP.m_eScale = eSCALE_LIN; cout << "\nRun Formatter : " << ( tCmd_OP.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( tCmd_OP == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_OP Contents : " << tCmd_OP.mb_str( ) << '\n'; // Set things up for a parser test tCmd_OP.bSetString( osCmd ); cout << "\nRun Parser : " << ( tCmd_OP.bParse( ) ? "OK" : "FAULT" ); tCmd_OP.bFormat( ); cout << "\nTest Cmd Format : " << ( tCmd_OP == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\ntCmd_OP Contents : " << tCmd_OP.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDGCPOP //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/NbkGnuCap.hpp0000644000000000000000000000615411630767745017430 0ustar rootroot//***************************************************************************** // NbkGnuCap.hpp * // --------------- * // Description : Provides a container class for the analysis configuration * // panels for the different analyses provided by GNU-Cap * // electronic circuit simulator. * // Started : 05/09/2003 * // Last Update : 23/05/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef NBKGNUCAP_HPP #define NBKGNUCAP_HPP // System Includes // wxWidgets Includes #include // Application Includes #include "TypeDefs.hpp" #include "base/NbkSimrBase.hpp" #include "gnucap/dialogs/DlgGcpCfgOPT.hpp" #include "gnucap/panels/PnlGnuCapOP.hpp" #include "gnucap/panels/PnlGnuCapDC.hpp" #include "gnucap/panels/PnlGnuCapAC.hpp" #include "gnucap/panels/PnlGnuCapTR.hpp" #include "gnucap/panels/PnlGnuCapFO.hpp" // Local Constant Declarations //***************************************************************************** class NbkGnuCap : public NbkSimrBase { private: // Analysis pages PnlGnuCapOP * m_poPnlGnuCapOP; PnlGnuCapDC * m_poPnlGnuCapDC; PnlGnuCapAC * m_poPnlGnuCapAC; PnlGnuCapTR * m_poPnlGnuCapTR; PnlGnuCapFO * m_poPnlGnuCapFO; // OPTIONS line setup dialog DlgGcpCfgOPT m_oDlgCfgOPT; public: NbkGnuCap( wxWindow * poParent, wxWindowID oWinID ); ~NbkGnuCap( ); virtual bool bClear( void ); virtual bool bLoad( const SimnBase & roSimn ); virtual bool bSave( SimnBase & roSimn ); virtual bool bSetPage( const wxChar * psAnalysis ); virtual bool bSetPage( eCmdType eAnalysis ); virtual const wxString & rosGetPage( void ); virtual eCmdType eGetPage( void ); // Event handlers void OnPageChangd( wxNotebookEvent & roEvtNbk ); void OnBtnOptions( wxCommandEvent & roEvtCmd ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // NBKGNUCAP_HPP gspiceui-1.0.00+dfsg/src/gnucap/dialogs/0000755000000000000000000000000011550327466016514 5ustar rootrootgspiceui-1.0.00+dfsg/src/gnucap/dialogs/DlgGcpCfgOPT.cpp0000644000000000000000000011147711550327466021376 0ustar rootroot//***************************************************************************** // DlgGcpCfgOPT.cpp * // ------------------ * // Started : 14/09/2006 * // Last Update : 11/04/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/dialogs/DlgGcpCfgOPT.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( DlgGcpCfgOPT, wxDialog ) EVT_BUTTON( ID_BTN_OK, DlgGcpCfgOPT::OnBtnOk ) EVT_BUTTON( ID_BTN_DEFAULTS, DlgGcpCfgOPT::OnBtnDefaults ) EVT_BUTTON( ID_BTN_CANCEL, DlgGcpCfgOPT::OnBtnCancel ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // poWin - A pointer to the dialog parent window DlgGcpCfgOPT::DlgGcpCfgOPT( wxWindow * poWin ) : wxDialog( poWin, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, wxDialogNameStr ) { SetTitle( wxT(" GNU-Cap OPTIONS Command Setup") ); Initialize( ); bClear( ); } //***************************************************************************** // Destructor. DlgGcpCfgOPT::~DlgGcpCfgOPT( ) { } //***************************************************************************** // Initialize object attributes. void DlgGcpCfgOPT::Initialize( void ) { // Call all the initialization functions Create( ); ToolTips( ); // Layout the of the display objects DoLayout( ); } //***************************************************************************** // Create the display objects. void DlgGcpCfgOPT::Create( void ) { wxPanel * poPnlLHS, * poPnlMID, * poPnlRHS, * poPnlRHS_Opts, * poPnlBtns; wxPanel * poPnl1; // Create the necessary panel objects poPnlLHS = new wxPanel( this ); poPnlMID = new wxPanel( this ); poPnlRHS = new wxPanel( this ); poPnlRHS_Opts = new wxPanel( poPnlRHS ); poPnlBtns = new wxPanel( poPnlRHS ); // Create the PnlValue controls m_oPnlABSTOL .bCreate( poPnlLHS, ID_PNL_ABSTOL, 75 ); m_oPnlCHGTOL .bCreate( poPnlLHS, ID_PNL_CHGTOL, 75 ); m_oPnlDAMPMAX .bCreate( poPnlLHS, ID_PNL_DAMPMAX, 75 ); m_oPnlDAMPMIN .bCreate( poPnlLHS, ID_PNL_DAMPMIN, 75 ); m_oPnlDAMPST .bCreate( poPnlLHS, ID_PNL_DAMPST, 75 ); m_oPnlDEFAD .bCreate( poPnlLHS, ID_PNL_DEFAD, 75 ); m_oPnlDEFAS .bCreate( poPnlLHS, ID_PNL_DEFAS, 75 ); m_oPnlDEFL .bCreate( poPnlLHS, ID_PNL_DEFL, 75 ); m_oPnlDEFW .bCreate( poPnlLHS, ID_PNL_DEFW, 75 ); m_oPnlDTMIN .bCreate( poPnlLHS, ID_PNL_DTMIN, 75 ); m_oPnlDTRATIO .bCreate( poPnlLHS, ID_PNL_DTRATIO, 75 ); m_oPnlFLOOR .bCreate( poPnlLHS, ID_PNL_FLOOR, 75 ); m_oPnlGMIN .bCreate( poPnlLHS, ID_PNL_GMIN, 75 ); m_oPnlHARMS .bCreate( poPnlLHS, ID_PNL_HARMS, 75 ); m_oPnlITL1 .bCreate( poPnlLHS, ID_PNL_ITL1, 75 ); m_oPnlITL2 .bCreate( poPnlLHS, ID_PNL_ITL2, 75 ); m_oPnlITL4 .bCreate( poPnlMID, ID_PNL_ITL4, 75 ); m_oPnlITL7 .bCreate( poPnlMID, ID_PNL_ITL7, 75 ); m_oPnlITL8 .bCreate( poPnlMID, ID_PNL_ITL8, 75 ); m_oPnlLIMIT .bCreate( poPnlMID, ID_PNL_LIMIT, 75 ); m_oPnlNUMDGT .bCreate( poPnlMID, ID_PNL_NUMDGT, 75 ); m_oPnlRELTOL .bCreate( poPnlMID, ID_PNL_RELTOL, 75 ); m_oPnlSEED .bCreate( poPnlMID, ID_PNL_SEED, 75 ); m_oPnlSHORT .bCreate( poPnlMID, ID_PNL_SHORT, 75 ); m_oPnlTEMPAMB .bCreate( poPnlMID, ID_PNL_TEMPAMB, 75 ); m_oPnlTNOM .bCreate( poPnlMID, ID_PNL_TNOM, 75 ); m_oPnlTRANSITS.bCreate( poPnlMID, ID_PNL_TRANSITS, 75 ); m_oPnlTRREJECT.bCreate( poPnlMID, ID_PNL_TRREJECT, 75 ); m_oPnlTRSTEPG .bCreate( poPnlMID, ID_PNL_TRSTEPG, 75 ); m_oPnlTRSTEPS .bCreate( poPnlMID, ID_PNL_TRSTEPS, 75 ); m_oPnlTRTOL .bCreate( poPnlMID, ID_PNL_TRTOL, 75 ); m_oPnlVFLOOR .bCreate( poPnlMID, ID_PNL_VFLOOR, 75 ); m_oPnlVMAX .bCreate( poPnlRHS_Opts, ID_PNL_VMAX, 75 ); m_oPnlVMIN .bCreate( poPnlRHS_Opts, ID_PNL_VMIN, 75 ); m_oPnlVNTOL .bCreate( poPnlRHS_Opts, ID_PNL_VNTOL, 75 ); m_oPnlWCZERO .bCreate( poPnlRHS_Opts, ID_PNL_WCZERO, 75 ); m_oPnlABSTOL .bSetName( wxT("ABSTOL") ); m_oPnlCHGTOL .bSetName( wxT("CHGTOL") ); m_oPnlDAMPMAX .bSetName( wxT("DAMPMAX") ); m_oPnlDAMPMIN .bSetName( wxT("DAMPMIN") ); m_oPnlDAMPST .bSetName( wxT("DAMPST") ); m_oPnlDEFAD .bSetName( wxT("DEFAD") ); m_oPnlDEFAS .bSetName( wxT("DEFAS") ); m_oPnlDEFL .bSetName( wxT("DEFL") ); m_oPnlDEFW .bSetName( wxT("DEFW") ); m_oPnlDTMIN .bSetName( wxT("DTMIN") ); m_oPnlDTRATIO .bSetName( wxT("DTRATIO") ); m_oPnlFLOOR .bSetName( wxT("FLOOR") ); m_oPnlGMIN .bSetName( wxT("GMIN") ); m_oPnlHARMS .bSetName( wxT("HARMS") ); m_oPnlITL1 .bSetName( wxT("ITL1") ); m_oPnlITL2 .bSetName( wxT("ITL2") ); m_oPnlITL4 .bSetName( wxT("ITL4") ); m_oPnlITL7 .bSetName( wxT("ITL7") ); m_oPnlITL8 .bSetName( wxT("ITL8") ); m_oPnlLIMIT .bSetName( wxT("LIMIT") ); m_oPnlNUMDGT .bSetName( wxT("NUMDGT") ); m_oPnlRELTOL .bSetName( wxT("RELTOL") ); m_oPnlSEED .bSetName( wxT("SEED") ); m_oPnlSHORT .bSetName( wxT("SHORT") ); m_oPnlTEMPAMB .bSetName( wxT("TEMPAMB") ); m_oPnlTNOM .bSetName( wxT("TNOM") ); m_oPnlTRANSITS.bSetName( wxT("TRANSITS") ); m_oPnlTRREJECT.bSetName( wxT("TRREJECT") ); m_oPnlTRSTEPG .bSetName( wxT("TRSTEPG") ); m_oPnlTRSTEPS .bSetName( wxT("TRSTEPS") ); m_oPnlTRTOL .bSetName( wxT("TRTOL") ); m_oPnlVFLOOR .bSetName( wxT("VFLOOR") ); m_oPnlVMAX .bSetName( wxT("VMAX") ); m_oPnlVMIN .bSetName( wxT("VMIN") ); m_oPnlVNTOL .bSetName( wxT("VNTOL") ); m_oPnlWCZERO .bSetName( wxT("WCZERO") ); m_oPnlTEMPAMB .bSetUnitsType( eUNITS_TEMP ); m_oPnlTNOM .bSetUnitsType( eUNITS_TEMP ); m_oPnlVMIN .bSetUnitsType( eUNITS_VOLT ); m_oPnlVMAX .bSetUnitsType( eUNITS_VOLT ); m_oPnlVNTOL .bSetUnitsType( eUNITS_VOLT ); m_oPnlABSTOL .bSetVarType( eVAR_SCI ); m_oPnlCHGTOL .bSetVarType( eVAR_SCI ); m_oPnlDAMPST .bSetVarType( eVAR_INT ); m_oPnlDEFAD .bSetVarType( eVAR_SCI ); m_oPnlDEFAS .bSetVarType( eVAR_SCI ); m_oPnlDEFL .bSetVarType( eVAR_SCI ); m_oPnlDEFW .bSetVarType( eVAR_SCI ); m_oPnlDTMIN .bSetVarType( eVAR_SCI ); m_oPnlDTRATIO .bSetVarType( eVAR_SCI ); m_oPnlFLOOR .bSetVarType( eVAR_SCI ); m_oPnlGMIN .bSetVarType( eVAR_SCI ); m_oPnlHARMS .bSetVarType( eVAR_INT ); m_oPnlITL1 .bSetVarType( eVAR_INT ); m_oPnlITL2 .bSetVarType( eVAR_INT ); m_oPnlITL4 .bSetVarType( eVAR_INT ); m_oPnlITL7 .bSetVarType( eVAR_INT ); m_oPnlITL8 .bSetVarType( eVAR_INT ); m_oPnlLIMIT .bSetVarType( eVAR_SCI ); m_oPnlNUMDGT .bSetVarType( eVAR_INT ); m_oPnlSHORT .bSetVarType( eVAR_SCI ); m_oPnlTRANSITS.bSetVarType( eVAR_INT ); m_oPnlVFLOOR .bSetVarType( eVAR_SCI ); m_oPnlWCZERO .bSetVarType( eVAR_SCI ); m_oPnlABSTOL .bShowUnits( FALSE ); m_oPnlCHGTOL .bShowUnits( FALSE ); m_oPnlDAMPMAX .bShowUnits( FALSE ); m_oPnlDAMPMIN .bShowUnits( FALSE ); m_oPnlDAMPST .bShowUnits( FALSE ); m_oPnlDEFAD .bShowUnits( FALSE ); m_oPnlDEFAS .bShowUnits( FALSE ); m_oPnlDEFL .bShowUnits( FALSE ); m_oPnlDEFW .bShowUnits( FALSE ); m_oPnlDTMIN .bShowUnits( FALSE ); m_oPnlDTRATIO .bShowUnits( FALSE ); m_oPnlFLOOR .bShowUnits( FALSE ); m_oPnlGMIN .bShowUnits( FALSE ); m_oPnlHARMS .bShowUnits( FALSE ); m_oPnlITL1 .bShowUnits( FALSE ); m_oPnlITL2 .bShowUnits( FALSE ); m_oPnlITL4 .bShowUnits( FALSE ); m_oPnlITL7 .bShowUnits( FALSE ); m_oPnlITL8 .bShowUnits( FALSE ); m_oPnlLIMIT .bShowUnits( FALSE ); m_oPnlNUMDGT .bShowUnits( FALSE ); m_oPnlRELTOL .bShowUnits( FALSE ); m_oPnlSEED .bShowUnits( FALSE ); m_oPnlSHORT .bShowUnits( FALSE ); m_oPnlTRANSITS.bShowUnits( FALSE ); m_oPnlTRREJECT.bShowUnits( FALSE ); m_oPnlTRSTEPG .bShowUnits( FALSE ); m_oPnlTRSTEPS .bShowUnits( FALSE ); m_oPnlTRTOL .bShowUnits( FALSE ); m_oPnlVFLOOR .bShowUnits( FALSE ); m_oPnlWCZERO .bShowUnits( FALSE ); m_oPnlABSTOL .bSetRange( 1.00E-14, 9.99E-11 ); m_oPnlCHGTOL .bSetRange( 1.00E-16, 9.99E-13 ); m_oPnlDAMPMAX .bSetRange( 0.00, 1.0 ); m_oPnlDAMPMIN .bSetRange( 0.00, 1.0 ); m_oPnlDAMPST .bSetRange( 0, 37 ); m_oPnlDEFAD .bSetRange( 1.00E-14, 9.99E-10 ); m_oPnlDEFAS .bSetRange( 1.00E-14, 9.99E-10 ); m_oPnlDEFL .bSetRange( 1.00E-08, 9.99E-02 ); m_oPnlDEFW .bSetRange( 1.00E-08, 9.99E-02 ); m_oPnlDTMIN .bSetRange( 1.00E-14, 9.99E-12 ); m_oPnlDTRATIO .bSetRange( 1.00E-10, 9.99E+10 ); m_oPnlFLOOR .bSetRange( 1.00E-23, 9.99E-19 ); m_oPnlGMIN .bSetRange( 1.00E-14, 9.99E-11 ); m_oPnlHARMS .bSetRange( 1, 100 ); m_oPnlITL1 .bSetRange( 0, 1000 ); m_oPnlITL2 .bSetRange( 0, 1000 ); m_oPnlITL4 .bSetRange( 0, 1000 ); m_oPnlITL7 .bSetRange( 0, 1000 ); m_oPnlITL8 .bSetRange( 0, 1000 ); m_oPnlLIMIT .bSetRange( 1.00E-10, 9.99E+10 ); m_oPnlNUMDGT .bSetRange( 3, 20 ); m_oPnlRELTOL .bSetRange( 0.01, 100.0 ); m_oPnlSEED .bSetRange( 0.00, 10.0 ); m_oPnlSHORT .bSetRange( 1.00E-09, 9.99E-05 ); m_oPnlTRANSITS.bSetRange( 1, 100 ); m_oPnlTRREJECT.bSetRange( 0.01, 100.0 ); m_oPnlTRSTEPG .bSetRange( 0.01, 100.0 ); m_oPnlTRSTEPS .bSetRange( 0.01, 100.0 ); m_oPnlTRTOL .bSetRange( 0.01, 100.0 ); m_oPnlVFLOOR .bSetRange( 1.00E-17, 9.99E-13 ); m_oPnlWCZERO .bSetRange( 1.00E-09, 9.99E-08 ); m_oPnlDAMPMAX .bSetIncSz( 0.01, 0.1 ); m_oPnlDAMPMIN .bSetIncSz( 0.01, 0.1 ); m_oPnlDAMPST .bSetIncSz( 1, 1 ); m_oPnlHARMS .bSetIncSz( 1, 10 ); m_oPnlITL1 .bSetIncSz( 1, 100 ); m_oPnlITL2 .bSetIncSz( 1, 100 ); m_oPnlITL4 .bSetIncSz( 1, 100 ); m_oPnlITL7 .bSetIncSz( 1, 100 ); m_oPnlITL8 .bSetIncSz( 1, 100 ); m_oPnlNUMDGT .bSetIncSz( 1, 1 ); m_oPnlRELTOL .bSetIncSz( 0.01, 10.0 ); m_oPnlSEED .bSetIncSz( 0.01, 1.0 ); m_oPnlTRANSITS.bSetIncSz( 1, 10 ); m_oPnlTRREJECT.bSetIncSz( 0.01, 10.0 ); m_oPnlTRSTEPG .bSetIncSz( 0.01, 10.0 ); m_oPnlTRSTEPS .bSetIncSz( 0.01, 10.0 ); m_oPnlTRTOL .bSetIncSz( 0.01, 10.0 ); m_oPnlABSTOL .bSetUnits( wxT("Amp") ); m_oPnlCHGTOL .bSetUnits( wxT("Coulomb") ); m_oPnlDEFAD .bSetUnits( wxT("Sq. Meter") ); m_oPnlDEFAS .bSetUnits( wxT("Sq. Meter") ); m_oPnlDEFL .bSetUnits( wxT("Meter") ); m_oPnlDEFW .bSetUnits( wxT("Meter") ); m_oPnlDTMIN .bSetUnits( wxT("Sec") ); m_oPnlGMIN .bSetUnits( wxT("Ohm") ); m_oPnlLIMIT .bSetUnits( wxT("Volt") ); m_oPnlRELTOL .bSetUnits( wxT("%") ); m_oPnlVFLOOR .bSetUnits( wxT("Volt") ); // Create the choice box controls poPnl1 = new wxPanel( poPnlRHS_Opts ); m_oLblMETHOD.Create( poPnl1, ID_UNUSED, wxT("METHOD"), wxDefaultPosition, wxSize( 80, -1 ), wxST_NO_AUTORESIZE ); m_oChoMETHOD.Create( poPnl1, ID_CHO_METHOD, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoMETHOD.Append( wxT("Euler") ); m_oChoMETHOD.Append( wxT("EulerOnly") ); m_oChoMETHOD.Append( wxT("Trap") ); m_oChoMETHOD.Append( wxT("TrapOnly") ); m_oChoMETHOD.SetSelection( 0 ); poPnl1 = new wxPanel( poPnlRHS_Opts ); m_oLblMODE .Create( poPnl1, ID_UNUSED, wxT("MODE"), wxDefaultPosition, wxSize( 80, -1 ), wxST_NO_AUTORESIZE ); m_oChoMODE .Create( poPnl1, ID_CHO_MODE, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoMODE .Append( wxT("Analog") ); m_oChoMODE .Append( wxT("Digital") ); m_oChoMODE .Append( wxT("Mixed") ); m_oChoMODE .SetSelection( 0 ); poPnl1 = new wxPanel( poPnlRHS_Opts ); m_oLblORDER .Create( poPnl1, ID_UNUSED, wxT("ORDER"), wxDefaultPosition, wxSize( 80, -1 ), wxST_NO_AUTORESIZE ); m_oChoORDER .Create( poPnl1, ID_CHO_ORDER, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoORDER .Append( wxT("Forward") ); m_oChoORDER .Append( wxT("Reverse") ); m_oChoORDER .Append( wxT("Auto") ); m_oChoORDER .SetSelection( 0 ); // Create the check box controls poPnl1 = new wxPanel( poPnlRHS_Opts ); m_oCbxBYPASS .Create( poPnl1, ID_CBX_BYPASS, wxT("BYPASS \t\t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); m_oCbxCSTRAY .Create( poPnl1, ID_CBX_CSTRAY, wxT("CSTRAY \t\t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); m_oCbxINCMODE .Create( poPnl1, ID_CBX_INCMODE, wxT("INCMODE \t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); m_oCbxLUBYPASS.Create( poPnl1, ID_CBX_LUBYPASS, wxT("LUBYPASS \t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); m_oCbxRSTRAY .Create( poPnl1, ID_CBX_RSTRAY, wxT("RSTRAY \t\t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); m_oCbxTRACEL .Create( poPnl1, ID_CBX_TRACEL, wxT("TRACEL \t\t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); m_oCbxVBYPASS .Create( poPnl1, ID_CBX_VBYPASS, wxT("VBYPASS \t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); // Create the buttons m_oBtnOk .Create( poPnlBtns, ID_BTN_OK, wxT("OK") ); m_oBtnDefaults.Create( poPnlBtns, ID_BTN_DEFAULTS, wxT("Defaults") ); m_oBtnCancel .Create( poPnlBtns, ID_BTN_CANCEL, wxT("Cancel") ); } //***************************************************************************** // Initialize the tool tips. void DlgGcpCfgOPT::ToolTips( void ) { // Define tool tips for each control m_oPnlABSTOL .SetToolTip( wxT("Absolute current error tolerance") ); m_oPnlCHGTOL .SetToolTip( wxT("Charge tolerance") ); m_oPnlDAMPMAX .SetToolTip( wxT("Normal Newton damping factor (when all is well)") ); m_oPnlDAMPMIN .SetToolTip( wxT("Newton damping factor when there's a problem") ); m_oPnlDAMPST .SetToolTip( wxT("Damping strategy") ); m_oPnlDEFAD .SetToolTip( wxT("MOS drain diffusion area") ); m_oPnlDEFAS .SetToolTip( wxT("MOS source diffusion area") ); m_oPnlDEFL .SetToolTip( wxT("MOS channel length") ); m_oPnlDEFW .SetToolTip( wxT("MOS channel width") ); m_oPnlDTMIN .SetToolTip( wxT("Minimum time step") ); m_oPnlDTRATIO .SetToolTip( wxT("Ratio between the minimum and maximum time step") ); m_oPnlFLOOR .SetToolTip( wxT("Effective zero value") ); m_oPnlGMIN .SetToolTip( wxT("Minimum allowable conductance") ); m_oPnlHARMS .SetToolTip( wxT("Harmonics in Fourier analysis") ); m_oPnlITL1 .SetToolTip( wxT("DC iteration limit") ); m_oPnlITL2 .SetToolTip( wxT("DC transfer curve iteration limit") ); m_oPnlITL4 .SetToolTip( wxT("Transient analysis timepoint iteration limit") ); m_oPnlITL7 .SetToolTip( wxT("Worst case analysis iteration limit") ); m_oPnlITL8 .SetToolTip( wxT("Convergence diagnostic iteration threshold") ); m_oPnlLIMIT .SetToolTip( wxT("Internal differential branch voltage limit") ); m_oPnlNUMDGT .SetToolTip( wxT("Number of digits to print for analysis results") ); m_oPnlRELTOL .SetToolTip( wxT("Relative error tolerance") ); m_oPnlSEED .SetToolTip( wxT("Seed used by the random number generator") ); m_oPnlSHORT .SetToolTip( wxT("Resistance of voltage source or short") ); m_oPnlTEMPAMB .SetToolTip( wxT("Ambient temp. of circuit") ); m_oPnlTNOM .SetToolTip( wxT("Nominal temp. at which device parameters measured") ); m_oPnlTRANSITS.SetToolTip( wxT("Mixed mode transition count") ); m_oPnlTRREJECT.SetToolTip( wxT("Transient error rejection threshold") ); m_oPnlTRSTEPG .SetToolTip( wxT("Maximum internal step size growth in transient analysis") ); m_oPnlTRSTEPS .SetToolTip( wxT("Amount to decrease the transient step size by when convergence fails") ); m_oPnlTRTOL .SetToolTip( wxT("Transient analysis error tolerance") ); m_oPnlVFLOOR .SetToolTip( wxT("Effective zero value for voltage probes") ); m_oPnlVMAX .SetToolTip( wxT("Positive node voltage limit") ); m_oPnlVMIN .SetToolTip( wxT("Negative node voltage limit") ); m_oPnlVNTOL .SetToolTip( wxT("Absolute voltage error tolerance") ); m_oPnlWCZERO .SetToolTip( wxT("Worst case zero window") ); m_oChoMETHOD.GetParent( )->SetToolTip( wxT("Numerical integration method") ); m_oChoMODE .GetParent( )->SetToolTip( wxT("Simulation mode selection") ); m_oChoORDER .GetParent( )->SetToolTip( wxT("Equation ordering") ); m_oCbxBYPASS .SetToolTip( wxT("Bypass model evaluation if appropriate") ); m_oCbxCSTRAY .SetToolTip( wxT("Include capacitance in device models") ); m_oCbxINCMODE .SetToolTip( wxT("Incrementally update the matrix") ); m_oCbxLUBYPASS.SetToolTip( wxT("Bypass parts of LU decomposition if appropriate") ); m_oCbxRSTRAY .SetToolTip( wxT("Include series resistance in device models") ); m_oCbxTRACEL .SetToolTip( wxT("Use a queue to only load changed elements to the matrix") ); m_oCbxVBYPASS .SetToolTip( wxT("Check only voltage to bypass model evaluation") ); } //***************************************************************************** // Layout the dialog display objects. void DlgGcpCfgOPT::DoLayout( void ) { wxBoxSizer * poSzrDlg; wxPanel * poPnlLHS, * poPnlMID, * poPnlRHS, * poPnlRHS_Opts, * poPnlBtns; wxPanel * poPnlMETHOD, * poPnlMODE, * poPnlORDER, * poPnlCbxs; wxBoxSizer * poSzrLHS, * poSzrMID, * poSzrRHS, * poSzrRHS_Opts, * poSzrBtns; wxBoxSizer * poSzrMETHOD, * poSzrMODE, * poSzrORDER, * poSzrCbxs; wxSizerFlags oFlags; // Get pointers to the various panels poPnlBtns = (wxPanel *) m_oBtnOk .GetParent( ); poPnlLHS = (wxPanel *) m_oPnlABSTOL.GetParent( ); poPnlMID = (wxPanel *) m_oPnlNUMDGT.GetParent( ); poPnlRHS = (wxPanel *) poPnlBtns ->GetParent( ); poPnlRHS_Opts = (wxPanel *) m_oPnlWCZERO.GetParent( ); poPnlMETHOD = (wxPanel *) m_oChoMETHOD.GetParent( ); poPnlMODE = (wxPanel *) m_oChoMODE .GetParent( ); poPnlORDER = (wxPanel *) m_oChoORDER .GetParent( ); poPnlCbxs = (wxPanel *) m_oCbxBYPASS.GetParent( ); // Create sizers to associate with the panels poSzrDlg = new wxBoxSizer ( wxHORIZONTAL ); poSzrLHS = new wxStaticBoxSizer( wxVERTICAL, poPnlLHS ); poSzrMID = new wxStaticBoxSizer( wxVERTICAL, poPnlMID ); poSzrRHS = new wxBoxSizer ( wxVERTICAL ); poSzrRHS_Opts = new wxStaticBoxSizer( wxVERTICAL, poPnlRHS_Opts ); poSzrBtns = new wxBoxSizer ( wxHORIZONTAL ); poSzrMETHOD = new wxBoxSizer ( wxHORIZONTAL ); poSzrMODE = new wxBoxSizer ( wxHORIZONTAL ); poSzrORDER = new wxBoxSizer ( wxHORIZONTAL ); poSzrCbxs = new wxBoxSizer ( wxVERTICAL ); // Set the sizers to the panels SetSizer( poSzrDlg ); poPnlLHS ->SetSizer( poSzrLHS ); poPnlMID ->SetSizer( poSzrMID ); poPnlRHS ->SetSizer( poSzrRHS ); poPnlRHS_Opts->SetSizer( poSzrRHS_Opts ); poPnlBtns ->SetSizer( poSzrBtns ); poPnlMETHOD ->SetSizer( poSzrMETHOD ); poPnlMODE ->SetSizer( poSzrMODE ); poPnlORDER ->SetSizer( poSzrORDER ); poPnlCbxs ->SetSizer( poSzrCbxs ); // Layout the choice control panels oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxTOP | wxBOTTOM, 1 ); poSzrMETHOD->Add( &m_oLblMETHOD, oFlags ); poSzrMETHOD->Add( &m_oChoMETHOD, oFlags ); poSzrMETHOD->SetSizeHints( poPnlMETHOD ); poSzrMODE ->Add( &m_oLblMODE, oFlags ); poSzrMODE ->Add( &m_oChoMODE, oFlags ); poSzrMODE ->SetSizeHints( poPnlMODE ); poSzrORDER ->Add( &m_oLblORDER, oFlags ); poSzrORDER ->Add( &m_oChoORDER, oFlags ); poSzrORDER ->SetSizeHints( poPnlORDER ); // Layout the check box panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxTOP, 3 ); poSzrCbxs->Add( &m_oCbxBYPASS, oFlags ); oFlags.Border( wxTOP, 8 ); poSzrCbxs->Add( &m_oCbxCSTRAY, oFlags ); poSzrCbxs->Add( &m_oCbxINCMODE, oFlags ); poSzrCbxs->Add( &m_oCbxLUBYPASS, oFlags ); poSzrCbxs->Add( &m_oCbxRSTRAY, oFlags ); poSzrCbxs->Add( &m_oCbxTRACEL, oFlags ); poSzrCbxs->Add( &m_oCbxVBYPASS, oFlags ); poSzrCbxs->SetSizeHints( poPnlCbxs ); // Layout the left hand panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxLEFT | wxRIGHT | wxTOP, 10 ); poSzrLHS->Add( &m_oPnlABSTOL, oFlags ); oFlags.Border( wxLEFT, 10 ); poSzrLHS->Add( &m_oPnlCHGTOL, oFlags ); poSzrLHS->Add( &m_oPnlDAMPMAX, oFlags ); poSzrLHS->Add( &m_oPnlDAMPMIN, oFlags ); poSzrLHS->Add( &m_oPnlDAMPST, oFlags ); poSzrLHS->Add( &m_oPnlDEFAD, oFlags ); poSzrLHS->Add( &m_oPnlDEFAS, oFlags ); poSzrLHS->Add( &m_oPnlDEFL, oFlags ); poSzrLHS->Add( &m_oPnlDEFW, oFlags ); poSzrLHS->Add( &m_oPnlDTMIN, oFlags ); poSzrLHS->Add( &m_oPnlDTRATIO, oFlags ); poSzrLHS->Add( &m_oPnlFLOOR, oFlags ); poSzrLHS->Add( &m_oPnlGMIN, oFlags ); poSzrLHS->Add( &m_oPnlHARMS, oFlags ); poSzrLHS->Add( &m_oPnlITL1, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 10 ); poSzrLHS->Add( &m_oPnlITL2, oFlags ); poSzrLHS->SetSizeHints( poPnlLHS ); // Layout the middle panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxLEFT | wxRIGHT | wxTOP, 10 ); poSzrMID->Add( &m_oPnlITL4, oFlags ); oFlags.Border( wxLEFT, 10 ); poSzrMID->Add( &m_oPnlITL7, oFlags ); poSzrMID->Add( &m_oPnlITL8, oFlags ); poSzrMID->Add( &m_oPnlLIMIT, oFlags ); poSzrMID->Add( &m_oPnlNUMDGT, oFlags ); poSzrMID->Add( &m_oPnlRELTOL, oFlags ); poSzrMID->Add( &m_oPnlSEED, oFlags ); poSzrMID->Add( &m_oPnlSHORT, oFlags ); poSzrMID->Add( &m_oPnlTEMPAMB, oFlags ); poSzrMID->Add( &m_oPnlTNOM, oFlags ); poSzrMID->Add( &m_oPnlTRANSITS, oFlags ); poSzrMID->Add( &m_oPnlTRREJECT, oFlags ); poSzrMID->Add( &m_oPnlTRSTEPG, oFlags ); poSzrMID->Add( &m_oPnlTRSTEPS, oFlags ); poSzrMID->Add( &m_oPnlTRTOL, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 10 ); poSzrMID->Add( &m_oPnlVFLOOR, oFlags ); poSzrMID->SetSizeHints( poPnlMID ); // Layout the right hand options panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxLEFT | wxTOP | wxRIGHT, 10 ); poSzrRHS_Opts->Add( &m_oPnlVMAX, oFlags ); oFlags.Border( wxLEFT, 10 ); poSzrRHS_Opts->Add( &m_oPnlVMIN, oFlags ); poSzrRHS_Opts->Add( &m_oPnlVNTOL, oFlags ); poSzrRHS_Opts->Add( &m_oPnlWCZERO, oFlags ); poSzrRHS_Opts->Add( poPnlMETHOD, oFlags ); poSzrRHS_Opts->Add( poPnlMODE, oFlags ); poSzrRHS_Opts->Add( poPnlORDER, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 8 ); poSzrRHS_Opts->Add( poPnlCbxs, oFlags ); poSzrRHS_Opts->SetSizeHints( poPnlRHS_Opts ); // Layout the buttons panel oFlags.Border( wxTOP | wxBOTTOM, 0 ); oFlags.Align( wxALIGN_RIGHT ); poSzrBtns->Add( &m_oBtnOk, oFlags ); poSzrBtns->AddSpacer( 10 ); oFlags.Align( wxALIGN_CENTER ); poSzrBtns->Add( &m_oBtnDefaults, oFlags ); poSzrBtns->AddSpacer( 10 ); oFlags.Align( wxALIGN_LEFT ); poSzrBtns->Add( &m_oBtnCancel, oFlags ); poSzrBtns->SetSizeHints( poPnlBtns ); // Layout the right hand panel oFlags.Align( wxALIGN_TOP ); oFlags.Border( wxALL, 0 ); poSzrRHS->Add( poPnlRHS_Opts, oFlags ); oFlags.Align( wxALIGN_BOTTOM | wxALIGN_CENTER_HORIZONTAL ); oFlags.Border( wxTOP, 25 ); poSzrRHS->Add( poPnlBtns, oFlags ); poSzrRHS->SetSizeHints( poPnlRHS ); // Layout the overall dialog oFlags.Align( wxALIGN_TOP | wxALIGN_CENTER_HORIZONTAL ); oFlags.Border( wxALL, 15 ); GetSizer( )->Add( poPnlLHS, oFlags ); oFlags.Border( wxTOP | wxBOTTOM, 15 ); GetSizer( )->Add( poPnlMID, oFlags ); oFlags.Border( wxALL, 15 ); GetSizer( )->Add( poPnlRHS, oFlags ); GetSizer( )->SetSizeHints( this ); } //***************************************************************************** // Get a pointer to a value panel associated with a control ID number. // // Argument List : // iPnlID - The control ID number // // Return Values : // Success - A pointer to the value panel // Failure - NULL PnlValue * DlgGcpCfgOPT::poGetPanel( int iPnlID ) { switch( iPnlID ) { case ID_PNL_ABSTOL : return( &m_oPnlABSTOL ); case ID_PNL_CHGTOL : return( &m_oPnlCHGTOL ); case ID_PNL_DAMPMAX : return( &m_oPnlDAMPMAX ); case ID_PNL_DAMPMIN : return( &m_oPnlDAMPMIN ); case ID_PNL_DAMPST : return( &m_oPnlDAMPST ); case ID_PNL_DEFAD : return( &m_oPnlDEFAD ); case ID_PNL_DEFAS : return( &m_oPnlDEFAS ); case ID_PNL_DEFL : return( &m_oPnlDEFL ); case ID_PNL_DEFW : return( &m_oPnlDEFW ); case ID_PNL_DTMIN : return( &m_oPnlDTMIN ); case ID_PNL_DTRATIO : return( &m_oPnlDTRATIO ); case ID_PNL_FLOOR : return( &m_oPnlFLOOR ); case ID_PNL_GMIN : return( &m_oPnlGMIN ); case ID_PNL_HARMS : return( &m_oPnlHARMS ); case ID_PNL_ITL1 : return( &m_oPnlITL1 ); case ID_PNL_ITL2 : return( &m_oPnlITL2 ); case ID_PNL_ITL4 : return( &m_oPnlITL4 ); case ID_PNL_ITL7 : return( &m_oPnlITL7 ); case ID_PNL_ITL8 : return( &m_oPnlITL8 ); case ID_PNL_LIMIT : return( &m_oPnlLIMIT ); case ID_PNL_NUMDGT : return( &m_oPnlNUMDGT ); case ID_PNL_RELTOL : return( &m_oPnlRELTOL ); case ID_PNL_SEED : return( &m_oPnlSEED ); case ID_PNL_SHORT : return( &m_oPnlSHORT ); case ID_PNL_TEMPAMB : return( &m_oPnlTEMPAMB ); case ID_PNL_TNOM : return( &m_oPnlTNOM ); case ID_PNL_TRANSITS : return( &m_oPnlTRANSITS ); case ID_PNL_TRREJECT : return( &m_oPnlTRREJECT ); case ID_PNL_TRSTEPG : return( &m_oPnlTRSTEPG ); case ID_PNL_TRSTEPS : return( &m_oPnlTRSTEPS ); case ID_PNL_TRTOL : return( &m_oPnlTRTOL ); case ID_PNL_VFLOOR : return( &m_oPnlVFLOOR ); case ID_PNL_VMAX : return( &m_oPnlVMAX ); case ID_PNL_VMIN : return( &m_oPnlVMIN ); case ID_PNL_VNTOL : return( &m_oPnlVNTOL ); case ID_PNL_WCZERO : return( &m_oPnlWCZERO ); default : return( NULL ); } } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // rosCmdOPT - A reference to an OPTION command object void DlgGcpCfgOPT::SetValues( CmdGnuCapOPT & roCmdOPT ) { double df1; int i1; SetEvtHandlerEnabled( FALSE ); m_oPnlABSTOL .bSetValue( roCmdOPT.m_osABSTOL ); m_oPnlCHGTOL .bSetValue( roCmdOPT.m_osCHGTOL ); m_oPnlDAMPMAX .bSetValue( roCmdOPT.m_osDAMPMAX ); m_oPnlDAMPMIN .bSetValue( roCmdOPT.m_osDAMPMIN ); m_oPnlDAMPST .bSetValue( roCmdOPT.m_osDAMPST ); m_oPnlDEFAD .bSetValue( roCmdOPT.m_osDEFAD ); m_oPnlDEFAS .bSetValue( roCmdOPT.m_osDEFAS ); m_oPnlDEFL .bSetValue( roCmdOPT.m_osDEFL ); m_oPnlDEFW .bSetValue( roCmdOPT.m_osDEFW ); m_oPnlDTMIN .bSetValue( roCmdOPT.m_osDTMIN ); m_oPnlDTRATIO .bSetValue( roCmdOPT.m_osDTRATIO ); m_oPnlFLOOR .bSetValue( roCmdOPT.m_osFLOOR ); m_oPnlGMIN .bSetValue( roCmdOPT.m_osGMIN ); m_oPnlHARMS .bSetValue( roCmdOPT.m_osHARMS ); m_oPnlITL1 .bSetValue( roCmdOPT.m_osITL1 ); m_oPnlITL2 .bSetValue( roCmdOPT.m_osITL2 ); m_oPnlITL4 .bSetValue( roCmdOPT.m_osITL4 ); m_oPnlITL7 .bSetValue( roCmdOPT.m_osITL7 ); m_oPnlITL8 .bSetValue( roCmdOPT.m_osITL8 ); m_oPnlLIMIT .bSetValue( roCmdOPT.m_osLIMIT ); m_oPnlNUMDGT .bSetValue( roCmdOPT.m_osNUMDGT ); m_oPnlSEED .bSetValue( roCmdOPT.m_osSEED ); m_oPnlSHORT .bSetValue( roCmdOPT.m_osSHORT ); m_oPnlTEMPAMB .bSetValue( roCmdOPT.m_osTEMPAMB ); m_oPnlTNOM .bSetValue( roCmdOPT.m_osTNOM ); m_oPnlTRANSITS.bSetValue( roCmdOPT.m_osTRANSITS ); m_oPnlTRREJECT.bSetValue( roCmdOPT.m_osTRREJECT ); m_oPnlTRSTEPG .bSetValue( roCmdOPT.m_osTRSTEPG ); m_oPnlTRSTEPS .bSetValue( roCmdOPT.m_osTRSTEPS ); m_oPnlTRTOL .bSetValue( roCmdOPT.m_osTRTOL ); m_oPnlVFLOOR .bSetValue( roCmdOPT.m_osVFLOOR ); m_oPnlVMAX .bSetValue( roCmdOPT.m_osVMAX ); m_oPnlVMIN .bSetValue( roCmdOPT.m_osVMIN ); m_oPnlVNTOL .bSetValue( roCmdOPT.m_osVNTOL ); m_oPnlWCZERO .bSetValue( roCmdOPT.m_osWCZERO ); ConvertType::bStrToDFlt ( roCmdOPT.m_osRELTOL, &df1 ); m_oPnlRELTOL .bSetValue( df1 * 100.0 ); for( i1=0; i1<(int)m_oChoMETHOD.GetCount( ); i1++ ) if( m_oChoMETHOD.GetString( i1 ).IsSameAs( roCmdOPT.m_osMETHOD, FALSE ) ) { m_oChoMETHOD.SetSelection( i1 ); break; } for( i1=0; i1<(int)m_oChoMODE.GetCount( ); i1++ ) if( m_oChoMODE.GetString( i1 ).IsSameAs( roCmdOPT.m_osMODE, FALSE ) ) { m_oChoMODE.SetSelection( i1 ); break; } for( i1=0; i1<(int)m_oChoORDER.GetCount( ); i1++ ) if( m_oChoORDER.GetString( i1 ).IsSameAs( roCmdOPT.m_osORDER, FALSE ) ) { m_oChoORDER.SetSelection( i1 ); break; } m_oCbxBYPASS .SetValue( roCmdOPT.m_bBYPASS ); m_oCbxCSTRAY .SetValue( roCmdOPT.m_bCSTRAY ); m_oCbxINCMODE .SetValue( roCmdOPT.m_bINCMODE ); m_oCbxLUBYPASS.SetValue( roCmdOPT.m_bLUBYPASS ); m_oCbxRSTRAY .SetValue( roCmdOPT.m_bRSTRAY ); m_oCbxTRACEL .SetValue( roCmdOPT.m_bTRACEL ); m_oCbxVBYPASS .SetValue( roCmdOPT.m_bVBYPASS ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // rosCmdOPT - A reference to an OPTION command object void DlgGcpCfgOPT::GetValues( CmdGnuCapOPT & roCmdOPT ) { SetEvtHandlerEnabled( FALSE ); roCmdOPT.m_osABSTOL = m_oPnlABSTOL .rosGetValue( ); roCmdOPT.m_osCHGTOL = m_oPnlCHGTOL .rosGetValue( ); roCmdOPT.m_osDAMPMAX = m_oPnlDAMPMAX .rosGetValue( ); roCmdOPT.m_osDAMPMIN = m_oPnlDAMPMIN .rosGetValue( ); roCmdOPT.m_osDAMPST = m_oPnlDAMPST .rosGetValue( ); roCmdOPT.m_osDEFAD = m_oPnlDEFAD .rosGetValue( ); roCmdOPT.m_osDEFAS = m_oPnlDEFAS .rosGetValue( ); roCmdOPT.m_osDEFL = m_oPnlDEFL .rosGetValue( ); roCmdOPT.m_osDEFW = m_oPnlDEFW .rosGetValue( ); roCmdOPT.m_osDTMIN = m_oPnlDTMIN .rosGetValue( ); roCmdOPT.m_osDTRATIO = m_oPnlDTRATIO .rosGetValue( ); roCmdOPT.m_osFLOOR = m_oPnlFLOOR .rosGetValue( ); roCmdOPT.m_osGMIN = m_oPnlGMIN .rosGetValue( ); roCmdOPT.m_osHARMS = m_oPnlHARMS .rosGetValue( ); roCmdOPT.m_osITL1 = m_oPnlITL1 .rosGetValue( ); roCmdOPT.m_osITL2 = m_oPnlITL2 .rosGetValue( ); roCmdOPT.m_osITL4 = m_oPnlITL4 .rosGetValue( ); roCmdOPT.m_osITL7 = m_oPnlITL7 .rosGetValue( ); roCmdOPT.m_osITL8 = m_oPnlITL8 .rosGetValue( ); roCmdOPT.m_osLIMIT = m_oPnlLIMIT .rosGetValue( ); roCmdOPT.m_osNUMDGT = m_oPnlNUMDGT .rosGetValue( ); roCmdOPT.m_osSEED = m_oPnlSEED .rosGetValue( ); roCmdOPT.m_osSHORT = m_oPnlSHORT .rosGetValue( ); roCmdOPT.m_osTEMPAMB = m_oPnlTEMPAMB .rosGetValue( ); roCmdOPT.m_osTNOM = m_oPnlTNOM .rosGetValue( ); roCmdOPT.m_osTRANSITS = m_oPnlTRANSITS.rosGetValue( ); roCmdOPT.m_osTRREJECT = m_oPnlTRREJECT.rosGetValue( ); roCmdOPT.m_osTRSTEPG = m_oPnlTRSTEPG .rosGetValue( ); roCmdOPT.m_osTRSTEPS = m_oPnlTRSTEPS .rosGetValue( ); roCmdOPT.m_osTRTOL = m_oPnlTRTOL .rosGetValue( ); roCmdOPT.m_osVFLOOR = m_oPnlVFLOOR .rosGetValue( ); roCmdOPT.m_osVMAX = m_oPnlVMAX .rosGetValue( ); roCmdOPT.m_osVMIN = m_oPnlVMIN .rosGetValue( ); roCmdOPT.m_osVNTOL = m_oPnlVNTOL .rosGetValue( ); roCmdOPT.m_osWCZERO = m_oPnlWCZERO .rosGetValue( ); ConvertType::bFltToStr( m_oPnlRELTOL.dfGetValue()/100.0, roCmdOPT.m_osRELTOL ); roCmdOPT.m_osMETHOD = m_oChoMETHOD.GetStringSelection( ).Upper( ); roCmdOPT.m_osMODE = m_oChoMODE .GetStringSelection( ).Upper( ); roCmdOPT.m_osORDER = m_oChoORDER .GetStringSelection( ).Upper( ); roCmdOPT.m_bBYPASS = m_oCbxBYPASS .GetValue( ); roCmdOPT.m_bCSTRAY = m_oCbxCSTRAY .GetValue( ); roCmdOPT.m_bINCMODE = m_oCbxINCMODE .GetValue( ); roCmdOPT.m_bLUBYPASS = m_oCbxLUBYPASS.GetValue( ); roCmdOPT.m_bRSTRAY = m_oCbxRSTRAY .GetValue( ); roCmdOPT.m_bTRACEL = m_oCbxTRACEL .GetValue( ); roCmdOPT.m_bVBYPASS = m_oCbxVBYPASS .GetValue( ); roCmdOPT.bFormat( ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // roCmdOPT - A reference to an OPTION command object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgOPT::bSetValues( CmdGnuCapOPT & roCmdOPT ) { SetValues( roCmdOPT ); m_oCmdOPT = roCmdOPT; return( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // roCmdOPT - A reference to an OPTION command object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgOPT::bGetValues( CmdGnuCapOPT & roCmdOPT ) { GetValues( roCmdOPT ); return( TRUE ); } //***************************************************************************** // Reset all dialog settings to defaults. // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgOPT::bClear( void ) { m_oCmdOPT.bSetDefaults( ); SetValues( m_oCmdOPT ); return( TRUE ); } //***************************************************************************** // Set a value panel control's value. // // Argument List : // iPnlID - Value panel control identifier // rosValue - The value to set // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgOPT::bSetValue( int iPnlID, const wxString & rosValue ) { PnlValue * poPnlValue; // Get a pointer to the appropriate value panel poPnlValue = poGetPanel( iPnlID ); if( poPnlValue == NULL ) return( FALSE ); // Set the panel value if( ! poPnlValue->bSetValue( rosValue ) ) return( FALSE ); // Create the OPTIONS command string m_oCmdOPT.bFormat( ); return( TRUE ); } //***************************************************************************** // Get a value panel control's value. // // Argument List : // iPnlID - Value panel control identifier // // Return Values : // Success - The panel value // Failure - 0.0 const wxString & DlgGcpCfgOPT::rosGetValue( int iPnlID ) { static wxString osEmpty; PnlValue * poPnlValue; poPnlValue = poGetPanel( iPnlID ); if( poPnlValue == NULL ) return( osEmpty ); return( poPnlValue->rosGetValue( ) ); } //***************************************************************************** // // Event Handlers // //***************************************************************************** // Ok button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgGcpCfgOPT::OnBtnOk( wxCommandEvent & roEvtCmd ) { GetValues( m_oCmdOPT ); EndModal( wxID_OK ); } //***************************************************************************** // Defaults button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgGcpCfgOPT::OnBtnDefaults( wxCommandEvent & roEvtCmd ) { CmdGnuCapOPT oCmdOPT; oCmdOPT.bSetDefaults( ); SetValues( oCmdOPT ); } //***************************************************************************** // Cancel button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgGcpCfgOPT::OnBtnCancel( wxCommandEvent & roEvtCmd ) { SetValues( m_oCmdOPT ); EndModal( wxID_CANCEL ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/dialogs/DlgGcpCfgGEN.cpp0000644000000000000000000003270711504717246021341 0ustar rootroot//***************************************************************************** // DlgGcpCfgGEN.cpp * // ------------------ * // Started : 27/02/2004 * // Last Update : 23/02/2010 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/dialogs/DlgGcpCfgGEN.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( DlgGcpCfgGEN, wxDialog ) EVT_BUTTON( ID_BTN_OK, DlgGcpCfgGEN::OnBtnOk ) EVT_BUTTON( ID_BTN_CLEAR, DlgGcpCfgGEN::OnBtnClear ) EVT_BUTTON( ID_BTN_CANCEL, DlgGcpCfgGEN::OnBtnCancel ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // poWin - A pointer to the dialog parent window DlgGcpCfgGEN::DlgGcpCfgGEN( wxWindow * poWin ) : wxDialog( poWin, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, wxDialogNameStr ) { SetTitle( wxT("Generator Setup") ); Initialize( ); bClear( ); } //***************************************************************************** // Destructor. DlgGcpCfgGEN::~DlgGcpCfgGEN( ) { } //***************************************************************************** // Initialize object attributes. void DlgGcpCfgGEN::Initialize( void ) { // Call all the initialization functions Create( ); ToolTips( ); // Layout the of the display objects DoLayout( ); } //***************************************************************************** // Create the display objects. void DlgGcpCfgGEN::Create( void ) { wxPanel * poPnl1; // Create the overall panel and controls poPnl1 = new wxPanel( this ); m_oPnlAmplitude.bCreate( poPnl1, ID_PNL_AMPLITUDE, 95 ); m_oPnlOffset .bCreate( poPnl1, ID_PNL_OFFSET, 95 ); m_oPnlAmplitude.bSetName( wxT("Amplitude") ); m_oPnlOffset .bSetName( wxT("DC Offset") ); m_oPnlAmplitude.bSetUnitsType( eUNITS_SCLR ); m_oPnlOffset .bSetUnitsType( eUNITS_VOLT ); // Create the sine wave panel and controls poPnl1 = new wxPanel( this ); m_oPnlSinFreq .bCreate( poPnl1, ID_PNL_SIN_FREQ, 95 ); m_oPnlSinPhase.bCreate( poPnl1, ID_PNL_SIN_PHASE, 95 ); m_oPnlSinFreq .bSetName( wxT("Frequency") ); m_oPnlSinPhase.bSetName( wxT("Initial Phase") ); m_oPnlSinFreq .bSetUnitsType( eUNITS_FREQ ); m_oPnlSinPhase.bSetUnitsType( eUNITS_PHASE ); m_oPnlSinFreq .bSetRange( 0.0, 1000.0 ); m_oPnlSinFreq .bSetUnits( wxT("Hz") ); // Create the pulse panel and controls poPnl1 = new wxPanel( this ); m_oPnlPulInitial.bCreate( poPnl1, ID_PNL_PUL_INITIAL, 95 ); m_oPnlPulMin .bCreate( poPnl1, ID_PNL_PUL_MIN, 95 ); m_oPnlPulMax .bCreate( poPnl1, ID_PNL_PUL_MAX, 95 ); m_oPnlPulDelay .bCreate( poPnl1, ID_PNL_PUL_DELAY, 95 ); m_oPnlPulRise .bCreate( poPnl1, ID_PNL_PUL_RISE, 95 ); m_oPnlPulWidth .bCreate( poPnl1, ID_PNL_PUL_WIDTH, 95 ); m_oPnlPulFall .bCreate( poPnl1, ID_PNL_PUL_FALL, 95 ); m_oPnlPulPeriod .bCreate( poPnl1, ID_PNL_PUL_PERIOD, 95 ); m_oPnlPulInitial.bSetName( wxT("Initial Value") ); m_oPnlPulMin .bSetName( wxT("Min Level") ); m_oPnlPulMax .bSetName( wxT("Max Level") ); m_oPnlPulDelay .bSetName( wxT("Initial Delay") ); m_oPnlPulRise .bSetName( wxT("Rise Time") ); m_oPnlPulWidth .bSetName( wxT("Pulse Width") ); m_oPnlPulFall .bSetName( wxT("Fall Time") ); m_oPnlPulPeriod .bSetName( wxT("Period") ); m_oPnlPulInitial.bSetUnitsType( eUNITS_VOLT ); m_oPnlPulMin .bSetUnitsType( eUNITS_VOLT ); m_oPnlPulMax .bSetUnitsType( eUNITS_VOLT ); m_oPnlPulDelay .bSetUnitsType( eUNITS_TIME ); m_oPnlPulRise .bSetUnitsType( eUNITS_TIME ); m_oPnlPulWidth .bSetUnitsType( eUNITS_TIME ); m_oPnlPulFall .bSetUnitsType( eUNITS_TIME ); m_oPnlPulPeriod .bSetUnitsType( eUNITS_TIME ); // Create the buttons panel and the button controls poPnl1 = new wxPanel( this ); m_oBtnOk .Create( poPnl1, ID_BTN_OK, wxT("OK") ); m_oBtnClear .Create( poPnl1, ID_BTN_CLEAR, wxT("Clear") ); m_oBtnCancel.Create( poPnl1, ID_BTN_CANCEL, wxT("Cancel") ); } //***************************************************************************** // Initialize the tool tips. void DlgGcpCfgGEN::ToolTips( void ) { m_oPnlAmplitude .SetToolTip( wxT("The overall amplitude of the sine wave and the pulse train") ); m_oPnlOffset .SetToolTip( wxT("The DC offset applied to the entire signal") ); m_oPnlSinFreq .SetToolTip( wxT("The frequency of the sine wave generator for a Transient analysis") ); m_oPnlSinPhase .SetToolTip( wxT("The phase of the sine wave at startup") ); m_oPnlPulInitial.SetToolTip( wxT("The initial value of the source") ); m_oPnlPulMin .SetToolTip( wxT("The 'OFF' value for the pulse train") ); m_oPnlPulMax .SetToolTip( wxT("The 'ON' value for the pulse train") ); m_oPnlPulDelay .SetToolTip( wxT("The time until the first pulse") ); m_oPnlPulRise .SetToolTip( wxT("The time taken to go from 0 to the pulsed value") ); m_oPnlPulWidth .SetToolTip( wxT("The width of each pulse") ); m_oPnlPulFall .SetToolTip( wxT("The time taken to go from the pulsed value to 0") ); m_oPnlPulPeriod .SetToolTip( wxT("The period of the pulse train") ); } //***************************************************************************** // Layout the dialog display objects. void DlgGcpCfgGEN::DoLayout( void ) { wxPanel * poPnl; wxBoxSizer * poSzr; wxSizerFlags oFlags; // Create and set the underlying dialog's sizer poSzr = new wxBoxSizer( wxVERTICAL ); SetSizer( poSzr ); // Create and set the sizer for the total panel poPnl = (wxPanel *) m_oPnlAmplitude.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poPnl, wxT(" Overall ") ); poPnl->SetSizer( poSzr ); // Layout the total panel oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxTOP | wxLEFT | wxRIGHT, 10 ); poSzr->Add( &m_oPnlAmplitude, oFlags ); oFlags.Border( wxBOTTOM, 5 ); poSzr->Add( &m_oPnlOffset, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Border( wxTOP | wxLEFT | wxRIGHT, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Create and set the sizer for the sinusoid parameter panel poPnl = (wxPanel *) m_oPnlSinFreq.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poPnl, wxT(" Sinusoid ") ); poPnl->SetSizer( poSzr ); // Layout the sine wave parameter panel oFlags.Border( wxTOP | wxLEFT | wxRIGHT, 10 ); poSzr->Add( &m_oPnlSinFreq, oFlags ); oFlags.Border( wxBOTTOM, 5 ); poSzr->Add( &m_oPnlSinPhase, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Border( wxTOP | wxLEFT | wxRIGHT, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Create and set the sizer for the pulse parameter panel poPnl = (wxPanel *) m_oPnlPulInitial.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poPnl, wxT(" Pulse ") ); poPnl->SetSizer( poSzr ); // Layout the pulse parameter panel oFlags.Border( wxTOP, 10 ); poSzr->Add( &m_oPnlPulInitial, oFlags ); oFlags.Border( wxLEFT | wxRIGHT, 10 ); poSzr->Add( &m_oPnlPulMin, oFlags ); poSzr->Add( &m_oPnlPulMax, oFlags ); poSzr->Add( &m_oPnlPulDelay, oFlags ); poSzr->Add( &m_oPnlPulRise, oFlags ); poSzr->Add( &m_oPnlPulWidth, oFlags ); poSzr->Add( &m_oPnlPulFall, oFlags ); oFlags.Border( wxBOTTOM, 5 ); poSzr->Add( &m_oPnlPulPeriod, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Border( wxALL, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Create and set the sizer for the buttons panel poPnl = (wxPanel *) m_oBtnOk.GetParent( ); poSzr = new wxBoxSizer( wxHORIZONTAL ); poPnl->SetSizer( poSzr ); // Layout the button panel oFlags.Border( wxTOP | wxBOTTOM, 10 ); oFlags.Align( wxALIGN_RIGHT ); poSzr->Add( &m_oBtnOk, oFlags ); poSzr->AddSpacer( 10 ); oFlags.Align( wxALIGN_CENTER ); poSzr->Add( &m_oBtnClear, oFlags ); poSzr->AddSpacer( 10 ); oFlags.Align( wxALIGN_LEFT ); poSzr->Add( &m_oBtnCancel, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxBOTTOM, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Set dialogues minimum size and initial size as calculated by the sizer GetSizer( )->SetSizeHints( this ); } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // roCmdGEN - A reference to a GENERATOR command object void DlgGcpCfgGEN::SetValues( CmdGnuCapGEN & roCmdGEN ) { SetEvtHandlerEnabled( FALSE ); m_oPnlAmplitude .bSetValue( roCmdGEN.m_osAmplitude ); m_oPnlOffset .bSetValue( roCmdGEN.m_osOffset ); m_oPnlSinFreq .bSetValue( roCmdGEN.m_osSinFreq ); m_oPnlSinPhase .bSetValue( roCmdGEN.m_osSinPhase ); m_oPnlPulInitial.bSetValue( roCmdGEN.m_osPulInitial ); m_oPnlPulMin .bSetValue( roCmdGEN.m_osPulMin ); m_oPnlPulMax .bSetValue( roCmdGEN.m_osPulMax ); m_oPnlPulDelay .bSetValue( roCmdGEN.m_osPulDelay ); m_oPnlPulRise .bSetValue( roCmdGEN.m_osPulRise ); m_oPnlPulWidth .bSetValue( roCmdGEN.m_osPulWidth ); m_oPnlPulFall .bSetValue( roCmdGEN.m_osPulFall ); m_oPnlPulPeriod .bSetValue( roCmdGEN.m_osPulPeriod ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // roCmdGEN - A reference to a GENERATOR command object void DlgGcpCfgGEN::GetValues( CmdGnuCapGEN & roCmdGEN ) { SetEvtHandlerEnabled( FALSE ); roCmdGEN.m_osAmplitude = m_oPnlAmplitude .rosGetValue( ); roCmdGEN.m_osOffset = m_oPnlOffset .rosGetValue( ); roCmdGEN.m_osSinFreq = m_oPnlSinFreq .rosGetValue( ); roCmdGEN.m_osSinPhase = m_oPnlSinPhase .rosGetValue( ); roCmdGEN.m_osPulInitial = m_oPnlPulInitial.rosGetValue( ); roCmdGEN.m_osPulMin = m_oPnlPulMin .rosGetValue( ); roCmdGEN.m_osPulMax = m_oPnlPulMax .rosGetValue( ); roCmdGEN.m_osPulDelay = m_oPnlPulDelay .rosGetValue( ); roCmdGEN.m_osPulRise = m_oPnlPulRise .rosGetValue( ); roCmdGEN.m_osPulWidth = m_oPnlPulWidth .rosGetValue( ); roCmdGEN.m_osPulFall = m_oPnlPulFall .rosGetValue( ); roCmdGEN.m_osPulPeriod = m_oPnlPulPeriod .rosGetValue( ); roCmdGEN.bFormat( ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Reset all dialog settings to defaults. // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgGEN::bClear( void ) { m_oCmdGEN.bSetDefaults( ); SetValues( m_oCmdGEN ); return( TRUE ); } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // roCmdGEN - A reference to a GENERATOR command object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgGEN::bSetValues( CmdGnuCapGEN & roCmdGEN ) { SetValues( roCmdGEN ); m_oCmdGEN = roCmdGEN; return( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // roCmdGEN - A reference to a GENERATOR command object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgGcpCfgGEN::bGetValues( CmdGnuCapGEN & roCmdGEN ) { GetValues( roCmdGEN ); return( TRUE ); } //***************************************************************************** // // Event Handlers // //***************************************************************************** // OK button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgGcpCfgGEN::OnBtnOk( wxCommandEvent & roEvtCmd ) { GetValues( m_oCmdGEN ); EndModal( wxID_OK ); } //***************************************************************************** // Clear button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgGcpCfgGEN::OnBtnClear( wxCommandEvent & roEvtCmd ) { CmdGnuCapGEN oCmdGEN; oCmdGEN.bSetDefaults( ); SetValues( oCmdGEN ); } //***************************************************************************** // Cancel button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgGcpCfgGEN::OnBtnCancel( wxCommandEvent & roEvtCmd ) { SetValues( m_oCmdGEN ); EndModal( wxID_CANCEL ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/dialogs/DlgGcpCfgOPT.hpp0000644000000000000000000001714511412210447021363 0ustar rootroot//***************************************************************************** // DlgGcpCfgOPT.hpp * // ------------------ * // Description : This dialogue is used to enter values associated with the * // GNU-Cap OPTIONS command. * // Started : 14/09/2006 * // Last Update : 16/04/2010 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef DLGGCPCFGOPT_HPP #define DLGGCPCFGOPT_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "utility/PnlValue.hpp" #include "gnucap/commands/CmdGnuCapOPT.hpp" // Local Constant Declarations //***************************************************************************** class DlgGcpCfgOPT : public wxDialog { private : // Value panel controls PnlValue m_oPnlABSTOL; // Absolute current error tolerance PnlValue m_oPnlCHGTOL; // Charge tolerance PnlValue m_oPnlDAMPMAX; // Normal Newton damping factor (when all is well) PnlValue m_oPnlDAMPMIN; // Newton damping factor when there's a problem PnlValue m_oPnlDAMPST; // Damping strategy PnlValue m_oPnlDEFAD; // MOS drain diffusion area PnlValue m_oPnlDEFAS; // MOS source diffusion area PnlValue m_oPnlDEFL; // MOS channel length PnlValue m_oPnlDEFW; // MOS channel width PnlValue m_oPnlDTMIN; // Minimum time step PnlValue m_oPnlDTRATIO; // The ratio between minimum and maximum time step PnlValue m_oPnlFLOOR; // Effective zero value PnlValue m_oPnlGMIN; // Minimum allowable conductance PnlValue m_oPnlHARMS; // Harmonics in Fourier analysis PnlValue m_oPnlITL1; // DC iteration limit PnlValue m_oPnlITL2; // DC transfer curve iteration limit PnlValue m_oPnlITL4; // TR analysis timepoint iteration limit PnlValue m_oPnlITL7; // Worst case analysis iteration limit PnlValue m_oPnlITL8; // Convergence diagnostic iteration threshold PnlValue m_oPnlLIMIT; // Internal differential branch voltage limit PnlValue m_oPnlNUMDGT; // No. of digits to print for analysis results PnlValue m_oPnlRELTOL; // Relative error tolerance PnlValue m_oPnlSEED; // Seed used by the random number generator PnlValue m_oPnlSHORT; // Resistance of voltage source or short PnlValue m_oPnlTEMPAMB; // Ambient temp. of circuit PnlValue m_oPnlTNOM; // Nominal temp. at which device parameters measured PnlValue m_oPnlTRANSITS; // Mixed mode transition count PnlValue m_oPnlTRREJECT; // Transient error rejection threshold PnlValue m_oPnlTRSTEPG; // Maximum internal step size growth in transient analysis PnlValue m_oPnlTRSTEPS; // Amount to decrease the transient step size by when convergence fails PnlValue m_oPnlTRTOL; // TR error tolerance PnlValue m_oPnlVFLOOR; // Effective zero value for voltage probes PnlValue m_oPnlVMAX; // Positive node voltage limit PnlValue m_oPnlVMIN; // Negative node voltage limit PnlValue m_oPnlVNTOL; // Abs. voltage error tolerance PnlValue m_oPnlWCZERO; // Worst case zero window wxChoice m_oChoMETHOD; // Numerical integration method wxLabel m_oLblMETHOD; wxChoice m_oChoMODE; // Simulation mode selection wxLabel m_oLblMODE; wxChoice m_oChoORDER; // Equation ordering wxLabel m_oLblORDER; wxCheckBox m_oCbxBYPASS; // Bypass model evaluation if appropriate wxCheckBox m_oCbxCSTRAY; // Include capacitance in device models wxCheckBox m_oCbxINCMODE; // Incrementally update the matrix wxCheckBox m_oCbxLUBYPASS; // Bypass parts of LU decomposition if appropriate wxCheckBox m_oCbxRSTRAY; // Include series resistance in device models wxCheckBox m_oCbxTRACEL; // Use a queue to only load changed elements to the matrix wxCheckBox m_oCbxVBYPASS; // Check only voltage to bypass model evaluation // Button controls wxButton m_oBtnOk; wxButton m_oBtnCancel; wxButton m_oBtnDefaults; // OPTIONS command object CmdGnuCapOPT m_oCmdOPT; // Object initialization functions void Initialize( void ); void Create ( void ); void ToolTips ( void ); void DoLayout ( void ); PnlValue * poGetPanel( int iPnlID ); void SetValues( CmdGnuCapOPT & roCmdOPT ); void GetValues( CmdGnuCapOPT & roCmdOPT ); public : DlgGcpCfgOPT( wxWindow * poWin ); ~DlgGcpCfgOPT( ); bool bClear( void ); bool bSetValues( CmdGnuCapOPT & roCmdOPT ); bool bGetValues( CmdGnuCapOPT & roCmdOPT ); bool bSetValue( int iPnlID, const wxString & rosValue ); const wxString & rosGetValue( int iPnlID ); // Event handlers void OnBtnOk ( wxCommandEvent & roEvtCmd ); void OnBtnDefaults( wxCommandEvent & roEvtCmd ); void OnBtnCancel ( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eDlgItemID { ID_PNL_ABSTOL = 0, ID_PNL_CHGTOL, ID_PNL_DAMPMAX, ID_PNL_DAMPMIN, ID_PNL_DAMPST, ID_PNL_DEFAD, ID_PNL_DEFAS, ID_PNL_DEFL, ID_PNL_DEFW, ID_PNL_DTMIN, ID_PNL_DTRATIO, ID_PNL_FLOOR, ID_PNL_GMIN, ID_PNL_HARMS, ID_PNL_ITL1, ID_PNL_ITL2, ID_PNL_ITL4, ID_PNL_ITL7, ID_PNL_ITL8, ID_PNL_LIMIT, ID_PNL_NUMDGT, ID_PNL_RELTOL, ID_PNL_SEED, ID_PNL_SHORT, ID_PNL_TEMPAMB, ID_PNL_TNOM, ID_PNL_TRANSITS, ID_PNL_TRREJECT, ID_PNL_TRSTEPG, ID_PNL_TRSTEPS, ID_PNL_TRTOL, ID_PNL_VFLOOR, ID_PNL_VMAX, ID_PNL_VMIN, ID_PNL_VNTOL, ID_PNL_WCZERO, ID_CBX_BYPASS, ID_CBX_CSTRAY, ID_CBX_INCMODE, ID_CBX_LUBYPASS, ID_CBX_RSTRAY, ID_CBX_TRACEL, ID_CBX_VBYPASS, ID_CHO_METHOD, ID_CHO_MODE, ID_CHO_ORDER, ID_BTN_OK, ID_BTN_DEFAULTS, ID_BTN_CANCEL, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_PNL_ABSTOL, ID_LST = ID_BTN_CANCEL }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // DLGGCPCFGOPT_HPP gspiceui-1.0.00+dfsg/src/gnucap/dialogs/DlgGcpCfgGEN.hpp0000644000000000000000000001015011412210447021317 0ustar rootroot//***************************************************************************** // DlgGcpCfgGEN.cpp * // ------------------ * // Description : This dialogue is used to enter values associated with a * // GNU-Cap generator command line. It is used for Transient * // and Fourier analysis. * // Started : 27/02/2004 * // Last Update : 30/07/2009 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef DLGGCPCFGGEN_HPP #define DLGGCPCFGGEN_HPP // System Includes #include // wxWidgets Includes #include #include // Application Includes #include "utility/PnlValue.hpp" #include "gnucap/commands/CmdGnuCapGEN.hpp" // Local Constant Declarations //***************************************************************************** class DlgGcpCfgGEN : public wxDialog { private : // Value panel controls for overall source characteristics PnlValue m_oPnlAmplitude; PnlValue m_oPnlOffset; // Value panel controls for a sinusoidal source PnlValue m_oPnlSinFreq; PnlValue m_oPnlSinPhase; // Value panel controls for a pulse source PnlValue m_oPnlPulInitial; PnlValue m_oPnlPulMin; PnlValue m_oPnlPulMax; PnlValue m_oPnlPulDelay; PnlValue m_oPnlPulRise; PnlValue m_oPnlPulWidth; PnlValue m_oPnlPulFall; PnlValue m_oPnlPulPeriod; // Button controls wxButton m_oBtnOk; wxButton m_oBtnClear; wxButton m_oBtnCancel; // Generator command object CmdGnuCapGEN m_oCmdGEN; // Object initialization functions void Initialize( void ); void Create ( void ); void ToolTips ( void ); void DoLayout ( void ); void SetValues( CmdGnuCapGEN & roCmdGEN ); void GetValues( CmdGnuCapGEN & roCmdGEN ); public : DlgGcpCfgGEN( wxWindow * poWin ); ~DlgGcpCfgGEN( ); bool bClear( void ); bool bSetValues( CmdGnuCapGEN & roCmdGEN ); bool bGetValues( CmdGnuCapGEN & roCmdGEN ); // Event handlers void OnBtnOk ( wxCommandEvent & roEvtCmd ); void OnBtnClear ( wxCommandEvent & roEvtCmd ); void OnBtnCancel( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eDlgItemID { ID_PNL_AMPLITUDE = 0, ID_PNL_OFFSET, ID_PNL_SIN_FREQ, ID_PNL_SIN_PHASE, ID_PNL_PUL_INITIAL, ID_PNL_PUL_MIN, ID_PNL_PUL_MAX, ID_PNL_PUL_DELAY, ID_PNL_PUL_RISE, ID_PNL_PUL_WIDTH, ID_PNL_PUL_FALL, ID_PNL_PUL_PERIOD, ID_BTN_OK, ID_BTN_CLEAR, ID_BTN_CANCEL, ID_UNUSED, // Assigned to controls for which events are not used ID_PNL_FST = ID_PNL_AMPLITUDE, ID_PNL_LST = ID_PNL_PUL_PERIOD, ID_FST = ID_PNL_AMPLITUDE, ID_LST = ID_BTN_CANCEL }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // DLGGCPCFGGEN_HPP gspiceui-1.0.00+dfsg/src/gnucap/panels/0000755000000000000000000000000011631147634016351 5ustar rootrootgspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapTR.hpp0000644000000000000000000000546511412210450021151 0ustar rootroot//***************************************************************************** // PnlGnuCapTR.hpp * // ----------------- * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a Transient Analysis * // for GNU-Cap electronic circuit simulator. * // Started : 22/02/2004 * // Last Update : 30/06/2009 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLGNUCAPTR_HPP #define PNLGNUCAPTR_HPP // System Includes #include // wxWidgets Library Includes // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnGnuCap.hpp" #include "gnucap/dialogs/DlgGcpCfgGEN.hpp" // Local Constant Declarations //***************************************************************************** class PnlGnuCapTR : public PnlAnaBase { private : // Generator configuration wxButton m_oBtnSetup; DlgGcpCfgGEN m_oDlgCfgGEN; void Create( void ); public : PnlGnuCapTR( wxWindow * poWin ); ~PnlGnuCapTR( ); bool bClear( void ); bool bLoad( SimnGnuCap & roSimn ); bool bSave( SimnGnuCap & roSimn ); // Event handlers void OnBtnSetup( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum ePnlItemID { ID_BTN_SETUP = PnlAnaBase::ID_LST+1, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_BTN_SETUP, ID_LST = ID_BTN_SETUP }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLGNUCAPTR_HPP gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapDC.hpp0000644000000000000000000000514611540502742021120 0ustar rootroot//***************************************************************************** // PnlGnuCapDC.hpp * // ----------------- * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a DC Analysis for * // GNU-Cap electronic circuit simulator. * // Started : 18/08/2003 * // Last Update : 18/03/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLGNUCAPDC_HPP #define PNLGNUCAPDC_HPP // System Includes // wxWidgets Library Includes // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnGnuCap.hpp" // Local Constant Declarations //***************************************************************************** class PnlGnuCapDC : public PnlAnaBase { private : // Display objects wxLabel m_oLblSrcName; // Functions to create the display objects void CreateSrc( void ); void Create ( void ); void DoLayout( void ); void InitSwpUnits( void ); virtual void InitScale( void ); public : PnlGnuCapDC( wxWindow * poWin ); ~PnlGnuCapDC( ); bool bClear( void ); bool bLoad( SimnGnuCap & roSimn ); bool bSave( SimnGnuCap & roSimn ); // Event handlers void OnScale ( wxCommandEvent & roEvtCmd ); void OnSrcName( wxCommandEvent & roEvtCmd ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLGNUCAPDC_HPP gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapTR.cpp0000644000000000000000000002150511563754617021166 0ustar rootroot//***************************************************************************** // PnlGnuCapTR.cpp * // ----------------- * // Started : 22/02/2004 * // Last Update : 16/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/panels/PnlGnuCapTR.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlGnuCapTR, PnlAnaBase ) EVT_BUTTON( ID_BTN_SETUP, PnlGnuCapTR::OnBtnSetup ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlGnuCapTR::PnlGnuCapTR( wxWindow * poWin ) : PnlAnaBase( poWin ), m_oDlgCfgGEN( poWin ) { bSetSimrEng( eSIMR_GNUCAP ); bSetAnaType( eCMD_TR ); Create( ); // Create the analysis panel bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlGnuCapTR::~PnlGnuCapTR( ) { } //***************************************************************************** // Createe the display objects. void PnlGnuCapTR::Create( void ) { wxStaticBox * poSbxSigSrc; #ifndef LAYOUT_MNGR int ix, iy; // Set the frequency sweep parameter labels m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 167 ); m_oSbxSwpPars.SetLabel( wxT(" Time Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Time") ); m_oPnlStop .bSetName( wxT("Stop Time") ); m_oPnlStep .bSetName( wxT("Step Increment") ); // Set sweep parameter units m_oPnlStart.bSetUnitsType( eUNITS_TIME ); m_oPnlStop .bSetUnitsType( eUNITS_TIME ); m_oPnlStep .bSetUnitsType( eUNITS_TIME ); // Create and add generator controls poSbxSigSrc = new wxStaticBox( this, ID_UNUSED, wxT(" Signal Source "), wxPoint( 6, 175 ), wxSize( 241, 55 ) ); m_oChoSrcName.Create( this, ID_CHO_SRCNAME, wxPoint( 18, 195 ), wxSize( 107, 29 ) ); m_oBtnSetup .Create( this, ID_BTN_SETUP, wxT("Setup ..."), wxPoint( 130, 195 ), wxSize( 105, 29 ) ); poSbxSigSrc->SetOwnFont( FONT_SLANT ); PnlAnaBase::CreateInitC( ); // Create and add the initial conditions controls PnlAnaBase::CreateTemp( ); // Create and add the analysis temp. controls // PnlAnaBase::DoLayout( ); // Layout the panel's GUI objects #ifdef LAYOUT_MNGR SetSwpPnlLbl( wxT(" Time Sweep ") ); #endif // LAYOUT_MNGR } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapTR::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set the default sweep values m_oPnlStart.bSetValue( (float) 0.0 ); m_oPnlStop .bSetValue( (float) 100.0 ); m_oPnlStep .bSetValue( (float) 1.0 ); m_oPnlStart.bSetUnits( wxT("msec") ); m_oPnlStop .bSetUnits( wxT("msec") ); m_oPnlStep .bSetUnits( wxT("msec") ); // Set default initial condition values if( ! bSetInitC( eINITC_WARM ) ) bRtn = FALSE; // Clear the signal generator configuration dialog m_oDlgCfgGEN.bClear( ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - A SimnGnuCap object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapTR::bLoad( SimnGnuCap & roSimn ) { bool bRtn=TRUE; // Load the components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VI") ); // Go no further if the TR command isn't valid if( ! roSimn.m_oCmdTR.bIsValid( ) ) return( FALSE ); // Set the sweep source if( ! PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ) ) bRtn = FALSE; // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdTR.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdTR.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdTR.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); // Set the initial conditions if( roSimn.m_oCmdTR.m_eInitC != eINITC_NONE ) m_oRbxInitC.SetSelection( roSimn.m_oCmdTR.m_eInitC ); // Load the generator setup dialog if( ! m_oDlgCfgGEN.bSetValues( roSimn.m_oCmdGEN ) ) bRtn = FALSE; if( roSimn.eGetAnaType( ) == eCMD_TR ) { // Set the parameters to derive m_oCbxVoltage.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] ); m_oCbxCurrent.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] ); m_oCbxPower .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] ); m_oCbxResist .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] ); } // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdTR.m_osTempC ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimn - A SimnGnuCap object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapTR::bSave( SimnGnuCap & roSimn ) { wxString os1; m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdTR.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdTR.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdTR.m_osStep = m_oPnlStep .rosGetValue( ); // Set the initial conditions roSimn.m_oCmdTR.m_eInitC = (eInitCType) m_oRbxInitC.GetSelection( ); // Set the component to be used as a signal source if( m_oChoSrcName.GetStringSelection( ) != wxT("None") ) { // Get the unmodified signal source component, set it as the signal source os1 = m_oChoSrcName.GetStringSelection( ); (Component &) roSimn.m_oCpntSwpSrc = roSimn.roGetCpnt( os1 ); roSimn.m_oCpntSwpSrc.m_osValue = wxT("GENERATOR(1)"); // Get the GENERATOR command from the Generator Setup dialog m_oDlgCfgGEN.bGetValues( roSimn.m_oCmdGEN ); if( ! roSimn.m_oCmdGEN.bIsValid( ) ) { os1 = wxT("The signal source ") + roSimn.m_oCmdGEN.rosGetErrMsg( ) + wxT(". "); SetErrMsg( os1 ); } } else { roSimn.m_oCpntSwpSrc.bClear( ); roSimn.m_oCmdGEN .bSetDefaults( ); } // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_TR; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Set the analysis temperature roSimn.m_oCmdTR.m_osTempC = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdTR.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdTR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdTR.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Generator component setup button control event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapTR::OnBtnSetup( wxCommandEvent & roEvtCmd ) { m_oDlgCfgGEN.CenterOnParent( ); m_oDlgCfgGEN.ShowModal( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapOP.hpp0000644000000000000000000000467011515133076021153 0ustar rootroot//***************************************************************************** // PnlGnuCapOP.hpp * // ----------------- * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a Operating Point * // Analysis for GNU-Cap electronic circuit simulator. * // Started : 06/11/2003 * // Last Update : 30/06/2009 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLGNUCAPOP_HPP #define PNLGNUCAPOP_HPP // System Includes // wxWidgets Library Includes // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnGnuCap.hpp" // Local Constant Declarations //***************************************************************************** class PnlGnuCapOP : public PnlAnaBase { private : void Create( void ); void DoLayout( void ); virtual void InitScale( void ); public : PnlGnuCapOP( wxWindow * poWin ); ~PnlGnuCapOP( ); bool bClear( void ); bool bLoad( SimnGnuCap & roSimn ); bool bSave( SimnGnuCap & roSimn ); // Event handlers void OnScale ( wxCommandEvent & roEvtCmd ); void OnSrcName( wxCommandEvent & roEvtCmd ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLGNUCAPOP_HPP gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapOP.cpp0000644000000000000000000002135211563754617021157 0ustar rootroot//***************************************************************************** // PnlGnuCapOP.cpp * // ----------------- * // Started : 06/11/2003 * // Last Update : 16/05/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/panels/PnlGnuCapOP.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlGnuCapOP, PnlAnaBase ) EVT_RADIOBOX( ID_RBX_SCALE, PnlGnuCapOP::OnScale ) EVT_CHOICE ( ID_CHO_SRCNAME, PnlGnuCapOP::OnSrcName ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argunebt List: // poWin - A pointer to the parent window PnlGnuCapOP::PnlGnuCapOP( wxWindow * poWin ) : PnlAnaBase( poWin ) { bSetSimrEng( eSIMR_GNUCAP ); bSetAnaType( eCMD_OP ); Create( ); bClear( ); } //***************************************************************************** // Destructor. PnlGnuCapOP::~PnlGnuCapOP( ) { } //***************************************************************************** // Create the display objects. void PnlGnuCapOP::Create( void ) { #ifndef LAYOUT_MNGR int ix, iy; // Set the sweep parameter labels SetSwpPnlLbl( wxT(" Operating Point Sweep ") ); m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 167 ); m_oSbxSwpPars.SetLabel( wxT(" Operating Point Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Temperature") ); m_oPnlStop .bSetName( wxT("Stop Temperature") ); // Set sweep parameter units m_oPnlStart.bSetUnitsType( eUNITS_TEMP ); m_oPnlStop .bSetUnitsType( eUNITS_TEMP ); m_oPnlStep .bSetUnitsType( eUNITS_TEMP ); // Create scale controls but disable the scale option GNU-Cap doesn't support PnlAnaBase::CreateScale( ); m_oRbxScale.Enable( eSCALE_OCT, FALSE ); PnlAnaBase::CreateSrc( ); // Create input source controls PnlAnaBase::DoLayout( ); // Layout the panel's GUI objects #ifdef LAYOUT_MNGR SetSwpPnlLbl( wxT(" Operating Point Sweep ") ); #endif // LAYOUT_MNGR } //***************************************************************************** // Initialize the step scale. void PnlGnuCapOP::InitScale( void ) { switch( m_oRbxScale.GetSelection( ) ) { case eSCALE_LIN : m_oPnlStep.bSetName( wxT("Step Increment") ); m_oPnlStep.bSetVarType( eVAR_FLT ); m_oPnlStep.bSetParms( 1.0, 0.0, 100.0, 1.0, 10.0 ); m_oPnlStep.bShowUnits( TRUE ); break; case eSCALE_LOG : m_oPnlStep.bSetName( wxT("Step Multiplier") ); m_oPnlStep.bSetVarType( eVAR_FLT ); m_oPnlStep.bSetParms( 1.01, 0.0, 100.0, 0.01, 0.1 ); m_oPnlStep.bShowUnits( FALSE ); break; case eSCALE_DEC : m_oPnlStep.bSetName( wxT("Steps / Decade") ); m_oPnlStep.bSetVarType( eVAR_INT ); m_oPnlStep.bSetParms( 10, 1, 1000, 1, 100 ); m_oPnlStep.bShowUnits( FALSE ); break; default : break; } } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapOP::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set the step scale type and default sweep values if( ! bSetScale( eSCALE_LIN ) ) bRtn = FALSE; m_oPnlStep.bSetValue( (float) 1.0 ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - A SimnGnuCap object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapOP::bLoad( SimnGnuCap & roSimn ) { bool bRtn=TRUE; // Load the components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VIRLC") ); // Go no further if the OP command isn't valid if( ! roSimn.m_oCmdOP.bIsValid( ) ) return( FALSE ); // Set the source component if( ! PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ) ) bRtn = FALSE; // Set the step scale (do this before setting the sweep step) if( roSimn.m_oCmdOP.m_eScale != eSCALE_NONE ) m_oRbxScale.SetSelection( roSimn.m_oCmdOP.m_eScale ); // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdOP.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdOP.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdOP.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); if( roSimn.eGetAnaType( ) == eCMD_OP ) { // Set the parameters to derive m_oCbxVoltage.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] ); m_oCbxCurrent.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] ); m_oCbxPower .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] ); m_oCbxResist .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] ); } return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimn - A SimnGnuCap object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapOP::bSave( SimnGnuCap & roSimn ) { m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdOP.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdOP.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdOP.m_osStep = m_oPnlStep .rosGetValue( ); // Set the step scale roSimn.m_oCmdOP.m_eScale = (eScaleType) m_oRbxScale.GetSelection( ); // Modify the component to be used as the sweep source roSimn.m_oCpntSwpSrc.m_osValue = m_oPnlSrcLvl.rosGetValue( ); // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_OP; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Create the command strings roSimn.m_oCmdOP.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdOP.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdOP.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Step scale radio box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapOP::OnScale( wxCommandEvent & roEvtCmd ) { InitScale( ); } //***************************************************************************** // Source component choice box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapOP::OnSrcName( wxCommandEvent & roEvtCmd ) { wxString os1; // Set the units type os1 = m_oChoSrcName.GetStringSelection( ); m_oPnlSrcLvl.bSetUnitsType( Component::eGetUnitsType( os1 ) ); // Set the source value if( m_oChoSrcName.GetStringSelection( ) == wxT("None") ) m_oPnlSrcLvl.bSetValue( (double) 0.0 ); else if( m_oPnlSrcLvl.dfGetValue( ) == 0.0 ) m_oPnlSrcLvl.bSetValue( (double) 1.0 ); // Permit the base class to process this event as well roEvtCmd.Skip( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapFO.cpp0000644000000000000000000002670611563754617021155 0ustar rootroot//***************************************************************************** // PnlGnuCapFO.cpp * // ----------------- * // Started : 26/04/2004 * // Last Update : 16/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/panels/PnlGnuCapFO.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlGnuCapFO, PnlAnaBase ) EVT_BUTTON( ID_BTN_SETUP, PnlGnuCapFO::OnBtnSetup ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlGnuCapFO::PnlGnuCapFO( wxWindow * poWin ) : PnlAnaBase( poWin ), m_oDlgCfgGEN( poWin ) { bSetSimrEng( eSIMR_GNUCAP ); bSetAnaType( eCMD_FO ); Create( ); // Create the analysis panel bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlGnuCapFO::~PnlGnuCapFO( ) { } //***************************************************************************** // Create the display objects. void PnlGnuCapFO::Create( void ) { wxStaticBox * poSbxSigSrc; #ifndef LAYOUT_MNGR int ix, iy; // Set the frequency sweep parameter labels m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 167 ); m_oSbxSwpPars.SetLabel( wxT(" Frequency Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Frequency") ); m_oPnlStop .bSetName( wxT("Stop Frequency") ); m_oPnlStep .bSetName( wxT("Step Increment") ); // Set sweep parameter units m_oPnlStart.bSetUnitsType( eUNITS_FREQ ); m_oPnlStop .bSetUnitsType( eUNITS_FREQ ); m_oPnlStep .bSetUnitsType( eUNITS_FREQ ); // Create and add generator controls poSbxSigSrc = new wxStaticBox( this, ID_UNUSED, wxT(" Signal Source "), wxPoint( 6, 175 ), wxSize( 241, 55 ) ); m_oChoSrcName.Create( this, ID_CHO_SRCNAME, wxPoint( 18, 195 ), wxSize( 107, 29 ) ); m_oBtnSetup .Create( this, ID_BTN_SETUP, wxT("Setup ..."), wxPoint( 130, 195 ), wxSize( 105, 29 ) ); poSbxSigSrc->SetOwnFont( FONT_SLANT ); CreateOutputs( ); // Create and add output parameters PnlAnaBase::CreateInitC( ); // Create and add the initial conditions controls PnlAnaBase::CreateTemp( ); // Create and add the analysis temp. controls // PnlAnaBase::DoLayout( ); // Layout the panel's GUI objects #ifdef LAYOUT_MNGR SetSwpPnlLbl( wxT(" Frequency Sweep ") ); #endif // LAYOUT_MNGR } //***************************************************************************** void PnlGnuCapFO::GetConfig( void ) { wxConfig * poConfig; long li1; // Set the output parameters to be extracted poConfig = (wxConfig *) wxConfig::Get( ); if( poConfig == NULL ) return; poConfig->SetPath( wxT("/GNU-Cap") ); poConfig->Read( wxT("FO_Mag") , &li1, (long) 1 ); m_oCbxMag .SetValue( li1 != 0 ? TRUE : FALSE ); poConfig->Read( wxT("FO_Phase") , &li1, (long) 0 ); m_oCbxPhase .SetValue( li1 != 0 ? TRUE : FALSE ); poConfig->Read( wxT("FO_MagRel"), &li1, (long) 1 ); m_oCbxMagRel.SetValue( li1 != 0 ? TRUE : FALSE ); poConfig->Read( wxT("FO_MagDB") , &li1, (long) 0 ); m_oCbxMagDb .SetValue( li1 != 0 ? TRUE : FALSE ); } //***************************************************************************** void PnlGnuCapFO::SetConfig( void ) { wxConfig * poConfig; poConfig = (wxConfig *) wxConfig::Get( ); if( poConfig == NULL ) return; poConfig->SetPath( wxT("/GNU-Cap") ); poConfig->Write( wxT("FO_Mag") , m_oCbxMag .GetValue( ) ); poConfig->Write( wxT("FO_Phase") , m_oCbxPhase .GetValue( ) ); poConfig->Write( wxT("FO_MagRel"), m_oCbxMagRel.GetValue( ) ); poConfig->Write( wxT("FO_MagDB") , m_oCbxMagDb .GetValue( ) ); } //***************************************************************************** // Create the parameters to included in the results file output. void PnlGnuCapFO::CreateOutputs( void ) { if( bIsCreatedOutputs( ) ) return; // Create and add output parameters m_oSbxOutputs.Create( this, ID_UNUSED, wxT(" Outputs "), wxPoint( 455, 5 ), wxSize( 110, 122 ) ); m_oCbxMag .Create( this, ID_CBX_MAG, wxT("Magnitude"), wxPoint( 461, 24 ) ); m_oCbxPhase .Create( this, ID_CBX_PHASE, wxT("Phase"), wxPoint( 461, 49 ) ); m_oCbxMagDb .Create( this, ID_CBX_MAGDB, wxT("Mag. in dB"), wxPoint( 461, 74 ) ); m_oCbxMagRel .Create( this, ID_CBX_MAGREL, wxT("Mag. is Rel."), wxPoint( 461, 99 ) ); m_oSbxOutputs.SetOwnFont( FONT_SLANT ); } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapFO::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set default sweep values m_oPnlStart.bSetValue( (float) 1.0 ); m_oPnlStop .bSetValue( (float) 100.0 ); m_oPnlStep .bSetValue( (float) 1.0 ); m_oPnlStart.bSetUnits( wxT("kHz") ); m_oPnlStop .bSetUnits( wxT("kHz") ); m_oPnlStep .bSetUnits( wxT("kHz") ); // Set default initial condition values if( ! bSetInitC( eINITC_WARM ) ) bRtn = FALSE; // Clear the signal generator configuration dialog m_oDlgCfgGEN.bClear( ); // Set the output parameter check box default values m_oCbxMag .SetValue( TRUE ); m_oCbxPhase .SetValue( FALSE ); m_oCbxMagDb .SetValue( TRUE ); m_oCbxMagRel.SetValue( FALSE ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - A SimnGnuCap object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapFO::bLoad( SimnGnuCap & roSimn ) { bool bRtn=TRUE; // Load the components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VI") ); // Go no further if the FO command isn't valid if( ! roSimn.m_oCmdFO.bIsValid( ) ) return( FALSE ); // Set the sweep source if( ! PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ) ) bRtn = FALSE; // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdFO.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdFO.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdFO.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); // Set the initial conditions if( roSimn.m_oCmdFO.m_eInitC != eINITC_NONE ) m_oRbxInitC.SetSelection( roSimn.m_oCmdFO.m_eInitC ); // Load the generator setup dialog if( ! m_oDlgCfgGEN.bSetValues( roSimn.m_oCmdGEN ) ) bRtn = FALSE; if( roSimn.eGetAnaType( ) == eCMD_FO ) { // Set the parameters to derive m_oCbxVoltage.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] ); m_oCbxCurrent.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] ); m_oCbxPower .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] ); m_oCbxResist .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] ); // Set the output parameters to be extracted GetConfig( ); } // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdFO.m_osTempC ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimn - A SimnGnuCap object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapFO::bSave( SimnGnuCap & roSimn ) { wxString os1; m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdFO.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdFO.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdFO.m_osStep = m_oPnlStep .rosGetValue( ); // Set the initial conditions roSimn.m_oCmdFO.m_eInitC = (eInitCType) m_oRbxInitC.GetSelection( ); // Set the component to be used as a signal source if( m_oChoSrcName.GetStringSelection( ) != wxT("None") ) { // Get the unmodified signal source component, set it as the signal source os1 = m_oChoSrcName.GetStringSelection( ); (Component &) roSimn.m_oCpntSwpSrc = roSimn.roGetCpnt( os1 ); roSimn.m_oCpntSwpSrc.m_osValue = wxT("GENERATOR(1)"); // Get the GENERATOR command from the Generator Setup dialog m_oDlgCfgGEN.bGetValues( roSimn.m_oCmdGEN ); if( ! roSimn.m_oCmdGEN.bIsValid( ) ) { os1 = wxT("The signal source ") + roSimn.m_oCmdGEN.rosGetErrMsg( ) + wxT(". "); SetErrMsg( os1 ); } } else { roSimn.m_oCpntSwpSrc.bClear( ); roSimn.m_oCmdGEN .bSetDefaults( ); } // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_FO; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Store the output parameters to be extracted if( m_oCbxMag.IsChecked( ) || m_oCbxPhase.IsChecked( ) ) SetConfig( ); else SetErrMsg( wxT("An Outputs value hasn't been specified.") ); // Set the analysis temperature roSimn.m_oCmdFO.m_osTempC = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdFO.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdFO.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdFO.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Generator component setup button control event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapFO::OnBtnSetup( wxCommandEvent & roEvtCmd ) { m_oDlgCfgGEN.CenterOnParent( ); m_oDlgCfgGEN.ShowModal( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapAC.hpp0000644000000000000000000000465611412403734021121 0ustar rootroot//***************************************************************************** // PnlGnuCapAC.hpp * // ----------------- * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a AC Analysis for * // GNU-Cap electronic circuit simulator. * // Started : 18/08/2003 * // Last Update : 30/06/2009 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLGNUCAPAC_HPP #define PNLGNUCAPAC_HPP // System Includes // wxWidgets Library Includes // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnGnuCap.hpp" // Local Constant Declarations //***************************************************************************** class PnlGnuCapAC : public PnlAnaBase { private : void Create( void ); virtual void InitScale( void ); public : PnlGnuCapAC( wxWindow * poWin ); ~PnlGnuCapAC( ); bool bClear( void ); virtual bool bLoad( SimnGnuCap & roSimn ); virtual bool bSave( SimnGnuCap & roSimn ); // Event handlers void OnScale ( wxCommandEvent & roEvtCmd ); void OnSrcName( wxCommandEvent & roEvtCmd ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLGNUCAPAC_HPP gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapAC.cpp0000644000000000000000000002610111631143576021111 0ustar rootroot//***************************************************************************** // PnlGnuCapAC.cpp * // ----------------- * // Started : 18/08/2003 * // Last Update : 16/05/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/panels/PnlGnuCapAC.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlGnuCapAC, PnlAnaBase ) EVT_RADIOBOX( ID_RBX_SCALE, PnlGnuCapAC::OnScale ) EVT_CHOICE ( ID_CHO_SRCNAME, PnlGnuCapAC::OnSrcName ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlGnuCapAC::PnlGnuCapAC( wxWindow * poWin ) : PnlAnaBase( poWin ) { bSetSimrEng( eSIMR_GNUCAP ); bSetAnaType( eCMD_AC ); Create( ); // Create the analysis panel bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlGnuCapAC::~PnlGnuCapAC( ) { } //***************************************************************************** // Create the display objects. void PnlGnuCapAC::Create( void ) { #ifndef LAYOUT_MNGR int ix, iy; // Set the frequency sweep parameter labels m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 167 ); m_oSbxSwpPars.SetLabel( wxT(" AC Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Frequency") ); m_oPnlStop .bSetName( wxT("Stop Frequency") ); // Set sweep parameter units m_oPnlStart.bSetUnitsType( eUNITS_FREQ ); m_oPnlStop .bSetUnitsType( eUNITS_FREQ ); m_oPnlStep .bSetUnitsType( eUNITS_FREQ ); PnlAnaBase::CreateScale( ); // Create the scale controls PnlAnaBase::CreateCpxPrt( ); // Create the parameter complex part check boxes PnlAnaBase::CreateSrc( ); // Create the input source controls PnlAnaBase::CreateTemp( ); // Create the analysis temperature controls PnlAnaBase::DoLayout( ); // Layout the panel's GUI objects #ifdef LAYOUT_MNGR SetSwpPnlLbl( wxT(" AC Sweep ") ); #endif // LAYOUT_MNGR } //***************************************************************************** // Initialize the step scale. void PnlGnuCapAC::InitScale( void ) { switch( m_oRbxScale.GetSelection( ) ) { case eSCALE_LIN : m_oPnlStep.bSetName( wxT("Step Increment") ); m_oPnlStep.bSetVarType( eVAR_FLT ); m_oPnlStep.bSetUnitsType( eUNITS_FREQ ); m_oPnlStep.bShowUnits( TRUE ); break; case eSCALE_LOG : m_oPnlStep.bSetName( wxT("Step Multiplier") ); m_oPnlStep.bSetVarType( eVAR_FLT ); m_oPnlStep.bSetParms( 1.1, 0.01, 10.0, 1.0, 10.0 ); m_oPnlStep.bShowUnits( FALSE ); break; case eSCALE_DEC : m_oPnlStep.bSetName( wxT("Steps / Decade") ); m_oPnlStep.bSetVarType( eVAR_INT ); m_oPnlStep.bSetParms( 10, 1, 10000, 1, 100 ); m_oPnlStep.bShowUnits( FALSE ); break; case eSCALE_OCT : m_oPnlStep.bSetName( wxT("Steps / Octave") ); m_oPnlStep.bSetVarType( eVAR_INT ); m_oPnlStep.bSetParms( 10, 1, 10000, 1, 100 ); m_oPnlStep.bShowUnits( FALSE ); break; default : break; } } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapAC::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set default step scale type and sweep values m_oPnlStart.bSetValue( (float) 1.0 ); m_oPnlStop .bSetValue( (float) 100.0 ); m_oPnlStep .bSetValue( (float) 10.0 ); m_oPnlStep .bShowUnits( TRUE ); m_oPnlStart.bSetUnits( wxT("kHz") ); m_oPnlStop .bSetUnits( wxT("kHz") ); m_oPnlStep .bSetUnits( wxT("kHz") ); // Set default scale value if( ! bSetScale( eSCALE_DEC ) ) bRtn = FALSE; // Set the complex part check box default values m_oCbxMag .SetValue( TRUE ); m_oCbxPhase.SetValue( FALSE ); m_oCbxReal .SetValue( FALSE ); m_oCbxImag .SetValue( FALSE ); m_oCbxMagDb.SetValue( TRUE ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapAC::bLoad( SimnGnuCap & roSimn ) { bool bRtn=TRUE; // Load the components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VI") ); // Go no further if the AC command isn't valid if( ! roSimn.m_oCmdAC.bIsValid( ) ) return( FALSE ); // Set the source component if( ! PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ) ) bRtn = FALSE; // Set the step scale (do this before setting the sweep step) if( roSimn.m_oCmdAC.m_eScale != eSCALE_NONE ) { m_oRbxScale.SetSelection( roSimn.m_oCmdAC.m_eScale ); InitScale( ); } // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdAC.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdAC.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdAC.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); if( roSimn.eGetAnaType( ) == eCMD_AC ) { // Set the parameters to derive m_oCbxVoltage.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] ); m_oCbxCurrent.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] ); m_oCbxPower .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] ); m_oCbxResist .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] ); // Set the complex parts to derive m_oCbxMag .SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAG ] ); m_oCbxPhase.SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_PHASE ] ); m_oCbxReal .SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_REAL ] ); m_oCbxImag .SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_IMAG ] ); m_oCbxMagDb.SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAGDB ] ); } // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdAC.m_osTempC ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapAC::bSave( SimnGnuCap & roSimn ) { wxString os1; size_t sz1; bool b1; m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdAC.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdAC.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdAC.m_osStep = m_oPnlStep .rosGetValue( ); // Set the step scale roSimn.m_oCmdAC.m_eScale = (eScaleType) m_oRbxScale.GetSelection( ); // Set the component to be used as the sweep source if( m_oChoSrcName.GetStringSelection( ) == wxT("None") ) SetErrMsg( wxT("No sweep source component has been selected.") ); else if ( m_oPnlSrcLvl.dfGetValue( ) == 0.0 ) SetErrMsg( wxT("Sweep source component value of zero is not permitted.") ); else { os1 = m_oChoSrcName.GetStringSelection( ); roSimn.m_oCpntSwpSrc = roSimn.NetList::roGetCpnt( os1 ); roSimn.m_oCpntSwpSrc.m_osValue = wxT("GENERATOR(1) AC ") + m_oPnlSrcLvl.rosGetValue( ); } // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_AC; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Store the complex parts of the parameters to derive roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAG ] = m_oCbxMag .GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_PHASE ] = m_oCbxPhase.GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_REAL ] = m_oCbxReal .GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_IMAG ] = m_oCbxImag .GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAGDB ] = m_oCbxMagDb.GetValue( ); // Set the analysis temperature roSimn.m_oCmdAC.m_osTempC = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdAC.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdAC.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdAC.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); for( sz1=eCPX_MAG, b1=FALSE; sz1<=eCPX_IMAG; sz1++ ) if( roSimn.m_oCmdPR.m_bCpxPrts[ sz1 ] ) b1 = TRUE; if( ! b1 ) SetErrMsg( wxT("No complex parts have been selected.") ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Step scale radio box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapAC::OnScale( wxCommandEvent & roEvtCmd ) { InitScale( ); } //***************************************************************************** // Source component choice box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapAC::OnSrcName( wxCommandEvent & roEvtCmd ) { wxString os1; // Set the units type os1 = m_oChoSrcName.GetStringSelection( ); m_oPnlSrcLvl.bSetUnitsType( Component::eGetUnitsType( os1 ) ); // Set the source value if( m_oChoSrcName.GetStringSelection( ) == wxT("None") ) m_oPnlSrcLvl.bSetValue( (double) 0.0 ); else if( m_oPnlSrcLvl.dfGetValue( ) == 0.0 ) m_oPnlSrcLvl.bSetValue( (double) 1.0 ); // Permit the base class to process this event as well roEvtCmd.Skip( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapFO.hpp0000644000000000000000000000644211412210450021124 0ustar rootroot//***************************************************************************** // PnlGnuCapFO.hpp * // ----------------- * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a Fourier Analysis * // for GNU-Cap electronic circuit simulator. * // Started : 26/04/2004 * // Last Update : 03/08/2009 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLGNUCAPFO_HPP #define PNLGNUCAPFO_HPP // System Includes #include // wxWidgets Library Includes #include // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnGnuCap.hpp" #include "gnucap/dialogs/DlgGcpCfgGEN.hpp" // Local Constant Declarations //***************************************************************************** class PnlGnuCapFO : public PnlAnaBase { private : // Output Parameters wxStaticBox m_oSbxOutputs; wxCheckBox m_oCbxMag; wxCheckBox m_oCbxPhase; wxCheckBox m_oCbxMagDb; wxCheckBox m_oCbxMagRel; // Generator configuration wxButton m_oBtnSetup; DlgGcpCfgGEN m_oDlgCfgGEN; void Create( void ); void CreateOutputs( void ); bool bIsCreatedOutputs( void ) { return( m_oSbxOutputs.GetParent( ) != NULL ); } void GetConfig( void ); void SetConfig( void ); public : PnlGnuCapFO( wxWindow * poWin ); ~PnlGnuCapFO( ); bool bClear( void ); bool bLoad( SimnGnuCap & roSimn ); bool bSave( SimnGnuCap & roSimn ); // Event handlers void OnBtnSetup( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum ePnlItemID { ID_BTN_SETUP = PnlAnaBase::ID_LST+1, ID_CBX_MAG, ID_CBX_PHASE, ID_CBX_MAGDB, ID_CBX_MAGREL, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_BTN_SETUP, ID_LST = ID_CBX_MAGREL }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLGNUCAPFO_HPP gspiceui-1.0.00+dfsg/src/gnucap/panels/PnlGnuCapDC.cpp0000644000000000000000000002747311631147634021130 0ustar rootroot//***************************************************************************** // PnlGnuCapDC.cpp * // ----------------- * // Started : 18/08/2003 * // Last Update : 06/09/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "gnucap/panels/PnlGnuCapDC.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlGnuCapDC, PnlAnaBase ) EVT_CHOICE ( ID_CHO_SRCNAME, PnlGnuCapDC::OnSrcName ) EVT_RADIOBOX( ID_RBX_SCALE, PnlGnuCapDC::OnScale ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlGnuCapDC::PnlGnuCapDC( wxWindow * poWin ) : PnlAnaBase( poWin ) { bSetSimrEng( eSIMR_GNUCAP ); bSetAnaType( eCMD_DC ); Create( ); // Create the analysis panel InitSwpUnits( ); // Initialize the sweep units bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlGnuCapDC::~PnlGnuCapDC( ) { } //***************************************************************************** // Create the scale display objects. void PnlGnuCapDC::CreateSrc( void ) { wxPanel * poPnl; // Create the temperature panel and controls #ifdef LAYOUT_MNGR poPnl = new wxPanel( this ); #else poPnl = this; #endif // LAYOUT_MNGR // Create input source #ifdef LAYOUT_MNGR m_oLblSrcName.Create( poPnl, ID_UNUSED, wxT("Signal Source") ); m_oChoSrcName.Create( poPnl, ID_CHO_SRCNAME ); #else new wxLabel( poPnl, ID_UNUSED, wxT("Signal Source"), wxPoint( 18, 176 ) ); m_oChoSrcName.Create( poPnl, ID_CHO_SRCNAME, wxPoint( 144, 171 ), wxSize( 110, 29 ) ); #endif // LAYOUT_MNGR } //***************************************************************************** // Create the display objects. void PnlGnuCapDC::Create( void ) { #ifndef LAYOUT_MNGR int ix, iy; // Set the sweep parameters labels m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 201 ); m_oSbxSwpPars.SetLabel( wxT(" DC Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Value") ); m_oPnlStop .bSetName( wxT("Stop Value") ); // Create scale controls but disable the scale option GNU-Cap doesn't support PnlAnaBase::CreateScale( ); m_oRbxScale.Enable( eSCALE_OCT, FALSE ); PnlAnaBase::CreateTemp( ); // Create the analysis temperature controls PnlAnaBase::DoLayout( ); // Layout the panel's GUI objects CreateSrc( ); // Create input source DoLayout( ); // Local layout tasks #ifdef LAYOUT_MNGR SetSwpPnlLbl( wxT(" DC Sweep ") ); #endif // LAYOUT_MNGR } //***************************************************************************** // Layout the panel display objects. void PnlGnuCapDC::DoLayout( void ) { #ifndef LAYOUT_MNGR return; #endif wxWindow * poWin1; wxWindow * poWin2; wxSizer * poSzr; wxSizerFlags oFlags; if( ! bIsCreated( eCTLGRP_BASE ) ) return; // Create and set the sizer for the signal source panel poWin1 = m_oLblSrcName.GetParent( ); poSzr = new wxBoxSizer( wxHORIZONTAL ); poWin1->SetSizer( poSzr ); // Layout the signal source panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL, 3 ); poSzr->Add( &m_oLblSrcName, oFlags ); poSzr->Add( &m_oChoSrcName, oFlags ); // Create and set the sizer for the signal source panel poWin2 = m_oPnlStart.GetParent( ); poSzr = poWin2->GetSizer( ); // Add the control to the sweep panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL & ~wxBOTTOM, 3 ); poSzr->Add( poWin1, oFlags ); } //***************************************************************************** // Initialize the sweep parameter units. void PnlGnuCapDC::InitSwpUnits( void ) { wxString os1; eUnitsType eUnits; // Determine the sweep parameter units os1 = m_oChoSrcName.GetStringSelection( ); eUnits = Component::eGetUnitsType( os1 ); switch( eUnits ) { case eUNITS_VOLT : // Units of voltage os1 = wxT("Voltage"); break; case eUNITS_CURR : // Units of current os1 = wxT("Current"); break; case eUNITS_CAP : // Units of capacitance os1 = wxT("Capacitance"); break; case eUNITS_IND : // Units of inductance os1 = wxT("Inductance"); break; case eUNITS_RES : // Units of resistance os1 = wxT("Resistance"); break; default : // No units os1 = wxT("Value"); } // Set the sweep parameter units m_oPnlStart.bSetName( wxString( wxT("Start ") ) + os1 ); m_oPnlStop .bSetName( wxString( wxT("Stop ") ) + os1 ); m_oPnlStart.bSetUnitsType( eUnits ); m_oPnlStop .bSetUnitsType( eUnits ); m_oPnlStep .bSetUnitsType( eUnits ); } //***************************************************************************** // Initialize the step scale. void PnlGnuCapDC::InitScale( void ) { switch( m_oRbxScale.GetSelection( ) ) { case eSCALE_LIN : // Increment the step value by adding constant value m_oPnlStep.bSetName( wxT("Step Increment") ); m_oPnlStep.bSetVarType( eVAR_FLT ); m_oPnlStep.bSetParms( 10.0, 0.0, 1000.0, 0.01, 100.0 ); m_oPnlStep.bShowUnits( TRUE ); break; case eSCALE_LOG : // Increase the step by a constant multiplier m_oPnlStep.bSetName( wxT("Step Multiplier") ); m_oPnlStep.bSetVarType( eVAR_FLT ); m_oPnlStep.bSetParms( 1.1, 0.0, 100.0, 0.01, 10.0 ); m_oPnlStep.bShowUnits( FALSE ); break; case eSCALE_DEC : // Specify a fixed number of steps per decade m_oPnlStep.bSetName( wxT("Steps / Decade") ); m_oPnlStep.bSetVarType( eVAR_INT ); m_oPnlStep.bSetParms( 10, 1, 1000, 1, 100 ); m_oPnlStep.bShowUnits( FALSE ); break; default : break; } } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapDC::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set default step scale type and sweep values if( ! bSetScale( eSCALE_LIN ) ) bRtn = FALSE; m_oPnlStart.bSetValue( (float) 0.0 ); m_oPnlStop .bSetValue( (float) 100.0 ); m_oPnlStep .bSetValue( (float) 10.0 ); // Set input source default values m_oChoSrcName.Clear( ); m_oChoSrcName.Append( wxT("None") ); m_oChoSrcName.SetSelection( 0 ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapDC::bLoad( SimnGnuCap & roSimn ) { bool bRtn=TRUE; // Load the components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VIRLC") ); // Go no further if the DC command isn't valid if( ! roSimn.m_oCmdDC.bIsValid( ) ) return( FALSE ); // Set the source component label if( m_oChoSrcName.SetStringSelection( roSimn.m_oCmdDC.m_osSource ) ) InitSwpUnits( ); else bRtn = FALSE; // Set the step scale (do this before setting the sweep step) if( roSimn.m_oCmdDC.m_eScale != eSCALE_NONE ) { m_oRbxScale.SetSelection( roSimn.m_oCmdDC.m_eScale ); InitScale( ); } // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdDC.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdDC.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdDC.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); if( roSimn.eGetAnaType( ) == eCMD_DC ) { // Set the parameters to derive m_oCbxVoltage.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] ); m_oCbxCurrent.SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] ); m_oCbxPower .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] ); m_oCbxResist .SetValue( roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] ); } // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdDC.m_osTempC ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlGnuCapDC::bSave( SimnGnuCap & roSimn ) { m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdDC.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdDC.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdDC.m_osStep = m_oPnlStep .rosGetValue( ); // Set the step scale roSimn.m_oCmdDC.m_eScale = (eScaleType) m_oRbxScale.GetSelection( ); // Set the sweep source (a sweep source is not compulsary for a DC analysis) roSimn.m_oCmdDC.m_osSource = wxT(""); if( m_oChoSrcName.GetStringSelection( ) != wxT("None") ) roSimn.m_oCmdDC.m_osSource = m_oChoSrcName.GetStringSelection( ); // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_DC; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Set the analysis temperature roSimn.m_oCmdDC.m_osTempC = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdDC.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdDC.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdDC.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Step scale radio box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapDC::OnScale( wxCommandEvent & roEvtCmd ) { InitScale( ); } //***************************************************************************** // Source component choice box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlGnuCapDC::OnSrcName( wxCommandEvent & roEvtCmd ) { InitSwpUnits( ); // Permit the base class to process this event as well roEvtCmd.Skip( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/0000755000000000000000000000000011631255501015233 5ustar rootrootgspiceui-1.0.00+dfsg/src/ngspice/NbkNgSpice.hpp0000644000000000000000000000575211630767667017764 0ustar rootroot//***************************************************************************** // NbkNgSpice.hpp * // ---------------- * // Description : Provides a container class for the analysis configuration * // panels for the different analyses provided by NG-Spice * // electronic circuit simulator. * // Started : 08/05/2004 * // Last Update : 23/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef NBKNGSPICE_HPP #define NBKNGSPICE_HPP // System Includes // wxWidgets Includes #include // Application Includes #include "TypeDefs.hpp" #include "base/NbkSimrBase.hpp" #include "ngspice/dialogs/DlgNgsCfgOPT.hpp" #include "ngspice/panels/PnlNgSpiceDC.hpp" #include "ngspice/panels/PnlNgSpiceAC.hpp" #include "ngspice/panels/PnlNgSpiceTR.hpp" // Local Constant Declarations //***************************************************************************** class NbkNgSpice : public NbkSimrBase { private : // Analysis pages PnlNgSpiceDC * m_poPnlNgSpiceDC; PnlNgSpiceAC * m_poPnlNgSpiceAC; PnlNgSpiceTR * m_poPnlNgSpiceTR; // OPTIONS line setup dialog DlgNgsCfgOPT m_oDlgCfgOPT; public : NbkNgSpice( wxWindow * poParent, wxWindowID oWinID ); ~NbkNgSpice( ); virtual bool bClear( void ); virtual bool bLoad( const SimnBase & roSimn ); virtual bool bSave( SimnBase & roSimn ); virtual bool bSetPage( const wxChar * psAnalysis ); virtual bool bSetPage( eCmdType eAnalysis ); virtual const wxString & rosGetPage( void ); virtual eCmdType eGetPage( void ); // Event handlers void OnPageChangd( wxNotebookEvent & roEvtNbk ); void OnBtnOptions( wxCommandEvent & roEvtCmd ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // NBKNGSPICE_HPP gspiceui-1.0.00+dfsg/src/ngspice/NbkNgSpice.cpp0000644000000000000000000002505411631255501017730 0ustar rootroot//***************************************************************************** // NbkNgSpice.cpp * // ---------------- * // Started : 08/05/2004 * // Last Update : 06/09/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/NbkNgSpice.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( NbkNgSpice, NbkSimrBase ) EVT_NOTEBOOK_PAGE_CHANGED( -1, NbkNgSpice::OnPageChangd ) EVT_BUTTON( PnlAnaBase::ID_BTN_OPTIONS, NbkNgSpice::OnBtnOptions ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Arguments : // poParent - The parent window // oWinID - The display object ID // roPosn - The notebook position // roSize - The notebook size NbkNgSpice::NbkNgSpice( wxWindow * poParent, wxWindowID oWinID ) : NbkSimrBase( poParent, oWinID ), m_oDlgCfgOPT( poParent ) { // Set the simulator engine type specifier m_eSimEng = eSIMR_NGSPICE; // Create the various display objects m_poPnlNgSpiceDC = new PnlNgSpiceDC( this ); m_poPnlNgSpiceAC = new PnlNgSpiceAC( this ); m_poPnlNgSpiceTR = new PnlNgSpiceTR( this ); // Add the display objects to the note book AddPage( m_poPnlNgSpiceDC, wxT( " DC " ) ); AddPage( m_poPnlNgSpiceAC, wxT( " AC " ) ); AddPage( m_poPnlNgSpiceTR, wxT( " Transient " ) ); // Specify the default page to be displayed SetSelection( 0 ); } //***************************************************************************** // Destructor. NbkNgSpice::~NbkNgSpice( ) { } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool NbkNgSpice::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! NbkSimrBase ::bClear( ) ) bRtn = FALSE; if( ! m_poPnlNgSpiceDC->bClear( ) ) bRtn = FALSE; if( ! m_poPnlNgSpiceAC->bClear( ) ) bRtn = FALSE; if( ! m_poPnlNgSpiceTR->bClear( ) ) bRtn = FALSE; if( ! m_oDlgCfgOPT .bClear( ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - The simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool NbkNgSpice::bLoad( const SimnBase & roSimn ) { bool bRtn=TRUE; if( roSimn.eGetSimEng( ) != eSIMR_NGSPICE ) return( FALSE ); PnlAnaBase::m_oCpntSwpSrcs = roSimn.m_oCpntSwpSrc; SimnNgSpice & roSimnNgs = (SimnNgSpice &) roSimn; if( ! bSetPage( roSimnNgs.eGetAnaType( ) ) ) bRtn = FALSE; if( ! m_poPnlNgSpiceDC->bLoad( roSimnNgs ) ) bRtn = FALSE; if( ! m_poPnlNgSpiceAC->bLoad( roSimnNgs ) ) bRtn = FALSE; if( ! m_poPnlNgSpiceTR->bLoad( roSimnNgs ) ) bRtn = FALSE; if( ! m_oDlgCfgOPT.bSetValues( roSimnNgs.m_oCmdOPT ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimultn - The simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool NbkNgSpice::bSave( SimnBase & roSimn ) { wxString os1; // Only proceed if this is an NG-Spice simulation object if( roSimn.eGetSimEng( ) != eSIMR_NGSPICE ) return( FALSE ); SimnNgSpice & roSimnNgs = (SimnNgSpice &) roSimn; // Clear the error string NbkSimrBase::m_osErrMsg.Empty( ); // Create the analysis command/s switch( GetSelection( ) ) { case 0 : // DC analysis if( ! m_poPnlNgSpiceDC->bSave( roSimnNgs ) ) SetErrMsg( m_poPnlNgSpiceDC->rosGetErrMsg( ) ); break; case 1 : // AC analysis if( ! m_poPnlNgSpiceAC->bSave( roSimnNgs ) ) SetErrMsg( m_poPnlNgSpiceAC->rosGetErrMsg( ) ); break; case 2 : // TR analysis if( ! m_poPnlNgSpiceTR->bSave( roSimnNgs ) ) SetErrMsg( m_poPnlNgSpiceTR->rosGetErrMsg( ) ); break; default : return( FALSE ); } if( ! bIsOk( ) ) return( FALSE ); // Create the OPTIONS command os1 = roSimnNgs.m_oCmdOPT.m_osTEMP; m_oDlgCfgOPT.bGetValues( roSimnNgs.m_oCmdOPT ); roSimnNgs.m_oCmdOPT.m_osTEMP = os1; roSimnNgs.m_oCmdOPT.bSetWidth( roSimnNgs.m_oCmdPR.iGetParaCnt( ) ); roSimnNgs.m_oCmdOPT.bFormat( ); if( ! roSimnNgs.m_oCmdOPT.bIsValid( ) ) { os1 = wxT("OPTIONS command fault :\n\n "); SetErrMsg( os1 + roSimnNgs.m_oCmdOPT.rosGetErrMsg( ) ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Set the page to be displayed. // // Argument List : // eAnalysis - The enumerated analysis type specifier // // Return Values : // TRUE - Success // FALSE - Failure bool NbkNgSpice::bSetPage( eCmdType eAnalysis ) { int iPage; switch( eAnalysis ) { case eCMD_OP : case eCMD_DC : iPage = 0; break; case eCMD_AC : iPage = 1; break; case eCMD_TR : iPage = 2; break; default : return( FALSE ); } SetSelection( iPage ); // Specify the page to be displayed return( TRUE ); } //***************************************************************************** // Set the page to be displayed. // // Argument List : // psAnalysis - The two letter analysis type specifier (case ignored) // // Return Values : // TRUE - Success // FALSE - Failure bool NbkNgSpice::bSetPage( const wxChar * psAnalysis ) { eCmdType eAnalysis=eCMD_NONE; wxString osAnalysis; osAnalysis = wxString( psAnalysis ).Upper( ); if( osAnalysis.Length( ) == 2 ) { if( osAnalysis == wxT("OP") ) eAnalysis = eCMD_DC; else if( osAnalysis == wxT("DC") ) eAnalysis = eCMD_DC; else if( osAnalysis == wxT("AC") ) eAnalysis = eCMD_AC; else if( osAnalysis == wxT("TR") ) eAnalysis = eCMD_TR; } return( bSetPage( eAnalysis ) ); } //***************************************************************************** // Get the two letter page specifier. // // Return Values : // Success - The two letter analysis type specifier (lower case) // Failure - An empty string const wxString & NbkNgSpice::rosGetPage( void ) { static wxString osPage; switch( eGetPage( ) ) { case eCMD_DC : osPage = wxT("dc"); break; case eCMD_AC : osPage = wxT("ac"); break; case eCMD_TR : osPage = wxT("tr"); break; default : osPage.Empty( ); } return( osPage ); } //***************************************************************************** // Get the enumerated page specifier. // // Return Values : // Success - The enumerated analysis specifier // Failure - eCMD_NONE eCmdType NbkNgSpice::eGetPage( void ) { eCmdType ePage; switch( GetSelection( ) ) { case 0 : ePage = eCMD_DC; break; case 1 : ePage = eCMD_AC; break; case 2 : ePage = eCMD_TR; break; default : ePage = eCMD_NONE; } return( ePage ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // This event is generated when a notebook page has just changed. // // Argument List: // roEvtNbk - An object holding information about the event void NbkNgSpice::OnPageChangd( wxNotebookEvent & roEvtNbk ) { PnlAnaBase * poPnlAna; wxString os1; int i1; // Transfer the ambient temperature from the previous page to OPTIONS dialog i1 = roEvtNbk.GetOldSelection( ); if( i1 != -1 ) { poPnlAna = (PnlAnaBase *) GetPage( (size_t) i1 ); if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) ) { os1 = poPnlAna->m_oPnlTemp.rosGetValue( ); m_oDlgCfgOPT.bSetValue( DlgNgsCfgOPT::ID_PNL_TEMP, os1 ); } } // Transfer the ambient temperature from the OPTIONS dialog to current page poPnlAna = (PnlAnaBase *) GetCurrentPage( ); if( poPnlAna != NULL ) { if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) ) { os1 = m_oDlgCfgOPT.rosGetValue( DlgNgsCfgOPT::ID_PNL_TEMP ); poPnlAna->m_oPnlTemp.bSetValue( os1 ); } } // Allow additional event handlers to be called roEvtNbk.Skip( ); } //***************************************************************************** // Setup .OPTIONS command button event handler. // // Argument List : // roEvtCmd - An object holding information about the event void NbkNgSpice::OnBtnOptions( wxCommandEvent & roEvtCmd ) { PnlAnaBase * poPnlAna; wxString os1; int i1; // Get a pointer to the currently displayed analysis page poPnlAna = (PnlAnaBase *) GetCurrentPage( ); if( poPnlAna == NULL ) return; // Set the temperature in the OPTIONS dialog if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) ) { os1 = poPnlAna->m_oPnlTemp.rosGetValue( ); m_oDlgCfgOPT.bSetValue( DlgNgsCfgOPT::ID_PNL_TEMP, os1 ); } // Display the OPTIONS dialog m_oDlgCfgOPT.CenterOnParent( ); i1 = m_oDlgCfgOPT.ShowModal( ); // Set the temperature in the current analysis panel if( poPnlAna->bIsCreated( PnlAnaBase::eCTLGRP_TEMP ) && i1==wxID_OK ) { os1 = m_oDlgCfgOPT.rosGetValue( DlgNgsCfgOPT::ID_PNL_TEMP ); poPnlAna->m_oPnlTemp.bSetValue( os1 ); } } //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/commands/0000755000000000000000000000000011627430652017043 5ustar rootrootgspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpicePR.cpp0000644000000000000000000004077711627430652022004 0ustar rootroot//*************************************"*************************************** // CmdNgSpicePR.cpp * // ------------------ * // Started : 16/10/2007 * // Last Update : 12/08/2011 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/commands/CmdNgSpicePR.hpp" //***************************************************************************** // Constructor. CmdNgSpicePR::CmdNgSpicePR( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdNgSpicePR::~CmdNgSpicePR( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpicePR::bValidate( void ) { CmdBase::bValidate( ); if( m_osaNodes.GetCount( )<=0 && m_osaCpnts.GetCount( )<=0 ) SetErrMsg( wxT("No components or nodes have been selected.") ); if( ! m_bParmtrs[ ePAR_VLT ] ) SetErrMsg( wxT("No parameters selected.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpicePR::bSetDefaults( void ) { int i1; CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_NGSPICE; m_eCmdType = eCMD_PR; m_eAnaType = eCMD_NONE; m_osaNodes.Empty( ); m_osaCpnts.Empty( ); for( i1=(int)ePAR_FST; i1<=(int)ePAR_LST; i1++ ) m_bParmtrs[ i1 ] = FALSE; for( i1=(int)eCPX_FST; i1<=(int)eCPX_LST; i1++ ) m_bCpxPrts[ i1 ] = FALSE; return( TRUE ); } //***************************************************************************** // Set the analysis type. // // Argument List : // eAnaType - An analysis command type // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpicePR::bSetAnaType( eCmdType eAnaType ) { // Does anything actually need to be done? if( eAnaType == m_eAnaType ) return( TRUE ); // Check that the desired analysis type is supported switch( eAnaType ) { case eCMD_OP : eAnaType = eCMD_DC; case eCMD_DC : case eCMD_AC : case eCMD_TR : break; default : return( FALSE ); } m_eAnaType = eAnaType; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .PRINT AC VM(6,0) 0-VM(5) VM(1,7) VM(2) VP(6,0) 0-VP(5) VP(1,7) VP(2) // .PRINT AC VDB(4) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpicePR::bParse( void ) { wxStringTokenizer ostk1; wxString os1, os2; int i1, i2; // Clear the object attributes os1 = *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) < 3 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".PR") ) return( bValidate( ) ); // Extract the analysis type os1 = ostk1.GetNextToken( ); if( os1 == wxT("DC") ) m_eAnaType = eCMD_DC; else if( os1 == wxT("AC") ) m_eAnaType = eCMD_AC; else if( os1 == wxT("TRAN") ) m_eAnaType = eCMD_TR; else return( bValidate( ) ); // Standardize the argument list format; there are 3 possible formats // eg. V(n), V(n,m) or 0-V(n), reformat the latter to : V(0,n). os2.Empty( ); while( ostk1.HasMoreTokens( ) ) { os1 = ostk1.GetNextToken( ); if( os1.Length( ) < 4 ) return( bValidate( ) ); if( os1.StartsWith( wxT("0-") ) ) { i1 = os1.Index( wxT('(') ); i2 = os1.Index( wxT(')') ); if( i1!=-1 && i2!=-1 && i2>(i1+1) ) os1 = os1.Mid( 2, (size_t) i1-1 ) + wxT("0,") + os1.Mid( (size_t) i1+1 ); } os2 << os1 << wxT(' '); } ostk1.SetString( os2 ); // Extract the parameters to derive, any complex parts and the test component // and/or test node labels while( ostk1.HasMoreTokens( ) ) { // Extract the next field os1 = ostk1.GetNextToken( ); // Extract the parameter specifiers switch( (char) os1.GetChar( 0 ) ) { case wxT('V') : m_bParmtrs[ ePAR_VLT ] = TRUE; break; case wxT('I') : m_bParmtrs[ ePAR_CUR ] = TRUE; break; case wxT('P') : m_bParmtrs[ ePAR_PWR ] = TRUE; break; case wxT('R') : m_bParmtrs[ ePAR_RES ] = TRUE; break; default : return( bValidate( ) ); } // Extract the complex parts if the analysis type is AC if( m_eAnaType == eCMD_AC ) { switch( (char) os1.GetChar( 1 ) ) { case wxT('M') : m_bCpxPrts[ eCPX_MAG ] = TRUE; break; case wxT('P') : m_bCpxPrts[ eCPX_PHASE ] = TRUE; break; case wxT('R') : m_bCpxPrts[ eCPX_REAL ] = TRUE; break; case wxT('I') : m_bCpxPrts[ eCPX_IMAG ] = TRUE; break; case wxT('D') : if( os1.Mid( 1, 2 ).Upper( ) == wxT("DB") ) { m_bCpxPrts[ eCPX_MAG ] = TRUE; m_bCpxPrts[ eCPX_MAGDB ] = TRUE; break; } default : return( bValidate( ) ); } } // Extract the node and component label/s, there are 2 possible formats // eg. V(n) or V(n,m,...), the first denotes a node and the second a // component. i1 = os1.Index( wxT('(') ); i2 = os1.Index( wxT(')') ); if( i1!=-1 && i2!=-1 && i2>(i1+1) ) { os1 = os1.Mid( (size_t) i1+1, (size_t) i2-i1-1 ); if( os1.Find( wxT(',') ) == wxNOT_FOUND ) { // This is a node, add it to the list if it's not already there if( m_osaNodes.Index( os1 ) == wxNOT_FOUND ) m_osaNodes.Add( os1 ); } else { // This is a component, add it to the list if it's not already there if( m_osaCpnts.Index( os1 ) == wxNOT_FOUND ) m_osaCpnts.Add( os1 ); } } else return( bValidate( ) ); } return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Eg.s : .PRINT AC VM(6,0) 0-VM(5) VM(1,7) VM(2) VP(6,0) 0-VP(5) VP(1,7) VP(2) // .PRINT AC VDB(4) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpicePR::bFormat( void ) { wxString osCmd, osParm, osCpxPrt, os1; wxStringTokenizer ostk1; int i1, i2, i3; // Set the command name osCmd = wxT(".PRINT "); // Append the analysis type switch( m_eAnaType ) { case eCMD_DC : osCmd << wxT("DC"); break; case eCMD_AC : osCmd << wxT("AC"); break; case eCMD_TR : osCmd << wxT("TRAN"); break; default : break; } // Sequence through the various parameter types for( i1=ePAR_FST; i1<=ePAR_LST; i1++ ) { if( ! m_bParmtrs[ i1 ] ) continue; switch( (eParType) i1 ) { case ePAR_VLT : osParm = wxT('V'); break; case ePAR_CUR : osParm = wxT('I'); break; case ePAR_PWR : osParm = wxT('P'); break; case ePAR_RES : osParm = wxT('R'); break; default : break; } if( m_eAnaType != eCMD_AC ) { // Sequence through all the components and nodes for( i3=0; i3<(int)m_osaCpnts.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << wxT('(') << m_osaCpnts.Item( i3 ) << wxT(')'); for( i3=0; i3<(int)m_osaNodes.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << wxT('(') << m_osaNodes.Item( i3 ) << wxT(')'); } else { // Sequence through the various complex parts for( i2=eCPX_FST; i2<=eCPX_LST-1; i2++ ) { if( ! m_bCpxPrts[ i2 ] ) continue; switch( (eCpxType) i2 ) { case eCPX_MAG : osCpxPrt = ( m_bCpxPrts[ eCPX_MAGDB ] ? wxT("DB") : wxT("M") ); break; case eCPX_PHASE : osCpxPrt = wxT('P'); break; case eCPX_REAL : osCpxPrt = wxT('R'); break; case eCPX_IMAG : osCpxPrt = wxT('I'); break; default : break; } // Sequence throught all the components and nodes for( i3=0; i3<(int)m_osaCpnts.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << osCpxPrt << wxT('(') << m_osaCpnts.Item( i3 ) << wxT(')'); for( i3=0; i3<(int)m_osaNodes.GetCount( ); i3++ ) osCmd << wxT(' ') << osParm << osCpxPrt << wxT('(') << m_osaNodes.Item( i3 ) << wxT(')'); } } } // Modify the argument list slightly; reformat V(0,n) to 0-V(n) otherwise // NG-Spice will barf. ostk1.SetString( osCmd ); osCmd.Empty( ); while( ostk1.HasMoreTokens( ) ) { os1 = ostk1.GetNextToken( ); if( ( i1=os1.Find( wxT("(0,") ) ) != wxNOT_FOUND ) { os1.Remove( (size_t) i1+1, 2 ); os1.Prepend( wxT("0-") ); } if( ! osCmd.IsEmpty( ) ) osCmd << wxT(' '); osCmd << os1; } assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Get the total number of parameters to derive. // // Return Values : // The number of parameters to derive int CmdNgSpicePR::iGetParaCnt( void ) { int i1, i2, i3; i1 = m_osaNodes.GetCount( ) + m_osaCpnts.GetCount( ); for( i2=0, i3=(int)ePAR_FST; i3<=(int)ePAR_LST; i3++ ) if( m_bParmtrs[ i3 ] ) i2++; if( m_eAnaType == eCMD_AC ) { for( i3=(int)eCPX_FST; i3<=(int)eCPX_LST-1; i3++ ) if( m_bCpxPrts[ i3 ] ) i2++; } return( i1 * ( i2 - 1 ) ); } //***************************************************************************** // Copy the contents of another CmdNgSpicePR object. // // Argument List : // roCmdPR - A reference to a CmdNgSpicePR object // // Return Values : // A reference to this object CmdNgSpicePR & CmdNgSpicePR::operator = ( const CmdNgSpicePR & roCmdPR ) { int i1; (CmdBase &) *this = (CmdBase &) roCmdPR; bSetAnaType( roCmdPR.m_eAnaType ); m_osaNodes = roCmdPR.m_osaNodes; m_osaCpnts = roCmdPR.m_osaCpnts; for( i1=(int)ePAR_FST; i1<=(int)ePAR_LST; i1++ ) m_bParmtrs[ i1 ] = roCmdPR.m_bParmtrs[ i1 ]; for( i1=(int)eCPX_FST; i1<=(int)eCPX_LST; i1++ ) m_bCpxPrts[ i1 ] = roCmdPR.m_bCpxPrts[ i1 ]; bFormat( ); return( *this ); } //***************************************************************************** // Copy the contents of a CmdGnuCapPR object. // // Argument List : // roCmdPR - A reference to a CmdGnuCapPR object // // Return Values : // A reference to this object CmdNgSpicePR & CmdNgSpicePR::operator = ( const CmdGnuCapPR & roCmdPR ) { int i1; (CmdBase &) *this = (CmdBase &) roCmdPR; bSetAnaType( roCmdPR.m_eAnaType ); m_osaNodes = roCmdPR.m_osaNodes; m_osaCpnts = roCmdPR.m_osaCpnts; for( i1=(int)ePAR_FST; i1<=(int)ePAR_LST; i1++ ) m_bParmtrs[ i1 ] = roCmdPR.m_bParmtrs[ i1 ]; for( i1=(int)eCPX_FST; i1<=(int)eCPX_LST; i1++ ) m_bCpxPrts[ i1 ] = roCmdPR.m_bCpxPrts[ i1 ]; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdNgSpicePR::Print( const wxString & rosPrefix ) { int i1; size_t sz1; CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_eAnaType : "; switch( m_eAnaType ) { case eCMD_OP : cout << "eCMD_OP"; break; // Operating point analysis case eCMD_DC : cout << "eCMD_DC"; break; // DC analysis case eCMD_AC : cout << "eCMD_AC"; break; // AC analysis case eCMD_TR : cout << "eCMD_TR"; break; // Transient analysis case eCMD_FO : cout << "eCMD_FO"; break; // Fourier analysis case eCMD_DI : cout << "eCMD_DI"; break; // Distortion analysis case eCMD_NO : cout << "eCMD_NO"; break; // Noise analysis case eCMD_PZ : cout << "eCMD_PZ"; break; // Pole-zero analysis case eCMD_SE : cout << "eCMD_SE"; break; // Sensitivity analysis case eCMD_TF : cout << "eCMD_TF"; break; // Transfer function analysis case eCMD_NONE : cout << "eCMD_NONE"; break; // Analysis type not set default : cout << "Invalid"; break; } cout << '\n'; cout << rosPrefix.mb_str( ) << "m_osaCpnts[ n ] :"; for( sz1=0; sz1 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdNgSpicePR Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a NG-SPICE PRINT command object CmdNgSpicePR oCmd_PR; // Use the following command example to check the formatter and the parser : osCmd = wxT(".PRINT AC VM(6,0) 0-VM(5) VM(1,7) VM(2) VP(6,0) 0-VP(5) VP(1,7) VP(2)"); // Set things up for a formatter test oCmd_PR.m_eAnaType = eCMD_AC; oCmd_PR.m_osaCpnts.Add( wxT("6,0") ); oCmd_PR.m_osaCpnts.Add( wxT("0,5") ); oCmd_PR.m_osaCpnts.Add( wxT("1,7") ); oCmd_PR.m_osaNodes.Add( wxT("2") ); oCmd_PR.m_bParmtrs[ ePAR_VLT ] = TRUE; oCmd_PR.m_bCpxPrts[ eCPX_MAG ] = TRUE; oCmd_PR.m_bCpxPrts[ eCPX_PHASE ] = TRUE; cout << "\nRun Formatter : " << ( oCmd_PR.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_PR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmdPR Contents : " << oCmd_PR.mb_str( ) << '\n'; // Set things up for a parser test oCmd_PR.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_PR.bParse( ) ? "OK" : "FAULT" ); oCmd_PR.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_PR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmdPR Contents : " << oCmd_PR.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDNGSPR //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceAC.hpp0000644000000000000000000000506711504717453021745 0ustar rootroot//***************************************************************************** // CmdNgSpiceAC.hpp * // ------------------ * // Description : This class contains values associated with the NG-Spice * // AC command. It inherits from the class CmdBase. * // Started : 11/10/2007 * // Last Update : 24/12/2010 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDNGSAC_HPP #define CMDNGSAC_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "gnucap/commands/CmdGnuCapAC.hpp" #include "utility/ConvertType.hpp" struct CmdGnuCapAC; // Local Macro and Constant Declarations //***************************************************************************** struct CmdNgSpiceAC : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // The sweep start value wxString m_osStop; // The sweep stop value wxString m_osStep; // The sweep step value eScaleType m_eScale; // The sweep scale type CmdNgSpiceAC( void ); virtual ~CmdNgSpiceAC( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdNgSpiceAC & operator = ( const CmdGnuCapAC & roCmdAC ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDNGSAC_HPP gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceOPT.hpp0000644000000000000000000001104711553566316022123 0ustar rootroot//***************************************************************************** // CmdNgSpiceOPT.hpp * // ------------------- * // Description : This class contains values associated with the NG-Spice * // OPTIONS command. It inherits from the class CmdBase. * // Started : 23/08/2006 * // Last Update : 21/04/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDNGSOPT_HPP #define CMDNGSOPT_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "gnucap/commands/CmdGnuCapOPT.hpp" #include "utility/ConvertType.hpp" struct CmdGnuCapOPT; // Local Macro and/or Constant Declarations #define NGS_ABSTOL 1.00E-12 #define NGS_BADMOS3 FALSE #define NGS_CHGTOL 1.00E-14 #define NGS_DEFAD 0.00 #define NGS_DEFAS 0.00 #define NGS_DEFL 100.00E-06 #define NGS_DEFW 100.00E-06 #define NGS_GMIN 1.00E-12 #define NGS_ITL1 100 #define NGS_ITL2 50 #define NGS_ITL4 10 #define NGS_METHOD wxT("Trap") #define NGS_PIVREL 1.00E-03 #define NGS_PIVTOL 1.00E-13 #define NGS_RELTOL 1.00E-03 #define NGS_TEMP 27.00 #define NGS_TNOM 27.00 #define NGS_TRTOL 7.00 #define NGS_VNTOL 1.00E-06 #define NGS_WIDTH 104 // Allows for operator (eg. frequency) & 10 cols of data #define NGS_NUMDGT 6 #define NGS_UNITS wxT("Degrees") //***************************************************************************** struct CmdNgSpiceOPT : public CmdBase { private : virtual bool bValidate( void ); public : // Options supported by both NG-Spice and GNU-Cap wxString m_osABSTOL; // Abs. current error tolerance wxString m_osCHGTOL; // Charge tolerance wxString m_osDEFAD; // MOS drain diffusion area wxString m_osDEFAS; // MOS source diffusion area wxString m_osDEFL; // MOS channel length wxString m_osDEFW; // MOS channel width wxString m_osGMIN; // Minimum allowable conductance wxString m_osITL1; // DC iteration limit wxString m_osITL2; // DC transfer curve iteration limit wxString m_osITL4; // TR analysis timepoint iteration limit wxString m_osMETHOD; // Numerical integration method wxString m_osRELTOL; // Relative error tolerance wxString m_osTNOM; // Nominal temp. at which device parameters measured wxString m_osTRTOL; // TR error tolerance wxString m_osVNTOL; // Abs. voltage error tolerance // Options specific to NG-Spice bool m_bBADMOS3; // Use MOS3 model with "kappa" discontinuity wxString m_osPIVREL; // Relative ratio of largest column entry and an acceptable pivot value wxString m_osPIVTOL; // Abs. min. value for matrix entry as pivot wxString m_osTEMP; // Operating temperature of circuit // Options to set the results format uint m_uiWidth; // Width of the results page uint m_uiNumDgt; // Number of digits of precision wxString m_osUnits; // Angle units : degrees or radians CmdNgSpiceOPT( void ); virtual ~CmdNgSpiceOPT( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); bool bSetWidth( uint uiParaCnt ); CmdNgSpiceOPT & operator = ( const CmdGnuCapOPT & roCmdOPT ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDNGSOPT_HPP gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceAC.cpp0000644000000000000000000002315511620762632021734 0ustar rootroot//***************************************************************************** // CmdNgSpiceAC.cpp * // ------------------ * // Started : 11/10/2007 * // Last Update : 12/08/2011 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/commands/CmdNgSpiceAC.hpp" //***************************************************************************** // Constructor. CmdNgSpiceAC::CmdNgSpiceAC( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdNgSpiceAC::~CmdNgSpiceAC( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceAC::bValidate( void ) { double df1, df2, df3; // Call the base class validation function first CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and sweep scale if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eScale ) { case eSCALE_LIN : if( df1!=df2 && df3>fabs( df2 - df1 ) ) SetErrMsg( wxT("Step value is greater than sweep range.") ); break; case eSCALE_DEC : case eSCALE_OCT : break; default : SetErrMsg( wxT("Invalid step scale value.") ); } return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceAC::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_NGSPICE; m_eCmdType = eCMD_AC; m_osStart = wxT("1.0K"); m_osStop = wxT("100.0K"); m_osStep = wxT("10"); m_eScale = eSCALE_DEC; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .AC LIN 50 1.00K 300.00K // .AC DEC 20 1.00K 300.00K // .AC OCT 10 1.00K 300.00K // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceAC::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1; long li1; // Clear the object attributes os1 = *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) != 5 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".AC") ) return( bValidate( ) ); // Extract the sweep type: linear or log os1 = ostk1.GetNextToken( ).Upper( ); if( os1 == wxT("LIN") ) m_eScale = eSCALE_LIN; else if( os1 == wxT("DEC") ) m_eScale = eSCALE_DEC; else if( os1 == wxT("OCT") ) m_eScale = eSCALE_OCT; else return( bValidate( ) ); // Extract the step count os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToLong( os1, &li1 ) ) m_osStep = os1; else return( bValidate( ) ); // Extract the start frequency os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); // Extract the stop frequency os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceAC::bFormat( void ) { wxString osCmd, os1; osCmd = wxT(".AC"); switch( m_eScale ) { case eSCALE_LIN : osCmd << wxT(" LIN"); break; case eSCALE_DEC : osCmd << wxT(" DEC"); break; case eSCALE_OCT : osCmd << wxT(" OCT"); break; default : break; } osCmd << wxT(' ') << m_osStep; osCmd << wxT(' ') << m_osStart; osCmd << wxT(' ') << m_osStop; assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdGnuCapAC object. // // Argument List : // poCmdAC - A pointer to a CmdNgSpiceAC object // // Return Values : // A pointer to this object CmdNgSpiceAC & CmdNgSpiceAC::operator = ( const CmdGnuCapAC & roCmdAC ) { (CmdBase &) *this = (CmdBase &) roCmdAC; m_osStart = roCmdAC.m_osStart; m_osStop = roCmdAC.m_osStop; m_osStep = roCmdAC.m_osStep; m_eScale = roCmdAC.m_eScale; // NG-Spice doesn't support logarithmic scaling if( m_eScale == eSCALE_LOG ) m_eScale = eSCALE_DEC; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // psPrefix - A prefix to every line displayed (usually just spaces) void CmdNgSpiceAC::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix .mb_str( ) << "m_osStart : " << m_osStart .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_eScale : "; switch( m_eScale ) { case eSCALE_LIN : cout << "eSCALE_LIN\n"; break; case eSCALE_LOG : cout << "eSCALE_LOG\n"; break; case eSCALE_DEC : cout << "eSCALE_DEC\n"; break; case eSCALE_OCT : cout << "eSCALE_OCT\n"; break; case eSCALE_NONE : cout << "eSCALE_NONE\n"; break; default : cout << "Invalid\n"; break; } } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDNGSAC // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdNgSpiceAC Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a GNU-CAP AC command object CmdNgSpiceAC oCmd_AC; // Use the following command example to check the formatter and the parser : osCmd = wxT(".AC DEC 30 1.00K 300.00K"); // Set things up for a formatter test oCmd_AC.m_osStart = wxT("1.00K"); oCmd_AC.m_osStop = wxT("300.00K"); oCmd_AC.m_osStep = wxT("30"); oCmd_AC.m_eScale = eSCALE_DEC; cout << "\nRun Formatter : " << ( oCmd_AC.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_AC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_AC Contents : " << oCmd_AC.mb_str( ) << '\n'; // Set things up for a parser test oCmd_AC.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_AC.bParse( ) ? "OK" : "FAULT" ); oCmd_AC.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_AC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_AC Contents : " << oCmd_AC.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDNGSAC //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceTR.hpp0000644000000000000000000000506711504646246022010 0ustar rootroot//***************************************************************************** // CmdNgSpiceTR.hpp * // ------------------ * // Description : This class contains values associated with the NG-Spice * // TRANSIENT command. It inherits from the class CmdBase. * // Started : 15/10/2007 * // Last Update : 24/12/2010 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDNGSTR_HPP #define CMDNGSTR_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "gnucap/commands/CmdGnuCapTR.hpp" #include "utility/ConvertType.hpp" struct CmdGnuCapTR; // Local Macro and Constant Declarations //***************************************************************************** struct CmdNgSpiceTR : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // The sweep start value wxString m_osStop; // The sweep stop value wxString m_osStep; // The sweep step value eInitCType m_eInitC; // The initial conditions CmdNgSpiceTR( void ); virtual ~CmdNgSpiceTR( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdNgSpiceTR & operator = ( const CmdGnuCapTR & roCmdTR ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDNGSTR_HPP gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceDC.hpp0000644000000000000000000000526511504646246021751 0ustar rootroot//***************************************************************************** // CmdNgSpiceDC.hpp * // ------------------ * // Description : This class contains values associated with the NG-Spice * // DC command. It inherits from the class CmdBase. * // Started : 23/08/2006 * // Last Update : 24/12/2010 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDNGSDC_HPP #define CMDNGSDC_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "gnucap/commands/CmdGnuCapOP.hpp" #include "gnucap/commands/CmdGnuCapDC.hpp" #include "utility/ConvertType.hpp" struct CmdGnuCapOP; struct CmdGnuCapDC; // Local Macro and Constant Declarations //***************************************************************************** struct CmdNgSpiceDC : public CmdBase { private : virtual bool bValidate( void ); public : wxString m_osStart; // Sweep start value wxString m_osStop; // Sweep stop value wxString m_osStep; // Sweep step value wxString m_osSource; // Sweep source CmdNgSpiceDC( void ); virtual ~CmdNgSpiceDC( ); virtual bool bSetDefaults( void ); virtual bool bParse ( void ); virtual bool bFormat( void ); CmdNgSpiceDC & operator = ( const CmdGnuCapOP & roCmdOP ); CmdNgSpiceDC & operator = ( const CmdGnuCapDC & roCmdDC ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDNGSDC_HPP gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpicePR.hpp0000644000000000000000000000525711504646246022005 0ustar rootroot//***************************************************************************** // CmdNgSpicePR.hpp * // ------------------ * // Description : This class contains values associated with the NG-Spice * // PRINT command. It inherits from the class CmdBase. * // Started : 16/10/2007 * // Last Update : 24/12/2010 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDNGSPR_HPP #define CMDNGSPR_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include #include // Application Includes #include "base/CmdBase.hpp" #include "gnucap/commands/CmdGnuCapPR.hpp" struct CmdGnuCapPR; // Local Macro and Constant Declarations //***************************************************************************** struct CmdNgSpicePR : public CmdBase { private : virtual bool bValidate( void ); public : eCmdType m_eAnaType; wxArrayString m_osaNodes; wxArrayString m_osaCpnts; bool m_bParmtrs[ ePAR_LST+1 ]; bool m_bCpxPrts[ eCPX_LST+1 ]; CmdNgSpicePR( void ); virtual ~CmdNgSpicePR( ); virtual bool bSetDefaults( void ); bool bSetAnaType( eCmdType eAnaType ); virtual bool bParse ( void ); virtual bool bFormat( void ); int iGetParaCnt( void ); CmdNgSpicePR & operator = ( const CmdNgSpicePR & roCmdPR ); CmdNgSpicePR & operator = ( const CmdGnuCapPR & roCmdPR ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDNGSPR_HPP gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceTR.cpp0000644000000000000000000002250111620762703021767 0ustar rootroot//***************************************************************************** // CmdNgSpiceTR.cpp * // ------------------ * // Started : 15/10/2007 * // Last Update : 12/08/2011 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/commands/CmdNgSpiceTR.hpp" //***************************************************************************** // Constructor. CmdNgSpiceTR::CmdNgSpiceTR( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdNgSpiceTR::~CmdNgSpiceTR( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceTR::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and initial conditions if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); switch( m_eInitC ) { case eINITC_WARM : case eINITC_UICS : case eINITC_COLD : break; default : SetErrMsg( wxT("Invalid initial conditions value.") ); } return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceTR::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_NGSPICE; m_eCmdType = eCMD_TR; m_osStart = wxT("0.0m"); m_osStop = wxT("100.0m"); m_osStep = wxT("10.0m"); m_eInitC = eINITC_WARM; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .TRAN 10.00m 100.00m 0.00 10.00m UIC // .TRAN 10.00m 100.00m 0.00 10.00m // .TRAN 10.00m 100.00m 0.00 // .TRAN 10.00m 100.00m // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceTR::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1; int i1; // Clear the object attributes os1 = *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); i1 = ostk1.CountTokens( ); if( i1<3 || i1>6 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".TR") ) return( bValidate( ) ); // Extract the step increment (must be present) os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); // Extract the stop value (must be present) os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the start value (may be omitted) m_osStart = wxT("0.0"); if( ostk1.HasMoreTokens( ) ) { os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); } // Extract the initial conditions specifier m_eInitC = eINITC_WARM; while( ostk1.HasMoreTokens( ) ) { os1 = ostk1.GetNextToken( ).Upper( ); if( os1 == wxT("UIC") ) { m_eInitC = eINITC_UICS; break; } } return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceTR::bFormat( void ) { wxString osCmd; // Set the command name osCmd = wxT(".TRAN"); // Set sweep parameters osCmd << wxT(' ') << m_osStep; osCmd << wxT(' ') << m_osStop; osCmd << wxT(' ') << m_osStart; // Set initial conditions if( m_eInitC != eINITC_WARM ) osCmd << wxT(" UIC"); assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdGnuCapAC object. // // Argument List : // roCmdTR - A reference to a CmdGnuCapTR object // // Return Values : // A reference to this object CmdNgSpiceTR & CmdNgSpiceTR::operator = ( const CmdGnuCapTR & roCmdTR ) { (CmdBase &) *this = (CmdBase &) roCmdTR; m_osStart = roCmdTR.m_osStart; m_osStop = roCmdTR.m_osStop; m_osStep = roCmdTR.m_osStep; m_eInitC = roCmdTR.m_eInitC; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdNgSpiceTR::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_osStart : " << m_osStart.mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_eInitC : "; switch( m_eInitC ) { case eINITC_WARM : cout << "eINITC_COLD\n"; break; case eINITC_UICS : cout << "eINITC_UICS\n"; break; case eINITC_COLD : cout << "eINITC_COLD\n"; break; case eINITC_NONE : cout << "eINITC_NONE\n"; break; default : cout << "Invalid\n"; break; } } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDNGSTR // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdNgSpiceTR Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a NG-SPICE TRANSIENT command object CmdNgSpiceTR oCmd_TR; // Use the following command example to check the formatter and the parser : osCmd = wxT(".TRAN 10.00m 100.00m 0.00 UIC"); // Set things up for a formatter test oCmd_TR.m_osStart = wxT("0.00"); oCmd_TR.m_osStop = wxT("100.00m"); oCmd_TR.m_osStep = wxT("10.00m"); oCmd_TR.m_eInitC = eINITC_UICS; cout << "\nRun Formatter : " << ( oCmd_TR.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_TR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_TR Contents : " << oCmd_TR.mb_str( ) << '\n'; // Set things up for a parser test oCmd_TR.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_TR.bParse( ) ? "OK" : "FAULT" ); oCmd_TR.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_TR == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_TR Contents : " << oCmd_TR.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDNGSTR //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceOPT.cpp0000644000000000000000000004207611620762373022120 0ustar rootroot//***************************************************************************** // CmdNgSpiceOPT.cpp * // ------------------- * // Started : 23/08/2006 * // Last Update : 12/08/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/commands/CmdNgSpiceOPT.hpp" //***************************************************************************** // Constructor. CmdNgSpiceOPT::CmdNgSpiceOPT( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdNgSpiceOPT::~CmdNgSpiceOPT( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceOPT::bValidate( void ) { double df1; long li1; CmdBase::bValidate( ); if( ! ConvertType::bStrToDFlt( m_osABSTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for ABSTOL.") ); if( ! ConvertType::bStrToDFlt( m_osCHGTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for CHGTOL.") ); if( ! ConvertType::bStrToDFlt( m_osDEFAD, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFAD.") ); if( ! ConvertType::bStrToDFlt( m_osDEFAS, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFAS.") ); if( ! ConvertType::bStrToDFlt( m_osDEFL, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFL.") ); if( ! ConvertType::bStrToDFlt( m_osDEFW, &df1 ) ) SetErrMsg( wxT("Invalid value for DEFW.") ); if( ! ConvertType::bStrToDFlt( m_osGMIN, &df1 ) ) SetErrMsg( wxT("Invalid value for GMIN.") ); if( ! ConvertType::bStrToDFlt( m_osPIVREL, &df1 ) ) SetErrMsg( wxT("Invalid value for PIVREL.") ); if( ! ConvertType::bStrToDFlt( m_osPIVTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for PIVTOL.") ); if( ! ConvertType::bStrToDFlt( m_osRELTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for RELTOL.") ); if( ! ConvertType::bStrToDFlt( m_osTEMP, &df1 ) ) SetErrMsg( wxT("Invalid value for TEMP.") ); if( ! ConvertType::bStrToDFlt( m_osTNOM, &df1 ) ) SetErrMsg( wxT("Invalid value for TNOM.") ); if( ! ConvertType::bStrToDFlt( m_osTRTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for TRTOL.") ); if( ! ConvertType::bStrToDFlt( m_osVNTOL, &df1 ) ) SetErrMsg( wxT("Invalid value for VNTOL.") ); if( ! ConvertType::bStrToLong( m_osITL1, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL1.") ); if( ! ConvertType::bStrToLong( m_osITL2, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL2.") ); if( ! ConvertType::bStrToLong( m_osITL4, &li1 ) ) SetErrMsg( wxT("Invalid value for ITL4.") ); if( m_osMETHOD.IsEmpty( ) ) SetErrMsg( wxT("Invalid value for METHOD.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceOPT::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_NGSPICE; m_eCmdType = eCMD_OPT; ConvertType::bDFltToStr( NGS_ABSTOL, m_osABSTOL ); ConvertType::bDFltToStr( NGS_CHGTOL, m_osCHGTOL ); ConvertType::bDFltToStr( NGS_DEFAD , m_osDEFAD ); ConvertType::bDFltToStr( NGS_DEFAS , m_osDEFAS ); ConvertType::bDFltToStr( NGS_DEFL , m_osDEFL ); ConvertType::bDFltToStr( NGS_DEFW , m_osDEFW ); ConvertType::bDFltToStr( NGS_GMIN , m_osGMIN ); ConvertType::bDFltToStr( NGS_ITL1 , m_osITL1 ); ConvertType::bDFltToStr( NGS_ITL2 , m_osITL2 ); ConvertType::bDFltToStr( NGS_ITL4 , m_osITL4 ); ConvertType::bDFltToStr( NGS_PIVREL, m_osPIVREL ); ConvertType::bDFltToStr( NGS_PIVTOL, m_osPIVTOL ); ConvertType::bDFltToStr( NGS_RELTOL, m_osRELTOL ); ConvertType::bDFltToStr( NGS_TEMP , m_osTEMP ); ConvertType::bDFltToStr( NGS_TNOM , m_osTNOM ); ConvertType::bDFltToStr( NGS_TRTOL , m_osTRTOL ); ConvertType::bDFltToStr( NGS_VNTOL , m_osVNTOL ); m_bBADMOS3 = NGS_BADMOS3; m_osMETHOD = NGS_METHOD; m_uiWidth = NGS_WIDTH; m_uiNumDgt = NGS_NUMDGT; m_osUnits = NGS_UNITS; return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .OPTIONS NOPAGE // .OPTIONS NOPAGE ABSTOL=1.10p BADMOS3 CHGTOL=11.00f DEFAD=10.00f // DEFAS=10.00f DEFL=110.00u DEFW=110.00u GMIN=1.10p ITL1=110 // ITL2=60 ITL4=20 METHOD=GEAR PIVREL=2.00m PIVTOL=110.00f // RELTOL=2.00m TEMP=30.00 TNOM=30.00 TRTOL=8.00 VNTOL=2.00u // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceOPT::bParse( void ) { wxStringTokenizer ostk1; wxString os1, os2; size_t sz1; // Clear the object attributes os1 = (wxString &) *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) < 2 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 4 ).Upper( ); if( os1 != wxT(".OPT") ) return( bValidate( ) ); // Extract each parameter value while( ostk1.HasMoreTokens( ) ) { // Extract the field name and the associated value os1 = ostk1.GetNextToken( ); os2 = wxT(""); if( (sz1=os1.find( wxT("=") )) != wxString::npos ) { os2 = os1.Right( os1.Length( )-sz1-1 ); os1 = os1.Left( sz1 ); } // Set the attribute value if( os1 == wxT("ABSTOL") ) m_osABSTOL = os2; else if( os1 == wxT("BADMOS3") ) m_bBADMOS3 = TRUE; else if( os1 == wxT("CHGTOL") ) m_osCHGTOL = os2; else if( os1 == wxT("DEFAD") ) m_osDEFAD = os2; else if( os1 == wxT("DEFAS") ) m_osDEFAS = os2; else if( os1 == wxT("DEFL") ) m_osDEFL = os2; else if( os1 == wxT("DEFW") ) m_osDEFW = os2; else if( os1 == wxT("GMIN") ) m_osGMIN = os2; else if( os1 == wxT("ITL1") ) m_osITL1 = os2; else if( os1 == wxT("ITL2") ) m_osITL2 = os2; else if( os1 == wxT("ITL4") ) m_osITL4 = os2; else if( os1 == wxT("METHOD") ) m_osMETHOD = os2; else if( os1 == wxT("PIVREL") ) m_osPIVREL = os2; else if( os1 == wxT("PIVTOL") ) m_osPIVTOL = os2; else if( os1 == wxT("RELTOL") ) m_osRELTOL = os2; else if( os1 == wxT("TEMP") ) m_osTEMP = os2; else if( os1 == wxT("TNOM") ) m_osTNOM = os2; else if( os1 == wxT("TRTOL") ) m_osTRTOL = os2; else if( os1 == wxT("VNTOL") ) m_osVNTOL = os2; } return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceOPT::bFormat( void ) { wxString os1, os2; double df1; long li1; os1 = wxT(".OPTIONS NOPAGE"); os1 << wxT(" NUMDGT=") << m_uiNumDgt; os1 << wxT(" UNITS=") << m_osUnits; os1 << wxT(" WIDTH=") << m_uiWidth; ConvertType::bStrToDFlt( m_osABSTOL, &df1 ); if( df1 != NGS_ABSTOL ) os1 << wxT(" ABSTOL=") << m_osABSTOL; if( m_bBADMOS3 != NGS_BADMOS3 ) os1 << wxT(" BADMOS3"); ConvertType::bStrToDFlt( m_osCHGTOL, &df1 ); if( df1 != NGS_CHGTOL ) os1 << wxT(" CHGTOL=") << m_osCHGTOL; ConvertType::bStrToDFlt( m_osDEFAD , &df1 ); if( df1 != NGS_DEFAD ) os1 << wxT(" DEFAD=") << m_osDEFAD; ConvertType::bStrToDFlt( m_osDEFAS , &df1 ); if( df1 != NGS_DEFAS ) os1 << wxT(" DEFAS=") << m_osDEFAS; ConvertType::bStrToDFlt( m_osDEFL , &df1 ); if( df1 != NGS_DEFL ) os1 << wxT(" DEFL=") << m_osDEFL; ConvertType::bStrToDFlt( m_osDEFW , &df1 ); if( df1 != NGS_DEFW ) os1 << wxT(" DEFW=") << m_osDEFW; ConvertType::bStrToDFlt( m_osGMIN , &df1 ); if( df1 != NGS_GMIN ) os1 << wxT(" GMIN=") << m_osGMIN; ConvertType::bStrToLong( m_osITL1 , &li1 ); if( li1 != NGS_ITL1 ) os1 << wxT(" ITL1=") << m_osITL1; ConvertType::bStrToLong( m_osITL2 , &li1 ); if( li1 != NGS_ITL2 ) os1 << wxT(" ITL2=") << m_osITL2; ConvertType::bStrToLong( m_osITL4 , &li1 ); if( li1 != NGS_ITL4 ) os1 << wxT(" ITL4=") << m_osITL4; os2 = m_osMETHOD.Upper( ); if( os2.CmpNoCase( NGS_METHOD ) ) os1 << wxT(" METHOD=") << os2; ConvertType::bStrToDFlt( m_osPIVREL, &df1 ); if( df1 != NGS_PIVREL ) os1 << wxT(" PIVREL=") << m_osPIVREL; ConvertType::bStrToDFlt( m_osPIVTOL, &df1 ); if( df1 != NGS_PIVTOL ) os1 << wxT(" PIVTOL=") << m_osPIVTOL; ConvertType::bStrToDFlt( m_osRELTOL, &df1 ); if( df1 != NGS_RELTOL ) os1 << wxT(" RELTOL=") << m_osRELTOL; ConvertType::bStrToDFlt( m_osTEMP , &df1 ); if( df1 != NGS_TEMP ) os1 << wxT(" TEMP=") << m_osTEMP; ConvertType::bStrToDFlt( m_osTNOM , &df1 ); if( df1 != NGS_TNOM ) os1 << wxT(" TNOM=") << m_osTNOM; ConvertType::bStrToDFlt( m_osTRTOL , &df1 ); if( df1 != NGS_TRTOL ) os1 << wxT(" TRTOL=") << m_osTRTOL; ConvertType::bStrToDFlt( m_osVNTOL , &df1 ); if( df1 != NGS_VNTOL ) os1 << wxT(" VNTOL=") << m_osVNTOL; assign( os1 ); return( bValidate( ) ); } //***************************************************************************** // Calculate the required results page width needed for the number of derived // parameters. // // Note : WIDTH = 56 for 2 cols of numbers ie. one X plus one Y. Add 16 char. // positions for each extra column of data required. // // 56 + 48 = 104 // // Argument List : // uiParaCnt - The number of derived parameters in the results // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceOPT::bSetWidth( uint uiParaCnt ) { if( uiParaCnt < 1 ) return( FALSE ); m_uiWidth = 56 + 16 * ( uiParaCnt - 1 ); return( TRUE ); } //***************************************************************************** // Copy the contents of a CmdGnuCapAC object. // // Argument List : // roCmdOPT - A reference to a CmdGnuCapOPT object // // Return Values : // A reference to this object CmdNgSpiceOPT & CmdNgSpiceOPT::operator = ( const CmdGnuCapOPT & roCmdOPT ) { (CmdBase &) *this = (CmdBase &) roCmdOPT; m_osABSTOL = roCmdOPT.m_osABSTOL; m_osCHGTOL = roCmdOPT.m_osCHGTOL; m_osDEFAD = roCmdOPT.m_osDEFAD; m_osDEFAS = roCmdOPT.m_osDEFAS; m_osDEFL = roCmdOPT.m_osDEFL; m_osDEFW = roCmdOPT.m_osDEFW; m_osGMIN = roCmdOPT.m_osGMIN; m_osITL1 = roCmdOPT.m_osITL1; m_osITL2 = roCmdOPT.m_osITL2; m_osITL4 = roCmdOPT.m_osITL4; m_osMETHOD = roCmdOPT.m_osMETHOD; m_osRELTOL = roCmdOPT.m_osRELTOL; m_osTNOM = roCmdOPT.m_osTNOM; m_osTRTOL = roCmdOPT.m_osTRTOL; m_osVNTOL = roCmdOPT.m_osVNTOL; m_osTEMP = roCmdOPT.m_osTEMPAMB; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdNgSpiceOPT::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix .mb_str( ) << "m_osABSTOL : " << m_osABSTOL.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_bBADMOS3 : " << ( m_bBADMOS3 ? "TRUE" : "FALSE" ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osCHGTOL : " << m_osCHGTOL.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFAD : " << m_osDEFAD .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFAS : " << m_osDEFAS .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFL : " << m_osDEFL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osDEFW : " << m_osDEFW .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osGMIN : " << m_osGMIN .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL1 : " << m_osITL1 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL2 : " << m_osITL2 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osITL4 : " << m_osITL4 .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osMETHOD : " << m_osMETHOD.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPIVREL : " << m_osPIVREL.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osPIVTOL : " << m_osPIVTOL.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osRELTOL : " << m_osRELTOL.mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTEMP : " << m_osTEMP .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTNOM : " << m_osTNOM .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osTRTOL : " << m_osTRTOL .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osVNTOL : " << m_osVNTOL .mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDNGSOPT // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdNgSpiceOPT Test Utility" << "\n Version 1.03 (12/08/2011)\n"; // Create a NG-SPICE OPTIONS command object CmdNgSpiceOPT oCmd_OPT; // Use the following command example to check the formatter and the parser : osCmd << wxT(".OPTIONS NOPAGE ABSTOL=1.10p BADMOS3 CHGTOL=11.00f ") << wxT("DEFAD=10.00f DEFAS=10.00f DEFL=110.00u DEFW=110.00u ") << wxT("GMIN=1.10p ITL1=110 ITL2=60 ITL4=20 METHOD=GEAR ") << wxT("PIVREL=2.00m PIVTOL=110.00f RELTOL=2.00m TEMP=30.00 ") << wxT("TNOM=30.00 TRTOL=8.00 VNTOL=2.00u"); // Set things up for a formatter test oCmd_OPT.m_osABSTOL = wxT("1.10p"); oCmd_OPT.m_bBADMOS3 = TRUE; oCmd_OPT.m_osCHGTOL = wxT("11.00f"); oCmd_OPT.m_osDEFAD = wxT("10.00f"); oCmd_OPT.m_osDEFAS = wxT("10.00f"); oCmd_OPT.m_osDEFL = wxT("110.00u"); oCmd_OPT.m_osDEFW = wxT("110.00u"); oCmd_OPT.m_osGMIN = wxT("1.10p"); oCmd_OPT.m_osITL1 = wxT("110"); oCmd_OPT.m_osITL2 = wxT("60"); oCmd_OPT.m_osITL4 = wxT("20"); oCmd_OPT.m_osMETHOD = wxT("GEAR"); oCmd_OPT.m_osPIVREL = wxT("2.00m"); oCmd_OPT.m_osPIVTOL = wxT("110.00f"); oCmd_OPT.m_osRELTOL = wxT("2.00m"); oCmd_OPT.m_osTEMP = wxT("30.00"); oCmd_OPT.m_osTNOM = wxT("30.00"); oCmd_OPT.m_osTRTOL = wxT("8.00"); oCmd_OPT.m_osVNTOL = wxT("2.00u"); cout << "\nRun Formatter : " << ( oCmd_OPT.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_OPT == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_OPT Contents : " << oCmd_OPT.mb_str( ) << '\n'; // Set things up for a parser test oCmd_OPT.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_OPT.bParse( ) ? "OK" : "FAULT" ); oCmd_OPT.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_OPT == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_OPT Contents : " << oCmd_OPT.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDNGSOPT //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/commands/CmdNgSpiceDC.cpp0000644000000000000000000002237511620762560021742 0ustar rootroot//***************************************************************************** // CmdNgSpiceDC.cpp * // ------------------ * // Started : 21/08/2007 * // Last Update : 12/08/2011 * // Copyright : (C) 2007 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/commands/CmdNgSpiceDC.hpp" //***************************************************************************** // Constructor. CmdNgSpiceDC::CmdNgSpiceDC( void ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdNgSpiceDC::~CmdNgSpiceDC( ) { } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceDC::bValidate( void ) { double df1, df2, df3; CmdBase::bValidate( ); // Check the sweep start and stop values if( ! ConvertType::bStrToDFlt( m_osStart, &df1 ) ) SetErrMsg( wxT("Invalid sweep start value.") ); if( ! ConvertType::bStrToDFlt( m_osStop, &df2 ) ) SetErrMsg( wxT("Invalid sweep stop value.") ); if( df2 < df1 ) SetErrMsg( wxT("Start value greater than stop value.") ); // Check the sweep step value and sweep scale if( ! ConvertType::bStrToDFlt( m_osStep, &df3 ) ) SetErrMsg( wxT("Invalid sweep step value.") ); if( df3 <= 0.0 ) SetErrMsg( wxT("Step value less than or equal to zero.") ); // Check the component to be used as the sweep source if( m_osSource.IsEmpty( ) && m_osSource!=wxT("TEMP") ) SetErrMsg( wxT("No source component has been selected.") ); return( bIsValid( ) ); } //***************************************************************************** // Set the object attributes to they're default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceDC::bSetDefaults( void ) { CmdBase::bSetDefaults( ); m_eSimEng = eSIMR_NGSPICE; m_eCmdType = eCMD_DC; m_osStart = wxT("0.0"); m_osStop = wxT("100.0"); m_osStep = wxT("10.0"); m_osSource = wxT("None"); return( TRUE ); } //***************************************************************************** // Parse the command string. // // Eg.s : .DC Vin 0.00 200.00m 25.00m // .DC TEMP 0.00 200.00 25.00 // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceDC::bParse( void ) { wxStringTokenizer ostk1; wxString os1; double df1; // Clear the object attributes os1 = *this; bSetDefaults( ); assign( os1 ); // Tokenize the command string ostk1.SetString( *this ); if( ostk1.CountTokens( ) != 5 ) return( bValidate( ) ); // Check command type os1 = ostk1.GetNextToken( ).Left( 3 ).Upper( ); if( os1 != wxT(".DC") ) return( FALSE ); // Extract the sweep type : a signal source or temperature m_osSource = ostk1.GetNextToken( ); if( m_osSource.IsEmpty( ) ) return( bValidate( ) ); // Extract the start value os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStart = os1; else return( bValidate( ) ); // Extract the stop value os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStop = os1; else return( bValidate( ) ); // Extract the step increment os1 = ostk1.GetNextToken( ); if( ConvertType::bStrToDFlt( os1, &df1 ) ) m_osStep = os1; else return( bValidate( ) ); return( bValidate( ) ); } //***************************************************************************** // Format the command string. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdNgSpiceDC::bFormat( void ) { wxString osCmd; // Set the command name osCmd = wxT(".DC"); // Set signal source osCmd << wxT(' ') << m_osSource; // Set sweep parameters osCmd << wxT(' ') << m_osStart; osCmd << wxT(' ') << m_osStop; osCmd << wxT(' ') << m_osStep; assign( osCmd ); return( bValidate( ) ); } //***************************************************************************** // Copy the contents of a CmdGnuCapOP object. // // Argument List : // roCmdOP - A reference to a CmdGnuCapOP object // // Return Values : // A reference to this object CmdNgSpiceDC & CmdNgSpiceDC::operator = ( const CmdGnuCapOP & roCmdOP ) { (CmdBase &) *this = (CmdBase &) roCmdOP; m_osStart = roCmdOP.m_osStart; m_osStop = roCmdOP.m_osStop; m_osStep = roCmdOP.m_osStep; m_osSource = wxT("TEMP"); bFormat( ); return( *this ); } //***************************************************************************** // Copy the contents of a CmdGnuCapDC object. // // Argument List : // roCmdDC - A reference to a CmdGnuCapDC object // // Return Values : // A reference to this object CmdNgSpiceDC & CmdNgSpiceDC::operator = ( const CmdGnuCapDC & roCmdDC ) { (CmdBase &) *this = (CmdBase &) roCmdDC; m_osStart = roCmdDC.m_osStart; m_osStop = roCmdDC.m_osStop; m_osStep = roCmdDC.m_osStep; m_osSource = roCmdDC.m_osSource; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdNgSpiceDC::Print( const wxString & rosPrefix ) { CmdBase::Print( rosPrefix + wxT("CmdBase::") ); cout << rosPrefix.mb_str( ) << "m_osStart : " << m_osStart.mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStop : " << m_osStop .mb_str( ) << '\n'; cout << rosPrefix.mb_str( ) << "m_osStep : " << m_osStep .mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osSource : " << m_osSource.mb_str( ) << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CMDNGSDC // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCmd; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n Class CmdNgSpiceDC Test Utility" << "\n Version 1.02 (12/08/2011)\n"; // Create a NG-SPICE DC command object CmdNgSpiceDC oCmd_DC; // Use the following command example to check the formatter and the parser : osCmd = wxT(".DC Vin 0.00 100.00m 10.00m"); // Set things up for a formatter test oCmd_DC.m_osStart = wxT("0.00"); oCmd_DC.m_osStop = wxT("100.00m"); oCmd_DC.m_osStep = wxT("10.00m"); oCmd_DC.m_osSource = wxT("Vin"); cout << "\nRun Formatter : " << ( oCmd_DC.bFormat( ) ? "OK" : "FAULT" ); cout << "\nTest Cmd Format : " << ( oCmd_DC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_DC Contents : " << oCmd_DC.mb_str( ) << '\n'; // Set things up for a parser test oCmd_DC.bSetString( osCmd ); cout << "\nRun Parser : " << ( oCmd_DC.bParse( ) ? "OK" : "FAULT" ); oCmd_DC.bFormat( ); cout << "\nTest Cmd Format : " << ( oCmd_DC == osCmd ? "OK" : "FAULT" ); cout << "\nExample Command : " << osCmd .mb_str( ); cout << "\noCmd_DC Contents : " << oCmd_DC.mb_str( ) << '\n'; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CMDNGSDC //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/dialogs/0000755000000000000000000000000011563063437016666 5ustar rootrootgspiceui-1.0.00+dfsg/src/ngspice/dialogs/DlgNgsCfgSrc.hpp0000644000000000000000000001024211412210453021625 0ustar rootroot//***************************************************************************** // DlgNgsCfgSrc.hpp * // ------------------ * // Description : This dialogue is used to enter values associated with an * // NG-Spice independent voltage source definition. It is used * // for Transient analysis and is based on a pulse function. * // Started : 10/05/2005 * // Last Update : 21/05/2009 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef DLGNGSCFGSRC_HPP #define DLGNGSCFGSRC_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include #include // Application Includes #include "utility/PnlValue.hpp" #include "netlist/CpntNgsIndSrc.hpp" // Local Constant Declarations //***************************************************************************** class DlgNgsCfgSrc : public wxDialog { private : // Value panel controls for a sinusoidal source PnlValue m_oPnlSinOffset; PnlValue m_oPnlSinAmp; PnlValue m_oPnlSinFreq; PnlValue m_oPnlSinDelay; PnlValue m_oPnlSinDamp; // Value panel controls for a pulse source PnlValue m_oPnlPulInitial; PnlValue m_oPnlPulMax; PnlValue m_oPnlPulDelay; PnlValue m_oPnlPulRise; PnlValue m_oPnlPulWidth; PnlValue m_oPnlPulFall; PnlValue m_oPnlPulPeriod; // Button controls wxButton m_oBtnOk; wxButton m_oBtnClear; wxButton m_oBtnCancel; // Storage for validated Independent Source values CpntNgsIndSrc m_oCpntIndSrc; // Object initialization functions void Initialize( void ); void Create ( void ); void ToolTips ( void ); void DoLayout ( void ); void SetValues( CpntNgsIndSrc & roCpntSrc ); void GetValues( CpntNgsIndSrc & roCpntSrc ); public : DlgNgsCfgSrc( wxWindow * poWin ); ~DlgNgsCfgSrc( ); bool bClear( void ); bool bSetValues( CpntNgsIndSrc & roCpntSrc ); bool bGetValues( CpntNgsIndSrc & roCpntSrc ); bool bSetName( wxString & rosName ); // Event handlers void OnBtnOk ( wxCommandEvent & roEvtCmd ); void OnBtnClear ( wxCommandEvent & roEvtCmd ); void OnBtnCancel( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eDlgItemID { ID_PNL_SIN_OFFSET = 0, ID_PNL_SIN_AMP, ID_PNL_SIN_FREQ, ID_PNL_SIN_DELAY, ID_PNL_SIN_DAMP, ID_PNL_PUL_INITV, ID_PNL_PUL_MAXV, ID_PNL_PUL_DELAY, ID_PNL_PUL_RISE, ID_PNL_PUL_WIDTH, ID_PNL_PUL_FALL, ID_PNL_PUL_PERIOD, ID_BTN_OK, ID_BTN_CLEAR, ID_BTN_CANCEL, ID_UNUSED, // Assigned to controls for which events are not used ID_PNL_FST = ID_PNL_SIN_OFFSET, ID_PNL_LST = ID_PNL_PUL_PERIOD, ID_FST = ID_PNL_SIN_OFFSET, ID_LST = ID_BTN_CANCEL }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // DLGNGSCFGSRC_HPP gspiceui-1.0.00+dfsg/src/ngspice/dialogs/DlgNgsCfgSrc.cpp0000644000000000000000000003274311412210453021632 0ustar rootroot//***************************************************************************** // DlgNgsCfgSrc.hpp * // ------------------ * // Started : 13/05/2005 * // Last Update : 23/02/2010 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/dialogs/DlgNgsCfgSrc.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( DlgNgsCfgSrc, wxDialog ) EVT_BUTTON( ID_BTN_OK, DlgNgsCfgSrc::OnBtnOk ) EVT_BUTTON( ID_BTN_CLEAR, DlgNgsCfgSrc::OnBtnClear ) EVT_BUTTON( ID_BTN_CANCEL, DlgNgsCfgSrc::OnBtnCancel ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // poWin - A pointer to the dialog parent window DlgNgsCfgSrc::DlgNgsCfgSrc( wxWindow * poWin ) : wxDialog( poWin, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, wxDialogNameStr ) { SetTitle( wxT("Signal Source Setup") ); Initialize( ); bClear( ); } //***************************************************************************** // Destructor. DlgNgsCfgSrc::~DlgNgsCfgSrc( ) { } //***************************************************************************** // Initialize object attributes. void DlgNgsCfgSrc::Initialize( void ) { // Call all the initialization functions Create( ); ToolTips( ); // Layout the of the display objects DoLayout( ); } //***************************************************************************** // Create the display objects. void DlgNgsCfgSrc::Create( void ) { wxPanel * poPnl; // Create the sinusoid panel and controls poPnl = new wxPanel( this ); m_oPnlSinOffset.bCreate( poPnl, ID_PNL_SIN_OFFSET, 105 ); m_oPnlSinAmp .bCreate( poPnl, ID_PNL_SIN_AMP, 105 ); m_oPnlSinFreq .bCreate( poPnl, ID_PNL_SIN_FREQ, 105 ); m_oPnlSinDelay .bCreate( poPnl, ID_PNL_SIN_DELAY, 105 ); m_oPnlSinDamp .bCreate( poPnl, ID_PNL_SIN_DAMP, 105 ); m_oPnlSinOffset.bSetName( wxT("DC Offset") ); m_oPnlSinAmp .bSetName( wxT("Amplitude") ); m_oPnlSinFreq .bSetName( wxT("Frequency") ); m_oPnlSinDelay .bSetName( wxT("Initial Delay") ); m_oPnlSinDamp .bSetName( wxT("Damping Factor") ); m_oPnlSinOffset.bSetUnitsType( eUNITS_VOLT ); m_oPnlSinAmp .bSetUnitsType( eUNITS_VOLT ); m_oPnlSinFreq .bSetUnitsType( eUNITS_FREQ ); m_oPnlSinDelay .bSetUnitsType( eUNITS_TIME ); m_oPnlSinDamp .bSetUnitsType( eUNITS_SCLR ); // Create the pulse panel and controls poPnl = new wxPanel( this ); m_oPnlPulInitial.bCreate( poPnl, ID_PNL_PUL_INITV, 105 ); m_oPnlPulMax .bCreate( poPnl, ID_PNL_PUL_MAXV, 105 ); m_oPnlPulDelay .bCreate( poPnl, ID_PNL_PUL_DELAY, 105 ); m_oPnlPulRise .bCreate( poPnl, ID_PNL_PUL_RISE, 105 ); m_oPnlPulWidth .bCreate( poPnl, ID_PNL_PUL_WIDTH, 105 ); m_oPnlPulFall .bCreate( poPnl, ID_PNL_PUL_FALL, 105 ); m_oPnlPulPeriod .bCreate( poPnl, ID_PNL_PUL_PERIOD, 105 ); m_oPnlPulInitial.bSetName( wxT("Initial Value") ); m_oPnlPulMax .bSetName( wxT("Pulsed Value") ); m_oPnlPulDelay .bSetName( wxT("Initial Delay") ); m_oPnlPulRise .bSetName( wxT("Rise Time") ); m_oPnlPulWidth .bSetName( wxT("Pulse Width") ); m_oPnlPulFall .bSetName( wxT("Fall Time") ); m_oPnlPulPeriod .bSetName( wxT("Period") ); m_oPnlPulInitial.bSetUnitsType( eUNITS_VOLT ); m_oPnlPulMax .bSetUnitsType( eUNITS_VOLT ); m_oPnlPulDelay .bSetUnitsType( eUNITS_TIME ); m_oPnlPulRise .bSetUnitsType( eUNITS_TIME ); m_oPnlPulWidth .bSetUnitsType( eUNITS_TIME ); m_oPnlPulFall .bSetUnitsType( eUNITS_TIME ); m_oPnlPulPeriod .bSetUnitsType( eUNITS_TIME ); // Create buttons panel and the button controls poPnl = new wxPanel( this ); m_oBtnOk .Create( poPnl, ID_BTN_OK, wxT("OK") ); m_oBtnClear .Create( poPnl, ID_BTN_CLEAR, wxT("Clear") ); m_oBtnCancel.Create( poPnl, ID_BTN_CANCEL, wxT("Cancel") ); } //***************************************************************************** // Initialize the tool tips. void DlgNgsCfgSrc::ToolTips( void ) { m_oPnlSinOffset .SetToolTip( wxT("The DC offset of the sinusoidal signal") ); m_oPnlSinAmp .SetToolTip( wxT("The amplitude of the sinusoidal signal") ); m_oPnlSinFreq .SetToolTip( wxT("The frequency of the sinusoidal signal") ); m_oPnlSinDelay .SetToolTip( wxT("The initial delay of the sinusoidal signal") ); m_oPnlSinDamp .SetToolTip( wxT("The damping factor of the sinusoidal signal") ); m_oPnlPulInitial.SetToolTip( wxT("The initial value of the pulse source") ); m_oPnlPulMax .SetToolTip( wxT("The maximum value of each pulse") ); m_oPnlPulDelay .SetToolTip( wxT("The time until the first pulse") ); m_oPnlPulRise .SetToolTip( wxT("The time taken to go from 0 to the pulsed value") ); m_oPnlPulWidth .SetToolTip( wxT("The width of each pulse") ); m_oPnlPulFall .SetToolTip( wxT("The time taken to go from the pulsed value to 0") ); m_oPnlPulPeriod .SetToolTip( wxT("The period of the pulse train") ); } //***************************************************************************** // Layout the dialog display objects. void DlgNgsCfgSrc::DoLayout( void ) { wxPanel * poPnl; wxBoxSizer * poSzr; wxSizerFlags oFlags; // Create and set the underlying dialog's sizer poSzr = new wxBoxSizer( wxVERTICAL ); SetSizer( poSzr ); // Create and set the sizer for the sinusoid parameter panel poPnl = (wxPanel *) m_oPnlSinFreq.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poPnl, wxT(" Sinusoid ") ); poPnl->SetSizer( poSzr ); // Layout the sine wave parameter panel oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxTOP, 5 ); poSzr->Add( &m_oPnlSinOffset, oFlags ); oFlags.Border( wxLEFT | wxRIGHT, 10 ); poSzr->Add( &m_oPnlSinAmp, oFlags ); poSzr->Add( &m_oPnlSinFreq, oFlags ); poSzr->Add( &m_oPnlSinDelay, oFlags ); oFlags.Border( wxBOTTOM, 5 ); poSzr->Add( &m_oPnlSinDamp, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Border( wxTOP | wxLEFT | wxRIGHT, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Create and set the sizer for the pulse parameter panel poPnl = (wxPanel *) m_oPnlPulInitial.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poPnl, wxT(" Pulse ") ); poPnl->SetSizer( poSzr ); // Layout the pulse parameter panel oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxTOP, 5 ); poSzr->Add( &m_oPnlPulInitial, oFlags ); oFlags.Border( wxLEFT | wxRIGHT, 10 ); poSzr->Add( &m_oPnlPulMax, oFlags ); poSzr->Add( &m_oPnlPulDelay, oFlags ); poSzr->Add( &m_oPnlPulRise, oFlags ); poSzr->Add( &m_oPnlPulWidth, oFlags ); poSzr->Add( &m_oPnlPulFall, oFlags ); oFlags.Border( wxBOTTOM, 5 ); poSzr->Add( &m_oPnlPulPeriod, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Border( wxALL, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Create and set the sizer the button panel poPnl = (wxPanel *) m_oBtnOk.GetParent( ); poSzr = new wxBoxSizer( wxHORIZONTAL ); poPnl->SetSizer( poSzr ); // Layout the button panel oFlags.Border( wxTOP | wxBOTTOM, 10 ); oFlags.Align( wxALIGN_RIGHT ); poSzr->Add( &m_oBtnOk, oFlags ); poSzr->AddSpacer( 10 ); oFlags.Align( wxALIGN_CENTER ); poSzr->Add( &m_oBtnClear, oFlags ); poSzr->AddSpacer( 10 ); oFlags.Align( wxALIGN_LEFT ); poSzr->Add( &m_oBtnCancel, oFlags ); poSzr->SetSizeHints( poPnl ); oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxBOTTOM, 10 ); GetSizer( )->Add( poPnl, oFlags ); // Set dialogues minimum size and initial size as calculated by the sizer GetSizer( )->SetSizeHints( this ); } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // roCpntSrc - A reference to an independent source component object void DlgNgsCfgSrc::SetValues( CpntNgsIndSrc & roCpntSrc ) { SetEvtHandlerEnabled( FALSE ); m_oPnlSinOffset .bSetValue( roCpntSrc.m_osSinOffset ); m_oPnlSinAmp .bSetValue( roCpntSrc.m_osSinAmp ); m_oPnlSinFreq .bSetValue( roCpntSrc.m_osSinFreq ); m_oPnlSinDelay .bSetValue( roCpntSrc.m_osSinDelay ); m_oPnlSinDamp .bSetValue( roCpntSrc.m_osSinDamp ); m_oPnlPulInitial.bSetValue( roCpntSrc.m_osPulInitial ); m_oPnlPulMax .bSetValue( roCpntSrc.m_osPulMax ); m_oPnlPulDelay .bSetValue( roCpntSrc.m_osPulDelay ); m_oPnlPulRise .bSetValue( roCpntSrc.m_osPulRise ); m_oPnlPulWidth .bSetValue( roCpntSrc.m_osPulWidth ); m_oPnlPulFall .bSetValue( roCpntSrc.m_osPulFall ); m_oPnlPulPeriod .bSetValue( roCpntSrc.m_osPulPeriod ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // roCpntSrc - A reference to an independent source component object void DlgNgsCfgSrc::GetValues( CpntNgsIndSrc & roCpntSrc ) { SetEvtHandlerEnabled( FALSE ); roCpntSrc.m_osSinOffset = m_oPnlSinOffset .rosGetValue( ); roCpntSrc.m_osSinAmp = m_oPnlSinAmp .rosGetValue( ); roCpntSrc.m_osSinFreq = m_oPnlSinFreq .rosGetValue( ); roCpntSrc.m_osSinDelay = m_oPnlSinDelay .rosGetValue( ); roCpntSrc.m_osSinDamp = m_oPnlSinDamp .rosGetValue( ); roCpntSrc.m_osPulInitial = m_oPnlPulInitial.rosGetValue( ); roCpntSrc.m_osPulMax = m_oPnlPulMax .rosGetValue( ); roCpntSrc.m_osPulDelay = m_oPnlPulDelay .rosGetValue( ); roCpntSrc.m_osPulRise = m_oPnlPulRise .rosGetValue( ); roCpntSrc.m_osPulWidth = m_oPnlPulWidth .rosGetValue( ); roCpntSrc.m_osPulFall = m_oPnlPulFall .rosGetValue( ); roCpntSrc.m_osPulPeriod = m_oPnlPulPeriod .rosGetValue( ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Set the source component name. // // Argument List : // rosName - The name of the source component // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgSrc::bSetName( wxString & rosName ) { eCpntType eCpnt; eCpnt = Component::eGetCpntType( rosName ); if( eCpnt!=eCPNT_IVS && eCpnt!=eCPNT_ICS ) return( FALSE ); m_oCpntIndSrc.m_eType = eCpnt; m_oCpntIndSrc.m_osName = rosName; return( TRUE ); } //***************************************************************************** // Reset all dialog settings to defaults. // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgSrc::bClear( void ) { m_oCpntIndSrc.bClear( ); SetValues( m_oCpntIndSrc ); return( TRUE ); } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // roCpntSrc - A reference to an independent source component object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgSrc::bSetValues( CpntNgsIndSrc & roCpntSrc ) { SetValues( roCpntSrc ); m_oCpntIndSrc = roCpntSrc; return( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // roCpntSrc - A reference to an independent source component object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgSrc::bGetValues( CpntNgsIndSrc & roCpntSrc ) { GetValues( roCpntSrc ); return( TRUE ); } //***************************************************************************** // // Event Handlers // //***************************************************************************** // OK button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgNgsCfgSrc::OnBtnOk( wxCommandEvent & roEvtCmd ) { GetValues( m_oCpntIndSrc ); EndModal( wxID_OK ); } //***************************************************************************** // Clear button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgNgsCfgSrc::OnBtnClear( wxCommandEvent & roEvtCmd ) { CpntNgsIndSrc oCpntIndSrc; oCpntIndSrc.bClear( ); SetValues( oCpntIndSrc ); } //***************************************************************************** // Cancel button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgNgsCfgSrc::OnBtnCancel( wxCommandEvent & roEvtCmd ) { SetValues( m_oCpntIndSrc ); EndModal( wxID_CANCEL ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/dialogs/DlgNgsCfgOPT.hpp0000644000000000000000000001213011412210453021536 0ustar rootroot//***************************************************************************** // DlgNgsCfgOPT.hpp * // ------------------ * // Description : This dialogue is used to enter values associated with the * // NG-Spice OPTIONS command. * // Started : 03/03/2006 * // Last Update : 16/04/2010 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef DLGNGSCFGOPT_HPP #define DLGNGSCFGOPT_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "utility/PnlValue.hpp" #include "ngspice/commands/CmdNgSpiceOPT.hpp" // Local Constant Declarations //***************************************************************************** class DlgNgsCfgOPT : public wxDialog { private : // Value panel controls PnlValue m_oPnlABSTOL; // Absolute current error tolerance PnlValue m_oPnlCHGTOL; // Charge tolerance PnlValue m_oPnlDEFAD; // MOS drain diffusion area PnlValue m_oPnlDEFAS; // MOS source diffusion area PnlValue m_oPnlDEFL; // MOS channel length PnlValue m_oPnlDEFW; // MOS channel width PnlValue m_oPnlGMIN; // Minimum allowable conductance PnlValue m_oPnlITL1; // DC iteration limit PnlValue m_oPnlITL2; // DC transfer curve iteration limit PnlValue m_oPnlITL4; // TR analysis timepoint iteration limit PnlValue m_oPnlPIVREL; // Relative ratio between largest column entry & an acceptable pivot value PnlValue m_oPnlPIVTOL; // Abs. min. value for matrix entry as pivot PnlValue m_oPnlRELTOL; // Relative error tolerance PnlValue m_oPnlTEMP; // Operating temp. of circuit PnlValue m_oPnlTNOM; // Nom. temp. at which device parameters msr'd PnlValue m_oPnlTRTOL; // TR error tolerance PnlValue m_oPnlVNTOL; // Abs. voltage error tolerance wxCheckBox m_oCbxBADMOS3; // Use MOS3 model with "kappa" discontinuity wxLabel m_oLblMETHOD; // Numerical integration method wxChoice m_oChoMETHOD; // Button controls wxButton m_oBtnOk; wxButton m_oBtnCancel; wxButton m_oBtnDefaults; // Storage for validated OPTION values CmdNgSpiceOPT m_oCmdOPT; // Object initialization functions void Initialize( void ); void Create ( void ); void ToolTips ( void ); void DoLayout ( void ); PnlValue * poGetPanel( int iPnlID ); void SetValues( CmdNgSpiceOPT & roCmdOPT ); void GetValues( CmdNgSpiceOPT & roCmdOPT ); public : DlgNgsCfgOPT( wxWindow * poWin ); ~DlgNgsCfgOPT( ); bool bClear( void ); bool bSetValues( CmdNgSpiceOPT & roCmdOPT ); bool bGetValues( CmdNgSpiceOPT & roCmdOPT ); bool bSetValue( int iPnlID, const wxString & rosValue ); const wxString & rosGetValue( int iPnlID ); // Event handlers void OnBtnOk ( wxCommandEvent & roEvtCmd ); void OnBtnDefaults( wxCommandEvent & roEvtCmd ); void OnBtnCancel ( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eDlgItemID { ID_PNL_ABSTOL = 0, ID_PNL_CHGTOL, ID_PNL_DEFAD, ID_PNL_DEFAS, ID_PNL_DEFL, ID_PNL_DEFW, ID_PNL_GMIN, ID_PNL_ITL1, ID_PNL_ITL2, ID_PNL_ITL4, ID_PNL_PIVREL, ID_PNL_PIVTOL, ID_PNL_RELTOL, ID_PNL_TEMP, ID_PNL_TNOM, ID_PNL_TRTOL, ID_PNL_VNTOL, ID_CBX_BADMOS3, ID_CHO_METHOD, ID_BTN_OK, ID_BTN_DEFAULTS, ID_BTN_CANCEL, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_PNL_ABSTOL, ID_LST = ID_BTN_CANCEL }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // DLGNGSCFGOPT_HPP gspiceui-1.0.00+dfsg/src/ngspice/dialogs/DlgNgsCfgOPT.cpp0000644000000000000000000005257211563063437021566 0ustar rootroot//***************************************************************************** // DlgNgsCfgOPT.cpp * // ------------------ * // Started : 03/03/2006 * // Last Update : 04/03/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/dialogs/DlgNgsCfgOPT.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( DlgNgsCfgOPT, wxDialog ) EVT_BUTTON( ID_BTN_OK, DlgNgsCfgOPT::OnBtnOk ) EVT_BUTTON( ID_BTN_DEFAULTS, DlgNgsCfgOPT::OnBtnDefaults ) EVT_BUTTON( ID_BTN_CANCEL, DlgNgsCfgOPT::OnBtnCancel ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // poWin - A pointer to the dialog parent window DlgNgsCfgOPT::DlgNgsCfgOPT( wxWindow * poWin ) : wxDialog( poWin, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, wxDialogNameStr ) { SetTitle( wxT(" NG-Spice OPTIONS Line Setup") ); Initialize( ); bClear( ); } //***************************************************************************** // Destructor. DlgNgsCfgOPT::~DlgNgsCfgOPT( ) { } //***************************************************************************** // Initialize object attributes. void DlgNgsCfgOPT::Initialize( void ) { // Call all the initialization functions Create( ); ToolTips( ); // Layout the of the display objects DoLayout( ); } //***************************************************************************** // Create the display objects. void DlgNgsCfgOPT::Create( void ) { wxPanel * poPnlLHS, * poPnlRHS, * poPnlRHS_Opts, * poPnlBtns; wxPanel * poPnl1; // Create the necessary panel objects poPnlLHS = new wxPanel( this ); poPnlRHS = new wxPanel( this ); poPnlRHS_Opts = new wxPanel( poPnlRHS ); poPnlBtns = new wxPanel( poPnlRHS ); // Create the PnlValue controls m_oPnlABSTOL.bCreate( poPnlLHS, ID_PNL_ABSTOL, 75 ); m_oPnlCHGTOL.bCreate( poPnlLHS, ID_PNL_CHGTOL, 75 ); m_oPnlDEFAD .bCreate( poPnlLHS, ID_PNL_DEFAD, 75 ); m_oPnlDEFAS .bCreate( poPnlLHS, ID_PNL_DEFAS, 75 ); m_oPnlDEFL .bCreate( poPnlLHS, ID_PNL_DEFL, 75 ); m_oPnlDEFW .bCreate( poPnlLHS, ID_PNL_DEFW, 75 ); m_oPnlGMIN .bCreate( poPnlLHS, ID_PNL_GMIN, 75 ); m_oPnlITL1 .bCreate( poPnlLHS, ID_PNL_ITL1, 75 ); m_oPnlITL2 .bCreate( poPnlLHS, ID_PNL_ITL2, 75 ); m_oPnlITL4 .bCreate( poPnlLHS, ID_PNL_ITL4, 75 ); m_oPnlPIVREL.bCreate( poPnlLHS, ID_PNL_PIVREL, 75 ); m_oPnlPIVTOL.bCreate( poPnlRHS_Opts, ID_PNL_PIVTOL, 75 ); m_oPnlRELTOL.bCreate( poPnlRHS_Opts, ID_PNL_RELTOL, 75 ); m_oPnlTEMP .bCreate( poPnlRHS_Opts, ID_PNL_TEMP, 75 ); m_oPnlTNOM .bCreate( poPnlRHS_Opts, ID_PNL_TNOM, 75 ); m_oPnlTRTOL .bCreate( poPnlRHS_Opts, ID_PNL_TRTOL, 75 ); m_oPnlVNTOL .bCreate( poPnlRHS_Opts, ID_PNL_VNTOL, 75 ); m_oPnlABSTOL.bSetName( wxT("ABSTOL") ); m_oPnlCHGTOL.bSetName( wxT("CHGTOL") ); m_oPnlDEFAD .bSetName( wxT("DEFAD") ); m_oPnlDEFAS .bSetName( wxT("DEFAS") ); m_oPnlDEFL .bSetName( wxT("DEFL") ); m_oPnlDEFW .bSetName( wxT("DEFW") ); m_oPnlGMIN .bSetName( wxT("GMIN") ); m_oPnlITL1 .bSetName( wxT("ITL1") ); m_oPnlITL2 .bSetName( wxT("ITL2") ); m_oPnlITL4 .bSetName( wxT("ITL4") ); m_oPnlPIVREL.bSetName( wxT("PIVREL") ); m_oPnlPIVTOL.bSetName( wxT("PIVTOL") ); m_oPnlRELTOL.bSetName( wxT("RELTOL") ); m_oPnlTEMP .bSetName( wxT("TEMP") ); m_oPnlTNOM .bSetName( wxT("TNOM") ); m_oPnlTRTOL .bSetName( wxT("TRTOL") ); m_oPnlVNTOL .bSetName( wxT("VNTOL") ); m_oPnlTEMP .bSetUnitsType( eUNITS_TEMP ); m_oPnlTNOM .bSetUnitsType( eUNITS_TEMP ); m_oPnlVNTOL .bSetUnitsType( eUNITS_VOLT ); m_oPnlABSTOL.bSetVarType( eVAR_SCI ); m_oPnlCHGTOL.bSetVarType( eVAR_SCI ); m_oPnlDEFAD .bSetVarType( eVAR_SCI ); m_oPnlDEFAS .bSetVarType( eVAR_SCI ); m_oPnlDEFL .bSetVarType( eVAR_SCI ); m_oPnlDEFW .bSetVarType( eVAR_SCI ); m_oPnlGMIN .bSetVarType( eVAR_SCI ); m_oPnlITL1 .bSetVarType( eVAR_INT ); m_oPnlITL2 .bSetVarType( eVAR_INT ); m_oPnlITL4 .bSetVarType( eVAR_INT ); m_oPnlPIVTOL.bSetVarType( eVAR_SCI ); m_oPnlABSTOL.bShowUnits( FALSE ); m_oPnlCHGTOL.bShowUnits( FALSE ); m_oPnlDEFAD .bShowUnits( FALSE ); m_oPnlDEFAS .bShowUnits( FALSE ); m_oPnlDEFL .bShowUnits( FALSE ); m_oPnlDEFW .bShowUnits( FALSE ); m_oPnlGMIN .bShowUnits( FALSE ); m_oPnlITL1 .bShowUnits( FALSE ); m_oPnlITL2 .bShowUnits( FALSE ); m_oPnlITL4 .bShowUnits( FALSE ); m_oPnlPIVREL.bShowUnits( FALSE ); m_oPnlPIVTOL.bShowUnits( FALSE ); m_oPnlRELTOL.bShowUnits( FALSE ); m_oPnlTRTOL .bShowUnits( FALSE ); m_oPnlABSTOL.bSetParms( NGS_ABSTOL, 1.00E-14, 9.99E-10 ); m_oPnlCHGTOL.bSetParms( NGS_CHGTOL, 1.00E-15, 9.99E-09 ); m_oPnlDEFAD .bSetParms( NGS_DEFAD, 1.00E-14, 9.99E-10 ); m_oPnlDEFAS .bSetParms( NGS_DEFAS, 1.00E-14, 9.99E-10 ); m_oPnlDEFL .bSetParms( NGS_DEFL, 1.00E-08, 9.99E-02 ); m_oPnlDEFW .bSetParms( NGS_DEFW, 1.00E-08, 9.99E-02 ); m_oPnlGMIN .bSetParms( NGS_GMIN, 1.00E-14, 9.99E-10 ); m_oPnlPIVTOL.bSetParms( NGS_PIVTOL, 1.00E-15, 9.99E-11 ); m_oPnlTRTOL .bSetParms( NGS_TRTOL, 0.01, 100.0, 0.01, 10.0 ); m_oPnlVNTOL .bSetParms( NGS_VNTOL, 0.00, 1000.0, 0.01, 100.0 ); m_oPnlPIVREL.bSetParms( 100.0 * NGS_PIVREL, 0.01, 100.0, 0.01, 10.0 ); m_oPnlRELTOL.bSetParms( 100.0 * NGS_RELTOL, 0.01, 100.0, 0.01, 10.0 ); m_oPnlITL1 .bSetParms( NGS_ITL1, 0, 1000, 1, 10 ); m_oPnlITL2 .bSetParms( NGS_ITL2, 0, 1000, 1, 10 ); m_oPnlITL4 .bSetParms( NGS_ITL4, 0, 1000, 1, 10 ); m_oPnlABSTOL.bSetUnits( wxT("Amp") ); m_oPnlDEFAD .bSetUnits( wxT("Sq. Meter") ); m_oPnlDEFAS .bSetUnits( wxT("Sq. Meter") ); m_oPnlDEFL .bSetUnits( wxT("Meter") ); m_oPnlDEFW .bSetUnits( wxT("Meter") ); m_oPnlGMIN .bSetUnits( wxT("Ohm") ); m_oPnlPIVREL.bSetUnits( wxT("%") ); m_oPnlRELTOL.bSetUnits( wxT("%") ); // Create the choice box control poPnl1 = new wxPanel( poPnlRHS_Opts ); m_oLblMETHOD.Create( poPnl1, ID_UNUSED, wxT("METHOD"), wxDefaultPosition, wxSize( 80, -1 ), wxST_NO_AUTORESIZE ); m_oChoMETHOD.Create( poPnl1, ID_CHO_METHOD, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoMETHOD.Append( wxT("Trap") ); m_oChoMETHOD.Append( wxT("Gear") ); m_oChoMETHOD.SetSelection( 0 ); // Create the check box control poPnl1 = new wxPanel( poPnlRHS_Opts ); m_oCbxBADMOS3.Create( poPnl1, ID_CBX_BADMOS3, wxT("BADMOS3 \t "), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); // Create the buttons m_oBtnOk .Create( poPnlBtns, ID_BTN_OK, wxT("OK") ); m_oBtnDefaults.Create( poPnlBtns, ID_BTN_DEFAULTS, wxT("Defaults") ); m_oBtnCancel .Create( poPnlBtns, ID_BTN_CANCEL, wxT("Cancel") ); } //***************************************************************************** // Initialize the tool tips. void DlgNgsCfgOPT::ToolTips( void ) { // Define tool tips for each control m_oPnlABSTOL .SetToolTip( wxT("Absolute current error tolerance") ); m_oPnlCHGTOL .SetToolTip( wxT("Charge tolerance") ); m_oPnlDEFAD .SetToolTip( wxT("MOS drain diffusion area") ); m_oPnlDEFAS .SetToolTip( wxT("MOS source diffusion area") ); m_oPnlDEFL .SetToolTip( wxT("MOS channel length") ); m_oPnlDEFW .SetToolTip( wxT("MOS channel width") ); m_oPnlGMIN .SetToolTip( wxT("Minimum allowable conductance") ); m_oPnlITL1 .SetToolTip( wxT("DC iteration limit") ); m_oPnlITL2 .SetToolTip( wxT("DC transfer curve iteration limit") ); m_oPnlITL4 .SetToolTip( wxT("Transient analysis timepoint iteration limit") ); m_oPnlPIVREL .SetToolTip( wxT("Relative ratio between largest column entry and an acceptable pivot value") ); m_oPnlPIVTOL .SetToolTip( wxT("Absolute minimum value for matrix entry as pivot") ); m_oPnlRELTOL .SetToolTip( wxT("Relative error tolerance") ); m_oPnlTEMP .SetToolTip( wxT("Operating temperature of circuit") ); m_oPnlTNOM .SetToolTip( wxT("Nominal temperature at which device parameters measured") ); m_oPnlTRTOL .SetToolTip( wxT("Transient error tolerance") ); m_oPnlVNTOL .SetToolTip( wxT("Absolute voltage error tolerance") ); m_oCbxBADMOS3.SetToolTip( wxT("Use MOS3 model with \"kappa\" discontinuity") ); m_oChoMETHOD.GetParent( )->SetToolTip( wxT("Numerical integration method") ); } //***************************************************************************** // Layout the dialog display objects. void DlgNgsCfgOPT::DoLayout( void ) { wxBoxSizer * poSzrDlg; wxPanel * poPnlLHS, * poPnlRHS, * poPnlRHS_Opts, * poPnlBtns; wxPanel * poPnlMETHOD, * poPnlCbxs; wxBoxSizer * poSzrLHS, * poSzrRHS, * poSzrRHS_Opts, * poSzrBtns; wxBoxSizer * poSzrMETHOD, * poSzrCbxs; wxSizerFlags oFlags; // Get pointers to the various panels poPnlBtns = (wxPanel *) m_oBtnOk .GetParent( ); poPnlLHS = (wxPanel *) m_oPnlABSTOL .GetParent( ); poPnlRHS = (wxPanel *) poPnlBtns ->GetParent( ); poPnlRHS_Opts = (wxPanel *) m_oPnlVNTOL .GetParent( ); poPnlMETHOD = (wxPanel *) m_oChoMETHOD .GetParent( ); poPnlCbxs = (wxPanel *) m_oCbxBADMOS3.GetParent( ); // Create sizers to associate with the panels poSzrDlg = new wxBoxSizer ( wxHORIZONTAL ); poSzrLHS = new wxStaticBoxSizer( wxVERTICAL, poPnlLHS ); poSzrRHS = new wxBoxSizer ( wxVERTICAL ); poSzrRHS_Opts = new wxStaticBoxSizer( wxVERTICAL, poPnlRHS_Opts ); poSzrBtns = new wxBoxSizer ( wxHORIZONTAL ); poSzrMETHOD = new wxBoxSizer ( wxHORIZONTAL ); poSzrCbxs = new wxBoxSizer ( wxVERTICAL ); // Set the sizers to the panels SetSizer( poSzrDlg ); poPnlLHS ->SetSizer( poSzrLHS ); poPnlRHS ->SetSizer( poSzrRHS ); poPnlRHS_Opts->SetSizer( poSzrRHS_Opts ); poPnlBtns ->SetSizer( poSzrBtns ); poPnlMETHOD ->SetSizer( poSzrMETHOD ); poPnlCbxs ->SetSizer( poSzrCbxs ); // Layout the choice control panel oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxTOP | wxBOTTOM, 1 ); poSzrMETHOD->Add( &m_oLblMETHOD, oFlags ); poSzrMETHOD->Add( &m_oChoMETHOD, oFlags ); poSzrMETHOD->SetSizeHints( poPnlMETHOD ); // Layout the check box panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxTOP, 3 ); poSzrCbxs->Add( &m_oCbxBADMOS3, oFlags ); poSzrCbxs->SetSizeHints( poPnlCbxs ); // Layout the left hand panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxLEFT | wxRIGHT | wxTOP, 10 ); poSzrLHS->Add( &m_oPnlABSTOL, oFlags ); oFlags.Border( wxLEFT, 10 ); poSzrLHS->Add( &m_oPnlCHGTOL, oFlags ); poSzrLHS->Add( &m_oPnlDEFAD, oFlags ); poSzrLHS->Add( &m_oPnlDEFAS, oFlags ); poSzrLHS->Add( &m_oPnlDEFL, oFlags ); poSzrLHS->Add( &m_oPnlDEFW, oFlags ); poSzrLHS->Add( &m_oPnlGMIN, oFlags ); poSzrLHS->Add( &m_oPnlITL1, oFlags ); poSzrLHS->Add( &m_oPnlITL2, oFlags ); poSzrLHS->Add( &m_oPnlITL4, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 10 ); poSzrLHS->Add( &m_oPnlPIVREL, oFlags ); poSzrLHS->SetSizeHints( poPnlLHS ); // Layout the right hand options panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxLEFT | wxTOP | wxRIGHT, 10 ); poSzrRHS_Opts->Add( &m_oPnlPIVTOL, oFlags ); oFlags.Border( wxLEFT, 10 ); poSzrRHS_Opts->Add( &m_oPnlRELTOL, oFlags ); poSzrRHS_Opts->Add( &m_oPnlTEMP, oFlags ); poSzrRHS_Opts->Add( &m_oPnlTNOM, oFlags ); poSzrRHS_Opts->Add( &m_oPnlTRTOL, oFlags ); poSzrRHS_Opts->Add( &m_oPnlVNTOL, oFlags ); poSzrRHS_Opts->Add( poPnlMETHOD, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 8 ); poSzrRHS_Opts->Add( poPnlCbxs, oFlags ); poSzrRHS_Opts->SetSizeHints( poPnlRHS_Opts ); // Layout the buttons panel oFlags.Border( wxTOP | wxBOTTOM, 0 ); oFlags.Align( wxALIGN_RIGHT ); poSzrBtns->Add( &m_oBtnOk, oFlags ); poSzrBtns->AddSpacer( 10 ); oFlags.Align( wxALIGN_CENTER ); poSzrBtns->Add( &m_oBtnDefaults, oFlags ); poSzrBtns->AddSpacer( 10 ); oFlags.Align( wxALIGN_LEFT ); poSzrBtns->Add( &m_oBtnCancel, oFlags ); poSzrBtns->SetSizeHints( poPnlBtns ); // Layout the right hand panel oFlags.Align( wxALIGN_TOP ); oFlags.Border( wxALL, 0 ); poSzrRHS->Add( poPnlRHS_Opts, oFlags ); oFlags.Align( wxALIGN_BOTTOM | wxALIGN_CENTER_HORIZONTAL ); oFlags.Border( wxTOP, 60 ); poSzrRHS->Add( poPnlBtns, oFlags ); poSzrRHS->SetSizeHints( poPnlRHS ); // Layout the overall dialog oFlags.Align( wxALIGN_TOP | wxALIGN_CENTER_HORIZONTAL ); oFlags.Border( wxALL, 15 ); GetSizer( )->Add( poPnlLHS, oFlags ); oFlags.Border( wxTOP | wxRIGHT | wxBOTTOM, 15 ); GetSizer( )->Add( poPnlRHS, oFlags ); GetSizer( )->SetSizeHints( this ); } //***************************************************************************** // Get a pointer to a value panel associated with a control ID number. // // Argument List : // iPnlID - The control ID number // // Return Values : // Success - A pointer to the value panel // Failure - NULL PnlValue * DlgNgsCfgOPT::poGetPanel( int iPnlID ) { switch( iPnlID ) { case ID_PNL_ABSTOL : return( &m_oPnlABSTOL ); case ID_PNL_CHGTOL : return( &m_oPnlCHGTOL ); case ID_PNL_DEFAD : return( &m_oPnlDEFAD ); case ID_PNL_DEFAS : return( &m_oPnlDEFAS ); case ID_PNL_DEFL : return( &m_oPnlDEFL ); case ID_PNL_DEFW : return( &m_oPnlDEFW ); case ID_PNL_GMIN : return( &m_oPnlGMIN ); case ID_PNL_ITL1 : return( &m_oPnlITL1 ); case ID_PNL_ITL2 : return( &m_oPnlITL2 ); case ID_PNL_ITL4 : return( &m_oPnlITL4 ); case ID_PNL_PIVREL : return( &m_oPnlPIVREL ); case ID_PNL_PIVTOL : return( &m_oPnlPIVTOL ); case ID_PNL_RELTOL : return( &m_oPnlRELTOL ); case ID_PNL_TEMP : return( &m_oPnlTEMP ); case ID_PNL_TNOM : return( &m_oPnlTNOM ); case ID_PNL_TRTOL : return( &m_oPnlTRTOL ); case ID_PNL_VNTOL : return( &m_oPnlVNTOL ); default : return( NULL ); } } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // rosCmdOPT - A reference to an OPTION command object void DlgNgsCfgOPT::SetValues( CmdNgSpiceOPT & roCmdOPT ) { double df1; int i1; SetEvtHandlerEnabled( FALSE ); m_oPnlABSTOL.bSetValue ( roCmdOPT.m_osABSTOL ); m_oPnlCHGTOL.bSetValue ( roCmdOPT.m_osCHGTOL ); m_oPnlDEFAD .bSetValue ( roCmdOPT.m_osDEFAD ); m_oPnlDEFAS .bSetValue ( roCmdOPT.m_osDEFAS ); m_oPnlDEFL .bSetValue ( roCmdOPT.m_osDEFL ); m_oPnlDEFW .bSetValue ( roCmdOPT.m_osDEFW ); m_oPnlGMIN .bSetValue ( roCmdOPT.m_osGMIN ); m_oPnlITL1 .bSetValue ( roCmdOPT.m_osITL1 ); m_oPnlITL2 .bSetValue ( roCmdOPT.m_osITL2 ); m_oPnlITL4 .bSetValue ( roCmdOPT.m_osITL4 ); m_oPnlPIVTOL.bSetValue ( roCmdOPT.m_osPIVTOL ); m_oPnlTEMP .bSetValue ( roCmdOPT.m_osTEMP ); m_oPnlTNOM .bSetValue ( roCmdOPT.m_osTNOM ); m_oPnlTRTOL .bSetValue ( roCmdOPT.m_osTRTOL ); m_oPnlVNTOL .bSetValue ( roCmdOPT.m_osVNTOL ); ConvertType::bStrToDFlt( roCmdOPT.m_osPIVREL, &df1 ); m_oPnlPIVREL.bSetValue ( df1 * 100.0 ); ConvertType::bStrToDFlt( roCmdOPT.m_osRELTOL, &df1 ); m_oPnlRELTOL.bSetValue ( df1 * 100.0 ); m_oCbxBADMOS3.SetValue ( roCmdOPT.m_bBADMOS3 ); for( i1=0; i1<(int)m_oChoMETHOD.GetCount( ); i1++ ) if( m_oChoMETHOD.GetString( i1 ).IsSameAs( roCmdOPT.m_osMETHOD, FALSE ) ) { m_oChoMETHOD.SetSelection( i1 ); break; } SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // rosCmdOPT - A reference to an OPTION command object void DlgNgsCfgOPT::GetValues( CmdNgSpiceOPT & roCmdOPT ) { SetEvtHandlerEnabled( FALSE ); roCmdOPT.m_osABSTOL = m_oPnlABSTOL.rosGetValue( ); roCmdOPT.m_osCHGTOL = m_oPnlCHGTOL.rosGetValue( ); roCmdOPT.m_osDEFAD = m_oPnlDEFAD .rosGetValue( ); roCmdOPT.m_osDEFAS = m_oPnlDEFAS .rosGetValue( ); roCmdOPT.m_osDEFL = m_oPnlDEFL .rosGetValue( ); roCmdOPT.m_osDEFW = m_oPnlDEFW .rosGetValue( ); roCmdOPT.m_osGMIN = m_oPnlGMIN .rosGetValue( ); roCmdOPT.m_osITL1 = m_oPnlITL1 .rosGetValue( ); roCmdOPT.m_osITL2 = m_oPnlITL2 .rosGetValue( ); roCmdOPT.m_osITL4 = m_oPnlITL4 .rosGetValue( ); roCmdOPT.m_osPIVTOL = m_oPnlPIVTOL.rosGetValue( ); roCmdOPT.m_osTEMP = m_oPnlTEMP .rosGetValue( ); roCmdOPT.m_osTNOM = m_oPnlTNOM .rosGetValue( ); roCmdOPT.m_osTRTOL = m_oPnlTRTOL .rosGetValue( ); roCmdOPT.m_osVNTOL = m_oPnlVNTOL .rosGetValue( ); ConvertType::bFltToStr( m_oPnlPIVREL.dfGetValue()/100.0, roCmdOPT.m_osPIVREL ); roCmdOPT.m_osPIVREL.Trim( FALSE ); ConvertType::bFltToStr( m_oPnlRELTOL.dfGetValue()/100.0, roCmdOPT.m_osRELTOL ); roCmdOPT.m_osRELTOL.Trim( FALSE ); roCmdOPT.m_bBADMOS3 = m_oCbxBADMOS3.GetValue( ); roCmdOPT.m_osMETHOD = m_oChoMETHOD.GetStringSelection( ).Upper( ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Set the values in the value panel controls. // // Argument List : // roCmdOPT - A reference to an OPTION command object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgOPT::bSetValues( CmdNgSpiceOPT & roCmdOPT ) { SetValues( roCmdOPT ); m_oCmdOPT = roCmdOPT; return( TRUE ); } //***************************************************************************** // Get the values from the value panel controls. // // Argument List : // roCmdOPT - A reference to an OPTION command object // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgOPT::bGetValues( CmdNgSpiceOPT & roCmdOPT ) { GetValues( roCmdOPT ); return( TRUE ); } //***************************************************************************** // Reset all dialog settings to defaults. // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgOPT::bClear( void ) { m_oCmdOPT.bSetDefaults( ); SetValues( m_oCmdOPT ); return( TRUE ); } //***************************************************************************** // Get a value panel control's value. // // Argument List : // iPnlID - Value panel control identifier // // Return Values : // Success - The panel value // Failure - An empty string const wxString & DlgNgsCfgOPT::rosGetValue( int iPnlID ) { static wxString osEmpty; PnlValue * poPnlValue; poPnlValue = poGetPanel( iPnlID ); if( poPnlValue == NULL ) return( osEmpty ); return( poPnlValue->rosGetValue( ) ); } //***************************************************************************** // Set a value panel control's value. // // Argument List : // iPnlID - Value panel control identifier // rosValue - The value to set // // Return Values : // TRUE - Success // FALSE - Failure bool DlgNgsCfgOPT::bSetValue( int iPnlID, const wxString & rosValue ) { PnlValue * poPnlValue; // Get a pointer to the appropriate value panel poPnlValue = poGetPanel( iPnlID ); if( poPnlValue == NULL ) return( FALSE ); // Set the panel value if( ! poPnlValue->bSetValue( rosValue ) ) return( FALSE ); // Update the OPTIONS command object GetValues( m_oCmdOPT ); return( TRUE ); } //***************************************************************************** // // Event Handlers // //***************************************************************************** // Ok button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgNgsCfgOPT::OnBtnOk( wxCommandEvent & roEvtCmd ) { GetValues( m_oCmdOPT ); EndModal( wxID_OK ); } //***************************************************************************** // Defaults button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgNgsCfgOPT::OnBtnDefaults( wxCommandEvent & roEvtCmd ) { CmdNgSpiceOPT oCmdOPT; oCmdOPT.bSetDefaults( ); SetValues( oCmdOPT ); } //***************************************************************************** // Cancel button event handler. // // Argument List : // roEvtCmd - An object holding information about the event (not used) void DlgNgsCfgOPT::OnBtnCancel( wxCommandEvent & roEvtCmd ) { SetValues( m_oCmdOPT ); EndModal( wxID_CANCEL ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/panels/0000755000000000000000000000000011631255517016524 5ustar rootrootgspiceui-1.0.00+dfsg/src/ngspice/panels/PnlNgSpiceTR.cpp0000644000000000000000000002223711567553552021516 0ustar rootroot//***************************************************************************** // PnlNgSpiceTR.cpp * // ------------------ * // Started : 05/08/2004 * // Last Update : 21/03/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/panels/PnlNgSpiceTR.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlNgSpiceTR, PnlAnaBase ) EVT_CHOICE( ID_CHO_SRCNAME, PnlNgSpiceTR::OnChoSrcName ) EVT_BUTTON( ID_BTN_SETUP, PnlNgSpiceTR::OnBtnSetup ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlNgSpiceTR::PnlNgSpiceTR( wxWindow * poWin ) : PnlAnaBase( poWin ), m_oDlgCfgSrc( poWin ) { bSetSimrEng( eSIMR_NGSPICE ); bSetAnaType( eCMD_TR ); Create( ); // Create the analysis panel bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlNgSpiceTR::~PnlNgSpiceTR( ) { } //***************************************************************************** // Create the display objects. void PnlNgSpiceTR::Create( void ) { wxStaticBox * poSbxSigSrc; #ifndef LAYOUT_MNGR int ix, iy; // Set the frequency sweep parameter labels m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 167 ); m_oSbxSwpPars.SetLabel( wxT(" Time Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Time") ); m_oPnlStop .bSetName( wxT("Stop Time") ); m_oPnlStep .bSetName( wxT("Step Increment") ); // Set sweep parameter units m_oPnlStart.bSetUnitsType( eUNITS_TIME ); m_oPnlStop .bSetUnitsType( eUNITS_TIME ); m_oPnlStep .bSetUnitsType( eUNITS_TIME ); // Create and add generator controls poSbxSigSrc = new wxStaticBox( this, ID_UNUSED, wxT(" Signal Source "), wxPoint( 6, 175 ), wxSize( 235, 55 ) ); m_oChoSrcName.Create( this, ID_CHO_SRCNAME, wxPoint( 18, 195 ), wxSize( 107, -1 ) ); m_oBtnSetup .Create( this, ID_BTN_SETUP, wxT("Setup ..."), wxPoint( 130, 195 ), wxSize( 100, 29 ) ); poSbxSigSrc->SetOwnFont( FONT_SLANT ); PnlAnaBase::CreateInitC( ); // Create and add the initial conditions controls PnlAnaBase::CreateTemp( ); // Create the analysis temperature controls // Disable the checkboxes for the parameters NG-Spice cannot calculate m_oCbxCurrent.Disable( ); m_oCbxPower .Disable( ); m_oCbxResist .Disable( ); } //***************************************************************************** // Clear the object attributes. // // Return Values: // TRUE - Success // FALSE - Failure bool PnlNgSpiceTR::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set the sweep parameters to their defaults m_oPnlStart.bSetValue( (float) 0.0 ); m_oPnlStep .bSetValue( (float) 1.0 ); m_oPnlStart.bSetUnits( wxT("msec") ); m_oPnlStop .bSetUnits( wxT("msec") ); m_oPnlStep .bSetUnits( wxT("msec") ); // Set default initial condition values if( ! bSetInitC( eINITC_WARM ) ) bRtn = FALSE; // Set input source default values m_oChoSrcName.Clear( ); m_oChoSrcName.Append( wxT("None") ); m_oChoSrcName.SetSelection( 0 ); // Clear the generator dialog m_oDlgCfgSrc.bClear( ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceTR::bLoad( SimnNgSpice & roSimn ) { bool bRtn=TRUE; // Load the components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VI") ); // Go no further if the TR command isn't valid if( ! roSimn.m_oCmdTR.bIsValid( ) ) return( FALSE ); // Set the source component name if( ! PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ) ) bRtn = FALSE; // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdTR.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdTR.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdTR.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); // Set the initial conditions if( ! bSetInitC( (eInitCType) roSimn.m_oCmdTR.m_eInitC ) ) bRtn = FALSE; // Set the initial state of the source setup dialog m_oDlgCfgSrc.bSetValues( roSimn.m_oCpntIndSrc ); // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdOPT.m_osTEMP ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // (Prior to it being passed to a simulator object.) // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceTR::bSave( SimnNgSpice & roSimn ) { wxString os1; m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdTR.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdTR.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdTR.m_osStep = m_oPnlStep .rosGetValue( ); // Set the initial conditions roSimn.m_oCmdTR.m_eInitC = (eInitCType) m_oRbxInitC.GetSelection( ); // Set the component to be used as a signal source if( m_oChoSrcName.GetStringSelection( ) != wxT("None") ) { // Get the unmodified signal source component os1 = m_oChoSrcName.GetStringSelection( ); (Component &) roSimn.m_oCpntIndSrc = roSimn.roGetCpnt( os1 ); // Add the modifications from the independent source configuration dialog m_oDlgCfgSrc.bGetValues( roSimn.m_oCpntIndSrc ); if( roSimn.m_oCpntIndSrc.bFormat( ) ) roSimn.m_oCpntSwpSrc = roSimn.m_oCpntIndSrc; else { os1 = wxT("The signal source ") + roSimn.m_oCpntIndSrc.rosGetErrMsg( ) + wxT(". "); SetErrMsg( os1 ); } } else { roSimn.m_oCpntSwpSrc.bClear( ); roSimn.m_oCpntIndSrc.bClear( ); } // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_TR; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Set the analysis temperature roSimn.m_oCmdOPT.m_osTEMP = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdTR.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdTR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdTR.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Generator component choice control event handler. // // Argument List: // roEvtCmd - An object holding information about the event void PnlNgSpiceTR::OnChoSrcName( wxCommandEvent & roEvtCmd ) { wxString os1; // Permit the base class to process this event as well roEvtCmd.Skip( ); if( m_oChoSrcName.GetStringSelection( ) != wxT("None") ) { os1 = m_oChoSrcName.GetStringSelection( ); m_oDlgCfgSrc.bSetName( os1 ); } } //***************************************************************************** // Generator component setup button control event handler. // // Argument List: // roEvtCmd - An object holding information about the event void PnlNgSpiceTR::OnBtnSetup( wxCommandEvent & roEvtCmd ) { m_oDlgCfgSrc.CenterOnParent( ); m_oDlgCfgSrc.ShowModal( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/panels/PnlNgSpiceAC.cpp0000644000000000000000000002634211631150075021436 0ustar rootroot//***************************************************************************** // PnlNgSpiceAC.cpp * // ------------------ * // Started : 04/08/2004 * // Last Update : 10/03/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/panels/PnlNgSpiceAC.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlNgSpiceAC, PnlAnaBase ) EVT_RADIOBOX( ID_RBX_SCALE, PnlNgSpiceAC::OnScale ) EVT_CHOICE ( ID_CHO_SRCNAME, PnlNgSpiceAC::OnSrcName ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlNgSpiceAC::PnlNgSpiceAC( wxWindow * poWin ) : PnlAnaBase( poWin ) { bSetSimrEng( eSIMR_NGSPICE ); bSetAnaType( eCMD_AC ); Create( ); // Create the analysis panel bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlNgSpiceAC::~PnlNgSpiceAC( ) { } //***************************************************************************** // Create the display objects. void PnlNgSpiceAC::Create( void ) { #ifndef LAYOUT_MNGR int ix, iy; // Set the frequency sweep parameter labels m_oSbxSwpPars.GetSize( &ix, &iy ); m_oSbxSwpPars.SetSize( ix, 167 ); m_oSbxSwpPars.SetLabel( wxT(" AC Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Frequency") ); m_oPnlStop .bSetName( wxT("Stop Frequency") ); // Set sweep parameter spin control parameters and units m_oPnlStart.bSetUnitsType( eUNITS_FREQ ); m_oPnlStop .bSetUnitsType( eUNITS_FREQ ); m_oPnlStep .bSetVarType( eVAR_INT ); m_oPnlStep .bShowUnits( FALSE ); // Create the scale controls but disable the scale option NG-Spice doesn't // support PnlAnaBase::CreateScale( ); m_oRbxScale.Enable( eSCALE_LOG, FALSE ); PnlAnaBase::CreateCpxPrt( ); // Create the simulation parameter complex part check boxes PnlAnaBase::CreateSrc( ); // Create input source controls PnlAnaBase::CreateTemp( ); // Create the analysis temperature controls // Disable the checkboxes for the parameters NG-Spice cannot calculate m_oCbxCurrent.Disable( ); m_oCbxPower .Disable( ); m_oCbxResist .Disable( ); } //***************************************************************************** // Initialize the step scale. void PnlNgSpiceAC::InitScale( void ) { switch( m_oRbxScale.GetSelection( ) ) { case eSCALE_LIN : m_oPnlStep.bSetName( wxT("Steps in Total") ); m_oPnlStep.bSetParms( 10, 1, 100000, 1, 100 ); break; case eSCALE_DEC : m_oPnlStep.bSetName( wxT("Steps / Decade") ); m_oPnlStep.bSetParms( 10, 1, 10000, 1, 100 ); break; case eSCALE_OCT : m_oPnlStep.bSetName( wxT("Steps / Octave") ); m_oPnlStep.bSetParms( 10, 1, 10000, 1, 100 ); break; default : break; } } //***************************************************************************** // Set the state of the step scale radio box. // // Argument List : // eScale - The enumerated scale specifier // // Return Values : // Success - TRUE // Failure - FALSE bool PnlNgSpiceAC::bSetScale( eScaleType eScale ) { if( eScaleeSCALE_LST ) return( FALSE ); #if wxCHECK_VERSION( 2,8,0 ) if( m_oRbxScale.GetCount( ) < (uint) eScale + 1 ) return( FALSE ); #else if( m_oRbxScale.GetCount( ) < (int) eScale + 1 ) return( FALSE ); #endif m_oRbxScale.SetSelection( (int) eScale ); InitScale( ); return( TRUE ); } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceAC::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set the sweep parameters to their defaults m_oPnlStart.bSetValue( (float) 1.0 ); m_oPnlStep .bSetValue( (float) 10.0 ); m_oPnlStart.bSetUnits( wxT("kHz") ); m_oPnlStop .bSetUnits( wxT("kHz") ); // Set default scale value if( ! bSetScale( eSCALE_DEC ) ) bRtn = FALSE; // Set the complex part check box default values m_oCbxMag .SetValue( TRUE ); m_oCbxPhase.SetValue( FALSE ); m_oCbxReal .SetValue( FALSE ); m_oCbxImag .SetValue( FALSE ); m_oCbxMagDb.SetValue( TRUE ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSim - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceAC::bLoad( SimnNgSpice & roSimn ) { bool bRtn=TRUE; // Load components into the source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VI") ); // Go no further if the AC command isn't valid if( ! roSimn.m_oCmdAC.bIsValid( ) ) return( FALSE ); // Set the source component if( ! PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ) ) bRtn = FALSE; // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdAC.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdAC.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdAC.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); // Set the step scale (do this before setting the sweep step) m_oRbxScale.SetSelection( roSimn.m_oCmdAC.m_eScale ); if( roSimn.eGetAnaType( ) == eCMD_AC ) { // Set the complex parts to derive m_oCbxMag .SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAG ] ); m_oCbxPhase.SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_PHASE ] ); m_oCbxReal .SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_REAL ] ); m_oCbxImag .SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_IMAG ] ); m_oCbxMagDb.SetValue( roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAGDB ] ); } // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdOPT.m_osTEMP ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // // Argument List : // roSimn - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceAC::bSave( SimnNgSpice & roSimn ) { wxString os1; float f1; size_t sz1; bool b1; m_osErrMsg.Empty( ); // Check the start frequency (can't set a frequency of zero so set one as // small as possible, 1.4e-45 is as small as I can go as a float but it will // be converted to a string in engineering units so use 1.0e-15 = 1.0f) ConvertType::bStrToFlt( roSimn.m_oCmdAC.m_osStart, &f1 ); if( f1 == 0.0 ) roSimn.m_oCmdAC.m_osStart = wxT("1.0e-15"); // Set the sweep values roSimn.m_oCmdAC.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdAC.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdAC.m_osStep = m_oPnlStep .rosGetValue( ); // Set the sweep scale roSimn.m_oCmdAC.m_eScale = (eScaleType) m_oRbxScale.GetSelection( ); // Set the sweep source component if( m_oChoSrcName.GetStringSelection( ) == wxT("None") ) SetErrMsg( wxT("No source component has been selected.") ); else if( m_oPnlSrcLvl.dfGetValue( ) == 0.0 ) SetErrMsg( wxT("Signal source component value of zero is not permitted.") ); else { os1 = m_oChoSrcName.GetStringSelection( ); roSimn.m_oCpntSwpSrc = roSimn.NetList::roGetCpnt( os1 ); os1 = wxT("AC ") + m_oPnlSrcLvl.rosGetValue( ); roSimn.m_oCpntSwpSrc.bSetValue( os1 ); } // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_AC; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Store the complex parts of the parameters to derive roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAG ] = m_oCbxMag .GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_PHASE ] = m_oCbxPhase.GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_REAL ] = m_oCbxReal .GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_IMAG ] = m_oCbxImag .GetValue( ); roSimn.m_oCmdPR.m_bCpxPrts[ eCPX_MAGDB ] = m_oCbxMagDb.GetValue( ); // Set the analysis temperature roSimn.m_oCmdOPT.m_osTEMP = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdAC.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdAC.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdAC.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); for( sz1=eCPX_MAG, b1=FALSE; sz1<=eCPX_IMAG; sz1++ ) if( roSimn.m_oCmdPR.m_bCpxPrts[ sz1 ] ) b1 = TRUE; if( ! b1 ) SetErrMsg( wxT("No complex parts have been selected.") ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Step scale radio box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlNgSpiceAC::OnScale( wxCommandEvent & roEvtCmd ) { InitScale( ); } //***************************************************************************** // Source component choice box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlNgSpiceAC::OnSrcName( wxCommandEvent & roEvtCmd ) { wxString os1; // Permit the base class to process this event as well roEvtCmd.Skip( ); // Set the units type os1 = m_oChoSrcName.GetStringSelection( ); m_oPnlSrcLvl.bSetUnitsType( Component::eGetUnitsType( os1 ) ); // Set the source value if( m_oChoSrcName.GetStringSelection( ) == wxT("None") ) m_oPnlSrcLvl.bSetValue( (double) 0.0 ); else if( m_oPnlSrcLvl.dfGetValue( ) == 0.0 ) m_oPnlSrcLvl.bSetValue( (double) 1.0 ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/ngspice/panels/PnlNgSpiceDC.hpp0000644000000000000000000000600311412403734021436 0ustar rootroot//***************************************************************************** // PnlNgSpiceDC.hpp * // ------------------ * // Description : This class derives from the PnlAnaBase base class and * // provides a GUI for a user to configure a DC Analysis for * // NG-Spice electronic circuit simulator. * // Started : 08/05/2004 * // Last Update : 16/04/2010 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLNGSPICEDC_HPP #define PNLNGSPICEDC_HPP // System Includes // wxWidgets Library Includes // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnNgSpice.hpp" // Local Constant Declarations //***************************************************************************** class PnlNgSpiceDC : public PnlAnaBase { public : // Enumerated type for specifying the sweep type enum eSweepType { eSWP_CPNT = 0, eSWP_TEMP, eSWP_FST = eSWP_CPNT, eSWP_LST = eSWP_TEMP }; private : // Sweep type wxRadioBox m_oRbxSwpType; // Sweep source wxLabel m_oLblSrcCpnt; void Create( void ); void InitSwpType( void ); void InitSwpUnits( void ); public : PnlNgSpiceDC( wxWindow * poWin ); ~PnlNgSpiceDC( ); bool bClear( void ); bool bLoad( SimnNgSpice & roSimn ); bool bSave( SimnNgSpice & roSimn ); // Event handlers void OnSwpType( wxCommandEvent & roEvtCmd ); void OnSrcName( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum ePnlItemID { ID_RBX_SWPTYPE = PnlAnaBase::ID_LST+1, ID_UNUSED, ID_FST = ID_RBX_SWPTYPE, ID_LST = ID_RBX_SWPTYPE }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLNGSPICEDC_HPP gspiceui-1.0.00+dfsg/src/ngspice/panels/PnlNgSpiceAC.hpp0000644000000000000000000000470511412403734021442 0ustar rootroot//***************************************************************************** // PnlNgSpiceAC.hpp * // ------------------ * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a AC Analysis for * // NG-Spice electronic circuit simulator. * // Started : 04/08/2004 * // Last Update : 30/06/2009 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLNGSPICEAC_HPP #define PNLNGSPICEAC_HPP // System Includes // wxWidgets Library Includes // Application Includes #include "base/PnlAnaBase.hpp" #include "netlist/SimnNgSpice.hpp" // Local Constant Declarations //***************************************************************************** class PnlNgSpiceAC : public PnlAnaBase { private : void Create( void ); void InitScale( void ); bool bSetScale( eScaleType eScale ); public : PnlNgSpiceAC( wxWindow * poWin ); ~PnlNgSpiceAC( ); bool bClear( void ); bool bLoad( SimnNgSpice & roSimn ); bool bSave( SimnNgSpice & roSimn ); // Event handlers void OnScale ( wxCommandEvent & roEvtCmd ); void OnSrcName( wxCommandEvent & roEvtCmd ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLNGSPICEAC_HPP gspiceui-1.0.00+dfsg/src/ngspice/panels/PnlNgSpiceTR.hpp0000644000000000000000000000541111412210454021472 0ustar rootroot//***************************************************************************** // PnlNgSpiceTR.hpp * // ------------------ * // Description : This class derives from the Analysis Panel base class and * // provides a GUI for a user to configure a Transient Analysis * // for NG-Spice electronic circuit simulator. * // Started : 05/08/2004 * // Last Update : 30/06/2009 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLNGSPICETR_HPP #define PNLNGSPICETR_HPP // System Includes #include // wxWidgets Library Includes // Application Includes #include "TypeDefs.hpp" #include "base/PnlAnaBase.hpp" #include "netlist/SimnNgSpice.hpp" #include "ngspice/dialogs/DlgNgsCfgSrc.hpp" // Local Constant Declarations //***************************************************************************** class PnlNgSpiceTR : public PnlAnaBase { private : // Signal source configuration controls wxButton m_oBtnSetup; DlgNgsCfgSrc m_oDlgCfgSrc; void Create( void ); public : PnlNgSpiceTR( wxWindow * poWin ); ~PnlNgSpiceTR( ); bool bClear( void ); bool bLoad( SimnNgSpice & roSimn ); bool bSave( SimnNgSpice & roSimn ); // Event handlers void OnChoSrcName( wxCommandEvent & roEvtCmd ); void OnBtnSetup ( wxCommandEvent & roEvtCmd ); // Unique display control identifiers enum ePnlItemID { ID_BTN_SETUP = PnlAnaBase::ID_LST+1, ID_UNUSED, ID_FST = ID_BTN_SETUP, ID_LST = ID_BTN_SETUP }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLNGSPICETR_HPP gspiceui-1.0.00+dfsg/src/ngspice/panels/PnlNgSpiceDC.cpp0000644000000000000000000002425711631255517021453 0ustar rootroot//***************************************************************************** // PnlNgSpiceDC.cpp * // ------------------ * // Started : 08/05/2004 * // Last Update : 06/09/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "ngspice/panels/PnlNgSpiceDC.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlNgSpiceDC, PnlAnaBase ) EVT_CHOICE ( ID_CHO_SRCNAME, PnlNgSpiceDC::OnSrcName ) EVT_RADIOBOX( ID_RBX_SWPTYPE, PnlNgSpiceDC::OnSwpType ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlNgSpiceDC::PnlNgSpiceDC( wxWindow * poWin ) : PnlAnaBase( poWin ) { bSetSimrEng( eSIMR_NGSPICE ); bSetAnaType( eCMD_DC ); Create( ); // Create the analysis panel InitSwpUnits( ); // Initialize the sweep units bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlNgSpiceDC::~PnlNgSpiceDC( ) { } //***************************************************************************** // Create the display objects. void PnlNgSpiceDC::Create( void ) { // Set the sweep parameter labels #ifndef LAYOUT_MNGR m_oSbxSwpPars.SetLabel( wxT(" DC Sweep ") ); #endif // LAYOUT_MNGR m_oPnlStart .bSetName( wxT("Start Value") ); m_oPnlStop .bSetName( wxT("Stop Value") ); m_oPnlStep .bSetName( wxT("Step Increment") ); // Create and add input source controls m_oLblSrcCpnt.Create( this, ID_UNUSED, wxT("Signal Source"), wxPoint( 18, 176 ) ); m_oChoSrcName.Create( this, ID_CHO_SRCNAME, wxPoint( 144, 171 ), wxSize( 110, 29 ) ); // Create and add the sweep type radio buttons wxString osSwpType[ 2 ] = { wxT("Source"), wxT("Temp.C ") }; m_oRbxSwpType.Create( this, ID_RBX_SWPTYPE, wxT(" Sweep Type "), wxPoint( 13, 123 ), wxDefaultSize, 2, osSwpType, 2 ); m_oRbxSwpType.SetSelection( eSWP_CPNT ); // Note : The following controls must have been created prior to call the next // line : m_oLblSrcCpnt, m_oChoSrcCpnt InitSwpType( ); PnlAnaBase::CreateTemp( ); // Create the analysis temperature controls // Disable the checkboxes for the parameters NG-Spice cannot calculate m_oCbxCurrent.Disable( ); m_oCbxPower .Disable( ); m_oCbxResist .Disable( ); } //***************************************************************************** // Initialize the sweep type. void PnlNgSpiceDC::InitSwpType( void ) { #ifndef LAYOUT_MNGR int ix, iy; m_oSbxSwpPars.GetSize( &ix, &iy ); switch( (eSweepType) m_oRbxSwpType.GetSelection( ) ) { case eSWP_CPNT : // Component sweep m_oSbxSwpPars.SetSize( ix, 201 ); m_oLblSrcCpnt.Show( TRUE ); m_oChoSrcName.Show( TRUE ); m_oSbxTemp .Show( TRUE ); m_oPnlTemp .Show( TRUE ); InitSwpUnits( ); break; case eSWP_TEMP : // Temperature sweep m_oSbxSwpPars.SetSize( ix, 167 ); m_oLblSrcCpnt.Show( FALSE ); m_oChoSrcName.Show( FALSE ); m_oSbxTemp .Show( FALSE ); m_oPnlTemp .Show( FALSE ); InitSwpUnits( ); break; default : break; } #endif // LAYOUT_MNGR } //***************************************************************************** // Initialize the sweep parameter units. void PnlNgSpiceDC::InitSwpUnits( void ) { wxString os1; eUnitsType eUnits; if( m_oRbxSwpType.GetSelection( ) == 0 ) { os1 = m_oChoSrcName.GetStringSelection( ); eUnits = Component::eGetUnitsType( os1 ); switch( eUnits ) { case eUNITS_VOLT : // Units of voltage os1 = wxT("Voltage"); break; case eUNITS_CURR : // Units of current os1 = wxT("Current"); break; case eUNITS_RES : // Units of resistance os1 = wxT("Resistance"); break; default : // No units os1 = wxT("Value"); } } else { os1 = wxT("Temperature"); eUnits = eUNITS_TEMP; } m_oPnlStart.bSetName( wxString( wxT("Start ") ) + os1 ); m_oPnlStop .bSetName( wxString( wxT("Stop ") ) + os1 ); m_oPnlStart.bSetUnitsType( eUnits ); m_oPnlStop .bSetUnitsType( eUnits ); m_oPnlStep .bSetUnitsType( eUnits ); } //***************************************************************************** // Clear the object attributes. // // Return Values: // TRUE - Success // FALSE - Failure bool PnlNgSpiceDC::bClear( void ) { bool bRtn=TRUE; // Clear the base class if( ! PnlAnaBase::bClear( ) ) bRtn = FALSE; // Set the sweep parameters to their defaults m_oPnlStart.bSetValue( (float) 0.0 ); m_oPnlStop .bSetValue( (float) 100.0 ); m_oPnlStep .bSetValue( (float) 10.0 ); // Set the default sweep type m_oRbxSwpType.SetSelection( eSWP_CPNT ); InitSwpType( ); // Set sweep default values m_oChoSrcName.Clear( ); m_oChoSrcName.Append( wxT("None") ); m_oChoSrcName.SetSelection( 0 ); return( bRtn ); } //***************************************************************************** // Load information from a simulation object. // // Argument List : // roSim - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceDC::bLoad( SimnNgSpice & roSimn ) { bool bRtn=TRUE; // Load components into the signal source choice box PnlAnaBase::LoadSrcNames( roSimn.m_oaCpnts, wxT("VIR") ); // Go no further if the DC command isn't valid if( ! roSimn.m_oCmdDC.bIsValid( ) ) return( FALSE ); // Set the source component PnlAnaBase::bSetSrcCpnt( roSimn.m_oCpntSwpSrc ); InitSwpUnits( ); // Set the sweep parameter units // Set the sweep values if( ! m_oPnlStart.bSetValue( roSimn.m_oCmdDC.m_osStart ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetValue( roSimn.m_oCmdDC.m_osStop ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetValue( roSimn.m_oCmdDC.m_osStep ) ) bRtn = FALSE; if( m_oPnlStart.dfGetValue( ) == 0.0 ) m_oPnlStart.bSetUnits( m_oPnlStop.rosGetUnits( ) ); // Set the sweep type and source component if required if( roSimn.m_oCmdDC.m_osSource == wxT("TEMP") ) m_oRbxSwpType.SetSelection( eSWP_TEMP ); else m_oRbxSwpType.SetSelection( eSWP_CPNT ); InitSwpType( ); // Set the analysis temperature if( ! m_oPnlTemp.bSetValue( roSimn.m_oCmdOPT.m_osTEMP ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Save information to a simulation object. // (Prior to it being passed to a simulator object.) // // Argument List : // roSim - A simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PnlNgSpiceDC::bSave( SimnNgSpice & roSimn ) { m_osErrMsg.Empty( ); // Set the sweep values roSimn.m_oCmdDC.m_osStart = m_oPnlStart.rosGetValue( ); roSimn.m_oCmdDC.m_osStop = m_oPnlStop .rosGetValue( ); roSimn.m_oCmdDC.m_osStep = m_oPnlStep .rosGetValue( ); // Set the sweep source (a sweep source is not compulsary for a DC analysis) roSimn.m_oCmdDC.m_osSource = wxT(""); switch( m_oRbxSwpType.GetSelection( ) ) { case eSWP_CPNT : if( m_oChoSrcName.GetStringSelection( ) != wxT("None") ) roSimn.m_oCmdDC.m_osSource = m_oChoSrcName.GetStringSelection( ); break; case eSWP_TEMP : roSimn.m_oCmdDC.m_osSource = wxT("TEMP"); break; } roSimn.m_oCpntSwpSrc.bClear( ); // Set the analysis type roSimn.m_oCmdPR.m_eAnaType = eCMD_DC; // Store the parameters to derive roSimn.m_oCmdPR.m_bParmtrs[ ePAR_VLT ] = m_oCbxVoltage.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_CUR ] = m_oCbxCurrent.GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_PWR ] = m_oCbxPower .GetValue( ); roSimn.m_oCmdPR.m_bParmtrs[ ePAR_RES ] = m_oCbxResist .GetValue( ); // Set the analysis temperature roSimn.m_oCmdOPT.m_osTEMP = m_oPnlTemp.rosGetValue( ); // Create the command strings roSimn.m_oCmdDC.bFormat( ); roSimn.m_oCmdPR.bFormat( ); // Check for errors if( ! roSimn.m_oCmdDC.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdDC.rosGetErrMsg( ) ); if( ! roSimn.m_oCmdPR.bIsValid( ) ) SetErrMsg( roSimn.m_oCmdPR.rosGetErrMsg( ) ); return( bIsOk( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Sweep type radio box event handler. // // Argument List: // roEvtCmd - An object holding information about the event void PnlNgSpiceDC::OnSwpType( wxCommandEvent & roEvtCmd ) { InitSwpType( ); } //***************************************************************************** // Source component choice box event handler. // // Argument List: // roEvtCmd - An object holding information about the event void PnlNgSpiceDC::OnSrcName( wxCommandEvent & roEvtCmd ) { InitSwpUnits( ); // Permit the base class to process this event as well roEvtCmd.Skip( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/netlist/0000755000000000000000000000000011624211155015264 5ustar rootrootgspiceui-1.0.00+dfsg/src/netlist/NetList.hpp0000644000000000000000000001110311600370651017354 0ustar rootroot//***************************************************************************** // NetList.hpp * // ------------- * // Description : This class provides an interface to the circuit description * // (netlist) file. The raw netlist data is loaded from file * // into memory and stored as a string array. The individual * // netlist types (component definitions, models, etc.) are * // extracted and stored as object attributes. * // Started : 01/09/2003 * // Last Update : 23/06/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef NETLIST_HPP #define NETLIST_HPP // System Includes using namespace std; #include // wxWidgets Includes #include #include #include #include // Application Includes #include "Version.hpp" #include "TypeDefs.hpp" #include "utility/StrUtils.hpp" #include "netlist/Component.hpp" // Local Constant Declarations //***************************************************************************** struct NetList { protected : // File names static wxFileName m_ofnLoadFile; static wxFileName m_ofnSaveFile; static ArrayFileName m_oaSchemFiles; public : // String array containing the netlist data static wxArrayString m_osaNetLst; // String arrays containing data extracted from the netlist static wxArrayString m_osaTitle; static wxArrayString m_osaIncludes; static ArrayComponent m_oaCpnts; static wxArrayString m_osaModels; static wxArrayString m_osaSubCcts; // String arrays containing node labels only static wxArrayString m_osaNodeLbls; private : static bool m_bIsValid; // Functions to extract information from the circuit description bool bLoadTitle ( void ); bool bLoadIncludes ( void ); bool bLoadCpnts ( void ); bool bLoadModels ( void ); bool bLoadSubCcts ( void ); bool bLoadNodeLbls ( void ); bool bLoadSchemFiles( void ); bool bIsSubCkt( wxString & roLine ); public : NetList( void ); ~NetList( ); virtual bool bClear ( void ); bool bIsEmpty ( void ) { return( m_osaNetLst.IsEmpty( ) ); } virtual bool bValidate( void ); virtual bool bIsValid ( void ) { return( m_bIsValid ); } virtual bool bLoadFile( const wxString & rosFName=wxT("") ); virtual bool bSaveFile( const wxString & rosFName=wxT("") ); bool bSetLoadFile ( const wxString & rosFName ); bool bSetSaveFile ( const wxString & rosFName ); bool bSetSchemFiles( const wxArrayString & rosaFNames ); bool bSetSchemFiles( const wxString & rosFNames ); static const wxFileName & roGetLoadFile( void ) { return( m_ofnLoadFile ); } static const wxFileName & roGetSaveFile( void ) { return( m_ofnSaveFile ); } static const ArrayFileName & roGetSchemFiles( void ) { return( m_oaSchemFiles ); } const wxString & rosGetSchemFiles( void ); const Component & roGetCpnt( const wxString & rosName ); virtual void Print( const wxString & rosPrefix=wxT(" ") ); friend class PrcGnuCap; friend class PrcNgSpice; }; //***************************************************************************** #endif // NETLIST_HPP gspiceui-1.0.00+dfsg/src/netlist/CpntNgsIndSrc.cpp0000644000000000000000000003100111567557555020471 0ustar rootroot//***************************************************************************** // CpntNgsIndSrc.cpp * // ------------------- * // Started : 12/06/2008 * // Last Update : 27/05/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "netlist/CpntNgsIndSrc.hpp" //***************************************************************************** // Constructor. CpntNgsIndSrc::CpntNgsIndSrc( void ) : Component( ) { bClear( ); } //***************************************************************************** // Destructor. CpntNgsIndSrc::~CpntNgsIndSrc( ) { } //***************************************************************************** // Parse the value part of the component definition string. // // Eg. : Vin 3 0 SIN(0 1 100Meg 1ns 1E10) // // Return Values : // TRUE - Success // FALSE - Failure bool CpntNgsIndSrc::bParseValue( void ) { wxStringTokenizer ostk1; size_t szSin, szPulse; size_t sz1, sz2; ClrValues( ); // Find the beginning of the SIN and/or PULSE sections szSin = Component::m_osValue.Upper( ).Find( wxT("SIN(") ); szPulse = Component::m_osValue.Upper( ).Find( wxT("PULSE(") ); if( szSin==wxString::npos && szPulse==wxString::npos ) return( FALSE ); // Extract the sinusoid function parameter values if( szSin != wxString::npos ) { sz1 = Component::m_osValue.find( wxT('('), szSin ); sz2 = Component::m_osValue.find( wxT(')'), szSin ); if( sz1==wxString::npos || sz2==wxString::npos ) return( FALSE ); ostk1.SetString( Component::m_osValue.substr( sz1+1, sz2-sz1-1 ) ); if( ostk1.CountTokens( ) != 5 ) return( FALSE ); m_osSinOffset = ostk1.GetNextToken( ); m_osSinAmp = ostk1.GetNextToken( ); m_osSinFreq = ostk1.GetNextToken( ); m_osSinDelay = ostk1.GetNextToken( ); m_osSinDamp = ostk1.GetNextToken( ); } // Extract the pulse function parameter values if( szPulse != wxString::npos ) { sz1 = Component::m_osValue.find( wxT('('), szPulse ); sz2 = Component::m_osValue.find( wxT(')'), szPulse ); if( sz1==wxString::npos || sz2==wxString::npos ) return( FALSE ); ostk1.SetString( Component::m_osValue.substr( sz1+1, sz2-sz1-1 ) ); if( ostk1.CountTokens( ) != 7 ) return( FALSE ); m_osPulInitial = ostk1.GetNextToken( ); m_osPulMax = ostk1.GetNextToken( ); m_osPulDelay = ostk1.GetNextToken( ); m_osPulRise = ostk1.GetNextToken( ); m_osPulFall = ostk1.GetNextToken( ); m_osPulWidth = ostk1.GetNextToken( ); m_osPulPeriod = ostk1.GetNextToken( ); } return( TRUE ); } //***************************************************************************** // Format the value part of the command string. // // Eg. : Vin 3 0 SIN(0 1 100Meg 1ns 1E10) // // Return Values : // TRUE - Success // FALSE - Failure bool CpntNgsIndSrc::bFormatValue( void ) { float f1; bool b1; m_osValue.Empty( ); f1 = 0.0; b1 = ConvertType::bStrToFlt( m_osSinAmp, &f1 ); if( b1==TRUE && f1!=0.0 ) { // Create the sinusoid function section m_osValue << wxT("SIN( "); m_osValue << m_osSinOffset << wxT(' '); m_osValue << m_osSinAmp << wxT(' '); m_osValue << m_osSinFreq << wxT(' '); m_osValue << m_osSinDelay << wxT(' '); m_osValue << m_osSinDamp << wxT(' '); m_osValue << wxT(')'); } f1 = 0.0; b1 = ConvertType::bStrToFlt( m_osPulMax, &f1 ); if( b1==TRUE && f1!=0.0 ) { // Create the pulse function section if( ! m_osValue.IsEmpty( ) ) m_osValue << wxT(' '); m_osValue << wxT("PULSE( "); m_osValue << m_osPulInitial << wxT(' '); m_osValue << m_osPulMax << wxT(' '); m_osValue << m_osPulDelay << wxT(' '); m_osValue << m_osPulRise << wxT(' '); m_osValue << m_osPulFall << wxT(' '); m_osValue << m_osPulWidth << wxT(' '); m_osValue << m_osPulPeriod << wxT(' '); m_osValue << wxT(')'); } if( m_osValue.IsEmpty( ) ) m_osValue = wxT("0.0"); return( TRUE ); } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CpntNgsIndSrc::bValidate( void ) { double dfSinOffset, dfSinAmp, dfSinFreq, dfSinDelay, dfSinDamp; double dfPulInitial, dfPulMax, dfPulDelay, dfPulRise, dfPulWidth, dfPulFall, dfPulPeriod; // Check the validity of the base component if( ! Component::bValidate( ) ) return( FALSE ); // Check that the component type is valid if( m_eType!=eCPNT_IVS && m_eType!=eCPNT_ICS ) return( FALSE ); // Check the sinusoidal source values dfSinAmp = 0.0; dfSinOffset = 0.0; dfSinFreq = 0.0; dfSinDelay = 0.0; dfSinDamp = 0.0; if( ! ConvertType::bStrToDFlt( m_osSinOffset, &dfSinOffset ) ) bSetErrMsg( wxT("sinusoid offset value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osSinAmp, &dfSinAmp ) ) bSetErrMsg( wxT("sinusoid amplitude value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osSinFreq, &dfSinFreq ) ) bSetErrMsg( wxT("sinusoid frequency value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osSinDelay, &dfSinDelay ) ) bSetErrMsg( wxT("sinusoid delay value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osSinDamp, &dfSinDamp ) ) bSetErrMsg( wxT("sinusoid damping factor is invalid") ); // Check overall sinusoidal source logic if( dfSinFreq>0.0 && dfSinAmp <=0.0 ) bSetErrMsg( wxT("sinusoid amplitude value must be greater than zero") ); if( dfSinAmp >0.0 && dfSinFreq<=0.0 ) bSetErrMsg( wxT("sinusoid frequency must be greater than zero") ); // Check the pulse source values dfPulInitial = 0.0; dfPulMax = 0.0; dfPulDelay = 0.0; dfPulRise = 0.0; dfPulWidth = 0.0; dfPulFall = 0.0; dfPulPeriod = 0.0; if( ! ConvertType::bStrToDFlt( m_osPulInitial, &dfPulInitial ) ) bSetErrMsg( wxT("initial pulse value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulMax, &dfPulMax ) ) bSetErrMsg( wxT("maximum pulse value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulDelay, &dfPulDelay ) ) bSetErrMsg( wxT("pulse delay value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulRise, &dfPulRise ) ) bSetErrMsg( wxT("pulse rise time value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulWidth, &dfPulWidth ) ) bSetErrMsg( wxT("pulse width value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulFall, &dfPulFall ) ) bSetErrMsg( wxT("pulse fall time value is invalid") ); if( ! ConvertType::bStrToDFlt( m_osPulPeriod, &dfPulPeriod ) ) bSetErrMsg( wxT("pulse period value is invalid") ); // Check the pulse time values if( dfPulPeriod < dfPulRise ) bSetErrMsg( wxT("pulse rise time is greater than the period") ); if( dfPulPeriod < dfPulWidth ) bSetErrMsg( wxT("pulse width is greater than the period") ); if( dfPulPeriod < dfPulFall ) bSetErrMsg( wxT("pulse fall time is greater than the period") ); if( dfPulPeriod < dfPulRise+dfPulWidth+dfPulFall ) bSetErrMsg( wxT("pulse period is less then the width") ); // Check the pulse level values if( dfPulInitial > dfPulMax ) bSetErrMsg( wxT("initial pulse value is greater than the maximum value") ); // Check overall pulse source logic if( dfPulPeriod!=0.0 && (dfPulInitial==0.0 && dfPulMax==0.0) ) bSetErrMsg( wxT("pulse timing has been defined but no levels") ); if( dfPulPeriod==0.0 && (dfPulInitial!=0.0 || dfPulMax!=0.0) ) bSetErrMsg( wxT("pulse levels have been defined but no timings") ); return( bIsValid( ) ); } //***************************************************************************** void CpntNgsIndSrc::ClrValues( void ) { m_osSinOffset = NGS_SINOFFSET; m_osSinAmp = NGS_SINAMP; m_osSinFreq = NGS_SINFREQ; m_osSinDelay = NGS_SINDELAY; m_osSinDamp = NGS_SINDAMP; m_osPulInitial = NGS_PULINITIAL; m_osPulMax = NGS_PULMAX; m_osPulDelay = NGS_PULDELAY; m_osPulRise = NGS_PULRISE; m_osPulWidth = NGS_PULWIDTH; m_osPulFall = NGS_PULFALL; m_osPulPeriod = NGS_PULPERIOD; } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool CpntNgsIndSrc::bClear( void ) { Component::bClear( ); ClrValues( ); return( TRUE ); } //***************************************************************************** // Copy and digest the contents of a Component object. // // Argument List : // roCpnt - A reference to a Component object // // Return Values : // A reference to this object CpntNgsIndSrc & CpntNgsIndSrc::operator = ( const Component & roCpnt ) { // Copy the component contents (Component &) *this = roCpnt; // Parse the value part of the component definition bParseValue( ); return( *this ); } //***************************************************************************** // Copy the contents of an CmdGnuCapGEN object. // // Argument List : // roCmdGEN - A reference to a CmdGnuCapGEN object // // Return Values : // A reference to this object CpntNgsIndSrc & CpntNgsIndSrc::operator = ( const CmdGnuCapGEN & roCmdGEN ) { double df1, df2; m_osSinOffset = roCmdGEN.m_osOffset; m_osSinAmp = roCmdGEN.m_osAmplitude; m_osSinFreq = roCmdGEN.m_osSinFreq; if( ConvertType::bStrToDFlt( roCmdGEN.m_osSinPhase, &df1 ) && ConvertType::bStrToDFlt( roCmdGEN.m_osSinFreq, &df2 ) ) ConvertType::bDFltToStr( df1 / (360.0 * df2), m_osSinDelay ); else m_osSinDelay = wxT("0.0"); m_osSinDamp = wxT("0.0"); m_osPulInitial = roCmdGEN.m_osPulInitial; m_osPulMax = roCmdGEN.m_osPulMax; m_osPulDelay = roCmdGEN.m_osPulDelay; m_osPulRise = roCmdGEN.m_osPulRise; m_osPulWidth = roCmdGEN.m_osPulWidth; m_osPulFall = roCmdGEN.m_osPulFall; m_osPulPeriod = roCmdGEN.m_osPulPeriod; bFormat( ); return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CpntNgsIndSrc::Print( const wxString & rosPrefix ) { wxString osPrefix; osPrefix = rosPrefix + wxT("CpntNgsIndSrc::"); Component::Print( osPrefix ); cout << osPrefix .mb_str( ) << "m_osSinOffset : " << m_osSinOffset .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osSinAmp : " << m_osSinAmp .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osSinFreq : " << m_osSinFreq .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osSinDelay : " << m_osSinDelay .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osSinDamp : " << m_osSinDamp .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulseInitV : " << m_osPulInitial.mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulseMaxV : " << m_osPulMax .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulseDelay : " << m_osPulDelay .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulseRise : " << m_osPulRise .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulseWidth : " << m_osPulWidth .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulseFall : " << m_osPulFall .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osPulsePeriod : " << m_osPulPeriod .mb_str( ) << '\n'; } //***************************************************************************** gspiceui-1.0.00+dfsg/src/netlist/SimnGnuCap.cpp0000644000000000000000000002652111617767522020022 0ustar rootroot//***************************************************************************** // SimnGnuCap.cpp * // ---------------- * // Started : 07/05/2008 * // Last Update : 25/05/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "netlist/SimnGnuCap.hpp" //***************************************************************************** // Constructor. SimnGnuCap::SimnGnuCap( void ) : SimnBase( ) { m_eSimEng = eSIMR_GNUCAP; // Initialize all object attributes bClear( ); } //***************************************************************************** // Destructor. SimnGnuCap::~SimnGnuCap( ) { } //***************************************************************************** // Extract the simulator engine and return TRUE if it's GNU-Cap. // // Return Values : // TRUE - Success // FALSE - Failure bool SimnGnuCap::bLoadSimEng( void ) { wxString os1; size_t sz1; // Scan the circuit description for simulator type for( sz1=0; sz1 WX_DEFINE_OBJARRAY( ArrayComponent ); //***************************************************************************** // Constructor. Component::Component( void ) : wxString( ) { bClear( ); } //***************************************************************************** // Destructor. Component::~Component( ) { } //***************************************************************************** // Get the component ports. void Component::GetPorts( void ) { // Not yet implemented ??? } //***************************************************************************** // Test the values against each other. // // Return Values : // TRUE - Success // FALSE - Failure bool Component::bValidate( void ) { m_osErrMsg.Empty( ); if( IsEmpty( ) ) bSetErrMsg( wxT("component is empty") ); else if( m_eTypeeCPNT_LST ) bSetErrMsg( wxT("component type is invalid") ); else if( m_osName.IsEmpty( ) ) bSetErrMsg( wxT("component has no name") ); else if( m_osaNodes.GetCount( ) < 2 ) bSetErrMsg( wxT("component has less than two nodes") ); else if( m_osValue.IsEmpty( ) ) bSetErrMsg( wxT("component has no value") ); return( bIsValid( ) ); } //***************************************************************************** // Attempt to set the objects error message string attribute. // // Argument List : // rosErrMsg - A reference to a string containing the new error message // // Return Values : // TRUE - Success // FALSE - Failure bool Component::bSetErrMsg( const wxString & rosErrMsg ) { if( ! bIsValid( ) ) return( FALSE ); m_osErrMsg = rosErrMsg; return( TRUE ); } //***************************************************************************** // Compare algorithm for sorting Component objects. // // Argument List : // ppo1 - The address of a pointer to the first Component object to compare // ppo2 - The address of a pointer to the second Component object to compare // // Return Values : // >0 - If *(*ppo1) is greater than *(*ppo2) // =0 - If *(*ppo1) is equal to *(*ppo2) // <0 - If *(*ppo1) is less than *(*ppo2) int Component::iCompare( Component ** ppo1, Component ** ppo2 ) { const wxString & ros1 = (const wxString &) **ppo1; const wxString & ros2 = (const wxString &) **ppo2; return( ros1.CompareTo( ros2 ) ); // return( iStrCmp( ros1, ros2 ) ); } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool Component::bClear( void ) { wxString::Empty( ); m_osErrMsg = wxT("Invalid"); m_osName .Clear( ); m_osaNodes.Clear( ); m_osValue .Clear( ); m_eType = eCPNT_NONE; m_osaPorts.Clear( ); return( TRUE ); } //***************************************************************************** // Parse a component definition string extracted from a netlist. // // Return Values : // TRUE - Success // FALSE - Failure bool Component::bParse( void ) { wxStringTokenizer ostk1; wxString os1; size_t szt1; // Clear the object attributes os1 = (wxString &) *this; bClear( ); wxString::assign( os1 ); m_osErrMsg.Empty( ); // Tokenize the command string if( IsEmpty( ) ) return( bValidate( ) ); ostk1.SetString( os1 ); // Extract the component name bSetName( ostk1.GetNextToken( ) ); // Extract the nodes the component is connected to if( ! ostk1.HasMoreTokens( ) ) return( bValidate( ) ); bSetNodes( ostk1.GetString( ) ); for( szt1=0; szt1 ostk1.CountTokens( ) ) return( FALSE ); // Extract the nodes the component is connected to m_osaNodes.Empty( ); if( szNodeCnt > 0 ) { for( sz1=0; sz1mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osErrMsg : " << m_osErrMsg.mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_eType : "; switch( m_eType ) { case eCPNT_SCJN : cout << "eCPNT_SCJN"; break; case eCPNT_ADM : cout << "eCPNT_ADM"; break; case eCPNT_BJT : cout << "eCPNT_BJT"; break; case eCPNT_CAP : cout << "eCPNT_CAP"; break; case eCPNT_CCCS : cout << "eCPNT_CCCS"; break; case eCPNT_CCSW : cout << "eCPNT_CCSW"; break; case eCPNT_CCVS : cout << "eCPNT_CCVS"; break; case eCPNT_CIND : cout << "eCPNT_CIND"; break; case eCPNT_DIODE : cout << "eCPNT_DIODE"; break; case eCPNT_ICS : cout << "eCPNT_ICS"; break; case eCPNT_IND : cout << "eCPNT_IND"; break; case eCPNT_IVS : cout << "eCPNT_IVS"; break; case eCPNT_JFET : cout << "eCPNT_JFET"; break; case eCPNT_LOGIC : cout << "eCPNT_LOGIC"; break; case eCPNT_MOS : cout << "eCPNT_MOS"; break; case eCPNT_RES : cout << "eCPNT_RES"; break; case eCPNT_SUBCKT : cout << "eCPNT_SUBCKT"; break; case eCPNT_TLINE : cout << "eCPNT_TLINE"; break; case eCPNT_VCCS : cout << "eCPNT_VCCS"; break; case eCPNT_VCSW : cout << "eCPNT_VCSW"; break; case eCPNT_VCVS : cout << "eCPNT_VCVS"; break; case eCPNT_NONE : cout << "eCPNT_NONE"; break; default : cout << "Invalid"; } cout << '\n'; cout << osPrefix .mb_str( ) << "m_osName : " << m_osName .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "m_osaNodes[ ] : "; for( sz1=0; sz1 0 ) cout << ", "; cout << m_osaNodes.Item( sz1 ).mb_str( ); } cout << '\n'; cout << osPrefix .mb_str( ) << "m_osaPorts[ ] : "; for( sz1=0; sz1 0 ) cout << " "; cout << m_osaPorts.Item( sz1 ).mb_str( ); } cout << '\n'; cout << osPrefix .mb_str( ) << "m_osValue : " << m_osValue .mb_str( ) << '\n'; cout << osPrefix .mb_str( ) << "eGetUnitsType( ) : "; switch( eGetUnitsType( m_osName ) ) { case eUNITS_CAP : cout << "eUNITS_CAP"; break; case eUNITS_IND : cout << "eUNITS_IND"; break; case eUNITS_RES : cout << "eUNITS_RES"; break; case eUNITS_VOLT : cout << "eUNITS_VOLT"; break; case eUNITS_CURR : cout << "eUNITS_CURR"; break; case eUNITS_TIME : cout << "eUNITS_TIME"; break; case eUNITS_FREQ : cout << "eUNITS_FREQ"; break; case eUNITS_PHASE : cout << "eUNITS_PHASE"; break; case eUNITS_TEMP : cout << "eUNITS_TEMP"; break; case eUNITS_SCLR : cout << "eUNITS_SCLR"; break; case eUNITS_NONE : cout << "eUNITS_NONE"; break; default : cout << "Invalid"; break; } cout << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_COMPONENT // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCpnt; wxString os1; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[0] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1.at( 0 ) == wxT('-') ) { if( os1.at( 1 ) == wxT('h') ) { Usage( argv[0] ); exit( EXIT_SUCCESS ); } else { Usage( argv[0] ); exit( EXIT_FAILURE ); } } } // Display the utility banner cout << "\n Component Class Test Utility" << "\n Version 1.07 (19/08/2011)\n"; // Create a GNU-CAP OP command object Component tCpnt; // Use the following command example to check the formatter and the parser : osCpnt = wxT("Vin 2 0 AC 1V"); // This contains TABs and SPACEs cout << "\nCpnt defn to test : " << osCpnt.mb_str( ) << "\n\n"; // ******************** Test the formatter ******************** cout << "Test the component formatter :"; // Set things up for a formatter test tCpnt.bClear( ); tCpnt.bSetName ( wxT("Vin") ); tCpnt.bSetNodes( wxT("2,0") ); tCpnt.bSetValue( wxT("AC 1V") ); // Run the formatter cout << "\n Run formatter : "; if( tCpnt.bFormat( ) ) cout << "OK"; else cout << "FAULT (" << tCpnt.rosGetErrMsg( ).mb_str( ) << ')'; // Test the formatter output cout << "\n Test format : "; if( (wxString) tCpnt == Component::rosTrim( osCpnt ) ) cout << "OK\n" << " Component defn : " << tCpnt.rosGetString( ).mb_str( ) << '\n'; else { // There's been an error so print the component contents cout << "FAULT\n"; cout << " tCpnt Contents : \n"; tCpnt.Print( wxT(" ") ); } cout << "\n"; // ********************* Test the parser ********************* cout << "Test the component parser :"; // Set things up for a parser test tCpnt.bClear( ); tCpnt = osCpnt; // Run the parser cout << "\n Run parser : "; if( tCpnt.bParse( ) ) cout << "OK"; else cout << "FAULT (" << tCpnt.rosGetErrMsg( ).mb_str( ) << ')'; // Test the parser output tCpnt.bFormat( ); cout << "\n Test format : "; if( (wxString) tCpnt == Component::rosTrim( osCpnt ) ) cout << "OK\n" << " Component defn : " << tCpnt.rosGetString( ).mb_str( ) << '\n'; else { // There's been an error so print the component contents cout << "FAULT\n"; cout << " tCpnt Contents : \n"; tCpnt.Print( wxT(" ") ); } cout << "\n"; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_COMPONENT //***************************************************************************** gspiceui-1.0.00+dfsg/src/netlist/SimnNgSpice.hpp0000644000000000000000000000752711567203537020202 0ustar rootroot//***************************************************************************** // SimnNgSpice.hpp * // ----------------- * // Description : A class to contain the values required to define a NG-Spice * // simulation. * // Started : 07/05/2008 * // Last Update : 26/05/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef SIMNNGSPICE_HPP #define SIMNNGSPICE_HPP // System Includes #include // wxWidgets Includes #include // Application Includes #include "base/SimnBase.hpp" #include "ngspice/commands/CmdNgSpiceOPT.hpp" #include "ngspice/commands/CmdNgSpiceDC.hpp" #include "ngspice/commands/CmdNgSpiceAC.hpp" #include "ngspice/commands/CmdNgSpiceTR.hpp" #include "ngspice/commands/CmdNgSpicePR.hpp" #include "netlist/SimnGnuCap.hpp" struct SimnGnuCap; // Local Constant Declarations //***************************************************************************** struct SimnNgSpice : public SimnBase { public : // NG-Spice simulation object attributes CmdNgSpiceOPT m_oCmdOPT; CmdNgSpiceDC m_oCmdDC; CmdNgSpiceAC m_oCmdAC; CmdNgSpiceTR m_oCmdTR; CmdNgSpicePR m_oCmdPR; CpntNgsIndSrc m_oCpntIndSrc; private : // Function to extract information from the circuit description virtual bool bLoadSimEng ( void ); virtual bool bLoadSimCmds( void ); virtual bool bLoadSigSrc ( void ); // Functions to save the circuit description to file virtual bool bSaveSimCmds( void ) { return( FALSE ); } // ??? 26/05/2011 Not yet implemented public : SimnNgSpice( void ); ~SimnNgSpice( ); virtual bool bClear ( void ); virtual bool bClrCmds ( void ); virtual bool bClrTstPts( void ); virtual bool bValidate( void ); virtual bool bLoadFile( const wxString & rosFName=wxT("") ); virtual bool bSaveFile( const wxString & rosFName=wxT("") ); virtual bool bSetAnaType( eCmdType eAnaType ) { return( m_oCmdPR.bSetAnaType( eAnaType ) ); } virtual bool bAddTstNode( const wxString & rosName ); virtual bool bAddTstCpnt( const wxString & rosName ); virtual eCmdType eGetAnaType ( void ) const { return( m_oCmdPR.m_eAnaType ); } virtual const wxArrayString & rosaGetTstNodes( void ) { return( m_oCmdPR.m_osaNodes ); } virtual const wxArrayString & rosaGetTstCpnts( void ); const wxString & rosGetColLbls ( void ); SimnNgSpice & operator = ( const SimnGnuCap & roSimn ); virtual void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // SIMNNGSPICE_HPP gspiceui-1.0.00+dfsg/src/netlist/SimnGnuCap.hpp0000644000000000000000000000774111567203537020025 0ustar rootroot//***************************************************************************** // SimnGnuCap.hpp * // ---------------- * // Description : A class to contain the values required to define a GNU-Cap * // simulation. * // Started : 07/05/2008 * // Last Update : 26/05/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef SIMNGNUCAP_HPP #define SIMNGNUCAP_HPP // System Includes #include // wxWidgets Includes #include // Application Includes #include "base/SimnBase.hpp" #include "gnucap/commands/CmdGnuCapOPT.hpp" #include "gnucap/commands/CmdGnuCapOP.hpp" #include "gnucap/commands/CmdGnuCapDC.hpp" #include "gnucap/commands/CmdGnuCapAC.hpp" #include "gnucap/commands/CmdGnuCapTR.hpp" #include "gnucap/commands/CmdGnuCapFO.hpp" #include "gnucap/commands/CmdGnuCapPR.hpp" #include "gnucap/commands/CmdGnuCapGEN.hpp" #include "netlist/SimnNgSpice.hpp" struct SimnNgSpice; // Local Constant Declarations //***************************************************************************** struct SimnGnuCap : public SimnBase { public : // GNU-Cap simulation object attributes CmdGnuCapOPT m_oCmdOPT; CmdGnuCapOP m_oCmdOP; CmdGnuCapDC m_oCmdDC; CmdGnuCapAC m_oCmdAC; CmdGnuCapTR m_oCmdTR; CmdGnuCapFO m_oCmdFO; CmdGnuCapPR m_oCmdPR; CmdGnuCapGEN m_oCmdGEN; private : // Function to extract information from the circuit description virtual bool bLoadSimEng ( void ); virtual bool bLoadSimCmds( void ); // Functions to save the circuit description to file virtual bool bSaveSimCmds( void ) { return( FALSE ); } // ??? 26/05/2011 Not yet implemented public : SimnGnuCap( void ); ~SimnGnuCap( ); virtual bool bClear ( void ); virtual bool bClrCmds ( void ); virtual bool bClrTstPts( void ); virtual bool bValidate( void ); virtual bool bLoadFile( const wxString & rosFName=wxT("") ); virtual bool bSaveFile( const wxString & rosFName=wxT("") ); virtual bool bSetAnaType( eCmdType eAnaType ) { return( m_oCmdPR.bSetAnaType( eAnaType ) ); } virtual bool bAddTstNode( const wxString & rosName ); virtual bool bAddTstCpnt( const wxString & rosName ); virtual eCmdType eGetAnaType ( void ) const { return( m_oCmdPR.m_eAnaType ); } virtual const wxArrayString & rosaGetTstNodes( void ) { return( m_oCmdPR.m_osaNodes ); } virtual const wxArrayString & rosaGetTstCpnts( void ) { return( m_oCmdPR.m_osaCpnts ); } SimnGnuCap & operator = ( const SimnNgSpice & roSimn ); virtual void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // SIMNGNUCAP_HPP gspiceui-1.0.00+dfsg/src/netlist/CpntNgsIndSrc.hpp0000644000000000000000000000642411567557555020511 0ustar rootroot//***************************************************************************** // CpntNgsIndSrc.hpp * // ------------------- * // Description : This structure represents a component definition line for * // an NG-Spice independent voltage or current source. * // Started : 12/06/2008 * // Last Update : 27/05/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CPNTNGSINDSRC_HPP #define CPNTNGSINDSRC_HPP // System Includes using namespace std; #include // wxWidgets Includes #include #include // Application Includes #include "netlist/Component.hpp" #include "gnucap/commands/CmdGnuCapGEN.hpp" struct CmdGnuCapGEN; // Local Constant Declarations #define NGS_SINAMP wxT("0.0") #define NGS_SINOFFSET wxT("0.0") #define NGS_SINFREQ wxT("0.0K") #define NGS_SINDELAY wxT("0.0m") #define NGS_SINDAMP wxT("0.0") #define NGS_PULINITIAL wxT("0.0") #define NGS_PULMAX wxT("0.0") #define NGS_PULDELAY wxT("0.0m") #define NGS_PULRISE wxT("0.0m") #define NGS_PULWIDTH wxT("0.0m") #define NGS_PULFALL wxT("0.0m") #define NGS_PULPERIOD wxT("0.0m") //***************************************************************************** struct CpntNgsIndSrc : public Component { private : virtual bool bParseValue ( void ); virtual bool bFormatValue( void ); virtual bool bValidate ( void ); void ClrValues( void ); public : // Value for a sinusoidal source wxString m_osSinOffset; wxString m_osSinAmp; wxString m_osSinFreq; wxString m_osSinDelay; wxString m_osSinDamp; // Value for a pulse source wxString m_osPulInitial; wxString m_osPulMax; wxString m_osPulDelay; wxString m_osPulRise; wxString m_osPulWidth; wxString m_osPulFall; wxString m_osPulPeriod; CpntNgsIndSrc( void ); virtual ~CpntNgsIndSrc( ); virtual bool bClear( void ); CpntNgsIndSrc & operator = ( const Component & roCpnt ); CpntNgsIndSrc & operator = ( const CmdGnuCapGEN & roCmdGEN ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CPNTNGSINDSRC_HPP gspiceui-1.0.00+dfsg/src/netlist/SimnNgSpice.cpp0000644000000000000000000003406211624211155020154 0ustar rootroot//***************************************************************************** // SimnNgSpice.cpp * // ----------------- * // Started : 07/05/2008 * // Last Update : 22/08/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "netlist/SimnNgSpice.hpp" //***************************************************************************** // Constructor. SimnNgSpice::SimnNgSpice( void ) : SimnBase( ) { m_eSimEng = eSIMR_NGSPICE; // Initialize all object attributes bClear( ); } //***************************************************************************** // Destructor. SimnNgSpice::~SimnNgSpice( ) { } //***************************************************************************** // Extract the simulator engine and return TRUE if it's NG-Spice. // // Return Values : // TRUE - Success // FALSE - Failure bool SimnNgSpice::bLoadSimEng( void ) { wxString os1; size_t sz1; // Scan the circuit description for simulator type for( sz1=0; sz1= NetList::m_oaCpnts.GetCount( ) ) return( FALSE ); // Is the node pair already in the test component list? if( oCpnt.m_osaNodes.GetCount( ) != 2 ) return( FALSE ); os1 = oCpnt.m_osaNodes.Item( 0 ) + wxT(",") + oCpnt.m_osaNodes.Item( 1 ); if( rosaGetTstCpnts( ).Index( os1 ) != wxNOT_FOUND ) return( TRUE ); // Add the node pair to the list of test points m_oCmdPR.m_osaCpnts.Add( os1 ); return( TRUE ); } //***************************************************************************** // Get an wxArrayString object containing a list of the test component labels. // // Return Values : // A reference to a list of test components name const wxArrayString & SimnNgSpice::rosaGetTstCpnts( void ) { static wxArrayString osaTstCpnts; Component oCpnt1; wxString os1, os2; size_t sz1, sz2; // Clear the test component list osaTstCpnts.Clear( ); // Convert the PRINT command node pairs to component labels for( sz1=0; sz1 1 ) osModel << wxT('\n') << os1; } else if( ! osModel.IsEmpty( ) ) { // Last line of model description found m_osaModels.Add( osModel ); osModel.Empty( ); } } return( TRUE ); } //***************************************************************************** // Extract any sub-circuit descriptions from the circuit description (netlist). // The format of a sub-circuit description is illustrated in the following // example : // // .SUBCKT CCTNAME 1 5 // R1 1 2 1K // R2 2 3 2K // R3 3 4 3K // R4 4 5 4K // .ENDS CCTNAME // // Return Values : // TRUE - Success // FALSE - Failure bool NetList::bLoadSubCcts( void ) { wxString osSubCct; wxString os1, os2; size_t sz1; // Need at least a title line, 2 components and a sub-circuit description // containing 2 lines if( m_osaNetLst.GetCount( ) < 7 ) return( TRUE ); // Scan circuit description for sub-circuits for( sz1=0; sz1 0 ) m_osaNetLst.Add( os1 ); oFileCct.Close( ); // Close the netlist file // Was anything loaded? if( m_osaNetLst.IsEmpty( ) ) return( FALSE ); // Attempt to extract the circuit description information m_bIsValid = TRUE; if( ! bLoadTitle ( ) ) m_bIsValid = FALSE; if( ! bLoadIncludes ( ) ) m_bIsValid = FALSE; if( ! bLoadCpnts ( ) ) m_bIsValid = FALSE; if( ! bLoadModels ( ) ) m_bIsValid = FALSE; if( ! bLoadSubCcts ( ) ) m_bIsValid = FALSE; if( ! bLoadNodeLbls ( ) ) m_bIsValid = FALSE; if( ! bLoadSchemFiles( ) ) ; return( m_bIsValid ); } //***************************************************************************** // Save (or resave) the circuit to file. // // Argument List : // rosFName - The name of the file to be saved // // Return Values : // TRUE - Success // FALSE - Failure bool NetList::bSaveFile( const wxString & rosFName ) { wxString os1; wxString os2; size_t sz1; // Is this a save or resave? if( ! rosFName.IsEmpty( ) ) { if( ! bSetSaveFile( rosFName ) ) return( FALSE ); } else { if( ! m_ofnSaveFile.IsOk( ) ) return( FALSE ); } // Open the file wxTextFile oFileCct( m_ofnSaveFile.GetFullPath( ) ); if( oFileCct.Exists( ) ) { if( ! oFileCct.Open( ) ) return( FALSE ); } else { if( ! oFileCct.Create( ) ) return( FALSE ); } // Clear the file if it contains lines for( sz1=oFileCct.GetLineCount( ); sz1>0; sz1-- ) oFileCct.RemoveLine( 0 ); // Save the circuit description title line/s eg. : // ************************************************************** // * Electronic circuit simulation file generated by gSpiceUI * // * Version 0.9.93 (28/12/2008) * // ************************************************************** os1 = wxT("**************************************************************"); oFileCct.AddLine( os1 ); os2 = wxT("* Electronic circuit simulation file generated by "); os2 << APP_NAME << wxT(" *"); oFileCct.AddLine( os2 ); os2.Empty( ); os2 << wxT("* Version ") << APP_VERSION << wxT(" (") << APP_DATE << wxT(") *"); oFileCct.AddLine( os2 ); oFileCct.AddLine( os1 ); oFileCct.AddLine( wxT("") ); // Save the schematic file name/s if specified if( ! m_oaSchemFiles.IsEmpty( ) ) { os1 = wxT("* Schematic : ") + rosGetSchemFiles( ); oFileCct.AddLine( os1 ); oFileCct.AddLine( wxT("") ); } // Save the title line/s if( ! m_osaTitle.IsEmpty( ) ) { for( sz1=0; sz1 0 ) cout << rosPrefix.mb_str( ) << " "; cout << m_osaNetLst.Item( sz1 ).mb_str( ) << '\n'; } } else cout << '\n'; cout << rosPrefix.mb_str( ) << "m_osaTitle[ ] : "; if( ! m_osaTitle.IsEmpty( ) ) { for( sz1=0; sz1 0 ) cout << rosPrefix.mb_str( ) << " "; cout << m_osaTitle.Item( sz1 ).mb_str( ) << '\n'; } } else cout << '\n'; cout << rosPrefix.mb_str( ) << "m_osaIncludes[ ] : "; if( ! m_osaIncludes.IsEmpty( ) ) { for( sz1=0; sz1 0 ) cout << rosPrefix.mb_str( ) << " "; cout << m_osaIncludes.Item( sz1 ).mb_str( ) << '\n'; } } else cout << '\n'; cout << rosPrefix.mb_str( ) << "m_oaCpnts[ ] : "; if( ! m_oaCpnts.IsEmpty( ) ) { for( sz1=0; sz1 0 ) cout << rosPrefix.mb_str( ) << " "; cout << m_oaCpnts.Item( sz1 ).rosGetString( ).mb_str( ) << '\n'; } } else cout << '\n'; cout << rosPrefix.mb_str( ) << "m_osaModels[ ] : "; if( ! m_osaModels.IsEmpty( ) ) { for( sz1=0; sz1 0 ) cout << rosPrefix.mb_str( ) << " "; cout << m_osaModels.Item( sz1 ).mb_str( ) << '\n'; } } else cout << '\n'; cout << rosPrefix.mb_str( ) << "m_osaSubCcts[ ] : "; if( ! m_osaSubCcts.IsEmpty( ) ) { for( sz1=0; sz1 0 ) cout << rosPrefix.mb_str( ) << " "; cout << m_osaSubCcts.Item( sz1 ).mb_str( ) << '\n'; } } else cout << '\n'; cout << rosPrefix.mb_str( ) << "m_bIsValid : " << ( m_bIsValid ? "TRUE" : "FALSE") << '\n'; } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_NETLIST // System include files // Application includes // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osCpnt; wxString os1; // Validate the argument count passed to the application if( argc > 3 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1.at( 0 ) == wxT('-') ) { if( os1.at( 1 ) == wxT('h') ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Display the utility banner cout << "\n Netlist Structure Test Utility" << "\n Version 1.00 (08/05/2009)\n"; // Create a NetList object NetList tNetLst; cout << "\nLoad the netlist file : "; if( tNetLst.bLoadFile( os1 ) ) cout << "Success"; else cout << "Failure"; cout << "\n"; cout << "\ntNetLst.Print( ) :\n"; tNetLst.Print( ); cout << "\n"; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS] [FILE]" << "\nOptions : -h : Print usage (this message)" << "\n FILE : A circuit description (NetList) file" << "\n\n"; } #endif // TEST_NETLIST //***************************************************************************** gspiceui-1.0.00+dfsg/src/netlist/Component.hpp0000644000000000000000000001026111620761034017741 0ustar rootroot//***************************************************************************** // Component.hpp * // --------------- * // Description : This class processes a component definition line from a * // netlist. The line is parsed into it's constituant parts. * // Started : 14/05/2004 * // Last Update : 12/08/2011 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef COMPONENT_HPP #define COMPONENT_HPP // System Include Files using namespace std; #include // wxWidgets Include Files #include #include // Application Include Files #include "TypeDefs.hpp" #include "utility/ConvertType.hpp" #include "utility/StrUtils.hpp" //***************************************************************************** class Component : public wxString { protected : wxString m_osErrMsg; virtual bool bParseValue ( void ) { return( TRUE ); } virtual bool bFormatValue( void ) { return( TRUE ); } virtual bool bValidate ( void ); void GetPorts( void ); public : // The following attributes are the minumum required to define a component wxString m_osName; wxArrayString m_osaNodes; wxString m_osValue; // The following attributes are derived from the above attributes eCpntType m_eType; wxArrayString m_osaPorts; // ??? Not yet implemented // Function which provides the Component sorting criterion static int iCompare( Component ** ppo1, Component ** ppo2 ); Component( void ); virtual ~Component( ); virtual bool bClear ( void ); bool bIsValid( void ) const { return( m_osErrMsg.IsEmpty( ) ); } virtual bool bParse ( void ); virtual bool bFormat( void ); bool bSetString( const wxString & rosCmd ); bool bSetName ( const wxString & rosName ); bool bSetNodes ( const wxString & rosNodes ); bool bSetValue ( const wxString & rosValue ); bool bSetErrMsg( const wxString & rosErrMsg ); const wxString & rosGetString ( void ); eCpntType eGetCpntType ( void ) { return( eGetCpntType ( m_osName ) ); } const wxString & rosGetNodes ( void ); eUnitsType eGetUnitsType( void ) { return( eGetUnitsType( m_osName ) ); } const wxString & rosGetNumValue ( void ); const wxString & rosGetErrMsg ( void ) const { return( m_osErrMsg ); } // Static helper functions (may be called without instantiating the class) static eCpntType eGetCpntType ( const wxString & rosName ); static eUnitsType eGetUnitsType( const wxString & rosName ); static const wxString & rosTrim ( const wxString & rosDefn ); wxString & operator = ( const wxString & rosCmd ); Component & operator = ( const Component & roCpnt ); void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** // Define a new array type WX_DECLARE_OBJARRAY( Component, ArrayComponent ); //***************************************************************************** #endif // COMPONENT_HPP gspiceui-1.0.00+dfsg/src/Makefile0000644000000000000000000002274411640451354015260 0ustar rootroot#****************************************************************************** # Makefile * # ---------- * # Description : Builds the GNU Spice GUI (gSpiceUI) C++ source files. * # Started : 18/08/2003 * # Last update : 12/08/2011 * # Copyright : (C) 2003 by MSWaters * # Email : M.Waters@bom.gov.au * #****************************************************************************** #****************************************************************************** # * # This program is free software; you can redistribute it and/or modify * # it under the terms of the GNU General Public License as published by * # the Free Software Foundation; either version 2 of the License, or * # (at your option) any later version. * # * #****************************************************************************** #****************************************************************************** # Any or all of the values in this section may be set below or on the command # line when envoking make eg. : # # make GSPICEUI_DBG=1 GSPICEUI_WXLIB=2.9 # # Note : Values specified on the command line over-ride those specified below. #****************************************************************************** # Create bin file containing debug information (ie. for gdb) GSPICEUI_DBG = 0 # Specify the version of the wxWidgets library to compile against GSPICEUI_WXLIB = 2.8 #****************************************************************************** # Specify string values #****************************************************************************** # Which compiler CC = g++ # Application name PROG = gspiceui # wxWidgets configuration utility # (Arguments can be passed to wx-config to specify the version of wxWidgets to # use, whether unicode is required, etc.) WXCFG = /usr/bin/wx-config --unicode --version=$(GSPICEUI_WXLIB) # Dependency file DEPS = Makefile.deps # Directories #ROOT := $(shell cd .. ; pwd) ROOT = .. SRCDIR = $(ROOT)/src OBJDIR = obj BINDIR = $(ROOT)/bin INSTALLDIR = /usr/local/bin # Compiler options ifeq ($(GSPICEUI_DBG),0) # Options for release (not using -Wall since it's GCC specific) CXXFLAGS := -Ofast -pipe $(shell $(WXCFG) --cxxflags) else # Options for development CXXFLAGS := -Wall -g -pipe $(shell $(WXCFG) --cxxflags) endif # Includes INCLUDES = -I/usr/include -I/usr/X11R6/include -I. # Libraries # (The pkg-config stuff was requested by a user, somehow pangox was missing) LIBS := $(shell $(WXCFG) --libs core,base,html) \ $(shell pkg-config --libs-only-l pangox) # Objects OBJS := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard */*/*.cpp) OBJS := $(notdir $(OBJS)) OBJS := $(patsubst %.cpp, obj/%.o, $(OBJS)) # Set search paths for the specific file types vpath %.cpp base main netlist process utility \ ngspice ngspice/commands ngspice/dialogs ngspice/panels \ gnucap gnucap/commands gnucap/dialogs gnucap/panels #****************************************************************************** # Make these targets #****************************************************************************** all : $(OBJS) $(BINDIR)/$(PROG) # Compiler Rules : # $< is the name of the first dependency # $@ is the file name of the target # -c compile only, don't link, produces object file ie. .o files # -o place output file in $@ obj/%.o : %.cpp $(CC) -c $(CXXFLAGS) $(INCLUDES) $< -o $@ @echo # Linker Rules : # -pipe use pipes rather temporary files for interprocess communications # -o specify the output file name $(BINDIR)/$(PROG) : $(OBJS) $(CC) -pipe -o $(BINDIR)/$(PROG) obj/*.o $(LIBS) ifeq ($(ROOT)/GSpiceUI.app,$(wildcard $(ROOT)/GSpiceUI.app)) cp $(BINDIR)/$(PROG) $(ROOT)/GSpiceUI.app/Contents/MacOS/gspiceui endif #****************************************************************************** # Dependencies #****************************************************************************** ifeq ($(DEPS),$(wildcard $(DEPS))) include $(DEPS) endif #****************************************************************************** # Create the file containing dependency information #****************************************************************************** deps : $(CC) -MM -D wxCHECK_VERSION="" -I. *.cpp */*.cpp */*/*.cpp | \ gawk 'BEGIN {} { printf "%s%s\n", (index($$0," ")!=1 ? "$(OBJDIR)/" : ""), $$0 }' \ > $(DEPS) #****************************************************************************** # Test utilities #****************************************************************************** tests : ../bin/testnetlist ../bin/testcomponent ../bin/testconverttype \ ../bin/testcmdngsopt ../bin/testcmdngspr ../bin/testcmdngsdc \ ../bin/testcmdngsac ../bin/testcmdngstr ../bin/testcmdgcpopt \ ../bin/testcmdgcppr ../bin/testcmdgcpop ../bin/testcmdgcpdc \ ../bin/testcmdgcpac ../bin/testcmdgcptr ../bin/testcmdgcpfo \ ../bin/testcmdgcpgen ../bin/teststrutils ../bin/testnetlist : NetList.cpp Component.cpp StrUtils.cpp TypeDefs.cpp \ ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_NETLIST $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcomponent : Component.cpp ConvertType.cpp StrUtils.cpp $(CC) $(CXXFLAGS) -D TEST_COMPONENT $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testconverttype : ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CONVERTTYPE $(INCLUDES) $^ -o $@ $(LIBS) ../bin/teststrutils : StrUtils.cpp Component.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_STRUTILS $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdngsopt : CmdNgSpiceOPT.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDNGSOPT $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdngspr : CmdNgSpicePR.cpp CmdBase.cpp $(CC) $(CXXFLAGS) -D TEST_CMDNGSPR $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdngsdc : CmdNgSpiceDC.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDNGSDC $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdngsac : CmdNgSpiceAC.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDNGSAC $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdngstr : CmdNgSpiceTR.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDNGSTR $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcpopt : CmdGnuCapOPT.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPOPT $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcppr : CmdGnuCapPR.cpp CmdBase.cpp NetList.cpp TypeDefs.cpp \ ConvertType.cpp Component.cpp StrUtils.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPPR $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcpop : CmdGnuCapOP.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPOP $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcpdc : CmdGnuCapDC.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPDC $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcpac : CmdGnuCapAC.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPAC $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcptr : CmdGnuCapTR.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPTR $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcpfo : CmdGnuCapFO.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPFO $(INCLUDES) $^ -o $@ $(LIBS) ../bin/testcmdgcpgen : CmdGnuCapGEN.cpp CmdBase.cpp ConvertType.cpp $(CC) $(CXXFLAGS) -D TEST_CMDGCPGEN $(INCLUDES) $^ -o $@ $(LIBS) #****************************************************************************** # Install the application #****************************************************************************** install : mkdir -p $(INSTALLDIR)/bin cp ../bin/$(PROG) $(INSTALLDIR)/bin #****************************************************************************** # Uninstall the application #****************************************************************************** uninstall : rm -f $(INSTALLDIR)/bin/$(PROG) # rmdir --ignore-fail-on-non-empty $(INSTALLDIR)/bin #****************************************************************************** # Remove old versions of the main application binary and object files #****************************************************************************** clean : cleantests rm -f $(BINDIR)/$(PROG) $(OBJDIR)/*.o #****************************************************************************** # Remove old versions of test application binaries #****************************************************************************** cleantests : rm -f $(BINDIR)/test* #****************************************************************************** # Remove old versions of test application binaries #****************************************************************************** cleanall : clean cleantests #****************************************************************************** # Specify phony targets (ie. targets which are not files) #****************************************************************************** .PHONY : deps tests install uninstall clean cleantests cleanall #****************************************************************************** gspiceui-1.0.00+dfsg/src/process/0000755000000000000000000000000011624724444015272 5ustar rootrootgspiceui-1.0.00+dfsg/src/process/PrcGaw.hpp0000644000000000000000000000454111570446263017172 0ustar rootroot//***************************************************************************** // PrcGaw.hpp * // ------------ * // Description : Provides an interface to the utility gaw which is a * // waveform viewer. The user can view the raw simulation data * // or envoke this utility which plots the data graphically. * // Started : 10/01/2008 * // Last Update : 30/05/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PRCGAW_HPP #define PRCGAW_HPP // System Includes using namespace std; #include // wxWidgets Includes #include #include // Application Includes #include "base/PrcBase.hpp" // Local Constant Declarations //***************************************************************************** class PrcGaw : public PrcBase { private : wxFileName m_ofnResults; // The full simulator results file name // Functions for reformatting the results file for input to the viewer bool bFilterFile( void ); public : PrcGaw( void ); ~PrcGaw( ); bool bSetResults( const wxString & rosFileName ); const wxFileName & roGetResults( void ) { return( m_ofnResults ); } virtual bool bExec( void ); }; //***************************************************************************** #endif // PRCGAW_HPP gspiceui-1.0.00+dfsg/src/process/PrcGnuCap.cpp0000644000000000000000000003253611550674466017637 0ustar rootroot//***************************************************************************** // PrcGnuCap.cpp * // --------------- * // Started : 01/09/2003 * // Last Update : 12/04/2011 * // Copyright : (C) 2003 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "process/PrcGnuCap.hpp" //***************************************************************************** // Constructor. PrcGnuCap::PrcGnuCap( void ) : PrcSimrBase( ) { // Set the simulation engine type m_eSimEng = eSIMR_GNUCAP; // Set the simulator binary file name if it can be found bSetBinary( wxT("gnucap") ); m_osInput.Empty( ); } //***************************************************************************** // Destructor. PrcGnuCap::~PrcGnuCap( ) { } //***************************************************************************** // Check / format the component lines in the simulation object so that they are // compatible with GNU-Cap. Ie. add the substrate node to BJT components which // are missing it, the substrate node is assumed to be connected to the // collector. Eg. "Q1 nc nb ne BC109" would become "Q1 nc nb ne nc BC109". // // Argument List : // roaCpnts - An array of ArrayComponent objects // // Return Values : // TRUE - Success // FALSE - Failure /* ??? 17/08/2009 bool PrcGnuCap::bFmtCpnts( ArrayComponent & roaCpnts ) { wxString os1; size_t sz1; for( sz1=0; sz1SetPath( wxT("/GNU-Cap") ); // Delete unwanted columns of data for( ostk1=m_oFileResults.GetFirstLine(); !m_oFileResults.Eof(); ostk1=m_oFileResults.GetNextLine() ) { if( ostk1.CountTokens( ) != 7 ) continue; // Get the operator field ie. frequency os1 = ostk1.GetNextToken( ); // Do we want actual or relative magnitude? poConfig->Read( wxT("FO_MagRel"), &b1, FALSE ); if( b1 ) for( sz1=0; sz1<3; sz1++ ) ostk1.GetNextToken( ); // Do we want dB magnitude? poConfig->Read( wxT("FO_MagDB"), &b1, FALSE ); if( b1 ) { ostk1.GetNextToken( ); os1 << wxT(' ') << ostk1.GetNextToken( ); } else { os1 << wxT(' ') << ostk1.GetNextToken( ); ostk1.GetNextToken( ); } // Do we want phase? poConfig->Read( wxT("FO_Phase"), &b1, FALSE ); if( b1 ) os1 << wxT(' ') << ostk1.GetNextToken( ); // Record the data m_oFileResults[ m_oFileResults.GetCurrentLine( ) ] = os1; } // Construct the data column headers os1 = wxT("#Freq"); for( ostk1=m_oFileResults.GetFirstLine( ); !m_oFileResults.Eof( ); ostk1=m_oFileResults.GetNextLine( ) ) { // Look for header lines if( ostk1.GetNextToken( ) != wxT("#") ) continue; os2 = ostk1.GetNextToken( ); // Do we want dB magnitude? os3 = os2; poConfig->Read( wxT("FO_MagDB"), &b1, FALSE ); if( b1 ) os3.insert( 1, wxT("DB") ); os1 << wxT(' ') << os3; // Do we want phase? poConfig->Read( wxT("FO_Phase"), &b1, FALSE ); if( b1 ) { os3 = os2; os3.insert( 1, wxT("P") ); os1 << wxT(' ') << os3; } // Remove the unwanted header lines if( m_oFileResults.GetCurrentLine( ) > 0 ) m_oFileResults.RemoveLine( m_oFileResults.GetCurrentLine( ) ); } m_oFileResults[ 0 ] = os1; // Determine the number of unique data lines ostk1 = m_oFileResults.GetFirstLine( ); ostk1 = m_oFileResults.GetNextLine( ); os1 = ostk1.GetNextToken( ); for( ostk1=m_oFileResults.GetNextLine( ), sz1=1; !m_oFileResults.Eof( ); ostk1=m_oFileResults.GetNextLine( ), sz1++ ) { if( os1 == ostk1.GetNextToken( ) ) break; } // Concatinate data lines according to frequency for( sz2=1; sz2<=sz1; sz2++ ) { m_oFileResults.GoToLine( sz2-1 ); ostk1=m_oFileResults.GetNextLine( ); os1 = ostk1.GetNextToken( ); for( ostk1=m_oFileResults.GetNextLine( ); !m_oFileResults.Eof( ); ostk1=m_oFileResults.GetNextLine( ) ) { if( os1 == ostk1.GetNextToken( ) ) m_oFileResults[ sz2 ] << wxT(' ') << ostk1.GetString( ); } } // Delete data lines which are no longer needed m_oFileResults.GoToLine( sz1+1 ); while( ! m_oFileResults.Eof( ) ) m_oFileResults.RemoveLine( m_oFileResults.GetCurrentLine( ) ); // Format the header line and data lines bFmtColLabels( ); bFmtDataLines( ); return( TRUE ); } //***************************************************************************** // Format the data lines in the results file. // // Return Values : // TRUE - Success // FALSE - Failure bool PrcGnuCap::bFmtDataLines( void ) { wxStringTokenizer ostk1; wxString osLine, os1; size_t sz1; double df1; int i1; // This function requires the result file to have been opened if( ! m_oFileResults.IsOpened( ) ) return( FALSE ); for( sz1=1; sz1 // Application Includes #include "TypeDefs.hpp" #include "base/PrcSimrBase.hpp" #include "netlist/SimnGnuCap.hpp" #include "ngspice/commands/CmdNgSpiceDC.hpp" #include "ngspice/commands/CmdNgSpiceAC.hpp" #include "ngspice/commands/CmdNgSpiceTR.hpp" #include "ngspice/commands/CmdNgSpicePR.hpp" #include "utility/ConvertType.hpp" // Local Constant Declarations #define NGSPICE_COL_WD 14 // Width of columns of data in the results files //***************************************************************************** class PrcNgSpice : public PrcSimrBase { private : // Storage for the result file column labels wxString m_osColLbls; // Function to match a component to a set of node labels bool bMatchCpnt( SimnNgSpice & roSimn, wxString & rosToNodes ); // Functions to create the simulator commands void Convert2Nodes( wxArrayString & rosaCpnts, SimnNgSpice & roSimn ); // Create the WIDTH command wxString & rosMakeCmdWIDTH( wxString & rosCmdPR ); // Format the results file bool bFmtCommon ( void ); bool bFmtColLabels( void ); bool bFmtDataLines( void ); bool bFmtPhaseData( void ); // ??? (02/02/2006) Not yet implemented public : PrcNgSpice( void ); ~PrcNgSpice( ); // Create the process argument list virtual bool bMakeArgLst( SimnBase & roSimn ); // Format the results file virtual bool bFmtResults( void ); }; //***************************************************************************** #endif // PRCNGSPICE_HPP gspiceui-1.0.00+dfsg/src/process/PrcNgSpice.cpp0000644000000000000000000003015411605336777020005 0ustar rootroot//***************************************************************************** // PrcNgSpice.cpp * // ---------------- * // Started : 07/05/2004 * // Last Update : 08/07/2011 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "process/PrcNgSpice.hpp" //***************************************************************************** // Constructor. PrcNgSpice::PrcNgSpice( void ) : PrcSimrBase( ) { // Set the simulation engine type m_eSimEng = eSIMR_NGSPICE; // Set the simulator binary file name if it can be found bSetBinary( wxT("ngspice") ); } //***************************************************************************** // Destructor. PrcNgSpice::~PrcNgSpice( ) { } //***************************************************************************** // Match a component to a set of node labels. Component voltages cannot be // specified using the component label in the NG-Spice print statement. The two // node labels connected to the component must be specified. When parsing the // print statement the component label must be derived from the node labels. // This may not work where components are connected in parallel. The nodes are // specified in the form "," eg. "1,2". // // Argument List : // roSimn - The simulation object // rosToNodes - The nodes to match, also used to return the component label // // Return Values : // TRUE - Success (a component with the specified nodes was found) // FALSE - Failure bool PrcNgSpice::bMatchCpnt( SimnNgSpice & roSimn, wxString & rosToNodes ) { wxArrayString osaNodes; Component tCpnt; wxString os1; size_t sz1; // Argument validity checks if( rosToNodes.IsEmpty( ) ) return( FALSE ); if( roSimn.m_oaCpnts.GetCount( ) <= 0 ) return( FALSE ); if( rosToNodes.Freq( wxT(',') ) != 1 ) return( FALSE ); // Extract the node labels osaNodes.Add( rosToNodes.BeforeFirst( wxT(',') ) ); osaNodes.Add( rosToNodes.AfterLast( wxT(',') ) ); // Attempt to match the nodes with a component for( sz1=0; sz1 80 ) osCmdWIDTH << wxT(".WIDTH OUT=") << i1; } return( osCmdWIDTH ); } //***************************************************************************** // This function is a generic results file formatter which works in most // circumstance. // // Return Values : // TRUE - Success // FALSE - Failure bool PrcNgSpice::bFmtCommon( void ) { wxString os1; size_t sz1, sz2; // This function requires the results file to be open if( ! m_oFileResults.IsOpened( ) ) return( FALSE ); // Find the beginning of the data area (ie. the 1st line starting with "Index") for( sz1=0; sz1= (m_oFileResults.GetLineCount( )-1) ) { SetErrMsg( wxT("Couldn't find the data section in the results file.") ); return( FALSE ); } // Delete everything before the data area sz2 = sz1; for( sz1=0; sz1 0 ) m_oFileResults.RemoveLine( 1 ); // Format the column header line bFmtColLabels( ); // Delete lines other than data lines for( sz1=1; sz1 2 ) { // Pad the column with spaces to the required width i1 = NGSPICE_COL_WD - (osLine.Length( ) % NGSPICE_COL_WD) + 1; if( i1 >= NGSPICE_COL_WD ) i1 = 1; osLine.Append( wxT(' '), i1 ); } // Add the next label to the line osLine << ostk1.GetNextToken( ); } osLine.Trim( ); // Remove trailing space characters m_oFileResults.GetFirstLine( ) = osLine; return( TRUE ); } //***************************************************************************** // Format a data lines in the results file. // // Return Values : // TRUE - Success // FALSE - Failure bool PrcNgSpice::bFmtDataLines( void ) { wxStringTokenizer ostk1; wxString osLine, os1; size_t sz1; double df1; int i1; // This function requires the results file to be open if( ! m_oFileResults.IsOpened( ) ) return( FALSE ); for( sz1=1; sz1 // wxWidgets Includes #include #include // Application Includes #include "base/PrcBase.hpp" // Local Constant Declarations //***************************************************************************** class PrcGWave : public PrcBase { private : wxFileName m_ofnResults; // The full simulator results file name // Functions for filtering the results file for input to the viewer bool bFilterFile( void ); public : PrcGWave( void ); ~PrcGWave( ); bool bSetResults( const wxString & rosFileName ); const wxFileName & roGetResults( void ) { return( m_ofnResults ); } virtual bool bExec( void ); }; //***************************************************************************** #endif // PRCGWAVE_HPP gspiceui-1.0.00+dfsg/src/process/PrcGNetList.cpp0000644000000000000000000002340211624724444020135 0ustar rootroot//***************************************************************************** // GNetList.cpp * // -------------- * // Started : 28/01/2004 * // Last Update : 30/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "process/PrcGNetList.hpp" //***************************************************************************** // Constructor. PrcGNetList::PrcGNetList( void ) : PrcBase( wxPROCESS_REDIRECT ) { // Clear the object attributes bClear( ); // Initialize the array of Guile procedure names and set the default InitGuileProcs( ); // Attempt to set and find the gnetlist binary bSetBinary( GNETLST_BIN_NAME ); // Set the log file name bSetLogFile( GNETLST_LOG_FILE ); } //***************************************************************************** // Destructor. PrcGNetList::~PrcGNetList( ) { } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PrcGNetList::bClear( void ) { bSetSchemFiles( wxT("") ); bSetNetLstFile( wxT("") ); bSetGuileProc ( wxT("") ); return( TRUE ); } //***************************************************************************** // Initialize the array of possible Guile procedure names. void PrcGNetList::InitGuileProcs( void ) { m_osaGuileProcs.Clear( ); m_osaGuileProcs.Add( wxT("") ); // None m_osaGuileProcs.Add( wxT("allegro") ); // Allegro netlist format m_osaGuileProcs.Add( wxT("bae") ); // BAE netlist format m_osaGuileProcs.Add( wxT("bom") ); // BOM2 - Bill of Materials m_osaGuileProcs.Add( wxT("bom2") ); // BOM - Bill of Materials m_osaGuileProcs.Add( wxT("drc") ); // DRC - Start of a design rule checker m_osaGuileProcs.Add( wxT("geda") ); // gEDA - native format, mainly used for testing m_osaGuileProcs.Add( wxT("gossip") ); // Gossip netlist format m_osaGuileProcs.Add( wxT("pads") ); // PADS netlist format m_osaGuileProcs.Add( wxT("PCB") ); // PCB m_osaGuileProcs.Add( wxT("PCBboard") ); // PCBboard m_osaGuileProcs.Add( wxT("protelII") ); // ProtelII netlist format m_osaGuileProcs.Add( wxT("spice") ); // Spice compatible netlist format m_osaGuileProcs.Add( wxT("spice-sdb") ); // Enhanced spice compatible netlist format m_osaGuileProcs.Add( wxT("switcap") ); // Switcap netlist format m_osaGuileProcs.Add( wxT("tango") ); // Tango netlist format m_osaGuileProcs.Add( wxT("verilog") ); // Verilog code m_osaGuileProcs.Add( wxT("vhdl") ); // VHDL code m_osaGuileProcs.Add( wxT("vipec") ); // VIPEC netlist format } //***************************************************************************** // Set the schematic file name/s. // // Argument List : // rosFNames - A string containing the full path and file name/s // // Return Values : // TRUE - Success // FALSE - Failure bool PrcGNetList::bSetSchemFiles( const wxString & rosFNames ) { wxStringTokenizer ostk1; wxArrayString osa1; ostk1.SetString( rosFNames ); while( ostk1.HasMoreTokens( ) ) osa1.Add( ostk1.GetNextToken( ) ); return( bSetSchemFiles( osa1 ) ); } //***************************************************************************** // Set the schematic file name/s. // // Argument List : // rosaFNames - A string array containing the full path and file name/s // // Return Values : // TRUE - Success // FALSE - Failure bool PrcGNetList::bSetSchemFiles( const wxArrayString & rosaFNames ) { wxFileName ofn1; size_t sz1; // Clear the current list of schematic files m_ofnaSchemFiles.Clear( ); // Check the argument is empty if( rosaFNames.IsEmpty( ) ) return( TRUE ); // Add the new schematic file name/s to the list for( sz1=0; sz1=m_ofnaSchemFiles.GetCount( ) ) return( oFnEmpty ); return( m_ofnaSchemFiles[ szIndex ] ); } //***************************************************************************** // Get a Guile procedure from the list of procedure names. // // Argument List : // szIndex - A zero based index to the procedure name // (If szIndex = CUR_SEL_PROC return currently selected procedure) // // Return Values : // Success - The procedure name // Failure - An empty string const wxString & PrcGNetList::rosGetGuileProc( size_t szIndex ) { static wxString osEmpty; if( szIndex == GNETLST_CUR_PROC ) szIndex = m_szGuileProc; if( szIndex >= m_osaGuileProcs.GetCount( ) ) return( osEmpty ); return( m_osaGuileProcs[ szIndex ] ); } //***************************************************************************** // Make a netlist file from a schematic file. // (Eg. using the following: gnetlist -v -g spice-sdb -o test.ckt test.sch) // // Return Values : // TRUE - Success // FALSE - Failure bool PrcGNetList::bExec( void ) { wxString osArgLst; wxString os1; size_t sz1; // Test file names needed by this function if( ! bBinExists( ) ) return( FALSE ); if( m_ofnaSchemFiles.IsEmpty( ) ) return( FALSE ); if( ! m_ofnNetLstFile.IsOk( ) ) if( ! bSetNetLstFile( ) ) return( FALSE ); // Enable GNetList verbose mode osArgLst = wxT("-v"); // Specify the guile procedure name to be used osArgLst << wxT(" -g "); os1 = m_osaGuileProcs.Item( m_szGuileProc ); if( os1.IsEmpty( ) ) os1 = GNETLST_GUILE_PROC; osArgLst << os1; // Append input and output file names osArgLst << wxT(" -o ") << m_ofnNetLstFile.GetFullPath( ); for( sz1=0; sz1 // wxWidgets Includes #include #include // Application Includes #include "base/PrcBase.hpp" // Local Constant Declarations //***************************************************************************** class PrcGSchem : public PrcBase { private : ArrayFileName m_oafnSchems; // The full names of the schematic file/s public : PrcGSchem( void ); ~PrcGSchem( ); bool bSetSchems( const wxString & rosFileNames ); bool bSetSchems( const wxArrayString & roasFileNames ); const wxString & rosGetSchems( void ); const ArrayFileName & roaGetSchems( void ) { return( m_oafnSchems ); } virtual bool bExec( void ); }; //***************************************************************************** #endif // PRCGSCHEM_HPP gspiceui-1.0.00+dfsg/src/process/PrcGnuCap.hpp0000644000000000000000000000560311550603445017624 0ustar rootroot//***************************************************************************** // PrcGnuCap.hpp * // --------------- * // Description : This class provides the interface to the GNU-Cap electronic * // circuit simulator. * // Started : 01/09/2003 * // Last Update : 12/04/2011 * // Copyright : (C) 2003 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PRCGNUCAP_HPP #define PRCGNUCAP_HPP // System Includes // wxWidgets Includes #include #include // Application Includes #include "TypeDefs.hpp" #include "base/PrcSimrBase.hpp" #include "netlist/SimnGnuCap.hpp" #include "gnucap/commands/CmdGnuCapOP.hpp" #include "gnucap/commands/CmdGnuCapDC.hpp" #include "gnucap/commands/CmdGnuCapAC.hpp" #include "gnucap/commands/CmdGnuCapTR.hpp" #include "gnucap/commands/CmdGnuCapFO.hpp" #include "gnucap/commands/CmdGnuCapPR.hpp" #include "utility/ConvertType.hpp" // Local Constant Declarations #define GNUCAP_COL_WD 14 // Width of columns of data in the results files //***************************************************************************** class PrcGnuCap : public PrcSimrBase { private: // The label for the X axis variable (sometimes missing in GNU-Cap) wxString m_osInput; // Functions to check / format the circuit description lines // bool bFmtCpnts( ArrayComponent & roaCpnts ); ??? 17/08/2009 // Format the results file bool bFmtCommon ( void ); bool bFmtColLabels( void ); bool bFmtDataLines( void ); bool bFmtResultsFO( void ); public: PrcGnuCap( void ); ~PrcGnuCap( ); // Create the process argument list virtual bool bMakeArgLst( SimnBase & roSimn ); // Format the results file virtual bool bFmtResults( void ); }; //***************************************************************************** #endif // PRCGNUCAP_HPP gspiceui-1.0.00+dfsg/src/process/PrcGNetList.hpp0000644000000000000000000000677611570445652020162 0ustar rootroot//***************************************************************************** // GNetList.hpp * // -------------- * // Description : Provides a programatic interface to the utility gnetlist * // which is used to generate netlist file from various * // schematic editor formats. * // Started : 29/01/2004 * // Last Update : 30/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PRCGNETLIST_HPP #define PRCGNETLIST_HPP // System Includes #include // wxWidgets Includes #include #include #include #include // Application Includes #include "base/PrcBase.hpp" // Local Constant Declarations #define GNETLST_BIN_NAME wxT("gnetlist") // The binary file name #define GNETLST_LOG_FILE wxT("gspiceui.log") // Default log file name #define GNETLST_GUILE_PROC wxT("spice-sdb") // Default Guile procedure #define GNETLST_USE_SCHEM wxT("use-schem-name") // Use schem. name for netlist #define GNETLST_CUR_PROC 100 // A value greater than the no. of Guile proc's //***************************************************************************** class PrcGNetList : public PrcBase { private : size_t m_szGuileProc; // The Guile procedure specifier wxArrayString m_osaGuileProcs; // Array of all possible Guile procedures ArrayFileName m_ofnaSchemFiles; // The full names of the schematic file/s wxFileName m_ofnNetLstFile; // The full name of the list file void InitGuileProcs( void ); public : PrcGNetList( void ); ~PrcGNetList( ); bool bClear( void ); bool bSetGuileProc ( const wxString & rosGProc=GNETLST_GUILE_PROC ); bool bSetSchemFiles( const wxString & rosFNames ); bool bSetSchemFiles( const wxArrayString & rosaFNames ); bool bSetNetLstFile( const wxString & rosFName=GNETLST_USE_SCHEM ); const wxArrayString & rosaGetGuileProcs( void ) { return( m_osaGuileProcs ); } const wxString & rosGetGuileProc ( size_t szIndex=GNETLST_CUR_PROC ); const ArrayFileName & roaGetSchemFiles( void ) { return( m_ofnaSchemFiles ); } const wxFileName & roGetSchemFile ( size_t szIndex=0 ); const wxFileName & roGetNetLstFile( void ) { return( m_ofnNetLstFile ); } virtual bool bExec( void ); }; //***************************************************************************** #endif // PRCGNETLIST_HPP gspiceui-1.0.00+dfsg/src/App_gSpiceUI.hpp0000644000000000000000000000474011534675174016607 0ustar rootroot//***************************************************************************** // App_gSpiceUI.hpp * // ------------------ * // Description : The main application class. It all begins here. * // Started : 15/08/2003 * // Last Update : 07/03/2011 * // Copyright : (C) 2003 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef APP_GSPICEUI_HPP #define APP_GSPICEUI_HPP // System includes #include // In the following include using instead of at the // request of a user running Solaris 9 on a Ultra SPARC and Sun's C++ compiler. #include // wxWidgets includes #include #include // Application includes #include "CmdLinePcr.hpp" #include "main/FrmMain.hpp" // Global Variable declarations // This flag indicates debug mode, if it's enabled gspiceui will produce lots // of lovely console spew. bool g_bDebug; //***************************************************************************** class App_gSpiceUI : public wxApp { private: FrmMain * m_poFrmMain; CmdLinePcr m_oCmdLnPcr; public: App_gSpiceUI( void ); ~App_gSpiceUI( ); virtual bool OnInit ( void ); // virtual int MainLoop( void ); virtual int OnExit ( void ); // Event handlers // Leave this as the last line as private access is envoked by this macro // DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // APP_GSPICEUI_HPP gspiceui-1.0.00+dfsg/src/base/0000755000000000000000000000000011631255501014515 5ustar rootrootgspiceui-1.0.00+dfsg/src/base/NbkSimrBase.hpp0000644000000000000000000000626411630767745017417 0ustar rootroot//***************************************************************************** // NbkSimrBase.hpp * // ----------------- * // Description : Base class for all simulator notebooks which contains the * // individual analysis panels. * // Started : 05/05/2004 * // Last Update : 23/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef NBKSIMRBASE_HPP #define NBKSIMRBASE_HPP // System Includes #include // wxWidgets Includes #include #include // Application Includes #include "TypeDefs.hpp" #include "netlist/NetList.hpp" #include "base/SimnBase.hpp" #include "base/PnlAnaBase.hpp" // Local Constant Declarations #define NBKSIMR_WIDTH 576 #define NBKSIMR_HEIGHT 272 //***************************************************************************** class NbkSimrBase : public wxNotebook { protected : // Error message wxString m_osErrMsg; // Attribute to identify the simulation engine type eSimrType m_eSimEng; public : NbkSimrBase( wxWindow * poParent, wxWindowID oWinID ); NbkSimrBase( void ); ~NbkSimrBase( ); virtual bool bClear( void ); bool bIsOk ( void ) { return( m_osErrMsg.IsEmpty( ) ); } virtual bool bLoad( const SimnBase & roSimn ) = 0; virtual bool bSave( SimnBase & roSimn ) = 0; virtual bool bSetPage( const wxChar * psAnalysis ) = 0; virtual bool bSetPage( eCmdType eAnalysis ) = 0; virtual const wxString & rosGetPage( void ) = 0; virtual eCmdType eGetPage( void ) = 0; eSimrType eGetSimEng( void ) { return( m_eSimEng ); } const wxString & rosGetErrMsg( void ) { return( m_osErrMsg ); } void SetErrMsg( const wxString & rosErrMsg ) { if( bIsOk( ) ) m_osErrMsg = rosErrMsg; } // Event handlers void OnPageChangd( wxNotebookEvent & roEvtNbk ); // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // NBKSIMRBASE_HPP gspiceui-1.0.00+dfsg/src/base/NbkSimrBase.cpp0000644000000000000000000001044011631255501017360 0ustar rootroot//***************************************************************************** // NbkSimrBase.cpp * // ----------------- * // Started : 05/05/2004 * // Last Update : 23/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "base/NbkSimrBase.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( NbkSimrBase, wxNotebook ) EVT_NOTEBOOK_PAGE_CHANGED( -1, NbkSimrBase::OnPageChangd ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Arguments: // poParent - The parent window // oWinID - The display object ID // roPosn - The notebook position // roSize - The notebook size NbkSimrBase::NbkSimrBase( wxWindow * poParent, wxWindowID oWinID ) : wxNotebook( poParent, oWinID ) { // Set the simulator engine type specifier m_eSimEng = eSIMR_NONE; } //***************************************************************************** // Default constructor. // (Used for two stage creation ie. must call Create( ) method. NbkSimrBase::NbkSimrBase( void ) : wxNotebook( ) { m_eSimEng = eSIMR_NONE; } //***************************************************************************** // Destructor. NbkSimrBase::~NbkSimrBase( ) { } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool NbkSimrBase::bClear( void ) { m_osErrMsg.Empty( ); // Clear the error string return( TRUE ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // This event is generated when a notebook page has just changed. // // Argument List: // roEvtNbk - An object holding information about the event void NbkSimrBase::OnPageChangd( wxNotebookEvent & roEvtNbk ) { PnlAnaBase * poPnlAna; wxString os1; // Get a pointer to the currently displayed analysis page poPnlAna = (PnlAnaBase *) GetCurrentPage( ); if( poPnlAna == NULL ) return; // Synchronize the sweep sources between the different analysis pages if( poPnlAna->m_bSyncSwpSrcs ) { os1 = poPnlAna->m_oCpntSwpSrcs.m_osName; if( poPnlAna->m_oChoSrcName.SetStringSelection( os1 ) ) { // Set the sweep source value if it's been defined if( poPnlAna->m_oPnlSrcLvl.GetParent( ) != NULL ) { poPnlAna->m_oPnlSrcLvl.bSetUnitsType( poPnlAna->m_oCpntSwpSrcs.eGetUnitsType() ); poPnlAna->m_oPnlSrcLvl.bSetValue( poPnlAna->m_oCpntSwpSrcs.m_osValue ); } } else { // Couldn't set the sweep source name so clear it poPnlAna->m_oChoSrcName.SetSelection( 0 ); if( poPnlAna->m_oPnlSrcLvl.GetParent( ) != NULL ) { poPnlAna->m_oPnlSrcLvl.bSetUnitsType( eUNITS_NONE ); poPnlAna->m_oPnlSrcLvl.bSetValue( 0.0 ); } } } } //***************************************************************************** gspiceui-1.0.00+dfsg/src/base/PrcBase.hpp0000644000000000000000000000730311603102655016550 0ustar rootroot//***************************************************************************** // PrcBase.hpp * // ------------- * // Description : Provides a wrapper for the wxProcess class adding a bit of * // extra desirable functionality. * // Started : 29/01/2004 * // Last Update : 14/04/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PRCBASE_HPP #define PRCBASE_HPP // System Includes using namespace std; #include // wxWidgets Includes #include #include #include #include // Application Includes #include "TypeDefs.hpp" #include "utility/TextCtrl.hpp" #include "utility/StrUtils.hpp" // Local Constant Declarations #define DEF_LOG_FILE wxT("./prcbase.log") // Default log file path and name //***************************************************************************** class PrcBase : protected wxProcess { protected : wxFileName m_ofnBinary; // The file name of the binary to be executed wxString m_osArgLst; // The argument list appended to the binary name int m_iPid; // The process ID number int m_iExitCode; // The process exit code wxFileName m_ofnLog; // The file name of the simulation log wxString m_osErrMsg; // Error message bool bFindBinary( wxFileName & rofnBinary ); bool bLogOutput ( void ); public : PrcBase( int iFlags=wxPROCESS_REDIRECT ); ~PrcBase( ); bool bBinExists( void ); bool bIsExec( void ) { return( m_iPid>0 ? TRUE : FALSE ); } bool bIsOk ( void ) { return( m_iExitCode==0 && m_osErrMsg.IsEmpty( ) ); } bool bSetBinary ( const wxString & rosFName ); bool bSetArgLst ( const wxString & rosArgLst ); bool bSetLogFile( const wxString & rosFName ); void SetErrMsg ( const wxString & rosErrMsg ) { if( bIsOk( ) ) m_osErrMsg = rosErrMsg; } const wxFileName & roGetBinary ( void ) { return( m_ofnBinary ); } const wxString & rosGetArgLst ( void ) { return( m_osArgLst ); } const wxFileName & roGetLogFile( void ) { return( m_ofnLog ); } const wxString & rosGetErrMsg ( void ) { return( m_osErrMsg ); } virtual bool bExecAsync( void ); virtual bool bExecSync ( void ); virtual bool bKill ( void ); bool bDelLogFile( void ); void Print ( TextCtrl & roTxtCtl ); void PrintCmd( TextCtrl & roTxtCtl ); void PrintRsp( TextCtrl & roTxtCtl ); // Event handlers void OnTerminate( int iPid, int iStatus ); }; //***************************************************************************** #endif // PRCBASE_HPP gspiceui-1.0.00+dfsg/src/base/PrcSimrBase.cpp0000644000000000000000000001605611603102710017373 0ustar rootroot//***************************************************************************** // PrcSimrBase.cpp * // ----------------- * // Started : 25/04/2004 * // Last Update : 12/03/2010 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "base/PrcSimrBase.hpp" //***************************************************************************** // Constructor. PrcSimrBase::PrcSimrBase( void ) : PrcBase( wxPROCESS_REDIRECT ) { m_eSimEng = eSIMR_NONE; } //***************************************************************************** // Destructor. PrcSimrBase::~PrcSimrBase( ) { } //***************************************************************************** // Set the simulation results file name. // // Argument List : // rosFName - A string containing the full path and file name // // Return Values : // TRUE - Success // FALSE - Failure bool PrcSimrBase::bSetResultsFile( const wxString & rosFName ) { wxFileName ofn1; ofn1 = rosFName; if( ofn1.GetPath( ).IsEmpty( ) ) ofn1.SetPath( wxT(".") ); if( ! ofn1.IsOk( ) ) return( FALSE ); m_ofnResults = ofn1; return( TRUE ); } //***************************************************************************** // Save the console output to file. // // Argument List : // rosFName - The save file name // // Return Values : // TRUE - Success // FALSE - Failure bool PrcSimrBase::bSaveOutput( const wxString & rosFName ) { wxOutputStream * poStdOut; wxInputStream * poStdIn; wxInputStream * poStdErr; wxFileName ofn1; wxString os1, os2; wxChar oc1; // Check the validity of the save file name if( rosFName.IsEmpty( ) ) return( FALSE ); ofn1 = rosFName; if( ! ofn1.IsOk( ) ) return( FALSE ); // Open the file wxTextFile oFileCct( ofn1.GetFullPath( ) ); if( oFileCct.Exists( ) ) { if( ! oFileCct.Open( ) ) return( FALSE ); } else { if( ! oFileCct.Create( ) ) return( FALSE ); } // Clear the file if it contains lines oFileCct.Clear( ); wxMicroSleep( 100 ); // 23/03/2011 ??? What's this for? // Get input stream objects to standard out and standard error poStdOut = GetOutputStream( ); poStdIn = GetInputStream( ); poStdErr = GetErrorStream( ); // Save the simulator output to file while( bIsExec( ) || poStdIn->CanRead( ) || poStdErr->CanRead( ) ) { // Input characters from stdout while( poStdIn->CanRead( ) ) { // Get a character from the input stream oc1 = poStdIn->GetC( ); // Build each string if( oc1==wxT('\t') || (oc1>31 && oc1!=127) ) os1 << oc1; // Append completed strings to the log file if( oc1 == wxT('\n') ) { oFileCct.AddLine( os1 ); os1 = wxT(""); } } // Input characters from stderr while( poStdErr->CanRead( ) ) { // Get a character from the input stream oc1 = poStdErr->GetC( ); // Build each string if( oc1==wxT('\t') || (oc1>31 && oc1!=127) ) os2 << oc1; // Append completed strings to the log file if( oc1 == wxT('\n') ) { oFileCct.AddLine( os2 ); os2 = wxT(""); } } // Release the processor for other tasks wxTheApp->Yield( ); } // Delete the stream objects delete poStdOut; delete poStdIn; delete poStdErr; SetPipeStreams( NULL, NULL, NULL ); // Save any unterminated strings if( os1.Length( ) > 0 ) oFileCct.AddLine( os1 ); if( os2.Length( ) > 0 ) oFileCct.AddLine( os2 ); oFileCct.AddLine( wxT("") ); oFileCct.Write( ); // Save the changes to disk oFileCct.Close( ); // Close the results file return( TRUE ); } //***************************************************************************** // Make the process argument list based on the contents of a simulation object. // // Argument List : // roSimn - The simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PrcSimrBase::bMakeArgLst( SimnBase & roSimn ) { wxString os1; int i1; // Clear error attributes m_osErrMsg.Empty( ); // Only proceed if the simulator isn't already running if( bIsExec( ) ) { SetErrMsg( wxT("Simulator already running") ); return( FALSE ); } // Create the results file name os1 = roSimn.roGetLoadFile( ).GetPath( ) + wxT('/') + roSimn.roGetLoadFile( ).GetName( ); i1 = os1.Find( wxT(".gspiceui") ); if( i1 > 0 ) os1 = os1.Truncate( (size_t) i1 ); os1 << wxT('.') << roGetBinary( ).GetName( ); switch( roSimn.eGetAnaType( ) ) { case eCMD_OP : os1 << wxT(".op"); break; case eCMD_DC : os1 << wxT(".dc"); break; case eCMD_AC : os1 << wxT(".ac"); break; case eCMD_TR : os1 << wxT(".tr"); break; case eCMD_FO : os1 << wxT(".fo"); break; case eCMD_DI : os1 << wxT(".di"); break; case eCMD_NO : os1 << wxT(".no"); break; case eCMD_PZ : os1 << wxT(".pz"); break; case eCMD_SE : os1 << wxT(".se"); break; case eCMD_TF : os1 << wxT(".tf"); break; default : return( FALSE ); } // Set the results file name if( ! PrcSimrBase::bSetResultsFile( os1 ) ) { SetErrMsg( wxT("Couldn't set results file name") ); return( FALSE ); } // Construct the default argument list os1 = roSimn.roGetSaveFile( ).GetFullPath( ); if( ! bSetArgLst( os1 ) ) { SetErrMsg( wxT("Couldn't set argument list") ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Execute a simulation. // // Argument List : // roSimn - The simulation object // // Return Values : // TRUE - Success // FALSE - Failure bool PrcSimrBase::bExec( void ) { wxString os1, os2; // Execute the simulation if( ! PrcBase::bExecAsync( ) ) return( FALSE ); // Save the simulation results to the log file os1 = roGetLogFile( ).GetFullPath( ); if( ! bSaveOutput( os1 ) ) return( FALSE ); // Copy the log file to the results file os2 = roGetResultsFile( ).GetFullPath( ); if( ! wxCopyFile( os1, os2 ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/base/PrcSimrBase.hpp0000644000000000000000000000540711603102710017376 0ustar rootroot//***************************************************************************** // PrcSimrBase.hpp * // ----------------- * // Description : This is the base class for classes which provide the * // interface to the SPICE circuit simulator. * // Started : 25/04/2004 * // Last Update : 01/04/2011 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PRCSIMRBASE_HPP #define PRCSIMRBASE_HPP // System Includes // wxWidgets Includes #include // Application Includes #include "TypeDefs.hpp" #include "base/PrcBase.hpp" #include "base/SimnBase.hpp" #include "netlist/NetList.hpp" // Local Constant Declarations //***************************************************************************** class PrcSimrBase : public PrcBase { protected : eSimrType m_eSimEng; // Simulation engine specifier wxFileName m_ofnResults; // The file name of the process output wxTextFile m_oFileResults; // A text file object for the above // Save the console output to file bool bSaveOutput( const wxString & rosFName ); bool bErrorCheck( const wxString & rosFName ); public : PrcSimrBase( void ); ~PrcSimrBase( ); bool bSetResultsFile( const wxString & rosFName ); eSimrType eGetSimEng ( void ) { return( m_eSimEng ); } const wxFileName & roGetResultsFile( void ) { return( m_ofnResults ); } // Create the process argument list virtual bool bMakeArgLst( SimnBase & roSimn ); // Execute the simulation virtual bool bExec( void ); // Format the results file virtual bool bFmtResults( void ) = 0; }; //***************************************************************************** #endif // PRCSIMRBASE_HPP gspiceui-1.0.00+dfsg/src/base/SimnBase.cpp0000644000000000000000000002054111603102575016725 0ustar rootroot//***************************************************************************** // SimnBase.cpp * // -------------- * // Started : 01/05/2008 * // Last Update : 01/07/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "base/SimnBase.hpp" //***************************************************************************** // Constructor. SimnBase::SimnBase( void ) { m_eSimEng = eSIMR_NONE; // Initialize all object attributes bClear( ); } //***************************************************************************** // Destructor. SimnBase::~SimnBase( ) { } //***************************************************************************** // Extract the source component. // // Several tasks are performed here : // - Search for a component which is being used as a signal source. // - Extract the source component's original definition. // - Set the attribute m_oCpntSwpSrc to the source component definition. // - Set the component in m_oaCpnts to it's original definition. // // Return Values : // TRUE - Success // FALSE - Failure bool SimnBase::bLoadSigSrc( void ) { Component oCpnt; wxString os1; size_t sz1; // Scan the circuit description for a source component for( sz1=0; sz1eSIMR_FST ) { SetErrMsg( wxT("No simulation engine has been specified.") ); return( FALSE ); } if( eGetAnaType( )eCMD_ANA_LST ) ; { SetErrMsg( wxT("No analysis type has been specified.") ); return( FALSE ); } // Have any test components or test nodes been specified? if( rosaGetTstNodes( ).GetCount( )<=0 || rosaGetTstCpnts( ).GetCount( )<=0 ) { SetErrMsg( wxT("No nodes or components have been selected.") ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Load (or reload) the simulation from file. // // Argument List : // rosFName - The name of the file to be loaded // // Return Values : // TRUE - Success // FALSE - Failure bool SimnBase::bLoadFile( const wxString & rosFName ) { // Load the basic netlist file if( ! NetList::bLoadFile( rosFName ) ) return( FALSE ); // Check for a simulator signifier if( ! bLoadSimEng( ) ) return( FALSE ); // Extract the simulator instructions bLoadSimCmds( ); bLoadSigSrc ( ); return( TRUE ); } //***************************************************************************** // Save (or resave) the simulation to file. // // Argument List : // rosFName - The name of the file to be saved // // Return Values : // TRUE - Success // FALSE - Failure bool SimnBase::bSaveFile( const wxString & rosFName ) { // Save the netlist to file if( ! NetList::bSaveFile( rosFName ) ) return( FALSE ); // Save the signal source to the simulation file if( ! bSaveSigSrc( ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Copy the contents of a SimnBase object. // // Argument List : // roSimn - A reference to a SimnBase object // // Return Values : // A reference to this object SimnBase & SimnBase::operator = ( const SimnBase & roSimn ) { m_oCpntSwpSrc = roSimn.m_oCpntSwpSrc; return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void SimnBase::Print( const wxString & rosPrefix ) { NetList::Print( rosPrefix + wxT("NetList::") ); cout << rosPrefix.mb_str( ) << "m_eSimEng : "; switch( m_eSimEng ) { case eSIMR_GNUCAP : cout << "eSIMR_GNUCAP"; break; case eSIMR_NGSPICE : cout << "eSIMR_NGSPICE"; break; case eSIMR_NONE : cout << "eSIMR_NONE"; break; } cout << '\n'; cout << rosPrefix .mb_str( ) << "m_osErrMsg : " << m_osErrMsg.mb_str( ) << '\n'; m_oCpntSwpSrc.Print( rosPrefix + wxT("m_oCpntSwpSrc::") ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/base/SimnBase.hpp0000644000000000000000000000736311567203537016752 0ustar rootroot//***************************************************************************** // SimnBase.hpp * // -------------- * // Description : This class is the base class for all simulation classes. * // Started : 01/05/2008 * // Last Update : 26/05/2011 * // Copyright : (C) 2008 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef SIMNBASE_HPP #define SIMNBASE_HPP // System Includes using namespace std; #include #include // wxWidgets Includes #include // Application Includes #include "TypeDefs.hpp" #include "CmdBase.hpp" #include "netlist/NetList.hpp" #include "utility/ConvertType.hpp" // Local Constant Declarations //***************************************************************************** struct SimnBase : public NetList { protected : // Attribute to identify the simulation engine type eSimrType m_eSimEng; // Error message generated by bValidate( ) wxString m_osErrMsg; // Function to extract information from the circuit description virtual bool bLoadSimEng ( void ) = 0; virtual bool bLoadSimCmds( void ) = 0; virtual bool bLoadSigSrc ( void ); // Functions to save the circuit description to file bool bSaveSigSrc ( void ); virtual bool bSaveSimCmds( void ) = 0; public : // The signal source component Component m_oCpntSwpSrc; SimnBase( void ); virtual ~SimnBase( ); virtual bool bClear ( void ); virtual bool bClrCmds ( void ) = 0; virtual bool bClrTstPts( void ) = 0; virtual bool bValidate( void ); virtual bool bIsValid ( void ) { return( NetList::bIsValid() && m_osErrMsg.IsEmpty() ); } virtual bool bLoadFile( const wxString & rosFName=wxT("") ); virtual bool bSaveFile( const wxString & rosFName=wxT("") ); virtual bool bSetAnaType( eCmdType eAnaType ) = 0; void SetErrMsg ( const wxString & rosErrMsg ) { if( bIsValid( ) ) m_osErrMsg = rosErrMsg; } virtual bool bAddTstNode( const wxString & rosNode ) = 0; virtual bool bAddTstCpnt( const wxString & rosCpnt ) = 0; eSimrType eGetSimEng ( void ) const { return( m_eSimEng ); } virtual eCmdType eGetAnaType ( void ) const = 0; const wxString & rosGetErrMsg ( void ) const { return( m_osErrMsg ); } virtual const wxArrayString & rosaGetTstNodes( void ) = 0; virtual const wxArrayString & rosaGetTstCpnts( void ) = 0; SimnBase & operator = ( const SimnBase & roSimn ); virtual void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // SIMNBASE_HPP gspiceui-1.0.00+dfsg/src/base/PnlAnaBase.cpp0000644000000000000000000005375511631255501017204 0ustar rootroot//***************************************************************************** // PnlAnaBase.cpp * // ---------------- * // Started : 26/04/2004 * // Last Update : 09/08/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "base/PnlAnaBase.hpp" //***************************************************************************** // Allocate storage for static data members. bool PnlAnaBase::m_bSyncSwpSrcs = FALSE; Component PnlAnaBase::m_oCpntSwpSrcs; //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlAnaBase, wxPanel ) EVT_CHOICE( ID_CHO_SRCNAME, PnlAnaBase::OnSrcName ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // poWin - A pointer to the parent window PnlAnaBase::PnlAnaBase( wxWindow * poWin ) : wxPanel( poWin ) { m_eSimEng = eSIMR_NONE; m_eAnaType = eCMD_NONE; CreateBase( ); // Create the analysis panel bClear( ); // Clear all object attributes } //***************************************************************************** // Destructor. PnlAnaBase::~PnlAnaBase( ) { } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlAnaBase::bClear( void ) { bool bRtn=TRUE; // Set sweep default values if( ! m_oPnlStart.bSetDefaults( ) ) bRtn = FALSE; if( ! m_oPnlStop .bSetDefaults( ) ) bRtn = FALSE; if( ! m_oPnlStep .bSetDefaults( ) ) bRtn = FALSE; // Set input source default values if( bIsCreated( eCTLGRP_SIGSRC ) && m_oSbxSrc.IsShown( ) ) { m_oChoSrcName.Clear( ); m_oChoSrcName.Append( wxT("None") ); m_oChoSrcName.SetSelection( 0 ); if( m_oPnlSrcLvl.GetParent( ) != NULL ) { m_oPnlSrcLvl.bSetValue( (float) 0.0 ); m_oPnlSrcLvl.bSetUnitsType( eUNITS_NONE ); } } // Set parameters check box default values m_oCbxVoltage.SetValue( TRUE ); m_oCbxCurrent.SetValue( FALSE ); m_oCbxPower .SetValue( FALSE ); m_oCbxResist .SetValue( FALSE ); // Set the analysis temperature default value if( bIsCreated( eCTLGRP_TEMP ) && m_oSbxTemp.IsShown( ) ) if( ! m_oPnlTemp.bSetDefaults( ) ) bRtn = FALSE; m_osErrMsg.Empty( ); // Clear the error string return( bRtn ); } //***************************************************************************** // Create the basic display objects. void PnlAnaBase::CreateBase( void ) { wxPanel * poPnl; if( bIsCreated( eCTLGRP_BASE ) ) return; // Create the sweep panel and controls #ifdef LAYOUT_MNGR poPnl = new wxPanel( this ); #else poPnl = this; // ??? #endif // LAYOUT_MNGR // Create and add sweep parameter labels #ifdef LAYOUT_MNGR m_oPnlStart.bCreate( poPnl, ID_PNL_START, 120 ); m_oPnlStop .bCreate( poPnl, ID_PNL_STOP, 120 ); m_oPnlStep .bCreate( poPnl, ID_PNL_STEP, 120 ); #else m_oSbxSwpPars.Create( poPnl, ID_UNUSED, wxT(" Sweep Parameters "), wxPoint( 6, 5 ), wxSize( 330, 120 ) ); m_oPnlStart.bCreate( poPnl, ID_PNL_START, 120, wxPoint( 18, 28 ) ); m_oPnlStop .bCreate( poPnl, ID_PNL_STOP, 120, wxPoint( 18, 58 ) ); m_oPnlStep .bCreate( poPnl, ID_PNL_STEP, 120, wxPoint( 18, 88 ) ); #endif // LAYOUT_MNGR m_oPnlStart.bSetName( wxT("Start Value") ); m_oPnlStop .bSetName( wxT("Stop Value") ); m_oPnlStep .bSetName( wxT("Step Increment") ); m_oSbxSwpPars.SetOwnFont( FONT_SLANT ); // Create the parameter (probe) panel and controls #ifdef LAYOUT_MNGR poPnl = new wxPanel( this ); #else poPnl = this; // ??? #endif // LAYOUT_MNGR // Create and add simulation parameter check boxes #ifdef LAYOUT_MNGR m_oCbxVoltage .Create( poPnl, ID_CBX_VOLT, wxT("Voltage") ); m_oCbxCurrent .Create( poPnl, ID_CBX_CURR, wxT("Current") ); m_oCbxPower .Create( poPnl, ID_CBX_PWR, wxT("Power") ); m_oCbxResist .Create( poPnl, ID_CBX_RES, wxT("Resistance") ); #else m_oSbxCalcPars.Create( poPnl, ID_UNUSED , wxT(" Parameters "), wxPoint( 343, 5 ), wxSize( 105, 122 ) ); m_oCbxVoltage .Create( poPnl, ID_CBX_VOLT, wxT("Voltage"), wxPoint( 349, 25 ) ); m_oCbxCurrent .Create( poPnl, ID_CBX_CURR, wxT("Current"), wxPoint( 349, 50 ) ); m_oCbxPower .Create( poPnl, ID_CBX_PWR, wxT("Power"), wxPoint( 349, 75 ) ); m_oCbxResist .Create( poPnl, ID_CBX_RES, wxT("Resistance"), wxPoint( 349, 100 ) ); #endif // LAYOUT_MNGR m_oSbxCalcPars.SetOwnFont( FONT_SLANT ); // Create and add .OPTIONS configuration dialog button #ifdef LAYOUT_MNGR m_oBtnOPTIONS.Create( this, ID_BTN_OPTIONS, wxT(" .OPTIONS ... ") ); #else m_oBtnOPTIONS.Create( this, ID_BTN_OPTIONS, wxT(".OPTIONS ..."), wxPoint( 343, 137 ), wxSize( 105, 29 ) ); #endif // LAYOUT_MNGR } //***************************************************************************** // Create the scale display objects. void PnlAnaBase::CreateScale( void ) { wxPanel * poPnl; if( bIsCreated( eCTLGRP_SCALE ) ) return; // Create and add the scale radio buttons poPnl = (wxPanel *) m_oPnlStart.GetParent( ); wxString osScale[ 4 ] = { wxT("Lin "), wxT("Log "), wxT("Dec "), wxT("Oct ") }; m_oRbxScale.Create( poPnl, ID_RBX_SCALE, wxT(" Step Scale "), wxPoint( 13, 123 ), wxDefaultSize, 4, osScale, 4 ); m_oRbxScale.SetSelection( eSCALE_LIN ); } //***************************************************************************** // Create the initial conditions display objects. void PnlAnaBase::CreateInitC( void ) { wxPanel * poPnl; if( bIsCreated( eCTLGRP_INITC ) ) return; // Create and add the initial conditions radio buttons poPnl = (wxPanel *) m_oPnlStart.GetParent( ); wxString osInitC[ 3 ] = { wxT("Warm "), wxT("Use ICs"), wxT("Cold ") }; m_oRbxInitC.Create( poPnl, ID_UNUSED, wxT(" Initial Conditions "), wxPoint( 13, 123 ), wxDefaultSize, 3, osInitC, 3 ); m_oRbxInitC.SetSelection( eINITC_WARM ); } //***************************************************************************** // Create the source component display objects. void PnlAnaBase::CreateSrc( void ) { wxPanel * poPnl; if( bIsCreated( eCTLGRP_SIGSRC ) ) return; // Create the input source panel and controls #ifdef LAYOUT_MNGR poPnl = new wxPanel( this ); #else poPnl = this; // ??? #endif // LAYOUT_MNGR // Create and add input source #ifdef LAYOUT_MNGR m_oChoSrcName.Create( poPnl, ID_CHO_SRCNAME ); m_oPnlSrcLvl.bCreate( poPnl, ID_PNL_SRCLVL ); #else m_oSbxSrc .Create( poPnl, ID_UNUSED, wxT(" Signal Source "), wxPoint( 6, 175 ), wxSize( 330, 55 ) ); m_oChoSrcName.Create( poPnl, ID_CHO_SRCNAME, wxPoint( 18, 195 ), wxSize( 121, -1 ) ); m_oPnlSrcLvl.bCreate( poPnl, ID_PNL_SRCLVL, -1, wxPoint( 143, 193 ) ); #endif // LAYOUT_MNGR // Set static box font m_oSbxSrc.SetOwnFont( FONT_SLANT ); } //***************************************************************************** // Create the simulation parameter complex part display objects. void PnlAnaBase::CreateCpxPrt( void ) { wxPanel * poPnl; if( bIsCreated( eCTLGRP_CPXPRT ) ) return; // Create the parameter (probe) complex part panel and controls #ifdef LAYOUT_MNGR poPnl = new wxPanel( this ); #else poPnl = this; // ??? #endif // LAYOUT_MNGR // Create and add simulation parameter complex part check boxes #ifdef LAYOUT_MNGR m_oCbxMag .Create( poPnl, ID_CBX_MAG , wxT("Magnitude") ); m_oCbxPhase .Create( poPnl, ID_CBX_PHASE, wxT("Phase") ); m_oCbxReal .Create( poPnl, ID_CBX_REAL , wxT("Real Part") ); m_oCbxImag .Create( poPnl, ID_CBX_IMAG , wxT("Imag. Part") ); m_oCbxMagDb .Create( poPnl, ID_CBX_MAGDB, wxT("Mag. in dB") ); #else m_oSbxCpxPrt.Create( poPnl, ID_UNUSED, wxT(" Complex Parts "), wxPoint( 455, 5 ), wxSize( 110, 146 ) ); m_oCbxMag .Create( poPnl, ID_CBX_MAG, wxT("Magnitude"), wxPoint( 461, 24 ) ); m_oCbxPhase .Create( poPnl, ID_CBX_PHASE, wxT("Phase"), wxPoint( 461, 49 ) ); m_oCbxReal .Create( poPnl, ID_CBX_REAL, wxT("Real Part"), wxPoint( 461, 74 ) ); m_oCbxImag .Create( poPnl, ID_CBX_IMAG, wxT("Imag. Part"), wxPoint( 461, 99 ) ); m_oCbxMagDb .Create( poPnl, ID_CBX_MAGDB, wxT("Mag. in dB"), wxPoint( 461,124 ) ); #endif // LAYOUT_MNGR // Set static box font m_oSbxCpxPrt.SetOwnFont( FONT_SLANT ); } //***************************************************************************** // Create the analysis temperature display objects. void PnlAnaBase::CreateTemp( void ) { wxPanel * poPnl; if( bIsCreated( eCTLGRP_TEMP ) ) return; // Create the temperature panel and controls #ifdef LAYOUT_MNGR poPnl = new wxPanel( this ); #else poPnl = this; #endif // LAYOUT_MNGR // Create and add analysis temperature #ifdef LAYOUT_MNGR m_oPnlTemp.bCreate( poPnl, ID_PNL_TEMP ); #else m_oSbxTemp. Create( poPnl, ID_UNUSED, wxT(" Temperature "), wxPoint( 343, 175 ), wxSize( 205, 55 ) ); m_oPnlTemp.bCreate( poPnl, ID_PNL_TEMP, -1, wxPoint( 355, 193 ) ); #endif // LAYOUT_MNGR m_oPnlTemp.bSetUnitsType( eUNITS_TEMP ); // Set static box font m_oSbxTemp.SetOwnFont( FONT_SLANT ); } //***************************************************************************** // Test if a certain group of controls has been created. // // Return Values : // Success - TRUE // Failure - FALSE bool PnlAnaBase::bIsCreated( enum eTypeCtlGrp eCtlGrp ) { wxWindow * poCtlGrp; if( eCtlGrpeCTLGRP_LST ) return( FALSE ); switch( eCtlGrp ) { case eCTLGRP_BASE : poCtlGrp = &m_oPnlStart; break; case eCTLGRP_SCALE : poCtlGrp = &m_oRbxScale; break; case eCTLGRP_INITC : poCtlGrp = &m_oRbxInitC; break; case eCTLGRP_SIGSRC : poCtlGrp = &m_oChoSrcName; break; case eCTLGRP_CPXPRT : poCtlGrp = &m_oCbxMag; break; case eCTLGRP_TEMP : poCtlGrp = &m_oPnlTemp; break; default : return( FALSE ); } return( poCtlGrp->GetParent( ) != NULL ); } //***************************************************************************** // Layout the panel display objects. void PnlAnaBase::DoLayout( void ) { #ifndef LAYOUT_MNGR return; #endif wxWindow * poWin; wxSizer * poSzr; wxGridBagSizer * poSzrGB; wxSizerFlags oFlags; wxGBPosition oGBPosn; wxGBSpan oGBSpan; int iFlags; int iBorder; //***************************************************************** // Create and set the sizer for the sweep panel poWin = m_oPnlStart.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Sweep Parameters ") ); poWin->SetSizer( poSzr ); // Layout the sweep panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL & ~wxBOTTOM, 3 ); poSzr->Add( &m_oPnlStart, oFlags ); poSzr->Add( &m_oPnlStop , oFlags ); poSzr->Add( &m_oPnlStep , oFlags ); poSzr->AddSpacer( 3 ); if( bIsCreated( eCTLGRP_SCALE ) ) poSzr->Add( &m_oRbxScale, oFlags ); if( bIsCreated( eCTLGRP_INITC ) ) poSzr->Add( &m_oRbxInitC, oFlags ); //***************************************************************** if( bIsCreated( eCTLGRP_SIGSRC ) ) { // Create and set the sizer for the signal source panel poWin = m_oChoSrcName.GetParent( ); poSzr = new wxStaticBoxSizer( wxHORIZONTAL, poWin, wxT(" Signal Source ") ); poWin->SetSizer( poSzr ); // Layout the signal source panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL, 3 ); poSzr->Add( &m_oChoSrcName, oFlags ); poSzr->Add( &m_oPnlSrcLvl , oFlags ); } //***************************************************************** // Create and set the sizer for the parameter (probe) panel poWin = m_oCbxVoltage.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Parameters ") ); poWin->SetSizer( poSzr ); // Layout the parameter (probe) panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL & ~wxBOTTOM, 3 ); poSzr->Add( &m_oCbxVoltage, oFlags ); poSzr->Add( &m_oCbxCurrent, oFlags ); poSzr->Add( &m_oCbxPower , oFlags ); poSzr->Add( &m_oCbxResist , oFlags ); poSzr->AddSpacer( 3 ); //***************************************************************** if( bIsCreated( eCTLGRP_CPXPRT ) ) { // Create and set the sizer for the complex part panel poWin = m_oCbxMag.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Complex Parts ") ); poWin->SetSizer( poSzr ); // Layout the complex part panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL & ~wxBOTTOM, 3 ); poSzr->Add( &m_oCbxMag , oFlags ); poSzr->Add( &m_oCbxPhase, oFlags ); poSzr->Add( &m_oCbxReal , oFlags ); poSzr->Add( &m_oCbxImag , oFlags ); poSzr->Add( &m_oCbxMagDb, oFlags ); poSzr->AddSpacer( 3 ); } //***************************************************************** if( bIsCreated( eCTLGRP_TEMP ) ) { // Create and set the sizer for the complex part panel poWin = m_oPnlTemp.GetParent( ); poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Temperature ") ); poWin->SetSizer( poSzr ); // Layout the complex part panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxALL, 3 ); poSzr->Add( &m_oPnlTemp, oFlags ); } //***************************************************************** // Create and set the underlying panel's sizer poSzrGB = new wxGridBagSizer( 1, 1 ); SetSizer( poSzrGB ); // Add the sweep panel poWin = m_oPnlStart.GetParent( ); oGBPosn.SetCol( 0 ); oGBPosn.SetRow( 0 ); oGBSpan.SetColspan( 3 ); oGBSpan.SetRowspan( 4 ); iFlags = wxALL | wxALIGN_CENTER; iBorder = 5; poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder ); if( bIsCreated( eCTLGRP_SIGSRC ) ) { // Add the signal source panel poWin = m_oChoSrcName.GetParent( ); oGBPosn.SetCol( 0 ); oGBPosn.SetRow( 4 ); oGBSpan.SetColspan( 3 ); oGBSpan.SetRowspan( 1 ); iFlags = wxALL | wxALIGN_LEFT; poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder ); } // Add the parameter (probe) panel poWin = m_oCbxVoltage.GetParent( ); oGBPosn.SetCol( 3 ); oGBPosn.SetRow( 0 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 3 ); poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder ); // Add the options button oGBPosn.SetCol( 3 ); oGBPosn.SetRow( 3 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 1 ); iFlags = wxALL | wxALIGN_CENTER; poSzrGB->Add( &m_oBtnOPTIONS, oGBPosn, oGBSpan, iFlags, iBorder ); if( bIsCreated( eCTLGRP_CPXPRT ) ) { // Add the complex parts panel poWin = m_oCbxMag.GetParent( ); oGBPosn.SetCol( 4 ); oGBPosn.SetRow( 0 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 4 ); poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder ); } if( bIsCreated( eCTLGRP_TEMP ) ) { // Add the temperature panel poWin = m_oPnlTemp.GetParent( ); oGBPosn.SetCol( 3 ); oGBPosn.SetRow( 4 ); oGBSpan.SetColspan( 2 ); oGBSpan.SetRowspan( 1 ); poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder ); } } //***************************************************************************** // Set the state of the step scale radio box. // // Argument List : // eScale - The enumerated scale specifier // // Return Values : // Success - TRUE // Failure - FALSE bool PnlAnaBase::bSetScale( eScaleType eScale ) { if( eScaleeSCALE_LST ) return( FALSE ); #if wxCHECK_VERSION( 2,8,0 ) if( m_oRbxScale.GetCount( ) < (uint) eScale + 1 ) return( FALSE ); #else if( m_oRbxScale.GetCount( ) < (int) eScale + 1 ) return( FALSE ); #endif m_oRbxScale.SetSelection( (int) eScale ); InitScale( ); return( TRUE ); } //***************************************************************************** // Set the state of the initial conditions radio box. // // Argument List : // eInitC - The enumerated initial conditions specifier // // Return Values : // Success - TRUE // Failure - FALSE bool PnlAnaBase::bSetInitC( eInitCType eInitC ) { if( eInitCeINITC_LST ) return( FALSE ); #if wxCHECK_VERSION( 2,8,0 ) if( m_oRbxInitC.GetCount( ) < (uint) eInitC + 1 ) return( FALSE ); #else if( m_oRbxInitC.GetCount( ) < (int) eInitC + 1 ) return( FALSE ); #endif m_oRbxInitC.SetSelection( (int) eInitC ); return( TRUE ); } //***************************************************************************** // Load the source choice box with the components names which may be chosen as // a source. // // Argument List : // roSimn - A reference to an array on Component objects // osPrefix - A string containing the first letter of the desired components void PnlAnaBase::LoadSrcNames( ArrayComponent & roaCpnts, wxString osPrefixes ) { wxArrayString oasSrcs; wxString osTmpSrc; wxString os1; wxChar oc1; uint ui1; // Temporarily record the current selection osTmpSrc = m_oChoSrcName.GetStringSelection( ); // Clear the signal source choice box m_oChoSrcName.Clear( ); m_oChoSrcName.Append( wxT("None") ); // Load the selected components into the signal source choice box for( ui1=0; ui1GetSizer( ); if( poSzr != NULL ) poSzr->GetStaticBox( )->SetLabel( rosLabel ); } //***************************************************************************** // Select the simulator engine to be used. // // Argument list : // eSimEng - The simulator engine type // // Return Values : // TRUE - Success // FALSE - Failure bool PnlAnaBase::bSetSimrEng( eSimrType eSimEng ) { if( eSimEngeSIMR_LST ) return( FALSE ); m_eSimEng = eSimEng; return( TRUE ); } //***************************************************************************** // Select the analysis to be performed. // // Argument List : // eAnalysis - The analysis type // // Return Values : // TRUE - Success // FALSE - Failure bool PnlAnaBase::bSetAnaType( eCmdType eAnaType ) { if( eAnaTypeeCMD_ANA_LST ) return( FALSE ); m_eAnaType = eAnaType; return( TRUE ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Source component choice box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlAnaBase::OnSrcName( wxCommandEvent & roEvtCmd ) { // Set the sweep source component if( m_oChoSrcName.GetSelection( ) > 0 ) { // Get the sweep source name m_oCpntSwpSrcs.bSetName( m_oChoSrcName.GetStringSelection( ) ); // Get the sweep source value if( m_oPnlSrcLvl.GetParent( ) != NULL ) m_oCpntSwpSrcs.bSetValue( m_oPnlSrcLvl.rosGetValue( ) ); else m_oCpntSwpSrcs.bSetValue( wxT("1.0") ); } else m_oCpntSwpSrcs.bClear( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/base/CmdBase.hpp0000644000000000000000000000552211620762242016533 0ustar rootroot//***************************************************************************** // CmdBase.hpp * // ------------- * // Description : This is the base class for all command classes. It has some * // characteristics of structure in that some attributes have * // public access; this simplifies the classes interface. * // Started : 31/08/2006 * // Last Update : 12/08/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDBASE_HPP #define CMDBASE_HPP // System Includes using namespace std; #include // wxWidgets Includes #include // Application Includes #include "TypeDefs.hpp" //***************************************************************************** struct CmdBase : public wxString { protected : eSimrType m_eSimEng; eCmdType m_eCmdType; wxString m_osErrMsg; virtual bool bValidate( void ); public : CmdBase( void ); virtual ~CmdBase( ); virtual bool bSetDefaults( void ); bool bIsValid( void ) { return( m_osErrMsg.IsEmpty( ) ); } virtual bool bParse ( void ) = 0; virtual bool bFormat( void ) = 0; bool bSetString( wxString & ros ); eSimrType eGetSimEng ( void ) { return( m_eSimEng ); } eCmdType eGetCmdType( void ) { return( m_eCmdType ); } const wxString & rosGetErrMsg ( void ) { return( m_osErrMsg ); } void SetErrMsg( const wxString & rosErrMsg ) { if( bIsValid( ) ) m_osErrMsg = rosErrMsg; } virtual CmdBase & operator = ( const CmdBase & roCmd ); virtual void Print( const wxString & rosPrefix=wxT("") ); }; //***************************************************************************** #endif // CMDBASE_HPP gspiceui-1.0.00+dfsg/src/base/PrcBase.cpp0000644000000000000000000003111011616622335016542 0ustar rootroot//***************************************************************************** // PrcBase.cpp * // ------------- * // Started : 29/01/2004 * // Last Update : 23/03/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "base/PrcBase.hpp" //***************************************************************************** // Constructor. PrcBase::PrcBase( int iFlags ) : wxProcess( iFlags ) { m_iPid = -1; // Clear the process ID number m_iExitCode = -1; // Clear the process exit code m_ofnLog = DEF_LOG_FILE; // Set the default log file path and name m_osErrMsg = wxT(""); // Clear the error message } //***************************************************************************** // Destructor. PrcBase::~PrcBase( ) { // Delete the process log file bDelLogFile( ); } //***************************************************************************** // Find a binary using the user's PATH environment variable given the binary // name. // // Argument List : // ofnBin - The binary name without the path // // Return Values : // TRUE - Success (path prepended to oFnBinary) // FALSE - Failure bool PrcBase::bFindBinary( wxFileName & rofnBinary ) { wxPathList opl1; wxFileName ofn1; wxString os1, os2, os3; m_osErrMsg = wxT(""); // Initial checks if( ! rofnBinary.IsOk( ) ) return( FALSE ); // Search enviroment variable PATH for the first occurrence of the binary opl1.AddEnvList( wxT("PATH") ); ofn1 = opl1.FindAbsoluteValidPath( rofnBinary.GetFullName( ) ); // Check whether the binary was successfully found if( !ofn1.IsOk( ) || !ofn1.FileExists( ) ) { os1 << wxT("Can't find the binary : ") << m_ofnBinary.GetFullName( ); wxGetEnv( wxT("PATH"), &os2 ); os2.Prepend( wxT("$PATH = \n") ); // Set the object error message os3 = os1 + wxT("\n\n") + os2; SetErrMsg( os3 ); // If debug mode is enabled send the error message to the console if( g_bDebug ) { os3 = os1 + wxT(" (") + os2 + wxT(")."); std::cerr << "DEBUG : " << rosStrToLine( os3 ).mb_str( ) << "\n\n"; } return( FALSE ); } m_ofnBinary = ofn1; return( TRUE ); } //***************************************************************************** // Get the console output after a process has been initiated and record it in // the log file. // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bLogOutput( void ) { wxOutputStream * poStdOut; wxInputStream * poStdIn; wxInputStream * poStdErr; wxString os1, os2; wxChar oc1; // Check that the log file name is valid if( ! m_ofnLog.IsOk( ) ) return( FALSE ); // Open the file wxTextFile oFileLog( m_ofnLog.GetFullPath( ) ); if( oFileLog.Exists( ) ) { if( ! oFileLog.Open( ) ) return( FALSE ); } else { if( ! oFileLog.Create( ) ) return( FALSE ); } // Clear the file if it contains lines oFileLog.Clear( ); // Get pointers to the input streams poStdOut = GetOutputStream( ); poStdIn = GetInputStream( ); poStdErr = GetErrorStream( ); // Read the console input while( bIsExec( ) || poStdIn->IsOk( ) || poStdErr->IsOk( ) ) { // Get a line of data from stdout while( poStdIn->CanRead( ) ) { oc1 = poStdIn->GetC( ); if( oc1==wxT('\t') || (oc1>31 && oc1!=127) ) os1 << oc1; if( oc1 == wxT('\n') ) { oFileLog.AddLine( os1 ); os1 = wxT(""); } } // Get a line of data from stderr while( poStdErr->CanRead( ) ) { oc1 = poStdErr->GetC( ); if( oc1==wxT('\t') || (oc1>31 && oc1!=127) ) os2 << oc1; if( oc1 == wxT('\n') ) { oFileLog.AddLine( os2 ); os2 = wxT(""); } } wxYield( ); // Yield CPU to other processes } // Delete the stream objects delete poStdOut; delete poStdIn; delete poStdErr; SetPipeStreams( NULL, NULL, NULL ); if( ! os1.IsEmpty( ) ) oFileLog.AddLine( os1 ); if( ! os2.IsEmpty( ) ) oFileLog.AddLine( os2 ); oFileLog.Write( ); // Save the changes to disk oFileLog.Close( ); // Close the log file return( TRUE ); } //***************************************************************************** // Does the binary exist? // // Return Values : // TRUE - The binary does exist // FALSE - The binary doesn't exist bool PrcBase::bBinExists( void ) { if( !m_ofnBinary.FileExists( ) || !m_ofnBinary.IsOk( ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Set the file name of the binary to be executed. // // Argument List : // rosFName - A string containing the binary file name // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bSetBinary( const wxString & rosFName ) { if( rosFName.IsEmpty( ) ) return( FALSE ); m_ofnBinary = rosFName; if( ! bFindBinary( m_ofnBinary ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Set the argument list to be appended to the binary name. // // Argument List : // rosArgLst - A string containing the argument list // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bSetArgLst( const wxString & rosArgLst ) { if( rosArgLst.IsEmpty( ) ) return( FALSE ); m_osArgLst = rosArgLst; return( TRUE ); } //***************************************************************************** // Set the process log file name. // (If set all process output can be captured to this file.) // // Argument List : // rosFName - A string containing the full path and file name // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bSetLogFile( const wxString & rosFName ) { wxFileName ofn1; ofn1 = rosFName; if( ! ofn1.IsOk( ) ) return( FALSE ); if( ofn1.GetPath( ).IsEmpty( ) ) ofn1.SetPath( wxT(".") ); m_ofnLog = ofn1; return( TRUE ); } //***************************************************************************** // Execute a process asynchronously. // (Ie. Return as soon as the process has been launched). // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bExecAsync( void ) { wxString os1, os2; // Only execute simulation if it isn't already running if( bIsExec( ) ) return( FALSE ); // Clear error attributes m_osErrMsg = wxT(""); // Check that the binary exists if( ! bBinExists( ) ) return( FALSE ); // Construct the command line to be executed os1 = roGetBinary( ).GetFullPath( ); if( ! rosGetArgLst( ).IsEmpty( ) ) os1 << wxT(' ') << rosGetArgLst( ); // Attempt to execute the simulation m_iPid = (int) wxExecute( os1, wxEXEC_ASYNC, this ); if( m_iPid <= 0 ) { os2.Empty( ); os2 << wxT("Couldn't start process : ") << os1; SetErrMsg( os2 ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Execute a process synchronously. // (Ie. wait for the process to terminate before returning). // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bExecSync( void ) { // Not yet implemented ??? 12/03/2010 return( FALSE ); // long liRtn; // wxEnableTopLevelWindows( FALSE ); // liRtn = wxExecute( rosCmd, wxEXEC_SYNC ); // wxEnableTopLevelWindows( TRUE ); // if( liRtn != 0 ) return( FALSE ); // return( TRUE ); // This is how I'd like to do it but it doesn't work 20/11/2003 ??? // wxEnableTopLevelWindows( FALSE ); // int iRtn = (int) wxExecute( osCmd, wxEXEC_SYNC ); // wxEnableTopLevelWindows( TRUE ); // wxProcess oProcess( wxPROCESS_DEFAULT ); // iPid = (int) wxExecute( osCmd, wxEXEC_SYNC ); // if( iPid == 0 ) // { // Error gnetlist could not be executed // cerr << "The command:\n " << osCmd << "\ncould not be executed."; // return( FALSE ); // } // for( ui1=0; ui1<300; ui1++ ) // { // Wait up to 30 seconds for the process to complete //cerr << iPid << '\n'; // wxUsleep( 100 ); // Sleep for 100msec // if( ! oProcess.Exists( iPid ) ) break; // } // if( oProcess.Exists( iPid ) ) // { // Error gnetlist had to be terminated prematurely // oProcess.Kill( iPid ); // cerr << "The command:\n " << osCmd << "\ntook more than 30 sec. to " // << "execute and so was terminated prematurely."; // return( FALSE ); // } } //***************************************************************************** // Stop the simulation currently in progress. // // Return Values : // TRUE - Success // FALSE - Failure bool PrcBase::bKill( void ) { if( ! bIsExec( ) ) return( TRUE ); if( ! Exists( m_iPid ) ) return( TRUE ); if( Kill( m_iPid, wxSIGTERM ) != wxKILL_OK ) return( FALSE ); m_iPid = -1; m_iExitCode = 0; return( TRUE ); } //***************************************************************************** // Remove the log file. // // Return Values : // Success - TRUE // Failure - FALSE bool PrcBase::bDelLogFile( void ) { if( m_ofnLog.GetFullPath( ).IsEmpty( ) ) return( TRUE ); return( ::wxRemoveFile( m_ofnLog.GetFullPath( ) ) ); } //***************************************************************************** // Collect the output from the simulator and print to a text control. // // Argument List : // roTxtCtl - The text control to contain the simulator output void PrcBase::Print( TextCtrl & roTxtCtl ) { roTxtCtl.bClear( ); // Clear the text control PrintCmd( roTxtCtl ); // Print the process command PrintRsp( roTxtCtl ); // Print the process command response } //***************************************************************************** // Print the command envoking the process to a text control. // // Argument List : // roTxtCtl - The text control to contain process input void PrcBase::PrintCmd( TextCtrl & roTxtCtl ) { wxString os1; // Print the process command os1.Empty( ); os1 << wxT(" ") << wxT("*************** PROCESS COMMAND ***************"); roTxtCtl.bAppendLine( os1 ); os1.Empty( ); roTxtCtl.bAppendLine( os1 ); os1 << roGetBinary( ).GetFullPath( ); if( ! rosGetArgLst( ).IsEmpty( ) ) os1 << wxT(' ') << rosGetArgLst( ); roTxtCtl.bAppendLine( os1 ); os1.Empty( ); roTxtCtl.bAppendLine( os1 ); } //***************************************************************************** // Collect the output from the process and print it to a text control. // // Argument List : // roTxtCtl - The text control to contain the simulator output void PrcBase::PrintRsp( TextCtrl & roTxtCtl ) { wxString os1; // Print the process command response if( ! m_ofnLog.GetFullPath( ).IsEmpty( ) ) { os1.Empty( ); os1 << wxT(" ") << wxT("*************** PROCESS RESPONSE **************"); roTxtCtl.bAppendLine( os1 ); os1.Empty( ); roTxtCtl.bAppendLine( os1 ); if( m_ofnLog.IsOk( ) && m_ofnLog.FileExists( ) ) roTxtCtl.bAppendFile( m_ofnLog.GetFullPath( ) ); else { os1 << wxT("Couldn't load the file containing the process ouput : ") << m_ofnLog.GetFullPath( ); roTxtCtl.bAppendLine( os1 ); } } } //***************************************************************************** // Call-back function called when the process terminates. // (WARNING : Be careful of this function definition, if it is incorrect the // application can segment fault.) // // Argument List : // iPid - The PID of the process which just terminated // iStatus - The exit code of the process void PrcBase::OnTerminate( int iPid, int iStatus ) { if( iPid == m_iPid ) { m_iPid = -1; m_iExitCode = iStatus; } } //***************************************************************************** gspiceui-1.0.00+dfsg/src/base/PnlAnaBase.hpp0000644000000000000000000001341111617774320017203 0ustar rootroot//***************************************************************************** // PnlAnaBase.hpp * // ---------------- * // Description : This class derives from the wxPanel class and provides a * // base class for all analysis panel classes. * // Started : 26/04/2004 * // Last Update : 09/08/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLANABASE_HPP #define PNLANABASE_HPP // System Includes #include // wxWidgets Library Includes #include #include // Application Includes #include "TypeDefs.hpp" #include "netlist/Component.hpp" #include "utility/PnlValue.hpp" #include "utility/StrUtils.hpp" // Local Constant Declarations //#define LAYOUT_MNGR // ??? //***************************************************************************** class PnlAnaBase : public wxPanel { public : // Enumerated type for the various groups of display controls enum eTypeCtlGrp { eCTLGRP_BASE, eCTLGRP_SCALE, eCTLGRP_INITC, eCTLGRP_SIGSRC, eCTLGRP_CPXPRT, eCTLGRP_TEMP, eCTLGRP_FST = eCTLGRP_BASE, eCTLGRP_LST = eCTLGRP_TEMP }; protected : // Error message wxString m_osErrMsg; // Sweep settings wxStaticBox m_oSbxSwpPars; PnlValue m_oPnlStart; PnlValue m_oPnlStop; PnlValue m_oPnlStep; // Step scale specifier wxRadioBox m_oRbxScale; // Initial conditions wxRadioBox m_oRbxInitC; // Parameters to be calculated wxStaticBox m_oSbxCalcPars; wxCheckBox m_oCbxVoltage; wxCheckBox m_oCbxCurrent; wxCheckBox m_oCbxPower; wxCheckBox m_oCbxResist; // Complex Parts wxStaticBox m_oSbxCpxPrt; wxCheckBox m_oCbxMag; wxCheckBox m_oCbxPhase; wxCheckBox m_oCbxReal; wxCheckBox m_oCbxImag; wxCheckBox m_oCbxMagDb; // Input signal source, value and units wxStaticBox m_oSbxSrc; wxChoice m_oChoSrcName; PnlValue m_oPnlSrcLvl; // .OPTIONS configuration dialog button wxButton m_oBtnOPTIONS; // Analysis temperature wxStaticBox m_oSbxTemp; PnlValue m_oPnlTemp; // The simulator engine and analysis types of the panel eSimrType m_eSimEng; eCmdType m_eAnaType; // Functions to create the display objects void CreateBase ( void ); void CreateScale ( void ); void CreateInitC ( void ); void CreateSrc ( void ); void CreateCpxPrt( void ); void CreateTemp ( void ); bool bIsCreated ( enum eTypeCtlGrp eCtlGrp ); void DoLayout( void ); void ToolTips( void ); // Not yet implemented virtual void InitScale( void ) { } bool bSetScale ( eScaleType eScale ); bool bSetInitC ( eInitCType eInitC ); void LoadSrcNames( ArrayComponent & roaCpnts, wxString osPrefixes ); bool bSetSrcCpnt ( Component & roCpnt ); void SetSwpPnlLbl( const wxString & rosLabel ); public : // Flag to enable or disable sweep source synchronization static bool m_bSyncSwpSrcs; // The last sweep source selected by the user static Component m_oCpntSwpSrcs; PnlAnaBase( wxWindow * poWin ); ~PnlAnaBase( ); bool bClear( void ); bool bIsOk ( void ) { return( m_osErrMsg.IsEmpty( ) ); } bool bSetSimrEng( eSimrType eSimrEng ); bool bSetAnaType( eCmdType eAnaType ); eSimrType eGetSimrEng( void ) { return( m_eSimEng ); } eCmdType eGetAnaType( void ) { return( m_eAnaType ); } // Get or set the error message const wxString & rosGetErrMsg( void ) { return( m_osErrMsg ); } void SetErrMsg( const wxString & rosErrMsg ) { if( bIsOk() ) m_osErrMsg=rosErrMsg; } // Event handlers void OnSrcName( wxCommandEvent & roEvtCmd ); friend class NbkSimrBase; friend class NbkGnuCap; friend class NbkNgSpice; // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum ePnlItemID { ID_PNL_START = 1, ID_PNL_STOP, ID_PNL_STEP, ID_RBX_SCALE, ID_RBX_INITC, ID_CHO_SRCNAME, ID_PNL_SRCLVL, ID_CBX_MAG, ID_CBX_PHASE, ID_CBX_REAL, ID_CBX_IMAG, ID_CBX_MAGDB, ID_CBX_VOLT, ID_CBX_CURR, ID_CBX_PWR, ID_CBX_RES, ID_BTN_OPTIONS, ID_PNL_TEMP, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_PNL_START, ID_LST = ID_PNL_TEMP }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLANABASE_HPP gspiceui-1.0.00+dfsg/src/base/CmdBase.cpp0000644000000000000000000001251611504645160016527 0ustar rootroot//***************************************************************************** // CmdBase.cpp * // ------------- * // Started : 31/08/2006 * // Last Update : 24/12/2010 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "base/CmdBase.hpp" //***************************************************************************** // Constructor. CmdBase::CmdBase( void ) : wxString( wxT("") ) { bSetDefaults( ); } //***************************************************************************** // Destructor. CmdBase::~CmdBase( ) { } //***************************************************************************** // Set the object attributes to their default values. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdBase::bSetDefaults( void ) { wxString::Empty( ); m_osErrMsg = wxT("Invalid"); m_eSimEng = eSIMR_NONE; m_eCmdType = eCMD_NONE; return( TRUE ); } //***************************************************************************** // Check that the object attributes are valid. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdBase::bValidate( void ) { m_osErrMsg.Empty( ); if( IsEmpty( ) ) SetErrMsg( wxT("The command is empty") ); if( m_eSimEng == eSIMR_NONE ) SetErrMsg( wxT("The command has no simulator engine") ); if( m_eCmdType == eCMD_NONE ) SetErrMsg( wxT("The command has no type") ); return( bIsValid( ) ); } //***************************************************************************** // Set the command based on a complete command string. // // Argument List : // rosCmd - A reference to a wxString object // // Return Values : // TRUE - Success // FALSE - Failure bool CmdBase::bSetString( wxString & ros ) { bSetDefaults( ); assign( ros ); bParse( ); return( TRUE ); } //***************************************************************************** // Copy the contents of another CmdBase object. // // Argument List : // roCmd - A reference to a CmdBase object // // Return Values : // A reference to this object CmdBase & CmdBase::operator = ( const CmdBase & roCmd ) { (wxString &) *this = (wxString &) roCmd; m_eSimEng = roCmd.m_eSimEng; m_eCmdType = roCmd.m_eCmdType; m_osErrMsg = roCmd.m_osErrMsg; return( *this ); } //***************************************************************************** // Print the object attributes. // // Argument List : // rosPrefix - A prefix to every line displayed (usually just spaces) void CmdBase::Print( const wxString & rosPrefix ) { cout << rosPrefix .mb_str( ) << "wxString::" << this ->mb_str( ) << '\n'; cout << rosPrefix .mb_str( ) << "m_osErrMsg : \"" << m_osErrMsg.mb_str( ) << "\"\n"; cout << rosPrefix .mb_str( ) << "m_eSimEng : "; switch( m_eSimEng ) { case eSIMR_GNUCAP : cout << "eSIMR_GNUCAP"; break; case eSIMR_NGSPICE : cout << "eSIMR_NGSPICE"; break; case eSIMR_NONE : cout << "eSIMR_NONE"; break; default : cout << "Invalid"; break; } cout << '\n'; cout << rosPrefix .mb_str( ) << "m_eCmdType : "; switch( m_eCmdType ) { case eCMD_OP : cout << "eANA_OP"; break; // Operating point analysis case eCMD_DC : cout << "eANA_DC"; break; // DC analysis case eCMD_AC : cout << "eANA_AC"; break; // AC analysis case eCMD_TR : cout << "eANA_TR"; break; // Transient analysis case eCMD_FO : cout << "eANA_FO"; break; // Fourier analysis case eCMD_DI : cout << "eANA_DI"; break; // Distortion analysis case eCMD_NO : cout << "eANA_NO"; break; // Noise analysis case eCMD_PZ : cout << "eANA_PZ"; break; // Pole-zero analysis case eCMD_SE : cout << "eANA_SE"; break; // Sensitivity analysis case eCMD_TF : cout << "eANA_TF"; break; // Transfer function analysis case eCMD_OPT : cout << "eCMD_OPT"; break; // Options command case eCMD_IC : cout << "eCMD_IC"; break; // Initial conditions command case eCMD_PR : cout << "eCMD_PR"; break; // Print command case eCMD_GEN : cout << "eCMD_GEN"; break; // Generator command case eCMD_NONE : cout << "eANA_NONE"; break; // Command type not set default : cout << "Invalid"; break; // Command type is invalid } cout << '\n'; } //***************************************************************************** gspiceui-1.0.00+dfsg/src/gspiceui.conf0000644000000000000000000000072711412210443016261 0ustar rootroot[Main] NbkMaxLines=1000 TmpFileMgt=0 ToolTips=0 Precision=4 PosnX=73 PosnY=0 SizeW=873 SizeH=650 [Files] NetList=/home/msw/projects/gspiceui/bin/filter-lp-2.ckt Schematics=/home/msw/projects/gspiceui/bin/filter-lp-2.sch [Directories] LastAccess=/home/msw/projects/gspiceui/bin [gNetList] GuileProc=spice-sdb [Viewer] Name=GAW [Simulator] Engine=GNUCAP Analysis=FO [GNU-Cap] FO_Mag=1 FO_Phase=0 FO_MagDB=1 FO_MagRel=0 [Help] PosnX=314 PosnY=107 SizeW=758 SizeH=746 gspiceui-1.0.00+dfsg/src/utility/0000755000000000000000000000000011627703516015317 5ustar rootrootgspiceui-1.0.00+dfsg/src/utility/ConvertType.hpp0000644000000000000000000000607411620761664020322 0ustar rootroot//***************************************************************************** // ConvertType.hpp * // ----------------- * // * // Description : This class is intended to provide useful functionality for * // converting basic types one to another eg. wxString to long. * // The strings may contain alpha scale factors eg. K for Kilo. * // Started : 21/09/2004 * // Last Update : 29/04/2010 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CONVERTTYPE_HPP #define CONVERTTYPE_HPP // System Includes using namespace std; #include #include #include // wxWidgets Includes #include // Local Constant Declarations #define CNVTYPE_DFLT_FLTRES 3 #define CNVTYPE_MIN_FLTRES 1 #define CNVTYPE_MAX_FLTRES 10 //***************************************************************************** class ConvertType { private : static int m_iFltRes; public : ConvertType( void ); ~ConvertType( ); static int iGetFltRes( void ) { return( m_iFltRes ); } static bool bSetFltRes( int iRes ); static wxString & rosGetNum( const wxString & rosNum ); static bool bStrToLong ( const wxString & rosNum, long * pliNum ); static bool bStrToDFlt ( const wxString & rosNum, double * pdfNum ); static bool bDFltToStr ( double dfNum, wxString & rosNum ); static bool bDFltToStrEng( double dfNum, wxString & rosNum ); static bool bParseDFlt ( double dfNum, double * pdfMan, long * pliExp ); static bool bStrToInt ( const wxString & rosNum, int * piNum ); static bool bStrToFlt ( const wxString & rosNum, float * pfNum ); static bool bFltToStr ( float fNum, wxString & rosNum ); static bool bFltToStrEng ( float fNum, wxString & rosNum ); static bool bParseFlt ( float fNum, float * pfMan, int * piExp ); }; //***************************************************************************** #endif // CONVERTTYPE_HPP gspiceui-1.0.00+dfsg/src/utility/SpinCtrl.hpp0000644000000000000000000001176111562507710017570 0ustar rootroot//***************************************************************************** // SpinCtrl.hpp * // -------------- * // Description : This class extends wxPanel, and is a replacement for the * // wxWidgets library class wxSpinCtrl. It adds some useful * // functionality : * // - floating point or integer numbers can be displayed, * // - incrementing by orders of magnitude not just a constant, * // - variable step size incrementing. * // Started : 20/03/2004 * // Last Update : 11/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef SPINCTRL_HPP #define SPINCTRL_HPP // System Includes #include #include // wxWidgets Includes #include #include // Application Includes #include "TypeDefs.hpp" #include "ConvertType.hpp" // Local Constant Declarations #define SPN_MAXLEN 9 // Maximum chars. that may be entered into text ctrl. #define SPN_PERIOD 80 // The spin button repeat period (in msec) //***************************************************************************** class SpinCtrl : public wxPanel { private : // Display objects wxTextCtrl m_oTxtValue; wxSpinButton m_oSbnValue; eVarType m_eVarType; // The variable type to be displayed float m_fDefValue; // Default value float m_fMinValue; // Minimum value float m_fMaxValue; // Maximum value float m_fMinIncSz; // Minimum increment size float m_fMaxIncSz; // Maximum increment size void DoLayout( void ); public : SpinCtrl( eVarType eVType = eVAR_FLT ); ~SpinCtrl( ); bool bCreate ( wxWindow * poWin, wxWindowID oWinID, int iWidth=-1 ); bool bIsCreated( void ) { return( GetParent()!=NULL ? TRUE : FALSE ); } bool bClear( void ); bool bSetDefaults( void ); bool bSetVarType ( eVarType eNewVarType ); bool bSetValue ( int iValue ) { return( bSetValue( (float) iValue ) ); } bool bSetValue ( float fValue ); bool bSetValue ( const wxString & rosValue ); bool bSetDefValue( float fDefValue ); bool bSetMinValue( float fMinValue ) { return( bSetRange( fMinValue, m_fMaxValue ) ); } bool bSetMaxValue( float fMaxValue ) { return( bSetRange( m_fMinValue, fMaxValue ) ); } bool bSetIncSz ( float fMinIncSz, float fMaxIncSz=-1.0 ); bool bSetRange ( float fMinValue, float fMaxValue ); bool bSetParms ( float fDefValue, float fMinValue, float fMaxValue, float fMinIncSz=-1.0, float fMaxIncSz=-1.0 ); eVarType eGetVType ( void ) { return( m_eVarType ); } int iGetValue ( void ); float fGetValue ( void ); const wxString & rosGetValue ( void ); float fGetDefValue( void ) { return( m_fDefValue ); } float fGetMinValue( void ) { return( m_fMinValue ); } float fGetMaxValue( void ) { return( m_fMaxValue ); } float fGetMinIncSz( void ) { return( m_fMinIncSz ); } float fGetMaxIncSz( void ) { return( m_fMaxIncSz ); } // Event handlers void OnTxtChar ( wxKeyEvent & roEvtKey ); void OnTxtMaxLen( wxCommandEvent & roEvtCmd ); void OnSbnInc ( wxSpinEvent & roEvtSpn ); void OnSbnDec ( wxSpinEvent & roEvtSpn ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum ePnlItemID { ID_TXTCTRL = 1, ID_SPINBTN, ID_UNUSED, ID_FST = ID_TXTCTRL, ID_LST = ID_SPINBTN }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // SPINCTRL_HPP gspiceui-1.0.00+dfsg/src/utility/StrUtils.cpp0000644000000000000000000002722511624457050017620 0ustar rootroot//***************************************************************************** // StrUtils.cpp * // -------------- * // Started : 15/05/2008 * // Last Update : 19/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "utility/StrUtils.hpp" //***************************************************************************** // Compare algorithm for sorting node labels. // // As a general rule node labels are automatically generated and are purely // numeric. Where a label diverges from this form it's often because the user // has identified it as having some significance. When displayed in a list // control on a GUI it's more convenient to have these significant labels // positioned towards the top. // // Argument List : // rosArg1 - a reference to the first string to be compared // rosArg2 - a reference to the second string to be compared // // Return Values : // If ros1 > ros2 then -1 // If ros1 = ros2 then 0 // If ros1 < ros2 then 1 int iStrCmpNode( const wxString & rosArg1, const wxString & rosArg2 ) { wxChar oc1, oc2; size_t sz1, sz2; long li1, li2; // First look for empty strings sz1 = rosArg1.Len( ); sz2 = rosArg2.Len( ); if( sz1==0 && sz2!=0 ) return( 1 ); if( sz1==0 && sz2==0 ) return( 0 ); if( sz1!=0 && sz2==0 ) return( -1 ); // Now do some simple tests oc1 = rosArg1.at( 0 ); oc2 = rosArg2.at( 0 ); if( wxIsalpha( oc1 ) && wxIsdigit( oc2 ) ) return( -1 ); if( wxIsdigit( oc1 ) && wxIsalpha( oc2 ) ) return( 1 ); // If the node names are purely numeric do the compare if( rosArg1.ToLong( &li1 ) && rosArg2.ToLong( &li2 ) ) { if( li1 > li2 ) return( 1 ); if( li1 == li2 ) return( 0 ); if( li1 < li2 ) return( -1 ); } // It's all got too hard, just compare the labels as component labels return( iStrCmpCpnt( rosArg1, rosArg2 ) ); } //***************************************************************************** // Compare algorithm for sorting component labels. // // As a rule component labels are comprised of a single letter (signifying the // component type) followed by a number. Where a label diverges from this form // it's often because the user has identified it as having some significance. // When displayed in a list control on a GUI it's more convenient to have these // special labels positioned towards the top. Any remaining labels are simply // sorted alphabetically. // // Argument List : // rosArg1 - a reference to the first string to be compared // rosArg2 - a reference to the second string to be compared // // Return Values : // If ros1 > ros2 then -1 // If ros1 = ros2 then 0 // If ros1 < ros2 then 1 int iStrCmpCpnt( const wxString & rosArg1, const wxString & rosArg2 ) { wxString osStr1, osStr2; ulong ulNum1, ulNum2; wxString osEnd1, osEnd2; wxString os1; wxChar oc1; size_t sz1, sz2; // First look for empty strings sz1 = rosArg1.Len( ); sz2 = rosArg2.Len( ); if( sz1==0 && sz2!=0 ) return( 1 ); if( sz1==0 && sz2==0 ) return( 0 ); if( sz1!=0 && sz2==0 ) return( -1 ); // Parse the first alpha and numeric components of the first argument for( sz1=0, osStr1=wxT(""); sz1 sz2 ) return( -1 ); if( sz1 < sz2 ) return( 1 ); // Compare the first numeric component of the two arguments sz1 = osEnd1.Len( ); sz2 = osEnd2.Len( ); if( sz1==0 && sz2==0 ) { if( ulNum1 > ulNum2 ) return( 1 ); if( ulNum1 == ulNum2 ) return( 0 ); if( ulNum2 > ulNum1 ) return( -1 ); } if( sz1 > sz2 ) return( -1 ); else return( 1 ); // If all else fails do it all again //std::cout << "\niStrCmpCpnt( ) : Look out! Re-entrance\n"; return( iStrCmpCpnt( osEnd1, osEnd2 ) ); } //***************************************************************************** // Compare algorithm for sorting signal source labels. // // Signal source labels form a sub-set of all component labels which, as a // general rule, are comprised of a single letter (signifying the component // type) followed by a number. Where a label diverges from this form it's often // because the user has identified it as having some significance. When // displayed in a list control on a GUI it's more convenient to have these // significant labels positioned towards the top. // // Argument List : // rosArg1 - a reference to the first string to be compared // rosArg2 - a reference to the second string to be compared // // Return Values : // If ros1 > ros2 then -1 // If ros1 = ros2 then 0 // If ros1 < ros2 then 1 int iStrCmpSrc( const wxString & rosArg1, const wxString & rosArg2 ) { eCpntType eCpnt1, eCpnt2; size_t sz1, sz2; // First look for empty strings sz1 = rosArg1.Len( ); sz2 = rosArg2.Len( ); if( sz1==0 && sz2!=0 ) return( 1 ); if( sz1==0 && sz2==0 ) return( 0 ); if( sz1!=0 && sz2==0 ) return( -1 ); // Compare component types eCpnt1 = Component::eGetCpntType( rosArg1 ); eCpnt2 = Component::eGetCpntType( rosArg2 ); switch( eCpnt1 ) { case eCPNT_IVS : sz1 = 5; break; case eCPNT_ICS : sz1 = 4; break; case eCPNT_IND : sz1 = 3; break; case eCPNT_CAP : sz1 = 2; break; case eCPNT_RES : sz1 = 1; break; default : sz1 = 0; break; } switch( eCpnt2 ) { case eCPNT_IVS : sz2 = 5; break; case eCPNT_ICS : sz2 = 4; break; case eCPNT_IND : sz2 = 3; break; case eCPNT_CAP : sz2 = 2; break; case eCPNT_RES : sz2 = 1; break; default : sz2 = 0; break; } if( sz1>0 && sz2>0 ) { if( sz1 > sz2 ) return( -1 ); if( sz1 < sz2 ) return( 1 ); } // It's all got too hard, just compare the labels as component labels return( iStrCmpCpnt( rosArg1, rosArg2 ) ); } //***************************************************************************** // Reduce a string down so that it can be displayed in a single line. // (This function is intended for debugging purposes. Multi-line and formated // messages can be sent to std::cout or std::cerr.) // // Argument List : // ros - The string to be reformatted // // Return Values : // A reference to string containing a single line const wxString & rosStrToLine( const wxString & ros ) { static wxString os1; size_t sz1; char c1; // Copy the input string os1 = ros; // Remove white-space (space, tab, '\n' & '\r') from both ends of the string os1.Trim( FALSE ); os1.Trim( TRUE ); // Replace '\n' & '\r' within the string with space characters for( sz1=0; sz1 2 ) { Usage( argv[0] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1.at( 0 ) == wxT('-') ) { if( os1.at( 1 ) == wxT('h') ) { Usage( argv[0] ); exit( EXIT_SUCCESS ); } else { Usage( argv[0] ); exit( EXIT_FAILURE ); } } } // Display the utility banner cout << "\n StrUtils Test Utility" << "\n Version 1.00 (22/08/2011)\n"; // Exercise the function : iStrCmpCpnt( ) oas1.Empty( ); oas1.Add( wxT("3,1") ); oas1.Add( wxT("2,0") ); std::cout << "\nTest iStrCmpCpnt( ) :\n"; std::cout << " Before : "; PrintArray( oas1 ); oas1.Sort( &iStrCmpCpnt ); std::cout << " After : "; PrintArray( oas1 ); // */ // Exercise the function : iStrCmpNode( ) oas1.Empty( ); oas1.Add( wxT("Vcc") ); oas1.Add( wxT("1") ); oas1.Add( wxT("2") ); oas1.Add( wxT("2SK1058_Drive") ); oas1.Add( wxT("3") ); oas1.Add( wxT("V1") ); std::cout << "\nTest iStrCmpNode( ) :\n"; std::cout << " Before : "; PrintArray( oas1 ); oas1.Sort( &iStrCmpNode ); std::cout << " After : "; PrintArray( oas1 ); // */ // Exercise the function : iStrCmpSrc( ) oas1.Empty( ); oas1.Add( wxT("Iin") ); oas1.Add( wxT("Rin") ); oas1.Add( wxT("Vin") ); oas1.Add( wxT("V2") ); oas1.Add( wxT("I1") ); std::cout << "\nTest iStrCmpSrc( ) :\n"; std::cout << " Before : "; PrintArray( oas1 ); oas1.Sort( &iStrCmpNode ); std::cout << " After : "; PrintArray( oas1 ); // */ std::cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } //***************************************************************************** void PrintArray( wxArrayString & roas ) { size_t sz1; for( sz1=0; sz1 0 ) std::cout << " "; std::cout << roas.Item( sz1 ).mb_str( ); } std::cout << '\n'; } //***************************************************************************** #endif // TEST_STRUTILS gspiceui-1.0.00+dfsg/src/utility/ChoUnits.cpp0000644000000000000000000003526711627430253017567 0ustar rootroot//***************************************************************************** // ChoUnits.cpp * // -------------- * // Started : 27/03/2004 * // Last Update : 11/04/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "utility/ChoUnits.hpp" //***************************************************************************** // Constructor. ChoUnits::ChoUnits( void ) { bClear( ); } //***************************************************************************** // Destructor. ChoUnits::~ChoUnits( ) { } //***************************************************************************** // Create an instance of this object. // // Argument List : // poWin - The parent window // oWinID - The window identifier // iWidth - The width of the choice control in pixels // // Return Values : // TRUE - Success // FALSE - Failure bool ChoUnits::bCreate( wxWindow * poWin, wxWindowID oWinID, int iWidth ) { wxSize oSize=wxDefaultSize; // Check if the object has already been created if( bIsCreated( ) ) return( TRUE ); // Create the object if( iWidth > 0 ) oSize.SetWidth( iWidth ); if( ! Create( poWin, oWinID, wxDefaultPosition, oSize ) ) return( FALSE ); // Set the units if( ! bSetUnitsType( m_eUnitsType ) ) return( FALSE ); if( ! bSetUnits( m_osDefUnits ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Clear object attributes. // // Return Values : // Success - TRUE // Failure - FALSE bool ChoUnits::bClear( void ) { m_eUnitsType = eUNITS_NONE; m_eDefUType = eUNITS_NONE; m_osDefUnits = wxT("Units"); bSetUnitsType( eUNITS_NONE ); if( bIsCreated( ) ) wxChoice::Clear( ); return( TRUE ); } //***************************************************************************** // Set default object attributes. // // Return Values : // Success - TRUE // Failure - FALSE bool ChoUnits::bSetDefaults( void ) { // Set the default units type if( ! bSetUnitsType( m_eDefUType ) ) return( FALSE ); // Set the default units if( ! bSetUnits( m_osDefUnits ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Set the type of units to be displayed. // // Argument List : // eUType - The type of units to be displayed // // Return Values : // Success - TRUE // Failure - FALSE bool ChoUnits::bSetUnitsType( eUnitsType eUType ) { if( ! bIsCreated( ) ) return( FALSE ); if( ! IsEmpty( ) && m_eUnitsType==eUType ) return( TRUE ); Clear( ); // Delete existing choice items from the list m_eUnitsType = eUType; // Set the objects units type attribute // Load the new choice items into the control switch( m_eUnitsType ) { case eUNITS_CAP : // Capacitance Append( wxT("mF"), new wxStringClientData( wxT("-3") ) ); Append( wxT("uF"), new wxStringClientData( wxT("-6") ) ); Append( wxT("nF"), new wxStringClientData( wxT("-9") ) ); Append( wxT("pF"), new wxStringClientData( wxT("-12") ) ); SetStringSelection( wxT("uF") ); break; case eUNITS_IND : // Inductance Append( wxT("H") , new wxStringClientData( wxT("0") ) ); Append( wxT("mH"), new wxStringClientData( wxT("-3") ) ); Append( wxT("uH"), new wxStringClientData( wxT("-6") ) ); SetStringSelection( wxT("mH") ); break; case eUNITS_RES : // Resistance Append( wxT("MOhm"), new wxStringClientData( wxT("6") ) ); Append( wxT("KOhm"), new wxStringClientData( wxT("3") ) ); Append( wxT("Ohm") , new wxStringClientData( wxT("0") ) ); SetStringSelection( wxT("KOhm") ); break; case eUNITS_VOLT : // Voltage Append( wxT("KV"), new wxStringClientData( wxT("3") ) ); Append( wxT("V") , new wxStringClientData( wxT("0") ) ); Append( wxT("mV"), new wxStringClientData( wxT("-3") ) ); Append( wxT("uV"), new wxStringClientData( wxT("-6") ) ); SetStringSelection( wxT("mV") ); break; case eUNITS_CURR : // Current Append( wxT("KA"), new wxStringClientData( wxT("3") ) ); Append( wxT("A") , new wxStringClientData( wxT("0") ) ); Append( wxT("mA"), new wxStringClientData( wxT("-3") ) ); Append( wxT("uA"), new wxStringClientData( wxT("-6") ) ); SetStringSelection( wxT("mA") ); break; case eUNITS_TIME : // Time Append( wxT("sec") , new wxStringClientData( wxT("0") ) ); Append( wxT("msec"), new wxStringClientData( wxT("-3") ) ); Append( wxT("usec"), new wxStringClientData( wxT("-6") ) ); Append( wxT("nsec"), new wxStringClientData( wxT("-9") ) ); Append( wxT("psec"), new wxStringClientData( wxT("-12") ) ); SetStringSelection( wxT("msec") ); break; case eUNITS_FREQ : // Frequency Append( wxT("THz"), new wxStringClientData( wxT("12") ) ); Append( wxT("GHz"), new wxStringClientData( wxT("9") ) ); Append( wxT("MHz"), new wxStringClientData( wxT("6") ) ); Append( wxT("KHz"), new wxStringClientData( wxT("3") ) ); Append( wxT("Hz") , new wxStringClientData( wxT("0") ) ); SetStringSelection( wxT("KHz") ); break; case eUNITS_PHASE : // Phase Append( wxT("Degree"), new wxStringClientData( wxT("0") ) ); Append( wxT("Radian"), new wxStringClientData( wxT("0") ) ); Append( wxT("Grad") , new wxStringClientData( wxT("0") ) ); SetStringSelection( wxT("Degree") ); break; case eUNITS_TEMP : // Temperature Append( wxT("Deg C"), new wxStringClientData( wxT("0") ) ); Append( wxT("Deg F"), new wxStringClientData( wxT("0") ) ); Append( wxT("Deg K"), new wxStringClientData( wxT("0") ) ); SetStringSelection( wxT("Deg C") ); break; case eUNITS_SCLR : // Scalar Append( wxT("Tera") , new wxStringClientData( wxT("12") ) ); Append( wxT("Giga") , new wxStringClientData( wxT("9") ) ); Append( wxT("Mega") , new wxStringClientData( wxT("6") ) ); Append( wxT("Kilo") , new wxStringClientData( wxT("3") ) ); Append( wxT("None") , new wxStringClientData( wxT("0") ) ); Append( wxT("milli"), new wxStringClientData( wxT("-3") ) ); Append( wxT("micro"), new wxStringClientData( wxT("-6") ) ); Append( wxT("nano") , new wxStringClientData( wxT("-9") ) ); Append( wxT("pico") , new wxStringClientData( wxT("-12") ) ); Append( wxT("femto"), new wxStringClientData( wxT("-15") ) ); SetStringSelection( wxT("None") ); break; case eUNITS_NONE : // No units specified Append( wxT("Units"), new wxStringClientData( wxT("0") ) ); SetStringSelection( wxT("Units") ); break; } m_osDefUnits = GetStringSelection( ); return( TRUE ); } //***************************************************************************** // Set the units to be displayed. // // Argument List: // rosUnits - The units to be displayed as a string // // Return Values: // Success - TRUE // Failure - FALSE bool ChoUnits::bSetUnits( const wxString rosUnits ) { int i1; if( ! bIsCreated( ) ) return( FALSE ); i1 = FindString( rosUnits ); if( i1 == wxNOT_FOUND ) return( FALSE ); SetSelection( i1 ); return( TRUE ); } //***************************************************************************** // Set the units to be displayed. // // Argument List : // rosUnits - The exponent associated with the units to be displayed // // Return Values : // Success - TRUE // Failure - FALSE bool ChoUnits::bSetUnits( int iExponent ) { wxString os1; long li1; uint ui1; if( ! bIsCreated( ) ) return( FALSE ); for( ui1=0; ui1<(uint)GetCount( ); ui1++ ) { li1 = 0; os1 = ( (wxStringClientData *) GetClientObject( ui1 ) )->GetData( ); os1.ToLong( &li1 ); if( (int) li1 == iExponent ) { SetSelection( ui1 ); return( TRUE ); } } if( ! IsShown( ) ) return( TRUE ); return( FALSE ); } //***************************************************************************** // Set the default units. // // Argument List : // rosUnits - The default units to be used // // Return Values : // Success - TRUE // Failure - FALSE /* bool ChoUnits::bSetDefUnits( const wxString rosUnits ) { eUnitsType eUType; int i1; // Don't proceed unless the display object has been created if( ! bIsCreated( ) ) return( FALSE ); // Temporarily set the units type to the default if( m_eUnitsType != m_eDefUType ) { eUType = m_eUnitsType; bSetUnitsType( m_eDefUType ); } // Attempt to find the specified units i1 = FindString( rosUnits ); // Return the units type to the original value if( eUType != m_eDefUType ) bSetUnitsType( eUType ); // If the units couldn't be found return if( i1 == wxNOT_FOUND ) return( FALSE ); // Set the default units m_osDefUnits = rosUnits; return( TRUE ); } */ //***************************************************************************** // Get the currently selected units. // // Return Values : // Success - The selected units // Failure - An empty string const wxString & ChoUnits::rosGetUnits( void ) { static wxString os1; os1.Empty( ); if( ! bIsCreated( ) ) return( os1 ); os1 = GetStringSelection( ); return( os1 ); } //***************************************************************************** // Get the currently selected units as an exponent eg. if the units are mV // return -3 or if the units are MOhm return 6. // // Return Values : // Success - The units exponent // Failure - 0 int ChoUnits::iGetUnits( void ) { wxString os1; long int li1; if( ! bIsCreated( ) ) return( 0 ); li1 = (long) GetSelection( ); os1 = ( (wxStringClientData *) GetClientObject( (int) li1 ) )->GetData( ); os1.ToLong( &li1 ); return( (int) li1 ); } //***************************************************************************** // Combine a value with it's units to produce the equivalent long value. // // Argument List : // fValue - The float value // // Return Values : // The value & units as a long long ChoUnits::liGetValue( float fValue ) { double df1; long li1; df1 = dfGetValue( fValue ); // Round the value if( df1 >= 0.0 ) li1 = (long) ( df1 + 0.5 ); else li1 = (long) ( df1 - 0.5 ); return( li1 ); } //***************************************************************************** // Combine a value with it's units to produce a single value. // // Argument List : // fValue - The float value // // Return Values : // Success - The value combined with it's units as a double // Failure - 0.0 double ChoUnits::dfGetValue( float fValue ) { wxString os1; double df1; long li1; int i1; if( ! bIsCreated( ) || fValue==0.0 ) return( 0.0 ); i1 = GetSelection( ); if( i1 == wxNOT_FOUND ) return( 0.0 ); os1 = ( (wxStringClientData *) GetClientObject( i1 ) )->GetData( ); os1.ToLong( &li1 ); switch( m_eUnitsType ) { case eUNITS_CAP : // Capacitance case eUNITS_IND : // Inductance case eUNITS_RES : // Resistance case eUNITS_VOLT : // Voltage case eUNITS_CURR : // Current case eUNITS_TIME : // Time case eUNITS_FREQ : // Frequency case eUNITS_SCLR : // Scalar if( fValue == 0.0 ) df1 = 0.0; else if( li1 == 0 ) df1 = (double) fValue; else df1 = (double) fValue * pow( (float) 10.0, (float) li1 ); break; case eUNITS_PHASE : // Phase (convert phase to Degree) df1 = (double) fValue; switch( i1 ) { case 0: break; // Degree (360 degree per cycle) case 1: df1 *= 180.0/3.1416; break; // Radian (2Pi radian per cycle) case 2: df1 *= 9.0/10.0; break; // Grad (400 grad per cycle) default: df1 = 0.0; } break; case eUNITS_TEMP : // Temperature (convert temperature to Deg. C) df1 = (double) fValue; switch( i1 ) { case 0: break; // Celcius case 1: df1 = (df1 - 32.0) / 1.8; break; // Fahrenheit case 2: df1 -= 273.15; break; // Kelvin default: df1 = 0.0; } break; default : df1 = 0.0; } return( df1 ); } //***************************************************************************** // Combine a value with it's units to produce the equivalent string value. // // Argument List : // fValue - The float value // // Return Values : // Success - The string containing the engineering format // Failure - An empty string const wxString & ChoUnits::rosGetValue( float fValue ) { static wxString osValue; wxString osUnits; osValue.Empty( ); if( ! bIsCreated( ) ) return( osValue ); osValue.Printf( wxT("%#.2f"), fValue ); osUnits = rosGetUnits( ); if( osUnits.IsEmpty( ) ) return( osValue ); if( osUnits != wxT("None") ) { if( osUnits == wxT("micro") ) osValue << wxT('u'); else { switch( (char) osUnits.GetChar( 0 ) ) { case wxT('T'): osValue << wxT("Tera"); break; case wxT('G'): osValue << wxT("Giga"); break; case wxT('M'): osValue << wxT("Meg"); break; case wxT('K'): osValue << wxT('K'); break; case wxT('k'): osValue << wxT('k'); break; case wxT('m'): osValue << wxT('m'); break; case wxT('u'): osValue << wxT('u'); break; case wxT('n'): osValue << wxT('n'); break; case wxT('p'): osValue << wxT('p'); break; case wxT('f'): osValue << wxT('f'); break; default: break; } } } return( osValue ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/utility/TextCtrl.cpp0000644000000000000000000002007211561777465017610 0ustar rootroot//***************************************************************************** // TextCtrl.cpp * // -------------- * // Started : 21/06/2004 * // Last Update : 29/10/2008 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "utility/TextCtrl.hpp" //***************************************************************************** // Initialize static variables for class int TextCtrl::m_iLinesMax = TCTL_LINESDEF; int TextCtrl::m_iLinesDsp = TCTL_DISPDEF; //***************************************************************************** // Constructor. TextCtrl::TextCtrl( void ) : wxTextCtrl( ) { bSetInitMsg( TCTL_INITMSG ); bClear( ); } //***************************************************************************** // Destructor. TextCtrl::~TextCtrl( ) { } //***************************************************************************** // Create an instantance of this object. // // Argument List : // poWin - The parent window // oWinID - The window identifier // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bCreate( wxWindow * poWin, wxWindowID oWinID ) { long lStyle; // Check if the object has already been created if( bIsCreated( ) ) return( TRUE ); lStyle = wxTE_MULTILINE | wxTE_READONLY | wxSUNKEN_BORDER | wxTE_DONTWRAP | wxHSCROLL; if( ! Create( poWin,oWinID,wxT(""),wxDefaultPosition,wxDefaultSize,lStyle ) ) return( FALSE ); SetFont( FONT_MONO ); return( bClear( ) ); } //***************************************************************************** // Clear the text control. // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bClear( void ) { long lStyle; m_iLinesCnt = 0; // Check if the object has already been created if( ! bIsCreated( ) ) return( FALSE ); // Left-justify the text control contents lStyle = GetWindowStyle( ); lStyle &= ~( wxTE_LEFT | wxTE_CENTER | wxTE_RIGHT ); lStyle |= wxTE_LEFT; SetWindowStyle( lStyle ); Clear( ); SetEditable( FALSE ); return( TRUE ); } //***************************************************************************** // Clear the text control and display a message to the user. // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bInitialize( void ) { int i1; // Check if the object has already been created if( ! bIsCreated( ) ) return( FALSE ); bClear( ); if( ! m_osInitMsg.IsEmpty( ) ) { // Center the default message horizontally SetWindowStyle( GetWindowStyle( ) | wxTE_CENTRE ); // Display the requisite number of blank lines for( i1=1; i1 60 ) return( FALSE ); m_osInitMsg = rosMsg; return( TRUE ); } //***************************************************************************** // Set the maximum number of lines to be loaded into the control. // // Argument List : // iLines - The maximum number of lines to be displayed // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bSetLinesMax( int iLines ) { if( iLinesTCTL_LINESMAX ) return( FALSE ); m_iLinesMax = iLines; return( TRUE ); } //***************************************************************************** // Set the number of lines to be displayed in the control. // // Argument List : // iLines - The number of lines to be displayed // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bSetLinesDsp( int iLines ) { if( iLinesTCTL_DISPMAX ) return( FALSE ); m_iLinesDsp = iLines; return( TRUE ); } //***************************************************************************** // Append a line of text to the text control. // // Argument List : // rosLine - The line of text to append // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bAppendLine( const wxString & rosLine ) { // Check if the object has already been created if( ! bIsCreated( ) ) return( FALSE ); // Check that the max. lines hasn't been reached if( m_iLinesCnt >= m_iLinesMax ) return( FALSE ); // Append this text and a line terminator *this << rosLine << wxT('\n'); m_iLinesCnt++; return( TRUE ); } //***************************************************************************** // Append the contents of a file to the text control. // // Argument List : // roFName - The file name to append // // Return Values : // TRUE - Success // FALSE - Failure bool TextCtrl::bAppendFile( const wxString & roFName ) { wxString os1; size_t szt1; // Check if the object has already been created if( ! bIsCreated( ) ) return( FALSE ); // Open the file wxTextFile oFile( roFName ); if( ! oFile.Open( ) ) { *this << wxT("Couldn't load the file containing the process output :\n "); if( roFName.IsEmpty( ) ) *this << wxT("The log file name is empty!"); else *this << roFName; return( FALSE ); } // Check that the file isn't empty if( oFile.GetLineCount( ) > 0 ) { // Append the file contents to the text control for( szt1=0; szt1 #include #include // wxWidgets Includes #include #include #include // Application Includes #include "TypeDefs.hpp" #include "utility/ConvertType.hpp" // Local Constant Declarations //***************************************************************************** class ChoUnits : public wxChoice { private : eUnitsType m_eUnitsType; public : eUnitsType m_eDefUType; wxString m_osDefUnits; ChoUnits( void ); ~ChoUnits( ); bool bCreate ( wxWindow * poWin, wxWindowID oWinID, int iWidth=-1 ); bool bIsCreated( void ) { return( GetParent( )!=NULL ? TRUE : FALSE ); } bool bClear( void ); bool bSetDefaults( void ); bool bSetUnitsType( eUnitsType eUType ); bool bSetUnits ( const wxString rosUnits ); bool bSetUnits ( int iExponent ); eUnitsType eGetUnitsType( void ) { return( m_eUnitsType ); } const wxString & rosGetUnits ( void ); int iGetUnits ( void ); // Take a value and return it combined with the currently selected units long liGetValue( float fValue ); double dfGetValue( float fValue ); const wxString & rosGetValue( float fValue ); }; //***************************************************************************** #endif // CHOUNITS_HPP gspiceui-1.0.00+dfsg/src/utility/ConvertType.cpp0000644000000000000000000004230411620761664020311 0ustar rootroot//***************************************************************************** // ConvertType.hpp * // ----------------- * // Started : 21/09/2004 * // Last Update : 31/03/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "utility/ConvertType.hpp" //***************************************************************************** // Allocate storage for static data members. int ConvertType::m_iFltRes = CNVTYPE_DFLT_FLTRES; //***************************************************************************** // Constructor. ConvertType::ConvertType( void ) { } //***************************************************************************** // Destructor. ConvertType::~ConvertType( ) { } //***************************************************************************** // Set the resolution of conversions from floats to strings ie. the number of // digits after the decimal point. // // Argument List : // iFltRes - The desired resolution // // Return Values : // Success // Failure bool ConvertType::bSetFltRes( int iFltRes ) { if( iFltResCNVTYPE_MAX_FLTRES ) return( FALSE ); m_iFltRes = iFltRes; return( TRUE ); } //***************************************************************************** // Extract the numeric part of a string. // Eg. 10.0E-2uVolt becomes 10.0E-8 and 0.0E-2uF becomes 0.0E-8. // // Argument List : // rosNum - The string containing a numeric value // // Return Values : // Success - The numeric part of the string // Failure - An empty string wxString & ConvertType::rosGetNum( const wxString & rosNum ) { static wxString osNum; wxString osInt; // The integer part of the number wxString osFrac; // The part of the string after a decimal point wxString osExp; // The exponent part of the string wxChar oc1; size_t sz1; long li1; // Clear the local static variable osNum.Empty( ); // Basic argument test if( rosNum.IsEmpty( ) ) return( osNum ); // Extract the first non-space character for( sz1=0; sz1DBL_MAX ) return( FALSE ); if( dfNum != 0.0 ) { *pliExp = (long) floor( log10( fabs( dfNum ) ) ); *pdfMan = dfNum / pow( 10.0, *pliExp ); if( fabs(*pdfMan) < 1.0 ) { (*pdfMan) *= 10.0; (*pliExp)--; } if( fabs(*pdfMan) >= 10.0 ) { (*pdfMan) /= 10.0; (*pliExp)++; } } else { *pdfMan = 0.0; *pliExp = 0; } return( TRUE ); } //***************************************************************************** // Convert a string into an integer. // // Argument List : // rosNum - The string to be converted // piNum - A pointer to an integer to hold the conversion // // Return Values : // Success - TRUE // Failure - FALSE bool ConvertType::bStrToInt( const wxString & rosNum, int * piNum ) { bool bRtn; long li1 = (long) *piNum; bRtn = bStrToLong( rosNum, &li1 ); *piNum = (int) li1; return( bRtn ); } //***************************************************************************** // Convert a string into a float. // // Argument List : // rosNum - The string to be converted // piNum - A pointer to a float to hold the conversion // // Return Values : // Success - TRUE // Failure - FALSE bool ConvertType::bStrToFlt( const wxString & rosNum, float * pfNum ) { bool bRtn; double df1 = (double) *pfNum; bRtn = bStrToDFlt( rosNum, &df1 ); *pfNum = (float) df1; return( bRtn ); } //***************************************************************************** // Convert a float to a string. // // Argument List : // fNum - The float to be converted // rosNum - A reference to a string to hold the conversion // // Return Values : // Success - TRUE // Failure - FALSE bool ConvertType::bFltToStr( float fNum, wxString & rosNum ) { double df1 = (double) fNum; return( bDFltToStr( df1, rosNum ) ); } //***************************************************************************** // Convert a floating point value to a string using engineering format. // (Eg. convert 100000 to 100k.) // // Argument List : // fNum - The float to be converted // rosNum - A reference to a string to hold the conversion // // Return Values : // Success - TRUE // Failure - FALSE bool ConvertType::bFltToStrEng( float fNum, wxString & rosNum ) { double df1 = (double) fNum; return( bDFltToStrEng( df1, rosNum ) ); } //***************************************************************************** // Parse a float value into it's mantissa and exponent. // // Argument List : // fNum - The float value to be parsed // pfMan - A pointer to float to hold the mantissa (1.000 to 9.999) // piExp - A pointer to integer to hold the exponent // // Return Values : // Success - TRUE // Failure - FALSE bool ConvertType::bParseFlt( float fNum, float * pfMan, int * piExp ) { if( fNum<-FLT_MAX || fNum>FLT_MAX ) return( FALSE ); if( fNum != 0.0 ) { *piExp = (int) floorf( log10( fabs( fNum ) ) ); *pfMan = fNum / pow( 10.0, *piExp ); if( fabs(*pfMan) < 1.0 ) { (*pfMan) *= 10.0; (*piExp)--; } if( fabs(*pfMan) >= 10.0 ) { (*pfMan) /= 10.0; (*piExp)++; } } else { *pfMan = 0.0; *piExp = 0; } return( TRUE ); } //***************************************************************************** // * // Test Utility * // * //***************************************************************************** #ifdef TEST_CONVERTTYPE // Function prototypes void Usage( char * psAppName ); //***************************************************************************** int main( int argc, char * argv[ ] ) { wxString osNum, os1; double dfNum, dfMan; long liNum, liExp; float fNum, fMan; int iNum, iExp; // Validate the argument count passed to the application if( argc > 2 ) { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } // Process the command line arguments os1 = wxConvLibc.cMB2WC( argv[ 1 ] ); if( argc > 1 ) { if( os1 == wxT("-h") ) { Usage( argv[ 0 ] ); exit( EXIT_SUCCESS ); } else { Usage( argv[ 0 ] ); exit( EXIT_FAILURE ); } } // Display the utility banner cout << "\n ConvertType Class Test Utility" << "\n Version 1.06 (12/08/2011)\n\n"; cout << "ConvertType::rosGetNum ( ) : "; osNum = wxT("-10.0E-2uF"); os1 = ConvertType::rosGetNum( osNum ); cout << osNum.mb_str( ) << " -> " << os1.mb_str( ) << "\n"; cout << "ConvertType::rosGetNum ( ) : "; osNum = wxT("0.0E2uVolt"); os1 = ConvertType::rosGetNum( osNum ); cout << osNum.mb_str( ) << " -> " << os1.mb_str( ) << "\n"; cout << "ConvertType::bStrToLong ( ) : "; osNum = wxT("123.5V"); if( ConvertType::bStrToLong( osNum, &liNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << osNum.mb_str( ) << " -> " << liNum << ")\n"; cout << "ConvertType::bStrToDFlt ( ) : "; osNum = wxT("123.4V"); if( ConvertType::bStrToDFlt( osNum, &dfNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << osNum.mb_str( ) << " -> " << dfNum << ")\n"; cout << "ConvertType::bDFltToStr ( ) : "; dfNum = 1.23E+04; if( ConvertType::bDFltToStr( dfNum, osNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << dfNum << " -> " << osNum.mb_str( ) << ")\n"; cout << "ConvertType::bDFltToStrEng( ) : "; dfNum = 1.23E+04; if( ConvertType::bDFltToStrEng( dfNum, osNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << dfNum << " -> " << osNum.mb_str( ) << ")\n"; cout << "ConvertType::bParseDFlt ( ) : "; dfNum = 12.3E-04; if( ConvertType::bParseDFlt( dfNum, &dfMan, &liExp ) ) cout << "Success"; else cout << "Failure"; cout << " (" << dfNum << " -> " << dfMan << "E" << liExp << ")\n"; cout << "ConvertType::bStrToInt ( ) : "; osNum = wxT("123.45E-5"); if( ConvertType::bStrToInt( osNum, &iNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << osNum.mb_str( ) << " -> " << iNum << ")\n"; cout << "ConvertType::bStrToFlt ( ) : "; osNum = wxT("123.45E-5"); if( ConvertType::bStrToFlt( osNum, &fNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << osNum.mb_str( ) << " -> " << fNum << ")\n"; cout << "ConvertType::bFltToStr ( ) : "; fNum = 1.23E+04; if( ConvertType::bFltToStr( fNum, osNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << fNum << " -> " << osNum.mb_str( ) << ")\n"; cout << "ConvertType::bFltToStrEng ( ) : "; fNum = 1.23E+04; if( ConvertType::bFltToStrEng( fNum, osNum ) ) cout << "Success"; else cout << "Failure"; cout << " (" << fNum << " -> " << osNum.mb_str( ) << ")\n"; cout << "ConvertType::bParseFlt ( ) : "; fNum = 12.3E-04; if( ConvertType::bParseFlt( fNum, &fMan, &iExp ) ) cout << "Success"; else cout << "Failure"; cout << " (" << fNum << " -> " << fMan << "E" << iExp << ")\n"; cout << '\n'; exit( EXIT_SUCCESS ); } //***************************************************************************** void Usage( char * psAppName ) { cout << "\nUsage : " << psAppName << " [-OPTIONS]" << "\nOptions :" << "\n -h : Print usage (this message)\n"; } #endif // TEST_CONVERTTYPE //***************************************************************************** gspiceui-1.0.00+dfsg/src/utility/SpinCtrl.cpp0000644000000000000000000004502211566554511017565 0ustar rootroot//***************************************************************************** // SpinCtrl.cpp * // -------------- * // Started : 20/03/2004 * // Last Update : 19/05/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "utility/SpinCtrl.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( SpinCtrl, wxPanel ) EVT_CHAR ( SpinCtrl::OnTxtChar ) EVT_TEXT_MAXLEN( ID_TXTCTRL, SpinCtrl::OnTxtMaxLen ) EVT_SPIN_UP ( ID_SPINBTN, SpinCtrl::OnSbnInc ) EVT_SPIN_DOWN ( ID_SPINBTN, SpinCtrl::OnSbnDec ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // eVType - The type of the variable to be displayed SpinCtrl::SpinCtrl( eVarType eVType ) : wxPanel( ) { if( ! bSetVarType( eVType ) ) // Set the variable type to display m_eVarType = eVAR_FLT; // Set the default variable type to display m_fDefValue = 0.0; // Set the default value m_fMinValue = -1000.0; // Set the default minimum value m_fMaxValue = 1000.0; // Set the default maximum value m_fMinIncSz = 10.0; // Set the default minimum increment size m_fMaxIncSz = 10.0; // Set the default maximum increment size } //***************************************************************************** // Destructor. SpinCtrl::~SpinCtrl( ) { } //***************************************************************************** // Layout the display objects. void SpinCtrl::DoLayout( void ) { wxBoxSizer * poSizer; wxSizerFlags oFlags; poSizer = new wxBoxSizer( wxHORIZONTAL ); oFlags.Expand( ); oFlags.Proportion( 1 ); poSizer->Add( &m_oTxtValue, oFlags ); oFlags.Proportion( 0 ); poSizer->Add( &m_oSbnValue, oFlags ); SetSizer( poSizer ); // Set minimum size and initial size as calculated by the sizer poSizer->SetSizeHints( this ); } //***************************************************************************** // Create an instance of this object. // // Argument List : // poWin - The parent window // oWinID - The window identifier // iWidth - The width the spin control in pixels // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bCreate( wxWindow * poWin, wxWindowID oWinID, int iWidth ) { wxSize oSize=wxDefaultSize; if( bIsCreated( ) ) return( TRUE ); // Create the display objects if( ! Create( poWin, oWinID ) ) return( FALSE ); if( iWidth > 0 ) oSize.SetWidth( iWidth ); m_oTxtValue.Create( this, ID_TXTCTRL, wxT(""), wxDefaultPosition, oSize, wxTE_RIGHT ); m_oSbnValue.Create( this, ID_SPINBTN, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL | wxSP_ARROW_KEYS ); // Set the display object attributes m_oTxtValue.SetMaxLength( SPN_MAXLEN ); m_oSbnValue.SetRange( -0x8000, 0x7FFF ); bSetParms( m_fDefValue, m_fMinValue, m_fMaxValue, m_fMinIncSz, m_fMaxIncSz ); bSetValue( m_fDefValue ); // Layout the display objects DoLayout( ); return( TRUE ); } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bClear( void ) { m_eVarType = eVAR_NONE; m_fDefValue = NOVAL_FLT; m_fMinValue = NOVAL_FLT; m_fMaxValue = NOVAL_FLT; m_fMinIncSz = NOVAL_FLT; m_fMaxIncSz = NOVAL_FLT; if( ! bIsCreated( ) ) return( FALSE ); m_oTxtValue.Clear( ); return( TRUE ); } //***************************************************************************** // Set default object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetDefaults( void ) { return( bSetValue( m_fDefValue ) ); } //***************************************************************************** // Set the variable type to be displayed by the spin control. // // Argument List : // eVType - The variable type specifier // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetVarType( eVarType eVType ) { float f1; // Argument validity checks if( m_eVarType == eVType ) return( TRUE ); if( eVTypeeVAR_LST ) return( FALSE ); m_eVarType = eVType; // Set the new variable type // Display the new variable type if( bIsCreated( ) ) { f1 = fGetValue( ); if( ! bSetValue( f1 ) ) return( FALSE ); } return( TRUE ); } //***************************************************************************** // Set the current value of the spin control. // // Argument List : // fValue - The float value // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetValue( float fValue ) { wxString osValue; float f1; int i1; if( ! bIsCreated( ) ) return( FALSE ); if( fValue < m_fMinValue ) if( !( (m_eVarType==eVAR_SCI || m_eVarType==eVAR_ENG) && fValue==0.0 ) ) return( FALSE ); if( fValue > m_fMaxValue ) return( FALSE ); m_oTxtValue.Clear( ); switch( m_eVarType ) { case eVAR_HEX : if( fValue < 0.0 ) return( FALSE ); i1 = (int) ( fValue + 0.5 ); osValue.Printf( wxT("%X"), i1 ); break; case eVAR_INT : if( fValue >= 0.0 ) i1 = (int) ( fValue + 0.5 ); else i1 = (int) ( fValue - 0.5 ); osValue << i1; break; case eVAR_FLT : osValue.Printf( wxT("%#.2f"), fValue ); break; case eVAR_SCI : osValue.Printf( wxT("%#.2E"), fValue ); break; case eVAR_ENG : if( ! ConvertType::bParseFlt( (double) fValue, &f1, &i1 ) ) return( FALSE ); while( i1 % 3 ) { f1 *= 10.0; i1--; } osValue.Printf( wxT("%#.2fE%02i"), f1, i1 ); break; default: return( FALSE ); } osValue.Append( wxT(" ") ); m_oTxtValue.SetValue( osValue ); return( TRUE ); } //***************************************************************************** // Set the current value of the spin control. // // Argument List : // fValue - The string value // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetValue( const wxString & rosValue ) { double fValue; if( ! ConvertType::bStrToDFlt( rosValue, &fValue ) ) return( FALSE ); if( ! bSetValue( (float) fValue ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Set the initial value of the spin control. // // Argument List : // fDefValue - The spin control default value // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetDefValue( float fDefValue ) { if( fDefValuem_fMaxValue ) return( FALSE ); m_fDefValue = fDefValue; return( TRUE ); } //***************************************************************************** // Set the increment sizes of the spin control. // // This spin control can be incremented using two different approaches, // constant or variable step sizes. A constant step size means that the spin // control is incremented by the same amount throughout it's range. A variable // step size means that the spin control is incremented by an amount dependent // on it's current value. // // Argument List : // fMinIncSz - The minimum spin control increment size // fMaxIncSz - The maximum spin control increment size // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetIncSz( float fMinIncSz, float fMaxIncSz ) { // Constant or variable incrementing? if( fMinIncSz < 0.0 ) return( FALSE ); if( fMaxIncSz < 0.0 ) fMaxIncSz = fMinIncSz; // Do some validity checks on the arguments if( fMinIncSz > fMaxIncSz ) return( FALSE ); // Check that the new increment sizes fit within the current range if( fMaxIncSz > (m_fMaxValue - m_fMinValue) ) return( FALSE ); m_fMinIncSz = fMinIncSz; // Set increment sizes m_fMaxIncSz = fMaxIncSz; return( TRUE ); } //***************************************************************************** // Set the spincontrol range. // // Argument List : // fMinValue - The spin control minimum value // fMaxValue - The spin control maximum value // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetRange( float fMinValue, float fMaxValue ) { return( bSetParms( m_fDefValue, fMinValue, fMaxValue ) ); } //***************************************************************************** // Set all the spin control parameters. // // Argument List : // fDefValue - The spin control default value // fMinValue - The spin control minimum value // fMaxValue - The spin control maximum value // fMinIncSz - The spin control minimum increment size (must be positive) // fMaxIncSz - The spin control maximum increment size (must be positive) // // Return Values : // TRUE - Success // FALSE - Failure bool SpinCtrl::bSetParms( float fDefValue, float fMinValue, float fMaxValue, float fMinIncSz, float fMaxIncSz ) { wxString os1; double df1; // First decide what needs to be done with the increment sizes if( fMinIncSz < 0.0 ) { fMinIncSz = m_fMinIncSz; fMaxIncSz = m_fMaxIncSz; } else if( fMaxIncSz < 0.0 ) { fMaxIncSz = fMinIncSz; } // Check argument validity if( fMinValue >= fMaxValue ) return( FALSE ); if( m_eVarType!=eVAR_SCI && m_eVarType!=eVAR_ENG ) { if( fDefValuefMaxValue ) return( FALSE ); if( fMinIncSz > fMaxIncSz ) return( FALSE ); if( fMaxIncSz > (fMaxValue - fMinValue) ) return( FALSE ); if( fMinIncSz<=0.0 || fMaxIncSz<=0.0 ) return( FALSE ); } else { if( fDefValue != 0.0 ) if( fDefValuefMaxValue ) return( FALSE ); } // Set new parameter values m_fDefValue = fDefValue; m_fMinValue = fMinValue; m_fMaxValue = fMaxValue; if( m_eVarType!=eVAR_SCI && m_eVarType!=eVAR_ENG ) if( ! bSetIncSz( fMinIncSz, fMaxIncSz ) ) return( FALSE ); // Update the text control if necessary if( bIsCreated( ) ) { os1 = m_oTxtValue.GetValue( ); ConvertType::bStrToDFlt( os1, &df1 ); if( df1 < m_fMinValue ) bSetValue( m_fMinValue ); else if( df1 > m_fMaxValue ) bSetValue( m_fMaxValue ); } return( TRUE ); } //***************************************************************************** // Get the current spin control value as an integer. // // Return Values : // Success - The integer value // Failure - INT_MIN int SpinCtrl::iGetValue( void ) { float f1; int i1; // Get the value as a float f1 = fGetValue( ); if( f1 == -FLT_MAX ) return( INT_MIN ); // Round the value if( f1 >= 0.0 ) i1 = (int) ( f1 + 0.5 ); else i1 = (int) ( f1 - 0.5 ); return( i1 ); } //***************************************************************************** // Get the current spin control value as a float. // // Return Values : // Success - The float value // Failure - -FLT_MAX float SpinCtrl::fGetValue( void ) { wxString os1; double df1; // Has the control been created? if( ! bIsCreated( ) ) return( -FLT_MAX ); // Get the value as a float os1 = m_oTxtValue.GetValue( ); if( ! ConvertType::bStrToDFlt( os1, &df1 ) ) return( -FLT_MAX ); return( (float) df1 ); } //***************************************************************************** // Get the current spin control value as a string. // // Return Values : // Success - The string value // Failure - An empty string const wxString & SpinCtrl::rosGetValue( void ) { static wxString osValue; osValue.Empty( ); if( fGetValue( ) != FLT_MAX ) { osValue = m_oTxtValue.GetValue( ); osValue.Trim( ); } return( osValue ); } //***************************************************************************** // // Event Handlers // //***************************************************************************** // Key press event handler. // // Argument List : // roEvtKey - An object holding information about the event void SpinCtrl::OnTxtChar( wxKeyEvent & roEvtKey ) { wxSpinEvent oEvtSpn; int iKeyCode; // Look for the modifier keys and if( roEvtKey.HasModifiers( ) ) return; // Get the key code iKeyCode = roEvtKey.GetKeyCode( ); // Process arrow keys etc. if( iKeyCode == WXK_UP ) { OnSbnInc( oEvtSpn ); return; } else if( iKeyCode == WXK_DOWN ) { OnSbnDec( oEvtSpn ); return; } // Test that the key code is valid and reject invalid characters // ??? (07/07/2007) This doesn't work but it would be good if it did. Only up // and down arrow keys get through to this function, don't know why. switch( iKeyCode ) { case (int) '0' : case (int) '1' : case (int) '2' : case (int) '3' : case (int) '4' : case (int) '5' : case (int) '6' : case (int) '7' : case (int) '8' : case (int) '9' : case (int) '+' : case (int) '-' : case (int) 'e' : case (int) 'E' : case WXK_BACK : case WXK_DELETE : break; default : wxBell( ); // Sound the system bell } } //***************************************************************************** // Text control maximum length reached event handler. // // Argument List : // roEvtCmd - An object holding information about the event void SpinCtrl::OnTxtMaxLen( wxCommandEvent & roEvtCmd ) { wxBell( ); // Sound the system bell } //***************************************************************************** // Spin button scroll up event handler. // // Argument List : // roEvtSpn - An object holding information about the event void SpinCtrl::OnSbnInc( wxSpinEvent & roEvtSpn ) { static uint ui_msec=0; float fValue, fIncSz; wxString os1; double df1, df2; long li1; uint ui1; // Allow additional event handlers to be called roEvtSpn.Skip( ); // Increment the text control SPN_RPTRATE times per second ui1 = (uint) wxGetLocalTimeMillis( ).GetLo( ); if( ui1>ui_msec && (ui1-ui_msec) m_fMaxIncSz ) fIncSz = m_fMaxIncSz; } // Determine if the text control has been altered by the user df2 = ceil( (double) fValue / (double) fIncSz ) * (double) fIncSz - (double) fValue; // Allow for small errors in the floating point calculations if( fabs( df2 / (double) fIncSz ) > 0.0001 && fabs( ( df2 - (double) fIncSz ) / (double) fIncSz ) > 0.0001 ) fIncSz = (float) df2; // Increment the value if( fValue < m_fMaxValue ) { fValue += fIncSz; if( fValue > m_fMaxValue ) fValue = m_fMaxValue; } else if( m_eVarType==eVAR_SCI || m_eVarType==eVAR_ENG ) { if( fValue < m_fMinValue ) fValue = m_fMinValue; } // Set the text control value bSetValue( fValue ); } //***************************************************************************** // Spin button scroll down event handler. // // Argument List : // roEvtSpn - An object holding information about the event void SpinCtrl::OnSbnDec( wxSpinEvent & roEvtSpn ) { static uint ui_msec=0; float fValue, fIncSz; wxString os1; double df1, df2; long li1; uint ui1; // Allow additional event handlers to be called roEvtSpn.Skip( ); // Decrement the text control SPN_RPTRATE times per second ui1 = (uint) wxGetLocalTimeMillis( ).GetLo( ); if( ui1>ui_msec && (ui1-ui_msec) m_fMaxIncSz ) fIncSz = m_fMaxIncSz; } // Determine if the text control has been altered by the user df2 = (double) fValue - floor( (double) fValue / (double) fIncSz ) * (double) fIncSz; // Allow for small errors in the floating point calculations if( fabs( df2 / (double) fIncSz ) > 0.0001 && fabs( ( df2 - (double) fIncSz ) / (double) fIncSz ) > 0.0001 ) fIncSz = (float) df2; // Decrement the value if( fValue > m_fMinValue ) { fValue -= fIncSz; if( fValue < m_fMinValue ) fValue = m_fMinValue; } else if( m_eVarType==eVAR_SCI || m_eVarType==eVAR_ENG ) { fValue = 0.0; } // Set the text control value bSetValue( fValue ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/utility/TextCtrl.hpp0000644000000000000000000000775111627703516017613 0ustar rootroot//***************************************************************************** // TextCtrl.hpp * // -------------- * // Description : This class extends wxTextCtrl, it adds some useful * // functionality (eg. increment by more than one). * // Started : 21/06/2004 * // Last Update : 02/09/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef TEXTCTRL_HPP #define TEXTCTRL_HPP // wxWidgets Includes #include #include #include // System Includes #include #include // Application Includes #include "TypeDefs.hpp" // Local Constant Declarations #define TCTL_INITMSG wxT("Empty") // Default initialization message #define TCTL_INITLINES 4 // Totals initial lines including init. msg. #define TCTL_DISPMIN 10 // Minimum allowable lines in display area #define TCTL_DISPDEF 15 // Default number of lines in display area #define TCTL_DISPMAX 50 // Maximum allowable lines in display area #define TCTL_LINESMIN 100 // Minimum allowable lines in text control #define TCTL_LINESDEF 10E3 // Default number of lines in text control #define TCTL_LINESMAX 1E6 // Maximum allowable lines in text control #define TCTL_VIEWCOLS 122 // The number of columns in display area #define TCTL_NBKTABHT 40 // Extra height in pixels needed by wxNotebook #define TCTL_FONTHT 12.7 // Height in pixels of the font //***************************************************************************** class TextCtrl : public wxTextCtrl { private : wxString m_osInitMsg; static int m_iLinesMax; // Max no. lines the text controls will hold static int m_iLinesDsp; // No. of lines in text control display area int m_iLinesCnt; // No. of lines currently in text control public : TextCtrl( void ); ~TextCtrl( ); bool bCreate ( wxWindow * poWin, wxWindowID oWinID=-1 ); bool bIsCreated( void ) { return( GetParent( ) != NULL ); } bool bClear ( void ); bool bInitialize( void ); bool bIsEmpty ( void ); bool bSetInitMsg ( const wxString & rosMsg ); static bool bSetLinesMax( int iLines ); static bool bSetLinesDsp( int iLines ); const wxString & rosGetInitMsg ( void ) { return( m_osInitMsg ); } int iGetLinesMax( void ) { return( m_iLinesMax ); } int iGetLinesDsp( void ) { return( m_iLinesDsp ); } int iGetLinesCnt( void ) { return( m_iLinesCnt ); } static int iGetPixelHt ( void ) { return( (int) ((float) m_iLinesDsp * TCTL_FONTHT + 0.5 )); } bool bAppendLine( const wxString & rosLine ); bool bAppendFile( const wxString & roFName ); bool bLoadFile ( const wxString & roFName ); }; //***************************************************************************** #endif // TEXTCTRL_HPP gspiceui-1.0.00+dfsg/src/utility/StrUtils.hpp0000644000000000000000000000417111620040503017603 0ustar rootroot//***************************************************************************** // StrUtils.hpp * // -------------- * // Description : This file contains my own string utilities * // - a string compare algorithm * // - a function to reduce a string to a simple single line * // Started : 15/05/2008 * // Last Update : 09/08/2011 * // Copyright : (C) 2008 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef ISTRCMP_HPP #define ISTRCMP_HPP // wxWindows Includes #include #include // Application Includes #include "netlist/Component.hpp" //***************************************************************************** int iStrCmpNode( const wxString & ros1, const wxString & ros2 ); int iStrCmpCpnt( const wxString & ros1, const wxString & ros2 ); int iStrCmpSrc ( const wxString & ros1, const wxString & ros2 ); const wxString & rosStrToLine ( const wxString & ros ); //***************************************************************************** #endif // ISTRCMP_HPP gspiceui-1.0.00+dfsg/src/utility/PnlValue.cpp0000644000000000000000000005615311566554511017564 0ustar rootroot//***************************************************************************** // PnlValue.cpp * // -------------- * // Started : 14/09/2004 * // Last Update : 11/04/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "utility/PnlValue.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( PnlValue, wxPanel ) EVT_SPIN_UP ( SpinCtrl::ID_SPINBTN, PnlValue::OnSpnScroll ) EVT_SPIN_DOWN( SpinCtrl::ID_SPINBTN, PnlValue::OnSpnScroll ) EVT_CHOICE ( ID_CHO_UNITS, PnlValue::OnChoUnits ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. PnlValue::PnlValue( void ) : wxPanel( ) { } //***************************************************************************** // Destructor. PnlValue::~PnlValue( ) { } //***************************************************************************** // Convert a temperature value to Celcius from the units specified in the units // choice control. // Note: This conversion will only be done if the units are of temperature. // // Argument List : // pfValue - The value to be converted // // Return Values : // TRUE - Success // FALSE - Failure bool PnlValue::bTempToDegC( float * pfValue ) { if( ! bIsCreated( ) ) return( FALSE ); if( ! m_bUseUnits || ! m_oChoUnits.IsShown( ) ) return( FALSE ); if( m_oChoUnits.eGetUnitsType( ) != eUNITS_TEMP ) return( FALSE ); switch( m_oChoUnits.GetSelection( ) ) { case 0 : break; // Celcius case 1 : *pfValue = (*pfValue + 32.0) / 2.44 ; break; // Fahrenheit case 2 : *pfValue -= 273.15; break; // Kelvin default: return( FALSE ); } return( TRUE ); } //***************************************************************************** // Convert a phase value to Degree from the units specified in the units // choice control. // Note: This conversion will only be done if the units are of phase. // // Argument List : // pfValue - The value to be converted // // Return Values : // TRUE - Success // FALSE - Failure bool PnlValue::bPhaseToDeg( float * pfValue ) { if( ! bIsCreated( ) ) return( FALSE ); if( ! m_bUseUnits || ! m_oChoUnits.IsShown( ) ) return( FALSE ); if( m_oChoUnits.eGetUnitsType( ) != eUNITS_PHASE ) return( FALSE ); switch( m_oChoUnits.GetSelection( ) ) { case 0 : break; // Degree case 1 : *pfValue /= 6.2832; break; // Radian case 2 : *pfValue *= 0.9; break; // Grad default: return( FALSE ); } return( TRUE ); } //***************************************************************************** // Layout the display objects. void PnlValue::DoLayout( void ) { wxBoxSizer * poSzr; wxSizerFlags oFlags; // Create the sizer for the panel poSzr = new wxBoxSizer( wxHORIZONTAL ); oFlags.Expand( ); oFlags.Border( wxTOP | wxBOTTOM, 1 ); // Add the value label if( m_oLblName.GetParent( ) != NULL ) { oFlags.Proportion( 1 ); // The lines marked with ??? are a fix for a bug in wxWidgets ie. the following line has no effect. oFlags.Align( wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); oFlags.Border( wxTOP, 7 ); // ??? 26/05/2007 poSzr->Add( &m_oLblName, oFlags ); oFlags.Border( wxTOP | wxBOTTOM, 1 ); // ??? 26/05/2007 poSzr->AddSpacer( 5 ); } // Add the value itself oFlags.Proportion( 0 ); oFlags.Center( ); poSzr->Add( &m_oSpnValue, oFlags ); // Add units for the value if( m_bUseUnits ) { poSzr->AddSpacer( 2 ); poSzr->Add( &m_oChoUnits, oFlags ); oFlags.Border( wxTOP, 7 ); // ??? 26/05/2007 poSzr->Add( &m_oLblUnits, oFlags ); } // Set the panel sizer and the min. & init. sizes as calculated by the sizer SetSizer( poSzr ); poSzr->SetSizeHints( this ); } //***************************************************************************** // Create an instance of this object. // // Argument List : // poWin - The parent window // oWinID - The window identifier // iWidth - The width of the name label in pixels // roPosn - The position // bUnits - Flag indicating if units should be accommodated // // Return Values : // TRUE - Success // FALSE - Failure bool PnlValue::bCreate( wxWindow * poWin, wxWindowID oWinID, int iWidth, const wxPoint & roPosn, bool bUnits ) { bool bRtn=TRUE; int iWd, iHt; if( bIsCreated( ) ) return( TRUE ); // Create the base class (wxPanel) if( ! Create( poWin, oWinID, roPosn ) ) return( FALSE ); // Create the variable name label if( iWidth > 0 ) if( ! m_oLblName.Create( this, ID_UNUSED, wxT(""), wxDefaultPosition, wxSize( iWidth, PNLVALUE_HT ), wxALIGN_LEFT ) ) bRtn = FALSE; // Create the value spin control if( ! m_oSpnValue.bCreate( this, ID_SPN_VALUE, 80 ) ) bRtn = FALSE; // Create the units controls m_bUseUnits = bUnits; if( m_bUseUnits ) { // Create the units choice box if( ! m_oChoUnits.bCreate( this, ID_CHO_UNITS, 85 ) ) bRtn = FALSE; // Create the units label m_oChoUnits.GetClientSize( &iWd, &iHt ); if( ! m_oLblUnits.Create( this, ID_LBL_UNITS, wxT(""), wxDefaultPosition, wxSize( iWd, PNLVALUE_HT ), wxST_NO_AUTORESIZE ) ) bRtn = FALSE; m_oLblUnits.Show( FALSE ); } // Layout the display objects DoLayout( ); return( bRtn ); } //***************************************************************************** // Clear the spin and choice values. // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bClear( void ) { bool bRtn=TRUE; if( ! m_oSpnValue.bClear( ) ) bRtn = FALSE; if( ! m_oChoUnits.bClear( ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Set default object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool PnlValue::bSetDefaults( void ) { bool bRtn=TRUE; if( ! m_oSpnValue.bSetDefaults( ) ) bRtn = FALSE; if( ! m_oChoUnits.bSetDefaults( ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Set the name label. // // Argument List : // rosName - The name of the variable // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetName( const wxString & rosName ) { if( ! bIsCreated( ) ) return( FALSE ); if( m_oLblName.GetParent( ) == NULL ) return( FALSE ); if( rosName.IsEmpty( ) ) return( FALSE ); m_oLblName.SetLabel( rosName ); return( TRUE ); } //***************************************************************************** // Set the variable type for the spin control to display. // // Argument List : // eVType - The variable type // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetVarType( eVarType eVType ) { if( ! bIsCreated( ) ) return( FALSE ); return( m_oSpnValue.bSetVarType( eVType ) ); } //***************************************************************************** // Set the spin control range. // // Argument List : // fMinValue - The spin control minimum value // fMaxValue - The spin control maximum value // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetRange( float fMinValue, float fMaxValue ) { if( ! bIsCreated( ) ) return( FALSE ); return( m_oSpnValue.bSetRange( fMinValue, fMaxValue ) ); } //***************************************************************************** // Set the increment sizes of the spin control. // // This spin control can be incremented using two different approaches, // constant or variable step sizes. A constant step size means that the spin // control is incremented by the same amount throughout it's range. A variable // step size means that the spin control is incremented by an amount dependent // on it's current value. // // Argument List : // fMinIncSz - The minimum spin control increment size // fMaxIncSz - The maximum spin control increment size // // Return Values : // TRUE - Success // FALSE - Failure bool PnlValue::bSetIncSz( float fMinIncSz, float fMaxIncSz ) { if( ! bIsCreated( ) ) return( FALSE ); return( m_oSpnValue.bSetIncSz( fMinIncSz, fMaxIncSz ) ); } //***************************************************************************** // Set the spin control parameters. // // Argument List : // fDefValue - The spin control initial value // fMinValue - The spin control minimum value // fMaxValue - The spin control maximum value // fMinIncSz - The spin control minimum increment size // fMaxIncSz - The spin control maximum increment size // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetParms( float fDefValue, float fMinValue, float fMaxValue, float fMinIncSz, float fMaxIncSz ) { bool bRtn; if( ! bIsCreated( ) ) return( FALSE ); bRtn = m_oSpnValue.bSetParms( fDefValue, fMinValue, fMaxValue, fMinIncSz, fMaxIncSz ); return( bRtn ); } //***************************************************************************** // Set the spin control value as an integer. // // Argument List : // liValue - The long integer value // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetValue( long liValue ) { bool bRtn=TRUE; float fMan; int iExp; if( ! bIsCreated( ) ) return( FALSE ); // If this is a temperature or phase value convert to the specified units fMan = (float) liValue; if( bTempToDegC( &fMan ) || bPhaseToDeg( &fMan ) ) { // This is a temperature or phase value convert it to an integer if( fMan >= 0.0 ) liValue = (int) ( fMan + 0.5 ); else liValue = (int) ( fMan - 0.5 ); } if( m_bUseUnits && m_oChoUnits.IsShown( ) ) { // Determine the spin control value and the units choice selection ConvertType::bParseFlt( (double) liValue, &fMan, &iExp ); while( iExp % 3 ) { iExp--; fMan *= 10.0; } // Set the spin control and choice control values if( ! m_oSpnValue.bSetValue( fMan ) ) bRtn = FALSE; if( ! m_oChoUnits.bSetUnits( iExp ) ) bRtn = FALSE; } else if( ! m_oSpnValue.bSetValue( (int) liValue ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Set the spin control value as a float. // // Argument List : // dfValue - The double float value // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetValue( double dfValue ) { bool bRtn=TRUE; float fMan=0.0; int iExp=0; if( ! bIsCreated( ) ) return( FALSE ); fMan = (float) dfValue; bTempToDegC( &fMan ); // Convert value to Deg.C if appropriate bPhaseToDeg( &fMan ); // Convert value to Degree if appropriate if( m_bUseUnits && m_oChoUnits.IsShown( ) ) { // Determine the spin control value and the units choice selection ConvertType::bParseFlt( dfValue, &fMan, &iExp ); while( iExp % 3 ) { iExp--; fMan *= 10.0; } // Set the spin control and choice control values if( ! m_oChoUnits.bSetUnits( iExp ) ) bRtn = FALSE; else if( ! m_oSpnValue.bSetValue( fMan ) ) bRtn = FALSE; } else if( ! m_oSpnValue.bSetValue( (float) dfValue ) ) bRtn = FALSE; return( bRtn ); } //***************************************************************************** // Set the spin control value as a string. // // Argument List : // rosValue - The string value // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetValue( const wxString & rosValue ) { wxString os1; double df1, df2; long li1; // Don't continue unless the panel has been created if( ! bIsCreated( ) ) return( FALSE ); // Set the value if( ! ConvertType::bStrToDFlt( rosValue, &df1 ) ) return( FALSE ); if( ! bSetValue( df1 ) ) return( FALSE ); // For zero values the units will have been ignored, attempt to set them here if( df1 == 0.0 ) { os1 = rosValue; os1.at( 0 ) = '1'; if( ! ConvertType::bStrToDFlt( os1, &df1 ) ) return( FALSE ); if( ! ConvertType::bParseDFlt( df1, &df2, &li1 ) ) return( FALSE ); if( ! m_oChoUnits.bSetUnits( (int) li1 ) ) return( FALSE ); } return( TRUE ); } //***************************************************************************** // Set the type of units to be displayed in the choice control. // // Argument List : // eUType - The units specifier // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetUnitsType( eUnitsType eUType ) { bool bRtn; if( ! m_bUseUnits || ! bIsCreated( ) ) return( FALSE ); if( m_oChoUnits.eGetUnitsType( ) == eUType ) return( TRUE ); if( ! m_oChoUnits.bSetUnitsType( eUType ) ) return( FALSE ); m_oChoUnits.m_eDefUType = eUType; // Automatically set the spin control parameters switch( eUType ) { case eUNITS_CAP : // Capacitance bRtn = m_oSpnValue.bSetParms( 100.0, 0.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_IND : // Inductance bRtn = m_oSpnValue.bSetParms( 100.0, 0.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_RES : // Resistance bRtn = m_oSpnValue.bSetParms( 100.0, 0.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_VOLT : // Voltage bRtn = m_oSpnValue.bSetParms( 100.0, -1000.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_CURR : // Current bRtn = m_oSpnValue.bSetParms( 100.0, -1000.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_TIME : // Time bRtn = m_oSpnValue.bSetParms( 100.0, 0.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_FREQ : // Frequency bRtn = m_oSpnValue.bSetParms( 100.0, 0.0, 1000.0, 1.0, 100.0 ); break; case eUNITS_PHASE : // Phase bRtn = m_oSpnValue.bSetParms( 0.0, 0.0, 360.0, 5.0 ); break; case eUNITS_TEMP : // Temperature bRtn = m_oSpnValue.bSetParms( 27.0, -100.0, 200.0, 1.0 ); break; case eUNITS_SCLR : // Scalar bRtn = m_oSpnValue.bSetParms( 1.0, -1000.0, 1000.0, 1.0, 100.0 ); break; default : // Default bRtn = m_oSpnValue.bSetParms( 100.0, -1000.0, 1000.0, 1.0, 100.0 ); break; } return( bRtn ); } //***************************************************************************** // Set the units to be displayed in the choice control or static label. // // Argument List : // rosUnits - The units to be displayed // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bSetUnits( const wxString & rosUnits ) { if( ! m_bUseUnits || ! bIsCreated( ) ) return( FALSE ); if( m_oChoUnits.IsShown( ) ) { if( ! m_oChoUnits.bSetUnits( rosUnits ) ) return( FALSE ); } else m_oLblUnits.SetLabel( wxT(" ") + rosUnits ); return( TRUE ); } //***************************************************************************** // Show or hide the units choice control. // // Argument List : // bEnable - The new state for the units choice control // // Return Values : // Success - TRUE // Failure - FALSE bool PnlValue::bShowUnits( bool bEnable ) { if( ! m_bUseUnits || ! bIsCreated( ) ) return( FALSE ); if( bEnable ) { m_oLblUnits.Show( FALSE ); m_oChoUnits.Show( TRUE ); } else { m_oChoUnits.Show( FALSE ); m_oLblUnits.Show( TRUE ); } return( TRUE ); } //***************************************************************************** // Get the variable name. // // Return Values : // Success - The variable name as a string // Failure - An empty string const wxString & PnlValue::rosGetName( void ) { static wxString os1; os1.Empty( ); if( ! bIsCreated( ) ) return( os1 ); os1 = m_oLblName.GetLabel( ); return( os1 ); } //***************************************************************************** // Get the spin control value including units as an integer. // // Return Values : // Success - The value as a long integer // Failure - LONG_MIN long PnlValue::liGetValue( void ) { float f1; long li1; int i1; // Has the control been created? if( ! bIsCreated( ) ) return( LONG_MIN ); // Get the value combining it with any units if( m_bUseUnits && m_oChoUnits.IsShown( ) ) { f1 = m_oSpnValue.fGetValue( ); if( f1 == -FLT_MAX ) return( LONG_MIN ); li1 = m_oChoUnits.liGetValue( f1 ); } else { i1 = m_oSpnValue.iGetValue( ); if( i1 == INT_MIN ) return( LONG_MIN ); li1 = (long) i1; } return( li1 ); } //***************************************************************************** // Get the spin control value including units as a float. // // Return Values : // Success - The value as a double precision float // Failure - -DBL_MAX double PnlValue::dfGetValue( void ) { float f1; double df1; // Has the control been created? if( ! bIsCreated( ) ) return( -DBL_MAX ); // Get the spin control value f1 = m_oSpnValue.fGetValue( ); if( f1 == -FLT_MAX ) return( -DBL_MAX ); // Combine the spin control value with any units if( m_bUseUnits && m_oChoUnits.IsShown( ) ) df1 = m_oChoUnits.dfGetValue( f1 ); else df1 = (double) f1; return( df1 ); } //***************************************************************************** // Get the spin control value including units as a string. // // Return Values : // Success - The value as a string // Failure - An empty string const wxString & PnlValue::rosGetValue( void ) { static wxString osValue; float f1; osValue.Empty( ); // Has the control been created? if( ! bIsCreated( ) ) return( osValue ); // Test the spin control value f1 = m_oSpnValue.fGetValue( ); if( f1 == -FLT_MAX ) return( osValue ); // Combine the spin control value with any units if( m_bUseUnits && m_oChoUnits.IsShown( ) ) osValue = m_oChoUnits.rosGetValue( f1 ); else osValue = m_oSpnValue.rosGetValue( ); return( osValue ); } //***************************************************************************** // Get the units. // // Return Values : // Success - The currently selected units // Failure - An empty string const wxString & PnlValue::rosGetUnits( void ) { static wxString osEmpty; if( ! m_bUseUnits || ! bIsCreated( ) ) return( osEmpty ); return( m_oChoUnits.rosGetUnits( ) ); } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Spin button scroll event handler. // // Argument List : // roEvtSpn - An object holding information about the event void PnlValue::OnSpnScroll( wxSpinEvent & roEvtSpn ) { static bool bAtLimit=FALSE; static bool bStartup=TRUE; float f1; int i1; if( ! m_bUseUnits || ! m_oChoUnits.IsShown( ) ) return; if( m_oChoUnits.eGetUnitsType( ) == eUNITS_TEMP ) return; if( m_oChoUnits.eGetUnitsType( ) == eUNITS_PHASE ) return; f1 = m_oSpnValue.fGetValue( ); i1 = m_oChoUnits.iGetUnits( ); // Must set the state of bAtLimit when this function first called if( bStartup ) { bStartup = FALSE; if( f1 == 0.0 ) bAtLimit = TRUE; if( f1 == m_oSpnValue.fGetMaxValue( ) ) bAtLimit = TRUE; if( f1 == m_oSpnValue.fGetMinValue( ) ) bAtLimit = TRUE; } // Determine the event type and act accordingly if( roEvtSpn.GetEventType( ) == wxEVT_SCROLL_LINEUP ) { // Increment the value if( f1 > 0.0 ) { // Positive numbers if( f1 < m_oSpnValue.fGetMaxValue( ) ) { bAtLimit = FALSE; return; } if( ! bAtLimit ) { bAtLimit = TRUE; return; } f1 /= 1000.0; i1 += 3; } else { // Negative numbers if( f1 < -1.0 ) { bAtLimit = FALSE; return; } if( ! bAtLimit ) { bAtLimit = TRUE; return; } f1 = -1000.0; i1 -= 3; } } else if( roEvtSpn.GetEventType( ) == wxEVT_SCROLL_LINEDOWN ) { // Decrement the value if( f1 < 0.0 ) { // Negative numbers if( f1 > m_oSpnValue.fGetMinValue( ) ) { bAtLimit = FALSE; return; } if( ! bAtLimit ) { bAtLimit = TRUE; return; } f1 /= 1000.0; i1 += 3; } else { // Positive numbers if( f1 > 1.0 ) { bAtLimit = FALSE; return; } if( ! bAtLimit ) { bAtLimit = TRUE; return; } f1 = 1000.0; i1 -= 3; } } else return; if( m_oChoUnits.bSetUnits( i1 ) ) m_oSpnValue.bSetValue( f1 ); } //***************************************************************************** // Units choice box event handler. // // Argument List : // roEvtCmd - An object holding information about the event void PnlValue::OnChoUnits( wxCommandEvent & roEvtCmd ) { if( m_oChoUnits.eGetUnitsType( ) == eUNITS_TEMP ) { if( m_oChoUnits.rosGetUnits( ).IsSameAs( wxT("Deg C") ) ) bSetParms( 27.0, -100.0, 200.0, 1.0 ); else if( m_oChoUnits.rosGetUnits( ).IsSameAs( wxT("Deg F") ) ) bSetParms( 70.0, -100.0, 400.0, 1.0 ); else if( m_oChoUnits.rosGetUnits( ).IsSameAs( wxT("Deg K") ) ) bSetParms( 300.0, 200.0, 500.0, 1.0 ); } else if( m_oChoUnits.eGetUnitsType( ) == eUNITS_PHASE ) { if( m_oChoUnits.rosGetUnits( ).IsSameAs( wxT("Degree") ) ) bSetParms( 0.0, 0.0, 360.0, 1.0 ); else if( m_oChoUnits.rosGetUnits( ).IsSameAs( wxT("Radian") ) ) bSetParms( 0.0, 0.0, 6.3, 0.1 ); else if( m_oChoUnits.rosGetUnits( ).IsSameAs( wxT("Grad") ) ) bSetParms( 0.0, 0.0, 400.0, 1.0 ); } } //***************************************************************************** gspiceui-1.0.00+dfsg/src/utility/PnlValue.hpp0000644000000000000000000001130311547341360017550 0ustar rootroot//***************************************************************************** // PnlValue.hpp * // -------------- * // Description : This class derives from the wxPanel base class. It provides * // the functionality for displaying and setting the value of * // floating point variables and can optionally allow the * // setting and processing of units. * // Started : 14/09/2004 * // Last Update : 08/04/2011 * // Copyright : (C) 2004 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef PNLVALUE_HPP #define PNLVALUE_HPP // System Includes #include // wxWidgets Library Includes #include #include // Application Includes #include "TypeDefs.hpp" #include "utility/SpinCtrl.hpp" #include "utility/ChoUnits.hpp" #include "utility/ConvertType.hpp" // Local Constant Declarations #define PNLVALUE_HT 24 //***************************************************************************** class PnlValue : public wxPanel { private : // Flag indicating if units should accommodated bool m_bUseUnits; // Display objects wxLabel m_oLblName; // The static value name SpinCtrl m_oSpnValue; // Displays the numeric value ChoUnits m_oChoUnits; // Displayed if the units can change wxLabel m_oLblUnits; // Displayed if the units do not change bool bTempToDegC( float * pfValue ); bool bPhaseToDeg( float * pfValue ); void DoLayout( void ); public : PnlValue( void ); ~PnlValue( ); bool bCreate( wxWindow * poWin, wxWindowID oWinID, int iWidth=-1, const wxPoint & roPosn=wxDefaultPosition, bool bUnits=TRUE ); bool bIsCreated( void ) { return( GetParent( )!=NULL ? TRUE : FALSE ); } bool bClear( void ); bool bSetDefaults( void ); bool bSetName ( const wxString & rosName ); bool bSetVarType ( eVarType eVType ); bool bSetRange ( float fMinValue, float fMaxValue ); bool bSetIncSz ( float fMinIncSz, float fMaxIncSz=-1.0 ); bool bSetParms ( float fDefValue, float fMinValue, float fMaxValue, float fMinIncSz=-1.0, float fMaxIncSz=-1.0 ); bool bSetValue ( long liValue ); bool bSetValue ( double dfValue ); bool bSetValue ( const wxString & rosValue ); bool bSetUnitsType( eUnitsType eUType ); bool bSetUnits ( const wxString & rosUnits ); bool bSetDefValue ( float fValue ) { return( m_oSpnValue.bSetDefValue( fValue ) ); } bool bSetDefUType ( eUnitsType eUType ) { m_oChoUnits.m_eDefUType = eUType; return( TRUE ); } bool bShowUnits( bool bEnable ); const wxString & rosGetName ( void ); long liGetValue( void ); double dfGetValue( void ); int iGetValue( void ) { return( (int) liGetValue( ) ); } float fGetValue( void ) { return( (float) dfGetValue( ) ); } const wxString & rosGetValue( void ); const wxString & rosGetUnits( void ); // Event handlers void OnSpnScroll( wxSpinEvent & roEvtSpn ); void OnChoUnits ( wxCommandEvent & roEvtCmd ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum ePnlItemID { ID_SPN_VALUE = 0, ID_CHO_UNITS, ID_LBL_UNITS, ID_UNUSED, ID_FST = ID_SPN_VALUE, ID_LST = ID_LBL_UNITS }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // PNLVALUE_HPP gspiceui-1.0.00+dfsg/src/App_gSpiceUI.cpp0000644000000000000000000000756711627531506016605 0ustar rootroot//***************************************************************************** // App_gSpiceUI.hpp * // ------------------ * // Started : 15/08/2003 * // Last Update : 11/02/2011 * // Copyright : (C) 2003 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "App_gSpiceUI.hpp" //***************************************************************************** // All programs must have a "main" function. Under wxWidgets main( ) is // implemented using the following macro which creates an application instance // and starts program execution. IMPLEMENT_APP( App_gSpiceUI ) //***************************************************************************** // Implement an event table in which the events are routed to their respective // handler functions in the class. If -1 is given as the ID, the given handler // will be invoked for any event of the specified type. //BEGIN_EVENT_TABLE( App_gSpiceUI, wxApp ) //END_EVENT_TABLE( ) //***************************************************************************** // Constructor. App_gSpiceUI::App_gSpiceUI( void ) { g_bDebug = FALSE; m_poFrmMain = NULL; } //***************************************************************************** // Destructor. App_gSpiceUI::~App_gSpiceUI( ) { } //***************************************************************************** // wxWidgets calls wxApp::OnInit( ) at startup, the method is used to // initialize the application. // // Return Values: // TRUE - Success (continue application execution) // FALSE - Failure (terminate application execution) bool App_gSpiceUI::OnInit( void ) { // The following line magically makes locale stuff work, don't touch! setlocale( LC_NUMERIC, "C" ); // Set the command line and process it if( ! m_oCmdLnPcr.bSetCmdLine( argc, argv ) ) return( FALSE ); if( ! m_oCmdLnPcr.bProcArgs( ) ) return( FALSE ); // Create the GUI m_poFrmMain = new FrmMain( this ); m_poFrmMain->Show( TRUE ); SetTopWindow( m_poFrmMain ); m_poFrmMain->DlgErrMsg( ); // Display error message held over during startup return( TRUE ); } //***************************************************************************** // wxWidgets calls wxApp::Mainloop( ) on creation of the application. // // Return Values: // 0 - Not used /* int App_gSpiceUI::MainLoop( void ) { while( m_poFrmMain->bIsOpen( ) ) { Yield( ); // Allow messages in the event queue to be processed wxMilliSleep( 100 ); // Sleep for 100msec } return( 0 ); } // */ //***************************************************************************** // wxWidgets calls wxApp::OnExit( ) on application termination. // // Return Values: // 0 - Not used int App_gSpiceUI::OnExit( void ) { // Delete the global configuration object delete wxConfig::Set( (wxConfig *) NULL ); return( 0 ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/Makefile.deps0000644000000000000000000006515411640201447016210 0ustar rootrootobj/App_gSpiceUI.o: App_gSpiceUI.cpp App_gSpiceUI.hpp CmdLinePcr.hpp \ Version.hpp TypeDefs.hpp process/PrcGNetList.hpp base/PrcBase.hpp \ TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp main/FrmMain.hpp \ main/FileTasks.hpp base/SimnBase.hpp base/CmdBase.hpp \ netlist/NetList.hpp Version.hpp process/PrcGSchem.hpp \ process/PrcGNetList.hpp main/HelpTasks.hpp CmdLinePcr.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp process/PrcGnuCap.hpp \ base/PrcSimrBase.hpp process/PrcNgSpice.hpp process/PrcGaw.hpp \ process/PrcGWave.hpp main/NbkTxtCtls.hpp main/DlgPrefs.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp gnucap/NbkGnuCap.hpp base/NbkSimrBase.hpp \ base/PnlAnaBase.hpp gnucap/dialogs/DlgGcpCfgOPT.hpp \ gnucap/panels/PnlGnuCapOP.hpp gnucap/panels/PnlGnuCapDC.hpp \ gnucap/panels/PnlGnuCapAC.hpp gnucap/panels/PnlGnuCapTR.hpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp gnucap/panels/PnlGnuCapFO.hpp \ ngspice/NbkNgSpice.hpp ngspice/dialogs/DlgNgsCfgOPT.hpp \ ngspice/panels/PnlNgSpiceDC.hpp ngspice/panels/PnlNgSpiceAC.hpp \ ngspice/panels/PnlNgSpiceTR.hpp ngspice/dialogs/DlgNgsCfgSrc.hpp obj/CmdLinePcr.o: CmdLinePcr.cpp CmdLinePcr.hpp Version.hpp TypeDefs.hpp \ process/PrcGNetList.hpp base/PrcBase.hpp TypeDefs.hpp \ utility/TextCtrl.hpp utility/StrUtils.hpp netlist/Component.hpp \ utility/ConvertType.hpp obj/TypeDefs.o: TypeDefs.cpp TypeDefs.hpp obj/CmdBase.o: base/CmdBase.cpp base/CmdBase.hpp TypeDefs.hpp obj/NbkSimrBase.o: base/NbkSimrBase.cpp base/NbkSimrBase.hpp TypeDefs.hpp \ netlist/NetList.hpp Version.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp base/SimnBase.hpp \ base/CmdBase.hpp base/PnlAnaBase.hpp utility/PnlValue.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp obj/PnlAnaBase.o: base/PnlAnaBase.cpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp obj/PrcBase.o: base/PrcBase.cpp base/PrcBase.hpp TypeDefs.hpp \ utility/TextCtrl.hpp utility/StrUtils.hpp netlist/Component.hpp \ utility/ConvertType.hpp obj/PrcSimrBase.o: base/PrcSimrBase.cpp base/PrcSimrBase.hpp TypeDefs.hpp \ base/PrcBase.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp obj/SimnBase.o: base/SimnBase.cpp base/SimnBase.hpp TypeDefs.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp obj/NbkGnuCap.o: gnucap/NbkGnuCap.cpp gnucap/NbkGnuCap.hpp TypeDefs.hpp \ base/NbkSimrBase.hpp netlist/NetList.hpp Version.hpp \ utility/StrUtils.hpp netlist/Component.hpp utility/ConvertType.hpp \ base/SimnBase.hpp base/CmdBase.hpp base/PnlAnaBase.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp gnucap/dialogs/DlgGcpCfgOPT.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/panels/PnlGnuCapOP.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp \ gnucap/panels/PnlGnuCapDC.hpp gnucap/panels/PnlGnuCapAC.hpp \ gnucap/panels/PnlGnuCapTR.hpp gnucap/dialogs/DlgGcpCfgGEN.hpp \ gnucap/panels/PnlGnuCapFO.hpp obj/DlgPrefs.o: main/DlgPrefs.cpp main/DlgPrefs.hpp CmdLinePcr.hpp \ Version.hpp TypeDefs.hpp process/PrcGNetList.hpp base/PrcBase.hpp \ TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/PnlValue.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp obj/FileTasks.o: main/FileTasks.cpp main/FileTasks.hpp TypeDefs.hpp \ base/SimnBase.hpp base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ utility/StrUtils.hpp netlist/Component.hpp utility/ConvertType.hpp \ process/PrcGSchem.hpp base/PrcBase.hpp utility/TextCtrl.hpp \ process/PrcGNetList.hpp main/FrmMain.hpp main/HelpTasks.hpp \ CmdLinePcr.hpp Version.hpp TypeDefs.hpp process/PrcGNetList.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp process/PrcGnuCap.hpp \ base/PrcSimrBase.hpp process/PrcNgSpice.hpp process/PrcGaw.hpp \ process/PrcGWave.hpp main/NbkTxtCtls.hpp main/DlgPrefs.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp gnucap/NbkGnuCap.hpp base/NbkSimrBase.hpp \ base/PnlAnaBase.hpp gnucap/dialogs/DlgGcpCfgOPT.hpp \ gnucap/panels/PnlGnuCapOP.hpp gnucap/panels/PnlGnuCapDC.hpp \ gnucap/panels/PnlGnuCapAC.hpp gnucap/panels/PnlGnuCapTR.hpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp gnucap/panels/PnlGnuCapFO.hpp \ ngspice/NbkNgSpice.hpp ngspice/dialogs/DlgNgsCfgOPT.hpp \ ngspice/panels/PnlNgSpiceDC.hpp ngspice/panels/PnlNgSpiceAC.hpp \ ngspice/panels/PnlNgSpiceTR.hpp ngspice/dialogs/DlgNgsCfgSrc.hpp obj/FrmMain.o: main/FrmMain.cpp main/FrmMain.hpp TypeDefs.hpp \ main/FileTasks.hpp base/SimnBase.hpp base/CmdBase.hpp \ netlist/NetList.hpp Version.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp process/PrcGSchem.hpp \ base/PrcBase.hpp utility/TextCtrl.hpp process/PrcGNetList.hpp \ main/HelpTasks.hpp CmdLinePcr.hpp Version.hpp TypeDefs.hpp \ process/PrcGNetList.hpp netlist/SimnGnuCap.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp process/PrcGnuCap.hpp \ base/PrcSimrBase.hpp process/PrcNgSpice.hpp process/PrcGaw.hpp \ process/PrcGWave.hpp main/NbkTxtCtls.hpp main/DlgPrefs.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp gnucap/NbkGnuCap.hpp base/NbkSimrBase.hpp \ base/PnlAnaBase.hpp gnucap/dialogs/DlgGcpCfgOPT.hpp \ gnucap/panels/PnlGnuCapOP.hpp gnucap/panels/PnlGnuCapDC.hpp \ gnucap/panels/PnlGnuCapAC.hpp gnucap/panels/PnlGnuCapTR.hpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp gnucap/panels/PnlGnuCapFO.hpp \ ngspice/NbkNgSpice.hpp ngspice/dialogs/DlgNgsCfgOPT.hpp \ ngspice/panels/PnlNgSpiceDC.hpp ngspice/panels/PnlNgSpiceAC.hpp \ ngspice/panels/PnlNgSpiceTR.hpp ngspice/dialogs/DlgNgsCfgSrc.hpp \ icons/gspiceui-32x32.xpm icons/file-open.xpm icons/file-import.xpm \ icons/file-reload.xpm icons/file-close.xpm icons/sim-create.xpm \ icons/sim-run.xpm icons/sim-stop.xpm icons/sim-edit.xpm \ icons/sim-plot.xpm icons/help.xpm obj/HelpTasks.o: main/HelpTasks.cpp main/HelpTasks.hpp CmdLinePcr.hpp \ Version.hpp TypeDefs.hpp process/PrcGNetList.hpp base/PrcBase.hpp \ TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp main/FrmMain.hpp \ main/FileTasks.hpp base/SimnBase.hpp base/CmdBase.hpp \ netlist/NetList.hpp Version.hpp process/PrcGSchem.hpp \ process/PrcGNetList.hpp netlist/SimnGnuCap.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp process/PrcGnuCap.hpp \ base/PrcSimrBase.hpp process/PrcNgSpice.hpp process/PrcGaw.hpp \ process/PrcGWave.hpp main/NbkTxtCtls.hpp main/DlgPrefs.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp gnucap/NbkGnuCap.hpp base/NbkSimrBase.hpp \ base/PnlAnaBase.hpp gnucap/dialogs/DlgGcpCfgOPT.hpp \ gnucap/panels/PnlGnuCapOP.hpp gnucap/panels/PnlGnuCapDC.hpp \ gnucap/panels/PnlGnuCapAC.hpp gnucap/panels/PnlGnuCapTR.hpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp gnucap/panels/PnlGnuCapFO.hpp \ ngspice/NbkNgSpice.hpp ngspice/dialogs/DlgNgsCfgOPT.hpp \ ngspice/panels/PnlNgSpiceDC.hpp ngspice/panels/PnlNgSpiceAC.hpp \ ngspice/panels/PnlNgSpiceTR.hpp ngspice/dialogs/DlgNgsCfgSrc.hpp \ icons/gspiceui-32x32.xpm icons/html-forward.xpm icons/html-back.xpm \ icons/html-close.xpm obj/NbkTxtCtls.o: main/NbkTxtCtls.cpp main/NbkTxtCtls.hpp \ utility/TextCtrl.hpp TypeDefs.hpp obj/Component.o: netlist/Component.cpp netlist/Component.hpp TypeDefs.hpp \ utility/ConvertType.hpp utility/StrUtils.hpp obj/CpntNgsIndSrc.o: netlist/CpntNgsIndSrc.cpp netlist/CpntNgsIndSrc.hpp \ netlist/Component.hpp TypeDefs.hpp utility/ConvertType.hpp \ utility/StrUtils.hpp gnucap/commands/CmdGnuCapGEN.hpp base/CmdBase.hpp obj/NetList.o: netlist/NetList.cpp netlist/NetList.hpp Version.hpp \ TypeDefs.hpp utility/StrUtils.hpp netlist/Component.hpp \ utility/ConvertType.hpp obj/SimnGnuCap.o: netlist/SimnGnuCap.cpp netlist/SimnGnuCap.hpp \ base/SimnBase.hpp TypeDefs.hpp base/CmdBase.hpp netlist/NetList.hpp \ Version.hpp utility/StrUtils.hpp netlist/Component.hpp \ utility/ConvertType.hpp gnucap/commands/CmdGnuCapOPT.hpp \ base/CmdBase.hpp ngspice/commands/CmdNgSpiceOPT.hpp \ gnucap/commands/CmdGnuCapOP.hpp ngspice/commands/CmdNgSpiceDC.hpp \ gnucap/commands/CmdGnuCapDC.hpp gnucap/commands/CmdGnuCapAC.hpp \ ngspice/commands/CmdNgSpiceAC.hpp gnucap/commands/CmdGnuCapTR.hpp \ ngspice/commands/CmdNgSpiceTR.hpp gnucap/commands/CmdGnuCapFO.hpp \ gnucap/commands/CmdGnuCapPR.hpp ngspice/commands/CmdNgSpicePR.hpp \ gnucap/commands/CmdGnuCapGEN.hpp netlist/CpntNgsIndSrc.hpp \ netlist/SimnNgSpice.hpp obj/SimnNgSpice.o: netlist/SimnNgSpice.cpp netlist/SimnNgSpice.hpp \ base/SimnBase.hpp TypeDefs.hpp base/CmdBase.hpp netlist/NetList.hpp \ Version.hpp utility/StrUtils.hpp netlist/Component.hpp \ utility/ConvertType.hpp ngspice/commands/CmdNgSpiceOPT.hpp \ base/CmdBase.hpp gnucap/commands/CmdGnuCapOPT.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapOP.hpp \ gnucap/commands/CmdGnuCapDC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpicePR.hpp \ gnucap/commands/CmdGnuCapPR.hpp netlist/SimnGnuCap.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp obj/NbkNgSpice.o: ngspice/NbkNgSpice.cpp ngspice/NbkNgSpice.hpp TypeDefs.hpp \ base/NbkSimrBase.hpp netlist/NetList.hpp Version.hpp \ utility/StrUtils.hpp netlist/Component.hpp utility/ConvertType.hpp \ base/SimnBase.hpp base/CmdBase.hpp base/PnlAnaBase.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp ngspice/dialogs/DlgNgsCfgOPT.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp base/CmdBase.hpp \ gnucap/commands/CmdGnuCapOPT.hpp ngspice/panels/PnlNgSpiceDC.hpp \ netlist/SimnNgSpice.hpp ngspice/commands/CmdNgSpiceDC.hpp \ gnucap/commands/CmdGnuCapOP.hpp gnucap/commands/CmdGnuCapDC.hpp \ ngspice/commands/CmdNgSpiceAC.hpp gnucap/commands/CmdGnuCapAC.hpp \ ngspice/commands/CmdNgSpiceTR.hpp gnucap/commands/CmdGnuCapTR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapPR.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapFO.hpp \ gnucap/commands/CmdGnuCapGEN.hpp netlist/CpntNgsIndSrc.hpp \ ngspice/panels/PnlNgSpiceAC.hpp ngspice/panels/PnlNgSpiceTR.hpp \ ngspice/dialogs/DlgNgsCfgSrc.hpp obj/PrcGaw.o: process/PrcGaw.cpp process/PrcGaw.hpp base/PrcBase.hpp \ TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp obj/PrcGNetList.o: process/PrcGNetList.cpp process/PrcGNetList.hpp \ base/PrcBase.hpp TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp obj/PrcGnuCap.o: process/PrcGnuCap.cpp process/PrcGnuCap.hpp TypeDefs.hpp \ base/PrcSimrBase.hpp base/PrcBase.hpp utility/TextCtrl.hpp \ utility/StrUtils.hpp netlist/Component.hpp utility/ConvertType.hpp \ base/SimnBase.hpp base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp obj/PrcGSchem.o: process/PrcGSchem.cpp process/PrcGSchem.hpp base/PrcBase.hpp \ TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp obj/PrcGWave.o: process/PrcGWave.cpp process/PrcGWave.hpp base/PrcBase.hpp \ TypeDefs.hpp utility/TextCtrl.hpp utility/StrUtils.hpp \ netlist/Component.hpp utility/ConvertType.hpp obj/PrcNgSpice.o: process/PrcNgSpice.cpp process/PrcNgSpice.hpp TypeDefs.hpp \ base/PrcSimrBase.hpp base/PrcBase.hpp utility/TextCtrl.hpp \ utility/StrUtils.hpp netlist/Component.hpp utility/ConvertType.hpp \ base/SimnBase.hpp base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp obj/ChoUnits.o: utility/ChoUnits.cpp utility/ChoUnits.hpp TypeDefs.hpp \ utility/ConvertType.hpp obj/ConvertType.o: utility/ConvertType.cpp utility/ConvertType.hpp obj/PnlValue.o: utility/PnlValue.cpp utility/PnlValue.hpp TypeDefs.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp \ utility/ConvertType.hpp obj/SpinCtrl.o: utility/SpinCtrl.cpp utility/SpinCtrl.hpp TypeDefs.hpp \ utility/ConvertType.hpp obj/StrUtils.o: utility/StrUtils.cpp utility/StrUtils.hpp \ netlist/Component.hpp TypeDefs.hpp utility/ConvertType.hpp obj/TextCtrl.o: utility/TextCtrl.cpp utility/TextCtrl.hpp TypeDefs.hpp obj/CmdGnuCapAC.o: gnucap/commands/CmdGnuCapAC.cpp \ gnucap/commands/CmdGnuCapAC.hpp base/CmdBase.hpp TypeDefs.hpp \ ngspice/commands/CmdNgSpiceAC.hpp utility/ConvertType.hpp obj/CmdGnuCapDC.o: gnucap/commands/CmdGnuCapDC.cpp \ gnucap/commands/CmdGnuCapDC.hpp base/CmdBase.hpp TypeDefs.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapOP.hpp \ utility/ConvertType.hpp obj/CmdGnuCapFO.o: gnucap/commands/CmdGnuCapFO.cpp \ gnucap/commands/CmdGnuCapFO.hpp base/CmdBase.hpp TypeDefs.hpp \ utility/ConvertType.hpp obj/CmdGnuCapGEN.o: gnucap/commands/CmdGnuCapGEN.cpp \ gnucap/commands/CmdGnuCapGEN.hpp base/CmdBase.hpp TypeDefs.hpp \ utility/ConvertType.hpp netlist/CpntNgsIndSrc.hpp netlist/Component.hpp \ utility/StrUtils.hpp obj/CmdGnuCapOP.o: gnucap/commands/CmdGnuCapOP.cpp \ gnucap/commands/CmdGnuCapOP.hpp base/CmdBase.hpp TypeDefs.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ utility/ConvertType.hpp obj/CmdGnuCapOPT.o: gnucap/commands/CmdGnuCapOPT.cpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp TypeDefs.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp utility/ConvertType.hpp obj/CmdGnuCapPR.o: gnucap/commands/CmdGnuCapPR.cpp \ gnucap/commands/CmdGnuCapPR.hpp base/CmdBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ netlist/NetList.hpp Version.hpp ngspice/commands/CmdNgSpicePR.hpp obj/CmdGnuCapTR.o: gnucap/commands/CmdGnuCapTR.cpp \ gnucap/commands/CmdGnuCapTR.hpp base/CmdBase.hpp TypeDefs.hpp \ ngspice/commands/CmdNgSpiceTR.hpp utility/ConvertType.hpp obj/DlgGcpCfgGEN.o: gnucap/dialogs/DlgGcpCfgGEN.cpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp utility/PnlValue.hpp TypeDefs.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp \ utility/ConvertType.hpp gnucap/commands/CmdGnuCapGEN.hpp \ base/CmdBase.hpp netlist/CpntNgsIndSrc.hpp netlist/Component.hpp \ utility/StrUtils.hpp obj/DlgGcpCfgOPT.o: gnucap/dialogs/DlgGcpCfgOPT.cpp \ gnucap/dialogs/DlgGcpCfgOPT.hpp utility/PnlValue.hpp TypeDefs.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp \ utility/ConvertType.hpp gnucap/commands/CmdGnuCapOPT.hpp \ base/CmdBase.hpp ngspice/commands/CmdNgSpiceOPT.hpp obj/PnlGnuCapAC.o: gnucap/panels/PnlGnuCapAC.cpp \ gnucap/panels/PnlGnuCapAC.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnGnuCap.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp obj/PnlGnuCapDC.o: gnucap/panels/PnlGnuCapDC.cpp \ gnucap/panels/PnlGnuCapDC.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnGnuCap.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp obj/PnlGnuCapFO.o: gnucap/panels/PnlGnuCapFO.cpp \ gnucap/panels/PnlGnuCapFO.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnGnuCap.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp obj/PnlGnuCapOP.o: gnucap/panels/PnlGnuCapOP.cpp \ gnucap/panels/PnlGnuCapOP.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnGnuCap.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp obj/PnlGnuCapTR.o: gnucap/panels/PnlGnuCapTR.cpp \ gnucap/panels/PnlGnuCapTR.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnGnuCap.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ gnucap/commands/CmdGnuCapOPT.hpp base/CmdBase.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp gnucap/commands/CmdGnuCapOP.hpp \ ngspice/commands/CmdNgSpiceDC.hpp gnucap/commands/CmdGnuCapDC.hpp \ gnucap/commands/CmdGnuCapAC.hpp ngspice/commands/CmdNgSpiceAC.hpp \ gnucap/commands/CmdGnuCapTR.hpp ngspice/commands/CmdNgSpiceTR.hpp \ gnucap/commands/CmdGnuCapFO.hpp gnucap/commands/CmdGnuCapPR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapGEN.hpp \ netlist/CpntNgsIndSrc.hpp netlist/SimnNgSpice.hpp \ gnucap/dialogs/DlgGcpCfgGEN.hpp obj/CmdNgSpiceAC.o: ngspice/commands/CmdNgSpiceAC.cpp \ ngspice/commands/CmdNgSpiceAC.hpp base/CmdBase.hpp TypeDefs.hpp \ gnucap/commands/CmdGnuCapAC.hpp utility/ConvertType.hpp obj/CmdNgSpiceDC.o: ngspice/commands/CmdNgSpiceDC.cpp \ ngspice/commands/CmdNgSpiceDC.hpp base/CmdBase.hpp TypeDefs.hpp \ gnucap/commands/CmdGnuCapOP.hpp utility/ConvertType.hpp \ gnucap/commands/CmdGnuCapDC.hpp obj/CmdNgSpiceOPT.o: ngspice/commands/CmdNgSpiceOPT.cpp \ ngspice/commands/CmdNgSpiceOPT.hpp base/CmdBase.hpp TypeDefs.hpp \ gnucap/commands/CmdGnuCapOPT.hpp utility/ConvertType.hpp obj/CmdNgSpicePR.o: ngspice/commands/CmdNgSpicePR.cpp \ ngspice/commands/CmdNgSpicePR.hpp base/CmdBase.hpp TypeDefs.hpp \ gnucap/commands/CmdGnuCapPR.hpp netlist/Component.hpp \ utility/ConvertType.hpp utility/StrUtils.hpp netlist/NetList.hpp \ Version.hpp obj/CmdNgSpiceTR.o: ngspice/commands/CmdNgSpiceTR.cpp \ ngspice/commands/CmdNgSpiceTR.hpp base/CmdBase.hpp TypeDefs.hpp \ gnucap/commands/CmdGnuCapTR.hpp utility/ConvertType.hpp obj/DlgNgsCfgOPT.o: ngspice/dialogs/DlgNgsCfgOPT.cpp \ ngspice/dialogs/DlgNgsCfgOPT.hpp utility/PnlValue.hpp TypeDefs.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp \ utility/ConvertType.hpp ngspice/commands/CmdNgSpiceOPT.hpp \ base/CmdBase.hpp gnucap/commands/CmdGnuCapOPT.hpp obj/DlgNgsCfgSrc.o: ngspice/dialogs/DlgNgsCfgSrc.cpp \ ngspice/dialogs/DlgNgsCfgSrc.hpp utility/PnlValue.hpp TypeDefs.hpp \ utility/SpinCtrl.hpp utility/ConvertType.hpp utility/ChoUnits.hpp \ utility/ConvertType.hpp netlist/CpntNgsIndSrc.hpp netlist/Component.hpp \ utility/StrUtils.hpp gnucap/commands/CmdGnuCapGEN.hpp base/CmdBase.hpp obj/PnlNgSpiceAC.o: ngspice/panels/PnlNgSpiceAC.cpp \ ngspice/panels/PnlNgSpiceAC.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnNgSpice.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp base/CmdBase.hpp \ gnucap/commands/CmdGnuCapOPT.hpp ngspice/commands/CmdNgSpiceDC.hpp \ gnucap/commands/CmdGnuCapOP.hpp gnucap/commands/CmdGnuCapDC.hpp \ ngspice/commands/CmdNgSpiceAC.hpp gnucap/commands/CmdGnuCapAC.hpp \ ngspice/commands/CmdNgSpiceTR.hpp gnucap/commands/CmdGnuCapTR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapPR.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapFO.hpp \ gnucap/commands/CmdGnuCapGEN.hpp netlist/CpntNgsIndSrc.hpp obj/PnlNgSpiceDC.o: ngspice/panels/PnlNgSpiceDC.cpp \ ngspice/panels/PnlNgSpiceDC.hpp base/PnlAnaBase.hpp TypeDefs.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnNgSpice.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp base/CmdBase.hpp \ gnucap/commands/CmdGnuCapOPT.hpp ngspice/commands/CmdNgSpiceDC.hpp \ gnucap/commands/CmdGnuCapOP.hpp gnucap/commands/CmdGnuCapDC.hpp \ ngspice/commands/CmdNgSpiceAC.hpp gnucap/commands/CmdGnuCapAC.hpp \ ngspice/commands/CmdNgSpiceTR.hpp gnucap/commands/CmdGnuCapTR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapPR.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapFO.hpp \ gnucap/commands/CmdGnuCapGEN.hpp netlist/CpntNgsIndSrc.hpp obj/PnlNgSpiceTR.o: ngspice/panels/PnlNgSpiceTR.cpp \ ngspice/panels/PnlNgSpiceTR.hpp TypeDefs.hpp base/PnlAnaBase.hpp \ netlist/Component.hpp utility/ConvertType.hpp utility/StrUtils.hpp \ utility/PnlValue.hpp utility/SpinCtrl.hpp utility/ConvertType.hpp \ utility/ChoUnits.hpp netlist/SimnNgSpice.hpp base/SimnBase.hpp \ base/CmdBase.hpp netlist/NetList.hpp Version.hpp \ ngspice/commands/CmdNgSpiceOPT.hpp base/CmdBase.hpp \ gnucap/commands/CmdGnuCapOPT.hpp ngspice/commands/CmdNgSpiceDC.hpp \ gnucap/commands/CmdGnuCapOP.hpp gnucap/commands/CmdGnuCapDC.hpp \ ngspice/commands/CmdNgSpiceAC.hpp gnucap/commands/CmdGnuCapAC.hpp \ ngspice/commands/CmdNgSpiceTR.hpp gnucap/commands/CmdGnuCapTR.hpp \ ngspice/commands/CmdNgSpicePR.hpp gnucap/commands/CmdGnuCapPR.hpp \ netlist/SimnGnuCap.hpp gnucap/commands/CmdGnuCapFO.hpp \ gnucap/commands/CmdGnuCapGEN.hpp netlist/CpntNgsIndSrc.hpp \ ngspice/dialogs/DlgNgsCfgSrc.hpp gspiceui-1.0.00+dfsg/src/TypeDefs.hpp0000644000000000000000000001715111603101736016043 0ustar rootroot//***************************************************************************** // TypeDefs.hpp * // -------------- * // Description : This header file mostly contains enumerated type * // definitions which may be used anywhere in the application. * // Started : 06/09/2007 * // Last Update : 23/06/2011 * // Copyright : (C) 2007 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef TYPEDEFS_HPP #define TYPEDEFS_HPP // System Includes #include // wxWidgets Includes #include #include // External Variables extern bool g_bDebug; //***************************************************************************** // Type definitions typedef unsigned long ulong; typedef unsigned int uint; typedef unsigned char uchar; typedef wxStaticText wxLabel; //***************************************************************************** // Useful #defines #define NOVAL_INT -INT_MAX #define NOVAL_FLT -FLT_MAX //***************************************************************************** // Fonts #define FONT_NORM wxFont( 9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ) #define FONT_BOLD wxFont( 9, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD ) #define FONT_SLANT wxFont( 9, wxFONTFAMILY_SWISS, wxFONTSTYLE_SLANT, wxFONTWEIGHT_LIGHT ) #define FONT_MONO wxFont( 8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ) //***************************************************************************** // Enumerated types // Enumerated type for the various simulator engine types enum eSimrType { eSIMR_GNUCAP, // GNU-Cap eSIMR_NGSPICE, // NG-Spice eSIMR_NONE, // Used if a simulation engine has not yet been selected eSIMR_FST = eSIMR_GNUCAP, eSIMR_LST = eSIMR_NGSPICE }; // Enumerated type for the various waveform viewers types enum eViewType { eVIEW_GWAVE, // GWave eVIEW_GAW, // Gaw eVIEW_NONE, // Used if a waveform viewer has not yet been selected eVIEW_FST = eVIEW_GWAVE, eVIEW_LST = eVIEW_GAW }; // Enumerated type for the various command types which may be performed enum eCmdType { eCMD_OP = 0, // Quiescent operating point analysis eCMD_DC, // DC analysis eCMD_AC, // AC analysis eCMD_TR, // Transient analysis eCMD_FO, // Fourier analysis eCMD_DI, // Distortion analysis eCMD_NO, // Noise analysis eCMD_PZ, // Pole-zero analysis eCMD_SE, // Sensitivity analysis eCMD_TF, // Transfer function analysis eCMD_OPT, // OPTIONS command eCMD_IC, // Initial conditions command eCMD_PR, // PRINT command eCMD_GEN, // GENERATOR command (GNU-Cap only) eCMD_NONE, // Analysis type not set eCMD_FST = eCMD_OP, eCMD_LST = eCMD_GEN, eCMD_ANA_FST = eCMD_OP, eCMD_ANA_LST = eCMD_TF }; // Enumerated type for the various components enum eCpntType { eCPNT_SCJN, // Super-conductor junction eCPNT_CAP, // Capacitor eCPNT_RES, // Resistor eCPNT_ADM, // Admittance eCPNT_IND, // Inductor eCPNT_DIODE, // Diode eCPNT_BJT, // Bipolar Junction Transistor eCPNT_JFET, // Junction Field-Effect Transistor eCPNT_MOS, // Metal-Oxide Semiconductor Field-Effect Transistor eCPNT_VCVS, // Voltage Controlled Voltage Source eCPNT_CCCS, // Current Controlled Current Source eCPNT_VCCS, // Voltage Controlled Current Source eCPNT_CCVS, // Current Controlled Voltage Source eCPNT_CIND, // Coupled (Mutual) Inductors eCPNT_TLINE, // Transmission Line eCPNT_LOGIC, // Logic Device eCPNT_ICS, // Independent Current Source eCPNT_IVS, // Independent Voltage Source eCPNT_CCSW, // Current Controlled Switch eCPNT_VCSW, // Voltage Controlled Switch eCPNT_SUBCKT, // Sub-circuit eCPNT_NONE, // None type selected eCPNT_FST = eCPNT_SCJN, eCPNT_LST = eCPNT_SUBCKT }; // The various variable types supported by this class enum eVarType { eVAR_BIN = 0, // Binary eVAR_OCT, // Octal eVAR_HEX, // Hexadecimal eVAR_INT, // Integer eVAR_FLT, // Floating point eVAR_SCI, // Floating point (scientific notation) eVAR_ENG, // Floating point (engineering notation) eVAR_NONE, // No variable type specified eVAR_FST = eVAR_INT, eVAR_LST = eVAR_ENG }; // Enumerated type for the various types of units enum eUnitsType { eUNITS_CAP, // Capacitance eUNITS_IND, // Inductance eUNITS_RES, // Resistance eUNITS_VOLT, // Voltage eUNITS_CURR, // Current eUNITS_TIME, // Time eUNITS_FREQ, // Frequency eUNITS_PHASE, // Phase eUNITS_TEMP, // Temperature eUNITS_SCLR, // Scalar eUNITS_NONE, // No units specified eUNITS_FST = eUNITS_CAP, eUNITS_LST = eUNITS_SCLR }; // Enumerated type for the various parameters which may be determined by analysis enum eParType { ePAR_VLT = 0, // Node or component voltage ePAR_CUR, // Node or component current ePAR_PWR, // Node or component power ePAR_RES, // Input and output resistance ePAR_NONE, ePAR_FST = ePAR_VLT, ePAR_LST = ePAR_RES }; // Enumerated type for the various sub-parameters which may be determined (AC analysis only) enum eCpxType { eCPX_MAG = 0, // Magnitude of the complex node or component parameter eCPX_PHASE, // Phase of the complex node or component parameter eCPX_REAL, // Real part of the complex node or component parameter eCPX_IMAG, // Imaginary part of the complex node or component parameter eCPX_MAGDB, // Convert the magnitude to dBV eCPX_NONE, eCPX_FST = eCPX_MAG, eCPX_LST = eCPX_MAGDB }; // Enumerated type for the various step scale types enum eScaleType { eSCALE_LIN, eSCALE_LOG, eSCALE_DEC, eSCALE_OCT, eSCALE_NONE, eSCALE_FST = eSCALE_LIN, eSCALE_LST = eSCALE_OCT }; // Enumerated type for the initial conditions for a transient analysis enum eInitCType { eINITC_WARM = 0, // Warm start eINITC_UICS, // Use initial conditions eINITC_COLD, // Cold start eINITC_NONE, eINITC_FST = eINITC_WARM, eINITC_LST = eINITC_COLD }; // Enumerated type for the temporary file management strategy enum eTypeTmpFileMgt { eTFMS_DELETE=0, eTFMS_PROMPT, eTFMS_KEEP, eTFMS_NONE, eTFMS_FST = eTFMS_DELETE, eTFMS_LST = eTFMS_KEEP }; //***************************************************************************** // Declare new array types (which are based on wxWidgets types) WX_DECLARE_OBJARRAY( wxFileName, ArrayFileName ); //***************************************************************************** #endif // TYPEDEFS_HPP gspiceui-1.0.00+dfsg/src/Version.hpp0000644000000000000000000003362411636743026015762 0ustar rootroot//***************************************************************************** // Version.hpp * // ------------- * // Description : Version specifier for the GNU Spice GUI application. * // Started : 15/08/2003 * // Last Update : Refer below * // Copyright : (C) 2003 by MSWaters * // Email : m.waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef VERSION_HPP #define VERSION_HPP #define APP_NAME wxT("gSpiceUI") #define APP_VERSION wxT("1.0.00") #define APP_DATE wxT("23/09/2011") #define APP_COPYRIGHT wxT("Copyright (c) MSWaters 2003") #endif // VERSION_HPP //***************************************************************************** // THINGS TO DO before v1.0.00 : // // (02/09/2011) Look for ???'s in the ChangeLog and resolve them. //***************************************************************************** // THINGS TO TEST before v1.0.00 : // // (12/04/2011) Test GNU-Cap OP analysis. // (12/04/2011) Test GNU-Cap DC analysis. // (12/04/2011) Test GNU-Cap AC analysis. // (12/04/2011) Test GNU-Cap TR analysis. // (12/04/2011) Test GNU-Cap FO analysis. //***************************************************************************** // THINGS TO DO in the "fullness of time" : // // (07/09/2011) Source synchronization isn't quite working in both the NG-Spice // and the GNU-Cap DC analyses. Source synchronization begins with // a page changed event which is first intercepted by // Nbk::OnPageChangd( ) which then allows // NbkSimrBase::OnPageChangd( ) to actually handle the event. // NbkSimrBase::OnPageChangd( ) gets a pointer to a PnlAnaBase // object and changes the source name, however events can only // propagate down from PnlDC to PnlAnaBase but not back // the other way so PnlDC never knows about the event. // PnlDC::OnSrcName( ) is where the sweep units type is // ste so this doesn't happen. // (15/04/2010) Locale stuff still appears to be broken. // (Maybe fixed in v0.9.99; check. Change my locale.) // (05/09/2011) wxWidgets v2.9.2 breaks when changing simulation engines. // (26/08/2011) Still producing "prcbase.log". // (29/06/2011) Do include directives need to be expanded by gnetlist? // Simulation engine could be left to do this. // (26/05/2011) Implement the bSaveSimCmds( ) method in the classes SimnGnuCap // and SimnNgSpice. // (24/05/2011) In the simulation file place simulation commands ahead of // models and sub-circuits. // (11/05/2011) Investigate replacing parts of SpinCtrl with wxSpinCtrl. // (11/05/2011) Change class names containing "Simr" to "SimEng" and "Simn" to // "Sim" eg. NbkSimrBase to NbkSimEngBase and SimnBase to SimBase. // (05/05/2011) Allow the user to set the spin control repeat rate. // (28/04/2011) When a netlist created by gSpiceUI is loaded into the NetList // text control load it into the Simulation text control as well. // If gSpiceUI created the netlist it can be simulated. // (28/04/2011) Now and then a spin control decrements from 1.00 to 0.00, this // should never happen. // (27/04/2011) NG-Spice doesn't like probes where one of two nodes is ground, // eg. ".PRINT TRAN V(Trigger,0)". It complains with the message : // "Warning: can't parse '0': ignored" // (19/04/2011) The way the wxProcess class is used is fault prone. wxProcess // objects should be created dynamically when a process is to run // and deleted soon after the process terminates. PrcBase inherits // from wxProcess, it should contain a pointer to wxProcess object // as an attribute. // (23/03/2011) In the class PrcSimrBase the console spew logging mechanism is // clumsy; PrcSimrBase::bSaveOutput( ) does almost the same thing // as PrcBase::bLogOutput( ). Shouldn't have a results file should // just use the PrcBase log file system. // (02/03/2011) The GNU-Cap OP analysis the "Temp" column header is missing in // the formatted results. Talk to GNU-Cap developer. // (02/03/2011) When a gschem process is exited and the schematic file has // changed automatically do a reload and maybe re-create the // simulation file. // (30/06/2010) Abbreviate most names containing NgSpice and GnuCap to Ngs and // Gcp respectively. // (29/04/2010) Resolve issues compiling the code under OSX. How? // (19/04/2010) In FrmMain::Initialize( ) if the call to m_oFileTsks.Initialize() // causes an error message to be displayed FrmMain is only // partially initialized and it looks broken. // Test Method : // 1. delete the netlist file named in the config. file under // "Files/NetList", // 2. arrange it so that gnetlist can't be found by gspiceui. // (19/04/2010) Create a Web page on sourceforge! // (31/03/2010) At startup the simulation engine specified in a netlist file // should over-rule that stored in the configuration file. // (31/03/2010) If gschem is open and the user presses the Schematic button an // error message is displayed, bring gschem to the foreground // instead. Same probably applies for gwave and Gaw. // (30/03/2010) For all structure objects use the prefix 't' instead of 'o'. // (01/03/2010) Implement Fourier analysis for NG-Spice. // (11/06/2009) The NG-Spice Transient analysis cold initial conditions doesn't // work. Will need to implement the IC command to zero all nodes // voltages. // (11/02/2009) There are 2 types of source which may be used : a sweep source // and a signal source. Ensure that this distinction is clearly // made in the code and the GUI. // (12/12/2008) The function PrcBase::bLogOutput( ) ends early before all // console output is collected. // (24/11/2008) In PnlValue class shouldn't be allowed to change value or units // if a component name hasn't been chosen. // (14/05/2008) PnlValue class can be set to eg. 0.10 psec by the user but not // programmatically, ie. using bSetValue( ). // (19/02/2008) If gspiceui is exited with gschem open, any unsaved changes in // the schematic file are lost. // (25/10/2007) For NG-Spice simulations if R1 and C1 are connected in parallel // and R1 is selected as a test component after a reload operation // both R1 and C1 will be highlighted as test components. // (10/10/2007) Convert NG-Spice phase results from radians to degrees. Refer // to section 10.5 Variables -> "units". The SET command doesn't // seem to work in batch mode. // (10/10/2007) In NG-Spice the variable "numdgt" could be useful for setting // displayed precision. Refer to section 10.5 Variables. // (24/08/2007) If the simulation engine is changed a few times the layout of // the main frame can get corrupted. Maximize then window gspiceui // and things are almost back to normal. Alot less corruption // occurs with wxWidgets v2.8.4. Using wxWidgets v2.8.5 changed // the simulation engine 4 times and got a segmentation fault. // Seems to behave better with wxWidgets v2.8.7, v2.8.9 & v2.8.10 // but still not perfect. // (17/07/2007) The transient analysis IC option isn't loaded correctly from // the simulation file for NG-Spice. // (19/06/2007) In FrmMain the run simulation mechanism is evil. It needs a // major overhaul. The Stop button doesn't work because the app. // stays in the OnSimRun( ) event handler while the simulation // runs so no other events are handled until this is exited. // (07/06/2007) If a current source (as in amperes) is chosen the source setup // dialogs displays units of Volts. // (31/01/2006) While performing a simulation if the gSpiceUI GUI is corrupted // it isn't re-drawn until after the simulation is complete. Need // wxYield( ) statements in appropriate places to allow the GUI to // be updated. //***************************************************************************** // GNU-Cap : // // (22/03/2010) GNU-Cap seems to be broken for JFETs. // (21/08/2009) For GNU-Cap AC analysis where a NPN BJT is used, get an error // message (eg. "open circuit: internal node 2") before each line // of the results. // (21/04/2005) At times the first result line from a DC analysis is clearly // incorrect. // (20/04/2005) In the AC analysis the following source line is not interpreted // correctly: "Vin 2 3 GENERATOR(1) AC 100.00m". The AC magnitude // "100.00m" is not interpreted as "0.1"; replace it with "0.1" // and everything works OK. // (29/03/2004) The PRINT command doesn't produce a label for the independent // parameter ie. temperature or OP, voltage for DC. //***************************************************************************** // NG-Spice : // // (31/03/2010) NG-Spice seems to be broken for JFETs. // (06/10/2009) NUMDGT should set the number digits to print when printing // tables of data. Doesn't work in batch mode. // (11/05/2007) PRINT statement parser is broken. Eg. PRINT TRAN V(0,1) V(0,2) // is interpreted as one parameter -V(1)-V(2) instead of two; in // contrast PRINT TRAN V(1,0) V(2,0) is interpreted correctly. In // addition eg. PRINT AC VDB(0,1) wont run at all. // Notes : The .PRINT statement parsing starts in fixem( char * ) // (src/frontend/dotcards.c) which calls gettoks( char * ) // which calls gettok( char ** ) (../src/misc/string.c). // I think the bug is in gettok( char ** ) or how it is // used by gettoks( char * ). //***************************************************************************** // gNetList : // // (19/07/2005) If a relative model file path specified in schematic file the // path is regarded as relative to the CWD not the schematic file // path which would be more logical. // (12/04/2005) When schem. file imported via command line "gnetlist.log" left // in gspiceui bin directory. When schem. file imported via GUI // "gnetlist.log" left in schematic directory. //***************************************************************************** // gWave : // // (29/03/2004) GWave can't handle the banner that GNU-Cap includes in it's // output. //***************************************************************************** // Gaw : // //***************************************************************************** // wxWidgets Library Bugs : // // (03/09/2009) v2.8.10 : Class wxToolTip seems to be broken ie. can't globally // enable/disable tooltips or set the tooltip delay. // (07/09/2007) v2.8.5 : Cannot set the font in the choice control in the // PnlValue class when no file loaded at startup. It // should inherit the font from it's parent; every other // control does. This seems to be bug in wxWidgets // v2.8.5 and v2.6.3. // (28/05/2007) v2.8.3 : In the class PnlValue class and function DoLayout( ) // wxWidgets ignores the request to vertically align the // StaticText object. // (04/02/2007) v2.8.3 : The class wxFileName has an undocumented function // SetPath( ). // (12/04/2005) v2.5.4 : "make uninstall" does nothing. // (06/04/2005) v2.5.2 : When the wxFrame is resized wxStatusBar isn't. // (01/10/2004) v2.5.2 : No mention of wxControl constructor in documentation. // (18/09/2004) v2.5.2 : In the class wxTextCtrl style setting wxTE_RIGHT is // ignored in Create( ) function. // (13/08/2004) v2.4.2 : In class wxFileDialog styles can only be set in the // constructor. The method SetStyle( ) does nothing. // (21/02/2004) v2.4.2 : In the class wxTextFile function IsOpened( ) returns // TRUE after Open( ) but FALSE after Create( ). // (19/02/2004) v2.4.2 : In the class wxSpinCtrl when using SetValue( (int) 0 ) // for initialization the spin control is left blank. // (17/11/2003) v2.4.1 : In class wxFileDialog wildcards can only be set in // the constructor. The method SetWildcard( ) is not // properly implemented. See constructor in // src/generic/filedlgg.cpp and set method in // include/wx/generic/filedlgg.h. //***************************************************************************** gspiceui-1.0.00+dfsg/src/icons/0000755000000000000000000000000011531451550014717 5ustar rootrootgspiceui-1.0.00+dfsg/src/icons/gspiceui-48x48.xpm0000644000000000000000000000532511412210451020046 0ustar rootroot/* XPM */ static const char *gspiceui[ ] = { "48 48 7 1", "d c #0058c0", "a c #303030", "e c #58a8ff", "b c #808080", "c c #c00000", ". c #c000c0", "# c #c0ffc0", "................................................", ".##############################################.", ".##############################################.", ".##############################################.", ".###########aaaaaaaaaaaaaa#####################.", ".###########a############a#####################.", ".##bab######a############a################bab##.", ".##a#aaaaaaaa############aaaaaaaaaaaaaaaaaa#a##.", ".##bab######a############a########a#######bab##.", ".###########a############a########a############.", ".###########aaaaaaaaaaaaaa########a############.", ".#################################a############.", ".############################aaaaaaaaaaa#######.", ".########c#####################################.", ".########c#####################################.", ".########c###################aaaaaaaaaaa#######.", ".########c########################a############.", ".########c########################a############.", ".########c########################a############.", ".########c####dddd################a############.", ".########c###ddeedd###########aaaaaaaaa########.", ".########c##dd####dd###########################.", ".########c#dde####ede###########aaaaa##########.", ".########cede######dd##########################.", ".########cdd########de############a############.", ".########ed#########dd#########################.", ".########dd#########ed#########################.", ".########de##########de########################.", ".#######dd###########dd########################.", ".#######de############de#######################.", ".######ddc############dd#######################.", ".######dec############ed##############eee######.", ".#####dd#c#############de############ddddd#####.", ".#####de#c#############dd###########ed###de####.", ".####ed##c#############ed###########d####ed####.", ".####dd##c##############de#########dd#####ed###.", ".###edccccccccccccccccccddccccccccedcccccccc###.", ".###ed###c##############ed########dd###########.", ".###d####c###############de######ede###########.", ".########c###############dde#####dd############.", ".########c################dd####ede############.", ".########c################ede##edd#############.", ".########c#################ddeedd##############.", ".########c##################dddd###############.", ".##############################################.", ".##############################################.", ".##############################################.", "................................................" }; gspiceui-1.0.00+dfsg/src/icons/file-save.xpm0000644000000000000000000000567611412210451017325 0ustar rootroot/* XPM */ static const char * filesave_xpm[] = { "22 22 118 2", " c None", ". c #6B6B6B", "+ c #000000", "@ c #C1C1C1", "# c #3F3F3F", "$ c #4A4A4A", "% c #717171", "& c #6D6D6D", "* c #8A8A8A", "= c #5C5C5C", "- c #636363", "; c #505050", "> c #747474", ", c #434343", "' c #565656", ") c #FFFFFF", "! c #DFDFDF", "~ c #464646", "{ c #6C6C6C", "] c #040404", "^ c #E0E0E0", "/ c #616161", "( c #545454", "_ c #9B9B9B", ": c #FEFEFE", "< c #5E5E5E", "[ c #777777", "} c #5B5B5B", "| c #4D4D4D", "1 c #D8E6E6", "2 c #767676", "3 c #C4C4C4", "4 c #151515", "5 c #B3B3B3", "6 c #7B7B7B", "7 c #BABABA", "8 c #494949", "9 c #828282", "0 c #EFF0F0", "a c #F9F9F9", "b c #797979", "c c #060606", "d c #989898", "e c #9A9A9A", "f c #3D3D3D", "g c #FCFCFC", "h c #CBCBCB", "i c #0C0C0C", "j c #919191", "k c #949494", "l c #929292", "m c #7C7C7C", "n c #888888", "o c #787878", "p c #737373", "q c #474747", "r c #757575", "s c #8E8E8E", "t c #909090", "u c #8D8D8D", "v c #8B8B8B", "w c #535353", "x c #BBBBBB", "y c #424242", "z c #848484", "A c #838383", "B c #454545", "C c #3A3A3A", "D c #858585", "E c #585858", "F c #404040", "G c #CACACA", "H c #2F2F2F", "I c #6E6E6E", "J c #EAEAEA", "K c #969696", "L c #4C4C4C", "M c #5F5F5F", "N c #7A7A7A", "O c #707070", "P c #BEBEBE", "Q c #4E4E4E", "R c #6A6A6A", "S c #4F4F4F", "T c #9C9C9C", "U c #F1F1F1", "V c #EFEFEF", "W c #D6D6D6", "X c #444444", "Y c #6F6F6F", "Z c #2B2B2B", "` c #676767", " . c #F4F4F4", ".. c #DADADA", "+. c #E3E3E3", "@. c #EDEDED", "#. c #808080", "$. c #515151", "%. c #3B3B3B", "&. c #656565", "*. c #F2F2F2", "=. c #CECECE", "-. c #C5C5C5", ";. c #BCBCBC", ">. c #818181", ",. c #606060", "'. c #5A5A5A", "). c #010101", "!. c #A7A7A7", "~. c #B8B8B8", "{. c #8C8C8C", "]. c #A8A8A8", "^. c #898989", "/. c #414141", "(. c #555555", "_. c #C9C9C9", ":. c #353535", "<. c #383838", " . + ", " + @ # $ % ", " & * @ = - = # ; > ", " , @ @ ' ) ! = & = # ~ { ", " ] @ ' ^ ) ) ) ) ! = / = # ( > ", " { _ @ # : ) ) ) ) ) ) ) ! = < [ + } ", " | @ @ ' ) ) ) ) ) ) ) ) : 1 ' 2 3 + ", " 4 5 ' ^ ) ) ) ) ) ) ) ) ) ' 6 > 7 8 ", " . 9 5 # 0 ) ) ) ) ) ) ) ) a # b 7 c ", " | d e f { g ) ) ) ) ) ) ) ! ' 2 h f ", " i j k l m ( # n ) ) ) ) ) ' o p 7 q ", " { r * s t u v l > w # * ) ^ # > x + ", " y z A B C ' v n D n z & E F r [ G H ", " c m I o J K ~ L M b 9 N o > O . P Q ", ". R p S T ) U V W A X ~ 2 % Y . 7 ] ", "Z & ` ~ .J ..+.@.^ #.$.%.X = ` h y ", "= + &.# *.W W =.-.;.( D >.%.,.,.x '. ", " . ~ ).~ !.3 ;.~.* ~ m {.w w x + ", " . ~ + ~ ].~ D ^./.(.w _.:. ", " . ~ + ~ K <.w w 7 8 ", " . ~ + ~ (.] ", " . + } "}; gspiceui-1.0.00+dfsg/src/icons/setup.xpm0000644000000000000000000000775511412210451016612 0ustar rootroot/* XPM */ static const char * setup_xpm[ ] = { "24 23 154 2", " c None", ". c #414142", "+ c #606060", "@ c #7D7D7D", "# c #A6A6A6", "$ c #BABABA", "% c #9C9C9C", "& c #6A6A6A", "* c #090808", "= c #FBFBFB", "- c #C6C6C6", "; c #828282", "> c #4D4D4D", ", c #3E3C3E", "' c #676464", ") c #717171", "! c #636362", "~ c #333336", "{ c #A2A2A2", "] c #C0C0C0", "^ c #464647", "/ c #163C3D", "( c #5B8587", "_ c #295151", ": c #797979", "< c #AEAEAE", "[ c #C9C9C9", "} c #878786", "| c #525252", "1 c #323235", "2 c #464648", "3 c #E8F2F2", "4 c #5DADAC", "5 c #939393", "6 c #CFCFCF", "7 c #FFFFFF", "8 c #F6F6F6", "9 c #A6A7AA", "0 c #494B52", "a c #4B4D53", "b c #56A09E", "c c #10393A", "d c #1A3A38", "e c #F1F1F2", "f c #9C9DA0", "g c #3F3F40", "h c #8C7A2C", "i c #655E33", "j c #A9E7E4", "k c #174545", "l c #ADF4F3", "m c #21403F", "n c #808080", "o c #A0A0A0", "p c #A5A6AA", "q c #AC993F", "r c #635920", "s c #54380F", "t c #AAE7E7", "u c #85CAC9", "v c #2D5252", "w c #4FA2A2", "x c #122C2C", "y c #666666", "z c #626262", "A c #535354", "B c #C3AA4D", "C c #D3BF7A", "D c #153B3C", "E c #86D1D0", "F c #6FBCB9", "G c #90DDDA", "H c #9EE5E5", "I c #61ACAD", "J c #194F4F", "K c #757575", "L c #E1E1E1", "M c #CCCCCC", "N c #A7A7A6", "O c #545456", "P c #42434C", "Q c #815B20", "R c #CBAC7A", "S c #886F2D", "T c #81D1D8", "U c #40908F", "V c #225D5D", "W c #1C4C4C", "X c #1F5251", "Y c #041C1D", "Z c #868686", "` c #F7F7F7", " . c #959595", ".. c #4C4C4D", "+. c #B48D59", "@. c #F0E0C8", "#. c #C2A36C", "$. c #53380F", "%. c #20676B", "&. c #050E10", "*. c #838383", "=. c #CACACA", "-. c #646465", ";. c #474749", ">. c #322109", ",. c #B48D5B", "'. c #CCA475", "). c #866E2C", "!. c #656565", "~. c #545455", "{. c #CDAB7F", "]. c #856C2C", "^. c #553910", "/. c #8CDDE2", "(. c #3A6F6E", "_. c #BFA075", ":. c #8DD7DA", "<. c #53A4A7", "[. c #174F51", "}. c #020000", "|. c #BB9F6A", "1. c #7CC5C4", "2. c #459596", "3. c #286A6A", "4. c #010406", "5. c #312008", "6. c #E9CDA8", "7. c #C19F70", "8. c #85D0D0", "9. c #469595", "0. c #225D5E", "a. c #081314", "b. c #EACDA6", "c. c #C7A972", "d. c #2C2F32", "e. c #90D9DC", "f. c #479697", "g. c #286969", "h. c #050E11", "i. c #EDD0AB", "j. c #BA985D", "k. c #243034", "l. c #B6FFFF", "m. c #4D9F9F", "n. c #225F5E", "o. c #061315", "p. c #BF9A60", "q. c #573E16", "r. c #22353A", "s. c #102C2C", "t. c #081619", "u. c #916B34", "v. c #53360B", "w. c #332007", " . . + . ", " . @ # $ % & * ", " . = - ; > , ' ", " ) ! ~ { ] ^ . / ( _ ", " : < [ } | 1 2 / 3 4 / ", " 5 6 7 8 9 0 a / 3 b c / d ", " + [ e f g h i / j k / l m ", " n o p g 7 q r s / t u v / 3 w x ", " + + y ~ z A r B 7 C r s D 3 E F G H I J ", "K L M N O ~ P r C Q R S s T U V W X Y ", "+ Z ` ...~ r +.@.#.S $.%.&. ", " + *.=.-.;. >.,.@.'.).$. ", " !.~ ~. / 3 >.,.@.{.].^. ", " / 3 /.(.>.,.@._.S ^. ", " / 3 :.<.[.}.>.,.@.|.S ^. ", " / 3 1.2.3.4. 5.,.6.7.S ^. ", " / 3 8.9.0.a. 5.,.b.c.S ^. ", " d.3 e.f.g.h. 5.,.i.j.S ^. ", " k.l.m.n.o. >.,.p.q.>. ", " r.s.t. >.u.v.>. ", " w.>. ", " ", " " }; gspiceui-1.0.00+dfsg/src/icons/html-forward.xpm0000644000000000000000000000110611531447742020061 0ustar rootroot/* XPM */ static const char * html_forward_xpm[ ] = { /* columns rows colors chars-per-pixel */ "18 17 3 1", " c black", ". c black", "X c None", /* pixels */ "..XXXXXXXXXXXXXXXX", "....XXXXXXXXXXXXXX", "......XXXXXXXXXXXX", "........XXXXXXXXXX", "..........XXXXXXXX", "............XXXXXX", "..............XXXX", "................XX", "..................", "................XX", "..............XXXX", "............XXXXXX", "..........XXXXXXXX", "........XXXXXXXXXX", "......XXXXXXXXXXXX", "....XXXXXXXXXXXXXX", "..XXXXXXXXXXXXXXXX" }; gspiceui-1.0.00+dfsg/src/icons/sim-plot.xpm0000644000000000000000000000375011412210451017205 0ustar rootroot/* XPM */ static const char * sim_plot_xpm[ ] = { "22 22 79 1", " c None", ". c #000000", "+ c #F0F0F0", "@ c #F3F3F3", "# c #F4F4F4", "$ c #ECECEC", "% c #E8E8E7", "& c #E3E3E3", "* c #DADAD9", "= c #D5D5D4", "- c #D0D0CF", "; c #CBCBCA", "> c #C6C6C5", ", c #C1C1C0", "' c #BCBCBB", ") c #B7B7B5", "! c #F7F7F7", "~ c #F9F9F9", "{ c #EFEFEE", "] c #EAEAE9", "^ c #E5E5E4", "/ c #DBDBDA", "( c #D6D6D5", "_ c #00007F", ": c #C7C7C5", "< c #C2C2C0", "[ c #BDBDBB", "} c #B8B8B6", "| c #FFFFFF", "1 c #EFEFEF", "2 c #EAEAEA", "3 c #E5E5E5", "4 c #D1D1D0", "5 c #CCCCCB", "6 c #E9E9E9", "7 c #E1E1E0", "8 c #D3D3D2", "9 c #CFCFCD", "0 c #CACAC9", "a c #C5C5C4", "b c #BBBBBA", "c c #B6B6B5", "d c #E2E2E1", "e c #DEDEDD", "f c #CDCDCC", "g c #C8C8C7", "h c #C3C3C2", "i c #BFBFBD", "j c #B5B5B3", "k c #DFDFDE", "l c #E0E0DF", "m c #DDDDDC", "n c #D7D7D6", "o c #C4C4C2", "p c #BFBFBE", "q c #BBBBB9", "r c #B2B2B0", "s c #D8D8D7", "t c #CDCDCB", "u c #C9C9C8", "v c #C1C1BF", "w c #B8B8B7", "x c #B4B4B2", "y c #BEBEBC", "z c #BABAB8", "A c #B6B6B4", "B c #B1B1B0", "C c #CBCBC9", "D c #BEBEBD", "E c #B3B3B1", "F c #AFAFAD", "G c #AAAAA8", "H c #B3B3B2", "I c #B0B0AE", "J c #ACACAA", "K c #A8A8A7", "L c #C7C7C6", "M c #C0C0BF", "N c #A9A9A7", " ", " ", " ", " ................. ", " .+@#@+$%&.*=-;>,'). ", " .@!~!@{]^./(__:<[}. ", " .#~|~#123./_45_<[}. ", " .@!~!@{]^./_45_<[}. ", " ._@#@+$%&._=-;>_'). ", " ._{1{$637._890a_bc. ", " .%_2]%3de_(4fghi_j. ", " .._......_......_.. ", " .k_llkm*n_-5gopq_r. ", " .*/_/*s(_.tuav[wx_. ", " .=(_(=84_.ua.vyq)HIJK. ", " .>:L:__h,.[z)HIJKK. ", " .,<<<,Mi[.wAEIJNKK. ", " ................. ", " ", " " }; gspiceui-1.0.00+dfsg/src/icons/file-saveas.xpm0000644000000000000000000000642111412210451017636 0ustar rootroot/* XPM */ static const char * file_saveas_xpm[] = { "22 22 139 2", " c None", ". c #FDD7A6", "+ c #E08F4D", "@ c #9A6234", "# c #6B6B6B", "$ c #000000", "% c #FD8504", "& c #F6E0AB", "* c #C1C1C1", "= c #3F3F3F", "- c #4A4A4A", "; c #717171", "> c #DD6F04", ", c #B6B6B6", "' c #5A5A5A", ") c #636363", "! c #5C5C5C", "~ c #505050", "{ c #747474", "] c #F1F1F1", "^ c #DCDCDC", "/ c #6D6D6D", "( c #464646", "_ c #6C6C6C", ": c #E6E6E6", "< c #FCFCFC", "[ c #FFFFFF", "} c #DFDFDF", "| c #616161", "1 c #545454", "2 c #DE6935", "3 c #F9BEA1", "4 c #E1A183", "5 c #5E5E5E", "6 c #777777", "7 c #5B5B5B", "8 c #363636", "9 c #D06517", "0 c #C37B5A", "a c #FEFEFE", "b c #D8E6E6", "c c #565656", "d c #767676", "e c #C4C4C4", "f c #131313", "g c #9F9F9F", "h c #3D3D3D", "i c #454038", "j c #774F34", "k c #945935", "l c #7B7B7B", "m c #BABABA", "n c #494949", "o c #828282", "p c #B1B1B1", "q c #3B3B3B", "r c #D4D5D5", "s c #ABABAB", "t c #AAAAAA", "u c #ADADAD", "v c #C3C3C3", "w c #F4F4F4", "x c #F9F9F9", "y c #797979", "z c #060606", "A c #4D4D4D", "B c #989898", "C c #9A9A9A", "D c #EEEEEE", "E c #EFEFEF", "F c #CBCBCB", "G c #0C0C0C", "H c #919191", "I c #949494", "J c #929292", "K c #7C7C7C", "L c #888888", "M c #787878", "N c #737373", "O c #757575", "P c #8A8A8A", "Q c #8E8E8E", "R c #909090", "S c #8D8D8D", "T c #8B8B8B", "U c #535353", "V c #E0E0E0", "W c #BBBBBB", "X c #424242", "Y c #848484", "Z c #838383", "` c #454545", " . c #3A3A3A", ".. c #858585", "+. c #585858", "@. c #404040", "#. c #CACACA", "$. c #2F2F2F", "%. c #6E6E6E", "&. c #EAEAEA", "*. c #969696", "=. c #4C4C4C", "-. c #5F5F5F", ";. c #7A7A7A", ">. c #707070", ",. c #BEBEBE", "'. c #4E4E4E", "). c #6A6A6A", "!. c #4F4F4F", "~. c #9C9C9C", "{. c #D6D6D6", "]. c #444444", "^. c #6F6F6F", "/. c #040404", "(. c #2B2B2B", "_. c #676767", ":. c #DADADA", "<. c #E3E3E3", "[. c #EDEDED", "}. c #808080", "|. c #515151", "1. c #656565", "2. c #F2F2F2", "3. c #CECECE", "4. c #C5C5C5", "5. c #BCBCBC", "6. c #818181", "7. c #606060", "8. c #010101", "9. c #A7A7A7", "0. c #B8B8B8", "a. c #8C8C8C", "b. c #A8A8A8", "c. c #898989", "d. c #414141", "e. c #555555", "f. c #C9C9C9", "g. c #353535", "h. c #383838", ". + @ # $ ", "% & . + @ $ * = - ; ", "> % % & . + @ , ' ) ! = ~ { ", "$ > > % % & . + @ ] ^ ! / ! = ( _ ", " $ $ > > % % & . + : < [ } ! | ! = 1 { ", " $ $ > > % 2 3 4 : < [ [ [ } ! 5 6 $ 7 ", " 8 $ $ 9 0 0 4 4 : < [ [ a b c d e $ ", " f g h $ i j j k $ : < [ [ c l { m n ", " # o p q r , s t t u v w [ x = y m z ", " A B C h # D E D D D ] < [ } c d F h ", " G H I J K 1 = L [ [ [ [ [ c M N m - ", " _ O P Q R S T J { U = P [ V = { W $ ", " X Y Z ` .c T L ..L Y / +.@.O 6 #.$. ", " z K %.M &.*.( =.-.y o ;.M { >.# ,.'. ", " # ).N !.~.[ ] E {.Z ].( d ; ^.# m /. ", " (./ _.( w &.:.<.[.V }.|.q ].! _.F X ", " ! $ 1.= 2.{.{.3.4.5.1 ..6.q 7.7.W ' ", " # ( 8.( 9.e 5.0.P ( K a.U U W $ ", " # ( $ ( b.( ..c.d.e.U f.g. ", " # ( $ ( *.h.U U m n ", " # ( $ ( e./. ", " # $ 7 "}; gspiceui-1.0.00+dfsg/src/icons/sim-stop.xpm0000644000000000000000000000366711412210451017223 0ustar rootroot/* XPM */ static const char * sim_stop_xpm[ ] = { "24 24 70 1", " c None", ". c #630000", "+ c #660000", "@ c #6A0100", "# c #E45447", "$ c #DB4B3E", "% c #D44438", "& c #D9493D", "* c #E05043", "= c #E55548", "- c #EA5A4D", "; c #DE4E41", "> c #CD2000", ", c #BB1900", "' c #380202", ") c #360600", "! c #C01A00", "~ c #DB2700", "{ c #CE2000", "] c #C11B00", "^ c #B41500", "/ c #FFFFFF", "( c #DB2600", "_ c #CE2100", ": c #845A5A", "< c #D52400", "[ c #C21C00", "} c #CF2100", "| c #BC1800", "1 c #B81700", "2 c #C71D00", "3 c #CB1F00", "4 c #C91F00", "5 c #AD1300", "6 c #B31500", "7 c #BC1900", "8 c #C51D00", "9 c #C31C00", "0 c #A40E00", "a c #AF1300", "b c #BA1800", "c c #BD1A00", "d c #B01400", "e c #B41600", "f c #B71700", "g c #AC1200", "h c #B11400", "i c #A81000", "j c #A91000", "k c #AB1200", "l c #A40F00", "m c #A71000", "n c #A50F00", "o c #A00D00", "p c #A10D00", "q c #9F0D00", "r c #9C0B00", "s c #9D0C00", "t c #990A00", "u c #DB5341", "v c #940700", "w c #930700", "x c #8D0500", "y c #8F0600", "z c #870200", "A c #8B0300", "B c #650000", "C c #820100", "D c #840100", "E c #810000", " ", " .+@@+.. ", " ..#$%&*=-.. ", " .#;>,')!>~#-. ", " .#{]^'//'^]{(-. ", " .-_,''://:'',_~~. ", " .-<['//://://'[<<<. ", " .-}|'//://://'1223. ", " .-441'//://://'56678. ", " .-99^'//://://'0''ab. ", " .-ccd'//://://''//'e. ", " .-ffg'//:::://'///'h. ", " .-hhi'/:////:////'ja. ", " .-kkl'///////////'mk. ", " .-nno'////://///'p0n. ", " .-qr'///://////'sq. ", " .-tt'///://///'ttt. ", " .uv'///:////'vww. ", " .xy'//////'yxx. ", " .zA''''''Azz. ", " .BCDDDDCE.. ", " ....... ", " ", " " }; gspiceui-1.0.00+dfsg/src/icons/sim-create.xpm0000644000000000000000000001234011412210451017465 0ustar rootroot/* XPM */ static const char * sim_create_xpm[ ] = { "22 22 232 2", " c None", ". c #8F7F6E", "+ c #8B7C6B", "@ c #887969", "# c #857666", "$ c #817364", "% c #7E7062", "& c #7B6D5F", "* c #776B5D", "= c #74685A", "- c #8A7B6A", "; c #FFFFFF", "> c #73675A", ", c #898989", "' c #6A6054", ") c #867767", "! c #6F6357", "~ c #C9C9C9", "{ c #827464", "] c #828282", "^ c #C6C6C6", "/ c #5D544A", "( c #7E7061", "_ c #665C51", ": c #63594E", "< c #60564C", "[ c #5C5449", "} c #595147", "| c #494214", "1 c #796C5E", "2 c #5C5B5B", "3 c #FEFCFB", "4 c #A4A4A4", "5 c #747474", "6 c #554D44", "7 c #FEF9D9", "8 c #FEF9D4", "9 c #75695B", "0 c #CC0606", "a c #FDFBF9", "b c #FCF7F3", "c c #FAF4EE", "d c #F0EAE6", "e c #C1BAB3", "f c #504941", "g c #FEFBE4", "h c #FEFADF", "i c #FEF9DA", "j c #FEF9D5", "k c #FEF8CF", "l c #716558", "m c #5A5552", "n c #7E7873", "o c #9F958D", "p c #7D746E", "q c #D8D0C8", "r c #4C463E", "s c #FEFCEF", "t c #FEFBEA", "u c #FEFBE5", "v c #FEFAE0", "w c #FBF5F0", "x c #F9F1EA", "y c #F8EEE5", "z c #F7EADF", "A c #F5E7DA", "B c #D6CABF", "C c #48423B", "D c #FEFDFB", "E c #FEFDF5", "F c #FEFCF0", "G c #FEFBEB", "H c #FEFBE6", "I c #FEFADC", "J c #FEF9D6", "K c #FEF8D1", "L c #685E52", "M c #807C79", "N c #5A5653", "O c #C0B5AC", "P c #998778", "Q c #7B6F65", "R c #7A6D62", "S c #D3C3B4", "T c #443F38", "U c #F8EEC3", "V c #F7EBC0", "W c #FEFCF1", "X c #FEFCEC", "Y c #FEFAE2", "Z c #FEF9D7", "` c #FEF8D2", " . c #645A4F", ".. c #FAF2EC", "+. c #F9EFE7", "@. c #F7EBE1", "#. c #F6E8DC", "$. c #F4E4D6", "%. c #F3E0D0", "&. c #F2DDCB", "*. c #D1BCAA", "=. c #3F3B35", "-. c #F6EABD", ";. c #F4E8B9", ">. c #F2E6B5", ",. c #F0E4B1", "'. c #FEFADD", "). c #FEF9D8", "!. c #FEF8D3", "~. c #60574C", "{. c #7F7A76", "]. c #595551", "^. c #7B6F64", "/. c #564C45", "(. c #786A5C", "_. c #CEB6A0", ":. c #3B3732", "<. c #F3E7B7", "[. c #F1E4B3", "}. c #EFE2AF", "|. c #EEE0AB", "1. c #ECDEA7", "2. c #FEFADE", "3. c #C3AE59", "4. c #5C5349", "5. c #F8EDE3", "6. c #F6E9DD", "7. c #F5E5D8", "8. c #F3E2D2", "9. c #F2DECD", "0. c #F1DAC7", "a. c #EFD7C2", "b. c #EED3BC", "c. c #CCAF97", "d. c #37342F", "e. c #F0E3B1", "f. c #EEE1AD", "g. c #EDDFA9", "h. c #EBDDA5", "i. c #E9DAA1", "j. c #E7D89D", "k. c #E6D699", "l. c #C6B05B", "m. c #BCA954", "n. c #574F46", "o. c #D7CCC1", "p. c #D5C7BA", "q. c #D3C2B3", "r. c #D1BEAC", "s. c #CFB9A5", "t. c #CEB49F", "u. c #CCB097", "v. c #CAAB90", "w. c #C9A88C", "x. c #33302C", "y. c #EDE0AA", "z. c #ECDEA6", "A. c #EADBA2", "B. c #E8D99E", "C. c #E6D79A", "D. c #E5D596", "E. c #E3D392", "F. c #BFAB56", "G. c #B6A34F", "H. c #534C43", "I. c #504940", "J. c #49433C", "K. c #464039", "L. c #423E37", "M. c #3F3B34", "N. c #3C3832", "O. c #383530", "P. c #35322D", "Q. c #322F2B", "R. c #2F2D29", "S. c #EBDCA4", "T. c #E9DAA0", "U. c #E7D89C", "V. c #E5D698", "W. c #E4D494", "X. c #E2D190", "Y. c #E0CF8C", "Z. c #B9A551", "`. c #AF9D4A", " + c #A69643", ".+ c #9D8E3C", "++ c #948636", "@+ c #8B7E2F", "#+ c #827628", "$+ c #E4D596", "%+ c #E2D292", "&+ c #E1D08E", "*+ c #DFCE8A", "=+ c #DDCC86", "-+ c #B2A04C", ";+ c #A99845", ">+ c #A0903E", ",+ c #978837", "'+ c #8E8031", ")+ c #85782A", "!+ c #7C7123", "~+ c #E5D598", "{+ c #E3D394", "]+ c #E1D190", "^+ c #DECD88", "/+ c #DCCB84", "(+ c #DAC880", "_+ c #AC9A47", ":+ c #A29240", "<+ c #998A39", "[+ c #908333", "}+ c #877B2C", "|+ c #7E7325", "1+ c #756B1E", "2+ c #DFCE89", "3+ c #DDCC85", "4+ c #DBC981", "5+ c #D9C77D", "6+ c #D8C579", "7+ c #A59442", "8+ c #9C8D3B", "9+ c #938535", "0+ c #8A7D2E", "a+ c #817527", "b+ c #D8C67B", "c+ c #D7C477", "d+ c #D5C273", "e+ c #9F8F3D", "f+ c #968737", "g+ c #8C7F30", "h+ c #D2BE6D", "i+ c #988938", " . + @ # $ % & * = ", " - ; ; ; ; ; ; > , ' ", " ) ; ; ; ; ; ; ! ; ~ ' ", " { ; ] ~ ] ^ ; ' ~ ; , / ", " ( ; ; ; ; ; ; _ : < [ } ", " | | 1 ; ] 2 ~ ] ~ 3 ^ 4 5 6 ", " | | 7 8 | 9 ; 0 ; ; ; a b c d e f ", " | | g h i j k l ; 0 0 ^ ] m n o p q r ", " | | s t u v 0 0 0 0 0 0 0 0 w x y z A B C ", "| D E F G H 0 I J K L ; 0 0 M N O P Q R S T ", "| U V W X 0 Y I Z ` .; 0 ..+.@.#.$.%.&.*.=.", "| -.;.>.,.0 Y '.).!.~.; {.].O P ^./.P (._.:.", "| <.[.}.|.1.0 2.7 3.4.; 5.6.7.8.9.0.a.b.c.d.", "| e.f.g.h.i.j.k.l.m.n.q o.p.q.r.s.t.u.v.w.x.", "| y.z.A.B.C.D.E.F.G.H.I.r J.K.L.M.N.O.P.Q.R.", "| S.T.U.V.W.X.Y.Z.`. +.+++@+#+| ", "| B.C.$+%+&+*+=+-+;+>+,+'+)+!+| ", "| ~+{+]+Y.^+/+(+_+:+<+[+}+|+1+| ", " | | 2+3+4+5+6+7+8+9+0+a+| | ", " | | b+c+d+e+f+g+| | ", " | | h+i+| | ", " | | " }; gspiceui-1.0.00+dfsg/src/icons/html-back.xpm0000644000000000000000000000110311412210451017271 0ustar rootroot/* XPM */ static const char * html_back_xpm[ ] = { /* columns rows colors chars-per-pixel */ "18 17 3 1", " c black", ". c black", "X c None", /* pixels */ "XXXXXXXXXXXXXXXX..", "XXXXXXXXXXXXXX....", "XXXXXXXXXXXX......", "XXXXXXXXXX........", "XXXXXXXX..........", "XXXXXX............", "XXXX..............", "XX................", "..................", "XX................", "XXXX..............", "XXXXXX............", "XXXXXXXX..........", "XXXXXXXXXX........", "XXXXXXXXXXXX......", "XXXXXXXXXXXXXX....", "XXXXXXXXXXXXXXXX.." }; gspiceui-1.0.00+dfsg/src/icons/file-open.xpm0000644000000000000000000001167511412210451017324 0ustar rootroot/* XPM */ static const char * file_open_xpm[ ] = { "24 24 205 2", " c None", ". c #000000", "+ c #26190E", "@ c #271C11", "# c #271A0F", "$ c #3B2714", "% c #F4AD6A", "& c #FEC280", "* c #FEC27F", "= c #FDB773", "- c #E5A566", "; c #FECB93", "> c #FED39A", ", c #FECE93", "' c #FEC88B", ") c #F6B675", "! c #150F09", "~ c #FEC385", "{ c #FED59C", "] c #FECE92", "^ c #FCB269", "/ c #F9AC62", "( c #F8AC62", "_ c #3D2815", ": c #FEC888", "< c #FED199", "[ c #FEC282", "} c #EEA059", "| c #80532C", "1 c #4B3119", "2 c #4A3019", "3 c #452C17", "4 c #402915", "5 c #3C2714", "6 c #372312", "7 c #322011", "8 c #2E1D0F", "9 c #291A0E", "0 c #25170C", "a c #46301B", "b c #FECA8F", "c c #FDB56E", "d c #A86F3C", "e c #53504D", "f c #FFFFFF", "g c #F7F7F7", "h c #F5F5F5", "i c #F1F1F1", "j c #EAEAEA", "k c #E3E3E3", "l c #DDDDDC", "m c #D6D6D5", "n c #D0D0CE", "o c #C8C8C7", "p c #C2C2C1", "q c #BBBBBA", "r c #B4B4B3", "s c #AFAFAF", "t c #AEAEAE", "u c #343434", "v c #563D25", "w c #FEC685", "x c #FEC182", "y c #F2A55C", "z c #E7E7E7", "A c #E4E4E4", "B c #E1E1E1", "C c #D9D9D8", "D c #D1D1D0", "E c #C7C7C6", "F c #C0C0BF", "G c #B8B8B7", "H c #B0B0AF", "I c #A7A7A6", "J c #9E9E9D", "K c #959595", "L c #8B8B89", "M c #818180", "N c #5E5E5D", "O c #191919", "P c #5F452A", "Q c #FEC283", "R c #FBB269", "S c #C38954", "T c #58534E", "U c #F2F2F2", "V c #E2E2E1", "W c #EAEAE9", "X c #EBEBEA", "Y c #DDDDDB", "Z c #D3D3D1", "` c #CACAC9", " . c #C1C1C0", ".. c #AFAFAD", "+. c #A5A5A3", "@. c #9B9B9A", "#. c #8E8E8D", "$. c #7B7B79", "%. c #363635", "&. c #785A3A", "*. c #FEB972", "=. c #EA9E58", "-. c #6F4F2F", ";. c #8F8E8C", ">. c #D4D4D3", ",. c #E1E1E0", "'. c #E9E9E8", "). c #E7E7E6", "!. c #E5E5E3", "~. c #DEDEDD", "{. c #D5D5D4", "]. c #CDCDCC", "^. c #C4C4C2", "/. c #BABAB9", "(. c #B1B1B0", "_. c #9E9E9C", ":. c #8C8C8B", "<. c #6D6D6C", "[. c #694D31", "}. c #FEB469", "|. c #BE8550", "1. c #5D564F", "2. c #E4E4E3", "3. c #E0E0DF", "4. c #E5E5E4", "5. c #D8D8D6", "6. c #CFCFCE", "7. c #C0C0BE", "8. c #B7B7B6", "9. c #AEAEAD", "0. c #A4A4A3", "a. c #979796", "b. c #282827", "c. c #594027", "d. c #F3A45B", "e. c #684A2D", "f. c #888888", "g. c #DCDCDB", "h. c #D0D0CF", "i. c #C9C9C8", "j. c #B9B9B8", "k. c #B2B2B1", "l. c #A9A9A8", "m. c #A0A09E", "n. c #90908F", "o. c #5E5E5C", "p. c #151514", "q. c #46301A", "r. c #B57740", "s. c #55504C", "t. c #CACACA", "u. c #D2D2D1", "v. c #CDCDCB", "w. c #B3B3B2", "x. c #ACACAB", "y. c #A3A3A2", "z. c #9A9A98", "A. c #818181", "B. c #442C17", "C. c #919191", "D. c #BDBDBB", "E. c #C3C3C1", "F. c #C7C7C5", "G. c #C8C8C6", "H. c #C6C6C5", "I. c #C3C3C2", "J. c #BFBFBE", "K. c #B9B9B7", "L. c #A5A5A4", "M. c #9D9D9B", "N. c #8D8D8C", "O. c #676766", "P. c #0B0704", "Q. c #6D6864", "R. c #ADADAC", "S. c #B6B6B5", "T. c #A9A9A7", "U. c #A2A2A1", "V. c #9D9D9C", "W. c #919190", "X. c #7F7F7E", "Y. c #2C2C2B", "Z. c #171716", "`. c #9A9A9A", " + c #999998", ".+ c #9C9C9B", "++ c #9F9F9D", "@+ c #9A9A99", "#+ c #939393", "$+ c #8B8B8A", "%+ c #8A8A88", "&+ c #7D7D7C", "*+ c #5A5A58", "=+ c #141413", "-+ c #131313", ";+ c #323232", ">+ c #2B2B2B", ",+ c #2D2D2C", "'+ c #2D2D2D", ")+ c #2A2A2A", "!+ c #282828", "~+ c #272727", "{+ c #262625", "]+ c #252524", "^+ c #101010", " ", " . . . . . ", " . . . . . . . . . . ", " . . . . . . ", " . . . . ", " . . . . ", " + @ @ # ", " $ % & * = $ ", " $ - ; > , ' ) $ ! ! ! ! ! ! ! ! ", " $ ~ { ] & ^ / ( ( ( ( ( ( ( ( ( $ ", " _ : < [ } | 1 2 2 2 3 4 5 6 7 8 9 0 . . . . ", " a : b c d e f g h i j k l m n o p q r s t u ", " v w x y 2 o z A B C D E F G H I J K L M N O ", " P Q R S T U V W X k Y Z ` .G ..+.@.#.$.%. ", "$ &.*.=.-.;.>.,.'.).!.~.{.].^./.(.I _.:.<.. ", " [.}.|.1.2.{.3.4.V l 5.6.o 7.8.9.0.a.M b. ", " c.d.e.f.` >.l g.C {.h.i.p j.k.l.m.n.o.p. ", " q.r.s.l t.6.>.u.h.v.o .q w.x.y.z.A.%.. ", " $ B.C.8.D.E.F.G.H.I.J.K.w.x.L.M.N.O.. ", " P.Q.o R.w.S.K.q /.S.w.9.T.U.V.W.X.Y. ", " Z.C.`. +.+++++++M.@+a.#+n.$+%+&+*+=+ ", " -+;+>+Y.,+'+'+'+,+Y.>+)+!+~+{+]+^+ ", " ", " " }; gspiceui-1.0.00+dfsg/src/icons/sim-edit.xpm0000644000000000000000000000157511412210451017157 0ustar rootroot/* XPM */ static const char * sim_edit_xpm[ ] = { "24 24 5 1", " c None", ". c #00008B8B0000", "X c #000050500000", "o c #000000000000", "O c #757573737373", " ", " ", " ", " ", " ", " ", " ", " ........ ", " X. . ", " ooooo. . ", " OOOOOX. . ", " X. .ooooo ", " X. .OOOO ", " ooooo. . ", " OOOOOX. .X ", " X........X ", " XXXXXXXXX ", " ", " ", " ", " ", " ", " ", " " }; gspiceui-1.0.00+dfsg/src/icons/sim-run.xpm0000644000000000000000000001134511412210451017032 0ustar rootroot/* XPM */ static const char * sim_run_xpm[ ] = { "22 22 204 2", " c None", ". c #0C0C0A", "+ c #242421", "@ c #DCDEDC", "# c #DCDDDC", "$ c #242321", "% c #000000", "& c #171715", "* c #393837", "= c #F3F3F6", "- c #F2F3F8", "; c #383736", "> c #191918", ", c #B4B4B4", "' c #DFDEE7", ") c #3A3831", "! c #B5B7B6", "~ c #C5C9C9", "{ c #C6C8C9", "] c #B9BBB7", "^ c #F3F4F8", "/ c #BEBFBE", "( c #11100E", "_ c #D5D3D1", ": c #CACED2", "< c #9A9A94", "[ c #8C826B", "} c #8E7A57", "| c #8D7A56", "1 c #8F846F", "2 c #9E9E98", "3 c #DADEE1", "4 c #E0E0DE", "5 c #E6E8EE", "6 c #D2D3D2", "7 c #0C0B09", "8 c #403F37", "9 c #C7C7C2", "0 c #A9ACAE", "a c #6C5F47", "b c #BB883C", "c c #E1A647", "d c #E7AD50", "e c #EAB052", "f c #E3AB4B", "g c #B98C43", "h c #695F46", "i c #B9BCBE", "j c #D1D1CD", "k c #2B2A29", "l c #BFC2CA", "m c #7A6B50", "n c #E2A348", "o c #E5A44A", "p c #E6AD53", "q c #ECB65A", "r c #F0BA64", "s c #EBB96C", "t c #F9C57C", "u c #E6AF61", "v c #7E6E52", "w c #D5D8DF", "x c #2C2B29", "y c #20201E", "z c #B0B1AF", "A c #847152", "B c #C79742", "C c #E1A650", "D c #E6AF5B", "E c #A5824E", "F c #A78552", "G c #F2C488", "H c #F8D09F", "I c #FFD49C", "J c #CE9B53", "K c #C4C6C6", "L c #21201F", "M c #161612", "N c #C5C5C4", "O c #FDFEFF", "P c #D9D7D5", "Q c #C0C2C5", "R c #A89A84", "S c #DBA343", "T c #D8A348", "U c #EEB35C", "V c #7E5E2F", "W c #110E0A", "X c #100B02", "Y c #927148", "Z c #FFE4B1", "` c #FBD8A8", " . c #F2C084", ".. c #A29884", "+. c #D7DAD9", "@. c #DFDFDC", "#. c #FFFFFF", "$. c #D2D3D6", "%. c #11110D", "&. c #979592", "*. c #D5D4D6", "=. c #BFBDB8", "-. c #B9BBBE", ";. c #BFAF94", ">. c #D79D43", ",. c #DAA34D", "'. c #EEB660", "). c #544025", "!. c #FFEBB5", "~. c #FCE1AE", "{. c #F5CC96", "]. c #C2B5A1", "^. c #D3D4D0", "/. c #C1C0BB", "(. c #DADAD8", "_. c #9E9D9C", ":. c #191814", "<. c #9B9C99", "[. c #D9CAB4", "}. c #D79F48", "|. c #E5AC54", "1. c #ECB972", "2. c #FFD59A", "3. c #FFFABF", "4. c #FBF1BD", "5. c #FFECB7", "6. c #E8C591", "7. c #E7DDD2", "8. c #B8B8B4", "9. c #181712", "0. c #080705", "a. c #58554C", "b. c #BEBBB5", "c. c #F2E5D5", "d. c #DFA448", "e. c #ECB870", "f. c #FAD0A2", "g. c #FFF1BC", "h. c #FEF7C1", "i. c #FCF4BF", "j. c #FFF6BE", "k. c #F1D39E", "l. c #E1D3C1", "m. c #F1F3F1", "n. c #060603", "o. c #86847B", "p. c #BBBEBD", "q. c #E9B771", "r. c #EEBA79", "s. c #F5CC99", "t. c #F8D9A4", "u. c #FADEA8", "v. c #FAD8A6", "w. c #E9EBE6", "x. c #9F9D91", "y. c #E9E7E3", "z. c #BFBEBB", "A. c #807C74", "B. c #AEB0B0", "C. c #E4DFDC", "D. c #F8EDE1", "E. c #FEEDD0", "F. c #FFEBC6", "G. c #FDF3E0", "H. c #FFFDF3", "I. c #D4D5D2", "J. c #9D9A8F", "K. c #D9D9D5", "L. c #FBFBFB", "M. c #090807", "N. c #BDBBB5", "O. c #E2E1DD", "P. c #CECCC7", "Q. c #616058", "R. c #6D6C65", "S. c #9C9E9B", "T. c #B1B4B1", "U. c #B2B5B1", "V. c #A3A49D", "W. c #76756D", "X. c #E7E6E7", "Y. c #F8FAFE", "Z. c #CFD1CF", "`. c #080805", " + c #9C9A90", ".+ c #1E1D18", "++ c #201E17", "@+ c #92918E", "#+ c #D0CECB", "$+ c #1B1A12", "%+ c #1C1B16", "&+ c #A8A7A2", "*+ c #282721", "=+ c #3F3C33", "-+ c #F8F7F8", ";+ c #27261F", ">+ c #2D2C28", ",+ c #BFBEB6", "'+ c #C2C0BB", ")+ c #2E2D2A", "!+ c #0F0E0D", "~+ c #0E0E0B", "{+ c #040403", "]+ c #050403", " ", " . . ", " + @ # $ ", " % & * = - ; > % ", " % , ' % ) ) ! ~ { ] ) ) % ^ / % ", " ( ' ' _ : < [ } | 1 2 3 4 5 6 7 ", " 8 9 0 a b c d e f g h i j ) ", " k l m n o p q r s t u v w x ", " y ) ) z A B o C D E F G H I J A K ) ) L ", "M N O P Q R S T U V W X Y Z ` ...+.@.#.$.% ", "%.&.*.=.-.;.>.,.'.). ).!.~.{.].^./.(._.% ", " :.% ) <.[.}.|.1.2.).).3.4.5.6.7.8.) % 9. ", " 0.a.b.c.d.e.f.g.h.i.j.k.l.m.a.n. ", " % o.p.c.q.r.s.t.u.v.c.w.x.% ", " % y.z.A.B.C.D.E.F.G.H.I.J.K.L.% ", " M.N.O.P.Q.) R.S.T.U.V.W.) Q.X.Y.Z.`. ", " % Q. +a..+) ++@+#+#+@+$+) %+a.&+Q.% ", " % *+) =+-+#.=+ ) ;+% ", " >+,+'+)+ ", " !+a.a.~+ ", " {+]+ ", " " }; gspiceui-1.0.00+dfsg/src/icons/file-import.xpm0000644000000000000000000001136111412210451017665 0ustar rootroot/* XPM */ static const char * file_import_xpm[] = { "24 24 221 2", " c None", ". c #000000", "+ c #26190E", "@ c #271C11", "# c #271A0F", "$ c #3B2714", "% c #F4AD6A", "& c #FEC280", "* c #FEC27F", "= c #FDB773", "- c #E5A566", "; c #FECB93", "> c #FED39A", ", c #FECE93", "' c #FEC88B", ") c #F6B675", "! c #150F09", "~ c #FEC385", "{ c #FED59C", "] c #FECE92", "^ c #FCB269", "/ c #F9AC62", "( c #F8AC62", "_ c #3D2815", ": c #FEC888", "< c #FED199", "[ c #FEC282", "} c #EEA059", "| c #80532C", "1 c #4B3119", "2 c #4A3019", "3 c #452C17", "4 c #402915", "5 c #3C2714", "6 c #372312", "7 c #322011", "8 c #2E1D0F", "9 c #291A0E", "0 c #25170C", "a c #46301B", "b c #FECA8F", "c c #FDB56E", "d c #A86F3C", "e c #53504D", "f c #FFFFFF", "g c #F7F7F7", "h c #F5F5F5", "i c #F1F1F1", "j c #EAEAEA", "k c #E3E3E3", "l c #DDDDDC", "m c #D6D6D5", "n c #D0D0CE", "o c #C8C8C7", "p c #C2C2C1", "q c #BBBBBA", "r c #B4B4B3", "s c #AFAFAF", "t c #AEAEAE", "u c #343434", "v c #563D25", "w c #FEC685", "x c #FEC182", "y c #F2A55C", "z c #E7E7E7", "A c #E4E4E4", "B c #E1E1E1", "C c #D9D9D8", "D c #D1D1D0", "E c #C7C7C6", "F c #A7A7A7", "G c #898989", "H c #B0B0AF", "I c #929291", "J c #3E3E3E", "K c #2B2B2B", "L c #797977", "M c #818180", "N c #464645", "O c #151515", "P c #5F452A", "Q c #FEC283", "R c #FBB269", "S c #C38954", "T c #58534E", "U c #F2F2F2", "V c #E2E2E1", "W c #EAEAE9", "X c #EBEBEA", "Y c #DDDDDB", "Z c #B8B8B6", "` c #606060", " . c #838383", ".. c #5C5C5B", "+. c #ECECEC", "@. c #4C4C4C", "#. c #232323", "$. c #3D3D3C", "%. c #7A7A7A", "&. c #212121", "*. c #785A3A", "=. c #FEB972", "-. c #EA9E58", ";. c #6F4F2F", ">. c #8F8E8C", ",. c #D4D4D3", "'. c #E1E1E0", "). c #E9E9E8", "!. c #E7E7E6", "~. c #E5E5E3", "{. c #DEDEDD", "]. c #9F9F9E", "^. c #3C3C3C", "/. c #D1D1D1", "(. c #6E6E6E", "_. c #B5B5B5", ":. c #959595", "<. c #848484", "[. c #CFCFCF", "}. c #E9E9E9", "|. c #333333", "1. c #694D31", "2. c #FEB469", "3. c #BE8550", "4. c #5D564F", "5. c #E4E4E3", "6. c #D5D5D4", "7. c #E0E0DF", "8. c #E5E5E4", "9. c #D8D8D6", "0. c #CFCFCE", "a. c #636363", "b. c #5C5C5C", "c. c #B8B8B8", "d. c #B3B3B3", "e. c #AAAAAA", "f. c #C3C3C3", "g. c #D2D2D2", "h. c #525252", "i. c #594027", "j. c #F3A45B", "k. c #684A2D", "l. c #888888", "m. c #CACAC9", "n. c #DCDCDB", "o. c #D0D0CF", "p. c #AFAFAE", "q. c #303030", "r. c #717171", "s. c #B7B7B7", "t. c #9B9B9B", "u. c #5B5B5B", "v. c #EEEEEE", "w. c #D5D5D5", "x. c #9A9A9A", "y. c #46301A", "z. c #B57740", "A. c #55504C", "B. c #CACACA", "C. c #D2D2D1", "D. c #CDCDCB", "E. c #444444", "F. c #A9A9A9", "G. c #565655", "H. c #4A4A4A", "I. c #8E8E8E", "J. c #DADADA", "K. c #282828", "L. c #442C17", "M. c #919191", "N. c #B7B7B6", "O. c #BDBDBB", "P. c #C3C3C1", "Q. c #C7C7C5", "R. c #C8C8C6", "S. c #C6C6C5", "T. c #C3C3C2", "U. c #BFBFBE", "V. c #323231", "W. c #8B8B8B", "X. c #595959", "Y. c #515151", "Z. c #3A3A3A", "`. c #8A8A8A", " + c #929292", ".+ c #4B4B4B", "++ c #131313", "@+ c #0B0704", "#+ c #6D6864", "$+ c #ADADAC", "%+ c #B3B3B2", "&+ c #B6B6B5", "*+ c #B9B9B7", "=+ c #BABAB9", "-+ c #989897", ";+ c #2A2A29", ">+ c #C6C6C6", ",+ c #D9D9D9", "'+ c #757575", ")+ c #171716", "!+ c #999998", "~+ c #9C9C9B", "{+ c #9F9F9D", "]+ c #9D9D9B", "^+ c #9A9A99", "/+ c #979796", "(+ c #939393", "_+ c #474747", ":+ c #C7C7C7", "<+ c #D0D0D0", "[+ c #B4B4B4", "}+ c #323232", "|+ c #2C2C2B", "1+ c #2D2D2C", "2+ c #2D2D2D", "3+ c #1F1F1F", "4+ c #5E5E5E", "5+ c #C8C8C8", "6+ c #DFDFDF", "7+ c #666666", "8+ c #262626", " ", " . . . . . ", " . . . . . . . . . . ", " . . . . . . ", " . . . . ", " . . . . ", " + @ @ # ", " $ % & * = $ ", " $ - ; > , ' ) $ ! ! ! ! ! ! ! ! ", " $ ~ { ] & ^ / ( ( ( ( ( ( ( ( ( $ ", " _ : < [ } | 1 2 2 2 3 4 5 6 7 8 9 0 . . . . ", " a : b c d e f g h i j k l m n o p q r s t u ", " v w x y 2 o z A B C D E F G H I J K L M N O ", " P Q R S T U V W X k Y Z ` ...K +.@.#.$.%.&. ", "$ *.=.-.;.>.,.'.).!.~.{.].^.+./.(._.:.<.[.}.|. ", " 1.2.3.4.5.6.7.8.V l 9.0.a.b.c.d.e._.f.g.h.. ", " i.j.k.l.m.,.l n.C 6.o.p.q.r.s.t.q.u.v.w.x.. ", " y.z.A.l B.0.,.C.o.D.o E.+./.F.q.G.H.I.J./.j K.", " $ L.M.N.O.P.Q.R.S.T.U.V.@.W.s.X.Y.Z.`.[. +.+++", " @+#+o $+%+&+*+q =+&+%+-+;+` >+v.I.`.,+c.'+. ", " )+M.x.!+~+{+{+{+]+^+/+(+_+:+w.w.J.<+[+c.Y.. ", " ++}+K |+1+2+2+2+1+|+K 3+%.}.h.x./.G 4+5+6+u ", " &.|.. . j @.. . 7+8+ ", " K.++ "}; gspiceui-1.0.00+dfsg/src/icons/help.xpm0000644000000000000000000000260411412210451016366 0ustar rootroot/* XPM */ static const char * help_xpm[ ] = { "32 32 8 1", " c None", ". c #800080", "X c #000000", "o c #808080", "O c #808000", "+ c #FFFF00", "@ c #C0C0C0", "# c #FFFFFF", " ", " ", " ", " ", " ", " ..X ", " .o..XX ", " .o.....XX ", " .o........XX ", " .o....O++O...XX ", " .o....++++++....XX ", " .o......O..++O....X ", " .o.........O++O...X ", " .o.......O++++O...XX ", " .o.......O++OO....XoX ", " .o.........OO.....Xo@X ", " .XXX.....O+O......Xo@@X ", " .XooXX...O+O.....Xo@@@XX ", " .X@@ooXX........Xo@@@o.X ", " .X@###ooXX.....Xo@@@o.X ", " .X@#####ooXX..Xo@@@o.X ", " ...oo#####ooXXo@@@o.X ", " XX..oo#####oo@@@o.X ", " XX..oo#####@@o.X ", " XX..oo###@o.X ", " XX..oo#o.X ", " XX..o.X ", " XX.X ", " X ", " ", " ", " " }; gspiceui-1.0.00+dfsg/src/icons/gspiceui-32x32.xpm0000644000000000000000000000257111412210451020030 0ustar rootroot/* gspiceui-32x32.xpm */ static const char * gspiceui_xpm[ ] = { "32 32 6 1", "b c #000000", "e c #0000ff", "f c #58a8ff", "d c #c00000", ". c #c000c0", "# c #c0ffc0", "................................", ".##############################.", ".##############################.", ".######bbbbbbbbb###############.", ".######b#######b###############.", ".##bbbbb#######bbbbbbbbbbbbbb##.", ".######b#######b#####b#########.", ".######bbbbbbbbb#####b#########.", ".####################b#########.", ".#################bbbbbbb######.", ".#####d########################.", ".#####d########################.", ".#####d###########bbbbbbb######.", ".#####d##############b#########.", ".#####d##ee##########b#########.", ".#####d#effe#######bbbbb#######.", ".#####dee##ee##################.", ".#####de####ef######bbb########.", ".#####ef####fe#################.", ".####fe######ef######b#########.", ".####ed######fe##########ee####.", ".###fed#######ef########effe###.", ".###efd#######fe#######ef##fe##.", ".##feddddddddddefdddddfeddddd##.", ".##e##d########fe#####ef#######.", ".#####d#########ef###fe########.", ".#####d#########fe###ef########.", ".#####d##########fefef#########.", ".#####d###########eee##########.", ".##############################.", ".##############################.", "................................" }; gspiceui-1.0.00+dfsg/src/icons/file-close.xpm0000644000000000000000000000341511412210451017461 0ustar rootroot/* XPM */ static const char * file_close_xpm[] = { "22 22 78 1", " c None", ". c #464646", "+ c #434343", "@ c #3F3F3F", "# c #393939", "$ c #313131", "% c #292929", "& c #4F4F4F", "* c #515151", "= c #767676", "- c #727272", "; c #6B6B6B", "> c #616161", ", c #565656", "' c #484848", ") c #282828", "! c #232323", "~ c #555555", "{ c #838383", "] c #898989", "^ c #888888", "/ c #848484", "( c #7A7A7A", "_ c #6F6F6F", ": c #626262", "< c #535353", "[ c #363636", "} c #1F1F1F", "| c #949494", "1 c #9A9A9A", "2 c #939393", "3 c #7B7B7B", "4 c #6C6C6C", "5 c #5C5C5C", "6 c #4B4B4B", "7 c #3A3A3A", "8 c #303030", "9 c #1C1C1C", "0 c #A3A3A3", "a c #999999", "b c #989898", "c c #A1A1A1", "d c #737373", "e c #575757", "f c #474747", "g c #323232", "h c #2A2A2A", "i c #161616", "j c #FFFFFF", "k c #9B9B9B", "l c #3B3B3B", "m c #171717", "n c #8B8B8B", "o c #212121", "p c #111111", "q c #404040", "r c #202020", "s c #101010", "t c #4C4C4C", "u c #2E2E2E", "v c #272727", "w c #1E1E1E", "x c #0F0F0F", "y c #454545", "z c #343434", "A c #2B2B2B", "B c #242424", "C c #0D0D0D", "D c #2F2F2F", "E c #191919", "F c #0B0B0B", "G c #252525", "H c #151515", "I c #090909", "J c #3D3D3D", "K c #181818", "L c #131313", "M c #080808", " ", " ", " .+@#$% ", " &*=-;>,')! ", " ~{]^/(_:<+[} ", " ~]|112]3456789 ", " &{|0abc|/def@ghi ", " *]1ajjbk];jjlghm ", " .=^1bjjjn3jjjlghop ", " +-/2cbjjjjjj'q8%rs ", " @;(]|knjjjj_3/]3jjjj6yzAB9C ", " $,:4d;jjjjjjzD)rEF ", " %'<5ejjj<6jjjG!9HI ", " )+6fjj'+JzjjowKF ", " ![7@llqlzDGo}ELM ", " }8ggg8uA)!wELI ", " 9hhh%vBr9KLI ", " imorw9EHFM ", " psxCFI ", " ", " "}; gspiceui-1.0.00+dfsg/src/icons/file-reload.xpm0000644000000000000000000000247511412210451017627 0ustar rootroot/* XPM */ static const char * file_reload_xpm[] = { "22 22 47 1", " c None", ". c #346C30", "+ c #387532", "@ c #356E32", "# c #356D31", "$ c #356B2F", "% c #4A7F43", "& c #9DD199", "* c #98CE92", "= c #8AC781", "- c #73BA6B", "; c #62AA5C", "> c #5F9159", ", c #367332", "' c #73BA67", ") c #7FA37A", "! c #377532", "~ c #3B7C34", "{ c #3E8637", "] c #76BD6D", "^ c #59A151", "/ c #397934", "( c #489C41", "_ c #69B662", ": c #5EAA58", "< c #65AA5A", "[ c #65AD5B", "} c #5CA454", "| c #78BF6F", "1 c #E9F4E8", "2 c #FCFCFC", "3 c #5AA252", "4 c #8CC983", "5 c #EBF5E9", "6 c #366E32", "7 c #66B05E", "8 c #79BF72", "9 c #63AB5B", "0 c #3E8639", "a c #4BA145", "b c #418D3C", "c c #3C8637", "d c #387633", "e c #3C7D35", "f c #6CB865", "g c #82C279", "h c #50A246", " ", " ", " ", " .++@#$.#% ", " #&&&*=-;> ", " ,&'''''') ", " !&' ", " ~&' ", " {&] ^ ", " $#/(&_::< #[' ", " !}|*12' $345' ", " $^=5' 678*12' ", " $9' 000a&'''' ", " [ b&' ", " b&' ", " c&' ", " .6decb&' ", " ,fg4*&&' ", " h''''''' ", " ", " ", " "}; gspiceui-1.0.00+dfsg/src/icons/html-close.xpm0000644000000000000000000000341511531451550017517 0ustar rootroot/* XPM */ static const char * html_close_xpm[] = { "22 22 78 1", " c None", ". c #464646", "+ c #434343", "@ c #3F3F3F", "# c #393939", "$ c #313131", "% c #292929", "& c #4F4F4F", "* c #515151", "= c #767676", "- c #727272", "; c #6B6B6B", "> c #616161", ", c #565656", "' c #484848", ") c #282828", "! c #232323", "~ c #555555", "{ c #838383", "] c #898989", "^ c #888888", "/ c #848484", "( c #7A7A7A", "_ c #6F6F6F", ": c #626262", "< c #535353", "[ c #363636", "} c #1F1F1F", "| c #949494", "1 c #9A9A9A", "2 c #939393", "3 c #7B7B7B", "4 c #6C6C6C", "5 c #5C5C5C", "6 c #4B4B4B", "7 c #3A3A3A", "8 c #303030", "9 c #1C1C1C", "0 c #A3A3A3", "a c #999999", "b c #989898", "c c #A1A1A1", "d c #737373", "e c #575757", "f c #474747", "g c #323232", "h c #2A2A2A", "i c #161616", "j c #FFFFFF", "k c #9B9B9B", "l c #3B3B3B", "m c #171717", "n c #8B8B8B", "o c #212121", "p c #111111", "q c #404040", "r c #202020", "s c #101010", "t c #4C4C4C", "u c #2E2E2E", "v c #272727", "w c #1E1E1E", "x c #0F0F0F", "y c #454545", "z c #343434", "A c #2B2B2B", "B c #242424", "C c #0D0D0D", "D c #2F2F2F", "E c #191919", "F c #0B0B0B", "G c #252525", "H c #151515", "I c #090909", "J c #3D3D3D", "K c #181818", "L c #131313", "M c #080808", " ", " ", " .+@#$% ", " &*=-;>,')! ", " ~{]^/(_:<+[} ", " ~]|112]3456789 ", " &{|0abc|/def@ghi ", " *]1ajjbk];jjlghm ", " .=^1bjjjn3jjjlghop ", " +-/2cbjjjjjj'q8%rs ", " @;(]|knjjjj_3/]3jjjj6yzAB9C ", " $,:4d;jjjjjjzD)rEF ", " %'<5ejjj<6jjjG!9HI ", " )+6fjj'+JzjjowKF ", " ![7@llqlzDGo}ELM ", " }8ggg8uA)!wELI ", " 9hhh%vBr9KLI ", " imorw9EHFM ", " psxCFI ", " ", " "}; gspiceui-1.0.00+dfsg/src/CmdLinePcr.cpp0000644000000000000000000005613711627701051016304 0ustar rootroot//***************************************************************************** // CmdLinePcr.cpp * // ---------------- * // Started : 22/02/2005 * // Last Update : 02/09/2011 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "CmdLinePcr.hpp" //***************************************************************************** // Constructor. CmdLinePcr::CmdLinePcr( void ) : wxCmdLineParser( ) { bClear( ); m_iArgC = -1; m_ppsArgV = NULL; } //***************************************************************************** // Destructor. CmdLinePcr::~CmdLinePcr( ) { } //***************************************************************************** // Process command line option -a : analysis page specifier. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_a( int * piArg ) { wxString osArg; ( *piArg )++; if( *piArg >= m_iArgC ) { std::cout << "Missing analysis type specifier.\n"; return( FALSE ); } osArg = m_ppsArgV[ *piArg ]; osArg.MakeUpper( ); if( osArg == wxT("OP") ) ; else if( osArg == wxT("DC") ) ; else if( osArg == wxT("AC") ) ; else if( osArg == wxT("TR") ) ; else if( osArg == wxT("FO") ) ; //else if( osArg == wxT("DI") ) ; //else if( osArg == wxT("NO") ) ; //else if( osArg == wxT("PZ") ) ; //else if( osArg == wxT("SE") ) ; //else if( osArg == wxT("TF") ) ; else { std::cout << "Analysis type invalid or not supported : " << wxString( m_ppsArgV[ *piArg ] ).mb_str( ) << '\n'; return( FALSE ); } m_osAnaType = osArg; return( TRUE ); } //***************************************************************************** // Process command line option -c : Rebuild/clean the configuration file. // // Note : This function must be called twice to actually rebuild/clean the // configuration file. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_c( int * piArg ) { // Signify that the configuration file needs to be rebuilt/cleaned if( ! m_bCleanCfgFile ) { m_bCleanCfgFile = TRUE; return( TRUE ); } return( TRUE ); } //***************************************************************************** // Process command line option -d : Enable debug mode. Print debug info. to the // console during program execution. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_d( int * piArg ) { g_bDebug = TRUE; std::cout << "\nDEBUG : Debug mode enabled\n"; return( TRUE ); } //***************************************************************************** // Process command line option -g : Guile procedure used when importing // schematic file. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_g( int * piArg ) { PrcGNetList oGNetList; wxString osArg; // Check that there are more arguments and that the next is not an option osArg = m_ppsArgV[ *piArg ]; if( *piArg<(m_iArgC-1) && !osArg.StartsWith( wxT("-") ) ) { // Test the Guile procedure name if( oGNetList.bSetGuileProc( osArg ) ) m_osGuileProc = osArg; else { // The argument isn't a Guile procedure so is it a file name? If it is, // assume it's a schematic file and use the default Guile procedure. wxRegEx oRegEx( wxT("[./]") ); if( ! oRegEx.Matches( osArg ) ) { std::cout << "Invalid Guile procedure name : " << osArg.mb_str( ) << '\n'; return( FALSE ); } } // Increment argument pointer ( *piArg )++; } else // Use the default value m_osGuileProc = wxT("spice-sdb"); return( TRUE ); } //***************************************************************************** // Process command line option -h : display usage and exit. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_h( int * piArg ) { Usage( ); return( FALSE ); } //***************************************************************************** // Process command line option -r : specify a configuration file. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_r( int * piArg ) { wxFileName ofn1; ( *piArg )++; // Check that there are enough arguments if( *piArg >= m_iArgC ) { std::cout << "Missing configuration file name.\n"; return( FALSE ); } // Check the validity of the file name ofn1 = wxString( m_ppsArgV[ *piArg ], *wxConvCurrent ); if( ! ofn1.IsOk( ) ) { std::cout << "Invalid file name : " << m_ppsArgV[ *piArg ] << '\n'; return( FALSE ); } if( ! ofn1.FileExists( ) ) { std::cout << "File doesn't exist : " << m_ppsArgV[ *piArg ] << '\n'; return( FALSE ); } if( ofn1.IsRelative( ) ) ofn1.MakeAbsolute( ); m_osConfigFile = ofn1.GetFullPath( ); return( TRUE ); } //***************************************************************************** // Process command line option -s : simulator engine specifier. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_s( int * piArg ) { wxString osArg; ( *piArg )++; if( *piArg >= m_iArgC ) { std::cout << "Missing simulator engine specifier.\n"; return( FALSE ); } osArg = m_ppsArgV[ *piArg ]; osArg.MakeUpper( ); if( wxString( wxT("GNUCAP") ).StartsWith( osArg ) ) osArg = CLP_GNUCAP; else if( wxString( wxT("NGSPICE") ).StartsWith( osArg ) ) osArg = CLP_NGSPICE; else { std::cout << "Invalid simulator engine specifier : " << wxString( m_ppsArgV[ *piArg ] ).mb_str( ) << '\n'; return( FALSE ); } m_osSimrType = osArg; return( TRUE ); } //***************************************************************************** // Process command line option -v : display app. version and exit. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_v( int * piArg ) { wxString os1; os1 << APP_NAME << wxT(", Version ") << APP_VERSION << wxT(" (") << APP_DATE << wxT(")") << wxT('\n'); std::cout << os1.mb_str( ); return( FALSE ); } //***************************************************************************** // Process command line option -w : waveform viewer specifier. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bProcOption_w( int * piArg ) { wxString osArg; ( *piArg )++; if( *piArg >= m_iArgC ) { std::cout << "Missing waveform viewer specifier.\n"; return( FALSE ); } osArg = m_ppsArgV[ *piArg ]; osArg.MakeUpper( ); if( wxString(CLP_GWAVE).Upper().StartsWith(osArg) ) osArg = CLP_GWAVE; else if( wxString(CLP_GAW ).Upper().StartsWith(osArg) ) osArg = CLP_GAW; else { std::cout << "Invalid waveform viewer specifier : " << wxString( m_ppsArgV[ *piArg ] ).mb_str( ) << '\n'; return( FALSE ); } m_osViewer = osArg; return( TRUE ); } //***************************************************************************** // Do general checks of arguments which should be file names. If any of the // args. is not a valid file name display an error message and return FALSE. // // Argument List : // piArg - A pointer to the current command line argument // (incremented as part of processing) // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bCheckFiles( int * piArg ) { wxFileName ofn1; wxString os1; int i1; // Check the validity of the file name/s for( i1=*piArg; i1= m_iArgC ) return( FALSE ); // If no Guile procedure has been specified test the file name extensions if( m_osGuileProc.IsEmpty( ) ) { for( i1=*piArg; i1= m_iArgC ) return( FALSE ); // Load the netlist file name into m_osNetLstFile ofn1 = wxString( m_ppsArgV[ *piArg ], *wxConvCurrent ); if( ofn1.IsRelative( ) ) ofn1.MakeAbsolute( ); m_osNetLstFile = ofn1.GetFullPath( ); ( *piArg )++; return( TRUE ); } //***************************************************************************** // Print usage message on console. void CmdLinePcr::Usage( void ) { wxString os1, os2; os2 = wxString( m_ppsArgV[ 0 ] ).AfterLast( wxT('/') ); os1 << wxT("\n") << wxT("Analyse a electronic circuit using a GUI to a numerical simulation engine\n") << wxT("\n") << wxT("USAGE : ") << os2 << wxT(" [-OPTION [ARG]] [FILE/S]\n") << wxT("\n") << wxT("OPTIONS : -h : Print usage (this message)\n") << wxT(" -v : Print version information\n") << wxT(" -d : Enable debug mode (generates console spew on standard error)\n") << wxT(" -r RCFILE : Specify a configuration file\n") << wxT(" RCFILE = ~/.gspiceui.conf (default)\n") << wxT(" -c : Rebuild/clean the configuration file\n") << wxT(" -s SIMENG : Specify the simulation engine to be used\n") << wxT(" SIMENG = gnucap (default) or ngspice\n") << wxT(" -a ANA : Specify the analysis page to be displayed\n") << wxT(" ANA = op, dc (default), ac, tr, fo, di, no, pz, se or tf\n") << wxT(" -g [PROC] : Guile procedure for importing a schematic file with gNetList\n") << wxT(" PROC = spice-sdb (default), pcb, protelii, verilog, etc.\n") << wxT(" -w VIEWER : Specify the waveform viewer to be used\n") << wxT(" VIEWER = gwave (default), gaw or gwave2\n") << wxT("\n") << wxT("ARGS : FILE/S : Import schematic file/s or load a circuit description file\n") << wxT("\n") << wxT("NOTES : Option -s should come before -a if both are specified\n") << wxT("\n"); std::cout << os1.mb_str( ); } //***************************************************************************** // Print version information on console. void CmdLinePcr::Version( void ) { wxString os1; os1 << wxT("\n ") << APP_NAME << wxT("\n Version ") << APP_VERSION << wxT(" (") << APP_DATE << wxT(")\n\n"); std::cout << os1.mb_str( ); } //***************************************************************************** // Set the configuration file name and update its contents based on the command // line arguments. void CmdLinePcr::SetConfig( void ) { wxConfig * poCfg; wxString os1; int i1; // Create the global configuration object if( ! m_osConfigFile.IsEmpty( ) ) os1 = rosGetConfigFile( ); else os1 << wxT('.') << wxString( m_ppsArgV[ 0 ] ).AfterLast( wxT('/') ) << wxT(".conf"); poCfg = new wxConfig( wxEmptyString, wxEmptyString, os1 ); wxConfig::Set( poCfg ); poCfg->SetRecordDefaults( TRUE ); // Set the simulation engine type if( ! m_osSimrType.IsEmpty( ) ) { poCfg->SetPath( wxT("/Simulator") ); poCfg->Write( wxT("Engine"), m_osSimrType ); } // Set the analysis type if( ! m_osAnaType.IsEmpty( ) ) { poCfg->SetPath( wxT("/Simulator") ); poCfg->Write( wxT("Analysis"), m_osAnaType ); } // Set the Guile procedure to be used by GNetList if( ! m_osGuileProc.IsEmpty( ) ) { poCfg->SetPath( wxT("/gNetList") ); poCfg->Write( wxT("GuileProc"), m_osGuileProc ); } // Set the waveform viewer type if( ! m_osViewer.IsEmpty( ) ) { poCfg->SetPath( wxT("/Viewer") ); poCfg->Write( wxT("Name"), m_osViewer ); } // Set the netlist file name if( ! m_osNetLstFile.IsEmpty( ) ) { poCfg->SetPath( wxT("/Files") ); poCfg->Write( wxT("NetList"), m_osNetLstFile ); poCfg->Write( wxT("Schematics"), wxT("") ); } // Set the schematic file name/s if( ! m_osaSchemFiles.IsEmpty( ) ) { poCfg->SetPath( wxT("/Files") ); for( i1=0, os1.Empty( ); i1<(int)m_osaSchemFiles.GetCount( ); i1++ ) os1 << m_osaSchemFiles.Item( i1 ) << wxT(' '); poCfg->Write( wxT("Schematics"), os1 ); poCfg->Write( wxT("NetList"), wxT("") ); } // Write any changes to file poCfg->Flush( ); } //***************************************************************************** // Rebuild/clean the configuration file. void CmdLinePcr::CleanCfgFile( void ) { wxConfig * poCfg; wxString os1; long li1; uint ui1; bool b1; // Get a pointer to the configuration object poCfg = (wxConfig *) wxConfig::Get( ); // Record the number of groups ui1 = poCfg->GetNumberOfGroups( ); // Look for any superceded groups for( b1=poCfg->GetFirstGroup(os1,li1); b1; b1=poCfg->GetNextGroup(os1,li1) ) { if( os1 == wxT("Help") ) continue; else if( os1 == wxT("Main") ) continue; else if( os1 == wxT("Simulator") ) continue; else if( os1 == wxT("gNetList") ) continue; else if( os1 == wxT("Files") ) continue; else if( os1 == wxT("Directories") ) continue; else if( os1 == wxT("Viewer") ) continue; else if( os1 == wxT("GNU-Cap") ) continue; poCfg->DeleteGroup( os1 ); } // Write any changes to file poCfg->Flush( ); // Display message to the user ui1 -= poCfg->GetNumberOfGroups( ); os1.Empty( ); os1 << wxT("Rebuild/clean configuration file : "); if( ui1 > 0 ) os1 << ui1 << wxT(" unused group/s found & deleted\n"); else os1 << wxT("nothing to be done\n"); std::cout << os1.mb_str( ); } //***************************************************************************** // Clear the object attributes. // // Return Values : // TRUE - Success // FALSE - Failure bool CmdLinePcr::bClear( void ) { m_osSimrType .Empty( ); m_osAnaType .Empty( ); m_osGuileProc .Empty( ); m_osViewer .Empty( ); m_osConfigFile .Empty( ); m_osNetLstFile .Empty( ); m_osaSchemFiles.Empty( ); m_bCleanCfgFile = FALSE; return( TRUE ); } //***************************************************************************** // Set the command line to be processed. // // Argument List : // iArgV - The argment count // ppsArgV - The string array of argument fields // // Return Values: // TRUE - Success // FALSE - Failure bool CmdLinePcr::bSetCmdLine( int iArgC, wxChar ** ppsArgV ) { // Check validity of arguments if( iArgC <= 0 ) return( FALSE ); if( ppsArgV == NULL ) return( FALSE ); m_iArgC = iArgC; m_ppsArgV = ppsArgV; return( TRUE ); } //***************************************************************************** // Process any command line arguments past to the application at start-up. // // Return Values : // TRUE - Success (continue application execution) // FALSE - Failure (terminate application execution) bool CmdLinePcr::bProcArgs( void ) { wxString osArg, os1; int iArg; // Check validity of arguments if( m_iArgC <= 0 ) return( FALSE ); if( m_ppsArgV == NULL ) return( FALSE ); // Process options for( iArg=1; iArg2 ) { // Found concatenated options --> error std::cout << "Options must be specfied separately : " << osArg.mb_str( ) << '\n'; return( FALSE ); } else if( osArg == wxT("-v") ) { // Print version information if( ! bProcOption_v( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-h") ) { // Print usage information if( ! bProcOption_h( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-d") ) { // Enable debug mode if( ! bProcOption_d( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-r") ) { // Specify a configuration file if( ! bProcOption_r( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-c") ) { // Rebuild/clean the configuration file if( ! bProcOption_c( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-s") ) { // Process simulation engine specifier if( ! bProcOption_s( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-a") ) { // Process analysis type specfier if( ! bProcOption_a( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-g") ) { // Specify Guile procedure for importing a schematic file if( ! bProcOption_g( &iArg ) ) return( FALSE ); } else if( osArg == wxT("-w") ) { // Process waveform viewer specifier if( ! bProcOption_w( &iArg ) ) return( FALSE ); } else if( osArg.GetChar( 0 ) == wxT('-') ) { // Found invalid option --> error std::cout << "Invalid option : " << osArg.mb_str( ) << '\n'; return( FALSE ); } // The argument is not an option else break; } // Attempt to process any remaining argument/s as file name/s if( ! bCheckFiles( &iArg ) ) return( FALSE ); bProcSchems ( &iArg ); bProcNetList( &iArg ); // At this stage all arguments should have been processed if( iArg < m_iArgC ) { os1 << wxT("Too many arguments :"); for( osArg=m_ppsArgV[ iArg ]; iArg 0 ) cout << ", "; std::cout << m_osaSchemFiles.Item( i1 ).mb_str( ); } std::cout << '\n'; std::cout << osPrefix .mb_str( ) << "m_bCleanCfgFile : " << (m_bCleanCfgFile ? "TRUE" : "FALSE") << '\n'; } //***************************************************************************** gspiceui-1.0.00+dfsg/src/TypeDefs.cpp0000644000000000000000000000334411600762401016034 0ustar rootroot//***************************************************************************** // TypeDefs.cpp * // -------------- * // Started : 07/05/2009 * // Last Update : 23/06/2009 * // Copyright : (C) 2004 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "TypeDefs.hpp" //***************************************************************************** // Finish the definition of new array types. The following expands into some // C++ code and so should only be compiled once (ie. don't put this into a // header file rather put it in a source file or there will be linker errors). #include WX_DEFINE_OBJARRAY( ArrayFileName ); //***************************************************************************** gspiceui-1.0.00+dfsg/src/obj/0000755000000000000000000000000011640452272014361 5ustar rootrootgspiceui-1.0.00+dfsg/src/CmdLinePcr.hpp0000644000000000000000000000717011533701154016302 0ustar rootroot//***************************************************************************** // CmdLinePcr.hpp * // ---------------- * // Description : This class does the command line processing. * // Started : 22/02/2005 * // Last Update : 04/03/2011 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef CMDLINEPCR_HPP #define CMDLINEPCR_HPP // System includes #include // wxWidgets includes #include #include #include #include // Application includes #include "Version.hpp" #include "TypeDefs.hpp" #include "process/PrcGNetList.hpp" // Local constant declarations #define CLP_NGSPICE wxT("NG-Spice") #define CLP_GNUCAP wxT("GNU-Cap") #define CLP_GWAVE wxT("gwave") #define CLP_GAW wxT("Gaw") //***************************************************************************** class CmdLinePcr : wxCmdLineParser { private : int m_iArgC; wxChar ** m_ppsArgV; wxString m_osSimrType; wxString m_osAnaType; wxString m_osGuileProc; wxString m_osViewer; wxString m_osConfigFile; wxString m_osNetLstFile; wxArrayString m_osaSchemFiles; bool m_bCleanCfgFile; bool bProcOption_a( int * piArg ); // Analysis page specifier bool bProcOption_c( int * piArg ); // Rebuild/clean configuration file bool bProcOption_d( int * piArg ); // Print debug info. to console bool bProcOption_g( int * piArg ); // Specify Guile procedure for import bool bProcOption_h( int * piArg ); // Display usage and exit bool bProcOption_r( int * piArg ); // Specify a configuration file bool bProcOption_s( int * piArg ); // Simulator engine specifier bool bProcOption_v( int * piArg ); // Display app. version and exit bool bProcOption_w( int * piArg ); // Specify the waveform viewer to use bool bCheckFiles ( int * piArg ); // Check that file names are correct bool bProcSchems ( int * piArg ); // Schematic file name/s bool bProcNetList ( int * piArg ); // Netlist file name void Usage( void ); void Version( void ); void SetConfig( void ); void CleanCfgFile( void ); public : CmdLinePcr( void ); ~CmdLinePcr( ); bool bClear( void ); bool bSetCmdLine( int iArgC, wxChar ** ppsArgV ); bool bProcArgs( void ); const wxString & rosGetConfigFile( void ) { return( m_osConfigFile ); } void Print( const wxString & rosPrefix=wxT(" ") ); }; //***************************************************************************** #endif // CMDLINEPCR_HPP gspiceui-1.0.00+dfsg/src/main/0000755000000000000000000000000011636742713014542 5ustar rootrootgspiceui-1.0.00+dfsg/src/main/HelpTasks.cpp0000644000000000000000000002573411636742713017157 0ustar rootroot//***************************************************************************** // HelpTasks.cpp * // --------------- * // Started : 03/06/2005 * // Last Update : 23/09/2011 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "main/HelpTasks.hpp" #include "main/FrmMain.hpp" // The application icons #include "icons/gspiceui-32x32.xpm" #include "icons/html-forward.xpm" #include "icons/html-back.xpm" #include "icons/html-close.xpm" //***************************************************************************** // Implement an event table in which the events are routed to their respective // handler functions in the class. If -1 is given as the ID, the given handler // will be invoked for any event of the specified type. BEGIN_EVENT_TABLE( HelpTasks, wxFrame ) EVT_TOOL( ID_TBR_FORWARD, HelpTasks::OnForward ) EVT_TOOL( ID_TBR_BACK, HelpTasks::OnBack ) EVT_TOOL( ID_TBR_CLOSE, HelpTasks::OnClose ) EVT_CLOSE( HelpTasks::OnClose ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List: // poFrmMain - A pointer to the parent frame HelpTasks::HelpTasks( FrmMain * poFrmMain ) : wxFrame( poFrmMain, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ), m_oHtmlWin( this ) { // Set the pointer to the parent frame m_poFrmMain = poFrmMain; // Get the global configuration object m_poCfg = (wxConfig *) wxConfig::Get( ); // Initialize the help viewer Initialize( ); } //***************************************************************************** // Destructor. HelpTasks::~HelpTasks( ) { } //***************************************************************************** // Initialize the main frame. void HelpTasks::Initialize( void ) { // Set the frame icon SetIcon( wxICON( gspiceui ) ); // Set the frame title SetTitle( ); // Call all the initialization functions InitToolBar( ); InitHtmlWin( ); InitPosnSize( ); } //***************************************************************************** // Initialize the tool bar. void HelpTasks::InitToolBar( void ) { wxBitmap * poPixMap[ 3 ]; wxToolBar * poToolBar; // Create the tool bar poToolBar = CreateToolBar( wxHORIZONTAL | wxTB_FLAT ); // Create the bitmaps for the tools poPixMap[ 0 ] = new wxBitmap( html_back_xpm ); poPixMap[ 1 ] = new wxBitmap( html_forward_xpm ); poPixMap[ 2 ] = new wxBitmap( html_close_xpm ); // Add the tools to the toolbar poToolBar->AddTool( ID_TBR_BACK , wxT(""), *(poPixMap[ 0 ]), wxT("Back") ); poToolBar->AddTool( ID_TBR_FORWARD, wxT(""), *(poPixMap[ 1 ]), wxT("Forward") ); poToolBar->AddTool( ID_TBR_CLOSE , wxT(""), *(poPixMap[ 2 ]), wxT("Close") ); // Realize the toolbar poToolBar->Realize( ); // Can delete the bitmaps since they're reference counted for( int i1=0; i1<3; i1++ ) delete poPixMap[ i1 ]; } //***************************************************************************** // Initialize the frames position amd size. void HelpTasks::InitHtmlWin( void ) { // Enable display of image types wxInitAllImageHandlers( ); // Set suitable wxHtmlWindow font sizes int ia[ 7 ]={ 9,10,11,14,16,18,20 }; m_oHtmlWin.SetFonts( wxT(""), wxT(""), ia ); } //***************************************************************************** // Initialize the frames position amd size. void HelpTasks::InitPosnSize( void ) { int ix, iy, iw, ih; // Set the position and size from the configuration object m_poCfg->SetPath( wxT("/Help") ); ix = m_poCfg->Read( wxT("PosnX"), 500 ); iy = m_poCfg->Read( wxT("PosnY"), 1 ); iw = m_poCfg->Read( wxT("SizeW"), 500 ); ih = m_poCfg->Read( wxT("SizeH"), 700 ); if( ix>0 && iy>0 ) Move( ix, iy ); if( iw>0 && ih>0 ) SetClientSize( iw, ih ); } //***************************************************************************** // Determine the path to the applications base installation point. // // Return Values: // Success - The path to the installation point // Failure - An empty string wxString & HelpTasks::rosGetInstallPath( void ) { static wxString osPath; wxPathList opl1; wxFileName ofn1; wxString os1; osPath.Empty( ); // Get the command used to envoke this process ofn1 = wxTheApp->argv[ 0 ]; if( ! ofn1.GetPath( ).IsEmpty( ) ) { // Extract the desired part of the path ofn1.Normalize( ); // Expand abbreviations eg. "..", "~', etc. } else { // Search env. var. PATH for the first occurrence of the app. name opl1.AddEnvList( wxT("PATH") ); os1 = opl1.FindAbsoluteValidPath( ofn1.GetFullName( ) ); ofn1 = os1; } osPath = ofn1.GetPath( ); if( osPath.AfterLast( wxT('/') ) == wxT("bin") ) osPath = osPath.BeforeLast( wxT('/') ); return( osPath ); } //***************************************************************************** // Set the help frame title. void HelpTasks::SetTitle( void ) { wxString os1; os1 = wxT("GNU Spice GUI - User Manual"); if( ! m_oHtmlWin.GetOpenedPage( ).IsEmpty( ) ) os1 << wxT(" - ") << m_oHtmlWin.GetOpenedPage( ); wxFrame::SetTitle( os1 ); } //***************************************************************************** // Display the gSpiceUI User Manual. void HelpTasks::ManUser( void ) { wxFileName ofn1, ofn2; wxString os1; // Check if the manual has been loaded into memory if( m_oHtmlWin.GetOpenedPage( ).IsEmpty( ) ) { // Specify the two locations to search os1 = rosGetInstallPath( ); if( os1.IsEmpty( ) ) return; ofn1 = os1 + wxT("/share/gspiceui/html/User-Manual.html"); ofn2 = os1 + wxT("/html/User-Manual.html"); // Search for the manual if( ofn1.FileExists( ) ) os1 = ofn1.GetFullPath( ); else if( ofn2.FileExists( ) ) os1 = ofn2.GetFullPath( ); else { // Display an error message os1.Empty( ); os1 << wxT("\nThe base manual page \"") << ofn1.GetFullName( ) << wxT('\"') << wxT(" couldn't be found in either of the following locations :\n\n") << wxT(" ") << ofn1.GetPath( ) << wxT("/\n") << wxT(" ") << ofn2.GetPath( ) << wxT("/\n"); wxMessageBox( os1, wxT("User Manual"), wxOK | wxCENTRE, m_poFrmMain ); return; } // Load the manual m_oHtmlWin.LoadPage( os1 ); SetTitle( ); } // Show the manual Show( TRUE ); } //***************************************************************************** // Display the about message dialog. void HelpTasks::About( void ) { wxString os1; long lStyle; os1 << wxT("\n " ) << APP_NAME << wxT("\n Version ") << APP_VERSION << wxT(" (") << APP_DATE << wxT(")") << wxT("\n ") << APP_COPYRIGHT << wxT("\n\n") << wxT("\nThis application is intended to provide a GUI for various") << wxT("\nfreely available electronic circuit simulation engines :\n") << wxT("\n - NG-Spice") << wxT("\n - GNU-Cap\n") << wxT("\nSchematic files are imported using gNetList and waveform ") << wxT("\ndata can be viewed using either ") << CLP_GWAVE << wxT(" or ") << CLP_GAW << wxT(".\n") << wxT("\nThis application is written in C++ and is based on the free") << wxT("\nsoftware C++ library ") << wxVERSION_STRING << wxT(".\n") << wxT("\n") << APP_NAME << wxT(" is free software; you can redistribute it and/or") << wxT("\nmodify it under the terms of the GNU Library General") << wxT("\nPublic Licence as published by the Free Software") << wxT("\nFoundation; either version 2 of the Licence, or (at your") << wxT("\noption) any later version.\n") << wxT("\n") << APP_NAME << wxT(" is distributed in the hope that it will be useful,") << wxT("\nbut WITHOUT ANY WARRANTY; without even the implied") << wxT("\nwarranty of MERCHANTABILITY or FITNESS FOR A") << wxT("\nPARTICULAR PURPOSE."); lStyle = wxOK | wxICON_INFORMATION; wxMessageBox( os1, wxT("About gSpiceUI"), lStyle, m_poFrmMain ); } //***************************************************************************** // Go to the next page in the history store. // // Argument List: // roEvtCmd - The event to be processed void HelpTasks::OnForward( wxCommandEvent & roEvtCmd ) { if( m_oHtmlWin.HistoryCanForward( ) ) m_oHtmlWin.HistoryForward( ); } //***************************************************************************** // Go to the previous page in the history store. // // Argument List: // roEvtCmd - The event to be processed void HelpTasks::OnBack( wxCommandEvent & roEvtCmd ) { if( m_oHtmlWin.HistoryCanBack( ) ) m_oHtmlWin.HistoryBack( ); } //***************************************************************************** // Close the help viewer frame. // // Argument List: // roEvtCmd - The event to be processed void HelpTasks::OnClose( wxCommandEvent & roEvtCmd ) { int ix, iy, iw, ih; // Save the frame size and position GetPosition( &ix, &iy ); GetClientSize( &iw, &ih ); m_poCfg->SetPath( wxT("/Help") ); m_poCfg->Write( wxT("PosnX"), (long) ix ); m_poCfg->Write( wxT("PosnY"), (long) iy ); m_poCfg->Write( wxT("SizeW"), (long) iw ); m_poCfg->Write( wxT("SizeH"), (long) ih ); m_poCfg->Flush( ); Show( FALSE ); // Hide the frame // Reset the HTML Window settings while( m_oHtmlWin.HistoryCanBack( ) ) m_oHtmlWin.HistoryBack( ); m_oHtmlWin.HistoryClear( ); m_oHtmlWin.Scroll( 0, 0 ); } //***************************************************************************** // Close the help viewer frame. // // Argument List: // roEvtClose - The event to be processed void HelpTasks::OnClose( wxCloseEvent & roEvtClose ) { wxCommandEvent oEvtCmd; OnClose( oEvtCmd ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/main/FrmMain.cpp0000644000000000000000000014044411636742713016606 0ustar rootroot//***************************************************************************** // FrmMain.cpp * // ------------- * // Started : 18/08/2003 * // Last Update : 23/09/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "main/FrmMain.hpp" // The application icons #include "icons/gspiceui-32x32.xpm" #include "icons/file-open.xpm" #include "icons/file-import.xpm" #include "icons/file-reload.xpm" #include "icons/file-close.xpm" #include "icons/sim-create.xpm" #include "icons/sim-run.xpm" #include "icons/sim-stop.xpm" #include "icons/sim-edit.xpm" #include "icons/sim-plot.xpm" #include "icons/help.xpm" //***************************************************************************** // Implement an event table in which the events are routed to their respective // handler functions in the class. If -1 is given as the ID, the given handler // will be invoked for any event of the specified type. BEGIN_EVENT_TABLE( FrmMain, wxFrame ) EVT_MENU( ID_MNU_OPEN, FrmMain::OnOpen ) EVT_MENU( ID_MNU_IMPORT, FrmMain::OnImport ) EVT_MENU( ID_MNU_RELOAD, FrmMain::OnReload ) EVT_MENU( ID_MNU_CLOSE, FrmMain::OnClose ) EVT_MENU( ID_MNU_EXIT, FrmMain::OnAppExit ) EVT_MENU( ID_MNU_CREATE, FrmMain::OnSimCreate ) EVT_MENU( ID_MNU_RUN, FrmMain::OnSimRun ) EVT_MENU( ID_MNU_STOP, FrmMain::OnSimStop ) EVT_MENU( ID_MNU_SCHEM, FrmMain::OnSchematic ) EVT_MENU( ID_MNU_VIEWER, FrmMain::OnViewData ) EVT_MENU( ID_MNU_GNUCAP, FrmMain::OnSelSimEng ) EVT_MENU( ID_MNU_NGSPICE, FrmMain::OnSelSimEng ) EVT_MENU( ID_MNU_PREFS, FrmMain::OnPrefs ) EVT_MENU( ID_MNU_MAN_USR, FrmMain::OnManUser ) EVT_MENU( ID_MNU_MAN_NGS, FrmMain::OnManNgSpice ) EVT_MENU( ID_MNU_MAN_GCP, FrmMain::OnManGnuCap ) EVT_MENU( ID_MNU_ABOUT, FrmMain::OnAbout ) EVT_TOOL( ID_TBR_OPEN, FrmMain::OnOpen ) EVT_TOOL( ID_TBR_IMPORT, FrmMain::OnImport ) EVT_TOOL( ID_TBR_RELOAD, FrmMain::OnReload ) EVT_TOOL( ID_TBR_CLOSE, FrmMain::OnClose ) EVT_TOOL( ID_TBR_CREATE, FrmMain::OnSimCreate ) EVT_TOOL( ID_TBR_RUN, FrmMain::OnSimRun ) EVT_TOOL( ID_TBR_STOP, FrmMain::OnSimStop ) EVT_TOOL( ID_TBR_SCHEM, FrmMain::OnSchematic ) EVT_TOOL( ID_TBR_VIEWER, FrmMain::OnViewData ) EVT_TOOL( ID_TBR_HELP, FrmMain::OnManUser ) EVT_TOOL_ENTER( -1, FrmMain::OnToolEnter ) EVT_CLOSE( FrmMain::OnSysExit ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List : // poApp - A pointer to the class that created this object FrmMain::FrmMain( const wxApp * poApp ) : wxFrame( (wxFrame *) NULL, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE & ~wxMAXIMIZE_BOX ), m_oFileTsks( this ), m_oHelpTsks( this ), m_oSimnNgs( ), m_oSimnGcp( ) { wxString os1; // Indicate that the main frame is open m_bIsOpen = TRUE; // Set pointer to parent application m_poApp = poApp; // Get the global configuration object m_poCfg = (wxConfig *) wxConfig::Get( ); // Initialize pointers m_poSimn = NULL; m_poPrcSimEng = NULL; m_poNbkSimEng = NULL; // Create everything Initialize( ); // Set status bar text os1 << APP_NAME << wxT(", Version ") << APP_VERSION << wxT(" (") << APP_DATE << wxT(")"); SetStatusText( wxT(" Welcome to ") + os1, ePANE_MESG ); } //***************************************************************************** // Destructor. FrmMain::~FrmMain( ) { if( m_poNbkSimEng != NULL ) { delete m_poNbkSimEng; m_poNbkSimEng = NULL; } if( m_poPrcSimEng != NULL ) { delete m_poPrcSimEng; m_poPrcSimEng = NULL; } } //***************************************************************************** // Initialize the main frame. void FrmMain::Initialize( void ) { long li1; // Set the frame icon, font and title SetIcon( wxICON( gspiceui ) ); SetFont( FONT_NORM ); m_oFileTsks.bSetTitle( ); // Automatically update the frame layout when it is resized SetAutoLayout( TRUE ); // Call all the initialization functions InitMenuBar ( ); InitToolBar ( ); InitLstBoxs ( ); InitNbkTCtls( ); InitStatBar ( ); InitToolTips( ); InitSimEng ( ); InitLogFiles( ); DoLayout( ); InitPosnSize( ); // Set the sweep source synchronization flag m_poCfg->SetPath( wxT("/Main") ); m_poCfg->Read( wxT("SyncSwpSrcs"), &li1, 0 ); PnlAnaBase::m_bSyncSwpSrcs = ( li1 != 0 ? TRUE : FALSE ); // Display the desired analysis page m_poCfg->SetPath( wxT("/Simulator") ); m_poNbkSimEng->bSetPage( m_poCfg->Read( wxT("Analysis"), wxT("OP") ) ); // Initialize the FileTasks object eg. load schematic or netlist file/s m_oFileTsks.Initialize( ); // If necessary load the simulation or netlist if( ! m_oNetLst.bIsEmpty( ) ) bSimnLoad( ); // Display the appropriate text control page if( ! m_oNbkTxtCtls.poGetPage( NbkTxtCtls::ePAGE_SIMULTN )->bIsEmpty() ) m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_SIMULTN ); else if( ! m_oNbkTxtCtls.poGetPage( NbkTxtCtls::ePAGE_NETLIST )->bIsEmpty() ) m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_NETLIST ); else m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_CONSOLE ); } //***************************************************************************** // Initialize the menu bar. void FrmMain::InitMenuBar( void ) { // Create the menu bar and menus wxMenuBar * poMenuBar = new wxMenuBar; wxMenu * poMenuFile = new wxMenu; wxMenu * poMenuSimu = new wxMenu; wxMenu * poMenuSets = new wxMenu; wxMenu * poMenuHelp = new wxMenu; // Set the tool bar font poMenuBar->SetFont( FONT_NORM ); // Load the menus with items poMenuFile->Append( ID_MNU_OPEN , wxT(" &Open ... ") ); poMenuFile->Append( ID_MNU_IMPORT, wxT(" &Import ... ") ); poMenuFile->Append( ID_MNU_RELOAD, wxT(" &Reload ") ); poMenuFile->Append( ID_MNU_CLOSE , wxT(" &Close ") ); poMenuFile->AppendSeparator( ); poMenuFile->Append( ID_MNU_EXIT , wxT(" E&xit ") ); poMenuSimu->Append( ID_MNU_CREATE, wxT(" &Create ") ); poMenuSimu->Append( ID_MNU_RUN , wxT(" &Run ") ); poMenuSimu->Append( ID_MNU_STOP , wxT(" &Stop ") ); poMenuSimu->AppendSeparator( ); poMenuSimu->Append( ID_MNU_SCHEM , wxT(" Sc&hematic ... ") ); poMenuSimu->Append( ID_MNU_VIEWER, wxT(" R&esults ... ") ); poMenuSets->AppendRadioItem( ID_MNU_GNUCAP , wxT(" &GNU-Cap ") ); poMenuSets->AppendRadioItem( ID_MNU_NGSPICE, wxT(" &NG-Spice ") ); poMenuSets->AppendSeparator( ); poMenuSets->Append( ID_MNU_PREFS, wxT(" &Preferences ... ") ); poMenuHelp->Append( ID_MNU_MAN_USR, wxT(" &User Manual ... ") ); // poMenuHelp->Append( ID_MNU_MAN_NGS, wxT(" &NG-Spice Manual ...") ); // poMenuHelp->Append( ID_MNU_MAN_GCP, wxT(" &GNU-Cap Manual ...") ); // poMenuHelp->AppendSeparator( ); poMenuHelp->Append( ID_MNU_ABOUT , wxT(" &About ... ") ); // Load the menubar with menus poMenuBar ->Append( poMenuFile, wxT(" &File ") ); poMenuBar ->Append( poMenuSimu, wxT(" &Simulate ") ); poMenuBar ->Append( poMenuSets, wxT(" S&ettings ") ); poMenuBar ->Append( poMenuHelp, wxT(" &Help ") ); // Check the appropriate simulation engine menu item m_poCfg->SetPath( wxT("/Simulator") ); if( m_poCfg->Read( wxT("Engine"), CLP_GNUCAP ) == CLP_NGSPICE ) poMenuSets->Check( ID_MNU_NGSPICE, TRUE ); else poMenuSets->Check( ID_MNU_GNUCAP , TRUE ); // Attach the menu bar to the frame SetMenuBar( poMenuBar ); // Disable the stop option poMenuBar->Enable( ID_MNU_STOP, FALSE ); } //***************************************************************************** // Initialize the tool bar. void FrmMain::InitToolBar( void ) { wxBitmap * poPixMap[ 10 ]; wxToolBar * poToolBar; // Create the tool bar poToolBar = CreateToolBar( wxHORIZONTAL | wxTB_FLAT ); // Create the bitmaps for the tools poPixMap[ 0 ] = new wxBitmap( file_open_xpm ); poPixMap[ 1 ] = new wxBitmap( file_import_xpm ); poPixMap[ 2 ] = new wxBitmap( file_reload_xpm ); poPixMap[ 3 ] = new wxBitmap( file_close_xpm ); poPixMap[ 4 ] = new wxBitmap( sim_create_xpm ); poPixMap[ 5 ] = new wxBitmap( sim_run_xpm ); poPixMap[ 6 ] = new wxBitmap( sim_stop_xpm ); poPixMap[ 7 ] = new wxBitmap( sim_edit_xpm ); poPixMap[ 8 ] = new wxBitmap( sim_plot_xpm ); poPixMap[ 9 ] = new wxBitmap( help_xpm ); // Add the tools to the toolbar poToolBar->SetToolSeparation( 10 ); poToolBar->AddTool( ID_TBR_OPEN, wxT(""), *(poPixMap[ 0 ]), wxT("Open a netlist file") ); poToolBar->AddTool( ID_TBR_IMPORT, wxT(""), *(poPixMap[ 1 ]), wxT("Import schematic file/s") ); poToolBar->AddTool( ID_TBR_RELOAD, wxT(""), *(poPixMap[ 2 ]), wxT("Reload netlist / schematic file/s") ); poToolBar->AddTool( ID_TBR_CLOSE, wxT(""), *(poPixMap[ 3 ]), wxT("Close netlist / schematic file/s") ); poToolBar->AddSeparator( ); poToolBar->AddTool( ID_TBR_CREATE, wxT(""), *(poPixMap[ 4 ]), wxT("Create a netlist file containing simulation instructions") ); poToolBar->AddTool( ID_TBR_RUN, wxT(""), *(poPixMap[ 5 ]), wxT("Run the simulation engine process") ); poToolBar->AddTool( ID_TBR_STOP, wxT(""), *(poPixMap[ 6 ]), wxT("Stop the simulation engine process") ); poToolBar->AddSeparator( ); poToolBar->AddTool( ID_TBR_SCHEM, wxT(""), *(poPixMap[ 7 ]), wxT("Edit / view schematic/s") ); poToolBar->AddTool( ID_TBR_VIEWER, wxT(""), *(poPixMap[ 8 ]), wxT("View results data") ); poToolBar->AddSeparator( ); poToolBar->AddTool( ID_TBR_HELP, wxT(""), *(poPixMap[ 9 ]), wxT("View the user manual") ); // Realize the toolbar poToolBar->Realize( ); // Delete the bitmaps for( int i1=0; i1<10; i1++ ) delete poPixMap[ i1 ]; // Disable the stop button poToolBar->EnableTool( ID_TBR_STOP, FALSE ); } //***************************************************************************** // Initialize the test node and component list boxes. void FrmMain::InitLstBoxs( void ) { long lStyle; // Create the node and component list labels lStyle = wxALIGN_CENTER; m_oLblNodes.Create( this, ID_UNUSED, wxT("Nodes"), wxDefaultPosition, wxDefaultSize, lStyle ); m_oLblCpnts.Create( this, ID_UNUSED, wxT("Components"), wxDefaultPosition, wxDefaultSize, lStyle ); // Create the node and component list boxes lStyle = wxLB_MULTIPLE | wxLB_ALWAYS_SB; m_oLbxNodes.Create( this, ID_LBX_NODES, wxDefaultPosition, wxSize( 100, -1 ), 0, NULL, lStyle ); m_oLbxCpnts.Create( this, ID_LBX_CPNTS, wxDefaultPosition, wxSize( 100, -1 ), 0, NULL, lStyle ); } //***************************************************************************** // Initialize the console notebook. void FrmMain::InitNbkTCtls( void ) { long li1; // Create the text control notebook m_oNbkTxtCtls.bCreate( this, ID_NBK_TXTCTRLS ); // Set the text control maximum lines m_poCfg->SetPath( wxT("/Main") ); m_poCfg->Read( wxT("NbkMaxLines"), &li1, TCTL_LINESDEF ); m_oNbkTxtCtls.bSetLinesMax( li1 ); // Set the precision of the results data m_poCfg->Read( wxT("Precision"), &li1, CNVTYPE_DFLT_FLTRES ); ConvertType::bSetFltRes( (int) li1 ); } //***************************************************************************** // Initialize the status bar. // // Note : The first field in the status bar has benn effectively disable by // setting it's width to near zero. It is not used since the frame // insists on writing text into this field as the user moves the mouse // over display controls. void FrmMain::InitStatBar( void ) { wxString os1; int ia1[ ePANE_LAST+1 ]; // Create the status bar CreateStatusBar( ePANE_LAST+1 ); // Disable the status bar pane used to display menu and toolbar help SetStatusBarPane( -1 ); // Determine the status bar field widths ia1[ ePANE_MESG ] = -1; // Variable width ia1[ ePANE_SIMR ] = 144; // Fixed width ia1[ ePANE_VIEW ] = 116; // Fixed width SetStatusWidths( ePANE_LAST+1, ia1 ); // Get the viewer application name from the configuration object m_poCfg->SetPath( wxT("/Viewer") ); m_poCfg->Read( wxT("Name"), &os1, CLP_GWAVE ); // Set status bar text SetStatusText( wxT(" Welcome message") , ePANE_MESG ); SetStatusText( wxT(" Simulator : None"), ePANE_SIMR ); SetStatusText( wxT(" Viewer : ") + os1 , ePANE_VIEW ); } //***************************************************************************** // Initialize the tool tips. void FrmMain::InitToolTips( void ) { long li1; // Define tool tips for each control m_oLbxNodes.SetToolTip( wxT("Test Nodes") ); m_oLbxCpnts.SetToolTip( wxT("Test Components") ); // Set global tool tip attributes m_poCfg->SetPath( wxT("/Main") ); m_poCfg->Read( wxT("ToolTips"), &li1, (long) 0 ); wxToolTip::Enable( li1 != 0 ? TRUE : FALSE ); wxToolTip::SetDelay( 700 ); } //***************************************************************************** // Set the electronic circuit simulator engine to use. void FrmMain::InitSimEng( void ) { // Delete any existing simulation engine notebook object if( m_poNbkSimEng != NULL ) { GetSizer( )->Detach( m_poNbkSimEng ); delete m_poNbkSimEng; m_poNbkSimEng = NULL; } // Delete any existing simulation engine process object if( m_poPrcSimEng != NULL ) { delete m_poPrcSimEng; m_poPrcSimEng = NULL; } // Create the new simulation engine objects and update the status text if( GetMenuBar( )->IsChecked( ID_MNU_NGSPICE ) ) { m_poNbkSimEng = new NbkNgSpice( this, ID_NBK_ANALYSIS ); m_poPrcSimEng = new PrcNgSpice( ); m_poSimn = &m_oSimnNgs; SetStatusText( wxT(" Simulator : NG-Spice"), ePANE_SIMR ); } else { m_poNbkSimEng = new NbkGnuCap( this, ID_NBK_ANALYSIS ); m_poPrcSimEng = new PrcGnuCap( ); m_poSimn = &m_oSimnGcp; SetStatusText( wxT(" Simulator : GNU-Cap"), ePANE_SIMR ); } } //***************************************************************************** // Initialize the log file names in the process objects. void FrmMain::InitLogFiles( void ) { wxFileName ofn1; wxString os1; // Check that a netlist file has been defined ofn1 = m_oFileTsks.rosGetNetLstFile( ); if( ! ofn1.IsOk( ) ) return; if( ! ofn1.FileExists( ) ) return; // Get the path to the schematic or netlist file os1 = ofn1.GetPath( ) + wxT("/gspiceui.log"); // Set the log file path for the gNetList process object m_oFileTsks.bSetLogFile( os1 ); // Set the log file path for the simulation process object if( m_poPrcSimEng != NULL ) m_poPrcSimEng->bSetLogFile( os1 ); } //***************************************************************************** // Initialize the frames position amd size. void FrmMain::InitPosnSize( void ) { int ix, iy, iw, ih; // Get the default position and size GetPosition( &ix, &iy ); GetClientSize( &iw, &ih ); // Get the position and size from the configuration object m_poCfg->SetPath( wxT("/Main") ); ix = m_poCfg->Read( wxT("PosnX"), 1 ); iy = m_poCfg->Read( wxT("PosnY"), iy ); iw = m_poCfg->Read( wxT("SizeW"), iw ); ih = m_poCfg->Read( wxT("SizeH"), ih+100 ); // (10/03/2011) ??? Is this line related to the main frame sizing problems when simr. engine changes? // Set the position and size Move( ix, iy ); SetClientSize( iw, ih ); } //***************************************************************************** // Layout the main frame display objects. void FrmMain::DoLayout( void ) { wxGridBagSizer * poSzr; wxGBPosition oGBPosn; wxGBSpan oGBSpan; int iFlags; int iBorder; size_t sz1; if( GetSizer( ) == NULL ) { // Create and set the frame's sizer (at startup) poSzr = new wxGridBagSizer( 1, 1 ); SetSizer( poSzr ); } else { // Detach the display objects from the sizer poSzr = (wxGridBagSizer *) GetSizer( ); poSzr->Detach( &m_oLblNodes ); poSzr->Detach( &m_oLbxNodes ); poSzr->Detach( &m_oLblCpnts ); poSzr->Detach( &m_oLbxCpnts ); poSzr->Detach( m_poNbkSimEng ); poSzr->Detach( &m_oNbkTxtCtls ); } iFlags = wxALL | wxALIGN_CENTER; iBorder = 9; // Add the nodes label oGBPosn.SetCol( 0 ); oGBPosn.SetRow( 0 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 1 ); poSzr->Add( &m_oLblNodes, oGBPosn, oGBSpan, iFlags, iBorder ); // Add the components label oGBPosn.SetCol( 1 ); oGBPosn.SetRow( 0 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 1 ); poSzr->Add( &m_oLblCpnts, oGBPosn, oGBSpan, iFlags, iBorder ); iFlags |= wxEXPAND; iBorder = 3; // Add the nodes list box oGBPosn.SetCol( 0 ); oGBPosn.SetRow( 1 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 19 ); poSzr->Add( &m_oLbxNodes, oGBPosn, oGBSpan, iFlags, iBorder ); // Add the components list box oGBPosn.SetCol( 1 ); oGBPosn.SetRow( 1 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 19 ); poSzr->Add( &m_oLbxCpnts, oGBPosn, oGBSpan, iFlags, iBorder ); // Add the simulator notebook oGBPosn.SetCol( 2 ); oGBPosn.SetRow( 0 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 13 ); poSzr->Add( m_poNbkSimEng, oGBPosn, oGBSpan, iFlags, iBorder ); #ifndef LAYOUT_MNGR // ??? poSzr->SetItemMinSize( m_poNbkSimEng, NBKSIMR_WIDTH, NBKSIMR_HEIGHT ); #endif // LAYOUT_MNGR // Add the console notebook oGBPosn.SetCol( 2 ); oGBPosn.SetRow( 13 ); oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 7 ); poSzr->Add( &m_oNbkTxtCtls, oGBPosn, oGBSpan, iFlags, iBorder ); // Specify how the sizer will grow when resized poSzr->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); poSzr->AddGrowableCol( 0 ); poSzr->AddGrowableCol( 1 ); for( sz1=13; sz1<20; sz1++ ) poSzr->AddGrowableRow( sz1 ); // Set minimum and initial sizes as calculated by the frame's sizer poSzr->SetSizeHints( this ); } //***************************************************************************** // Load information from the Simulation object attribute m_poSimn. // // Return Values : // TRUE - Success // FALSE - Failure bool FrmMain::bSimnLoad( void ) { TextCtrl * poTxtCtl; wxArrayString osa1; size_t sz1; // Load all the nodes (except ground) into the "Nodes" list box for( sz1=0; sz1m_osaNodeLbls.GetCount( ); sz1++ ) m_oLbxNodes.Append( m_poSimn->m_osaNodeLbls.Item( sz1 ) ); // Select the test nodes (if any have been specified) for( sz1=0; sz1rosaGetTstNodes( ).GetCount( ); sz1++ ) m_oLbxNodes.SetStringSelection( m_poSimn->rosaGetTstNodes( ).Item( sz1 ) ); // Load all 2-port components into the "Components" list box for( sz1=0; sz1m_oaCpnts.GetCount( ); sz1++ ) { const Component & roCpnt = m_poSimn->m_oaCpnts.Item( sz1 ); switch( roCpnt.m_eType ) // Only collect two terminal components { case eCPNT_SCJN : // Super-conductor Junction case eCPNT_CAP : // Capacitor case eCPNT_RES : // Resistor case eCPNT_ADM : // Admittance case eCPNT_IND : // Inductor case eCPNT_DIODE : // Diode case eCPNT_ICS : // Independent Current Source case eCPNT_IVS : break; // Independent Voltage Source default : continue; // Do nothing } osa1.Add( roCpnt.m_osName ); } osa1.Sort( &iStrCmpCpnt ); m_oLbxCpnts.InsertItems( osa1, 0 ); // Select the test components (if any have been specified) for( sz1=0; sz1rosaGetTstCpnts( ).GetCount( ); sz1++ ) m_oLbxCpnts.SetStringSelection( m_poSimn->rosaGetTstCpnts( ).Item( sz1 ) ); // Load the circuit description into the text control/s if( ! m_oNetLst.m_osaNetLst.IsEmpty( ) ) { // Load the circuit description into the NetList text control m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_NETLIST ); poTxtCtl = m_oNbkTxtCtls.poGetPage( ); poTxtCtl->bClear( ); for( sz1=0; sz1bAppendLine( m_oNetLst.m_osaNetLst.Item( sz1 ) ); m_oNbkTxtCtls.bSetPosn( 0 ); // Load the circuit description into the Simulation text control ??? 06/07/2011 // if( m_poSimn->bIsValid( ) ) // { // m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_SIMULTN ); // poTxtCtl = m_oNbkTxtCtls.poGetPage( ); // poTxtCtl->bClear( ); // for( sz1=0; sz1bAppendLine( m_oNetLst.m_osaNetLst.Item( sz1 ) ); // m_oNbkTxtCtls.bSetPosn( 0 ); // } } // Load the analysis notebook with simulation information if( ! m_poNbkSimEng->bLoad( *m_poSimn ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Reload information from the Simulation object attribute m_poSimn. // // Return Values : // TRUE - Success // FALSE - Failure bool FrmMain::bSimnReload( void ) { wxArrayString osaTstNodes; wxArrayString osaTstCpnts; size_t sz1; int i1; // Record the nodes that are currently selected #if wxCHECK_VERSION( 2,8,0 ) for( sz1=0; sz1bClrCmds( ); // Get an array of indicies to the currently selected test points m_oLbxNodes.GetSelections( oaiSelNodes ); m_oLbxCpnts.GetSelections( oaiSelCpnts ); // Load the test nodes into the simulation object for( sz1=0; sz1bAddTstNode( osSel ); } // Load the test components into the simulation object for( sz1=0; sz1bAddTstCpnt( osSel ); } // Transfer the simulation parameters into the simulation object if( ! m_poNbkSimEng->bSave( *m_poSimn ) ) return( FALSE ); // Create the simulation file if( ! m_poSimn->bSaveFile( ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** // Check that the electronic circuit simulator engine is present and accounted // for, if not display an error message. // // Argument List : // poPrcSimEng - The utility object to be tested // // Return Values : // TRUE - Success // FALSE - Failure bool FrmMain::bIsOkSimEng( PrcBase * poPrcSimEng ) { wxString os1; // Check that gnetlist exists and is accessible if( ! poPrcSimEng->bBinExists( ) ) { os1 << wxT("Can't find ") << poPrcSimEng->roGetBinary( ).GetFullName( ) << wxT(" which is required to run electronic simulation.\n") << wxT("There is no path to it or it has not been installed.\n\n"); DlgErrMsg( wxT("Configuration Fault"), os1 ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Check that the waveform viewer utility is present and accounted for, if not // display an error message. // // Argument List : // poPrcViewer - The utility object to be tested // // Return Values : // TRUE - Success // FALSE - Failure bool FrmMain::bIsOkViewer( PrcBase * poPrcViewer ) { wxString os1; // Check that the waveform viewer utility exists and is accessible if( ! poPrcViewer->bBinExists( ) ) { os1 << wxT("Can't find ") << poPrcViewer->roGetBinary( ).GetFullName( ) << wxT(" which is required to plot simulation results.\n") << wxT("There is no path to it or it has not been installed.\n\n"); DlgErrMsg( wxT("Configuration Fault"), os1 ); return( FALSE ); } return( TRUE ); } //***************************************************************************** // Clear the object attributes. bool FrmMain::bClear( void ) { bool bRtn = TRUE; // Clear all previously selected test points m_oLbxNodes.Clear( ); m_oLbxCpnts.Clear( ); // Clear simulation object attributes m_oSimnGcp.bClear( ); m_oSimnNgs.bClear( ); // Clear the simulation object and the analysis panels if( m_poNbkSimEng != NULL ) if( ! m_poNbkSimEng->bClear( ) ) bRtn = FALSE; // Clear the text controls if( ! m_oNbkTxtCtls.bClear( ) ) bRtn = FALSE; m_oNbkTxtCtls.bInitialize( ); // Terminate any simulation process if( m_poPrcSimEng != NULL ) if( ! m_poPrcSimEng->bKill( ) ) bRtn = FALSE; // Terminate any schematic editor process if( ! m_oPrc_gschem.bKill( ) ) bRtn = FALSE; // Terminate any waveform viewer process m_poCfg->SetPath( wxT("/Viewer") ); if( m_poCfg->Read( wxT("Name") ) == CLP_GWAVE ) { if( ! m_oPrc_gwave.bKill( ) ) bRtn = FALSE; } else { if( ! m_oPrc_gaw .bKill( ) ) bRtn = FALSE; } return( bRtn ); } //***************************************************************************** // Display a dialog box containing an error message. // // Note : At start-up the first error message is held over until the the main // GUI is created and displayed; to display this message call this // function with no arguments. // // Argument List : // rosTitle - The dialogue box title // rosMsg - The error message void FrmMain::DlgErrMsg( const wxString & rosTitle, const wxString & rosMsg ) { static wxMessageDialog * poDlgMsg=NULL; wxStringTokenizer ostk1; wxString os1, os2, os3; if( poDlgMsg == NULL ) { if( rosTitle.IsEmpty( ) || rosMsg.IsEmpty( ) ) return; // Tokenize the message into lines ostk1.SetString( rosMsg, wxT(" \n\r"), wxTOKEN_STRTOK ); // Use the first complete sentence as the status bar message os1 << wxT(" ERROR :"); while( ostk1.HasMoreTokens( ) ) { // Get the next line os2 = ostk1.GetNextToken( ).Strip( wxString::both ); // Remove the path from file names if( os2.Freq( wxT('/') ) > 1 ) { os3 << os2.AfterLast( wxT('/') ) << wxT(','); os2 = os3; } // Look for the end of the sentence if( os2==wxT('.') || os2==wxT(':') ) break; // Append the line to the message os1 << wxT(' ') << os2; } // If debug mode is enabled send the error message to the console if( g_bDebug ) std::cerr << "DEBUG : " << rosStrToLine( os1 ).mb_str( ) << "\n\n"; // Set the status line message SetStatusText( os1, ePANE_MESG ); // Create the error message dialog os1 = wxT('\n') + rosMsg; poDlgMsg = new wxMessageDialog( this, os1, rosTitle, wxOK | wxICON_ERROR ); } if( ! IsShown( ) ) return; // Display the error message dialog poDlgMsg->ShowModal( ); // Delete the error message dialog delete poDlgMsg; poDlgMsg = NULL; } //***************************************************************************** // * // Event Handlers * // * //***************************************************************************** // Open a circuit description file. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnOpen( wxCommandEvent & roEvtCmd ) { // Attempt to get a netlist file name from the user if( ! m_oFileTsks.bDlgOpen( ) ) return; ::wxBeginBusyCursor( ); // Change the cursor to the wait symbol bClear( ); // Clear the main frame object attributes // Attempt to open and read the netlist file m_oFileTsks.bOpen( ); bSimnLoad( ); // Load the simulation information InitLogFiles( ); // Initialize the process log files ::wxEndBusyCursor( ); // Change the cursor to the default } //***************************************************************************** // Import a schematic file using gnetlist to convert the schematic to a circuit // description. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnImport( wxCommandEvent & roEvtCmd ) { // Attempt to get the schematic file name/s from the user if( ! m_oFileTsks.bDlgImport( ) ) return; ::wxBeginBusyCursor( ); // Change the cursor to the wait symbol bClear( ); // Clear the main frame object attributes // Attempt to import the schematic file/s and read the netlist file m_oFileTsks.bImport( ); bSimnLoad( ); // Load the simulation information InitLogFiles( ); // Initialize the process log files ::wxEndBusyCursor( ); // Change the cursor to the default } //***************************************************************************** // Reload the schematic or netlist file. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnReload( wxCommandEvent & roEvtCmd ) { ::wxBeginBusyCursor( ); // Change the cursor to the wait symbol m_oFileTsks.bReload( ); // Reload schematic file/s or the netlist file bSimnReload( ); // Reload the simulation information ::wxEndBusyCursor( ); // Change the cursor to the default } //***************************************************************************** // Close the circuit description file. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnClose( wxCommandEvent & roEvtCmd ) { m_oFileTsks.bClose( ); // Delete temporary files bClear( ); // Clear the object attributes m_oFileTsks.bSetTitle( ); // Set the frame title m_poNbkSimEng->bSetPage( eCMD_ANA_FST ); // Display first analysis panel } //***************************************************************************** // Exit the application. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnAppExit( wxCommandEvent & roEvtCmd ) { Close( TRUE ); // Generates a wxCloseEvent which is handled by OnSysExit( ) } //***************************************************************************** // Create the simulation. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnSimCreate( wxCommandEvent & roEvtCmd ) { TextCtrl * poTxtCtl; wxString os1; ::wxBeginBusyCursor( ); // Change the cursor to the wait symbol if( ! m_oNetLst.m_osaNetLst.IsEmpty( ) ) { // Save the simualtion info. in the simulation object if( bSimnSave( ) ) { // Print the simulation to the simulation text control m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_SIMULTN ); poTxtCtl = m_oNbkTxtCtls.poGetPage( NbkTxtCtls::ePAGE_SIMULTN ); poTxtCtl->bLoadFile( m_poSimn->roGetSaveFile( ).GetFullPath( ) ); poTxtCtl->SetEditable( TRUE ); } else { if( ! m_poNbkSimEng->bIsOk( ) ) os1 = m_poNbkSimEng->rosGetErrMsg(); else if( ! m_poSimn->bIsValid( ) ) os1 = m_poSimn ->rosGetErrMsg(); else os1 = wxT("Unknown error."); DlgErrMsg( wxT("Create Simulation Error"), os1 ); } } else { // Display an error message dialogue os1 = wxT("There is no netlist loaded."); DlgErrMsg( wxT("Create Simulation Error"), os1 ); } ::wxEndBusyCursor( ); // Change the cursor to the default // Set the status line text if( os1.IsEmpty( ) ) os1 = wxT(" Simulation created successfully"); else os1 = wxT(" Error/s encountered creating simulation"); SetStatusText( os1, ePANE_MESG ); } //***************************************************************************** // Run the simulation. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnSimRun( wxCommandEvent & roEvtCmd ) { TextCtrl * poTxtCtl; NbkTxtCtls::ePageType ePage; wxFileName ofn1; wxString os1; // Check if a schematic or netlist file is currently open ofn1 = m_oFileTsks.rosGetNetLstFile( ); if( ofn1.GetFullPath( ).IsEmpty( ) ) { os1 = wxT("There is no schematic or netlist file currently loaded."); DlgErrMsg( wxT("Run Simulation Error"), os1 ); return; } ::wxBeginBusyCursor( ); // Change cursor to busy sym. GetMenuBar( )->Enable( ID_MNU_STOP, TRUE ); // Enable Stop option GetToolBar( )->EnableTool( ID_TBR_STOP, TRUE ); // Enable Stop tool //***************************************************************** // Prepare to run the simulation (and update the Simulation text page) poTxtCtl = m_oNbkTxtCtls.poGetPage( NbkTxtCtls::ePAGE_SIMULTN ); if( poTxtCtl->IsModified( ) ) { // Save the simulation in the text page to file, the user has modified it poTxtCtl->SaveFile( m_poSimn->roGetSaveFile( ).GetFullPath( ) ); } else if( bSimnSave( ) ) { // Load the simulation on file into the Simulation text page poTxtCtl->bLoadFile( m_poSimn->roGetSaveFile( ).GetFullPath( ) ); // poTxtCtl is saved immediately after loading to clear IsModified flag poTxtCtl->SaveFile( m_poSimn->roGetSaveFile( ).GetFullPath( ) ); // ??? 26/11/2008 The editable flag needs to set when there's a simulation // file loaded in the text control and cleared when it's // "empty". Is this the "right" place to do it tho.? poTxtCtl->SetEditable( TRUE ); } else { // There's been an error, report it to the user and return if( ! m_poNbkSimEng->bIsOk( ) ) os1 = m_poNbkSimEng->rosGetErrMsg( ); else if( ! m_poSimn->bIsValid( ) ) os1 = m_poSimn ->rosGetErrMsg( ); else os1 = wxT("Unknown error."); DlgErrMsg( wxT("Run Simulation Error"), os1 ); goto OnSimRun_Exit; } m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_SIMULTN ); //***************************************************************** // Run the simulation (and update the Console text page) m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_CONSOLE ); poTxtCtl = m_oNbkTxtCtls.poGetPage( NbkTxtCtls::ePAGE_CONSOLE ); poTxtCtl->bClear( ); // Clear the Console text page if( ! m_poPrcSimEng->bMakeArgLst( *m_poSimn ) ) { DlgErrMsg( wxT( "Run Simulation Error" ), m_poPrcSimEng->rosGetErrMsg( ) ); goto OnSimRun_Exit; } m_poPrcSimEng->PrintCmd( *poTxtCtl ); // Print simulator cmd to Console page SetStatusText( wxT(" Running the simulation ..."), ePANE_MESG ); if( ! m_poPrcSimEng->bExec( ) ) { DlgErrMsg( wxT( "Run Simulation Error" ), m_poPrcSimEng->rosGetErrMsg( ) ); goto OnSimRun_Exit; } if( GetStatusBar( )->GetStatusText( 1 ).Contains( wxT("aborted") ) ) { // Just exit ammediately if the user aborts the simulation goto OnSimRun_Exit; } m_poPrcSimEng->PrintRsp( *poTxtCtl ); // Print simulator output to Console page //***************************************************************** // Format the simulation results (and update the Results text page) SetStatusText( wxT(" Formatting the simulation results ..."), ePANE_MESG ); wxYield( ); if( ! m_poPrcSimEng->bFmtResults( ) ) { DlgErrMsg( wxT( "Run Simulation Error" ), m_poPrcSimEng->rosGetErrMsg( ) ); goto OnSimRun_Exit; } if( m_poNbkSimEng->eGetSimEng( ) == eSIMR_GNUCAP ) ePage = NbkTxtCtls::ePAGE_GNUCAP; else ePage = NbkTxtCtls::ePAGE_NGSPICE; poTxtCtl = m_oNbkTxtCtls.poGetPage( ePage ); os1 = m_poPrcSimEng->roGetResultsFile( ).GetFullPath( ); // Load the simulation output into the results text page if( ! poTxtCtl->bLoadFile( os1 ) ) { os1.Prepend( wxT("Couldn't load the results file : \n\n") ); DlgErrMsg( wxT( "Run Simulation Error" ), os1 ); goto OnSimRun_Exit; } m_oNbkTxtCtls.bSetPage( ePage ); // Change to the appropriate results page //***************************************************************** SetStatusText( wxT(" Simulation ran successfully"), ePANE_MESG ); OnSimRun_Exit: ::wxEndBusyCursor( ); // Change cursor to default GetMenuBar( )->Enable( ID_MNU_STOP, FALSE ); // Disable Stop option GetToolBar( )->EnableTool( ID_TBR_STOP, FALSE ); // Disable Stop tool } //***************************************************************************** // Stop the simulation. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnSimStop( wxCommandEvent & roEvtCmd ) { if( m_poPrcSimEng->bIsExec( ) ) { m_poPrcSimEng->bKill( ); SetStatusText( wxT(" Simulation aborted by user"), ePANE_MESG ); wxMessageDialog oMsgDlg( this, wxT("\nThe simulation has been aborted."), wxT("Run Simulation Event"), wxICON_INFORMATION ); oMsgDlg.ShowModal( ); GetMenuBar( )->Enable( ID_MNU_STOP, FALSE ); GetToolBar( )->EnableTool( ID_TBR_STOP, FALSE ); } } //***************************************************************************** // Edit / view the schematic file. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnSchematic( wxCommandEvent & roEvtCmd ) { wxString os1; // Check if the schematic editor process is already running if( m_oPrc_gschem.bIsExec( ) ) { os1 = wxT("The schematic editor process is already running."); DlgErrMsg( wxT("Schematic Editor Error"), os1 ); return; } // Check if a schematic file is currently set m_oPrc_gschem.bSetSchems( m_oFileTsks.rosaGetSchemFiles( ) ); if( m_oPrc_gschem.rosGetSchems( ).IsEmpty( ) ) { os1 = wxT("The netlist has no associated schematic file to edit."); DlgErrMsg( wxT("Schematic Editor Error"), os1 ); return; } // Execute the schematic editor process if( ! m_oPrc_gschem.bExec( ) ) // Something went wrong, display an error message DlgErrMsg( os1, m_oPrc_gschem.rosGetErrMsg( ) ); } //***************************************************************************** // View the simulation results. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnViewData( wxCommandEvent & roEvtCmd ) { wxFileName ofn1; wxString os1 = wxT("Plot Results Error"); wxString os2; // Check if the waveform viewer process is already running if( m_oPrc_gaw.bIsExec( ) || m_oPrc_gwave.bIsExec( ) ) { DlgErrMsg( os1, wxT("The waveform viewer process is already running.") ); return; } // Check if a schematic or netlist file is currently open ofn1 = m_oFileTsks.rosGetNetLstFile( ); if( ofn1.GetFullPath( ).IsEmpty( ) ) { DlgErrMsg( os1, wxT("There is no schematic or netlist file currently loaded.") ); return; } // Create the appropriate name for the results file os2 = ofn1.GetName( ); switch( m_poNbkSimEng->eGetSimEng( ) ) { case eSIMR_GNUCAP : if( m_oNbkTxtCtls.eGetPage( ) == NbkTxtCtls::ePAGE_NGSPICE ) os2 << wxT(".ngspice"); else os2 << wxT(".gnucap"); break; case eSIMR_NGSPICE : if( m_oNbkTxtCtls.eGetPage( ) == NbkTxtCtls::ePAGE_GNUCAP ) os2 << wxT(".gnucap"); else os2 << wxT(".ngspice"); break; default : return; } ofn1.SetName( os2 ); ofn1.SetExt( m_poNbkSimEng->rosGetPage( ) ); // Set the results file in the waveform viewer process if( ! ofn1.FileExists( ) ) { os2.Empty( ); os2 << wxT("The simulation results file :\n\n") << ofn1.GetFullPath( ) << wxT("\n\nhasn't yet been generated."); DlgErrMsg( os1, os2 ); return; } m_oPrc_gaw .bSetResults( ofn1.GetFullPath( ) ); m_oPrc_gwave.bSetResults( ofn1.GetFullPath( ) ); // Execute the waveform viewer process m_poCfg->SetPath( wxT("/Viewer") ); if( m_poCfg->Read( wxT("Name") ) == CLP_GWAVE ) { if( ! m_oPrc_gwave.bExec( ) ) DlgErrMsg( os1, m_oPrc_gwave.rosGetErrMsg( ) ); } else { if( ! m_oPrc_gaw.bExec( ) ) DlgErrMsg( os1, m_oPrc_gaw.rosGetErrMsg( ) ); } } //***************************************************************************** // Select which simulator to use. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnSelSimEng( wxCommandEvent & roEvtCmd ) { int iw, ih; // Temporarily store the current main frame size GetClientSize( &iw, &ih ); // Change cursor to the wait symbol and hide the GUI while re-constructing it ::wxBeginBusyCursor( ); Show( FALSE ); // Create and display a progress dialog wxProgressDialog oDlgProgress( wxT(" GNU Spice GUI"), wxT("Changing simulation engines ..."), 100, this, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH ); oDlgProgress.CenterOnParent( ); oDlgProgress.Update( 0 ); ::wxMilliSleep( 50 ); // Record the simulation engine change in the configuration file m_poCfg->SetPath( wxT("/Simulator") ); if( GetMenuBar( )->IsChecked( ID_MNU_GNUCAP ) ) m_poCfg->Write( wxT("Engine"), CLP_GNUCAP ); else m_poCfg->Write( wxT("Engine"), CLP_NGSPICE ); m_poCfg->Flush( ); // Write changes to the configuration file // Update the progress dialog oDlgProgress.Update( 10 ); // Change the simulator InitSimEng( ); // Update the progress dialog oDlgProgress.Update( 50 ); ::wxMilliSleep( 50 ); // Set the simulator process log file name InitLogFiles( ); // Update the progress dialog oDlgProgress.Update( 60 ); ::wxMilliSleep( 50 ); // Update the GUI components DoLayout( ); // Update the progress dialog oDlgProgress.Update( 70 ); ::wxMilliSleep( 50 ); // Transfer info. from one simulation object to the other if( ! m_oNetLst.bIsEmpty( ) ) { if( GetMenuBar( )->IsChecked( ID_MNU_GNUCAP ) ) m_oSimnGcp = m_oSimnNgs; else m_oSimnNgs = m_oSimnGcp; } // Update the progress dialog oDlgProgress.Update( 80 ); ::wxMilliSleep( 50 ); // Load the analysis notebook with the simulation values m_poNbkSimEng->bLoad( *m_poSimn ); // bSimnLoad( ); // Update the progress dialog oDlgProgress.Update( 90 ); ::wxMilliSleep( 50 ); // Restore the frame's original size SetClientSize( iw, ih ); // Update the progress dialog oDlgProgress.Update( 99 ); ::wxMilliSleep( 50 ); oDlgProgress.Update( 100 ); // Kill the progress dialog // Show the GUI again and change the cursor to the default Show( TRUE ); ::wxEndBusyCursor( ); } //***************************************************************************** // Show the application preferences dialog. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnPrefs( wxCommandEvent & roEvtCmd ) { DlgPrefs oDlgPrefs( this );; wxString os1; oDlgPrefs.CenterOnParent( ); oDlgPrefs.ShowModal( ); if( oDlgPrefs.GetReturnCode( ) == wxID_OK ) { // Set the waveform viewer os1 = wxT(" Viewer : ") + oDlgPrefs.rosGetViewer( ); SetStatusText( os1, ePANE_VIEW ); // Set the text control maximum lines m_oNbkTxtCtls.bSetLinesMax( oDlgPrefs.iGetNbkMaxLines( ) ); // Set the synchronize sweep sources flag PnlAnaBase::m_bSyncSwpSrcs = oDlgPrefs.bGetSyncSwpSrcs( ); } } //***************************************************************************** // Display the gSpiceUI user manual. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnManUser( wxCommandEvent & roEvtCmd ) { m_oHelpTsks.ManUser( ); } //***************************************************************************** // Display about message dialog. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnAbout( wxCommandEvent & roEvtCmd ) { m_oHelpTsks.About( ); } //***************************************************************************** // Change the cursor when a simulation is running and the mouse is over the // stop button. // // Argument List : // roEvtCmd - The event to be processed void FrmMain::OnToolEnter( wxCommandEvent & roEvtCmd ) { if( roEvtCmd.GetSelection( ) == ID_TBR_STOP ) { if( m_poPrcSimEng->bIsExec( ) && ::wxIsBusy( ) ) { ::wxEndBusyCursor( ); // Change the cursor to the default ::wxYield( ); // Allow the display to update } } else { if( m_poPrcSimEng->bIsExec( ) && !::wxIsBusy( ) ) { ::wxBeginBusyCursor( ); // Change the cursor to the hour glass ::wxYield( ); // Allow the display to update } } } //***************************************************************************** // Event handler for system close. // // Argument List : // roEvtClose - The event to be processed void FrmMain::OnSysExit( wxCloseEvent & roEvtClose ) { wxString os1; int ix, iy, iw, ih; bClear( ); // Kill any processes currently running m_oFileTsks.bExit( ); // Delete temporary files Hide( ); // Hide the main frame while exiting // Save the frame size and position m_poCfg->SetPath( wxT("/Main") ); GetClientSize( &iw, &ih ); GetPosition( &ix, &iy ); m_poCfg->Write( wxT("PosnX"), (long) ix ); m_poCfg->Write( wxT("PosnY"), (long) iy ); m_poCfg->Write( wxT("SizeW"), (long) iw ); m_poCfg->Write( wxT("SizeH"), (long) ih ); m_poCfg->Flush( ); // Record the simulation engine currently selected m_poCfg->SetPath( wxT("/Simulator") ); os1 = m_poPrcSimEng->eGetSimEng( )==eSIMR_GNUCAP ? CLP_GNUCAP : CLP_NGSPICE; m_poCfg->Write( wxT("Engine"), os1 ); // Record the analysis type last used os1 = m_poNbkSimEng->rosGetPage( ); m_poCfg->Write( wxT("Analysis"), os1.Upper( ) ); // Record the waveform veiwer currently selected m_poCfg->SetPath( wxT("/Viewer") ); if( m_poCfg->Read( wxT("Name") ).IsEmpty( ) ) m_poCfg->Write( wxT("Name"), CLP_GWAVE ); m_bIsOpen = FALSE; // Indicate that the main frame has been closed // Destroys the window safely (used instead of the delete operator) Destroy( ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/main/NbkTxtCtls.hpp0000644000000000000000000000542411603101707017302 0ustar rootroot//***************************************************************************** // NbkTxtCtls.hpp * // ---------------- * // Description : This class extends wxNotebook, it contains all text control * // objects which appear at the bottom of the GUI. * // Started : 14/06/2005 * // Last Update : 28/10/2008 * // Copyright : (C) 2005 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef NBKTXTCTLS_HPP #define NBKTXTCTLS_HPP // wxWidgets Includes #include #include // System Includes // Application Includes #include "utility/TextCtrl.hpp" // Local Constant Declarations //***************************************************************************** class NbkTxtCtls : public wxNotebook { public : // The various page identifiers enum ePageType { ePAGE_CONSOLE = 0, ePAGE_NETLIST, ePAGE_SIMULTN, ePAGE_GNUCAP, ePAGE_NGSPICE, ePAGE_ALL, ePAGE_CURRENT, ePAGE_NONE, ePAGE_FST = ePAGE_CONSOLE, ePAGE_LST = ePAGE_NGSPICE }; NbkTxtCtls( void ); ~NbkTxtCtls( ); bool bCreate( wxWindow * poWin, wxWindowID oWinID ); bool bIsCreated( void ) { return( GetParent( )!=NULL ? TRUE : FALSE ); } bool bClear ( ePageType ePage=ePAGE_ALL ); bool bInitialize( ePageType ePage=ePAGE_ALL ); bool bSetPage( ePageType ePage ); bool bSetPosn( long liPosn ); ePageType eGetPage( void ); TextCtrl * poGetPage( ePageType ePage=ePAGE_CURRENT ); bool bSetLinesMax( int iLines ) { return( TextCtrl::bSetLinesMax( iLines ) ); } bool bSetLinesDsp( int iLines ) { return( TextCtrl::bSetLinesDsp( iLines ) ); } }; //***************************************************************************** #endif // NBKTXTCTLS_HPP gspiceui-1.0.00+dfsg/src/main/FileTasks.cpp0000644000000000000000000005513511626542273017142 0ustar rootroot//***************************************************************************** // FileTasks.cpp * // --------------- * // Started : 28/05/2005 * // Last Update : 29/08/2011 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "main/FileTasks.hpp" #include "main/FrmMain.hpp" //***************************************************************************** // Constructor. // // Argument List : // poFrmMain - A pointer to the parent frame FileTasks::FileTasks( FrmMain * poFrmMain ) { // Set the pointer to the parent frame m_poFrmMain = poFrmMain; // Get the global configuration object m_poCfg = (wxConfig *) wxConfig::Get( ); } //***************************************************************************** // Destructor. FileTasks::~FileTasks( ) { } //***************************************************************************** // Execute the schematic import process. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bExecImport( void ) { bool bRtn; TextCtrl * poTxtCtl; // Display the console page m_poFrmMain->m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_CONSOLE ); // Convert the schematic file/s to a netlist file bRtn = m_oPrcGNetList.bExec( ); // Print the results poTxtCtl = m_poFrmMain->m_oNbkTxtCtls.poGetPage( ); m_oPrcGNetList.Print( *poTxtCtl ); // Check for errors in the gnetlist output if( poTxtCtl->GetValue( ).Contains( wxT("ERROR") ) ) bRtn = FALSE; if( poTxtCtl->GetValue( ).Contains( wxT("Backtrace") ) ) bRtn = FALSE; // Delete the process log file m_oPrcGNetList.bDelLogFile( ); return( bRtn ); } //***************************************************************************** // Initialize the Guile procedure name to be used by gnetlist when importing // schematic files. void FileTasks::InitGuileProc( void ) { wxString os1; // Set the Guile procedure name m_poCfg->SetPath( wxT("/gnetlist") ); os1 = m_poCfg->Read( wxT("GuileProc"), wxT("spice-sdb") ); bSetGuileProc( os1 ); } //***************************************************************************** // Initialize the schematic file name/s. void FileTasks::InitSchemFiles( void ) { wxString os1; // Get the schematic file name/s m_poCfg->SetPath( wxT("/Files") ); os1 = m_poCfg->Read( wxT("Schematics"), wxT("") ); if( os1.IsEmpty( ) ) return; // Set the schematic file name/s if( ! bSetSchemFiles( os1 ) ) return; // Return if a netlist file has also been specified os1 = m_poCfg->Read( wxT("NetList"), wxT("") ); if( ! os1.IsEmpty( ) ) return; // Import the schematic file/s bImport( ); } //***************************************************************************** // Initialize the netlist file name. void FileTasks::InitNetLstFile( void ) { wxString os1; // Return if a netlist file has already been loaded if( ! m_poFrmMain->m_oNetLst.bIsEmpty( ) ) return; // Get the netlist file name m_poCfg->SetPath( wxT("/Files") ); os1 = m_poCfg->Read( wxT("NetList"), wxT("") ); if( os1.IsEmpty( ) ) return; // Set the netlist file name if( ! bSetNetLstFile( os1 ) ) return; // Open the netlist file bOpen( ); // Does the netlist file contain simulator specific information? m_poCfg->SetPath( wxT("/Simulator") ); if( m_poFrmMain->m_oSimnNgs.m_oCmdPR.bIsValid( ) ) { m_poCfg->Write( wxT("Engine"), CLP_NGSPICE ); m_poFrmMain->m_oSimnGcp = m_poFrmMain->m_oSimnNgs; } else if( m_poFrmMain->m_oSimnGcp.m_oCmdPR.bIsValid( ) ) { m_poCfg->Write( wxT("Engine"), CLP_GNUCAP ); m_poFrmMain->m_oSimnNgs = m_poFrmMain->m_oSimnGcp; } } //***************************************************************************** // Display a error message dialog when schematic file/s can't be imported. void FileTasks::DlgErrSchems( void ) { wxString os1, os2, os3; size_t sz1; for( sz1=0; sz1 1 ) os3 = wxT("s were"); else os3 = wxT(" was"); os1 << wxT("The schematic file") << os3 << wxT("n't converted to a netlist correctly :\n") << wxT("\n") << os2 << wxT("\n") << wxT("(This is usually because gnetlist encountered problems/s while\n") << wxT("attempting to convert the schematic file/s to a netlist. Try\n") << wxT("examining the Console output to determine where the problem/s\n") << wxT("occurred.)\n"); m_poFrmMain->DlgErrMsg( wxT("Import Schematic/s Error"), os1 ); } //***************************************************************************** // Display a error message dialog when a netlist file can't be loaded. void FileTasks::DlgErrNetLst( void ) { wxString os1; os1 << wxT("The netlist file wasn't loaded correctly :\n") << wxT("\n") << wxT(" ") << m_oPrcGNetList.roGetNetLstFile().GetFullPath() << wxT('\n') << wxT("\n") << wxT("(This is often because the file is in-complete, empty or\n") << wxT("doesn't exist.)\n"); m_poFrmMain->DlgErrMsg( wxT("Load Netlist Error"), os1 ); } //***************************************************************************** // Do initialization tasks. void FileTasks::Initialize( void ) { InitGuileProc ( ); InitSchemFiles( ); InitNetLstFile( ); } //***************************************************************************** // Check that the gnetlist binary can be found, if not display an error // message. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bIsOk_gnetlist( void ) { wxString os1; // Check that gnetlist exists and is accessible if( ! m_oPrcGNetList.bBinExists( ) ) { if( m_poFrmMain != NULL ) { os1 << wxT("Can't find ") << m_oPrcGNetList.roGetBinary( ).GetFullName( ) << wxT(" which is required to import schematic\nfile/s. ") << wxT("The path is unknown or it hasn't been installed.\n"); m_poFrmMain->DlgErrMsg( wxT("Configuration Fault"), os1 ); } return( FALSE ); } return( TRUE ); } //***************************************************************************** // Set the application main frame title. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bSetTitle( void ) { wxFileName ofn1; wxString os1; if( m_poFrmMain == NULL ) return( FALSE ); // Create the title line os1 << wxT(" ") << APP_NAME; if( ! rosGetNetLstFile( ).IsEmpty( ) ) { ofn1 = rosGetNetLstFile( ); if( ! ofn1.IsAbsolute( ) ) ofn1.MakeAbsolute( ); if( ofn1.GetFullPath( ).StartsWith( ofn1.GetHomeDir( ) ) ) ofn1.MakeRelativeTo( ofn1.GetHomeDir( ) ); os1 << wxT(" - "); if( ! ofn1.IsAbsolute( ) ) os1 << wxT("~/"); os1 << ofn1.GetFullPath( ); } // Set the main frames title line m_poFrmMain->wxFrame::SetTitle( os1 ); return( TRUE ); } //***************************************************************************** // Set a Guile procedure name to be used for importing schematic files using // gNetList. // // Argument List : // rosPName - The Guile procedure name // (Refer to gNetList documentation for list of procedure names) bool FileTasks::bSetGuileProc( const wxString & rosPName ) { if( ! m_oPrcGNetList.bSetGuileProc( rosPName ) ) return( FALSE ); // Record the Guile procedure name currently selected m_poCfg->SetPath( wxT("/gNetList") ); m_poCfg->Write( wxT("GuileProc"), rosGetGuileProc( ) ); // Write any changes to the configuration file m_poCfg->Flush( ); return( TRUE ); } //***************************************************************************** // Set the schematic file name/s. // // Argument List : // rosFNames - A string containing the full path and file name/s // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bSetSchemFiles( const wxString & rosFNames ) { // Attempt to set the schematic file name/s in the gNetList process object if( ! m_oPrcGNetList.bSetSchemFiles( rosFNames ) ) return( FALSE ); // Set the schematic file name/s if( m_poFrmMain != NULL ) m_poFrmMain->m_oNetLst.bSetSchemFiles( rosFNames ); // Record the schematic file name/s in the configuration object m_poCfg->SetPath( wxT("/Files") ); m_poCfg->Write( wxT("Schematics"), rosFNames ); m_poCfg->Flush( ); return( TRUE ); } //***************************************************************************** // Set the netlist file name. // // Argument List : // psFileName - A string containing the full path and file name // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bSetNetLstFile( const wxString & rosFName ) { // Attempt to set the netlist file name in the gNetList process object if( ! m_oPrcGNetList.bSetNetLstFile( rosFName ) ) return( FALSE ); // Configure stuff in the main frame if( m_poFrmMain != NULL ) { m_poFrmMain->m_oNetLst.bSetLoadFile( rosFName ); // Set load file path m_poFrmMain->m_oNetLst.bSetSaveFile( rosFName ); // Set save file path } // Record the netlist file name in the configuration object m_poCfg->SetPath( wxT("/Files") ); m_poCfg->Write( wxT("NetList"), rosGetNetLstFile( ) ); m_poCfg->Flush( ); return( TRUE ); } //***************************************************************************** // Get the currently selected Guile procedure. // // Return Values : // The currently selected Guile procedure const wxString & FileTasks::rosGetGuileProc( void ) { return( m_oPrcGNetList.rosGetGuileProc( ) ); } //***************************************************************************** // Get an array containing the schematic file name/s. // // Return Values : // An array of schematic file names const wxArrayString & FileTasks::rosaGetSchemFiles( void ) { static wxArrayString osa1; wxString os1; size_t szt1; osa1.Clear( ); for( szt1=0; szt1SetPath( wxT("/Directories") ); os2 = m_poCfg->Read( wxT("LastAccess"), wxGetHomeDir( ) ); // Set the style bit pattern #if wxCHECK_VERSION( 2,8,0 ) li1 = wxFD_OPEN | wxFD_CHANGE_DIR | wxFD_FILE_MUST_EXIST; #else li1 = wxOPEN | wxCHANGE_DIR | wxFILE_MUST_EXIST; #endif // Create and configure the file open dialog poDlgOpen = new wxFileDialog( m_poFrmMain, wxT(""), wxT(""), wxT(""), wxT(""), li1 ); poDlgOpen->SetMessage( wxT("Open a Circuit Description File") ); poDlgOpen->SetWildcard( os1 ); poDlgOpen->SetFilterIndex( 1 ); poDlgOpen->SetDirectory( os2 ); // Display file open dialog if( poDlgOpen->ShowModal( ) != wxID_OK ) return( FALSE ); // Delete temporary files bDelTmpFiles( ); // Set the netlist file name os1 = poDlgOpen->GetPath( ); if( ! bSetNetLstFile( os1 ) ) return( FALSE ); // Set the path last accessed in the global configuration object m_poCfg->SetPath( wxT("/Directories") ); m_poCfg->Write( wxT("LastAccess"), poDlgOpen->GetDirectory( ) ); m_poCfg->Flush( ); return( TRUE ); } //***************************************************************************** // Display an import file/s dialog and set the schematic file name/s. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bDlgImport( void ) { wxFileDialog * poDlgImport; wxArrayString osa1; wxString os1, os2; long li1; size_t sz1; // Can't display dialogue unless the application main frame has been created if( m_poFrmMain == NULL ) return( FALSE ); // Create the different file filters os1 << wxT("gSchem files (*.sch)|*.sch|") << wxT("Protel II files (*.\?\?\?)|*.\?\?\?"); // Get the file path from the global configuration object m_poCfg->SetPath( wxT("/Directories") ); os2 = m_poCfg->Read( wxT("LastAccess"), wxGetHomeDir( ) ); // Set the style bit pattern #if wxCHECK_VERSION( 2,8,0 ) li1 = wxFD_OPEN | wxFD_CHANGE_DIR | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST; #else li1 = wxOPEN | wxCHANGE_DIR | wxMULTIPLE | wxFILE_MUST_EXIST; #endif // Create and configure the file import dialog poDlgImport = new wxFileDialog( m_poFrmMain, wxT(""), wxT(""), wxT(""), wxT(""), li1 ); poDlgImport->SetMessage( wxT("Import a Schematic File/s") ); poDlgImport->SetWildcard( os1 ); poDlgImport->SetFilterIndex( 0 ); poDlgImport->SetDirectory( os2 ); // Display file import dialog if( poDlgImport->ShowModal( ) != wxID_OK ) return( FALSE ); // Delete temporary files bDelTmpFiles( ); // Set the guile procedure name bSetGuileProc( wxT("spice-sdb") ); // Set the schematic file name/s poDlgImport->GetPaths( osa1 ); os1 = osa1.Item( 0 ); for( sz1=1; sz1SetPath( wxT("/Directories") ); m_poCfg->Write( wxT("LastAccess"), poDlgImport->GetDirectory( ) ); m_poCfg->Flush( ); return( TRUE ); } //***************************************************************************** // Delete temporary files which may have been generated by this application. // Ie. given the circuit description file ".ckt" delete files of the // following form : // .ngspice.dc, .ngspice.ac, ... etc. // .gnucap.op, .gnucap.dc, .... etc. // gnetlist.log bool FileTasks::bDelTmpFiles( void ) { wxArrayString osa1; wxFileName ofn1; wxString os1, os2; long liTmpFileMgt; int i1; // Determine the current temporary file management strategy m_poCfg->SetPath( wxT("/Main") ); m_poCfg->Read( wxT("TmpFileMgt"), &liTmpFileMgt, (long) eTFMS_DELETE ); // Return if nothing needs to be done if( liTmpFileMgt == (long) eTFMS_KEEP ) return( TRUE ); // Get the path to the schematic or circuit description file ofn1 = m_oPrcGNetList.roGetNetLstFile( ); ofn1.Normalize( ); if( !ofn1.IsOk( ) || !ofn1.FileExists( ) ) return( FALSE ); // Look for the gnetlist log file os1 = ofn1.GetPath( ) + wxT("/gnetlist.log"); if( wxFileExists( os1 ) ) osa1.Add( os1 ); // Look for files containing simulation results os1 = ofn1.GetName( ); i1 = os1.Find( wxT(".gspiceui") ); if( i1 > 0 ) os1 = os1.Truncate( (size_t) i1 ); ofn1.SetFullName( os1 ); // Look for any GNU-Cap results file os1 = ofn1.GetFullPath( ) + wxT(".gnucap.??"); for( os2=wxFindFirstFile( os1 ); !os2.IsEmpty( ); os2=wxFindNextFile( ) ) osa1.Add( os2 ); // Look for any NG-Spice results files os1 = ofn1.GetFullPath( ) + wxT(".ngspice.??"); for( os2=wxFindFirstFile( os1 ); !os2.IsEmpty( ); os2=wxFindNextFile( ) ) osa1.Add( os2 ); // If necessary prompt the user for permission to delete temporary files if( osa1.GetCount( ) > 0 ) { if( m_poFrmMain!=NULL && m_poFrmMain->IsShown( ) ) { // Prompt the user if( liTmpFileMgt == (long) eTFMS_PROMPT ) { os1 = wxT("Delete Temporary Files"); os2 = wxT("\nDelete the following temporary files :\n\n"); for( i1=0; i1<(int)osa1.GetCount( ); i1++ ) os2 << wxT(" ") << osa1.Item( i1 ) << wxT(" \n"); i1 = wxMessageBox( os2, os1, wxYES_NO|wxICON_QUESTION, m_poFrmMain ); } else i1 = wxYES; // Delete the temporary files if( i1 == wxYES ) for( i1=0; i1<(int)osa1.GetCount( ); i1++ ) wxRemoveFile( osa1.Item( i1 ) ); } } return( TRUE ); } //***************************************************************************** // Open and load a circuit description (netlist) file into the m_poFrmMain // attribute's simulation objects. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bOpen( void ) { bool bRtn=TRUE; // Attempt to load the circuit description file if( m_poFrmMain->m_oSimnNgs.bLoadFile( ) ) m_poFrmMain->m_oSimnGcp = m_poFrmMain->m_oSimnNgs; else if( m_poFrmMain->m_oSimnGcp.bLoadFile( ) ) m_poFrmMain->m_oSimnNgs = m_poFrmMain->m_oSimnGcp; // Check for problems if( ! m_poFrmMain->m_oNetLst.bIsValid( ) ) { DlgErrNetLst( ); m_poFrmMain->m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_NETLIST ); bRtn = FALSE; } else m_poFrmMain->SetStatusText( wxT(" Netlist file opened successfully"), FrmMain::ePANE_MESG ); // Set the main frame title and the schematic file name/s if supplied bSetTitle( ); bSetSchemFiles( m_poFrmMain->m_oNetLst.rosGetSchemFiles( ) ); return( bRtn ); } //***************************************************************************** // Import a schematic file by converting it to a netlist using gNetList and // then loading it into the FrmMain simulation object. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bImport( void ) { bool bRtn=TRUE; // Check that gNetList binary exists and is accessible if( ! bIsOk_gnetlist( ) ) return( FALSE ); // Convert the schematic file/s to a netlist file and load it if( bExecImport( ) ) { bSetNetLstFile( m_oPrcGNetList.roGetNetLstFile( ).GetFullPath( ) ); m_poFrmMain->m_oSimnNgs.bLoadFile( ); m_poFrmMain->m_oSimnGcp.bLoadFile( ); if( m_poFrmMain->m_oNetLst.bIsValid( ) ) m_poFrmMain->SetStatusText( wxT(" Schematic file/s imported successfully"), FrmMain::ePANE_MESG ); else { DlgErrNetLst( ); m_poFrmMain->m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_NETLIST ); bRtn = FALSE; } } else { DlgErrSchems( ); m_poFrmMain->m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_CONSOLE ); m_poFrmMain->m_oNbkTxtCtls.bSetPosn( -1 ); bRtn = FALSE; } // Set the main frame title bSetTitle( ); return( bRtn ); } //***************************************************************************** // Reload a simulation object whether it be from a schematic or netlist file. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bReload( void ) { bool bRtn; // Re-initialize the text control notebook m_poFrmMain->m_oNbkTxtCtls.bInitialize( ); // Attempt to perform the reload operation if( ! m_oPrcGNetList.roaGetSchemFiles( ).IsEmpty( ) ) { // Reload schematic file/s bRtn = bImport( ); if( bRtn ) m_poFrmMain->SetStatusText( wxT(" Schematic file/s re-imported successfully"), FrmMain::ePANE_MESG ); } else if( m_oPrcGNetList.roGetNetLstFile( ).IsOk( ) ) { // Reload a netlist file bRtn = bOpen( ); if( bRtn ) m_poFrmMain->SetStatusText( wxT(" Netlist file reloaded successfully"), FrmMain::ePANE_MESG ); } else { // There's no open schematic or netlist to reload, display an error message m_poFrmMain->DlgErrMsg( wxT("Reload Operation Error"), wxT("No file is currently open.") ); bRtn = FALSE; } return( bRtn ); } //***************************************************************************** // Close the circuit description file. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bClose( void ) { // Is there a file currently open? if( m_oPrcGNetList.roaGetSchemFiles( ).IsEmpty( ) && ! m_oPrcGNetList.roGetNetLstFile( ).IsOk( ) ) { // There's no open schematic or netlist to close, display an error message m_poFrmMain->DlgErrMsg( wxT("Close Operation Error"), wxT("No file is currently open.") ); return( FALSE ); } // Delete temporary files bDelTmpFiles( ); // Clear file names m_oPrcGNetList.bClear( ); bSetNetLstFile( wxT("") ); bSetSchemFiles( wxT("") ); // Set the status bar message m_poFrmMain->SetStatusText( wxT(" Netlist file closed successfully"), FrmMain::ePANE_MESG ); // Set the text control notebook page m_poFrmMain->m_oNbkTxtCtls.bSetPage( NbkTxtCtls::ePAGE_CONSOLE ); return( TRUE ); } //***************************************************************************** // Do the necessary tasks before the application exits. // // Return Values : // TRUE - Success // FALSE - Failure bool FileTasks::bExit( void ) { // Delete temporary file/s if( ! bDelTmpFiles( ) ) return( FALSE ); return( TRUE ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/main/DlgPrefs.cpp0000644000000000000000000003306611625175457016767 0ustar rootroot//***************************************************************************** // DlgPrefs.cpp * // -------------- * // Started : 17/10/2006 * // Last Update : 25/08/2011 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "main/DlgPrefs.hpp" //***************************************************************************** // Implement an event table. BEGIN_EVENT_TABLE( DlgPrefs, wxDialog ) EVT_BUTTON( ID_BTN_OK, DlgPrefs::OnBtnOk ) EVT_BUTTON( ID_BTN_CANCEL, DlgPrefs::OnBtnCancel ) END_EVENT_TABLE( ) //***************************************************************************** // Constructor. // // Argument List: // poWin - A pointer to the dialog parent window DlgPrefs::DlgPrefs( wxWindow * poWin ) : wxDialog( poWin, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, wxDialogNameStr ) { // Get the global configuration object m_poCfg = (wxConfig *) wxConfig::Get( ); // Construct the display objects Initialize( ); // Clear object attributes bClear( ); } //***************************************************************************** // Destructor. DlgPrefs::~DlgPrefs( ) { } //***************************************************************************** // Initialize object attributes. void DlgPrefs::Initialize( void ) { SetTitle( wxT(" Preferences") ); // Call all the initialization functions Create( ); ToolTips( ); // Layout the of the display objects DoLayout( ); } //***************************************************************************** // Create the display objects. void DlgPrefs::Create( void ) { wxPanel * poPnlPrefs, * poPnl1; // Create the preferences panel poPnlPrefs = new wxPanel( this ); // Create the waveform viewer panel and controls poPnl1 = new wxPanel( poPnlPrefs ); m_oLblViewer.Create( poPnl1, ID_UNUSED, wxT("Waveform viewer"), wxDefaultPosition, wxSize( 140, -1 ), wxST_NO_AUTORESIZE ); m_oChoViewer.Create( poPnl1, ID_CHO_VIEWER, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoViewer.Append( CLP_GWAVE ); m_oChoViewer.Append( CLP_GAW ); m_oChoViewer.SetSelection( 0 ); m_oChoViewer.SetBackgroundColour( poPnl1->GetBackgroundColour( ) ); // Create the temporary file management strategy panel and controls poPnl1 = new wxPanel( poPnlPrefs ); m_oLblTmpFileMgt.Create( poPnl1, ID_UNUSED, wxT("Temporary files"), wxDefaultPosition, wxSize( 140, -1 ), wxST_NO_AUTORESIZE ); m_oChoTmpFileMgt.Create( poPnl1, ID_CHO_TMPFILEMGT, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoTmpFileMgt.Append( wxT("Delete") ); m_oChoTmpFileMgt.Append( wxT("Prompt") ); m_oChoTmpFileMgt.Append( wxT("Keep") ); m_oChoTmpFileMgt.SetSelection( 0 ); // Create the results precision controls poPnl1 = new wxPanel( poPnlPrefs ); m_oLblPrecision.Create( poPnl1, ID_UNUSED, wxT("Results precision"), wxDefaultPosition, wxSize( 140, -1 ), wxST_NO_AUTORESIZE ); m_oChoPrecision.Create( poPnl1, ID_CHO_PRECISION, wxDefaultPosition, wxSize( 95, -1 ) ); m_oChoPrecision.Append( wxT("%3.1E") ); m_oChoPrecision.Append( wxT("%4.2E") ); m_oChoPrecision.Append( wxT("%5.3E") ); m_oChoPrecision.Append( wxT("%6.4E") ); m_oChoPrecision.Append( wxT("%7.5E") ); m_oChoPrecision.Append( wxT("%8.6E") ); m_oChoPrecision.SetSelection( 0 ); // Create the PnlValue controls m_oPnlNbkMaxLines.bCreate( poPnlPrefs, ID_PNL_NBKMAXLINES, 135, wxDefaultPosition, FALSE ); m_oPnlNbkMaxLines.bSetName( wxT("Max text control lines") ); m_oPnlNbkMaxLines.bSetVarType( eVAR_INT ); m_oPnlNbkMaxLines.bShowUnits( FALSE ); m_oPnlNbkMaxLines.bSetParms( TCTL_LINESDEF, TCTL_LINESMIN, TCTL_LINESMAX ); // Create the synchronize sweep sources check box poPnl1 = new wxPanel( poPnlPrefs ); m_oCbxSyncSwpSrcs.Create( poPnl1, ID_CBX_SYNCSWPSRCS, wxT("Sync sweep sources \t"), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); // Create the tool tips check box poPnl1 = new wxPanel( poPnlPrefs ); m_oCbxToolTips.Create( poPnl1, ID_CBX_TOOLTIPS, wxT("Show tool tips \t\t\t"), wxDefaultPosition, wxSize( -1, PNLVALUE_HT ), wxALIGN_RIGHT ); // Create the buttons poPnl1 = new wxPanel( this ); m_oBtnOk .Create( poPnl1, ID_BTN_OK, wxT("OK") ); m_oBtnCancel.Create( poPnl1, ID_BTN_CANCEL, wxT("Cancel") ); } //***************************************************************************** // Initialize the tool tips. void DlgPrefs::ToolTips( void ) { wxString os1; os1 = wxT("Select the waveform viewing utility"); m_oChoViewer .GetParent( )->SetToolTip( os1 ); os1 = wxT("The temporary file management strategy to be used"); m_oChoTmpFileMgt.GetParent( )->SetToolTip( os1 ); os1 = wxT("Select the precision of the analysis result"); m_oChoPrecision .GetParent( )->SetToolTip( os1 ); os1 = wxT("The maximum number of lines which may be displayed in a text control"); m_oPnlNbkMaxLines .SetToolTip( os1 ); os1 = wxT("Enable or disable synchronization of sweep sources"); m_oCbxSyncSwpSrcs .SetToolTip( os1 ); os1 = wxT("Enable or disable tool tips"); m_oCbxToolTips .SetToolTip( os1 ); } //***************************************************************************** // Layout the display objects within the dialog. void DlgPrefs::DoLayout( void ) { wxBoxSizer * poSzrDlg; wxPanel * poPnlPrefs, * poPnlBtns; wxPanel * poPnlViewer, * poPnlTmpFileMgt, * poPnlPrecision, * poPnlSyncSwpSrcs, * poPnlToolTips; wxBoxSizer * poSzrPrefs, * poSzrBtns; wxBoxSizer * poSzrViewer, * poSzrTmpFileMgt, * poSzrPrecision, * poSzrSyncSwpSrcs, * poSzrToolTips; wxSizerFlags oFlags; // Get pointers to the various panels poPnlPrefs = (wxPanel *) m_oPnlNbkMaxLines.GetParent( ); poPnlBtns = (wxPanel *) m_oBtnOk .GetParent( ); poPnlViewer = (wxPanel *) m_oChoViewer .GetParent( ); poPnlTmpFileMgt = (wxPanel *) m_oChoTmpFileMgt .GetParent( ); poPnlPrecision = (wxPanel *) m_oChoPrecision .GetParent( ); poPnlSyncSwpSrcs = (wxPanel *) m_oCbxSyncSwpSrcs.GetParent( ); poPnlToolTips = (wxPanel *) m_oCbxToolTips .GetParent( ); // Create sizers to associate with the panels poSzrDlg = new wxBoxSizer ( wxVERTICAL ); poSzrPrefs = new wxStaticBoxSizer( wxVERTICAL, poPnlPrefs ); poSzrBtns = new wxBoxSizer ( wxHORIZONTAL ); poSzrViewer = new wxBoxSizer ( wxHORIZONTAL ); poSzrTmpFileMgt = new wxBoxSizer ( wxHORIZONTAL ); poSzrPrecision = new wxBoxSizer ( wxHORIZONTAL ); poSzrSyncSwpSrcs = new wxBoxSizer ( wxVERTICAL ); poSzrToolTips = new wxBoxSizer ( wxVERTICAL ); // Set the sizers to the panels SetSizer( poSzrDlg ); poPnlPrefs ->SetSizer( poSzrPrefs ); poPnlBtns ->SetSizer( poSzrBtns ); poPnlViewer ->SetSizer( poSzrViewer ); poPnlTmpFileMgt ->SetSizer( poSzrTmpFileMgt ); poPnlPrecision ->SetSizer( poSzrPrecision ); poPnlSyncSwpSrcs->SetSizer( poSzrSyncSwpSrcs ); poPnlToolTips ->SetSizer( poSzrToolTips ); // Layout the choice control panel oFlags.Align( wxALIGN_CENTER ); oFlags.Border( wxTOP | wxBOTTOM, 1 ); poSzrViewer ->Add( &m_oLblViewer , oFlags ); poSzrViewer ->Add( &m_oChoViewer , oFlags ); poSzrViewer ->SetSizeHints( poPnlViewer ); poSzrTmpFileMgt->Add( &m_oLblTmpFileMgt, oFlags ); poSzrTmpFileMgt->Add( &m_oChoTmpFileMgt, oFlags ); poSzrTmpFileMgt->SetSizeHints( poPnlTmpFileMgt ); poSzrPrecision ->Add( &m_oLblPrecision , oFlags ); poSzrPrecision ->Add( &m_oChoPrecision , oFlags ); poSzrPrecision ->SetSizeHints( poPnlPrecision ); // Layout the check box panel oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxTOP, 3 ); poSzrSyncSwpSrcs->Add( &m_oCbxSyncSwpSrcs, oFlags ); poSzrSyncSwpSrcs->SetSizeHints( poPnlSyncSwpSrcs ); poSzrToolTips ->Add( &m_oCbxToolTips, oFlags ); poSzrToolTips ->SetSizeHints( poPnlToolTips ); // Layout the preferences controls oFlags.Align( wxALIGN_LEFT ); oFlags.Border( wxLEFT | wxRIGHT | wxTOP, 10 ); poSzrPrefs->Add( poPnlViewer, oFlags ); oFlags.Border( wxLEFT, 10 ); poSzrPrefs->Add( poPnlTmpFileMgt, oFlags ); poSzrPrefs->Add( poPnlPrecision, oFlags ); poSzrPrefs->Add( &m_oPnlNbkMaxLines, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 7 ); poSzrPrefs->Add( poPnlSyncSwpSrcs, oFlags ); oFlags.Border( wxLEFT | wxBOTTOM, 8 ); poSzrPrefs->Add( poPnlToolTips, oFlags ); poSzrPrefs->SetSizeHints( poPnlPrefs ); // Layout the buttons oFlags.Border( wxTOP | wxBOTTOM, 10 ); oFlags.Align( wxALIGN_RIGHT ); poSzrBtns->Add( &m_oBtnOk , oFlags ); poSzrBtns->AddSpacer( 10 ); oFlags.Align( wxALIGN_LEFT ); poSzrBtns->Add( &m_oBtnCancel, oFlags ); poSzrBtns->SetSizeHints( poPnlBtns ); // Layout the underlying dialog oFlags.Align( wxALIGN_TOP | wxALIGN_CENTER_HORIZONTAL ); oFlags.Border( wxALL, 15 ); GetSizer( )->Add( poPnlPrefs, oFlags ); oFlags.Border( wxBOTTOM, 10 ); GetSizer( )->Add( poPnlBtns , oFlags ); GetSizer( )->SetSizeHints( this ); } //***************************************************************************** // Load the values into the display controls from the configuration file. void DlgPrefs::Load( void ) { wxString os1; long li1; SetEvtHandlerEnabled( FALSE ); m_poCfg->SetPath( wxT("/Viewer") ); m_poCfg->Read( wxT("Name"), &os1, CLP_GWAVE ); for( li1=0; (uint)li1SetPath( wxT("/Main") ); m_poCfg->Read( wxT("TmpFileMgt"), &li1, eTFMS_DELETE ); m_oChoTmpFileMgt.SetSelection( li1 ); m_poCfg->Read( wxT("Precision"), &li1, CNVTYPE_DFLT_FLTRES ); m_oChoPrecision.SetSelection( li1-1 ); m_poCfg->Read( wxT("NbkMaxLines"), &li1, TCTL_LINESDEF ); m_oPnlNbkMaxLines.bSetValue( li1 ); m_poCfg->Read( wxT("SyncSwpSrcs"), &li1, 0 ); m_oCbxSyncSwpSrcs.SetValue( li1 != 0 ? TRUE : FALSE ); m_poCfg->Read( wxT("ToolTips"), &li1, 0 ); m_oCbxToolTips.SetValue( li1 != 0 ? TRUE : FALSE ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Save the values in the display controls in the configuration file. void DlgPrefs::Save( void ) { wxString os1; long li1; SetEvtHandlerEnabled( FALSE ); m_poCfg->SetPath( wxT("/Viewer") ); os1 = m_oChoViewer.GetStringSelection( ); m_poCfg->Write( wxT("Name"), os1 ); m_poCfg->SetPath( wxT("/Main") ); li1 = m_oChoTmpFileMgt.GetSelection( ); m_poCfg->Write( wxT("TmpFileMgt"), li1 ); li1 = m_oChoPrecision.GetSelection( ) + 1; m_poCfg->Write( wxT("Precision"), li1 ); ConvertType::bSetFltRes( (int) li1 ); li1 = m_oPnlNbkMaxLines.liGetValue( ); m_poCfg->Write( wxT("NbkMaxLines"), li1 ); li1 = ( m_oCbxSyncSwpSrcs.GetValue( ) ? 1 : 0 ); m_poCfg->Write( wxT("SyncSwpSrcs"), li1 ); li1 = ( m_oCbxToolTips.GetValue( ) ? 1 : 0 ); m_poCfg->Write( wxT("ToolTips"), li1 ); wxToolTip::Enable( li1 != 0 ? TRUE : FALSE ); m_poCfg->Flush( ); SetEvtHandlerEnabled( TRUE ); } //***************************************************************************** // Reset all dialog settings to defaults. // // Return Values: // TRUE - Success // FALSE - Failure bool DlgPrefs::bClear( void ) { Load( ); return( TRUE ); } //***************************************************************************** // // Event Handlers // //***************************************************************************** // Ok button event handler. // // Argument List: // roEvtCmd - An object holding information about the event (not used) void DlgPrefs::OnBtnOk( wxCommandEvent & roEvtCmd ) { Save( ); EndModal( wxID_OK ); } //***************************************************************************** // Cancel button event handler. // // Argument List: // roEvtCmd - An object holding information about the event (not used) void DlgPrefs::OnBtnCancel( wxCommandEvent & roEvtCmd ) { Load( ); EndModal( wxID_CANCEL ); } //***************************************************************************** gspiceui-1.0.00+dfsg/src/main/DlgPrefs.hpp0000644000000000000000000001024711603102737016753 0ustar rootroot//***************************************************************************** // DlgPrefs.hpp * // -------------- * // Description : This dialogue is used to enter applications preferences. * // Started : 17/10/2006 * // Last Update : 16/04/2010 * // Copyright : (C) 2006 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef DLGPREFS_HPP #define DLGPREFS_HPP // System Includes #include // wxWidgets Includes #include #include #include // Application Includes #include "CmdLinePcr.hpp" #include "utility/PnlValue.hpp" #include "utility/TextCtrl.hpp" #include "utility/ConvertType.hpp" // Local Constant Declarations //***************************************************************************** class DlgPrefs : public wxDialog { private : // Pointer to global configuration object wxConfig * m_poCfg; // Display controls wxLabel m_oLblViewer; wxChoice m_oChoViewer; wxLabel m_oLblTmpFileMgt; wxChoice m_oChoTmpFileMgt; wxLabel m_oLblPrecision; wxChoice m_oChoPrecision; PnlValue m_oPnlNbkMaxLines; wxCheckBox m_oCbxSyncSwpSrcs; wxCheckBox m_oCbxToolTips; // Button controls wxButton m_oBtnOk; wxButton m_oBtnCancel; // Object initialization functions void Initialize( void ); void Create ( void ); void ToolTips ( void ); void DoLayout ( void ); void Load( void ); void Save( void ); public : DlgPrefs( wxWindow * poWin ); ~DlgPrefs( ); bool bClear( void ); const wxString rosGetViewer ( void ) { return( m_oChoViewer.GetStringSelection( ) ); } int iGetNbkMaxLines( void ) { return( (int)m_oPnlNbkMaxLines.liGetValue()); } int iGetTmpFileMgt ( void ) { return( m_oChoTmpFileMgt.GetSelection( ) ); } int iGetPrecision ( void ) { return( m_oChoPrecision.GetSelection( ) ); } bool bGetSyncSwpSrcs( void ) { return( m_oCbxSyncSwpSrcs.IsChecked( ) ); } bool bGetToolTips ( void ) { return( m_oCbxToolTips.IsChecked( ) ); } // Event handlers void OnBtnOk ( wxCommandEvent & roEvtCmd ); void OnBtnCancel( wxCommandEvent & roEvtCmd ); friend class FrmMain; // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eDlgItemID { ID_CHO_SIMENG = 0, ID_CHO_VIEWER, ID_CHO_TMPFILEMGT, ID_CHO_PRECISION, ID_PNL_NBKMAXLINES, ID_CBX_SYNCSWPSRCS, ID_CBX_TOOLTIPS, ID_BTN_OK, ID_BTN_CANCEL, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_CHO_SIMENG, ID_LST = ID_BTN_CANCEL }; // Leave this as the last line as private access is envoked by macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // DLGPREFS_HPP gspiceui-1.0.00+dfsg/src/main/FrmMain.hpp0000644000000000000000000001574711603103004016574 0ustar rootroot//***************************************************************************** // FrmMain.hpp * // ------------- * // Description : The main frame used to contain the applications display * // objects. * // Started : 18/08/2003 * // Last Update : 23/05/2011 * // Copyright : (C) 2003 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef FRMMAIN_HPP #define FRMMAIN_HPP // System Includes using namespace std; #include // wxWidgets Includes #include #include #include #include #include #include #include // Application Includes #include "TypeDefs.hpp" #include "main/FileTasks.hpp" #include "main/HelpTasks.hpp" #include "netlist/NetList.hpp" #include "netlist/SimnGnuCap.hpp" #include "netlist/SimnNgSpice.hpp" #include "process/PrcGnuCap.hpp" #include "process/PrcNgSpice.hpp" #include "process/PrcGSchem.hpp" #include "process/PrcGaw.hpp" #include "process/PrcGWave.hpp" #include "main/NbkTxtCtls.hpp" #include "main/DlgPrefs.hpp" #include "gnucap/NbkGnuCap.hpp" #include "ngspice/NbkNgSpice.hpp" //***************************************************************************** class FrmMain : public wxFrame { private : // Define an enumerated type for the different status bar panes enum ePaneType { ePANE_MESG = 0, ePANE_SIMR = 1, ePANE_VIEW = 2, ePANE_LAST = ePANE_VIEW }; // Object attributes bool m_bIsOpen; // Flag indicating when the frame has closed wxConfig * m_poCfg; // Pointer to the configuration object const wxApp * m_poApp; // Pointer to the frames parent application FileTasks m_oFileTsks; // Class to handler file operations HelpTasks m_oHelpTsks; // Class to handler help operations NetList m_oNetLst; // The netlist object SimnNgSpice m_oSimnNgs; // NG-Spice simulation object SimnGnuCap m_oSimnGcp; // GNU-Cap simulation object SimnBase * m_poSimn; // A pointer to the simulation object PrcSimrBase * m_poPrcSimEng; // Pointer to the simulator engine process PrcGSchem m_oPrc_gschem; // Process object to schematic capture PrcGaw m_oPrc_gaw; // Process object to view simulation results PrcGWave m_oPrc_gwave; // Process object to view simulation results // Display control objects NbkSimrBase * m_poNbkSimEng; // Pointer to the simulation engine notebook wxLabel m_oLblNodes; // Label above the test nodes list wxListBox m_oLbxNodes; // List of possible test nodes wxLabel m_oLblCpnts; // Label above the test components list wxListBox m_oLbxCpnts; // List of possible test components NbkTxtCtls m_oNbkTxtCtls; // Notebook containing the text controls // Object initialization functions void Initialize ( void ); void InitMenuBar ( void ); void InitToolBar ( void ); void InitLstBoxs ( void ); void InitNbkTCtls( void ); void InitStatBar ( void ); void InitToolTips( void ); void InitSimEng ( void ); void InitLogFiles( void ); void InitPosnSize( void ); void DoLayout ( void ); bool bSimnLoad ( void ); bool bSimnReload( void ); bool bSimnSave ( void ); // Check that helper utilities are present & accounted for bool bIsOkSimEng( PrcBase * poPrcSimEng ); bool bIsOkViewer( PrcBase * poPrcViewer ); public : FrmMain( const wxApp * poApp=NULL ); ~FrmMain( ); bool bIsOpen( void ) { return( m_bIsOpen ); } bool bClear( void ); // Clear the object attributes void DlgErrMsg( const wxString & rosTitle=wxT(""), const wxString & rosMsg=wxT("") ); // Event handlers void OnOpen ( wxCommandEvent & roEvtCmd ); void OnImport ( wxCommandEvent & roEvtCmd ); void OnReload ( wxCommandEvent & roEvtCmd ); void OnClose ( wxCommandEvent & roEvtCmd ); void OnAppExit ( wxCommandEvent & roEvtCmd ); void OnSimCreate ( wxCommandEvent & roEvtCmd ); void OnSimRun ( wxCommandEvent & roEvtCmd ); void OnSimStop ( wxCommandEvent & roEvtCmd ); void OnSchematic ( wxCommandEvent & roEvtCmd ); void OnViewData ( wxCommandEvent & roEvtCmd ); void OnSelSimEng ( wxCommandEvent & roEvtCmd ); void OnPrefs ( wxCommandEvent & roEvtCmd ); void OnManUser ( wxCommandEvent & roEvtCmd ); void OnManNgSpice( wxCommandEvent & roEvtCmd ) {} void OnManGnuCap ( wxCommandEvent & roEvtCmd ) {} void OnAbout ( wxCommandEvent & roEvtCmd ); void OnToolEnter ( wxCommandEvent & roEvtCmd ); void OnSysExit ( wxCloseEvent & roEvtClose ); friend class FileTasks; // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eFrmItemID { ID_MNU_OPEN = 1, ID_MNU_IMPORT, ID_MNU_RELOAD, ID_MNU_CLOSE, ID_MNU_EXIT, ID_MNU_CREATE, ID_MNU_RUN, ID_MNU_STOP, ID_MNU_SCHEM, ID_MNU_VIEWER, ID_MNU_GNUCAP, ID_MNU_NGSPICE, ID_MNU_PREFS, ID_MNU_MAN_USR, ID_MNU_MAN_NGS, ID_MNU_MAN_GCP, ID_MNU_ABOUT, ID_TOOLBAR, ID_TBR_OPEN, ID_TBR_IMPORT, ID_TBR_RELOAD, ID_TBR_CLOSE, ID_TBR_CREATE, ID_TBR_RUN, ID_TBR_STOP, ID_TBR_SCHEM, ID_TBR_VIEWER, ID_TBR_HELP, ID_LBX_NODES, ID_LBX_CPNTS, ID_NBK_ANALYSIS, ID_NBK_TXTCTRLS, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_MNU_OPEN, ID_LST = ID_NBK_TXTCTRLS }; // Leave this as the last line as private access is envoked by this macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // FRMMAIN_HPP gspiceui-1.0.00+dfsg/src/main/FileTasks.hpp0000644000000000000000000000645611626542273017151 0ustar rootroot//***************************************************************************** // FileTasks.hpp * // --------------- * // Description : This is a helper class for FrmMain, it handles most of the * // file operations. * // Started : 28/05/2005 * // Last Update : 29/08/2011 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef FILETASKS_HPP #define FILETASKS_HPP // System includes #include // wxWidgets includes #include #include // Application includes class FrmMain; #include "TypeDefs.hpp" #include "base/SimnBase.hpp" #include "process/PrcGSchem.hpp" #include "process/PrcGNetList.hpp" //***************************************************************************** class FileTasks { private : FrmMain * m_poFrmMain; // Pointer to application main frame wxConfig * m_poCfg; // Pointer to global configuration object PrcGNetList m_oPrcGNetList; // gnetlist file conversion utility // Object initialization functions void InitGuileProc ( void ); void InitSchemFiles( void ); void InitNetLstFile( void ); void DlgErrSchems ( void ); void DlgErrNetLst ( void ); bool bExecImport ( void ); public : FileTasks( FrmMain * poFrmMain ); ~FileTasks( ); void Initialize( void ); // This function calls all the initialization fns bool bIsOk_gnetlist( void ); bool bSetTitle ( void ); bool bSetGuileProc ( const wxString & rosPName ); bool bSetSchemFiles( const wxString & rosFNames ); bool bSetNetLstFile( const wxString & rosFName=GNETLST_USE_SCHEM ); bool bSetLogFile ( const wxString & rosFName ) { return( m_oPrcGNetList.bSetLogFile( rosFName ) ); } const wxString & rosGetGuileProc ( void ); const wxArrayString & rosaGetSchemFiles( void ); const wxString & rosGetNetLstFile( void ); bool bDlgOpen ( void ); bool bDlgImport ( void ); bool bDelTmpFiles( void ); bool bOpen ( void ); bool bImport( void ); bool bReload( void ); bool bClose ( void ); bool bExit ( void ); }; //***************************************************************************** #endif // FILETASKS_HPP gspiceui-1.0.00+dfsg/src/main/HelpTasks.hpp0000644000000000000000000000650311603103024017131 0ustar rootroot//***************************************************************************** // HelpTasks.hpp * // --------------- * // Description : This is a helper class for FrmMain, it handles most of the * // required help operations. * // Started : 03/06/2005 * // Last Update : 11/04/2011 * // Copyright : (C) 2005 by M.S.Waters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #ifndef HELPTASKS_HPP #define HELPTASKS_HPP // System includes #include // wxWidgets includes #include #include #include #include #ifdef __WXMAC__ #include #endif // Application includes #include "CmdLinePcr.hpp" class FrmMain; //***************************************************************************** class HelpTasks : public wxFrame { private : FrmMain * m_poFrmMain; // Pointer to application main frame wxConfig * m_poCfg; // Pointer to the configuration object wxHtmlWindow m_oHtmlWin; // The HTML viewer window // Object initialization functions void Initialize ( void ); // This function calls the following init. fns void InitToolBar ( void ); void InitHtmlWin ( void ); void InitPosnSize( void ); wxString & rosGetInstallPath( void ); public : HelpTasks( FrmMain * poFrmMain ); ~HelpTasks( ); void SetAppFrm( FrmMain * poFrmMain ) { m_poFrmMain = poFrmMain; } void SetTitle( void ); void ManUser( void ); void About ( void ); // Event handlers void OnForward( wxCommandEvent & roEvtCmd ); void OnBack ( wxCommandEvent & roEvtCmd ); void OnClose ( wxCommandEvent & roEvtCmd ); void OnClose ( wxCloseEvent & roEvtClose ); // In order to be able to react to a menu command, it must be given a // unique identifier such as a const or an enum. enum eFrmItemID { ID_TOOLBAR = 1, ID_TBR_FORWARD, ID_TBR_BACK, ID_TBR_CLOSE, ID_UNUSED, // Assigned to controls for which events are not used ID_FST = ID_TOOLBAR, ID_LST = ID_TBR_CLOSE }; // Leave this as the last line as private access is envoked by this macro DECLARE_EVENT_TABLE( ) }; //***************************************************************************** #endif // HELPTASKS_HPP gspiceui-1.0.00+dfsg/src/main/NbkTxtCtls.cpp0000644000000000000000000002173511603101707017300 0ustar rootroot//***************************************************************************** // NbkTxtCtls.cpp * // ---------------- * // Started : 14/06/2005 * // Last Update : 01/07/2011 * // Copyright : (C) 2005 by MSWaters * // Email : M.Waters@bom.gov.au * //***************************************************************************** //***************************************************************************** // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU General Public License as published by * // the Free Software Foundation; either version 2 of the License, or * // (at your option) any later version. * // * //***************************************************************************** #include "main/NbkTxtCtls.hpp" //***************************************************************************** // Constructor. NbkTxtCtls::NbkTxtCtls( void ) : wxNotebook( ) { } //***************************************************************************** // Destructor. NbkTxtCtls::~NbkTxtCtls( ) { } //***************************************************************************** // Create an instantance of this object. // // Argument List : // poWin - The parent window // oWinID - The window identifier // roPosn - The position // roSize - The size // // Return Values : // TRUE - Success // FALSE - Failure bool NbkTxtCtls::bCreate( wxWindow * poWin, wxWindowID oWinID ) { bool bRtn=TRUE; wxString os1; // Check if the object has already been created if( bIsCreated( ) ) return( TRUE ); // Create the notebook object to hold the text controls if( ! Create( poWin, oWinID ) ) return( FALSE ); // Allocate memory for the text controls TextCtrl * poTxcConsole = new TextCtrl; TextCtrl * poTxcNetList = new TextCtrl; TextCtrl * poTxcSimultn = new TextCtrl; TextCtrl * poTxcGnuCap = new TextCtrl; TextCtrl * poTxcNgSpice = new TextCtrl; // Create the text controls if( ! poTxcConsole->bCreate( this ) ) bRtn = FALSE; if( ! poTxcNetList->bCreate( this ) ) bRtn = FALSE; if( ! poTxcSimultn->bCreate( this ) ) bRtn = FALSE; if( ! poTxcGnuCap ->bCreate( this ) ) bRtn = FALSE; if( ! poTxcNgSpice->bCreate( this ) ) bRtn = FALSE; // Initialize the text controls os1 = wxT("No console I/O to display"); if( ! poTxcConsole->bSetInitMsg( os1 ) ) bRtn = FALSE; os1 = wxT("No netlist currently loaded"); if( ! poTxcNetList->bSetInitMsg( os1 ) ) bRtn = FALSE; os1 = wxT("No simulation currently defined"); if( ! poTxcSimultn->bSetInitMsg( os1 ) ) bRtn = FALSE; os1 = wxT("No GNU-Cap simulation results to display"); if( ! poTxcGnuCap ->bSetInitMsg( os1 ) ) bRtn = FALSE; os1 = wxT("No NG-Spice simulation results to display"); if( ! poTxcNgSpice->bSetInitMsg( os1 ) ) bRtn = FALSE; // Define tool tips for the wxNotebook and each page poTxcConsole->SetToolTip( wxT("Console I/O (non-editable)") ); poTxcNetList->SetToolTip( wxT("Netlist file (non-editable)") ); poTxcSimultn->SetToolTip( wxT("Simulation file (editable)") ); poTxcGnuCap ->SetToolTip( wxT("GNU-Cap simulation results (non-editable)") ); poTxcNgSpice->SetToolTip( wxT("NG-Spice simulation results (non-editable)") ); // Add the display objects to the wxNotebook (wxNotebook will delete them) AddPage( poTxcConsole, wxT(" Console ") ); AddPage( poTxcNetList, wxT(" NetList ") ); AddPage( poTxcSimultn, wxT(" Simulation ") ); AddPage( poTxcGnuCap, wxT(" GNU-Cap ") ); AddPage( poTxcNgSpice, wxT(" NG-Spice ") ); bInitialize( ); return( bRtn ); } //***************************************************************************** // Clear one or all text controls associated with the notebook. // // Argument List : // ePage - The enumerated page identifier // // Return Values : // TRUE - Success // FALSE - Failure bool NbkTxtCtls::bClear( ePageType ePage ) { size_t szt1; // Check that the object has been created if( ! bIsCreated( ) ) return( FALSE ); // Attempt the clear operation switch( ePage ) { case ePAGE_CONSOLE : // Clear a particular page case ePAGE_NETLIST : case ePAGE_SIMULTN : case ePAGE_GNUCAP : case ePAGE_NGSPICE : case ePAGE_CURRENT : if( ! poGetPage( ePage )->bClear( ) ) return( FALSE ); break; case ePAGE_ALL : // Clear all pages for( szt1=0; szt1bClear( ) ) return( FALSE ); break; default : // Invalid page identifier return( FALSE ); } return( TRUE ); } //***************************************************************************** // Initialize one or all text controls associated with the notebook. // // Argument List : // ePage - The enumerated page identifier // // Return Values : // TRUE - Success // FALSE - Failure bool NbkTxtCtls::bInitialize( ePageType ePage ) { size_t szt1; // Check that the object has been created if( ! bIsCreated( ) ) return( FALSE ); // Attempt the initialize operation switch( ePage ) { case ePAGE_CONSOLE : // Initialize a particular page case ePAGE_NETLIST : case ePAGE_SIMULTN : case ePAGE_GNUCAP : case ePAGE_NGSPICE : case ePAGE_CURRENT : if( ! poGetPage( ePage )->bInitialize( ) ) return( FALSE ); break; case ePAGE_ALL : // Initialize all pages for( szt1=0; szt1bInitialize( ) ) return( FALSE ); break; default : // Invalid page identifier return( FALSE ); } return( TRUE ); } //***************************************************************************** // Set the page to be displayed. // // Argument List : // ePage - The enumerated page identifier // // Return Values : // TRUE - Success // FALSE - Failure bool NbkTxtCtls::bSetPage( NbkTxtCtls::ePageType ePage ) { // Check if the object has already been created if( ! bIsCreated( ) ) return( FALSE ); // Check that the page identifier is valid if( GetPageCount( ) < ((size_t) ePage + 1) ) return( FALSE ); SetSelection( (size_t) ePage ); return( TRUE ); } //***************************************************************************** // Set the insert and show positions in the currently displayed page. // // Argument List : // liPosn - The position // // Return Values : // TRUE - Success // FALSE - Failure bool NbkTxtCtls::bSetPosn( long liPosn ) { TextCtrl * poTxtCtl; // Check if the object has already been created if( ! bIsCreated( ) ) return( FALSE ); // Get a pointer to the currently displayed page poTxtCtl = (TextCtrl *) GetCurrentPage( ); if( poTxtCtl == NULL ) return( FALSE ); // Set the position if( liPosn >= 0 ) poTxtCtl->SetInsertionPoint( liPosn ); else poTxtCtl->SetInsertionPointEnd( ); return( TRUE ); } //***************************************************************************** // Get the enumerated identifier for the currently displayed notebook page. // // Return Values : // Success - The enumerated page identifier // Failure - ePAGE_NONE NbkTxtCtls::ePageType NbkTxtCtls::eGetPage( void ) { ePageType ePage; // Check if the object has already been created if( ! bIsCreated( ) ) return( ePAGE_NONE ); // Get the enumerated identifier for the currently displayed page switch( GetSelection( ) ) { case 0 : ePage = ePAGE_CONSOLE; break; case 1 : ePage = ePAGE_NETLIST; break; case 2 : ePage = ePAGE_SIMULTN; break; case 3 : ePage = ePAGE_GNUCAP; break; case 4 : ePage = ePAGE_NGSPICE; break; default : ePage = ePAGE_NONE; } return( ePage ); } //***************************************************************************** // Get a pointer to the text control currently being displayed. // // Argument List : // ePage - The enumerated page identifier // // Return Values : // Success - A pointer to the TextCtrl object // Failure - NULL TextCtrl * NbkTxtCtls::poGetPage( NbkTxtCtls::ePageType ePage ) { // Check if the object has already been created if( ! bIsCreated( ) ) return( NULL ); // Check that the page identifier is valid if( ePage == ePAGE_CURRENT ) ePage = eGetPage( ); if( GetPageCount( ) < ((size_t) ePage + 1) ) return( NULL ); // Return a pointer to the requested page return( (TextCtrl *) GetPage( (size_t) ePage ) ); } //***************************************************************************** gspiceui-1.0.00+dfsg/ReadMe0000644000000000000000000000555411640627676014125 0ustar rootroot ReadMe -------- Start Date : 03/04/2004 Last Update : 29/09/2009 ------------------------------------------------------------------------------- gSpiceUI - A Graphical User Interface (GUI) to various freely available electronic circuit simulation engines. Author : Mike Waters Email : M.Waters@bom.gov.au ------------------------------------------------------------------------------- Table of Contents 1. Introduction. 2. Installation. 3. Documentation. 4. Examples. 5. Bugs / Things To Do. ------------------------------------------------------------------------------- 1. Introduction. GNU Spice GUI is intended to provide a GUI to freely available electronic circuit simulation engine eg. GNU-Cap, NG-Spice. It uses gnetlist to convert schematic files to net list files and gwave to display simulation results. gschem is used as the schematic capture tool. The version numbering scheme uses the format : vA.B.CD A is the major release number (rarely updated). B is the minor release number (infrequently updated). CD is the modification number (incremented as a result of almost any change). For example version 1.0 would be designated v1.0.00, any version with a major release number of 0 is pre-version 1.0. Until version 1.0.00 is released the version number will represent a percentage of the development completed towards version 1.0.00. Eg. v0.5.60 would signify that roughly %56 of the development effort has been completed towards version 1.0.00. ------------------------------------------------------------------------------- 2. Installation. Refer to the Install file. ------------------------------------------------------------------------------- 3. Documentation. Refer to the HTML User Manual in /html/User-Manual.html or, while running gSpiceUI refer to the on-line documentation (which are the same). ------------------------------------------------------------------------------- 4. Examples. The directory /sch contains various example schematic files which may be used to experiment with gSpiceUI. These examples also show how to prepare a schematic for simulation, which is not always a trivial task. NOTE : There's no guarantee that all of the example schematic files will behave properly when simulated. These files are a collection of things that have taken my interest over the years, some work some don't. ------------------------------------------------------------------------------- 5. Bugs / Things To Do. Refer to the ToDo file for a list of features which could be added in the future. If you have the sources the file /src/Version.hpp contains a list of bugs which need addressing. ------------------------------------------------------------------------------- gspiceui-1.0.00+dfsg/License0000644000000000000000000003543311412210405014320 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS gspiceui-1.0.00+dfsg/Install0000644000000000000000000002100611640626575014361 0ustar rootroot Install --------- Start Date : 04/04/2004 Last Update : 24/03/2011 ------------------------------------------------------------------------------- gSpiceUI - A Graphical User Interface (GUI) to various freely available electronic circuit simulation engines. Author : Mike Waters Email : M.Waters@bom.gov.au ------------------------------------------------------------------------------- Table of Contents 1. Introduction. 2. Requirements. 3. wxWidgets Library. 4. Build System. 5. Installation. 6. Usage. 7. Examples. 8. Files. ------------------------------------------------------------------------------- 1. Introduction. These instructions provide information required to compile and install gSpiceUI and basic instructions on envoking gSpiceUI. For a more detailed description refer to the HTML user manual in html/gSpiceUI.html. ------------------------------------------------------------------------------- 2. Requirements. There is one essential requirement for compiling gSpiceUI, three desirable requirements for running gSpiceUI meaningfully and two optional requirement. These are listed below : * Compilation (Essential) : The wxWidgets library. * Run time (Desirable) : GNU-Cap electronic circuit simulation engine. * Run time (Desirable) : NG-Spice electronic circuit simulation engine. * Run time (Optional) : gwave analogue waveform viewer. * Run time (Optional) : Gaw analogue waveform viewer. * Schematic (Optional) : gnetlist schematic importing tool. * Schematic (Optional) : gschem schematic generation/viewing tool. Note : As a minimum NG-Spice should be compiled with XSpice enhancements enabled. One feature this provides is the POLY() function which is used in many operational amplifier models. XSpice enhancements are enabled via the NG-Spice configure script prior to compiling the sources ie. : ./configure --enable-xspice ------------------------------------------------------------------------------- 3. wxWidgets Library. gSpiceUI is written in C++ and is based on the wxWidgets library. wxWidgets offers the possibility of compiling the same source code under Linux/UNIX, MS Windows, OSX and various other platforms. This library must be installed before gSpiceUI can be compiled. Many systems now come with a version of wxWidgets pre-installed. The wxWidgets home page is : http://www.wxWidgets.org/ The recommended version of the wxWidgets library is v2.8.x however v2.6.x may still work. (Note : wxWidgets v2.6.x may generate some console spew on standard error which may be ignored eg. "gspiceui 2>/dev/null".) The archive file for a Linux based system is : wxGTK-2.8.x.tar.bz2 Untar the wxWidgets archive as follows : tar -jxvf wxGTK-2.8.x.tar.bz2 Installation of wxWidgets is based around autoconf and automake, so it should be straight forward. If necessary refer to the installation instructions provided with the wxWidgets sources (in the docs directory). Do the following in the wxWidgets base directory : mkdir my-build cd my-build ./configure --enable-unicode --without-subdirs --disable-compat26 --disable-xrc make su Password: <-- enter root password make install Note : Options which may be added to the ./configure command include : --enable-unicode (Compile wxString with Unicode support) --without-subdirs (Don't generate makefiles for samples/demos/...) --disable-compat26 (Disable wxWidgets 2.6 compatibility) --enable-debug_flag (Set the __WXDEBUG__ flag) --enable-debug_info (Create code with debugging information) --enable-debug_gdb (Create code with extra GDB debugging info.) --disable-xrc (Don't build XRC resources sub-library) ------------------------------------------------------------------------------- 4. Build System. Assuming the wxWidgets library has been installed, go to the gSpiceUI root directory and enter the following : make OR gmake (for FreeBSD) Note 1 : MAC users, enter the following before entering the above : make maccfg this creates some directories and copies some files, it only needs to be performed once per installation. Note 2 : To compile against mwxWidgets v2.6.x use : make GSPICEUI_WXLIB=2.6 If all goes well a binary named gspiceui should have been generated in the /bin directory. ------------------------------------------------------------------------------- 5. Installation. The application may be installed into /usr/local/ by entering the following command as root : make install OR gmake install (for FreeBSD) The application binary is intalled in /usr/local/bin/. The documentation and any other support files are installed in /usr/local/share/gspiceui/. The application may be uninstalled by entering the following command as root : make uninstall OR gmake uninstall (for FreeBSD) An alternative install path may be specified by manually changing the make variable INSTALLDIR (or DESTDIR) in the main Makefile or by specifying it on the command-line as the following example illustrates : make install INSTALLDIR=/alternative/install/directory This applies equally for the uninstall operation : make uninstall INSTALLDIR=/alternative/install/directory ------------------------------------------------------------------------------- 6. Usage. Change to the gspiceui/bin directory and execute the binary gspiceui in situ. Usage information is listed below : Analyse a electronic circuit using a GUI to a numerical simulation engine USAGE : gspiceui [-OPTION [ARG]] [FILE/S] OPTIONS : -h : Print usage (this message) -v : Print version information -r RCFILE : Specify a configuration file RCFILE = ~/.gspiceui.conf (default) -s SIMENG : Specify the simulation engine to be used SIMENG = gnucap (default) or ngspice -a ANA : Specify the analysis page to be displayed ANA = op, dc (default), ac, tr, fo, di, no, pz, se or tf -g [PROC] : Guile procedure to import a schematic file using gNetList PROC = spice-sdb (default), pcb, protelii, verilog, etc. -w VIEWER : Specify the waveform viewer to be used VIEWER = gwave (default) or gaw ARGS : FILE/S : Import schematic file/s or load a circuit description file NOTES : Option -s must come before -a if both are specified ------------------------------------------------------------------------------- 7. Examples. The directory gspice/sch contains some example schematic files (with the file extension .sch) which can be loaded using the Import command under the File menu. (These schematic files have been generated using gSchem the gEDA schematic capture application and are converted to net list format using gNetList.) NOTE : The schematic examples which contain an operational amplifier require a symbol file which is not currently part of the gSchem symbol library. gnetlist uses the symbol pin sequence to generate it's component pin sequence which itself must match the associated model pin sequence. Consequently, to use these examples the symbol file opamp-3.sym must be copied to your gschem symbol library. As root enter a copy command of the form shown below : cp /gspiceui/lib/sym/opamp-3.sym /usr/share/gEDA/sym/local/ ------------------------------------------------------------------------------- 8. Files. It's worth noting that gSpiceUI can create many disk files during it's operation. For a brief explaination of the various file types and their purposes refer to the User Manual provided in the HTML documentation directory ie. "/html/gSpiceUI.html". As gSpiceUI is developed the format of the configuration file evolves (ie. ~/.gspiceui.conf). Over time it can become cluttered with superseded variable names and/or group names. The configuration file may be partially rebuilt using the command line option : "-c". At present the only way to ensure that you have a pristeen configuration file is to delete it manually and allow gSpiceUI to create a new one. Although this should not be essential, rebuilding the configuration file will at least help with human readability. ------------------------------------------------------------------------------- gspiceui-1.0.00+dfsg/gspiceui.10000644000000000000000000000367111526570331014721 0ustar rootroot.TH "gspiceui" "16" "February 2011" "Mike Waters" "User Commands" .SH "NAME" gspiceui \- GUI frontend for various electronic circuit simulation engines .SH "SYNOPSIS" \fBgspiceui\fR [\-v] [\-h] [\-r RCFILE] [\-c] [\-s SIMENG] [\-a ANA] [\-g [PROC]] [\-w VIEWER] [FILE/S] .SH "DESCRIPTION" GNU Spice GUI is intended to provide a GUI for various freely available electronic circuit simulation engines ie. GNU\-Cap and NG\-Spice. It uses gnetlist to convert schematic files to net list files and gWave or Gaw to display simulation results. gSchem is the preferred schematic capture tool. .SH "OPTIONS" \fIgspiceui\fP accepts the following options : .TP 12 \fB\-v\fR Print version information. .TP 12 \fB\-h\fR Print usage information. .TP 12 \fB\-d\fR Enable debug mode (generates console spew on standard error). .TP 12 \fB\-r RCFILE\fR Specify a configuration file. .TP 12 \fB\-c\fR Rebuild/clean the configuration file. .TP 12 \fB\-s SIMENG\fR Specify the simulation engine to be used. .TP 12 \fB\-a ANA\fR Specify the analysis page to be displayed. .TP 12 \fB\-g [PROC]\fR Specify the guile procedure which is executed to create the netlist. .TP 12 \fB\-w VIEWER\fR Specify the waveform viewer to be used. .TP 12 \fBFILE/S\fR Specify a circuit description file to load or schematic file/s to import. If multiple schematics files are specified they are read sequentially and parsed with the assumption that they are all part of the same design. Any file/s must be specified at the end of the command line. .TP 12 NOTE : Option -s should come before -a if both are specified. .SH "REPORTING BUGS" Report bugs to . .SH "AUTHOR" Written by Michael Waters .SH "SEE ALSO" \fBgschem\fR (1), \fBgnetlist\fR (1), \fBngspice\fR (1), \fBgnucap\fR (1), \fBgwave\fR (1), \fBgaw\fR (1) .SH "COPYRIGHT" Copyright \(co 2003\-2011 Mike Waters This document can be freely redistributed according to the terms of the GNU General Public License version 2.0 gspiceui-1.0.00+dfsg/sch/0000755000000000000000000000000011752030331013565 5ustar rootrootgspiceui-1.0.00+dfsg/sch/aem-6000/0000755000000000000000000000000011752030331014712 5ustar rootrootgspiceui-1.0.00+dfsg/sch/aem-6000/output-stage.sch0000644000000000000000000002053311636641254020072 0ustar rootrootv 20110115 2 C 40000 40000 0 0 0 title-A2.sym C 54500 46800 1 270 0 voltage-1.sym { T 54450 46450 5 10 1 1 180 0 1 refdes=Vin T 55300 46750 5 10 0 1 180 0 1 value=DC 0.0 } C 62900 49200 1 0 1 vdc-1.sym { T 62200 49750 5 10 0 1 0 6 1 refdes=V1 T 62200 49700 5 10 1 1 0 6 1 value=DC +70V } C 62300 48900 1 180 1 vdc-1.sym { T 61900 48400 5 10 0 1 180 6 1 refdes=V2 T 61500 48350 5 10 1 1 180 6 1 value=DC -70V } C 62025 48900 1 0 0 gnd-1.sym { T 62025 48900 5 10 0 0 0 0 1 netname=GND } C 50100 41000 1 0 0 spice-model-1.sym { T 50200 41600 5 10 1 1 0 0 1 refdes=A7 T 51400 41300 5 10 1 1 0 0 1 model-name=1N914 T 50600 41100 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } T 57300 40900 9 14 1 0 0 0 1 AEM Audio Power Amplifier - Series 6000 T 56300 40400 9 10 1 0 0 0 1 output-stage.sch T 57300 40100 9 10 1 0 0 0 1 1 T 57800 40100 9 10 1 0 0 0 1 1 T 60200 40400 9 10 1 0 0 0 1 23 / 09 / 2011 T 60200 40100 9 10 1 0 0 0 1 Mike Waters C 62800 47700 1 180 0 vee-1.sym { T 62800 47700 5 10 0 0 0 0 1 netname=Vee } C 57500 42200 1 180 0 vee-1.sym { T 57500 42200 5 10 0 0 180 0 1 netname=Vee } C 57100 50400 1 0 0 vcc-1.sym { T 57100 50400 5 10 0 0 0 0 1 netname=Vcc } C 62400 50400 1 0 0 vcc-1.sym { T 62400 50400 5 10 0 0 0 0 1 netname=Vcc } N 62600 49200 62600 48900 4 N 62600 49200 62125 49200 4 N 55900 42200 60100 42200 4 N 55900 50400 60100 50400 4 C 56200 46800 1 90 1 resistor-2.sym { T 56250 46400 5 10 1 1 0 0 1 refdes=R35 T 56250 46150 5 10 1 1 0 0 1 value=100 } N 54700 46800 56100 46800 4 C 56900 48300 1 90 1 diode-1.sym { T 56400 47700 5 10 1 1 0 6 1 refdes=D7 T 56650 47450 5 10 1 1 0 6 1 value=1N914 } C 59000 48300 1 90 1 diode-1.sym { T 58500 47700 5 10 1 1 0 6 1 refdes=D9 T 58750 47450 5 10 1 1 0 6 1 value=1N914 } C 56900 45200 1 90 1 diode-1.sym { T 56400 44600 5 10 1 1 0 6 1 refdes=D8 T 56650 44350 5 10 1 1 0 6 1 value=1N914 } C 59000 45200 1 90 1 diode-1.sym { T 58550 44600 5 10 1 1 0 6 1 refdes=D10 T 58750 44350 5 10 1 1 0 6 1 value=1N914 } C 57100 48700 1 270 0 capacitor-1.sym { T 57800 48500 5 10 0 0 270 0 1 device=CAPACITOR T 57400 48400 5 10 1 1 0 0 1 refdes=C9 T 58000 48500 5 10 0 0 270 0 1 symversion=0.1 T 57400 47950 5 10 1 1 0 0 1 value=330p } C 59200 48700 1 270 0 capacitor-1.sym { T 59900 48500 5 10 0 0 270 0 1 device=CAPACITOR T 59500 48400 5 10 1 1 0 0 1 refdes=C10 T 60100 48500 5 10 0 0 270 0 1 symversion=0.1 T 59500 47950 5 10 1 1 0 0 1 value=330p } C 57100 45200 1 270 0 capacitor-1.sym { T 57800 45000 5 10 0 0 270 0 1 device=CAPACITOR T 57400 44900 5 10 1 1 0 0 1 refdes=C11 T 58000 45000 5 10 0 0 270 0 1 symversion=0.1 T 57400 44450 5 10 1 1 0 0 1 value=33p } C 59200 45200 1 270 0 capacitor-1.sym { T 59900 45000 5 10 0 0 270 0 1 device=CAPACITOR T 59500 44900 5 10 1 1 0 0 1 refdes=C12 T 60100 45000 5 10 0 0 270 0 1 symversion=0.1 T 59500 44450 5 10 1 1 0 0 1 value=33p } C 56500 48300 1 270 1 zener-1.sym { T 57100 48700 5 10 0 0 90 2 1 device=ZENER_DIODE T 56100 48800 5 10 1 1 0 0 1 refdes=DZ2 T 56100 48600 5 10 0 1 0 0 1 value=1N759 T 56100 48550 5 10 1 1 0 0 1 description=12V } C 58600 48300 1 270 1 zener-1.sym { T 59200 48700 5 10 0 0 90 2 1 device=ZENER_DIODE T 58200 48800 5 10 1 1 0 0 1 refdes=DZ3 T 58200 48600 5 10 0 1 0 0 1 value=1N759 T 58200 48550 5 10 1 1 0 0 1 description=12V } C 56500 43400 1 270 1 zener-1.sym { T 57100 43800 5 10 0 0 90 2 1 device=ZENER_DIODE T 56100 43900 5 10 1 1 0 0 1 refdes=DZ4 T 56100 43700 5 10 0 1 0 0 1 value=1N759 T 56100 43650 5 10 1 1 0 0 1 description=12V } C 58600 43400 1 270 1 zener-1.sym { T 59200 43800 5 10 0 0 90 2 1 device=ZENER_DIODE T 58200 43900 5 10 1 1 0 0 1 refdes=DZ5 T 58200 43700 5 10 0 1 0 0 1 value=1N759 T 58200 43650 5 10 1 1 0 0 1 description=12V } C 57400 44300 1 90 1 resistor-2.sym { T 57450 43900 5 10 1 1 0 0 1 refdes=R44 T 57450 43650 5 10 1 1 0 0 1 value=22 } C 59500 44300 1 90 1 resistor-2.sym { T 59550 43900 5 10 1 1 0 0 1 refdes=R45 T 59550 43650 5 10 1 1 0 0 1 value=22 } N 56700 45200 58000 45200 4 N 56700 43400 57500 43400 4 N 58800 45200 60100 45200 4 N 58800 43400 59600 43400 4 N 57300 47400 57300 47800 4 N 56700 49200 57500 49200 4 N 57300 49200 57300 48700 4 N 58800 49200 59600 49200 4 N 59400 49200 59400 48700 4 N 58800 47400 60100 47400 4 N 59400 47400 59400 47800 4 C 56600 50100 1 270 0 resistor-2.sym { T 56500 49700 5 10 1 1 0 6 1 refdes=R36 T 56500 49400 5 10 1 1 0 6 1 value=270 } C 58700 50100 1 270 0 resistor-2.sym { T 58600 49700 5 10 1 1 0 6 1 refdes=R38 T 58600 49400 5 10 1 1 0 6 1 value=270 } C 56600 43400 1 270 0 resistor-2.sym { T 56550 43000 5 10 1 1 0 6 1 refdes=R37 T 56550 42750 5 10 1 1 0 6 1 value=270 } C 58700 43400 1 270 0 resistor-2.sym { T 58650 43000 5 10 1 1 0 6 1 refdes=R39 T 58650 42750 5 10 1 1 0 6 1 value=270 } C 58100 47400 1 90 1 resistor-2.sym { T 57850 47000 5 10 1 1 0 6 1 refdes=R40 T 57850 46750 5 10 1 1 0 6 1 value=0.22 } C 58100 46100 1 90 1 resistor-2.sym { T 57850 45700 5 10 1 1 0 6 1 refdes=R42 T 57850 45450 5 10 1 1 0 6 1 value=0.22 } C 60000 47400 1 270 0 resistor-2.sym { T 59950 47000 5 10 1 1 0 6 1 refdes=R41 T 59950 46750 5 10 1 1 0 6 1 value=0.22 } C 60000 46100 1 270 0 resistor-2.sym { T 59950 45700 5 10 1 1 0 6 1 refdes=R43 T 59950 45450 5 10 1 1 0 6 1 value=0.22 } N 55900 46800 55900 50100 4 N 55900 50100 58800 50100 4 N 55900 45900 55900 42500 4 N 55900 42500 58800 42500 4 N 58000 46500 58000 46100 4 N 60100 46500 60100 46100 4 N 58000 47400 56700 47400 4 N 58000 49800 58000 50400 4 N 60100 49800 60100 50400 4 N 58000 42800 58000 42200 4 N 60100 42800 60100 42200 4 N 60100 43600 60100 45200 4 N 60100 47400 60100 49000 4 N 58000 46400 60100 46400 4 { T 58800 46500 5 10 1 1 0 0 1 netname=Vout } N 60100 46200 61400 46200 4 C 60800 46200 1 90 1 resistor-2.sym { T 60800 46600 5 10 1 1 0 6 1 refdes=R46 T 60750 46350 5 10 1 1 0 6 1 value=22 } C 61200 46200 1 90 1 resistor-2.sym { T 61000 46600 5 10 1 1 0 0 1 refdes=R47 T 61050 46350 5 10 1 1 0 0 1 value=22 } C 61100 45300 1 90 1 capacitor-1.sym { T 60400 45100 5 10 0 0 270 2 1 device=CAPACITOR T 60800 45000 5 10 1 1 0 6 1 refdes=C14 T 60200 45100 5 10 0 0 270 2 1 symversion=0.1 T 60800 44550 5 10 1 1 0 6 1 value=22n } C 60800 44100 1 0 0 gnd-1.sym { T 60800 44100 5 10 0 0 0 0 1 netname=GND } N 60700 45300 61100 45300 4 N 58000 49000 58000 47400 4 N 58000 45200 58000 43600 4 C 61300 44100 1 0 0 gnd-1.sym { T 61300 44100 5 10 0 0 0 0 1 netname=GND } N 61400 46200 61400 45500 4 N 61400 45100 61400 44400 4 C 50100 40100 1 0 0 spice-model-1.sym { T 50200 40700 5 10 1 1 0 0 1 refdes=A8 T 51400 40400 5 10 1 1 0 0 1 model-name=1N759 T 50600 40200 5 10 1 1 0 0 1 file=../../lib/diode/1n759.mod } C 52900 41000 1 0 0 spice-model-1.sym { T 53000 41600 5 10 1 1 0 0 1 refdes=A10 T 54200 41300 5 10 1 1 0 0 1 model-name=2SK1058 T 53400 41100 5 10 1 1 0 0 1 file=../../lib/mosfet/2sk1058.ckt } C 52900 40100 1 0 0 spice-model-1.sym { T 53000 40700 5 10 1 1 0 0 1 refdes=A11 T 54200 40400 5 10 1 1 0 0 1 model-name=2SJ162 T 53400 40200 5 10 1 1 0 0 1 file=../../lib/mosfet/2sj162.ckt } C 55600 46800 1 270 0 resistor-2.sym { T 55500 46400 5 10 1 1 0 6 1 refdes=RV2 T 55500 46150 5 10 1 1 0 6 1 value=100 } N 55700 45900 56100 45900 4 T 63500 50200 8 10 0 0 270 0 1 device=INDUCTOR T 63700 50200 8 10 0 0 270 0 1 symversion=0.1 B 62450 45100 150 400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 L 62600 45500 62900 46000 3 0 0 0 -1 -1 L 62900 46000 62900 44600 3 0 0 0 -1 -1 L 62900 44600 62600 45100 3 0 0 0 -1 -1 N 62300 45100 62300 45500 4 C 61400 45600 1 180 1 resistor-2.sym { T 61550 45700 5 10 1 1 0 0 1 refdes=Rspkr T 62300 45850 5 10 1 1 180 0 1 value=8 } C 62300 45000 1 0 1 inductor-1.sym { T 61550 44850 5 10 1 1 180 8 1 refdes=Lspkr T 62150 44850 5 10 1 1 0 0 1 value=1m T 62100 45500 5 10 0 0 180 2 1 device=INDUCTOR T 62100 45700 5 10 0 0 180 2 1 symversion=0.1 } A 62500 45300 224 297 126 3 0 0 0 -1 -1 C 59600 49000 1 0 0 spice-nmos-2.sym { T 60200 49500 5 10 0 0 0 0 1 device=SUBCKT T 59300 49500 5 10 1 1 0 0 1 refdes=X20 T 59200 49750 5 10 1 1 0 0 1 value=2SK1058 } C 59600 43600 1 180 1 spice-pmos-2.sym { T 60200 43100 5 10 0 0 180 6 1 device=SUBCKT T 59300 43100 5 10 1 1 180 6 1 refdes=X22 T 59300 42850 5 10 1 1 180 6 1 value=2SJ162 } C 57500 49000 1 0 0 spice-nmos-2.sym { T 58100 49500 5 10 0 0 0 0 1 device=SUBCKT T 57200 49500 5 10 1 1 0 0 1 refdes=X19 T 57100 49750 5 10 1 1 0 0 1 value=2SK1058 } C 57500 43600 1 180 1 spice-pmos-2.sym { T 58100 43100 5 10 0 0 180 6 1 device=SUBCKT T 57200 43100 5 10 1 1 180 6 1 refdes=X21 T 57200 42850 5 10 1 1 180 6 1 value=2SJ162 } C 54600 45600 1 0 0 gnd-1.sym { T 54600 45600 5 10 0 0 0 0 1 netname=GND } gspiceui-1.0.00+dfsg/sch/aem-6000/input-stage.sch0000644000000000000000000002036111636642250017665 0ustar rootrootv 20110115 2 C 40000 40000 0 0 0 title-A3.sym C 44700 43700 1 270 0 resistor-2.sym { T 44650 43300 5 10 1 1 0 6 1 refdes=R12 T 44650 43050 5 10 1 1 0 6 1 value=2.7K } C 43000 45400 1 180 0 resistor-2.sym { T 42400 45450 5 10 1 1 0 0 1 refdes=R3 T 42400 45000 5 10 1 1 0 0 1 value=1K } C 44100 44700 1 0 0 resistor-2.sym { T 44350 44950 5 10 1 1 0 0 1 refdes=RV1a T 44400 44500 5 10 1 1 0 0 1 value=10K } C 41200 44400 1 90 0 voltage-1.sym { T 40750 44950 5 10 1 1 180 0 1 refdes=Vin T 40400 44450 5 10 0 1 0 0 1 value=DC 0.0 } C 51200 42600 1 0 0 spice-model-1.sym { T 51300 43200 5 10 1 1 0 0 1 refdes=A2 T 52500 42900 5 10 1 1 0 0 1 model-name=BC547 T 51700 42700 5 10 1 1 0 0 1 file=../../lib/bjt/bc547.mod } C 51200 41600 1 0 0 spice-model-1.sym { T 51300 42200 5 10 1 1 0 0 1 refdes=A3 T 52500 41900 5 10 1 1 0 0 1 model-name=BC640 T 51700 41700 5 10 1 1 0 0 1 file=../../lib/bjt/bc640.mod } C 50200 43750 1 0 1 vdc-1.sym { T 49500 44300 5 10 0 1 0 6 1 refdes=V1 T 49500 44250 5 10 1 1 0 6 1 value=DC +70V } C 49600 43450 1 180 1 vdc-1.sym { T 49200 42950 5 10 0 1 180 6 1 refdes=V2 T 48800 42900 5 10 1 1 180 6 1 value=DC -70V } C 49325 43450 1 0 0 gnd-1.sym { T 49325 43450 5 10 0 0 0 0 1 netname=GND } C 46100 44800 1 270 0 resistor-2.sym { T 46350 44400 5 10 1 1 0 0 1 refdes=R5 T 46350 44150 5 10 1 1 0 0 1 value=220 } C 41900 45300 1 270 0 resistor-2.sym { T 41600 44800 5 10 1 1 0 0 1 refdes=R1 T 41400 44600 5 10 1 1 0 0 1 value=100K } C 41900 44100 1 0 0 gnd-1.sym { T 41900 44100 5 10 0 0 0 0 1 netname=GND } N 41000 44400 43100 44400 4 C 51200 43600 1 0 0 spice-model-1.sym { T 51300 44200 5 10 1 1 0 0 1 refdes=A1 T 52500 43900 5 10 1 1 0 0 1 model-name=BC639 T 51700 43700 5 10 1 1 0 0 1 file=../../lib/bjt/bc639.mod } T 50500 40900 9 14 1 0 0 0 1 AEM Audio Power Amplifier - Series 6000 T 49500 40400 9 10 1 0 0 0 1 input-stage.sch T 50500 40100 9 10 1 0 0 0 1 1 T 51000 40100 9 10 1 0 0 0 1 1 T 53400 40400 9 10 1 0 0 0 1 23 / 09 / 2011 T 53400 40100 9 10 1 0 0 0 1 Mike Waters C 50100 42250 1 180 0 vee-1.sym { T 50100 42250 5 10 0 0 0 0 1 netname=Vee } C 45400 41000 1 180 0 vee-1.sym { T 45400 41000 5 10 0 0 180 0 1 netname=Vee } C 44900 50400 1 0 0 vcc-1.sym { T 44900 50400 5 10 0 0 0 0 1 netname=Vcc } C 49700 44950 1 0 0 vcc-1.sym { T 49700 44950 5 10 0 0 0 0 1 netname=Vcc } N 49900 43750 49900 43450 4 N 49900 43750 49425 43750 4 C 41000 45100 1 0 0 capacitor-1.sym { T 41200 45800 5 10 0 0 0 0 1 device=CAPACITOR T 41100 45400 5 10 1 1 0 0 1 refdes=C1 T 41200 46000 5 10 0 0 0 0 1 symversion=0.1 T 41600 45400 5 10 1 1 0 0 1 value=470n } N 41900 45300 42100 45300 4 C 43300 44400 1 90 0 capacitor-1.sym { T 42600 44600 5 10 0 0 90 0 1 device=CAPACITOR T 43150 44950 5 10 1 1 0 0 1 refdes=C2 T 42400 44600 5 10 0 0 90 0 1 symversion=0.1 T 43150 44600 5 10 1 1 0 0 1 value=1n } N 43000 45300 43500 45300 4 C 45200 44700 1 0 0 resistor-2.sym { T 45450 44950 5 10 1 1 0 0 1 refdes=RV1b T 45450 44500 5 10 1 1 0 0 1 value=10K } C 44900 45500 1 270 1 zener-1.sym { T 45500 45900 5 10 0 0 90 2 1 device=ZENER_DIODE T 44500 46000 5 10 1 1 0 0 1 refdes=DZ1 T 44500 45800 5 10 0 1 0 0 1 value=1N759 T 44500 45750 5 10 1 1 0 0 1 description=12V } N 44500 46400 45700 46400 4 C 43900 44800 1 270 0 resistor-2.sym { T 43850 44400 5 10 1 1 0 6 1 refdes=R4 T 43850 44150 5 10 1 1 0 6 1 value=220 } N 44000 43900 46200 43900 4 N 46200 45100 46200 44800 4 N 44000 45100 44000 44800 4 N 45000 44800 45200 44800 4 N 45300 42400 45600 42400 4 N 44800 41900 45100 41900 4 C 44700 41900 1 270 0 resistor-2.sym { T 44600 41500 5 10 1 1 0 6 1 refdes=R13 T 44600 41250 5 10 1 1 0 6 1 value=120 } C 45500 43300 1 270 0 resistor-2.sym { T 45750 42900 5 10 1 1 0 0 1 refdes=R14 T 45750 42650 5 10 1 1 0 0 1 value=10K } C 45700 43600 1 180 0 gnd-1.sym { T 45700 43600 5 10 0 0 0 0 1 netname=GND } N 45600 41400 45600 41000 4 N 45600 41000 44800 41000 4 C 44900 47300 1 180 0 capacitor-1.sym { T 44700 46600 5 10 0 0 180 0 1 device=CAPACITOR T 44100 47150 5 10 1 1 0 0 1 refdes=C3 T 44700 46400 5 10 0 0 180 0 1 symversion=0.1 T 44550 46900 5 10 1 1 0 0 1 value=47p } C 43900 48400 1 270 0 resistor-2.sym { T 43800 48000 5 10 1 1 0 6 1 refdes=R6 T 43800 47750 5 10 1 1 0 6 1 value=33K } C 46300 48400 1 90 1 resistor-2.sym { T 46600 47950 5 10 1 1 0 6 1 refdes=R7 T 46700 47700 5 10 1 1 0 6 1 value=33K } N 44700 49500 45000 49500 4 N 45200 49000 45500 49000 4 N 44900 47100 45300 47100 4 C 44800 48600 1 90 1 resistor-2.sym { T 44850 48200 5 10 1 1 0 0 1 refdes=R9 T 44850 48000 5 10 1 1 0 0 1 value=3.3K } C 44800 50400 1 90 1 resistor-2.sym { T 44550 50000 5 10 1 1 0 6 1 refdes=R8 T 44550 49800 5 10 1 1 0 6 1 value=180 } C 45400 49000 1 270 0 resistor-2.sym { T 45650 48600 5 10 1 1 0 0 1 refdes=R10 T 45650 48400 5 10 1 1 0 0 1 value=10K } C 45400 47800 1 0 0 gnd-1.sym { T 45400 47800 5 10 0 0 0 0 1 netname=GND } N 44000 50400 46200 50400 4 N 45500 50000 45500 50400 4 N 44700 47600 45000 47600 4 N 45000 47600 45000 46400 4 N 44000 48400 44000 50400 4 N 46200 48400 46200 50400 4 N 46200 47500 46200 46800 4 N 44000 47500 44000 46800 4 N 44700 47700 44700 47600 4 N 45100 43900 45100 45500 4 N 46700 45300 47100 45300 4 C 47200 44400 1 90 0 resistor-2.sym { T 47600 44900 5 10 1 1 0 6 1 refdes=R49 T 47500 44700 5 10 1 1 0 6 1 value=1K } C 47000 44100 1 0 0 gnd-1.sym { T 47000 44100 5 10 0 0 0 0 1 netname=GND } C 53700 43600 1 0 0 spice-model-1.sym { T 53800 44200 5 10 1 1 0 0 1 refdes=A4 T 55000 43900 5 10 1 1 0 0 1 model-name=BC557 T 54200 43700 5 10 1 1 0 0 1 file=../../lib/bjt/bc557.mod } C 53700 42600 1 0 0 spice-model-1.sym { T 53800 43200 5 10 1 1 0 0 1 refdes=A8 T 55000 42900 5 10 1 1 0 0 1 model-name=1N759 T 54200 42700 5 10 1 1 0 0 1 file=../../lib/diode/1n759.mod } C 53700 41600 1 0 0 spice-model-1.sym { T 53800 42200 5 10 1 1 0 0 1 refdes=A9 T 55000 41900 5 10 1 1 0 0 1 model-name=ECG461 T 54200 41700 5 10 1 1 0 0 1 file=../../lib/jfet/ecg461.mod } T 63500 50200 8 10 0 0 270 0 1 device=INDUCTOR T 63700 50200 8 10 0 0 270 0 1 symversion=0.1 N 44000 45900 44000 45800 4 N 46200 45900 46200 45800 4 C 43500 45100 1 0 0 spice-njfet-1.sym { T 44300 45500 5 10 0 0 0 0 1 device=FET_TRANSISTOR T 44100 45550 5 10 1 1 0 0 1 refdes=J1 T 43900 45350 5 10 1 1 0 0 1 value=ECG461 } C 46700 45100 1 0 1 spice-njfet-1.sym { T 45900 45500 5 10 0 0 0 6 1 device=FET_TRANSISTOR T 46100 45550 5 10 1 1 0 6 1 refdes=J2 T 46350 45350 5 10 1 1 0 6 1 value=ECG461 } C 44500 45900 1 0 1 spice-npn-2.sym { T 43600 46600 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 43900 46500 5 10 1 1 0 6 1 refdes=Q3 T 44150 46300 5 10 1 1 0 6 1 value=BC639 } C 45700 45900 1 0 0 spice-npn-2.sym { T 46600 46600 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 46300 46500 5 10 1 1 0 0 1 refdes=Q4 T 46050 46300 5 10 1 1 0 0 1 value=BC639 } C 45300 41900 1 0 1 spice-npn-2.sym { T 44400 42600 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 44700 42500 5 10 1 1 0 6 1 refdes=Q7 T 44950 42300 5 10 1 1 0 6 1 value=BC639 } N 44800 43700 44800 43900 4 C 45100 41400 1 0 0 spice-npn-2.sym { T 46000 42100 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 45700 42000 5 10 1 1 0 0 1 refdes=Q8 T 45450 41800 5 10 1 1 0 0 1 value=BC547 } N 45600 42300 45600 42400 4 C 45200 49500 1 180 0 spice-pnp-2.sym { T 44300 48800 5 8 0 0 180 0 1 device=PNP_TRANSISTOR T 44600 49250 5 10 1 1 180 0 1 refdes=Q5 T 44850 49050 5 10 1 1 180 0 1 value=BC640 } C 45000 50000 1 180 1 spice-pnp-2.sym { T 45900 49300 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 45600 49750 5 10 1 1 180 6 1 refdes=Q6 T 45350 49550 5 10 1 1 180 6 1 value=BC557 } N 45500 49100 45500 49000 4 N 44000 44800 44100 44800 4 N 46100 44800 46200 44800 4 C 46200 47200 1 180 0 resistor-2.sym { T 45600 47250 5 10 1 1 0 0 1 refdes=R11 T 45600 46800 5 10 1 1 0 0 1 value=1K } N 46200 47300 46900 47300 4 N 44000 47300 43200 47300 4 T 48800 49100 9 10 1 0 0 0 8 Differential input stage : Rload represents the load presented by the next stage Current source formed by Q5 = 3.95mA Current source formed by Q7 = 5.85mA AC analysis : Gain (without Rload) = 25.5 = 28.1 dB AC analysis : Gain (with Rload) = 4.7 = 13.4 dB Transient analysis : Gain (without Rload) = 25.5 @ Vin = 1 KHz & 100 mV Transient analysis : Gain (with Rload) = 5.0 @ Vin = 1 KHz & 100 mV N 43200 47300 43200 51000 4 N 43200 51000 46900 51000 4 N 46900 51000 46900 49500 4 C 47000 49500 1 90 1 resistor-2.sym { T 47050 49100 5 10 1 1 0 0 1 refdes=Rload T 47050 48900 5 10 1 1 0 0 1 value=16.14K } N 46900 47300 46900 48600 4 gspiceui-1.0.00+dfsg/sch/aem-6000/aem-6000-amp.sch0000644000000000000000000006245011637727657017352 0ustar rootrootv 20110115 2 C 40000 40000 0 0 0 title-A2.sym C 45000 45500 1 270 0 resistor-2.sym { T 45250 45150 5 10 1 1 0 0 1 refdes=R12 T 45250 44950 5 10 1 1 0 0 1 value=2.7K } C 43500 47300 1 180 0 resistor-2.sym { T 42900 47350 5 10 1 1 0 0 1 refdes=R3 T 42900 46900 5 10 1 1 0 0 1 value=1K } C 44600 46600 1 0 0 resistor-2.sym { T 44850 46850 5 10 1 1 0 0 1 refdes=RV1a T 44800 46400 5 10 1 1 0 0 1 value=10511 } C 41000 47200 1 270 0 voltage-1.sym { T 40950 46850 5 10 1 1 180 0 1 refdes=Vin T 41800 47150 5 10 0 1 180 0 1 value=DC 0.0 } C 40200 42800 1 0 0 spice-model-1.sym { T 40300 43400 5 10 1 1 0 0 1 refdes=A2 T 41500 43100 5 10 1 1 0 0 1 model-name=BC547 T 40700 42900 5 10 1 1 0 0 1 file=../../lib/bjt/bc547.mod } C 40200 41900 1 0 0 spice-model-1.sym { T 40300 42500 5 10 1 1 0 0 1 refdes=A3 T 41500 42200 5 10 1 1 0 0 1 model-name=BC640 T 40700 42000 5 10 1 1 0 0 1 file=../../lib/bjt/bc640.mod } C 40200 40100 1 0 0 spice-model-1.sym { T 40300 40700 5 10 1 1 0 0 1 refdes=A5 T 41500 40400 5 10 1 1 0 0 1 model-name=MJE340 T 40700 40200 5 10 1 1 0 0 1 file=../../lib/bjt/mje340.mod } C 42700 41000 1 0 0 spice-model-1.sym { T 42800 41600 5 10 1 1 0 0 1 refdes=A6 T 44000 41300 5 10 1 1 0 0 1 model-name=MJE350 T 43200 41100 5 10 1 1 0 0 1 file=../../lib/bjt/mje350.mod } C 62500 50950 1 0 1 vdc-1.sym { T 61800 51500 5 10 0 1 0 6 1 refdes=V1 T 61800 51450 5 10 1 1 0 6 1 value=DC +70V } C 61900 50650 1 180 1 vdc-1.sym { T 61500 50150 5 10 0 1 180 6 1 refdes=V2 T 61100 50100 5 10 1 1 180 6 1 value=DC -70V } C 61625 50650 1 0 0 gnd-1.sym { T 61625 50650 5 10 0 0 0 0 1 netname=GND } C 47500 52000 1 90 1 capacitor-4.sym { T 47550 51450 5 10 1 1 0 0 1 refdes=C5 T 47350 51200 5 10 1 1 0 0 1 value=100u } C 48400 52200 1 270 0 diode-1.sym { T 48900 51600 5 10 1 1 0 0 1 refdes=D1 T 48650 51350 5 10 1 1 0 0 1 value=1N914 } C 46800 46600 1 270 0 resistor-2.sym { T 47050 46200 5 10 1 1 0 0 1 refdes=R5 T 47050 45950 5 10 1 1 0 0 1 value=220 } C 42400 47200 1 270 0 resistor-2.sym { T 42100 46700 5 10 1 1 0 0 1 refdes=R1 T 41900 46500 5 10 1 1 0 0 1 value=100K } C 42400 46000 1 0 0 gnd-1.sym { T 42400 46000 5 10 0 0 0 0 1 netname=GND } N 41200 46300 43600 46300 4 C 40200 43700 1 0 0 spice-model-1.sym { T 40300 44300 5 10 1 1 0 0 1 refdes=A1 T 41500 44000 5 10 1 1 0 0 1 model-name=BC639 T 40700 43800 5 10 1 1 0 0 1 file=../../lib/bjt/bc639.mod } C 42700 40100 1 0 0 spice-model-1.sym { T 42800 40700 5 10 1 1 0 0 1 refdes=A7 T 44000 40400 5 10 1 1 0 0 1 model-name=1N914 T 43200 40200 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } T 57300 40900 9 14 1 0 0 0 1 AEM Audio Power Amplifier - Series 6000 T 56300 40400 9 10 1 0 0 0 1 aem-6000-amp.sch T 57300 40100 9 10 1 0 0 0 1 1 T 57800 40100 9 10 1 0 0 0 1 1 T 60200 40400 9 10 1 0 0 0 1 22 / 09 / 2011 T 60200 40100 9 10 1 0 0 0 1 Mike Waters C 62400 49450 1 180 0 vee-1.sym { T 62400 49450 5 10 0 0 0 0 1 netname=Vee } C 56000 42800 1 180 0 vee-1.sym { T 56000 42800 5 10 0 0 180 0 1 netname=Vee } C 55600 52200 1 0 0 vcc-1.sym { T 55600 52200 5 10 0 0 0 0 1 netname=Vcc } C 62000 52150 1 0 0 vcc-1.sym { T 62000 52150 5 10 0 0 0 0 1 netname=Vcc } N 62200 50950 62200 50650 4 N 62200 50950 61725 50950 4 C 41300 47000 1 0 0 capacitor-1.sym { T 41500 47700 5 10 0 0 0 0 1 device=CAPACITOR T 41400 47300 5 10 1 1 0 0 1 refdes=C1 T 41500 47900 5 10 0 0 0 0 1 symversion=0.1 T 41900 47300 5 10 1 1 0 0 1 value=470n } N 42200 47200 42600 47200 4 C 43800 46300 1 90 0 capacitor-1.sym { T 43100 46500 5 10 0 0 90 0 1 device=CAPACITOR T 43650 46850 5 10 1 1 0 0 1 refdes=C2 T 42900 46500 5 10 0 0 90 0 1 symversion=0.1 T 43650 46500 5 10 1 1 0 0 1 value=1n } N 43500 47200 44000 47200 4 C 45900 46600 1 0 0 resistor-2.sym { T 46150 46850 5 10 1 1 0 0 1 refdes=RV1b T 46150 46400 5 10 1 1 0 0 1 value=9489 } C 45500 47300 1 270 1 zener-1.sym { T 46100 47700 5 10 0 0 90 2 1 device=ZENER_DIODE T 45100 47850 5 10 1 1 0 0 1 refdes=DZ1 T 45100 47600 5 10 0 1 0 0 1 value=1N759 T 45100 47650 5 10 1 1 0 0 1 description=12V } N 45000 48400 46400 48400 4 C 44400 46600 1 270 0 resistor-2.sym { T 44350 46200 5 10 1 1 0 6 1 refdes=R4 T 44350 45950 5 10 1 1 0 6 1 value=220 } N 44500 45700 46900 45700 4 N 46900 47000 46900 46600 4 N 44500 47000 44500 46600 4 N 45700 47300 45700 45700 4 N 45500 46700 45900 46700 4 N 45600 44200 46100 44200 4 N 45100 43700 45600 43700 4 C 45200 43700 1 90 1 resistor-2.sym { T 45250 43300 5 10 1 1 0 0 1 refdes=R13 T 45250 43050 5 10 1 1 0 0 1 value=120 } C 46200 45100 1 90 1 resistor-2.sym { T 45950 44600 5 10 1 1 0 6 1 refdes=R14 T 45950 44400 5 10 1 1 0 6 1 value=10K } C 46200 45400 1 180 0 gnd-1.sym { T 46200 45400 5 10 0 0 0 0 1 netname=GND } N 46100 43200 46100 42800 4 N 47000 42800 45100 42800 4 C 45800 49000 1 0 0 resistor-2.sym { T 46150 49250 5 10 1 1 0 0 1 refdes=R11 T 46150 48800 5 10 1 1 0 0 1 value=1K } C 45400 49300 1 180 0 capacitor-1.sym { T 45200 48600 5 10 0 0 180 0 1 device=CAPACITOR T 44600 49200 5 10 1 1 0 0 1 refdes=C3 T 45200 48400 5 10 0 0 180 0 1 symversion=0.1 T 45100 48900 5 10 1 1 0 0 1 value=47p } C 44400 50500 1 270 0 resistor-2.sym { T 44300 50100 5 10 1 1 0 6 1 refdes=R6 T 44300 49850 5 10 1 1 0 6 1 value=33K } C 47000 50500 1 90 1 resistor-2.sym { T 47100 50100 5 10 1 1 0 0 1 refdes=R7 T 47100 49850 5 10 1 1 0 0 1 value=33K } N 45200 51300 45700 51300 4 N 45700 50800 46200 50800 4 N 45400 49100 45800 49100 4 C 45300 50400 1 90 1 resistor-2.sym { T 45400 49900 5 10 1 1 0 0 1 refdes=R9 T 45400 49700 5 10 1 1 0 0 1 value=3.3K } C 45300 52200 1 90 1 resistor-2.sym { T 45400 51800 5 10 1 1 0 0 1 refdes=R8 T 45400 51600 5 10 1 1 0 0 1 value=180 } C 46100 50800 1 270 0 resistor-2.sym { T 46000 50400 5 10 1 1 0 6 1 refdes=R10 T 46000 50200 5 10 1 1 0 6 1 value=10K } C 46100 49600 1 0 0 gnd-1.sym { T 46100 49600 5 10 0 0 0 0 1 netname=GND } N 44500 52200 47300 52200 4 N 46200 51800 46200 52200 4 N 45200 49500 45500 49500 4 N 45500 49500 45500 48400 4 N 44500 50500 44500 52200 4 N 46900 50500 46900 52200 4 N 46900 49600 46900 48800 4 N 44500 49600 44500 48800 4 C 48400 51300 1 270 0 diode-1.sym { T 48900 50700 5 10 1 1 0 0 1 refdes=D2 T 48650 50450 5 10 1 1 0 0 1 value=1N914 } C 48400 50400 1 270 0 diode-1.sym { T 48900 49800 5 10 1 1 0 0 1 refdes=D3 T 48650 49550 5 10 1 1 0 0 1 value=1N914 } C 47300 52100 1 0 0 resistor-2.sym { T 47450 51850 5 10 1 1 0 0 1 refdes=R15 T 47950 51850 5 10 1 1 0 0 1 value=10 } C 47200 43900 1 90 1 capacitor-4.sym { T 47250 43400 5 10 1 1 0 0 1 refdes=C4 T 47050 43650 5 10 1 1 0 0 1 value=100u } C 48400 45500 1 270 0 diode-1.sym { T 48900 44900 5 10 1 1 0 0 1 refdes=D4 T 48650 44650 5 10 1 1 0 0 1 value=1N914 } C 48400 44600 1 270 0 diode-1.sym { T 48900 44000 5 10 1 1 0 0 1 refdes=D5 T 48650 43750 5 10 1 1 0 0 1 value=1N914 } C 47000 42700 1 0 0 resistor-2.sym { T 47100 42500 5 10 1 1 0 0 1 refdes=R16 T 47600 42500 5 10 1 1 0 0 1 value=10 } C 48400 43700 1 270 0 diode-1.sym { T 48900 43100 5 10 1 1 0 0 1 refdes=D6 T 48650 42850 5 10 1 1 0 0 1 value=1N914 } C 47100 44200 1 180 0 gnd-1.sym { T 47100 44200 5 10 0 0 0 0 1 netname=GND } C 47200 50800 1 0 0 gnd-1.sym { T 47200 50800 5 10 0 0 0 0 1 netname=GND } C 48700 49300 1 90 1 resistor-2.sym { T 49100 48900 5 10 1 1 0 6 1 refdes=R17 T 49100 48650 5 10 1 1 0 6 1 value=10K } C 48700 46600 1 90 1 resistor-2.sym { T 49100 46200 5 10 1 1 0 6 1 refdes=R18 T 49100 45950 5 10 1 1 0 6 1 value=10K } N 48600 48400 48600 46600 4 N 48600 45700 48600 45500 4 N 48600 49500 48600 49300 4 N 47400 47200 48100 47200 4 N 48100 42300 48100 47200 4 N 47900 42800 59600 42800 4 N 46900 48900 48100 48900 4 N 48100 48900 48100 47500 4 N 48100 47500 50400 47500 4 C 48900 46800 1 0 0 gnd-1.sym { T 48900 46800 5 10 0 0 0 0 1 netname=GND } N 49000 47100 48600 47100 4 N 47000 43000 47000 42800 4 N 47300 52200 47300 52000 4 N 48200 52200 59600 52200 4 C 49800 51400 1 90 1 resistor-2.sym { T 49850 51000 5 10 1 1 0 0 1 refdes=R19 T 49850 50750 5 10 1 1 0 0 1 value=150 } C 49800 44500 1 90 1 resistor-2.sym { T 49850 44100 5 10 1 1 0 0 1 refdes=R20 T 49850 43850 5 10 1 1 0 0 1 value=150 } N 49200 49400 48600 49400 4 N 49700 49900 49700 50500 4 N 49700 45100 49700 44500 4 N 49200 45600 48600 45600 4 N 49700 43600 49700 42800 4 N 49700 46000 49700 47300 4 N 49700 49000 49700 47700 4 N 49700 51400 49700 52200 4 C 51000 48600 1 90 1 resistor-2.sym { T 51050 48200 5 10 1 1 0 0 1 refdes=R23 T 51050 47950 5 10 1 1 0 0 1 value=100 } C 52000 48600 1 270 0 resistor-2.sym { T 51950 48200 5 10 1 1 0 6 1 refdes=R24 T 51950 47950 5 10 1 1 0 6 1 value=100 } C 51000 47300 1 90 1 resistor-2.sym { T 51050 46900 5 10 1 1 0 0 1 refdes=R25 T 51050 46650 5 10 1 1 0 0 1 value=100 } C 52200 47300 1 90 1 resistor-2.sym { T 51950 46900 5 10 1 1 0 6 1 refdes=R26 T 51950 46650 5 10 1 1 0 6 1 value=100 } N 50900 47700 52100 47700 4 N 50900 47300 52100 47300 4 N 50900 47700 50600 47300 4 N 50600 47300 49700 47300 4 N 50900 47300 50600 47700 4 N 50600 47700 49700 47700 4 C 50300 48800 1 270 0 resistor-2.sym { T 50250 48400 5 10 1 1 0 6 1 refdes=R22 T 50250 48150 5 10 1 1 0 6 1 value=100 } C 50300 47100 1 270 0 resistor-2.sym { T 50250 46700 5 10 1 1 0 6 1 refdes=R21 T 50250 46450 5 10 1 1 0 6 1 value=100 } N 50400 48800 50400 49100 4 N 50400 46200 50400 45900 4 N 50400 47900 50400 47100 4 C 51000 51000 1 90 1 resistor-2.sym { T 51050 50600 5 10 1 1 0 0 1 refdes=R27 T 51050 50350 5 10 1 1 0 0 1 value=680 } C 52000 51000 1 270 0 resistor-2.sym { T 51950 50600 5 10 1 1 0 6 1 refdes=R28 T 51950 50350 5 10 1 1 0 6 1 value=680 } C 51000 44900 1 90 1 resistor-2.sym { T 51050 44500 5 10 1 1 0 0 1 refdes=R29 T 51050 44250 5 10 1 1 0 0 1 value=680 } C 52000 44900 1 270 0 resistor-2.sym { T 51950 44500 5 10 1 1 0 6 1 refdes=R30 T 51950 44250 5 10 1 1 0 6 1 value=680 } N 50900 50100 50900 49500 4 N 52100 49500 52100 50100 4 N 50900 45500 50900 44900 4 N 52100 45500 52100 44900 4 C 53100 42400 1 180 1 resistor-2.sym { T 53100 42450 5 10 1 1 0 0 1 refdes=R48 T 53700 42450 5 10 1 1 0 0 1 value=47K } C 52700 41400 1 270 1 resistor-2.sym { T 52300 41900 5 10 1 1 0 0 1 refdes=R49 T 52400 41700 5 10 1 1 0 0 1 value=1K } C 54000 42000 1 180 0 capacitor-1.sym { T 53800 41300 5 10 0 0 180 0 1 device=CAPACITOR T 53200 41600 5 10 1 1 0 0 1 refdes=C6 T 53800 41100 5 10 0 0 180 0 1 symversion=0.1 T 53650 41600 5 10 1 1 0 0 1 value=15p } N 51500 51000 51500 52200 4 N 51500 44000 51500 42800 4 C 52700 41100 1 0 0 gnd-1.sym { T 52700 41100 5 10 0 0 0 0 1 netname=GND } N 48100 42300 53100 42300 4 N 54000 42300 59900 42300 4 C 52500 48800 1 270 0 resistor-2.sym { T 52750 48400 5 10 1 1 0 0 1 refdes=R31 T 52750 48150 5 10 1 1 0 0 1 value=100 } C 52700 47100 1 90 1 resistor-2.sym { T 52750 46700 5 10 1 1 0 0 1 refdes=R32 T 52750 46450 5 10 1 1 0 0 1 value=100 } N 52600 47900 52600 47100 4 N 52600 49100 52600 48800 4 N 52600 45900 52600 46200 4 N 52600 47500 53200 47500 4 N 52800 49100 52800 52500 4 N 52800 52500 43800 52500 4 N 43800 52500 43800 49400 4 N 43800 49400 44500 49400 4 C 54200 52200 1 90 1 resistor-2.sym { T 54300 51800 5 10 1 1 0 0 1 refdes=R33 T 54300 51500 5 10 1 1 0 0 1 value=33 } C 54200 43700 1 90 1 resistor-2.sym { T 54250 43300 5 10 1 1 0 0 1 refdes=R34 T 54250 43050 5 10 1 1 0 0 1 value=33 } C 53600 51300 1 90 1 resistor-2.sym { T 53650 50900 5 10 1 1 0 0 1 refdes=R51 T 53650 50650 5 10 1 1 0 0 1 value=10 } C 54600 51300 1 270 0 resistor-2.sym { T 54550 50900 5 10 1 1 0 6 1 refdes=R52 T 54550 50650 5 10 1 1 0 6 1 value=10 } C 53600 44600 1 90 1 resistor-2.sym { T 53650 44200 5 10 1 1 0 0 1 refdes=R53 T 53650 43950 5 10 1 1 0 0 1 value=10 } C 54600 44600 1 270 0 resistor-2.sym { T 54550 44200 5 10 1 1 0 6 1 refdes=R54 T 54550 43950 5 10 1 1 0 6 1 value=10 } N 53500 51300 54700 51300 4 N 53500 43700 54700 43700 4 N 53500 45500 53500 49500 4 N 52100 49900 53000 49900 4 N 50900 49700 53000 49700 4 N 53000 49700 53000 49300 4 N 53000 49300 55200 49300 4 N 53000 45100 52100 45100 4 N 50900 45300 53000 45300 4 N 53000 45300 53000 45700 4 N 53000 45700 55200 45700 4 C 55000 48000 1 90 1 resistor-2.sym { T 55050 47600 5 10 1 1 0 0 1 refdes=R35 T 55050 47350 5 10 1 1 0 0 1 value=100 } N 54000 42300 54000 41800 4 C 54400 49300 1 90 1 capacitor-1.sym { T 53700 49100 5 10 0 0 270 2 1 device=CAPACITOR T 54100 49000 5 10 1 1 0 6 1 refdes=C7 T 53500 49100 5 10 0 0 270 2 1 symversion=0.1 T 54100 48550 5 10 1 1 0 6 1 value=18p } C 54400 46600 1 90 1 capacitor-1.sym { T 53700 46400 5 10 0 0 270 2 1 device=CAPACITOR T 54100 46300 5 10 1 1 0 6 1 refdes=C8 T 53500 46400 5 10 0 0 270 2 1 symversion=0.1 T 54100 45850 5 10 1 1 0 6 1 value=18p } N 55200 49900 55200 49300 4 N 55200 45100 55200 45700 4 N 54200 48400 55400 48400 4 { T 55200 48100 5 10 1 1 0 0 1 netname=MOS_Drv } C 56400 49700 1 90 1 diode-1.sym { T 55900 49100 5 10 1 1 0 6 1 refdes=D7 T 56150 48850 5 10 1 1 0 6 1 value=1N914 } C 58500 49700 1 90 1 diode-1.sym { T 58000 49100 5 10 1 1 0 6 1 refdes=D9 T 58250 48850 5 10 1 1 0 6 1 value=1N914 } C 56400 46200 1 90 1 diode-1.sym { T 55900 45600 5 10 1 1 0 6 1 refdes=D8 T 56150 45350 5 10 1 1 0 6 1 value=1N914 } C 58500 46200 1 90 1 diode-1.sym { T 58050 45600 5 10 1 1 0 6 1 refdes=D10 T 58250 45350 5 10 1 1 0 6 1 value=1N914 } C 56600 50100 1 270 0 capacitor-1.sym { T 57300 49900 5 10 0 0 270 0 1 device=CAPACITOR T 56900 49800 5 10 1 1 0 0 1 refdes=C9 T 57500 49900 5 10 0 0 270 0 1 symversion=0.1 T 56900 49350 5 10 1 1 0 0 1 value=330p } C 58700 50100 1 270 0 capacitor-1.sym { T 59400 49900 5 10 0 0 270 0 1 device=CAPACITOR T 59000 49800 5 10 1 1 0 0 1 refdes=C10 T 59600 49900 5 10 0 0 270 0 1 symversion=0.1 T 59000 49350 5 10 1 1 0 0 1 value=330p } C 56600 46200 1 270 0 capacitor-1.sym { T 57300 46000 5 10 0 0 270 0 1 device=CAPACITOR T 56900 45900 5 10 1 1 0 0 1 refdes=C11 T 57500 46000 5 10 0 0 270 0 1 symversion=0.1 T 56900 45450 5 10 1 1 0 0 1 value=33p } C 58700 46200 1 270 0 capacitor-1.sym { T 59400 46000 5 10 0 0 270 0 1 device=CAPACITOR T 59000 45900 5 10 1 1 0 0 1 refdes=C12 T 59600 46000 5 10 0 0 270 0 1 symversion=0.1 T 59000 45450 5 10 1 1 0 0 1 value=33p } C 56000 49700 1 270 1 zener-1.sym { T 56600 50100 5 10 0 0 90 2 1 device=ZENER_DIODE T 55600 50200 5 10 1 1 0 0 1 refdes=DZ2 T 55600 50000 5 10 0 1 0 0 1 value=1N759 T 55600 49950 5 10 1 1 0 0 1 description=12V } C 58100 49700 1 270 1 zener-1.sym { T 58700 50100 5 10 0 0 90 2 1 device=ZENER_DIODE T 57700 50200 5 10 1 1 0 0 1 refdes=DZ3 T 57700 50000 5 10 0 1 0 0 1 value=1N759 T 57700 49950 5 10 1 1 0 0 1 description=12V } C 56000 44400 1 270 1 zener-1.sym { T 56600 44800 5 10 0 0 90 2 1 device=ZENER_DIODE T 55600 44900 5 10 1 1 0 0 1 refdes=DZ4 T 55600 44700 5 10 0 1 0 0 1 value=1N759 T 55600 44650 5 10 1 1 0 0 1 description=12V } C 58100 44400 1 270 1 zener-1.sym { T 58700 44800 5 10 0 0 90 2 1 device=ZENER_DIODE T 57700 44900 5 10 1 1 0 0 1 refdes=DZ5 T 57700 44700 5 10 0 1 0 0 1 value=1N759 T 57700 44650 5 10 1 1 0 0 1 description=12V } C 56900 45300 1 90 1 resistor-2.sym { T 56950 44900 5 10 1 1 0 0 1 refdes=R44 T 56950 44650 5 10 1 1 0 0 1 value=22 } C 59000 45300 1 90 1 resistor-2.sym { T 59050 44900 5 10 1 1 0 0 1 refdes=R45 T 59050 44650 5 10 1 1 0 0 1 value=22 } N 56200 46200 57500 46200 4 N 56200 44400 57000 44400 4 N 58300 46200 59600 46200 4 N 58300 44400 59100 44400 4 N 56800 48800 56800 49200 4 N 56200 50600 57000 50600 4 N 56800 50600 56800 50100 4 N 58300 50600 59100 50600 4 N 58900 50600 58900 50100 4 N 58300 48800 59600 48800 4 N 58900 48800 58900 49200 4 C 56100 51500 1 270 0 resistor-2.sym { T 56000 51100 5 10 1 1 0 6 1 refdes=R36 T 56000 50800 5 10 1 1 0 6 1 value=270 } C 58200 51500 1 270 0 resistor-2.sym { T 58100 51100 5 10 1 1 0 6 1 refdes=R38 T 58100 50800 5 10 1 1 0 6 1 value=270 } C 56100 44400 1 270 0 resistor-2.sym { T 56050 44000 5 10 1 1 0 6 1 refdes=R37 T 56050 43750 5 10 1 1 0 6 1 value=270 } C 58200 44400 1 270 0 resistor-2.sym { T 58150 44000 5 10 1 1 0 6 1 refdes=R39 T 58150 43750 5 10 1 1 0 6 1 value=270 } C 57600 48700 1 90 1 resistor-2.sym { T 57350 48300 5 10 1 1 0 6 1 refdes=R40 T 57350 48050 5 10 1 1 0 6 1 value=0.22 } C 57600 47200 1 90 1 resistor-2.sym { T 57350 46800 5 10 1 1 0 6 1 refdes=R42 T 57350 46550 5 10 1 1 0 6 1 value=0.22 } C 59500 48700 1 270 0 resistor-2.sym { T 59450 48300 5 10 1 1 0 6 1 refdes=R41 T 59450 48050 5 10 1 1 0 6 1 value=0.22 } C 59500 47200 1 270 0 resistor-2.sym { T 59450 46800 5 10 1 1 0 6 1 refdes=R43 T 59450 46550 5 10 1 1 0 6 1 value=0.22 } N 55400 48400 55400 51500 4 N 55400 51500 58300 51500 4 N 55400 46600 55400 43500 4 N 55400 43500 58300 43500 4 N 57500 47800 57500 47200 4 N 59600 47800 59600 47200 4 N 57500 48800 56200 48800 4 N 57500 51200 57500 52200 4 N 59600 51200 59600 52200 4 N 57500 43800 57500 42800 4 N 59600 43800 59600 42800 4 N 59600 44600 59600 46300 4 N 59600 48700 59600 50400 4 N 57500 47500 59600 47500 4 { T 58300 47600 5 10 1 1 0 0 1 netname=Vout } N 59600 47300 61000 47300 4 C 60400 47300 1 90 1 resistor-2.sym { T 60400 47700 5 10 1 1 0 6 1 refdes=R46 T 60350 47450 5 10 1 1 0 6 1 value=22 } C 60800 47300 1 90 1 resistor-2.sym { T 60600 47700 5 10 1 1 0 0 1 refdes=R47 T 60650 47450 5 10 1 1 0 0 1 value=22 } C 60700 46400 1 90 1 capacitor-1.sym { T 60000 46200 5 10 0 0 270 2 1 device=CAPACITOR T 60400 46100 5 10 1 1 0 6 1 refdes=C14 T 59800 46200 5 10 0 0 270 2 1 symversion=0.1 T 60400 45650 5 10 1 1 0 6 1 value=22n } C 60400 45200 1 0 0 gnd-1.sym { T 60400 45200 5 10 0 0 0 0 1 netname=GND } N 59900 47300 59900 42300 4 N 60300 46400 60700 46400 4 N 57500 50400 57500 48700 4 N 57500 46300 57500 44600 4 C 60900 45200 1 0 0 gnd-1.sym { T 60900 45200 5 10 0 0 0 0 1 netname=GND } N 61000 47300 61000 46600 4 N 61000 46200 61000 45500 4 C 40200 41000 1 0 0 spice-model-1.sym { T 40300 41600 5 10 1 1 0 0 1 refdes=A4 T 41500 41300 5 10 1 1 0 0 1 model-name=BC557 T 40700 41100 5 10 1 1 0 0 1 file=../../lib/bjt/bc557.mod } C 45400 41000 1 0 0 spice-model-1.sym { T 45500 41600 5 10 1 1 0 0 1 refdes=A8 T 46700 41300 5 10 1 1 0 0 1 model-name=1N759 T 45900 41100 5 10 1 1 0 0 1 file=../../lib/diode/1n759.mod } C 45400 40100 1 0 0 spice-model-1.sym { T 45500 40700 5 10 1 1 0 0 1 refdes=A9 T 46700 40400 5 10 1 1 0 0 1 model-name=ECG461 T 45900 40200 5 10 1 1 0 0 1 file=../../lib/jfet/ecg461.mod } C 48100 41000 1 0 0 spice-model-1.sym { T 48200 41600 5 10 1 1 0 0 1 refdes=A10 T 49400 41300 5 10 1 1 0 0 1 model-name=2SK1058 T 48600 41100 5 10 1 1 0 0 1 file=../../lib/mosfet/2sk1058.ckt } C 48100 40100 1 0 0 spice-model-1.sym { T 48200 40700 5 10 1 1 0 0 1 refdes=A11 T 49400 40400 5 10 1 1 0 0 1 model-name=2SJ162 T 48600 40200 5 10 1 1 0 0 1 file=../../lib/mosfet/2sj162.ckt } C 54400 48000 1 270 0 resistor-2.sym { T 54300 47600 5 10 1 1 0 6 1 refdes=RV2 T 54300 47350 5 10 1 1 0 6 1 value=100 } N 54200 46600 55400 46600 4 N 52100 51000 50900 51000 4 N 50900 44000 52100 44000 4 T 63500 50200 8 10 0 0 270 0 1 device=INDUCTOR T 63700 50200 8 10 0 0 270 0 1 symversion=0.1 N 54700 49500 54700 48400 4 N 54700 46600 54700 45500 4 N 54500 48400 54500 48000 4 N 54900 48000 54900 48400 4 N 54500 47100 54500 46600 4 N 54900 46600 54900 47100 4 C 44000 47000 1 0 0 spice-njfet-1.sym { T 44800 47400 5 10 0 0 0 0 1 device=FET_TRANSISTOR T 44600 47450 5 10 1 1 0 0 1 refdes=J1 T 44400 47250 5 10 1 1 0 0 1 value=ECG461 } C 47400 47000 1 0 1 spice-njfet-1.sym { T 46600 47400 5 10 0 0 0 6 1 device=FET_TRANSISTOR T 46800 47450 5 10 1 1 0 6 1 refdes=J2 T 47000 47250 5 10 1 1 0 6 1 value=ECG461 } C 45000 47900 1 0 1 spice-npn-2.sym { T 44100 48600 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 44400 48500 5 10 1 1 0 6 1 refdes=Q3 T 44650 48300 5 10 1 1 0 6 1 value=BC639 } C 46400 47900 1 0 0 spice-npn-2.sym { T 47300 48600 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 47000 48500 5 10 1 1 0 0 1 refdes=Q4 T 46750 48300 5 10 1 1 0 0 1 value=BC639 } C 45600 43700 1 0 1 spice-npn-2.sym { T 44700 44400 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 45000 44300 5 10 1 1 0 6 1 refdes=Q7 T 45250 44100 5 10 1 1 0 6 1 value=BC639 } C 45600 43200 1 0 0 spice-npn-2.sym { T 46500 43900 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 46200 43800 5 10 1 1 0 0 1 refdes=Q8 T 45950 43600 5 10 1 1 0 0 1 value=BC547 } N 46100 44100 46100 44200 4 C 49200 49900 1 180 1 spice-pnp-2.sym { T 50100 49200 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 49800 49500 5 10 1 1 0 0 1 refdes=Q9 T 49550 49300 5 10 1 1 0 0 1 value=MJE350 } C 45700 51300 1 180 0 spice-pnp-2.sym { T 44800 50600 5 8 0 0 180 0 1 device=PNP_TRANSISTOR T 45100 50950 5 10 1 1 0 6 1 refdes=Q5 T 45350 50700 5 10 1 1 0 6 1 value=BC640 } C 45700 51800 1 180 1 spice-pnp-2.sym { T 46600 51100 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 46300 51450 5 10 1 1 0 0 1 refdes=Q6 T 46050 51200 5 10 1 1 0 0 1 value=BC557 } N 46200 50900 46200 50800 4 C 52600 46400 1 180 0 spice-pnp-2.sym { T 51700 45700 5 8 0 0 180 0 1 device=PNP_TRANSISTOR T 52000 46200 5 10 1 1 180 0 1 refdes=Q14 T 52250 45950 5 10 1 1 180 0 1 value=MJE350 } C 50400 46400 1 180 1 spice-pnp-2.sym { T 51300 45700 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 51000 46200 5 10 1 1 180 6 1 refdes=Q13 T 50750 45950 5 10 1 1 180 6 1 value=MJE350 } C 53000 50400 1 180 1 spice-pnp-2.sym { T 53900 49700 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 53600 50200 5 10 1 1 180 6 1 refdes=Q15 T 53350 49950 5 10 1 1 180 6 1 value=MJE350 } C 55200 50400 1 180 0 spice-pnp-2.sym { T 54300 49700 5 8 0 0 180 0 1 device=PNP_TRANSISTOR T 54600 50200 5 10 1 1 180 0 1 refdes=Q16 T 54850 49950 5 10 1 1 180 0 1 value=MJE350 } C 55200 44600 1 0 1 spice-npn-2.sym { T 54300 45300 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 54600 45200 5 10 1 1 0 6 1 refdes=Q18 T 54800 45000 5 10 1 1 0 6 1 value=MJE340 } C 53000 44600 1 0 0 spice-npn-2.sym { T 53900 45300 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 53600 45200 5 10 1 1 0 0 1 refdes=Q17 T 53350 45000 5 10 1 1 0 0 1 value=MJE340 } C 50400 48600 1 0 0 spice-npn-2.sym { T 51300 49300 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 51000 49200 5 10 1 1 0 0 1 refdes=Q11 T 50750 49000 5 10 1 1 0 0 1 value=MJE340 } C 49200 45100 1 0 0 spice-npn-2.sym { T 50100 45800 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 49800 45300 5 10 1 1 0 0 1 refdes=Q10 T 49550 45500 5 10 1 1 0 0 1 value=MJE340 } C 52600 48600 1 0 1 spice-npn-2.sym { T 51700 49300 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 52000 49200 5 10 1 1 0 6 1 refdes=Q12 T 52250 49000 5 10 1 1 0 6 1 value=MJE340 } N 44500 46700 44600 46700 4 N 46800 46700 46900 46700 4 N 46700 49100 46900 49100 4 N 45100 45500 45100 45700 4 N 44500 47900 44500 47700 4 N 46900 47900 46900 47700 4 N 45700 48400 45700 48200 4 C 53800 46800 1 0 0 gnd-1.sym { T 53800 46800 5 10 0 0 0 0 1 netname=GND } N 53900 47100 53500 47100 4 N 41200 47200 41200 47600 4 N 41200 47900 42500 47600 4 N 42500 47200 42500 47600 4 N 41200 47200 41300 47200 4 N 53200 47500 53200 49100 4 N 53200 49100 52800 49100 4 N 53100 41800 53100 42300 4 B 62050 46200 150 400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 L 62200 46600 62500 47100 3 0 0 0 -1 -1 L 62500 47100 62500 45700 3 0 0 0 -1 -1 L 62500 45700 62200 46200 3 0 0 0 -1 -1 N 61900 46200 61900 46600 4 C 61000 46700 1 180 1 resistor-2.sym { T 61150 46800 5 10 1 1 0 0 1 refdes=Rspkr T 61900 46950 5 10 1 1 180 0 1 value=8 } C 61900 46100 1 0 1 inductor-1.sym { T 61150 45950 5 10 1 1 180 8 1 refdes=Lspkr T 61750 45950 5 10 1 1 0 0 1 value=1m T 61700 46600 5 10 0 0 180 2 1 device=INDUCTOR T 61700 46800 5 10 0 0 180 2 1 symversion=0.1 } A 62100 46400 224 297 126 3 0 0 0 -1 -1 T 46900 52900 9 10 1 0 0 0 17 NG-Spice : DC Analysis : Vin range : -4.2 to 3.0 mV Corresponding V(NMOS_Drv) : -65.2 to 66.9 V Open loop max gain : 32800 = 90.3 dBV Note : The DC gain characteristic is non-linear, The gain drops of as the input level increases. AC Analysis : Open loop max gain : 33474 = 90.5 dBV @ 2188 Hz Open loop -6dB points : 2.00 Hz, 29.4 KHz Closed loop -6dB points : 1.95 Hz, 186.5 KHz Transient Analysis : Sweep start, stop, step : 0, 2msec, 5usec Signal source : Vin, 2188 Hz, 100 uVp-p amplitude Open loop gain : 33440 = 90.5 dBV Note : Distortion is easily detectable owing to the non-linear gain characteristic. T 40200 54500 9 10 1 0 0 0 9 Differential input stage : The input stage is significantly loaded down by the second stage. AC analysis : Gain (unloaded) = 25.5 = 28.1 dB AC analysis : Gain ( loaded) = 4.7 = 13.4 dB Transient analysis : Gain (unloaded) = 25.5 @ Vin = 1 KHz & 100 mVp-p Transient analysis : Gain ( loaded) = 5.0 @ Vin = 1 KHz & 100 mVp-p Current source formed by Q5 = 3.95mA Current source formed by Q7 = 5.85mA C 59100 50400 1 0 0 spice-nmos-2.sym { T 59700 50900 5 10 0 0 0 0 1 device=SUBCKT T 58800 50900 5 10 1 1 0 0 1 refdes=X20 T 58700 51150 5 10 1 1 0 0 1 value=2SK1058 } C 59100 44600 1 180 1 spice-pmos-2.sym { T 59700 44100 5 10 0 0 180 6 1 device=SUBCKT T 58800 44100 5 10 1 1 180 6 1 refdes=X22 T 58800 43850 5 10 1 1 180 6 1 value=2SJ162 } C 57000 50400 1 0 0 spice-nmos-2.sym { T 57600 50900 5 10 0 0 0 0 1 device=SUBCKT T 56700 50900 5 10 1 1 0 0 1 refdes=X19 T 56600 51150 5 10 1 1 0 0 1 value=2SK1058 } C 57000 44600 1 180 1 spice-pmos-2.sym { T 57600 44100 5 10 0 0 180 6 1 device=SUBCKT T 56700 44100 5 10 1 1 180 6 1 refdes=X21 T 56700 43850 5 10 1 1 180 6 1 value=2SJ162 } T 52100 54300 9 10 1 0 0 0 10 Problems with this design : 1. Some of the components can no longer be obtained ie. ECG461, 2SK176, 2SJ56 (can't even get SPICE models for them). 2. The input stage is significantly loaded down by the following stage (more than was intended I'm guessing). 3. The component count is high. 4. The open loop gain characteristic is non-linear (corrected by the feedback however). 5. When constructed the actual modules displayed a 2Vp-p oscillation at the output with no input. C 60800 47000 1 0 0 spice-subcircuit-IO-1.sym { T 61700 47400 5 10 0 1 0 0 1 device=spice-IO T 61650 47250 5 10 1 1 0 0 1 refdes=P1 } C 60800 45200 1 0 0 spice-subcircuit-IO-1.sym { T 61700 45600 5 10 0 1 0 0 1 device=spice-IO T 61650 45450 5 10 1 1 0 0 1 refdes=P2 } gspiceui-1.0.00+dfsg/sch/aem-6000/gain-stage.sch0000644000000000000000000002337311636642106017452 0ustar rootrootv 20110115 2 C 40000 40000 0 0 0 title-A2.sym C 62800 44050 1 0 1 vdc-1.sym { T 62100 44600 5 10 0 1 0 6 1 refdes=V1 T 62100 44550 5 10 1 1 0 6 1 value=DC +70V } C 62200 43550 1 180 1 vdc-1.sym { T 61800 43050 5 10 0 1 180 6 1 refdes=V2 T 61400 43000 5 10 1 1 180 6 1 value=DC -70V } C 61925 43600 1 0 0 gnd-1.sym { T 61925 43600 5 10 0 0 0 0 1 netname=GND } T 57300 40900 9 14 1 0 0 0 1 AEM Audio Power Amplifier - Series 6000 T 56300 40400 9 10 1 0 0 0 1 aem-6000-amp-4.sch T 57300 40100 9 10 1 0 0 0 1 1 T 57800 40100 9 10 1 0 0 0 1 1 T 60200 40400 9 10 1 0 0 0 1 23 / 09 / 2011 T 60200 40100 9 10 1 0 0 0 1 Mike Waters C 62700 42350 1 180 0 vee-1.sym { T 62700 42350 5 10 0 0 0 0 1 netname=Vee } C 62300 45250 1 0 0 vcc-1.sym { T 62300 45250 5 10 0 0 0 0 1 netname=Vcc } N 62500 44050 62500 43550 4 N 62500 43900 62025 43900 4 T 63500 50200 8 10 0 0 270 0 1 device=INDUCTOR T 63700 50200 8 10 0 0 270 0 1 symversion=0.1 C 52800 40200 1 0 0 spice-model-1.sym { T 52900 40800 5 10 1 1 0 0 1 refdes=A7 T 54100 40500 5 10 1 1 0 0 1 model-name=1N914 T 53300 40300 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } C 52700 47900 1 90 1 voltage-1.sym { T 52250 47350 5 10 1 1 0 6 1 refdes=Vin T 51900 47850 5 10 0 1 180 6 1 value=DC 30.0 } N 56200 49200 58400 49200 4 C 55800 42300 1 180 0 vee-1.sym { T 55800 42300 5 10 0 0 180 0 1 netname=Vee } C 55300 51700 1 0 0 vcc-1.sym { T 55300 51700 5 10 0 0 0 0 1 netname=Vcc } N 53400 47900 53400 52300 4 C 53600 51700 1 270 0 diode-1.sym { T 54100 51100 5 10 1 1 0 0 1 refdes=D1 T 53850 50850 5 10 1 1 0 0 1 value=1N914 } C 53600 50800 1 270 0 diode-1.sym { T 54100 50200 5 10 1 1 0 0 1 refdes=D2 T 53850 49950 5 10 1 1 0 0 1 value=1N914 } C 53600 49900 1 270 0 diode-1.sym { T 54100 49300 5 10 1 1 0 0 1 refdes=D3 T 53850 49050 5 10 1 1 0 0 1 value=1N914 } C 53600 45000 1 270 0 diode-1.sym { T 54100 44400 5 10 1 1 0 0 1 refdes=D4 T 53850 44150 5 10 1 1 0 0 1 value=1N914 } C 53600 44100 1 270 0 diode-1.sym { T 54100 43500 5 10 1 1 0 0 1 refdes=D5 T 53850 43250 5 10 1 1 0 0 1 value=1N914 } C 53600 43200 1 270 0 diode-1.sym { T 54100 42600 5 10 1 1 0 0 1 refdes=D6 T 53850 42350 5 10 1 1 0 0 1 value=1N914 } C 53900 48800 1 90 1 resistor-2.sym { T 54300 48400 5 10 1 1 0 6 1 refdes=R17 T 54300 48150 5 10 1 1 0 6 1 value=10K } C 53900 46100 1 90 1 resistor-2.sym { T 54300 45700 5 10 1 1 0 6 1 refdes=R18 T 54300 45450 5 10 1 1 0 6 1 value=10K } N 53800 47900 53800 46100 4 N 53800 45200 53800 45000 4 N 53800 49000 53800 48800 4 C 55000 50800 1 90 1 resistor-2.sym { T 55050 50400 5 10 1 1 0 0 1 refdes=R19 T 55050 50150 5 10 1 1 0 0 1 value=150 } C 55000 44100 1 90 1 resistor-2.sym { T 55050 43700 5 10 1 1 0 0 1 refdes=R20 T 55050 43450 5 10 1 1 0 0 1 value=150 } N 54400 48900 53800 48900 4 N 54900 49400 54900 49900 4 N 54900 44600 54900 44100 4 N 54400 45100 53800 45100 4 N 54900 43200 54900 42300 4 N 54900 45500 54900 46800 4 N 54900 48500 54900 47200 4 N 54900 50800 54900 51700 4 C 56300 48100 1 90 1 resistor-2.sym { T 56350 47700 5 10 1 1 0 0 1 refdes=R23 T 56350 47450 5 10 1 1 0 0 1 value=100 } C 57300 48100 1 270 0 resistor-2.sym { T 57250 47700 5 10 1 1 0 6 1 refdes=R24 T 57250 47450 5 10 1 1 0 6 1 value=100 } C 56300 46800 1 90 1 resistor-2.sym { T 56350 46400 5 10 1 1 0 0 1 refdes=R25 T 56350 46150 5 10 1 1 0 0 1 value=100 } C 57500 46800 1 90 1 resistor-2.sym { T 57250 46400 5 10 1 1 0 6 1 refdes=R26 T 57250 46150 5 10 1 1 0 6 1 value=100 } N 56200 47200 57400 47200 4 N 56200 46800 57400 46800 4 N 56200 47200 55900 46800 4 N 55900 46800 54900 46800 4 N 56200 46800 55900 47200 4 N 55900 47200 54900 47200 4 C 55600 48300 1 270 0 resistor-2.sym { T 55550 47900 5 10 1 1 0 6 1 refdes=R22 T 55550 47650 5 10 1 1 0 6 1 value=100 } C 55600 46600 1 270 0 resistor-2.sym { T 55550 46200 5 10 1 1 0 6 1 refdes=R21 T 55500 45950 5 10 1 1 0 6 1 value=100 } N 55700 48300 55700 48600 4 N 55700 45700 55700 45400 4 N 55700 47400 55700 46600 4 C 56300 50800 1 90 1 resistor-2.sym { T 56350 50400 5 10 1 1 0 0 1 refdes=R27 T 56350 50150 5 10 1 1 0 0 1 value=680 } C 57500 50800 1 90 1 resistor-2.sym { T 57550 50400 5 10 1 1 0 0 1 refdes=R28 T 57550 50150 5 10 1 1 0 0 1 value=680 } C 56300 44100 1 90 1 resistor-2.sym { T 56350 43700 5 10 1 1 0 0 1 refdes=R29 T 56350 43450 5 10 1 1 0 0 1 value=680 } C 57500 44100 1 90 1 resistor-2.sym { T 57550 43700 5 10 1 1 0 0 1 refdes=R30 T 57550 43450 5 10 1 1 0 0 1 value=680 } N 56200 49900 56200 49000 4 N 57400 49000 57400 49900 4 N 56200 45000 56200 44100 4 N 57400 45000 57400 44100 4 N 56800 50800 56800 51700 4 N 56800 43200 56800 42300 4 C 58000 48300 1 90 1 resistor-2.sym { T 58050 47900 5 10 1 1 0 0 1 refdes=R31 T 58050 47650 5 10 1 1 0 0 1 value=100 } C 57800 46600 1 270 0 resistor-2.sym { T 58050 46200 5 10 1 1 0 0 1 refdes=R32 T 58050 45950 5 10 1 1 0 0 1 value=100 } N 57900 47400 57900 46600 4 N 57900 48600 57900 48300 4 N 57900 45400 57900 45700 4 N 57400 44600 58700 44600 4 N 56200 44800 58400 44800 4 N 57400 50800 56200 50800 4 N 56200 43200 57400 43200 4 C 54400 49400 1 180 1 spice-pnp-2.sym { T 55300 48700 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 55000 49150 5 10 1 1 180 6 1 refdes=Q9 T 54750 48950 5 10 1 1 180 6 1 value=MJE350 } C 57900 45900 1 180 0 spice-pnp-2.sym { T 57000 45200 5 8 0 0 180 0 1 device=PNP_TRANSISTOR T 57300 45700 5 10 1 1 180 0 1 refdes=Q14 T 57550 45450 5 10 1 1 180 0 1 value=MJE350 } C 55700 45900 1 180 1 spice-pnp-2.sym { T 56600 45200 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 56300 45700 5 10 1 1 180 6 1 refdes=Q13 T 56050 45450 5 10 1 1 180 6 1 value=MJE350 } C 55700 48100 1 0 0 spice-npn-2.sym { T 56600 48800 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 56300 48700 5 10 1 1 0 0 1 refdes=Q11 T 56050 48500 5 10 1 1 0 0 1 value=MJE340 } C 54400 44600 1 0 0 spice-npn-2.sym { T 55300 45300 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 55000 45200 5 10 1 1 0 0 1 refdes=Q10 T 54750 45000 5 10 1 1 0 0 1 value=MJE340 } C 57900 48100 1 0 1 spice-npn-2.sym { T 57000 48800 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 57300 48700 5 10 1 1 0 6 1 refdes=Q12 T 57550 48500 5 10 1 1 0 6 1 value=MJE340 } N 53800 51700 59800 51700 4 N 53800 42300 59800 42300 4 N 52500 47000 55700 47000 4 N 53400 52300 58600 52300 4 N 58600 52300 58600 47000 4 N 58600 47000 57900 47000 4 N 57400 49400 58700 49400 4 C 52500 47800 1 0 0 resistor-2.sym { T 52850 48200 5 10 1 1 180 6 1 refdes=Rin T 52850 47750 5 10 1 1 180 6 1 value=100 } C 50000 41300 1 0 0 spice-model-1.sym { T 50100 41900 5 10 1 1 0 0 1 refdes=A5 T 51300 41600 5 10 1 1 0 0 1 model-name=MJE340 T 50500 41400 5 10 1 1 0 0 1 file=../../lib/bjt/mje340.mod } C 50000 40200 1 0 0 spice-model-1.sym { T 50100 40800 5 10 1 1 0 0 1 refdes=A6 T 51300 40500 5 10 1 1 0 0 1 model-name=MJE350 T 50500 40300 5 10 1 1 0 0 1 file=../../lib/bjt/mje350.mod } C 59900 51700 1 90 1 resistor-2.sym { T 60000 51300 5 10 1 1 0 0 1 refdes=R33 T 60000 51000 5 10 1 1 0 0 1 value=33 } C 59900 43200 1 90 1 resistor-2.sym { T 59950 42800 5 10 1 1 0 0 1 refdes=R34 T 59950 42550 5 10 1 1 0 0 1 value=33 } C 59300 50800 1 90 1 resistor-2.sym { T 59350 50400 5 10 1 1 0 0 1 refdes=R51 T 59350 50150 5 10 1 1 0 0 1 value=10 } C 60500 50800 1 90 1 resistor-2.sym { T 60550 50400 5 10 1 1 0 0 1 refdes=R52 T 60550 50150 5 10 1 1 0 0 1 value=10 } C 59300 44100 1 90 1 resistor-2.sym { T 59350 43700 5 10 1 1 0 0 1 refdes=R53 T 59350 43450 5 10 1 1 0 0 1 value=10 } C 60500 44100 1 90 1 resistor-2.sym { T 60550 43700 5 10 1 1 0 0 1 refdes=R54 T 60550 43450 5 10 1 1 0 0 1 value=10 } N 59200 50800 60400 50800 4 N 59200 43200 60400 43200 4 N 59200 45000 59200 49000 4 N 58400 49200 58400 48800 4 N 58400 48800 60900 48800 4 N 58400 44800 58400 45200 4 N 58400 45200 60900 45200 4 C 60800 47500 1 90 1 resistor-2.sym { T 60850 47100 5 10 1 1 0 0 1 refdes=R35 T 60850 46850 5 10 1 1 0 0 1 value=100 } C 60100 48800 1 90 1 capacitor-1.sym { T 59400 48600 5 10 0 0 270 2 1 device=CAPACITOR T 59800 48500 5 10 1 1 0 6 1 refdes=C7 T 59200 48600 5 10 0 0 270 2 1 symversion=0.1 T 59800 48050 5 10 1 1 0 6 1 value=18p } C 60100 46100 1 90 1 capacitor-1.sym { T 59400 45900 5 10 0 0 270 2 1 device=CAPACITOR T 59800 45800 5 10 1 1 0 6 1 refdes=C8 T 59200 45900 5 10 0 0 270 2 1 symversion=0.1 T 59800 45350 5 10 1 1 0 6 1 value=18p } N 60900 49400 60900 48800 4 N 60900 44600 60900 45200 4 N 59900 47900 60700 47900 4 C 60000 47500 1 270 0 resistor-2.sym { T 59900 47100 5 10 1 1 0 6 1 refdes=RV2 T 59900 46850 5 10 1 1 0 6 1 value=100 } N 59900 46100 60700 46100 4 N 60400 49000 60400 47900 4 N 60400 46100 60400 45000 4 N 60100 47900 60100 47500 4 N 60700 47500 60700 47900 4 { T 60900 47800 5 10 1 1 0 0 1 netname=MOS_Drv } N 60100 46600 60100 46100 4 N 60700 46100 60700 46600 4 C 58700 49900 1 180 1 spice-pnp-2.sym { T 59600 49200 5 8 0 0 180 6 1 device=PNP_TRANSISTOR T 59300 49700 5 10 1 1 180 6 1 refdes=Q15 T 59050 49450 5 10 1 1 180 6 1 value=MJE350 } C 60900 49900 1 180 0 spice-pnp-2.sym { T 60000 49200 5 8 0 0 180 0 1 device=PNP_TRANSISTOR T 60300 49700 5 10 1 1 180 0 1 refdes=Q16 T 60550 49450 5 10 1 1 180 0 1 value=MJE350 } C 60900 44100 1 0 1 spice-npn-2.sym { T 60000 44800 5 8 0 0 0 6 1 device=NPN_TRANSISTOR T 60300 44700 5 10 1 1 0 6 1 refdes=Q18 T 60500 44500 5 10 1 1 0 6 1 value=MJE340 } C 58700 44100 1 0 0 spice-npn-2.sym { T 59600 44800 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 59300 44700 5 10 1 1 0 0 1 refdes=Q17 T 59050 44500 5 10 1 1 0 0 1 value=MJE340 } C 58700 46400 1 0 0 gnd-1.sym { T 58700 46400 5 10 0 0 0 0 1 netname=GND } N 58800 46700 59200 46700 4 C 53300 46400 1 0 0 gnd-1.sym { T 53300 46400 5 10 0 0 0 0 1 netname=GND } T 48000 51100 9 10 1 0 0 0 6 Transient Analysis : Set signal soure : 1kHz, 10mV, -5.75 DC offset MOSFET_Drv quiescent = approx. 0.8V Gain = 3130.6 = 69.9 dBV At signal source amplitudes greater than 10mV the output waveform becomes distorted (Vout = 31V amplitude). T 48000 50100 9 10 1 0 0 0 3 AC Analysis : Gain = 3324.9 = 70 dBV 3dB point = 18.3 KHz N 53400 46700 53800 46700 4 gspiceui-1.0.00+dfsg/sch/Makefile0000644000000000000000000000664411640450520015241 0ustar rootroot#****************************************************************************** # Makefile * # ---------- * # Description : House-keeping for the GNU Spice GUI Project example schematic * # files. * # Started : 20/01/2004 * # Last update : 28/09/2011 * # Copyright : (C) 2004 by MSWaters * # Email : M.Waters@bom.gov.au * #****************************************************************************** #****************************************************************************** # * # This program is free software; you can redistribute it and/or modify * # it under the terms of the GNU General Public License as published by * # the Free Software Foundation; either version 2 of the License, or * # (at your option) any later version. * # * #****************************************************************************** #****************************************************************************** # Specify string values #****************************************************************************** # Root directory ROOT := $(shell pwd) # Objects OBJS := $(patsubst %.sch, %.ckt, $(wildcard */*.sch)) # Install directory INSTALLDIR = /usr/local #****************************************************************************** # Make these targets #****************************************************************************** all : $(OBJS) # Schematic to netlist conversion rules : # -v verbose mode (gives as much feedback to the user as possible) # -q quiet mode (turns off all warnings / notes / messages) # -g the guile procedure executed to create the netlist # -o place output file in $@ # $< is the name of the first dependency # $@ is the file name of the target %.ckt : %.sch @cd $(dir $<) ; gnetlist -g spice-sdb -o $(notdir $@) $(notdir $<) @echo #****************************************************************************** # Perform installation tasks #****************************************************************************** install : cp -r $(ROOT) $(INSTALLDIR)/share/gspiceui #****************************************************************************** # Perform uninstall tasks #****************************************************************************** uninstall : rm -fr $(INSTALLDIR)/share/gspiceui/sch ##****************************************************************************** # Remove temporary files and backup files #****************************************************************************** clean : rm -f Makefile~ */*.gnucap.?? */*.ngspice.?? */*.ckt */*.sim */*.log */*.sch~ #****************************************************************************** # Specify phony targets #****************************************************************************** .PHONY : install uninstall clean #****************************************************************************** gspiceui-1.0.00+dfsg/sch/led-drv/0000755000000000000000000000000011752030331015122 5ustar rootrootgspiceui-1.0.00+dfsg/sch/led-drv/led-flasher.sch0000644000000000000000000001200211602626545020016 0ustar rootrootv 20110115 2 C 3100 86500 1 0 1 npn-3.sym { T 2200 86900 5 10 1 1 0 6 1 refdes=Q1 T 1700 86600 5 10 1 1 0 0 1 value=BC548 } C 5400 87450 1 270 0 resistor-2.sym { T 5100 87050 5 10 1 1 0 0 1 refdes=R3 T 5400 86950 5 10 1 1 180 0 1 value=100K } C 5400 88850 1 270 0 resistor-2.sym { T 5100 88500 5 10 1 1 0 0 1 refdes=R1 T 5400 88400 5 10 1 1 180 0 1 value=100K } C 4100 87450 1 270 0 resistor-2.sym { T 4400 87050 5 10 1 1 0 0 1 refdes=R2 T 4850 86950 5 10 1 1 180 0 1 value=470K } C 4300 87450 1 0 0 capacitor-1.sym { T 4400 87750 5 10 1 1 0 0 1 refdes=C2 T 4900 87750 5 10 1 1 0 0 1 value=220p } C 1400 89500 1 270 0 capacitor-1.sym { T 1300 89200 5 10 1 1 0 0 1 refdes=C1 T 1500 88900 5 10 1 1 180 0 1 value=10u } N 10600 86400 1000 86400 4 C 6200 87300 1 270 0 led-1.sym { T 5900 86750 5 10 1 1 0 0 1 refdes=D6 T 6300 86500 5 10 1 1 0 6 1 value=LED } C 6200 88200 1 270 0 led-1.sym { T 5900 87650 5 10 1 1 0 0 1 refdes=D5 T 6300 87400 5 10 1 1 0 6 1 value=LED } C 6200 89100 1 270 0 led-1.sym { T 5900 88550 5 10 1 1 0 0 1 refdes=D4 T 6300 88300 5 10 1 1 0 6 1 value=LED } C 5500 88900 1 0 0 diode-1.sym { T 5850 89350 5 10 1 1 0 0 1 refdes=D3 T 6200 89200 5 10 1 1 0 0 1 value=1N914 } N 5500 89100 5500 88850 4 N 5500 87950 5500 87450 4 C 4100 88150 1 180 0 pnp-3.sym { T 3250 87850 5 10 1 1 180 0 1 refdes=Q2 T 2800 88100 5 10 1 1 180 6 1 value=BC558 } N 3500 87000 3500 87150 4 N 4100 87650 4300 87650 4 N 4200 87650 4200 87450 4 N 5200 87650 5500 87650 4 N 2500 86500 2500 86400 4 N 3500 88150 3500 89600 4 N 7900 87500 7200 87500 4 N 5500 89100 3050 89100 4 N 3050 89100 3050 88650 4 N 3050 88650 2500 88650 4 C 2400 89600 1 270 0 inductor-1.sym { T 2200 89250 5 10 1 1 0 0 1 refdes=L1 T 2450 89100 5 10 1 1 180 0 1 value=0.3m } N 2500 88700 2500 87500 4 N 1000 89600 10600 89600 4 C 1600 87650 1 0 0 diode-1.sym { T 2000 88100 5 10 1 1 0 0 1 refdes=D1 T 1800 87450 5 10 1 1 0 0 1 value=1N914 } N 1600 88600 1600 86400 4 N 1600 89600 1600 89500 4 C 800 87700 1 270 0 battery-3.sym { T 250 87200 5 10 1 1 0 0 1 refdes=Vbatt T 300 86900 5 10 1 1 0 0 1 value=3.0V } C 1100 87750 1 90 0 resistor-2.sym { T 850 88400 5 10 1 1 180 0 1 refdes=Rbatt T 500 88050 5 10 1 1 0 0 1 value=1.0 } N 1000 89600 1000 88650 4 N 1000 87750 1000 87700 4 N 1000 86600 1000 86400 4 C 2650 86100 1 0 0 gnd-1.sym T 5100 90250 9 18 1 0 0 0 1 LED Flasher C 300 85050 1 0 0 spice-model-1.sym { T 400 85650 5 10 1 1 0 0 1 refdes=A1 T 1600 85350 5 10 1 1 0 0 1 model-name=BC548 T 800 85150 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 300 84100 1 0 0 spice-model-1.sym { T 400 84700 5 10 1 1 0 0 1 refdes=A2 T 1600 84400 5 10 1 1 0 0 1 model-name=BC558 T 800 84200 5 10 1 1 0 0 1 file=../../lib/bjt/bc558.mod } C 3300 85050 1 0 0 spice-model-1.sym { T 3400 85650 5 10 1 1 0 0 1 refdes=A3 T 4600 85350 5 10 1 1 0 0 1 model-name=1N914 T 3800 85150 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } C 3300 84100 1 0 0 spice-model-1.sym { T 3400 84700 5 10 1 1 0 0 1 refdes=A4 T 4600 84400 5 10 1 1 0 0 1 model-name=LED T 3800 84200 5 10 1 1 0 0 1 file=../../lib/diode/led.mod } C 7800 89300 1 270 0 resistor-2.sym { T 8100 88900 5 10 1 1 0 0 1 refdes=R4 T 8450 88800 5 10 1 1 180 0 1 value=22K } C 10500 89300 1 270 0 resistor-2.sym { T 10800 88900 5 10 1 1 0 0 1 refdes=R7 T 11150 88800 5 10 1 1 180 0 1 value=22K } C 7900 87700 1 0 0 capacitor-1.sym { T 8250 88100 5 10 1 1 180 0 1 refdes=C3 T 8500 87950 5 10 1 1 0 0 1 value=1n } N 7900 88400 7900 87500 4 N 8800 87000 9700 87900 4 N 9700 87000 8800 87900 4 N 10600 88400 10600 87500 4 C 9700 87700 1 0 0 capacitor-1.sym { T 10050 88100 5 10 1 1 180 0 1 refdes=C4 T 10450 88100 5 10 1 1 180 0 1 value=1n } C 8700 89300 1 270 0 resistor-2.sym { T 9000 88900 5 10 1 1 0 0 1 refdes=R5 T 9450 88800 5 10 1 1 180 0 1 value=470K } C 9600 89300 1 270 0 resistor-2.sym { T 9900 88900 5 10 1 1 0 0 1 refdes=R6 T 10350 88800 5 10 1 1 180 0 1 value=470K } N 8500 87000 8800 87000 4 N 9700 87000 10000 87000 4 N 9700 88400 9700 87900 4 N 8800 88400 8800 87900 4 N 7900 86500 7900 86400 4 N 10600 86400 10600 86500 4 C 8500 86500 1 0 1 npn-3.sym { T 8700 86750 5 10 1 1 0 6 1 refdes=Q3 T 8200 86500 5 10 1 1 0 0 1 value=BC548 } C 10000 86500 1 0 0 npn-3.sym { T 9850 86750 5 10 1 1 0 0 1 refdes=Q4 T 10300 86500 5 10 1 1 0 6 1 value=BC548 } N 7900 89300 7900 89600 4 N 8800 89300 8800 89600 4 N 9700 89300 9700 89600 4 N 10600 89300 10600 89600 4 N 3100 87000 3500 87000 4 N 5500 86550 5500 86400 4 N 4200 86550 4200 86150 4 N 4200 86150 7200 86150 4 N 7200 86150 7200 87500 4 T 6500 85700 9 10 1 0 0 0 1 NOTES : T 6750 85450 9 10 1 0 0 0 1 * Use a 200-300mA fuse in series with battery T 6750 85200 9 10 1 0 0 0 1 * Astable period 700-800ms @ 470K & 1uF T 6750 84950 9 10 1 0 0 0 1 * Aim for LED current of 20mA T 6750 84700 9 10 1 0 0 0 1 * Voltage divider R1 & R3 will effect brightness T 6750 84450 9 10 1 0 0 0 1 * R2 must not bias Q2 on or LED driver wont oscillate T 6750 84200 9 10 1 0 0 0 1 * LED driver period 40usec (20kHz) T 6750 83950 9 10 1 0 0 0 1 * Probably need diode to protect Q2 BE junction but astable stops oscillating T 4750 89950 9 10 1 0 0 0 1 (Last updated on 12/11/2004) gspiceui-1.0.00+dfsg/sch/led-drv/led-driver.sch0000644000000000000000000000620511602630420017660 0ustar rootrootv 20110115 2 C 3600 86050 1 0 1 npn-3.sym { T 2700 86400 5 10 1 1 0 6 1 refdes=Q1 T 2250 86150 5 10 1 1 0 0 1 value=BC548 } C 5900 86850 1 270 0 resistor-2.sym { T 6300 86450 5 10 1 1 0 0 1 refdes=R4 T 6650 86350 5 10 1 1 180 0 1 value=100K } C 5900 88150 1 270 0 resistor-2.sym { T 6300 87750 5 10 1 1 0 0 1 refdes=R3 T 6650 87650 5 10 1 1 180 0 1 value=100K } C 4600 86850 1 270 0 resistor-2.sym { T 4900 86450 5 10 1 1 0 0 1 refdes=R2 T 5350 86350 5 10 1 1 180 0 1 value=470K } C 4700 86850 1 0 0 capacitor-1.sym { T 5400 87150 5 10 1 1 0 0 1 refdes=C2 T 5300 86850 5 10 1 1 0 0 1 value=220p } C 1500 88950 1 270 0 capacitor-1.sym { T 1800 88650 5 10 1 1 0 0 1 refdes=C1 T 2200 88350 5 10 1 1 180 0 1 value=100n } N 7600 85950 1000 85950 4 C 7400 86850 1 270 0 led-1.sym { T 7100 86350 5 10 1 1 0 0 1 refdes=D6 T 7500 86050 5 10 1 1 0 6 1 value=LED } C 7400 87750 1 270 0 led-1.sym { T 7100 87200 5 10 1 1 0 0 1 refdes=D5 T 7500 86900 5 10 1 1 0 6 1 value=LED } C 7400 88650 1 270 0 led-1.sym { T 7100 88150 5 10 1 1 0 0 1 refdes=D4 T 7500 87850 5 10 1 1 0 6 1 value=LED } C 6200 88450 1 0 0 diode-1.sym { T 6200 88750 5 10 1 1 0 0 1 refdes=D3 T 6900 88750 5 10 1 1 0 0 1 value=1N914 } N 7100 88650 7600 88650 4 N 6000 88650 6000 88150 4 N 6000 87250 6000 86850 4 C 4600 87550 1 180 0 pnp-3.sym { T 3750 87200 5 10 1 1 180 0 1 refdes=Q2 T 3300 87450 5 10 1 1 180 6 1 value=BC558 } N 3600 86550 4000 86550 4 N 4600 87050 4700 87050 4 N 5600 87050 6000 87050 4 N 3000 86050 3000 85950 4 N 4000 87550 4000 89750 4 N 6200 88650 3000 88650 4 C 2900 89750 1 270 0 inductor-1.sym { T 2700 89350 5 10 1 1 0 0 1 refdes=L1 T 2900 89250 5 10 1 1 180 0 1 value=0.25mH } N 3000 88850 3000 87050 4 N 1000 89750 4700 89750 4 C 1900 87250 1 0 0 diode-1.sym { T 2300 87750 5 10 1 1 0 0 1 refdes=D1 T 2100 87050 5 10 1 1 0 0 1 value=1N914 } N 2800 87450 3000 87450 4 N 1900 87450 1700 87450 4 N 1700 88050 1700 85950 4 N 1700 89750 1700 88950 4 C 800 88250 1 270 0 battery-3.sym { T 200 87750 5 10 1 1 0 0 1 refdes=Vbatt T 300 87450 5 10 1 1 0 0 1 value=1.5V } C 1100 88550 1 90 0 resistor-2.sym { T 800 89250 5 10 1 1 180 0 1 refdes=Rbatt T 450 88800 5 10 1 1 0 0 1 value=1.0 } N 1000 89750 1000 89450 4 N 1000 88550 1000 88250 4 N 1000 87150 1000 85950 4 C 3800 85650 1 0 0 gnd-1.sym T 3500 90200 9 18 1 0 0 0 1 LED Driver C 1250 84700 1 0 0 spice-model-1.sym { T 1350 85300 5 10 1 1 0 0 1 refdes=A1 T 2550 85000 5 10 1 1 0 0 1 model-name=BC548 T 1750 84800 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 1250 83750 1 0 0 spice-model-1.sym { T 1350 84350 5 10 1 1 0 0 1 refdes=A2 T 2550 84050 5 10 1 1 0 0 1 model-name=BC558 T 1750 83850 5 10 1 1 0 0 1 file=../../lib/bjt/bc558.mod } C 4650 84700 1 0 0 spice-model-1.sym { T 4750 85300 5 10 1 1 0 0 1 refdes=A3 T 5950 85000 5 10 1 1 0 0 1 model-name=1N914 T 5150 84800 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } C 4650 83750 1 0 0 spice-model-1.sym { T 4750 84350 5 10 1 1 0 0 1 refdes=A4 T 5950 84050 5 10 1 1 0 0 1 model-name=LED T 5150 83850 5 10 1 1 0 0 1 file=../../lib/diode/led.mod } N 4700 86850 4700 87300 4 N 4700 88200 4700 89750 4 C 4900 87300 1 90 0 diode-1.sym { T 5200 87900 5 10 1 1 180 0 1 refdes=D2 T 5300 88100 5 10 1 1 180 0 1 value=1N914 } gspiceui-1.0.00+dfsg/sch/tline/0000755000000000000000000000000011752030331014700 5ustar rootrootgspiceui-1.0.00+dfsg/sch/tline/tline-1.sch0000644000000000000000000000176311412210442016653 0ustar rootrootv 20081231 1 C 1850 89300 1 180 0 resistor-2.sym { T 1350 89400 5 10 1 1 0 0 1 refdes=Rs T 1350 88900 5 10 1 1 0 0 1 value=50 } C 750 89200 1 270 0 voltage-2.sym { T 450 88650 5 10 1 1 0 0 1 refdes=Vs T 850 88500 5 10 1 1 180 0 1 value=AC 1V } T 400 90300 9 16 1 0 0 0 1 Loss-less Transmission Line T 2350 90050 9 10 1 0 0 4 1 Last Updated on 09/09/2009 C 4150 89200 1 90 1 resistor-2.sym { T 4450 88800 5 10 1 1 0 6 1 refdes=Ro T 4450 88550 5 10 1 1 0 6 1 value=50 } N 950 88300 2250 88300 4 C 1500 88000 1 0 0 gnd-1.sym C 1850 88800 1 0 0 tline.sym { T 2750 89200 5 10 0 1 0 0 1 device=T-Line T 2900 88750 5 10 1 1 0 0 1 refdes=Ts T 2300 89500 5 10 1 1 0 0 1 value=Z0=50 TD=10nS } N 3650 88300 3650 88800 4 N 4050 88300 3650 88300 4 N 2250 88300 2250 88800 4 C 3750 88000 1 0 0 gnd-1.sym T 400 85800 9 10 1 0 0 0 8 For RG58 is a standard 50 Ohm coaxial cable with a velocity constant of 0.66. For a transmission delay of 10nS the actual cable is : L = TD x c x v = 10e-9 x 3e8 x 0.66 = 1.98 m gspiceui-1.0.00+dfsg/sch/ph-shftr/0000755000000000000000000000000011752030331015320 5ustar rootrootgspiceui-1.0.00+dfsg/sch/ph-shftr/ps-pas-1p-rc.sch0000644000000000000000000000140311640103226020140 0ustar rootrootv 20110115 2 C 2800 1500 1 270 1 capacitor-1.sym { T 3100 2100 5 10 1 1 0 0 1 refdes=C1 T 3100 1700 5 10 1 1 0 0 1 value=1.0n } C 1900 2300 1 0 0 resistor-2.sym { T 2250 2600 5 10 1 1 0 0 1 refdes=R1 T 2200 2100 5 10 1 1 0 0 1 value=10k } N 2800 2400 3000 2400 4 { T 3000 2500 5 10 1 1 0 0 1 netname=Vout } N 1900 2400 1700 2400 4 C 2300 1200 1 0 0 gnd-1.sym N 1700 1500 3000 1500 4 T 2300 3050 9 10 1 0 0 4 1 Last Updated : 27/09/2011 T 900 200 9 10 1 0 0 0 4 The half power (3dB) point : - Calculated = 1/6.28RC = 15.92 KHz - NG-Spice = 15.92 KHz - GNU-Cap = 15.92 KHz C 1900 1500 1 90 0 voltage-1.sym { T 1400 1600 5 10 0 0 90 0 1 device=VOLTAGE_SOURCE T 1400 2000 5 10 1 1 180 0 1 refdes=Vin } T 2350 3300 9 14 1 0 0 4 1 Single Pole Passive RC Phase Shifter gspiceui-1.0.00+dfsg/sch/ph-shftr/ps-bdg-1.sch0000644000000000000000000000172511412210441017331 0ustar rootrootv 20040111 1 C 2100 3250 1 90 0 capacitor-4.sym { T 1700 3750 5 10 1 1 180 0 1 refdes=C1 T 1450 3400 5 10 1 1 0 0 1 value=10pF } C 3400 4250 1 90 0 capacitor-4.sym { T 3700 4750 5 10 1 1 180 0 1 refdes=C2 T 3300 4400 5 10 1 1 0 0 1 value=10pF } C 2000 4150 1 90 0 resistor-2.sym { T 1750 4800 5 10 1 1 180 0 1 refdes=R1 T 1300 4450 5 10 1 1 0 0 1 value=100K } C 3300 3250 1 90 0 resistor-2.sym { T 3700 3900 5 10 1 1 180 0 1 refdes=R2 T 3400 3550 5 10 1 1 0 0 1 value=100K } C 1200 3700 1 90 0 voltage-1.sym { T 750 4200 5 10 1 1 180 0 1 refdes=Vin T 300 3750 5 10 1 1 0 0 1 value=100mV } C 2000 2950 1 0 0 gnd-1.sym T 1050 5400 9 10 1 0 0 0 1 Phase Shifter - Bridge N 1000 4600 1000 5050 4 N 1000 5050 3200 5050 4 N 1000 3700 1000 3250 4 N 1000 3250 3200 3250 4 N 3200 4250 3200 4150 4 N 1900 4150 1900 4050 4 C 3000 4250 1 180 0 resistor-2.sym { T 2350 4300 5 10 1 1 0 0 1 refdes=Rout T 2850 4000 5 10 1 1 180 0 1 value=10Meg } N 1900 4150 2100 4150 4 N 3000 4150 3200 4150 4 gspiceui-1.0.00+dfsg/sch/ph-shftr/ps-act-2p-steffan-ideal.sch0000644000000000000000000000435311633661242022243 0ustar rootrootv 20110115 2 C 3300 700 1 90 0 resistor-2.sym { T 2750 1250 5 10 1 1 0 0 1 refdes=R2 T 2700 1000 5 10 1 1 0 0 1 value=100 } C 2750 3300 1 0 0 resistor-2.sym { T 2850 3550 5 10 1 1 0 0 1 refdes=R4 T 3300 3550 5 10 1 1 0 0 1 value=10K } C 4750 3300 1 0 0 resistor-2.sym { T 4850 3550 5 10 1 1 0 0 1 refdes=R5 T 5300 3550 5 10 1 1 0 0 1 value=10K } C 3750 2500 1 270 0 capacitor-1.sym { T 3900 2350 5 10 1 1 180 0 1 refdes=C2 T 3550 1800 5 10 1 1 0 0 1 value=1.0p } N 3650 3400 4750 3400 4 N 5950 2700 6550 2700 4 N 5650 3400 5950 3400 4 N 5950 3400 5950 2700 4 N 3650 2700 4450 2700 4 N 4450 2100 4300 2100 4 N 4300 2100 4300 3400 4 N 2450 2700 2100 2700 4 N 900 700 6550 700 4 N 2750 3400 2450 3400 4 N 2450 3400 2450 2500 4 N 5950 2100 5950 700 4 C 4400 400 1 0 0 gnd-1.sym C 900 3000 1 270 0 vac-1.sym { T 1400 3100 5 10 1 1 0 0 1 refdes=Vin T 1100 2200 5 10 0 1 0 0 1 value=dc 0 ac 1 } C 6450 2550 1 270 0 resistor-2.sym { T 6750 2150 5 10 1 1 0 0 1 refdes=Rout T 7200 2000 5 10 1 1 180 0 1 value=100K } T 3700 5750 9 14 1 0 0 4 1 Ideal Two Pole Steffan RC Phase Shifter C 600 1150 1 0 0 vdc-1.sym { T 1300 1750 5 10 1 1 0 0 1 refdes=Vbias T 1350 1550 5 10 1 1 0 0 1 value=2.5V } N 900 2350 900 2700 4 T 3650 5400 9 10 1 0 0 4 1 Last Updated on 08/08/2005 C 4450 2000 1 0 0 vcvs-1.sym { T 5050 2900 5 12 1 1 0 0 1 refdes=E1 T 4450 2000 5 10 0 0 0 0 1 value=10000 } N 6550 2700 6550 2550 4 N 6550 1650 6550 700 4 T 3750 4500 9 8 1 0 0 4 5 For R1 = 1K Ohm and Vin(freq) = 10.0 GHz phase at Rout = 1.8 Degree For R1 = 100 Ohm and Vin(freq) = 10.0 GHz phase at Rout = 18.5 Degree For R1 = 50 Ohm and Vin(freq) = 10.0 GHz phase at Rout = 32.6 Degree For R1 = 10 Ohm and Vin(freq) = 10.0 GHz phase at Rout = -31.7 Degree For R1 = 1 Ohm and Vin(freq) = 10.0 GHz phase at Rout = -7.0 Degree C 2650 2500 1 90 1 capacitor-1.sym { T 2550 2350 5 10 1 1 180 6 1 refdes=C1 T 2900 1800 5 10 1 1 0 6 1 value=1.0p } C 3650 2800 1 180 0 resistor-2.sym { T 2850 2850 5 10 1 1 0 0 1 refdes=R1 T 3300 2850 5 10 1 1 0 0 1 value=100 } C 5500 1700 1 180 0 resistor-2.sym { T 4700 1300 5 10 1 1 0 0 1 refdes=R3 T 5150 1300 5 10 1 1 0 0 1 value=100 } N 900 1150 900 700 4 N 2450 1600 4600 1600 4 N 5500 1600 6200 1600 4 N 6200 1600 6200 2700 4 N 2450 2700 2750 2700 4 N 3950 2500 3950 2700 4 gspiceui-1.0.00+dfsg/sch/ph-shftr/ps-act-1p-rc-ideal.sch0000644000000000000000000000346711412210441021207 0ustar rootrootv 20050313 1 C 3700 750 1 90 0 resistor-2.sym { T 3450 1400 5 10 1 1 180 0 1 refdes=R1 T 3500 1150 5 10 1 1 180 0 1 value=100 } C 2550 2500 1 0 0 resistor-2.sym { T 2900 2750 5 10 1 1 0 0 1 refdes=R2 T 2900 2300 5 10 1 1 0 0 1 value=1K } C 4850 2500 1 0 0 resistor-2.sym { T 5200 2750 5 10 1 1 0 0 1 refdes=R3 T 5200 2300 5 10 1 1 0 0 1 value=1K } C 3450 2000 1 180 0 capacitor-1.sym { T 2700 1900 5 10 1 1 0 0 1 refdes=C1 T 3300 2000 5 10 1 1 180 0 1 value=1p } N 3450 2600 4850 2600 4 N 5750 1800 6250 1800 4 N 5750 2600 5900 2600 4 N 5900 2600 5900 1800 4 N 3450 1800 4250 1800 4 N 3600 1650 3600 1800 4 N 4250 1200 4050 1200 4 N 4050 1200 4050 2600 4 N 2550 1800 2300 1800 4 N 900 600 6250 600 4 N 2550 2600 2450 2600 4 N 2450 2600 2450 1800 4 N 5750 1200 5750 600 4 C 4500 300 1 0 0 gnd-1.sym N 3600 750 3600 600 4 C 1100 2100 1 270 0 vac-1.sym { T 1600 2200 5 10 1 1 0 0 1 refdes=Vin T 1300 1300 5 10 0 1 0 0 1 value=dc 0 ac 1 } C 6150 1650 1 270 0 resistor-2.sym { T 6450 1250 5 10 1 1 0 0 1 refdes=Rout T 6900 1100 5 10 1 1 180 0 1 value=100K } T 3600 4700 9 14 1 0 0 4 1 Ideal Single Pole Active RC Phase Shifter C 600 600 1 0 0 vdc-1.sym { T 1300 1200 5 10 1 1 0 0 1 refdes=Vbias T 1350 1000 5 10 1 1 0 0 1 value=2.5V } N 900 1800 1100 1800 4 T 3550 4350 9 10 1 0 0 4 1 Last Updated on 05/08/2005 C 4250 1100 1 0 0 vcvs-1.sym { T 4850 2000 5 12 1 1 0 0 1 refdes=E1 T 4250 1100 5 10 0 0 0 0 1 value=10000 } N 6250 1800 6250 1650 4 N 6250 750 6250 600 4 T 3650 3600 9 8 1 0 0 4 5 For R1 = 1K Ohm and Vin(freq) = 10.0 GHz phase at Rout = 1.8 Degree For R1 = 100 Ohm and Vin(freq) = 10.0 GHz phase at Rout = 18.1 Degree For R1 = 50 Ohm and Vin(freq) = 10.0 GHz phase at Rout = 35.3 Degree For R1 = 10 Ohm and Vin(freq) = 10.0 GHz phase at Rout = 115.7 Degree For R1 = 1 Ohm and Vin(freq) = 10.0 GHz phase at Rout = 172.8 Degree gspiceui-1.0.00+dfsg/sch/ph-shftr/ps-act-1p-rc.sch0000644000000000000000000000322711640102552020133 0ustar rootrootv 20110115 2 C 1500 1700 1 0 0 resistor-2.sym { T 1850 1950 5 10 1 1 0 0 1 refdes=R1 T 1750 1500 5 10 1 1 0 0 1 value=100K } C 1500 2500 1 0 0 resistor-2.sym { T 1850 2750 5 10 1 1 0 0 1 refdes=R2 T 1850 2300 5 10 1 1 0 0 1 value=1K } C 3800 2500 1 0 0 resistor-2.sym { T 4150 2750 5 10 1 1 0 0 1 refdes=R3 T 4150 2300 5 10 1 1 0 0 1 value=1K } C 2800 600 1 90 0 capacitor-1.sym { T 2350 1200 5 10 1 1 0 0 1 refdes=C1 T 2350 800 5 10 1 1 0 0 1 value=1n } N 2400 2600 3800 2600 4 N 4600 1500 5100 1500 4 N 4700 2600 4800 2600 4 N 4800 2600 4800 1500 4 N 2400 1800 3200 1800 4 N 2600 1500 2600 1800 4 N 3200 1200 3000 1200 4 N 3000 1200 3000 2600 4 N 1500 1800 1100 1800 4 N 1100 600 5100 600 4 N 1500 2600 1400 2600 4 N 1400 2600 1400 1800 4 N 3900 1000 3900 600 4 N 3900 2000 3900 2300 4 N 3900 2300 3600 2300 4 N 3600 2300 3600 2900 4 C 3500 300 1 0 0 gnd-1.sym C 800 600 1 0 0 vac-1.sym { T 700 1300 5 10 1 1 180 0 1 refdes=Vin T 1600 800 5 10 0 1 90 0 1 value=dc 0 ac 1 } C 5000 1500 1 270 0 resistor-2.sym { T 5250 1100 5 10 1 1 0 0 1 refdes=Rout T 5250 850 5 10 1 1 0 0 1 value=100K } T 3150 4700 9 14 1 0 0 4 1 Single Pole Active RC Phase Shifter C 5300 2400 1 0 0 vdc-1.sym { T 6000 3050 5 10 1 1 0 0 1 refdes=Vcc T 6050 2850 5 10 1 1 0 0 1 value=5V } C 5500 2100 1 0 0 gnd-1.sym T 3000 4450 9 10 1 0 0 4 1 Last Update : 13/09/2011 C 3200 900 1 0 0 spice-opamp-2.sym { T 4200 1775 5 10 1 1 0 0 1 refdes=XU1 T 4200 1100 5 10 1 1 0 0 1 value=LM358 } C 3400 2900 1 0 0 vcc-1.sym C 5400 3600 1 0 0 vcc-1.sym C 300 3200 1 0 0 spice-model-1.sym { T 400 3800 5 10 1 1 0 0 1 refdes=A1 T 1600 3500 5 10 1 1 0 0 1 model-name=LM358 T 800 3300 5 10 1 1 0 0 1 file=../../lib/opamp/lm358.mod } gspiceui-1.0.00+dfsg/sch/fet/0000755000000000000000000000000011752030331014343 5ustar rootrootgspiceui-1.0.00+dfsg/sch/fet/amp-jfet.sch0000644000000000000000000000450211602626335016557 0ustar rootrootv 20110115 2 C 40000 40000 0 0 0 title-A4.sym C 44100 43900 1 270 0 resistor-2.sym { T 44450 43500 5 10 0 0 270 0 1 device=RESISTOR T 44350 43500 5 10 1 1 0 0 1 refdes=Rg T 44350 43250 5 10 1 1 0 0 1 value=1Meg } C 45100 45400 1 270 0 resistor-2.sym { T 45450 45000 5 10 0 0 270 0 1 device=RESISTOR T 45350 45000 5 10 1 1 0 0 1 refdes=Rd T 45350 44750 5 10 1 1 0 0 1 value=3.3K } C 45300 43700 1 90 1 resistor-2.sym { T 44950 43300 5 10 0 0 270 2 1 device=RESISTOR T 45350 43300 5 10 1 1 0 0 1 refdes=Rs T 45350 43050 5 10 1 1 0 0 1 value=470 } C 43200 43800 1 0 0 capacitor-1.sym { T 43400 44500 5 10 0 0 0 0 1 device=CAPACITOR T 43300 44050 5 10 1 1 0 0 1 refdes=C1 T 43400 44700 5 10 0 0 0 0 1 symversion=0.1 T 43750 44050 5 10 1 1 0 0 1 value=1u } C 45000 45400 1 0 0 vcc-1.sym C 48100 44900 1 0 0 vcc-1.sym C 44500 42500 1 0 0 gnd-1.sym C 48200 43400 1 0 0 gnd-1.sym C 40600 40500 1 0 0 spice-model-1.sym { T 40700 41200 5 10 0 1 0 0 1 device=model T 40700 41100 5 10 1 1 0 0 1 refdes=A1 T 41900 40800 5 10 1 1 0 0 1 model-name=2N3819 T 41100 40600 5 10 1 1 0 0 1 file=../../lib/jfet/2n3819.mod } C 48000 43700 1 0 0 vdc-1.sym { T 48700 44350 5 10 1 1 0 0 1 refdes=Vcc T 48700 44550 5 10 0 0 0 0 1 device=VOLTAGE_SOURCE T 48700 44750 5 10 0 0 0 0 1 footprint=none T 48700 44150 5 10 1 1 0 0 1 value=DC 20V } C 43400 42800 1 0 1 vac-1.sym { T 42750 43500 5 10 1 1 0 6 1 refdes=Vin T 42700 43650 5 10 0 0 0 6 1 device=vac T 42700 43850 5 10 0 0 0 6 1 footprint=none T 42750 43250 5 10 1 1 0 6 1 value=AC 1.0V } N 43100 42800 46000 42800 4 N 44100 44000 44700 44000 4 N 43100 44000 43200 44000 4 N 44200 43900 44200 44000 4 N 44200 43000 44200 42800 4 T 44800 40800 9 14 1 0 0 0 1 Single Stage N-Channel JFET Amplifier T 45600 40100 9 10 1 0 0 0 1 1 T 46100 40100 9 10 1 0 0 0 1 1 T 48600 40400 9 10 1 0 0 0 1 07 / 06 / 2011 T 48600 40100 9 10 1 0 0 0 1 Mike Waters T 44600 40400 9 10 1 0 0 0 1 ./sch/jfet/n-chan/amp-jfet.sch C 46200 42800 1 90 0 capacitor-1.sym { T 45500 43000 5 10 0 0 90 0 1 device=CAPACITOR T 46050 43350 5 10 1 1 0 0 1 refdes=C2 T 45300 43000 5 10 0 0 90 0 1 symversion=0.1 T 46050 43000 5 10 1 1 0 0 1 value=470u } N 45200 43700 46000 43700 4 C 44700 43800 1 0 0 spice-njfet-1.sym { T 45500 44200 5 10 0 0 0 0 1 device=FET_TRANSISTOR T 45300 44200 5 10 1 1 0 0 1 refdes=J1 T 45300 44000 5 10 1 1 0 0 1 value=2N3819 } N 45200 43700 45200 43800 4 gspiceui-1.0.00+dfsg/sch/bjt/0000755000000000000000000000000011752030331014344 5ustar rootrootgspiceui-1.0.00+dfsg/sch/bjt/amp-ce-2.sch0000644000000000000000000000252711602623076016362 0ustar rootrootv 20110115 2 C 4100 87900 1 270 0 capacitor-1.sym { T 4400 87600 5 10 1 1 0 0 1 refdes=Ce T 4850 87300 5 10 1 1 180 0 1 value=1.0uF } C 3300 87900 1 0 0 npn-2.sym { T 3950 88550 5 10 1 1 0 0 1 refdes=Q1 T 3750 88300 5 10 1 1 0 0 1 value=BC548 } C 3700 87900 1 270 0 resistor-2.sym { T 3350 87500 5 10 1 1 0 0 1 refdes=Re T 3650 87400 5 10 1 1 180 0 1 value=1.0K } C 3700 89800 1 270 0 resistor-2.sym { T 4000 89400 5 10 1 1 0 0 1 refdes=Rout T 4450 89300 5 10 1 1 180 0 1 value=2.0K } C 3250 86700 1 0 0 gnd-1.sym C 3300 88600 1 180 0 voltage-2.sym { T 2700 88650 5 10 1 1 0 0 1 refdes=Vin T 2800 88700 5 10 0 1 90 0 1 value=0V } N 2400 88100 2400 88400 4 N 2400 87200 2400 87000 4 N 2400 87000 4300 87000 4 N 4300 87900 3800 87900 4 C 400 88950 1 0 0 spice-model-1.sym { T 500 89550 5 10 1 1 0 0 1 refdes=A1 T 1700 89250 5 10 1 1 0 0 1 model-name=BC548C T 1000 89050 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 4650 89800 1 270 0 voltage-3.sym { T 5100 89350 5 10 1 1 0 0 1 refdes=Vcc T 5100 89150 5 10 1 1 0 0 1 value=12V } N 4850 89800 3800 89800 4 C 4750 88600 1 0 0 gnd-1.sym T 400 90150 9 16 1 0 0 0 1 Common Emitter Transistor Amplifier C 2200 88100 1 270 0 voltage-3.sym { T 2550 87850 5 10 1 1 0 0 1 refdes=Vbias T 2650 87600 5 10 1 1 0 0 1 value=3V } T 400 87800 9 10 1 0 0 0 4 This amplifier has a gain of 44dB and a 3dB bandwidth of about 0 to 30MHz. gspiceui-1.0.00+dfsg/sch/bjt/gyrator.sch0000644000000000000000000000215711602623236016545 0ustar rootrootv 20110115 2 C 1300 2550 1 270 1 npn-3.sym { T 1950 3700 5 10 1 1 180 2 1 refdes=Q1 T 1500 3450 5 10 1 1 0 0 1 value=BC550 } C 2050 2450 1 0 0 resistor-2.sym { T 2400 2750 5 10 1 1 0 0 1 refdes=R1 T 2300 2250 5 10 1 1 0 0 1 value=5.62K } C 800 2900 1 270 0 resistor-2.sym { T 450 2500 5 10 1 1 0 0 1 refdes=R2 T 800 2350 5 10 1 1 180 0 1 value=100K } C 2000 1650 1 90 0 capacitor-1.sym { T 1750 2400 5 10 1 1 180 0 1 refdes=C1 T 1300 1850 5 10 1 1 0 0 1 value=100u } C 2450 1350 1 0 0 gnd-1.sym C 3850 1800 1 0 0 vdc-1.sym { T 4650 2500 5 10 1 1 0 0 1 refdes=Vdc T 4550 2250 5 10 1 1 0 0 1 value=DC 15V } C 4150 2850 1 90 0 vac-1.sym { T 3750 3950 5 10 1 1 180 0 1 refdes=Vac T 3850 3700 5 10 1 1 180 0 1 value=AC 1V } N 2300 3150 2950 3150 4 N 4150 3150 4150 3000 4 N 900 1650 4150 1650 4 N 2950 2550 2950 3150 4 N 2050 2550 1800 2550 4 N 1300 3150 900 3150 4 N 900 3150 900 2900 4 N 900 2000 900 1650 4 N 4150 1800 4150 1650 4 C 800 300 1 0 0 spice-model-1.sym { T 900 900 5 10 1 1 0 0 1 refdes=A1 T 2100 600 5 10 1 1 0 0 1 model-name=BC550 T 1400 400 5 10 1 1 0 0 1 file=../../lib/bjt/bc550.mod } T 1900 4200 9 16 1 0 0 0 1 Gyrator gspiceui-1.0.00+dfsg/sch/bjt/amp-ce-1.sch0000644000000000000000000000436011621351054016351 0ustar rootrootv 20110115 2 C 5600 87000 1 270 0 capacitor-1.sym { T 5900 86700 5 10 1 1 0 0 1 refdes=C2 T 6300 86400 5 10 1 1 180 0 1 value=1.0uF } C 5200 87000 1 270 0 resistor-2.sym { T 4900 86600 5 10 1 1 0 0 1 refdes=R3 T 5100 86500 5 10 1 1 180 0 1 value=6.8K } C 5200 89000 1 270 0 resistor-2.sym { T 5500 88600 5 10 1 1 0 0 1 refdes=Rout T 5900 88500 5 10 1 1 180 0 1 value=4.7K } C 3700 87000 1 270 0 resistor-2.sym { T 3400 86600 5 10 1 1 0 0 1 refdes=R2 T 3600 86500 5 10 1 1 180 0 1 value=56K } C 3700 89000 1 270 0 resistor-2.sym { T 3400 88600 5 10 1 1 0 0 1 refdes=R1 T 3600 88500 5 10 1 1 180 0 1 value=100K } C 3900 85800 1 0 0 gnd-1.sym N 3800 89000 5300 89000 4 N 3800 88100 3800 87000 4 N 2000 86200 2000 86100 4 N 2000 86100 5800 86100 4 N 5800 87000 5300 87000 4 N 3800 87500 4800 87500 4 C 200 88900 1 0 0 spice-model-1.sym { T 300 89500 5 10 1 1 0 0 1 refdes=A1 T 1500 89200 5 10 1 1 0 0 1 model-name=BC548 T 800 89000 5 10 1 1 0 0 1 file=../../lib/bjt/npn/bc548.mod } C 400 86100 1 0 0 gnd-1.sym C 2900 87300 1 0 0 capacitor-1.sym { T 3250 87750 5 10 1 1 0 0 1 refdes=C1 T 3150 87100 5 10 1 1 0 0 1 value=100n } C 2000 87400 1 0 0 resistor-2.sym { T 2100 87650 5 10 1 1 0 0 1 refdes=Rin T 2600 87650 5 10 1 1 0 0 1 value=1k } T 500 90200 9 16 1 0 0 0 1 Common Emitter Transistor Amplifier N 5300 88100 5300 87900 4 C 5100 88300 1 180 0 capacitor-1.sym { T 4750 88500 5 10 1 1 180 0 1 refdes=C3 T 4850 87850 5 10 1 1 180 0 1 value=10pF } N 5100 88100 5300 88100 4 N 4200 88100 4200 87500 4 C 4400 89000 1 0 0 vcc-1.sym { T 4400 89000 5 10 0 0 0 0 1 netname=Vcc } C 300 87600 1 0 0 vcc-1.sym { T 300 87600 5 10 0 0 0 0 1 netname=Vcc } C 800 86400 1 0 1 vdc-1.sym { T 100 87050 5 10 0 1 0 6 1 refdes=V1 T 100 87250 5 10 0 0 0 6 1 device=VOLTAGE_SOURCE T 100 87450 5 10 0 0 0 6 1 footprint=none T 1200 87350 5 10 1 1 0 6 1 value=DC 12V } C 1700 86200 1 0 0 vac-1.sym { T 2400 86750 5 10 1 1 0 0 1 refdes=Vin T 2400 87050 5 10 0 0 0 0 1 device=vac T 2400 87250 5 10 0 0 0 0 1 footprint=none T 2300 86450 5 10 1 1 0 0 1 value=AC 1V } N 2000 87400 2000 87500 4 T 200 88500 9 10 1 0 0 0 1 3dB points are : 3KHz & 141KHz C 4800 87000 1 0 0 spice-npn-2.sym { T 5700 87700 5 8 0 0 0 0 1 device=NPN_TRANSISTOR T 5400 87500 5 10 1 1 0 0 1 refdes=Q1 T 5400 87300 5 10 1 1 0 0 1 value=BC548 } gspiceui-1.0.00+dfsg/sch/bjt/astable-npn.sch0000644000000000000000000000321611602623136017256 0ustar rootrootv 20110115 2 C 2550 87250 1 0 0 npn-3.sym { T 2400 87550 5 10 1 1 0 0 1 refdes=Q2 T 2250 87300 5 10 1 1 0 0 1 value=BC548 } C 1050 87250 1 0 1 npn-3.sym { T 1200 87550 5 10 1 1 0 6 1 refdes=Q1 T 800 87300 5 10 1 1 0 0 1 value=BC548 } C 350 89750 1 270 0 resistor-2.sym { T 650 89350 5 10 1 1 0 0 1 refdes=R1 T 1000 89200 5 10 1 1 180 0 1 value=22K } C 1250 89750 1 270 0 resistor-2.sym { T 1550 89350 5 10 1 1 0 0 1 refdes=R2 T 2000 89200 5 10 1 1 180 0 1 value=470K } C 450 88450 1 0 0 capacitor-1.sym { T 600 88450 5 10 1 1 0 0 1 refdes=C1 T 1300 88600 5 10 1 1 180 0 1 value=1uF } N 450 88850 450 88250 4 N 1350 87750 2250 88650 4 N 2250 87750 1350 88650 4 N 3150 88850 3150 88250 4 N 3150 87250 3150 87050 4 N 3150 87050 450 87050 4 N 450 87250 450 87050 4 N 450 89750 4200 89750 4 C 1650 86750 1 0 0 gnd-1.sym T 800 90150 9 16 1 0 0 0 1 Astable Multivibrator C 1050 85650 1 0 0 spice-model-1.sym { T 1150 86250 5 10 1 1 0 0 1 refdes=A1 T 2350 85950 5 10 1 1 0 0 1 model-name=BC548 T 1550 85750 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 3150 88850 1 180 0 capacitor-1.sym { T 2600 88600 5 10 1 1 180 0 1 refdes=C2 T 3100 88600 5 10 1 1 180 0 1 value=1uF } C 4000 89550 1 270 0 voltage-3.sym { T 4400 89250 5 10 1 1 0 0 1 refdes=Vcc T 4500 89050 5 10 1 1 0 0 1 value=3V } C 4100 88350 1 0 0 gnd-1.sym C 2150 89750 1 270 0 resistor-2.sym { T 2700 89500 5 10 1 1 180 0 1 refdes=R3 T 2400 89100 5 10 1 1 0 0 1 value=470K } C 3050 89750 1 270 0 resistor-2.sym { T 3600 89500 5 10 1 1 180 0 1 refdes=R4 T 3300 89100 5 10 1 1 0 0 1 value=22K } N 1050 87750 1350 87750 4 N 1350 88850 1350 88650 4 N 2550 87750 2250 87750 4 N 2250 88850 2250 88650 4 N 4200 89750 4200 89550 4 gspiceui-1.0.00+dfsg/sch/bjt/astable-pnp.sch0000644000000000000000000000322411602623170017255 0ustar rootrootv 20110115 2 C 350 88150 1 270 0 resistor-2.sym { T 650 87750 5 10 1 1 0 0 1 refdes=R1 T 1000 87600 5 10 1 1 180 0 1 value=22K } C 1250 88150 1 270 0 resistor-2.sym { T 1550 87750 5 10 1 1 0 0 1 refdes=R2 T 2000 87600 5 10 1 1 180 0 1 value=470K } C 450 88100 1 0 0 capacitor-1.sym { T 600 88350 5 10 1 1 0 0 1 refdes=C1 T 1350 88500 5 10 1 1 180 0 1 value=1uF } N 450 88150 450 88700 4 N 1350 88300 2250 89200 4 N 2250 88300 1350 89200 4 N 3150 88150 3150 88700 4 N 3150 89900 3150 89700 4 N 3150 87250 450 87250 4 N 450 89900 450 89700 4 N 450 89900 4100 89900 4 C 1750 86950 1 0 0 gnd-1.sym T 650 90300 9 16 1 0 0 0 1 Astable Multivibrator C 850 85850 1 0 0 spice-model-1.sym { T 950 86450 5 10 1 1 0 0 1 refdes=A1 T 2150 86150 5 10 1 1 0 0 1 model-name=BC558 T 1350 85950 5 10 1 1 0 0 1 file=../../lib/bjt/bc558.mod } C 3150 88500 1 180 0 capacitor-1.sym { T 2600 88500 5 10 1 1 180 0 1 refdes=C2 T 3100 88500 5 10 1 1 180 0 1 value=1uF } C 3900 89700 1 270 0 voltage-3.sym { T 4300 89400 5 10 1 1 0 0 1 refdes=Vcc T 4400 89200 5 10 1 1 0 0 1 value=3V } C 4000 88500 1 0 0 gnd-1.sym C 2150 88150 1 270 0 resistor-2.sym { T 2700 87900 5 10 1 1 180 0 1 refdes=R3 T 2400 87450 5 10 1 1 0 0 1 value=470K } C 3050 88150 1 270 0 resistor-2.sym { T 3600 87900 5 10 1 1 180 0 1 refdes=R4 T 3300 87450 5 10 1 1 0 0 1 value=22K } N 1050 89200 1350 89200 4 N 1350 88150 1350 88300 4 N 2550 89200 2250 89200 4 N 2250 88150 2250 88300 4 N 4100 89900 4100 89700 4 C 2550 89700 1 180 1 pnp-3.sym { T 2400 89400 5 10 1 1 180 6 1 refdes=Q2 T 2250 89500 5 10 1 1 0 0 1 value=BC558 } C 1050 89700 1 180 0 pnp-3.sym { T 1200 89400 5 10 1 1 180 0 1 refdes=Q1 T 800 89500 5 10 1 1 0 0 1 value=BC558 } gspiceui-1.0.00+dfsg/sch/op-amp/0000755000000000000000000000000011752030331014756 5ustar rootrootgspiceui-1.0.00+dfsg/sch/op-amp/opamp-ua741.sch0000644000000000000000000000462011412210441017425 0ustar rootrootv 20091004 2 C 39250 67400 1 0 0 capacitor-1.sym { T 39600 67900 5 10 1 1 0 0 1 refdes=C1 T 39500 67200 5 10 1 1 0 0 1 value=150nF T 39250 67400 5 10 0 1 0 0 1 footprint=AXIAL_LAY 300 } N 41050 67600 41900 67600 4 N 39250 67600 39250 67150 4 { T 39100 67700 5 10 1 1 0 0 1 netname=input } C 40150 67500 1 0 0 resistor-1.sym { T 40250 67800 5 10 1 1 0 0 1 refdes=R1 T 40600 67800 5 10 1 1 0 0 1 value=10K T 40150 67500 5 10 0 1 0 0 1 footprint=R025 } C 41300 65200 1 0 0 gnd-1.sym C 38950 65950 1 0 0 vac-1.sym { T 39650 66400 5 10 1 1 0 0 1 refdes=Vin T 39500 66150 5 10 1 1 0 0 1 value=dc 0 ac 1 } N 39250 65950 39250 65500 4 N 39250 65500 43450 65500 4 C 41800 69200 1 0 0 capacitor-1.sym { T 41850 69500 5 10 1 1 0 0 1 refdes=C2 T 42400 69500 5 10 1 1 0 0 1 value=330pF T 41800 69200 5 10 0 1 0 0 1 footprint=AXIAL_LAY 300 } C 41800 68600 1 0 0 resistor-1.sym { T 41900 68900 5 10 1 1 0 0 1 refdes=R2 T 42300 68900 5 10 1 1 0 0 1 value=100K T 41800 68600 5 10 0 1 0 0 1 footprint=R025 } N 41200 68700 41800 68700 4 N 41800 69400 41200 69400 4 N 41200 67600 41200 69400 4 N 42700 68700 43450 68700 4 N 42700 69400 43450 69400 4 N 43450 67150 43450 69400 4 C 43550 66250 1 90 0 resistor-1.sym { T 43900 66900 5 10 1 1 180 0 1 refdes=R3 T 43950 66600 5 10 1 1 180 0 1 value=15K T 43550 66250 5 10 0 1 90 0 1 footprint=R025 } N 43450 65500 43450 66250 4 C 42100 65600 1 0 0 vdc-1.sym { T 42850 66050 5 10 1 1 0 0 1 refdes=V1 T 42700 65800 5 10 1 1 0 0 1 value=DC 10V } N 42900 67400 43450 67400 4 N 43450 67400 44100 67400 4 { T 43600 67500 5 10 1 1 0 0 1 netname=Vout } N 41900 67200 40450 67200 4 N 40450 67200 40450 65500 4 N 42400 65600 42400 65500 4 N 42400 67000 42400 66800 4 { T 42500 66850 5 10 1 1 0 0 1 netname=V+ } C 41800 66800 1 180 0 vdc-1.sym { T 41100 66150 5 10 1 1 180 0 1 refdes=V2 T 41300 65900 5 10 1 1 180 0 1 value=DC 10V } N 41500 65600 41500 65500 4 N 41500 66800 41500 68300 4 N 41500 68300 42400 68300 4 N 42400 68300 42400 67800 4 { T 42500 67900 5 10 1 1 0 0 1 netname=V- } C 41900 67000 1 0 0 aop-spice-1.sym { T 41850 66800 5 10 1 1 0 0 1 refdes=XU1 T 41800 67900 5 10 1 1 0 0 1 value=uA741 T 41900 67000 5 10 0 1 0 0 1 footprint=DIL 8 300 T 42950 67000 5 10 0 1 0 0 1 model-name=uA741 } C 38450 68250 1 0 0 spice-model-1.sym { T 38550 68950 5 10 0 1 0 0 1 device=model T 38550 68850 5 10 1 1 0 0 1 refdes=A1 T 39750 68550 5 10 1 1 0 0 1 model-name=uA358 T 38950 68350 5 10 1 1 0 0 1 file=../../lib/opamp/ua741.mod } gspiceui-1.0.00+dfsg/sch/op-amp/opamp-lmx358-1.sch0000644000000000000000000000216211602724313017772 0ustar rootrootv 20110115 2 C 5900 2400 1 90 0 vdc-1.sym { T 5400 3450 5 10 1 1 180 0 1 refdes=Vcc T 5600 3250 5 10 1 1 180 0 1 value=DC 6V } C 1800 2100 1 270 0 vac-1.sym { T 1750 1950 5 10 1 1 0 0 1 refdes=Vin T 2800 1950 5 10 1 1 0 0 1 value=AC 100m } N 5400 1500 6350 1500 4 N 5900 1500 5900 700 4 N 5900 700 3800 700 4 N 3800 700 3800 1200 4 N 3800 1200 4000 1200 4 N 4700 2000 4700 2700 4 N 4700 1000 4700 600 4 C 4600 300 1 0 0 gnd-1.sym C 6200 2600 1 90 0 gnd-1.sym C 1350 300 1 0 0 gnd-1.sym N 3000 1800 4000 1800 4 C 6250 300 1 0 0 gnd-1.sym C 6250 1500 1 270 0 resistor-2.sym { T 6550 1100 5 10 1 1 0 0 1 refdes=Rout T 6950 1000 5 10 1 1 180 0 1 value=10K } T 2300 4000 9 12 1 0 0 0 1 OP AMP Voltage Follower C 400 2600 1 0 0 spice-model-1.sym { T 500 3200 5 10 1 1 0 0 1 refdes=A1 T 1700 2900 5 10 1 1 0 0 1 model-name=LMX358 T 900 2700 5 10 1 1 0 0 1 file=../../lib/opamp/lmx358.mod } C 1150 600 1 0 0 vdc-1.sym { T 1000 1400 5 10 1 1 180 0 1 refdes=Vbias T 1100 1100 5 10 1 1 180 0 1 value=DC 3.0 } N 1450 1800 1800 1800 4 C 4000 900 1 0 0 spice-opamp-2.sym { T 5000 1825 5 10 1 1 0 0 1 refdes=U1 T 5000 1200 5 10 1 1 0 0 1 value=LMX358 } gspiceui-1.0.00+dfsg/sch/op-amp/opamp-lm358-2.sch0000644000000000000000000000276311602724116017613 0ustar rootrootv 20110115 2 C 6000 2900 1 90 0 vdc-1.sym { T 5600 3950 5 10 1 1 180 0 1 refdes=Vcc T 5750 3700 5 10 1 1 180 0 1 value=DC 6V } C 1750 2100 1 270 0 vac-1.sym { T 2250 2150 5 10 1 1 0 0 1 refdes=Vin T 1950 1300 5 10 1 1 0 0 1 value=AC 100m } N 5500 2100 6600 2100 4 N 6000 2100 6000 1000 4 N 5100 1000 4000 1000 4 N 4000 1000 4000 1800 4 N 3850 1800 4100 1800 4 N 4800 2600 4800 3200 4 N 4800 1600 4800 600 4 C 4700 300 1 0 0 gnd-1.sym C 6300 3100 1 90 0 gnd-1.sym C 1350 300 1 0 0 gnd-1.sym C 6500 300 1 0 0 gnd-1.sym C 6500 1800 1 270 0 resistor-2.sym { T 6800 1400 5 10 1 1 0 0 1 refdes=Rout T 7200 1300 5 10 1 1 180 0 1 value=10K } T 1200 3900 9 12 1 0 0 0 1 OP AMP Voltage Follower C 1150 600 1 0 0 vdc-1.sym { T 1000 1400 5 10 1 1 180 0 1 refdes=Vbias T 1100 1100 5 10 1 1 180 0 1 value=DC 3.0 } N 1450 1800 1750 1800 4 C 2950 1700 1 0 0 resistor-2.sym { T 3300 2000 5 10 1 1 0 0 1 refdes=R1 T 3300 1500 5 10 1 1 0 0 1 value=1K } C 5100 900 1 0 0 resistor-2.sym { T 5450 1200 5 10 1 1 0 0 1 refdes=R2 T 5400 700 5 10 1 1 0 0 1 value=10K } N 4100 2400 1450 2400 4 N 1450 2400 1450 1800 4 N 6600 2100 6600 1800 4 N 6600 900 6600 600 4 T 2450 3700 9 10 1 0 0 4 1 Last Updated on 30/06/2011 C 550 2550 1 0 0 spice-model-1.sym { T 650 3250 5 10 0 1 0 0 1 device=model T 650 3150 5 10 1 1 0 0 1 refdes=A1 T 1850 2850 5 10 1 1 0 0 1 model-name=LM358 T 1050 2650 5 10 1 1 0 0 1 file=../../lib/opamp/lm358.mod } C 4100 1500 1 0 0 spice-opamp-2.sym { T 5100 2425 5 10 1 1 0 0 1 refdes=U1 T 5100 1800 5 10 1 1 0 0 1 value=LM358 } gspiceui-1.0.00+dfsg/sch/op-amp/opamp-lmx358-2.sch0000644000000000000000000000266011602724415020001 0ustar rootrootv 20110115 2 C 6000 2850 1 90 0 vdc-1.sym { T 5500 3900 5 10 1 1 180 0 1 refdes=Vcc T 5700 3700 5 10 1 1 180 0 1 value=DC 6V } C 1750 2100 1 270 0 vac-1.sym { T 2250 2150 5 10 1 1 0 0 1 refdes=Vin T 1950 1300 5 10 1 1 0 0 1 value=AC 100m } N 5500 2100 6600 2100 4 N 6100 2100 6100 1000 4 N 5100 1000 4000 1000 4 N 4000 1000 4000 1800 4 N 3850 1800 4100 1800 4 N 4800 2600 4800 3150 4 N 4800 1600 4800 600 4 C 4700 300 1 0 0 gnd-1.sym C 6300 3050 1 90 0 gnd-1.sym C 1350 300 1 0 0 gnd-1.sym C 6500 300 1 0 0 gnd-1.sym C 6500 1800 1 270 0 resistor-2.sym { T 6800 1400 5 10 1 1 0 0 1 refdes=Rout T 7200 1300 5 10 1 1 180 0 1 value=10K } T 2300 4250 9 12 1 0 0 0 1 OP AMP Voltage Follower C 450 2750 1 0 0 spice-model-1.sym { T 550 3350 5 10 1 1 0 0 1 refdes=A1 T 1750 3050 5 10 1 1 0 0 1 model-name=LMX358 T 950 2850 5 10 1 1 0 0 1 file=../../lib/opamp/lmx358.mod } C 1150 600 1 0 0 vdc-1.sym { T 1000 1400 5 10 1 1 180 0 1 refdes=Vbias T 1100 1100 5 10 1 1 180 0 1 value=DC 3.0 } N 1450 1800 1750 1800 4 C 2950 1700 1 0 0 resistor-2.sym { T 3300 2000 5 10 1 1 0 0 1 refdes=R1 T 3300 1500 5 10 1 1 0 0 1 value=1K } C 5100 900 1 0 0 resistor-2.sym { T 5450 1200 5 10 1 1 0 0 1 refdes=R2 T 5400 700 5 10 1 1 0 0 1 value=10K } N 4100 2400 1450 2400 4 N 1450 2400 1450 1800 4 N 6600 2100 6600 1800 4 N 6600 900 6600 600 4 N 6000 1000 6100 1000 4 C 4100 1500 1 0 0 spice-opamp-2.sym { T 5100 2425 5 10 1 1 0 0 1 refdes=U1 T 5100 1800 5 10 1 1 0 0 1 value=LMX358 } gspiceui-1.0.00+dfsg/sch/op-amp/opamp-lm358-1.sch0000644000000000000000000000254411602723727017616 0ustar rootrootv 20110115 2 C 5500 88300 1 0 0 vdc-1.sym { T 5100 88900 5 10 1 1 0 0 1 refdes=Vcc T 4950 88600 5 10 1 1 0 0 1 value=DC 6V } C 1850 88300 1 270 0 vac-1.sym { T 2350 88400 5 10 1 1 0 0 1 refdes=Vin T 2200 87500 5 10 1 1 0 0 1 value=AC 1V } N 4600 87700 5500 87700 4 N 4900 87700 4900 86900 4 N 4900 86900 3200 86900 4 N 3200 86900 3200 87400 4 C 3300 86100 1 0 0 gnd-1.sym C 5700 88000 1 0 0 gnd-1.sym N 3050 88000 3200 88000 4 C 5400 87500 1 270 0 resistor-2.sym { T 5700 87100 5 10 1 1 0 0 1 refdes=Rout T 6100 87000 5 10 1 1 180 0 1 value=10K } T 1900 90250 9 12 1 0 0 0 1 Op. Amp. Voltage Follower C 1200 86600 1 0 0 vdc-1.sym { T 1050 87400 5 10 1 1 180 0 1 refdes=Vbias T 1150 87100 5 10 1 1 180 0 1 value=DC 3V } N 1500 88000 1850 88000 4 T 3250 90000 9 10 1 0 0 4 1 Last Updated on 30/06/2011 N 3900 87200 3900 86400 4 C 500 88700 1 0 0 spice-model-1.sym { T 600 89400 5 10 0 1 0 0 1 device=model T 600 89300 5 10 1 1 0 0 1 refdes=A1 T 1800 89000 5 10 1 1 0 0 1 model-name=LM358 T 1000 88800 5 10 1 1 0 0 1 file=../../lib/opamp/lm358.mod } N 1500 86400 5500 86400 4 N 5500 87700 5500 87500 4 N 5500 86600 5500 86400 4 N 1500 86400 1500 86600 4 N 1500 87800 1500 88000 4 C 5600 89500 1 0 0 vcc-1.sym C 3700 88900 1 0 0 vcc-1.sym N 3900 88200 3900 88900 4 C 3200 87100 1 0 0 spice-opamp-2.sym { T 4200 88025 5 10 1 1 0 0 1 refdes=U1 T 4300 87400 5 10 1 1 0 0 1 value=LM358 } gspiceui-1.0.00+dfsg/sch/op-amp/opamp-lm741.sch0000644000000000000000000000447511412210441017440 0ustar rootrootv 20091004 2 C 39250 67400 1 0 0 capacitor-1.sym { T 39600 67900 5 10 1 1 0 0 1 refdes=C1 T 39500 67200 5 10 1 1 0 0 1 value=150nF T 39250 67400 5 10 0 1 0 0 1 footprint=AXIAL_LAY 300 } N 41050 67600 41900 67600 4 N 39250 67600 39250 67150 4 { T 39100 67700 5 10 0 1 0 0 1 netname= } C 40150 67500 1 0 0 resistor-1.sym { T 40250 67800 5 10 1 1 0 0 1 refdes=R1 T 40600 67800 5 10 1 1 0 0 1 value=10K T 40150 67500 5 10 0 1 0 0 1 footprint=R025 } C 41300 65200 1 0 0 gnd-1.sym C 38950 65950 1 0 0 vac-1.sym { T 39650 66400 5 10 1 1 0 0 1 refdes=Vin T 39500 66150 5 10 1 1 0 0 1 value=dc 0 ac 1 } N 39250 65950 39250 65500 4 N 39250 65500 43450 65500 4 C 41800 69200 1 0 0 capacitor-1.sym { T 41850 69500 5 10 1 1 0 0 1 refdes=C2 T 42400 69500 5 10 1 1 0 0 1 value=330pF T 41800 69200 5 10 0 1 0 0 1 footprint=AXIAL_LAY 300 } C 41800 68600 1 0 0 resistor-1.sym { T 41900 68900 5 10 1 1 0 0 1 refdes=R2 T 42300 68900 5 10 1 1 0 0 1 value=100K T 41800 68600 5 10 0 1 0 0 1 footprint=R025 } N 41200 68700 41800 68700 4 N 41800 69400 41200 69400 4 N 41200 67600 41200 69400 4 N 42700 68700 43450 68700 4 N 42700 69400 43450 69400 4 N 43450 67150 43450 69400 4 C 43550 66250 1 90 0 resistor-1.sym { T 43900 66900 5 10 1 1 180 0 1 refdes=R3 T 43950 66600 5 10 1 1 180 0 1 value=15K T 43550 66250 5 10 0 1 90 0 1 footprint=R025 } N 43450 65500 43450 66250 4 C 42100 65600 1 0 0 vdc-1.sym { T 42850 66050 5 10 1 1 0 0 1 refdes=V1 T 42700 65800 5 10 1 1 0 0 1 value=DC 10V } N 42900 67400 43450 67400 4 N 41900 67200 40450 67200 4 N 40450 67200 40450 65500 4 N 42400 65600 42400 65500 4 N 42400 67000 42400 66800 4 { T 42500 66850 5 10 0 1 0 0 1 netname= } C 41800 66800 1 180 0 vdc-1.sym { T 41100 66150 5 10 1 1 180 0 1 refdes=V2 T 41300 65900 5 10 1 1 180 0 1 value=DC 10V } N 41500 65600 41500 65500 4 N 41500 66800 41500 68300 4 N 41500 68300 42400 68300 4 N 42400 68300 42400 67800 4 { T 42500 67900 5 10 0 1 0 0 1 netname= } C 41900 67000 1 0 0 aop-spice-1.sym { T 41850 66800 5 10 1 1 0 0 1 refdes=XU1 T 41800 67900 5 10 1 1 0 0 1 value=LM741 T 41900 67000 5 10 0 1 0 0 1 footprint=DIL 8 300 T 42950 67000 5 10 0 1 0 0 1 model-name=LM741 } C 38300 68300 1 0 0 spice-model-1.sym { T 38400 69000 5 10 0 1 0 0 1 device=model T 38400 68900 5 10 1 1 0 0 1 refdes=A1 T 39600 68600 5 10 1 1 0 0 1 model-name=LM741 T 38800 68400 5 10 1 1 0 0 1 file=../../lib/opamp/lm741.mod } gspiceui-1.0.00+dfsg/sch/bat-chgr/0000755000000000000000000000000011752030331015254 5ustar rootrootgspiceui-1.0.00+dfsg/sch/bat-chgr/ians-batt-chgr.sch0000644000000000000000000000506611602623354020574 0ustar rootrootv 20110115 2 C 300 86200 1 0 0 vdc-1.sym { T 1000 86850 5 10 1 1 0 0 1 refdes=Vpwr T 1000 86650 5 10 1 1 0 0 1 value=DC 20V } C 5700 87400 1 0 1 npn-3.sym { T 4800 87900 5 10 1 1 0 6 1 refdes=Q2 T 4200 87600 5 10 1 1 0 0 1 value=BC548 } C 4600 88600 1 270 1 pnp-3.sym { T 5000 89900 5 10 1 1 180 6 1 refdes=Q1 T 4800 89500 5 10 1 1 0 0 1 value=2N5401 } C 700 87500 1 90 0 resistor-2.sym { T 400 87700 5 10 1 1 90 0 1 refdes=Rpwr T 900 87800 5 10 1 1 90 0 1 value=30 } C 1800 89100 1 0 0 resistor-2.sym { T 2000 89400 5 10 1 1 0 0 1 refdes=R1 T 2400 89400 5 10 1 1 0 0 1 value=12 } C 1200 88400 1 0 0 resistor-2.sym { T 1500 88700 5 10 1 1 0 0 1 refdes=R2 T 1500 88200 5 10 1 1 0 0 1 value=220 } C 5200 86300 1 90 0 resistor-2.sym { T 4900 87000 5 10 1 1 180 0 1 refdes=R3 T 4600 86500 5 10 1 1 0 0 1 value=5.6k } C 6300 86500 1 0 0 vdc-1.sym { T 5700 87150 5 10 1 1 0 0 1 refdes=Vbatt T 5600 86850 5 10 1 1 0 0 1 value=DC 12V } N 600 87400 600 87500 4 N 600 88400 600 89200 4 N 600 89200 1800 89200 4 N 2700 89200 3500 89200 4 N 5600 89200 6600 89200 4 N 6600 87900 6600 87700 4 N 6600 86500 6600 86100 4 N 6600 86100 600 86100 4 N 600 86100 600 86200 4 N 5100 88600 5100 88400 4 N 5100 87400 5100 87200 4 N 5100 86300 5100 86100 4 N 1100 89200 1100 88500 4 N 1100 88500 1200 88500 4 N 2100 88500 2300 88500 4 N 3200 88500 3300 88500 4 N 3300 88500 3300 89200 4 N 5700 87900 5900 87900 4 N 5900 87900 5900 89200 4 C 2300 88300 1 0 0 led-1.sym { T 2600 88100 5 10 1 1 0 0 1 refdes=LED T 2300 88300 5 10 0 1 0 0 1 value=LED } C 6500 88800 1 270 0 resistor-2.sym { T 6400 88100 5 10 1 1 90 0 1 refdes=Rbatt T 6900 88200 5 10 1 1 90 0 1 value=10 } N 6600 89200 6600 88800 4 C 3800 85800 1 0 0 gnd-1.sym T 3800 90400 9 18 1 0 0 4 1 Ian's Battery Charger C 7400 88900 1 0 0 spice-model-1.sym { T 7500 89500 5 10 1 1 0 0 1 refdes=A1 T 8700 89200 5 10 1 1 0 0 1 model-name=BC548 T 7900 89000 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 7400 87900 1 0 0 spice-model-1.sym { T 7500 88500 5 10 1 1 0 0 1 refdes=A2 T 8700 88200 5 10 1 1 0 0 1 model-name=2N5401 T 7900 88000 5 10 1 1 0 0 1 file=../../lib/bjt/2n5401.mod } C 7400 86900 1 0 0 spice-model-1.sym { T 7500 87500 5 10 1 1 0 0 1 refdes=A3 T 8700 87200 5 10 1 1 0 0 1 model-name=LED T 7900 87000 5 10 1 1 0 0 1 file=../../lib/diode/led.mod } C 3500 89000 1 0 0 diode-1.sym { T 3900 89500 5 10 1 1 0 0 1 refdes=D1 T 3700 88800 5 10 1 1 0 0 1 value=1N914 } N 4400 89200 4600 89200 4 C 7400 85900 1 0 0 spice-model-1.sym { T 7500 86500 5 10 1 1 0 0 1 refdes=A4 T 8700 86200 5 10 1 1 0 0 1 model-name=1N914 T 7900 86000 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } gspiceui-1.0.00+dfsg/sch/bat-chgr/bat-chgr-14.4v.sch0000644000000000000000000000514711412210437020223 0ustar rootrootv 20091004 2 C 950 83900 1 270 1 pnp-3.sym { T 1350 85200 5 10 1 1 180 6 1 refdes=Q1 T 1150 84800 5 10 1 1 0 0 1 value=C9015 } C 4800 83250 1 0 0 resistor-2.sym { T 5000 83550 5 10 1 1 0 0 1 refdes=R1 T 5400 83550 5 10 1 1 0 0 1 value=12 } C 2000 82950 1 0 0 resistor-2.sym { T 2300 83250 5 10 1 1 0 0 1 refdes=R2 T 2300 82750 5 10 1 1 0 0 1 value=220 } C 7250 83050 1 90 0 resistor-2.sym { T 6950 83750 5 10 1 1 180 0 1 refdes=R3 T 6650 83250 5 10 1 1 0 0 1 value=5.6k } C 9450 83450 1 0 0 vdc-1.sym { T 8850 84100 5 10 1 1 0 0 1 refdes=Vbatt T 8750 83800 5 10 1 1 0 0 1 value=DC 12V } C 2800 84550 1 0 0 led-1.sym { T 3050 84350 5 10 1 1 0 0 1 refdes=LED1 T 2800 84550 5 10 0 1 0 0 1 value=LED } C 2650 86700 1 0 0 gnd-1.sym T 3800 90400 9 18 1 0 0 4 1 Battery Charger 14.4V C 9250 88950 1 0 0 spice-model-1.sym { T 9350 89550 5 10 1 1 0 0 1 refdes=A1 T 10550 89250 5 10 1 1 0 0 1 model-name=BC548 T 9750 89050 5 10 1 1 0 0 1 file=../../lib/bjt/npn/bc548.mod } C 9250 87950 1 0 0 spice-model-1.sym { T 9350 88550 5 10 1 1 0 0 1 refdes=A2 T 10550 88250 5 10 1 1 0 0 1 model-name=2N5401 T 9750 88050 5 10 1 1 0 0 1 file=../../lib/bjt/pnp/2n5401.mod } C 9250 86950 1 0 0 spice-model-1.sym { T 9350 87550 5 10 1 1 0 0 1 refdes=A3 T 10550 87250 5 10 1 1 0 0 1 model-name=LED T 9750 87050 5 10 1 1 0 0 1 file=../../lib/diode/led.mod } C 6350 86800 1 0 0 diode-1.sym { T 6700 87250 5 10 1 1 0 0 1 refdes=D2 T 6550 86600 5 10 1 1 0 0 1 value=1N914 } C 9250 85950 1 0 0 spice-model-1.sym { T 9350 86550 5 10 1 1 0 0 1 refdes=A4 T 10550 86250 5 10 1 1 0 0 1 model-name=1N914 T 9750 86050 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } C 3550 83350 1 0 0 led-1.sym { T 3800 83150 5 10 1 1 0 0 1 refdes=LED2 T 3550 83350 5 10 0 1 0 0 1 value=LED } C 1200 88000 1 0 0 vac-1.sym { T 800 88450 5 10 1 1 0 0 1 refdes=Vin T 1900 88850 5 10 0 0 0 0 1 device=vac T 1900 89050 5 10 0 0 0 0 1 footprint=none T 800 88150 5 10 1 1 0 0 1 value=AC 18 } C 3750 89000 1 180 0 diode-bridge-1.sym { T 2850 88075 5 10 1 1 180 0 1 refdes=U1 T 2550 88925 5 8 0 0 180 0 1 device=DIODE-BRIDGE } N 1500 88000 1750 88000 4 N 1500 89200 3750 89200 4 N 3750 89200 3750 88000 4 N 2750 89000 4000 89000 4 N 2750 87000 4000 87000 4 C 4900 87800 1 0 0 capacitor-4.sym { T 5100 88900 5 10 0 0 0 0 1 device=POLARIZED_CAPACITOR T 5100 88300 5 10 1 1 0 0 1 refdes=C? T 5100 88500 5 10 0 0 0 0 1 symversion=0.1 } C 3800 87900 1 270 0 capacitor-4.sym { T 4900 87700 5 10 0 0 270 0 1 device=POLARIZED_CAPACITOR T 4350 87450 5 10 1 1 0 0 1 refdes=C1 T 4500 87700 5 10 0 0 270 0 1 symversion=0.1 } C 6400 87850 1 0 0 diode-1.sym { T 6750 88300 5 10 1 1 0 0 1 refdes=D1 T 6600 87650 5 10 1 1 0 0 1 value=1N914 } gspiceui-1.0.00+dfsg/sch/filter/0000755000000000000000000000000011752030331015052 5ustar rootrootgspiceui-1.0.00+dfsg/sch/filter/filter-jb.sch0000644000000000000000000000460011412210440017421 0ustar rootrootv 20081231 1 C 5300 89100 1 270 0 capacitor-1.sym { T 5600 88800 5 10 1 1 0 0 1 refdes=C1 T 5850 88500 5 10 1 1 180 0 1 value=8p } C 2050 89300 1 180 0 resistor-2.sym { T 1500 89350 5 10 1 1 0 0 1 refdes=Rs T 1500 88900 5 10 1 1 0 0 1 value=50 } N 5150 89200 5700 89200 4 N 1150 89200 950 89200 4 C 6400 87900 1 0 0 gnd-1.sym C 750 89200 1 270 0 voltage-2.sym { T 450 88650 5 10 1 1 0 0 1 refdes=Vs T 850 88500 5 10 1 1 180 0 1 value=AC 1V } T 4450 90300 9 16 1 0 0 0 1 Resonant Band Pass Filter T 6150 90050 9 10 1 0 0 4 1 Last Updated on 01/10/2009 C 11550 88200 1 90 0 resistor-2.sym { T 11850 88850 5 10 1 1 180 0 1 refdes=Ro T 11850 88600 5 10 1 1 180 0 1 value=50 } C 7900 89100 1 270 0 capacitor-1.sym { T 7750 88800 5 10 1 1 0 0 1 refdes=C4 T 8050 88500 5 10 1 1 180 0 1 value=8p } C 5700 89000 1 0 0 capacitor-1.sym { T 6050 89400 5 10 1 1 180 0 1 refdes=C2 T 6300 89300 5 10 1 1 0 0 1 value=22p } C 7000 89000 1 0 0 capacitor-1.sym { T 7350 89400 5 10 1 1 180 0 1 refdes=C3 T 7600 89300 5 10 1 1 0 0 1 value=22p } C 6900 88200 1 90 0 coil-2.sym { T 6400 88400 5 10 0 0 90 0 1 device=COIL T 7250 88850 5 10 1 1 180 0 1 refdes=L2 T 6200 88400 5 10 0 0 90 0 1 symversion=0.1 T 6950 88500 5 10 1 1 0 0 1 value=88nH } N 6600 89200 7000 89200 4 N 7900 89200 8350 89200 4 N 5500 89100 5500 89200 4 N 8100 89100 8100 89200 4 T 1150 84950 9 10 1 0 0 0 11 The insertion loss is about 6dB. The pass band width is about 6MHz. The pass band roll-off varies with C1 & C4. As C1 & C4 increase the bandwidth decreases. The pass band center frequency varies with L1, C2 & C3. For constant fc, as C2 & C3 increase L1 must decrease. If L1 = 85nH then fc = 133MHz. If L1 = 220nH then fc = 81MHz. N 11050 88800 11050 88200 4 N 9650 88800 9650 88200 4 N 950 88200 11450 88200 4 N 2450 88200 2450 88800 4 N 3850 88800 3850 88200 4 C 2050 88800 1 0 0 tline.sym { T 2950 89200 5 10 0 1 0 0 1 device=T-Line T 3100 88750 5 10 1 1 0 0 1 refdes=Ts T 2600 89500 5 10 1 1 0 0 1 value=Z0=50 TD=1nS } C 9250 88800 1 0 0 tline.sym { T 10150 89200 5 10 0 1 0 0 1 device=T-Line T 10300 88750 5 10 1 1 0 0 1 refdes=To T 9750 89500 5 10 1 1 0 0 1 value=Z0=50 TD=1nS } N 11450 89200 11450 89100 4 N 950 88300 950 88200 4 C 4250 89000 1 0 0 capacitor-1.sym { T 4600 89400 5 10 1 1 180 0 1 refdes=C0 T 4850 89300 5 10 1 1 0 0 1 value=5p } C 8350 89000 1 0 0 capacitor-1.sym { T 8700 89400 5 10 1 1 180 0 1 refdes=C5 T 8950 89300 5 10 1 1 0 0 1 value=5p } gspiceui-1.0.00+dfsg/sch/filter/filter-lp-1.sch0000644000000000000000000000136411640101231017603 0ustar rootrootv 20110115 2 C 1900 89400 1 270 0 capacitor-1.sym { T 2250 89100 5 10 1 1 0 0 1 refdes=C1 T 2600 88800 5 10 1 1 180 0 1 value=1.0n } C 1000 89300 1 0 0 resistor-2.sym { T 1350 89600 5 10 1 1 0 0 1 refdes=R1 T 1300 89100 5 10 1 1 0 0 1 value=10k } N 1900 89400 2100 89400 4 { T 2100 89500 5 10 1 1 0 0 1 netname=Vout } N 1000 89400 800 89400 4 C 1400 88200 1 0 0 gnd-1.sym N 800 88500 2100 88500 4 T 400 90250 9 16 1 0 0 0 1 Low Pass Filter T 1400 90050 9 10 1 0 0 4 1 Last Updated : 27/09/2011 T 200 87200 9 10 1 0 0 0 4 The 3 dB point : - Calculated = 1/6.28RC = 15.92 KHz - NG-Spice = 15.92 KHz - GNU-Cap = 15.92 KHz C 1000 88500 1 90 0 voltage-1.sym { T 500 88600 5 10 0 0 90 0 1 device=VOLTAGE_SOURCE T 500 89000 5 10 1 1 180 0 1 refdes=Vin } gspiceui-1.0.00+dfsg/sch/filter/filter-bp-2.sch0000644000000000000000000000333411412210440017571 0ustar rootrootv 20081231 1 C 6200 88950 1 270 0 resistor-2.sym { T 6500 88600 5 10 1 1 0 0 1 refdes=Ro T 6500 88250 5 10 1 1 0 0 1 value=50K } N 6300 89200 6300 88950 4 N 4300 89200 4100 89200 4 C 3500 87400 1 0 0 gnd-1.sym C 800 89000 1 270 0 voltage-2.sym { T 1400 88600 5 10 1 1 0 0 1 refdes=Vin T 1800 88500 5 10 1 1 180 0 1 value=AC 1V } N 1000 87700 6300 87700 4 T 2050 90250 9 16 1 0 0 0 1 Resonant Band Pass Filter T 3800 90050 9 10 1 0 0 4 1 Last Updated on 03/09/2009 C 4100 87700 1 90 0 capacitor-1.sym { T 3575 88275 5 10 1 1 0 0 1 refdes=C2 T 3850 88025 5 10 1 1 180 0 1 value=47p } C 2100 89300 1 180 0 resistor-2.sym { T 1550 89350 5 10 1 1 0 0 1 refdes=Rs T 1550 88900 5 10 1 1 0 0 1 value=50 } N 1000 89200 1200 89200 4 C 5200 89100 1 0 0 inductor-1.sym { T 5400 89600 5 10 0 0 0 0 1 device=INDUCTOR T 5550 89350 5 10 1 1 0 0 1 refdes=L3 T 5400 89800 5 10 0 0 0 0 1 symversion=0.1 T 5450 88950 5 10 1 1 0 0 1 value=100n } C 4600 87700 1 90 0 inductor-1.sym { T 4100 87900 5 10 0 0 90 0 1 device=INDUCTOR T 4900 88350 5 10 1 1 180 0 1 refdes=L2 T 3900 87900 5 10 0 0 90 0 1 symversion=0.1 T 5100 88100 5 10 1 1 180 0 1 value=100n } C 5200 89400 1 180 0 capacitor-1.sym { T 4675 89425 5 10 1 1 180 0 1 refdes=C3 T 4900 88975 5 10 1 1 0 0 1 value=47p } C 3200 89100 1 0 0 inductor-1.sym { T 3400 89600 5 10 0 0 0 0 1 device=INDUCTOR T 3550 89350 5 10 1 1 0 0 1 refdes=L1 T 3400 89800 5 10 0 0 0 0 1 symversion=0.1 T 3450 88950 5 10 1 1 0 0 1 value=100n } C 3200 89400 1 180 0 capacitor-1.sym { T 2675 89425 5 10 1 1 180 0 1 refdes=C1 T 2850 88975 5 10 1 1 0 0 1 value=47p } N 2100 89200 2300 89200 4 N 6300 89200 6100 89200 4 N 6300 88050 6300 87700 4 N 1000 88100 1000 87700 4 N 1000 89200 1000 89000 4 N 4200 89200 4200 88600 4 N 4500 88600 3900 88600 4 gspiceui-1.0.00+dfsg/sch/filter/filter-bp-1.sch0000644000000000000000000000162311412210440017567 0ustar rootrootv 20061020 1 C 3800 89250 1 270 0 resistor-2.sym { T 4100 88900 5 10 1 1 0 0 1 refdes=RL T 4100 88550 5 10 1 1 0 0 1 value=1K } N 3650 89250 3900 89250 4 N 2750 89250 2200 89250 4 C 1950 88050 1 0 0 gnd-1.sym C 850 89250 1 270 0 voltage-2.sym { T 350 88850 5 10 1 1 0 0 1 refdes=Vin T 750 88750 5 10 1 1 180 0 1 value=AC 1V } N 1050 88350 3900 88350 4 T 1200 90300 9 16 1 0 0 0 1 Band Pass Filter T 2350 90050 9 10 1 0 0 4 1 Last Updated on 15/05/2007 C 2750 88350 1 90 0 capacitor-1.sym { T 2275 88925 5 10 1 1 0 0 1 refdes=C1 T 2500 88675 5 10 1 1 180 0 1 value=0.47u } C 2200 89350 1 180 0 resistor-2.sym { T 1650 89400 5 10 1 1 0 0 1 refdes=R1 T 1650 88950 5 10 1 1 0 0 1 value=1K } N 1050 89250 1300 89250 4 C 2750 89150 1 0 0 inductor-1.sym { T 2950 89650 5 10 0 0 0 0 1 device=INDUCTOR T 3100 89400 5 10 1 1 0 0 1 refdes=L1 T 2950 89850 5 10 0 0 0 0 1 symversion=0.1 T 3000 89000 5 10 1 1 0 0 1 value=200m } gspiceui-1.0.00+dfsg/sch/filter/filter-lp-2.sch0000644000000000000000000000116411412210440017602 0ustar rootrootv 20040111 1 C 2200 90000 1 270 0 capacitor-1.sym { T 2500 89700 5 10 1 1 0 0 1 refdes=C1 T 2800 89400 5 10 1 1 180 0 1 value=1nF } C 1300 89900 1 0 0 resistor-2.sym { T 1700 90200 5 10 1 1 0 0 1 refdes=R1 T 1700 89700 5 10 1 1 0 0 1 value=1k } N 2200 90000 3100 90000 4 N 1300 90000 1000 90000 4 C 2300 88800 1 0 0 gnd-1.sym C 800 90000 1 270 0 voltage-2.sym { T 500 89600 5 10 1 1 0 0 1 refdes=Vin T 700 89500 5 10 1 1 180 0 1 value=1V } C 3000 90000 1 270 0 resistor-2.sym { T 3300 89600 5 10 1 1 0 0 1 refdes=R2 T 3600 89500 5 10 1 1 180 0 1 value=10k } N 1000 89100 3100 89100 4 T 1000 90600 9 16 1 0 0 0 1 Low Pass Filter gspiceui-1.0.00+dfsg/sch/audio/0000755000000000000000000000000011752030331014666 5ustar rootrootgspiceui-1.0.00+dfsg/sch/audio/amp-drv-18w.sch0000644000000000000000000000656211602625116017366 0ustar rootrootv 20110115 2 C 8350 2900 1 90 0 resistor-2.sym { T 8050 3550 5 10 1 1 180 0 1 refdes=R6 T 7850 3150 5 10 1 1 0 0 1 value=10 } C 4650 5000 1 270 0 resistor-2.sym { T 5000 4600 5 10 1 1 0 0 1 refdes=R2 T 4950 4300 5 10 1 1 0 0 1 value=4.7K } C 4650 1700 1 270 0 resistor-2.sym { T 5000 1300 5 10 1 1 0 0 1 refdes=R4 T 4950 1000 5 10 1 1 0 0 1 value=4.7K } C 4650 2900 1 270 0 resistor-2.sym { T 4950 2550 5 10 1 1 0 0 1 refdes=R3 T 4950 2250 5 10 1 1 0 0 1 value=1K } C 8450 2100 1 90 0 capacitor-4.sym { T 8050 2600 5 10 1 1 180 0 1 refdes=C6 T 8150 2350 5 10 1 1 180 0 1 value=100n } C 5750 3300 1 0 0 npn-3.sym { T 6650 3850 5 10 1 1 0 0 1 refdes=Q1 T 6650 3600 5 10 1 1 0 0 1 value=BC548 } C 6950 700 1 0 0 npn-3.sym { T 7850 1250 5 10 1 1 0 0 1 refdes=Q3 T 7850 1000 5 10 1 1 0 0 1 value=TIP41 } C 5750 2500 1 180 1 pnp-3.sym { T 6650 2150 5 10 1 1 180 6 1 refdes=Q2 T 6650 1750 5 10 1 1 0 0 1 value=BC558 } C 6950 5100 1 180 1 pnp-3.sym { T 7850 4750 5 10 1 1 180 6 1 refdes=Q4 T 7850 4350 5 10 1 1 0 0 1 value=TIP42 } C 8150 1800 1 0 0 gnd-1.sym C 3950 2900 1 90 0 voltage-1.sym { T 3450 3350 5 10 1 1 180 0 1 refdes=Vin T 2600 2950 5 10 1 1 0 0 1 value=DC 0V AC 0V } N 6350 4600 6950 4600 4 N 6350 4600 6350 4300 4 N 6350 1200 6950 1200 4 N 6350 1200 6350 1500 4 N 7550 700 7550 500 4 N 7550 4100 7550 1700 4 N 7550 5300 7550 5100 4 N 6350 2900 7550 2900 4 N 6350 3300 6350 2500 4 T 6600 6400 9 18 1 0 0 4 1 Audio Amplifier - 18Watt C 10600 4200 1 0 0 spice-model-1.sym { T 10700 4800 5 10 1 1 0 0 1 refdes=A2 T 11900 4500 5 10 1 1 0 0 1 model-name=BC548 T 11100 4300 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 10600 3200 1 0 0 spice-model-1.sym { T 10700 3800 5 10 1 1 0 0 1 refdes=A3 T 11900 3500 5 10 1 1 0 0 1 model-name=BC558 T 11100 3300 5 10 1 1 0 0 1 file=../../lib/bjt/bc558.mod } C 10600 2200 1 0 0 spice-model-1.sym { T 10700 2800 5 10 1 1 0 0 1 refdes=A4 T 11900 2500 5 10 1 1 0 0 1 model-name=TIP41 T 11100 2300 5 10 1 1 0 0 1 file=../../lib/bjt/tip41.mod } C 10600 1200 1 0 0 spice-model-1.sym { T 10700 1800 5 10 1 1 0 0 1 refdes=A5 T 11900 1500 5 10 1 1 0 0 1 model-name=TIP42 T 11100 1300 5 10 1 1 0 0 1 file=../../lib/bjt/tip42.mod } C 9650 3500 1 270 0 resistor-2.sym { T 9200 2850 5 10 1 1 0 0 1 refdes=Rout T 9550 3250 5 10 1 1 180 0 1 value=4 } N 7550 3800 8650 3800 4 C 9650 2300 1 0 0 gnd-1.sym C 9950 5600 1 90 1 vdc-1.sym { T 9500 4600 5 10 1 1 0 6 1 refdes=Vcc T 9650 4800 5 10 1 1 0 6 1 value=DC 15V } C 9950 800 1 90 1 vdc-1.sym { T 9500 1050 5 10 1 1 0 6 1 refdes=Vee T 9750 850 5 10 1 1 0 6 1 value=DC -15V } N 4750 5300 8750 5300 4 N 4750 500 8750 500 4 C 10250 5200 1 90 0 gnd-1.sym C 10250 400 1 90 0 gnd-1.sym C 5850 3400 1 90 1 capacitor-4.sym { T 6000 3150 5 10 1 1 0 6 1 refdes=C5 T 5700 2750 5 10 1 1 180 6 1 value=100u } C 4550 3800 1 270 0 diode-1.sym { T 4250 3250 5 10 1 1 0 0 1 refdes=D1 T 4150 3000 5 10 1 1 0 0 1 value=1N914 } C 8650 3700 1 0 0 resistor-2.sym { T 8950 4000 5 10 1 1 0 0 1 refdes=R7 T 8950 3500 5 10 1 1 0 0 1 value=22 } N 4750 5300 4750 5000 4 N 4750 4100 4750 3800 4 N 4750 2000 4750 1700 4 N 4750 800 4750 500 4 N 3750 3800 5750 3800 4 N 5750 2000 4750 2000 4 N 5650 3800 5650 3400 4 N 9550 3800 9750 3800 4 N 9750 3800 9750 3500 4 C 3650 2600 1 0 0 gnd-1.sym N 5650 2500 5650 2000 4 C 10600 200 1 0 0 spice-model-1.sym { T 10700 800 5 10 1 1 0 0 1 refdes=A6 T 11900 500 5 10 1 1 0 0 1 model-name=1N914 T 11100 300 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } gspiceui-1.0.00+dfsg/sch/audio/le-pacific-mc-pre.sch0000644000000000000000000000376611602625457020573 0ustar rootrootv 20110115 2 C 2350 86900 1 90 0 capacitor-1.sym { T 1850 87450 5 10 1 1 0 0 1 refdes=C1 T 2100 87250 5 10 1 1 180 0 1 value=1n } C 3250 86400 1 0 0 gnd-1.sym C 1250 87800 1 270 0 voltage-2.sym { T 800 87400 5 10 1 1 0 0 1 refdes=Vin T 1200 87300 5 10 1 1 180 0 1 value=AC 1V } T 650 90300 9 16 1 0 0 0 1 Le Pacific MC RIAA Pre-amplifier T 2700 90050 9 10 1 0 0 4 1 Last Updated : 30 / 06 / 2010 C 3050 86900 1 90 0 resistor-2.sym { T 2750 87550 5 10 1 1 180 0 1 refdes=R1 T 2800 87300 5 10 1 1 180 0 1 value=100 } C 3950 88400 1 0 0 capacitor-1.sym { T 4300 88800 5 10 1 1 180 0 1 refdes=C2 T 4500 88650 5 10 1 1 0 0 1 value=0.47u } C 200 88500 1 0 0 spice-model-1.sym { T 300 89200 5 10 0 1 0 0 1 device=model T 300 89100 5 10 1 1 0 0 1 refdes=A1 T 1500 88800 5 10 1 1 0 0 1 model-name=2SK170 T 700 88600 5 10 1 1 0 0 1 file=../../lib/jfet/2sk170.mod } C 3750 89500 1 90 1 resistor-2.sym { T 3450 89200 5 10 1 1 0 6 1 refdes=R2 T 3500 89000 5 10 1 1 0 6 1 value=2.2K } C 3750 87600 1 90 1 resistor-2.sym { T 3500 87250 5 10 1 1 0 6 1 refdes=R3 T 3500 87000 5 10 1 1 0 6 1 value=47 } C 5100 87000 1 90 0 resistor-2.sym { T 4800 87650 5 10 1 1 180 0 1 refdes=R4 T 4850 87400 5 10 1 1 180 0 1 value=100K } N 1450 87950 3150 87950 4 N 3650 88600 3950 88600 4 N 5000 88600 5000 87900 4 N 5000 87000 5000 86700 4 N 5000 86700 1450 86700 4 N 1450 86700 1450 86900 4 N 1450 87800 1450 87950 4 N 2150 87800 2150 87950 4 N 2950 87800 2950 87950 4 N 2950 86900 2950 86700 4 N 2150 86900 2150 86700 4 C 5000 89800 1 90 1 vdc-1.sym { T 4050 89600 5 10 1 1 0 6 1 refdes=Vcc T 4150 89100 5 10 0 0 270 2 1 device=VOLTAGE_SOURCE T 3950 89100 5 10 0 0 270 2 1 footprint=none T 4750 89000 5 10 1 1 0 6 1 value=DC 12V } C 4900 89200 1 0 0 gnd-1.sym N 3650 89500 3800 89500 4 N 4850 88600 5000 88600 4 T 5100 88050 9 10 1 0 0 0 1 Vout C 3150 87750 1 0 0 spice-njfet-1.sym { T 3950 88150 5 10 0 0 0 0 1 device=FET_TRANSISTOR T 3750 88200 5 10 1 1 0 0 1 refdes=J1 T 3700 88000 5 10 1 1 0 0 1 value=2SK170 } N 3650 88600 3650 88450 4 N 3650 87750 3650 87600 4 gspiceui-1.0.00+dfsg/sch/audio/aura-drv-20w.sch0000644000000000000000000000563011602625177017534 0ustar rootrootv 20110115 2 C 6700 2500 1 90 0 resistor-2.sym { T 7000 3050 5 10 1 1 180 0 1 refdes=R1 T 6750 2700 5 10 1 1 0 0 1 value=4.7 } C 6300 1700 1 0 0 resistor-2.sym { T 6450 1500 5 10 1 1 0 0 1 refdes=R3 T 6850 1500 5 10 1 1 0 0 1 value=47 } C 7200 1000 1 0 0 resistor-2.sym { T 7350 800 5 10 1 1 0 0 1 refdes=R5 T 7750 800 5 10 1 1 0 0 1 value=1K } C 7200 4600 1 0 0 resistor-2.sym { T 7350 4850 5 10 1 1 0 0 1 refdes=R4 T 7750 4850 5 10 1 1 0 0 1 value=1K } C 6300 3900 1 0 0 resistor-2.sym { T 6450 4150 5 10 1 1 0 0 1 refdes=R2 T 6850 4150 5 10 1 1 0 0 1 value=47 } C 6950 3200 1 0 0 capacitor-4.sym { T 7000 3200 5 10 1 1 0 0 1 refdes=C1 T 7550 3200 5 10 1 1 0 0 1 value=4.7p } C 4500 3000 1 0 0 npn-3.sym { T 5400 3550 5 10 1 1 0 0 1 refdes=Q1 T 5400 3300 5 10 1 1 0 0 1 value=BC548 } C 7500 1300 1 0 0 npn-3.sym { T 8400 1850 5 10 1 1 0 0 1 refdes=Q3 T 8400 1600 5 10 1 1 0 0 1 value=TIP41 } C 4500 2800 1 180 1 pnp-3.sym { T 5400 2450 5 10 1 1 180 6 1 refdes=Q2 T 5400 2050 5 10 1 1 0 0 1 value=BC558 } C 7500 4500 1 180 1 pnp-3.sym { T 8400 4150 5 10 1 1 180 6 1 refdes=Q4 T 8400 3750 5 10 1 1 0 0 1 value=TIP42 } C 6500 2200 1 0 0 gnd-1.sym C 3600 1700 1 0 0 gnd-1.sym C 3900 2000 1 90 0 voltage-1.sym { T 3650 2850 5 10 1 1 180 0 1 refdes=Vin T 3000 2950 5 10 1 1 0 0 1 value=DC 0V AC 0V } N 4500 3500 4300 3500 4 N 4300 3500 4300 2300 4 N 4300 2300 4500 2300 4 N 5100 3000 5100 2800 4 N 5100 4000 6300 4000 4 N 5100 1800 6300 1800 4 N 7200 4000 7500 4000 4 N 7200 4700 7200 4000 4 N 7200 1800 7500 1800 4 N 7200 1100 7200 1800 4 N 8100 1300 8100 500 4 N 8100 3500 8100 2300 4 N 8100 5300 8100 4500 4 N 7850 3400 8100 3400 4 N 6950 3400 6200 3400 4 N 6200 3400 6200 2900 4 N 6200 2900 5100 2900 4 N 3700 2900 4300 2900 4 T 2100 4400 9 16 1 0 0 4 1 Aura Drive Stage - 20Watt C 200 3100 1 0 0 spice-model-1.sym { T 300 3700 5 10 1 1 0 0 1 refdes=A1 T 1500 3400 5 10 1 1 0 0 1 model-name=BC548 T 700 3200 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 200 2100 1 0 0 spice-model-1.sym { T 300 2700 5 10 1 1 0 0 1 refdes=A2 T 1500 2400 5 10 1 1 0 0 1 model-name=BC558 T 700 2200 5 10 1 1 0 0 1 file=../../lib/bjt/bc558.mod } C 200 1100 1 0 0 spice-model-1.sym { T 300 1700 5 10 1 1 0 0 1 refdes=A3 T 1500 1400 5 10 1 1 0 0 1 model-name=TIP41 T 700 1200 5 10 1 1 0 0 1 file=../../lib/bjt/tip41.mod } C 200 100 1 0 0 spice-model-1.sym { T 300 700 5 10 1 1 0 0 1 refdes=A4 T 1500 400 5 10 1 1 0 0 1 model-name=TIP42 T 700 200 5 10 1 1 0 0 1 file=../../lib/bjt/tip42.mod } C 8600 2500 1 90 0 resistor-2.sym { T 9050 3150 5 10 1 1 180 0 1 refdes=Rout T 8700 2750 5 10 1 1 0 0 1 value=4 } N 8100 3400 8500 3400 4 C 8400 2200 1 0 0 gnd-1.sym C 4200 5600 1 270 0 vdc-1.sym { T 4650 4600 5 10 1 1 0 0 1 refdes=Vcc T 4500 4800 5 10 1 1 0 0 1 value=DC 15V } C 4200 800 1 270 0 vdc-1.sym { T 4650 1050 5 10 1 1 0 0 1 refdes=Vee T 4450 850 5 10 1 1 0 0 1 value=DC -15V } N 5400 5300 8100 5300 4 N 8100 500 5400 500 4 C 3900 5400 1 270 0 gnd-1.sym C 3900 600 1 270 0 gnd-1.sym gspiceui-1.0.00+dfsg/sch/audio/le-pacific-mm-pre.sch0000644000000000000000000000524611602626047020574 0ustar rootrootv 20110115 2 C 4800 87050 1 90 0 capacitor-1.sym { T 4300 87600 5 10 1 1 0 0 1 refdes=C2 T 4550 87400 5 10 1 1 180 0 1 value=1n } C 3950 86750 1 0 0 gnd-1.sym C 800 88100 1 270 0 voltage-2.sym { T 350 87700 5 10 1 1 0 0 1 refdes=Vin T 750 87600 5 10 1 1 180 0 1 value=AC 1V } T 1700 90350 9 16 1 0 0 0 1 Le Pacific MM RIAA Pre-amplifier T 3750 90100 9 10 1 0 0 4 1 Last Updated : 30 / 06 / 2010 C 1900 87200 1 90 0 resistor-2.sym { T 1600 87850 5 10 1 1 180 0 1 refdes=R4 T 1650 87600 5 10 1 1 180 0 1 value=100 } C 2500 88650 1 0 0 capacitor-1.sym { T 3350 89050 5 10 1 1 180 0 1 refdes=C1 T 3050 88650 5 10 1 1 0 0 1 value=470n } C 1000 86000 1 0 0 spice-model-1.sym { T 1100 86700 5 10 0 1 0 0 1 device=model T 1100 86600 5 10 1 1 0 0 1 refdes=A1 T 2300 86300 5 10 1 1 0 0 1 model-name=2SK170 T 1500 86100 5 10 1 1 0 0 1 file=../../lib/jfet/2sk170.mod } C 2600 89750 1 90 1 resistor-2.sym { T 2300 89350 5 10 1 1 0 6 1 refdes=R5 T 2350 89100 5 10 1 1 0 6 1 value=2.4K } C 3550 88950 1 180 1 resistor-2.sym { T 3900 89150 5 10 1 1 180 6 1 refdes=R1 T 3850 88700 5 10 1 1 180 6 1 value=27K } C 4500 87950 1 270 1 resistor-2.sym { T 4200 88450 5 10 1 1 180 6 1 refdes=R2 T 4750 88450 5 10 1 1 180 6 1 value=3K } N 1000 88200 2000 88200 4 N 3550 88850 3400 88850 4 N 4450 88850 5200 88850 4 N 6700 87050 1000 87050 4 N 1000 87050 1000 87200 4 N 1000 88100 1000 88200 4 N 1800 88100 1800 88200 4 N 1800 87200 1800 87050 4 C 800 88550 1 0 1 vdc-1.sym { T 1200 89100 5 10 1 1 0 6 1 refdes=Vcc T 100 89400 5 10 0 0 180 2 1 device=VOLTAGE_SOURCE T 100 89600 5 10 0 0 180 2 1 footprint=none T 1450 88850 5 10 1 1 0 6 1 value=DC 24V } C 400 88250 1 0 0 gnd-1.sym N 500 89750 6700 89750 4 C 5000 87050 1 270 1 capacitor-1.sym { T 5500 87600 5 10 1 1 0 6 1 refdes=C3 T 5250 87400 5 10 1 1 180 6 1 value=1n } N 5200 88850 5200 87950 4 C 5750 87200 1 270 1 resistor-2.sym { T 6050 87850 5 10 1 1 180 6 1 refdes=R6 T 6000 87600 5 10 1 1 180 6 1 value=100 } N 2500 88000 2500 87050 4 C 6800 89750 1 90 1 resistor-2.sym { T 6500 89350 5 10 1 1 0 6 1 refdes=R7 T 6550 89100 5 10 1 1 0 6 1 value=2.4K } N 6200 88200 5200 88200 4 N 5850 88200 5850 88100 4 N 5850 87200 5850 87050 4 N 6700 88000 6700 87050 4 C 6950 88750 1 0 0 output-1.sym { T 7050 89050 5 10 0 0 0 0 1 device=OUTPUT T 7200 88750 5 10 1 1 0 0 1 refdes=Vout } N 6950 88850 6700 88850 4 C 2000 88000 1 0 0 spice-njfet-1.sym { T 2800 88400 5 10 0 0 0 0 1 device=FET_TRANSISTOR T 2600 88400 5 10 1 1 0 0 1 refdes=J1 T 2550 88200 5 10 1 1 0 0 1 value=2SK170 } C 6200 88000 1 0 0 spice-njfet-1.sym { T 7000 88400 5 10 0 0 0 0 1 device=FET_TRANSISTOR T 6800 88400 5 10 1 1 0 0 1 refdes=J2 T 6750 88200 5 10 1 1 0 0 1 value=2SK170 } N 2500 88850 2500 88700 4 N 6700 88850 6700 88700 4 gspiceui-1.0.00+dfsg/sch/audio/tda2005m.sch0000644000000000000000000001326711412210436016631 0ustar rootrootv 20060123 1 C 6000 6400 1 90 0 tda2005m.sym { T 2250 9950 5 10 1 1 180 6 1 refdes=U1 T 6000 6400 5 10 1 1 0 0 1 description=TDA2005M } N 4300 6400 4300 6300 4 N 4900 6400 4900 5800 4 N 5500 6400 5500 3950 4 C 7100 2050 1 0 0 speaker-1.sym { T 7700 4050 5 10 1 1 0 0 1 refdes=SPK1 T 7100 2050 5 10 0 1 0 0 1 description=speaker } N 7100 2750 5100 2750 4 C 2100 6300 1 180 0 capacitor-2.sym { T 1750 6500 5 10 1 1 180 0 1 refdes=C1 T 1900 5400 5 10 0 1 180 0 1 symversion=0.1 T 2100 6300 5 10 1 1 0 0 1 value=2.2u T 2100 6300 5 10 0 1 0 0 1 description=capacitor T 2100 6300 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 2100 5000 1 180 0 capacitor-2.sym { T 1500 5100 5 10 1 1 0 0 1 refdes=C2 T 1900 4100 5 10 0 1 180 0 1 symversion=0.1 T 2100 5000 5 10 1 1 0 0 1 value=2.2u T 2100 5000 5 10 0 1 0 0 1 description=capacitor T 2100 5000 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 1500 2400 1 270 0 capacitor-2.sym { T 1400 2100 5 10 1 1 0 0 1 refdes=C4 T 2400 2200 5 10 0 1 270 0 1 symversion=0.1 T 1500 2400 5 10 1 1 0 0 1 value=10u T 1500 2400 5 10 0 1 0 0 1 description=capacitor T 1500 2400 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 6700 5200 1 270 0 capacitor-2.sym { T 6600 4900 5 10 1 1 0 0 1 refdes=C5 T 7600 5000 5 10 0 1 270 0 1 symversion=0.1 T 6700 5200 5 10 1 1 0 0 1 value=100u T 6700 5200 5 10 0 1 0 0 1 description=capacitor T 6700 5200 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 2900 5100 1 270 0 capacitor-2.sym { T 2800 4800 5 10 1 1 0 0 1 refdes=C6 T 3800 4900 5 10 0 1 270 0 1 symversion=0.1 T 2900 5100 5 10 1 1 0 0 1 value=220u T 2900 5100 5 10 0 1 0 0 1 description=capacitor T 2900 5100 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 5900 5200 1 270 0 capacitor-2.sym { T 5800 4900 5 10 1 1 0 0 1 refdes=C7 T 6800 5200 5 10 0 1 270 0 1 symversion=0.1 T 5900 5200 5 10 1 1 0 0 1 value=100u T 5900 5200 5 10 0 1 0 0 1 description=capacitor T 5900 5200 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 3900 5100 1 270 0 capacitor-2.sym { T 3800 4800 5 10 1 1 0 0 1 refdes=C8 T 4800 4900 5 10 0 1 270 0 1 symversion=0.1 T 3900 5100 5 10 1 1 0 0 1 value=220u T 3900 5100 5 10 0 1 0 0 1 description=capacitor T 3900 5100 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 7500 5200 1 270 1 capacitor-1.sym { T 7750 5950 5 10 1 1 180 6 1 refdes=C3 T 8400 5400 5 10 0 1 90 2 1 symversion=0.1 T 7500 5200 5 10 1 1 0 0 1 value=0.1u T 7500 5200 5 10 0 1 0 0 1 description=capacitor T 7500 5200 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 6700 1700 1 270 1 capacitor-1.sym { T 6600 2450 5 10 1 1 180 6 1 refdes=C9 T 7600 1900 5 10 0 1 90 2 1 symversion=0.1 T 6700 1700 5 10 1 1 0 0 1 value=0.1u T 6700 1700 5 10 0 1 0 0 1 description=capacitor T 6700 1700 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 6300 1700 1 90 0 capacitor-1.sym { T 6050 2450 5 10 1 1 180 0 1 refdes=C10 T 5400 1900 5 10 0 1 90 0 1 symversion=0.1 T 7100 1100 5 10 1 1 0 0 1 value=0.1u T 4550 1750 5 10 0 1 0 0 1 description=capacitor T 4000 2050 5 10 0 1 0 0 1 footprint=RADIAL_CAN 200 } C 700 5600 1 0 0 BNC-1.sym { T 550 6400 5 10 1 1 0 0 1 refdes=CONN1 T 700 5600 5 10 0 1 0 0 1 description=connector } C 700 5300 1 0 0 gnd-1.sym C 7900 6400 1 0 1 vcc-1.sym C 1800 3700 1 90 1 resistor-2.sym { T 1350 3450 5 10 1 1 180 6 1 refdes=R1 T 1800 3700 5 10 1 1 0 0 1 value=120k T 1800 3700 5 10 0 1 0 0 1 description=resistor T 1800 3700 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } C 4200 3850 1 0 0 resistor-2.sym { T 4400 4150 5 10 1 1 0 0 1 refdes=R2 T 4200 3850 5 10 1 1 0 0 1 value=1k T 4200 3850 5 10 0 1 0 0 1 description=resistor T 4200 3850 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } C 4200 2650 1 0 0 resistor-2.sym { T 4400 2950 5 10 1 1 0 0 1 refdes=R3 T 4200 2650 5 10 1 1 0 0 1 value=2k T 4200 2650 5 10 0 1 0 0 1 description=resistor T 4200 2650 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } C 3100 2650 1 0 0 resistor-2.sym { T 3300 2950 5 10 1 1 0 0 1 refdes=R4 T 3100 2650 5 10 1 1 0 0 1 value=12 T 3100 2650 5 10 0 1 0 0 1 description=resistor T 3100 2650 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } C 3000 2400 1 270 0 resistor-2.sym { T 2950 2150 5 10 1 1 180 0 1 refdes=R5 T 3000 2400 5 10 1 1 0 0 1 value=12 T 3000 2400 5 10 0 1 0 0 1 description=resistor T 3000 2400 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } C 7000 800 1 90 0 resistor-2.sym { T 6750 1500 5 10 1 1 180 0 1 refdes=R6 T 7000 800 5 10 1 1 0 0 1 value=1 T 7000 800 5 10 0 1 0 0 1 description=resistor T 7000 800 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } C 6200 800 1 90 0 resistor-2.sym { T 5950 1500 5 10 1 1 180 0 1 refdes=R7 T 6200 800 5 10 1 1 0 0 1 value=1 T 6200 800 5 10 0 1 0 0 1 description=resistor T 6200 800 5 10 0 1 0 0 1 footprint=AXIAL_LAY 400 } N 2800 6400 2800 6100 4 N 2800 6100 2100 6100 4 C 7800 4900 1 0 1 gnd-1.sym N 7700 6100 7700 6400 4 N 5100 3950 7100 3950 4 N 5800 5800 6900 5800 4 C 4200 6000 1 0 0 gnd-1.sym N 4600 6400 4600 5500 4 N 4600 5500 6100 5500 4 C 700 4150 1 0 0 gnd-1.sym N 4000 6400 4000 5500 4 N 2100 5500 4000 5500 4 N 6100 2750 6100 2600 4 N 6900 3950 6900 2600 4 C 6800 500 1 0 0 gnd-1.sym C 6000 500 1 0 0 gnd-1.sym N 3100 5100 3100 6400 4 N 2100 5500 2100 4800 4 N 3100 3950 4200 3950 4 N 6100 5500 6100 5200 4 N 3100 2400 3100 4200 4 N 4100 5100 4100 5200 4 N 4000 2750 4200 2750 4 N 3700 6400 3700 5200 4 C 3000 1200 1 0 0 gnd-1.sym N 4900 5800 5200 5800 4 N 5200 5800 5200 2750 4 N 800 4800 1200 4800 4 N 5800 6400 5800 5800 4 N 6900 4300 6900 3950 4 N 6100 4300 6100 2750 4 N 6900 5800 6900 5200 4 N 5200 6400 5200 6100 4 N 5200 6100 7700 6100 4 C 1900 3700 1 0 1 vcc-1.sym C 1800 1200 1 0 1 gnd-1.sym N 3400 6400 3400 5800 4 N 3400 5800 2400 5800 4 N 2400 2600 2400 5800 4 N 1700 2600 2400 2600 4 N 1700 2800 1700 2400 4 T 4750 10950 9 18 1 0 0 4 1 Richard's 20 Watt Audio Amplifier - Version 0.8.10 T 3300 10400 9 12 1 0 0 0 1 Last Update : 11/04/2006 N 3700 5200 4100 5200 4 N 4100 4200 4100 2750 4 N 800 4800 800 4450 4 gspiceui-1.0.00+dfsg/sch/audio/amp-18w-1.sch0000644000000000000000000001100011602625036016713 0ustar rootrootv 20110115 2 C 8350 2900 1 90 0 resistor-2.sym { T 8050 3550 5 10 1 1 180 0 1 refdes=R6 T 7850 3150 5 10 1 1 0 0 1 value=10 } C 4650 5000 1 270 0 resistor-2.sym { T 5000 4600 5 10 1 1 0 0 1 refdes=R2 T 4950 4300 5 10 1 1 0 0 1 value=4.7K } C 4650 1700 1 270 0 resistor-2.sym { T 5000 1300 5 10 1 1 0 0 1 refdes=R4 T 4950 1000 5 10 1 1 0 0 1 value=4.7K } C 3000 5500 1 0 0 resistor-2.sym { T 3150 5750 5 10 1 1 0 0 1 refdes=R5 T 3550 5750 5 10 1 1 0 0 1 value=82K } C 4650 2900 1 270 0 resistor-2.sym { T 4950 2550 5 10 1 1 0 0 1 refdes=R3 T 4950 2250 5 10 1 1 0 0 1 value=1K } C 8450 2900 1 90 1 capacitor-4.sym { T 8550 2600 5 10 1 1 0 6 1 refdes=C6 T 8700 2100 5 10 1 1 0 6 1 value=100n } C 5750 3300 1 0 0 npn-3.sym { T 6650 3850 5 10 1 1 0 0 1 refdes=Q1 T 6650 3600 5 10 1 1 0 0 1 value=BC548 } C 6950 700 1 0 0 npn-3.sym { T 7850 1250 5 10 1 1 0 0 1 refdes=Q3 T 7850 1000 5 10 1 1 0 0 1 value=TIP41 } C 5750 2500 1 180 1 pnp-3.sym { T 6650 2150 5 10 1 1 180 6 1 refdes=Q2 T 6650 1750 5 10 1 1 0 0 1 value=BC558 } C 6950 5100 1 180 1 pnp-3.sym { T 7850 4750 5 10 1 1 180 6 1 refdes=Q4 T 7850 4350 5 10 1 1 0 0 1 value=TIP42 } C 8150 1700 1 0 0 gnd-1.sym C 900 3100 1 90 0 voltage-1.sym { T 550 3250 5 10 1 1 180 0 1 refdes=Vin T 300 2850 5 10 1 1 0 0 1 value=DC 0V AC 0V } N 6350 4600 6950 4600 4 N 6350 4600 6350 4300 4 N 6350 1200 6950 1200 4 N 6350 1200 6350 1500 4 N 7550 700 7550 500 4 N 7550 4100 7550 1700 4 N 7550 5300 7550 5100 4 N 6350 2900 7550 2900 4 N 6350 3300 6350 2500 4 N 700 4000 700 4100 4 T 6600 6400 9 18 1 0 0 4 1 Audio Amplifier - 18Watt C 10600 4200 1 0 0 spice-model-1.sym { T 10700 4800 5 10 1 1 0 0 1 refdes=A2 T 11900 4500 5 10 1 1 0 0 1 model-name=BC548 T 11100 4300 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 10600 3200 1 0 0 spice-model-1.sym { T 10700 3800 5 10 1 1 0 0 1 refdes=A3 T 11900 3500 5 10 1 1 0 0 1 model-name=BC558 T 11100 3300 5 10 1 1 0 0 1 file=../../lib/bjt/bc558.mod } C 10600 2200 1 0 0 spice-model-1.sym { T 10700 2800 5 10 1 1 0 0 1 refdes=A4 T 11900 2500 5 10 1 1 0 0 1 model-name=TIP41 T 11100 2300 5 10 1 1 0 0 1 file=../../lib/bjt/tip41.mod } C 10600 1200 1 0 0 spice-model-1.sym { T 10700 1800 5 10 1 1 0 0 1 refdes=A5 T 11900 1500 5 10 1 1 0 0 1 model-name=TIP42 T 11100 1300 5 10 1 1 0 0 1 file=../../lib/bjt/tip42.mod } C 9650 3500 1 270 0 resistor-2.sym { T 9200 2850 5 10 1 1 0 0 1 refdes=Rout T 9550 3250 5 10 1 1 180 0 1 value=4 } N 7550 3800 8650 3800 4 C 9650 2300 1 0 0 gnd-1.sym C 9950 5600 1 90 1 vdc-1.sym { T 9500 4600 5 10 1 1 0 6 1 refdes=Vcc T 9650 4800 5 10 1 1 0 6 1 value=DC 15V } C 9950 800 1 90 1 vdc-1.sym { T 9500 1050 5 10 1 1 0 6 1 refdes=Vee T 9750 850 5 10 1 1 0 6 1 value=DC -15V } N 3400 5300 8750 5300 4 N 3400 500 8750 500 4 C 10250 5200 1 90 0 gnd-1.sym C 10250 400 1 90 0 gnd-1.sym C 5850 2500 1 90 0 capacitor-4.sym { T 6150 3000 5 10 1 1 180 0 1 refdes=C5 T 5750 2600 5 10 1 1 0 0 1 value=100u } C 4550 3800 1 270 0 diode-1.sym { T 5050 3300 5 10 1 1 0 0 1 refdes=D1 T 4850 3000 5 10 1 1 0 0 1 value=1N914 } C 2600 2400 1 90 0 resistor-2.sym { T 2900 3000 5 10 1 1 180 0 1 refdes=R1 T 2700 2600 5 10 1 1 0 0 1 value=1K } C 8650 3700 1 0 0 resistor-2.sym { T 8950 4000 5 10 1 1 0 0 1 refdes=R7 T 8950 3500 5 10 1 1 0 0 1 value=22 } N 4750 5300 4750 5000 4 N 4750 4100 4750 3800 4 N 4750 2000 4750 1700 4 N 4750 800 4750 500 4 N 4100 3800 5750 3800 4 N 5750 2000 4750 2000 4 N 5650 3800 5650 3400 4 N 9550 3800 9750 3800 4 N 9750 3800 9750 3500 4 N 3400 4300 3400 5300 4 N 3400 3300 3400 500 4 N 8650 3800 8650 5600 4 N 8650 5600 3900 5600 4 N 3000 5600 2500 5600 4 C 900 3900 1 0 0 capacitor-4.sym { T 1000 4200 5 10 1 1 0 0 1 refdes=C1 T 1500 4200 5 10 1 1 0 0 1 value=470n } N 2700 3500 2500 3500 4 N 2500 3300 2500 5600 4 C 2300 2400 1 270 0 capacitor-4.sym { T 2200 2100 5 10 1 1 0 0 1 refdes=C2 T 2050 1650 5 10 1 1 0 0 1 value=100u } C 2400 1200 1 0 0 gnd-1.sym C 1800 4100 1 270 0 resistor-2.sym { T 1500 3600 5 10 1 1 0 0 1 refdes=R9 T 1400 3400 5 10 1 1 0 0 1 value=22K } C 1800 2800 1 0 0 gnd-1.sym N 1800 4100 2700 4100 4 N 700 3100 1900 3100 4 N 5650 2500 5650 2000 4 C 10600 5200 1 0 0 spice-model-1.sym { T 10700 5800 5 10 1 1 0 0 1 refdes=A1 T 11900 5500 5 10 1 1 0 0 1 model-name=LM358 T 11100 5300 5 10 1 1 0 0 1 file=../../lib/opamp/lm358.mod } C 10600 200 1 0 0 spice-model-1.sym { T 10700 800 5 10 1 1 0 0 1 refdes=A6 T 11900 500 5 10 1 1 0 0 1 model-name=1N914 T 11100 300 5 10 1 1 0 0 1 file=../../lib/diode/1n914.mod } N 1900 3200 1900 3100 4 N 900 4100 700 4100 4 C 2700 3200 1 0 0 spice-opamp-2.sym { T 3700 4125 5 10 1 1 0 0 1 refdes=U1 T 3600 3400 5 10 1 1 0 0 1 value=LM358 } gspiceui-1.0.00+dfsg/sch/sundry/0000755000000000000000000000000011752030331015111 5ustar rootrootgspiceui-1.0.00+dfsg/sch/sundry/level-shifter-1.sch0000644000000000000000000000377111602724577020547 0ustar rootrootv 20110115 2 C 5900 87800 1 0 0 gnd-1.sym T 300 90250 9 12 1 0 0 0 1 OP AMP DC Level Shifter T 1550 90000 9 10 1 0 0 4 1 Last Updated on 16/05/2011 C 200 85900 1 0 0 spice-model-1.sym { T 300 86600 5 10 0 1 0 0 1 device=model T 300 86500 5 10 1 1 0 0 1 refdes=A1 T 1500 86200 5 10 1 1 0 0 1 model-name=LM358 T 700 86000 5 10 1 1 0 0 1 file=../../lib/opamp/lm358.mod } C 1000 87100 1 0 0 gnd-1.sym C 1400 87600 1 0 1 vdc-1.sym { T 600 88250 5 10 1 1 0 6 1 refdes=Vcc T 700 88450 5 10 0 0 0 6 1 device=VOLTAGE_SOURCE T 700 88650 5 10 0 0 0 6 1 footprint=none T 700 87950 5 10 1 1 0 6 1 value=DC 5V } C 900 89000 1 0 0 vcc-1.sym C 5800 89100 1 0 0 vcc-1.sym C 4300 88300 1 90 1 resistor-2.sym { T 3950 87900 5 10 0 0 270 2 1 device=RESISTOR T 4400 88000 5 10 1 1 180 6 1 refdes=R4 T 4600 87600 5 10 1 1 0 6 1 value=1K } N 3700 88900 5300 88900 4 N 2800 88300 3700 88300 4 N 4200 89000 4200 88300 4 N 6700 88600 6700 87500 4 { T 6800 88300 5 10 1 1 0 0 1 netname=Vout } N 5300 87500 6700 87500 4 C 4000 89900 1 0 0 vcc-1.sym C 2700 87100 1 0 0 gnd-1.sym C 4100 87100 1 0 0 gnd-1.sym N 5300 87500 5300 88300 4 C 4100 89900 1 270 0 resistor-2.sym { T 4450 89500 5 10 0 0 270 0 1 device=RESISTOR T 4400 89500 5 10 1 1 0 0 1 refdes=R2 T 4700 89400 5 10 1 1 180 0 1 value=10K } C 4300 88200 1 0 0 resistor-2.sym { T 4700 88550 5 10 0 0 0 0 1 device=RESISTOR T 4400 88500 5 10 1 1 0 0 1 refdes=R3 T 4700 88500 5 10 1 1 0 0 1 value=100K } N 4200 88300 4300 88300 4 N 5300 88300 5200 88300 4 C 3600 87400 1 270 1 resistor-2.sym { T 3950 87800 5 10 0 0 90 2 1 device=RESISTOR T 3500 87900 5 10 1 1 0 6 1 refdes=R1 T 3100 87800 5 10 1 1 180 6 1 value=100K } C 3600 87100 1 0 0 gnd-1.sym N 3700 88300 3700 88900 4 N 1100 89000 1100 88800 4 N 1100 87600 1100 87400 4 C 2600 88300 1 270 0 voltage-3.sym { T 3300 88100 5 8 0 0 270 0 1 device=VOLTAGE_SOURCE T 2200 87700 5 10 1 1 0 0 1 refdes=Vin T 2000 87400 5 10 1 1 0 0 1 value=DC 0.5V } C 5300 88000 1 0 0 spice-opamp-2.sym { T 6300 88925 5 10 1 1 0 0 1 refdes=U1 T 6300 88300 5 10 1 1 0 0 1 value=LM358 } gspiceui-1.0.00+dfsg/sch/sundry/superconductor-jn.sch0000644000000000000000000000136211412210442021272 0ustar rootrootv 20091004 2 C 40000 40000 0 0 0 title-B.sym C 44800 48350 1 0 0 jj-1.sym { T 44900 48850 5 10 0 0 0 0 1 device=JOSEPHSON_JUNCTION T 45300 48900 5 10 1 1 0 0 1 refdes=B1 T 45200 48750 5 10 0 1 0 0 1 model-name=? T 45300 48650 5 10 1 0 0 0 1 area=30u } C 43500 49150 1 0 0 resistor-2.sym { T 43900 49500 5 10 0 0 0 0 1 device=RESISTOR T 43850 49400 5 10 1 1 0 0 1 refdes=R1 T 43800 48950 5 10 1 1 0 0 1 value=100 } C 43200 48350 1 90 0 voltage-2.sym { T 42650 48450 5 10 0 0 90 0 1 device=VOLTAGE_SOURCE T 42700 48850 5 10 1 1 180 0 1 refdes=V1 T 42400 48400 5 10 1 1 0 0 1 value=DC 1V } C 43800 48050 1 0 0 gnd-1.sym T 42600 49900 9 14 1 0 0 0 1 Superconductor Junction N 43000 49250 43500 49250 4 N 44400 49250 45000 49250 4 N 43000 48350 45000 48350 4 gspiceui-1.0.00+dfsg/sch/sundry/timer-lm555.sch0000644000000000000000000000663611557361737017634 0ustar rootrootv 20110115 2 C 40000 40000 0 0 0 title-B.sym C 48600 46300 1 90 1 capacitor-1.sym { T 47900 46100 5 10 0 0 270 2 1 device=CAPACITOR T 48900 45800 5 10 1 1 0 6 1 refdes=C2 T 47700 46100 5 10 0 0 270 2 1 symversion=0.1 T 48500 45700 5 10 1 1 180 6 1 value=10nF } C 49300 46700 1 90 1 capacitor-1.sym { T 48600 46500 5 10 0 0 270 2 1 device=CAPACITOR T 49600 46200 5 10 1 1 0 6 1 refdes=C3 T 48400 46500 5 10 0 0 270 2 1 symversion=0.1 T 49200 46100 5 10 1 1 180 6 1 value=10nF } C 43400 48600 1 270 0 capacitor-2.sym { T 44100 48400 5 10 0 0 270 0 1 device=POLARIZED_CAPACITOR T 44000 48200 5 10 1 1 0 0 1 refdes=C1 T 44300 48400 5 10 0 0 270 0 1 symversion=0.1 T 43900 47900 5 10 1 1 0 0 1 value=10uF } C 49200 47600 1 90 1 resistor-1.sym { T 48800 47300 5 10 0 0 270 2 1 device=RESISTOR T 48900 47200 5 10 1 1 0 6 1 refdes=RB T 48500 47100 5 10 1 1 180 6 1 value=4.7K } C 49200 48500 1 90 1 resistor-1.sym { T 48800 48200 5 10 0 0 270 2 1 device=RESISTOR T 48900 48100 5 10 1 1 0 6 1 refdes=RA T 48500 48000 5 10 1 1 180 6 1 value=4.7K } C 43000 46900 1 0 0 gnd-1.sym N 42600 49200 43600 49200 4 N 42600 49200 42600 48700 4 N 43600 48600 43600 49200 4 N 42600 47500 42600 47200 4 N 42600 47200 43600 47200 4 N 43600 47200 43600 47700 4 N 48300 47600 49100 47600 4 N 47300 48000 47300 48500 4 N 46500 48000 46500 48500 4 N 46500 48500 49100 48500 4 N 45700 46700 45500 46700 4 N 45500 49200 45500 46700 4 N 48000 46700 49600 46700 4 N 49600 49200 45500 49200 4 { T 47300 49300 5 10 1 1 0 0 1 netname=Trigger } N 48400 46300 48000 46300 4 N 45700 44900 45700 45600 4 C 47900 45100 1 270 0 resistor-1.sym { T 48300 44800 5 10 0 0 270 0 1 device=RESISTOR T 48600 44900 5 10 1 1 180 0 1 refdes=Rout T 48500 44600 5 10 1 1 180 0 1 value=10k } C 49000 45100 1 0 0 gnd-1.sym C 47900 43900 1 0 0 gnd-1.sym T 50000 40700 9 10 1 0 0 0 1 LM555 Astable Square Waveform Generator T 49900 40400 9 10 1 0 0 0 1 timer-lm555.sch T 50000 40100 9 10 1 0 0 0 1 1 T 51600 40100 9 10 1 0 0 0 1 1 T 53900 40400 9 10 1 0 0 0 1 Version 1.04 (02-05-2011) T 53900 40100 9 10 1 0 0 0 1 Jason Uher & Mike Waters C 42900 47500 1 0 1 vdc-1.sym { T 42100 48150 5 10 1 1 0 6 1 refdes=V1 T 42200 48350 5 10 0 0 0 6 1 device=VOLTAGE_SOURCE T 42200 48550 5 10 0 0 0 6 1 footprint=none T 42200 47850 5 10 1 1 0 6 1 value=DC 5V } C 42900 49200 1 0 0 vcc-1.sym C 47700 48500 1 0 0 vcc-1.sym N 49600 49200 49600 46700 4 N 48300 47600 48300 47100 4 N 48300 47100 48000 47100 4 C 45600 44600 1 0 0 gnd-1.sym C 45700 45200 1 0 0 lm555-1.sym { T 48000 47600 5 10 0 0 0 0 1 device=LM555 T 47500 45200 5 10 1 1 0 0 1 refdes=X1 T 45700 45200 5 10 0 0 0 0 1 file=../../lib/linear/lm555.mod T 45700 45200 5 10 0 0 0 0 1 value=LM555 } N 48000 45600 48000 45100 4 N 48400 45400 49100 45400 4 N 49100 45800 49100 45400 4 T 41100 45200 9 10 1 0 0 0 6 This example can be a bit tricky to simulate. The following combination has worked : GNU-Cap, Transient analysis. Start Time = 0, End Time = 300usec, Step Inc. = 1 usec. No Signal Source. Cold or Warm IC's. T 41100 43900 9 10 1 0 0 0 1 GNU-Cap Osc. Freq. = 9.9 KHz KHz T 41100 44200 9 10 1 0 0 0 2 Calculated Osc. Freq. = 1.44 / ((RA + 2 * RB) * C3) = 10.2 KHz T 41100 44700 9 10 1 0 0 0 1 Data sheet Osc. Freq. = 11 KHz T 41100 43000 9 10 1 0 0 0 3 Note : This SPICE model of the LM555 seems to work better at lower frequencies. As the frequency increases >50KHz oscillator frfequencies are significantly under estimated. gspiceui-1.0.00+dfsg/sch/sundry/level-shifter-2.sch0000644000000000000000000000375411602724707020544 0ustar rootrootv 20110115 2 C 7000 85300 1 0 0 gnd-1.sym T 6500 83300 9 12 1 0 0 0 1 Transistor DC Level Shifter T 9750 82850 9 10 1 0 0 4 1 Last Updated on 10/05/2011 C 1150 84700 1 0 0 spice-model-1.sym { T 1250 85400 5 10 0 1 0 0 1 device=model T 1250 85300 5 10 1 1 0 0 1 refdes=A1 T 2450 85000 5 10 1 1 0 0 1 model-name=BC548 T 1650 84800 5 10 1 1 0 0 1 file=../../lib/bjt/bc548.mod } C 3350 86500 1 0 0 gnd-1.sym C 3750 87000 1 0 1 vdc-1.sym { T 2650 87650 5 10 1 1 0 0 1 refdes=Vcc T 3050 87850 5 10 0 0 0 6 1 device=VOLTAGE_SOURCE T 3050 88050 5 10 0 0 0 6 1 footprint=none T 2550 87350 5 10 1 1 0 0 1 value=DC 5V } C 3250 88400 1 0 0 vcc-1.sym C 6900 88400 1 0 0 vcc-1.sym C 7200 86500 1 90 0 resistor-2.sym { T 6850 86900 5 10 0 0 90 0 1 device=RESISTOR T 7300 87000 5 10 1 1 0 0 1 refdes=R3 T 7300 86800 5 10 1 1 0 0 1 value=1.2K } C 5100 88400 1 0 0 vcc-1.sym C 6300 87800 1 0 1 resistor-2.sym { T 5900 88150 5 10 0 0 180 2 1 device=RESISTOR T 5500 88100 5 10 1 1 0 0 1 refdes=R1 T 5900 88100 5 10 1 1 0 0 1 value=220K } N 3450 88400 3450 88200 4 N 3450 87000 3450 86800 4 C 6500 87400 1 0 0 npn-3.sym { T 7400 87900 5 10 0 0 0 0 1 device=NPN_TRANSISTOR T 7400 87900 5 10 1 1 0 0 1 refdes=Q1 T 7400 87700 5 10 1 1 0 0 1 value=BC548 } C 7000 86500 1 270 0 resistor-2.sym { T 7350 86100 5 10 0 0 270 0 1 device=RESISTOR T 7300 86100 5 10 1 1 0 0 1 refdes=R4 T 7300 85900 5 10 1 1 0 0 1 value=3.9K } C 6200 86500 1 270 0 voltage-3.sym { T 6900 86300 5 8 0 0 270 0 1 device=VOLTAGE_SOURCE T 5700 86000 5 10 1 1 0 0 1 refdes=Vin T 5500 85800 5 10 1 1 0 0 1 value=DC 0.5V } C 6300 85300 1 0 0 gnd-1.sym C 6500 87600 1 90 1 resistor-2.sym { T 6150 87200 5 10 0 0 270 2 1 device=RESISTOR T 6200 87200 5 10 1 1 0 6 1 refdes=R2 T 6200 87000 5 10 1 1 0 6 1 value=4.7K } N 6400 87900 6400 87600 4 N 6300 87900 6500 87900 4 N 5300 88400 5300 87900 4 N 5300 87900 5400 87900 4 N 7700 86500 7100 86500 4 { T 7800 86400 5 10 1 1 0 0 1 netname=Vout } N 6400 86700 6400 86500 4 C 100 82400 1 0 0 title-A4.sym T 8600 82500 9 10 1 0 0 0 1 Mike Waters gspiceui-1.0.00+dfsg/mac/0000755000000000000000000000000011752030331013550 5ustar rootrootgspiceui-1.0.00+dfsg/mac/GSpiceUI.icns0000644000000000000000000011471611412210436016047 0ustar rootrooticns™Îics#His32ÀÁÀÈdžÁÃ˲„†…ŒÄ‚È ÃÁï…S{ Xq€ƒ‚€¯Ãµ›ci†ˆQ‡¤Q”š•µÂÁÂǺ€›¢¾ˆFv­ÈÂÁ ÂÅÆÅŽ’™°Ã‚Á ÿ»ÄºwGh£ÄÁ ¾]J´ÃÅ I‚‚Á Éws“GÃëXŽÆÂ€ÁAÄ©SÀÉZŒÆÃ†¹³¼ÃÁÁÈ`—ÆÄ¢GÂÁ¿§I^¸ÂĤO½ÂÁÆ[‘ǼF­›ªÃë±ÄÁÁÄ£JÍ{gÈÅÃÁÁÃÃÁÅrDPµÃ‡ÁÂÀƒªÅ‰ÁÂÈÄ‚ÁFCGM€LD‚C FEÿÿô·º¹Á„ÿ4EFð°n¤ÐÕu–®®­­ªðFEøÍ„Œ²µk´ÚjÄÌÆøECÿÿôÎÎÍ×üµ]œæÿÿCCÿø—ÿ#ûÂʾéÿÿCCÿ÷†ÿ÷ÿÿö^‰ØÿÿCCÿøŠpíÿÿÕ`­€ÿ CCÿÿ3¢Çjÿÿãu¼€ÿCCÿågÿÿ‡Åÿÿ²öìøÿCCÿˆZÿÿæt€ÿ(Þ|þDFíK@‹ˆŠMއ–XwZÈJFìÝ‚øóöØnÿ¦•ü÷ÿCCÿúÿ©g{ø€ÿCEÿÿå‚ÿ¶êÿEFDHCDLG€CF€ÁÀÈdžÁÃ˲„†…ŒÄ‚È ÃÁï…S{ Xq€ƒ‚€¯Ãµ›ci†ˆQ‡¤Q”š•µÂÁÂǸ€›¢¾ˆFv­È€Á »rÈÄÅŽ’™°ÃÁ ºcÅÂÀºwGh£ÄÁ ºeëïÃÀÅ I‚‚Á ·‡àÑïÀëXŽÄÁK¿ÊÝÃ¾ëØ¾Ã‡´ÆÂÀÁÁ¾ä{ÉÄÔõÃÇ¾ÉøîÄÀ¿ÑÌ5hf`¿©]vãrt®ÃÀɽ_»¸µÊí²Öäµµ½ÁÁÀ¹bÆÁÁ¿äñðÈÀ‚Á ¿¦ÂÁÁÀÁÖÉ¿„ÁÄ‚Á¿À‚Ás8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿICN#ÿÿÿÿøÿÿ?€?€ÿÿÿÿøÿÿ?€?€il32¬äÀ†”À„ÀÀ‚„À‹‡À„À‚ÀŽÀ†‚ÀœÀ™À„ÖÀ„™ÀÀ‡ÀÀXX„À‚ŒÀÀÀ—ÀÀXƒÀ€ŒÀXÀX”ÀXƒÀXƒÀŒÀ„ÀX‡À†ÀX…ÀX…ÀXX…ÀX…ÀX„ÀXÀÀXƒÀX‡ÀX‚ÀXˆÀˆÀX‚ÀX•ÀX€ÀX–ÀX€ÀX—ÀXXX™À€èÀž›ÿ›ÿƒÿ†Œÿƒÿ„ÿŒÿÿÿ‚„ÿ‹ÿÿƒÿ„ÿ‚ÿ†ÿƒÿ†‚ÿ†ÿ‘ÿ†ÿŽÿ„ƒÿ‚ÿ•ÿ‚ÿ•ÿ‚ÿˆÿ„ƒÿ‚ÿ‹ÿ†ÿ‚ÿÿÿ‡ÿ†ÿ‚ÿÿ¨¨„ÿ‚„ÿ‚ÿ€ÿÿÿ‚ÿÿ¨ƒÿ€…ÿ‚ÿ¨ÿ¨Žÿÿ¨ƒÿ¨ƒÿ†ÿÿƒÿ¨‡ÿÿ€ÿ¨„ÿ¨…ÿ¨¨€ÿ€ÿ¨„ÿ¨„ÿ ¨ÿÿ¨ÿÿÿÿ¨‰¨‚¨ƒ ÿÿÿÿÿÿ…ÿ¨‚ÿ¨„ÿ‚ÿ†ÿ¨€ÿ¨…ÿ‚ÿ†ÿ¨€ÿ¨…ÿ‚ÿ‡ÿ¨¨¨†ÿ‚ÿˆÿ€‡ÿ›ÿ›ÿžäÀ†”À„ÀÀ‚„À‹‡À„À‚ÀŽÀ†‚ÀœÀ™À„ŠÀœÀœÀˆÀ„ŠÀ‹ÀÀÀÀÿÿ‡ÀÀÀÿ„À‚‹ÀÿÿÀÀÿÿ–ÀÿÀÿÿƒÀ€ŒÀÿÿÀÿÿ”ÀÿÿƒÀÿÿƒÀŒÀÿƒÀÿÿ‡Àÿÿ†Àÿÿ„Àÿÿ…Àÿ…Àÿÿ„Àÿÿ„ÀÿÿÀÀÿÿƒÀÿÿ‡ÿÿ‚ÿÿ‚ƒÀÿÀÀ…Àÿÿ‚Àÿÿ‹À†Àÿÿ€ÀÿÿŒÀ†Àÿÿ€ÀÿÿŒÀ‡À‚ÿÀˆÀ€ÿèÀl8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿich#H€€ih32 ™ÿÀÅÀ‰`fºžÀ`‡  ´žÀ` ©†´Z ´˜À‚`0 ´†À`Z`…Àf‚  ´†À`„ ‡ f…Àº‚´Z ´†À` ©ƒ´Z ©†´º‹À`Z†`0 ´ƒÀ` ´•Àf‰ ´ƒÀ` ´•Àº‰´µ¿ƒÀ` ´¥Àºf€`0Z€`¡À´† f¡À¿µ†´ºÑÀ¿µ†´º¡À´† f¡Àºf€`0Z€`”Àº´´º‹À` ´˜Àf f‹À` ´–ÀºfF,,Ffº†À``0Z`fº’À º© /__0 ©º…Àfƒ ´’À f \¹¹] f…Àºƒ´µ¿’À `ZÀÀZF¼„Àºf€`’À¿µ\´À´,Z¹„À´€ f’À´/Z¹À¹Z,´„À¿µ€´º‘À¦„F¼À¼F„¦…Àfº’À‰Nf…Àb NŠ…Àf´€Àº´´º‹Àb©º…À‰N c…Àºµ¿€Àf f‰À¼F ´†À¦„F¼‡ÀºfF,,Ffº‡À¹Z,´‡À´,Z¹†À º©2__2©º†À´,Z¹‡À¹Z,´†À fN†¹¹†Nf…À¦„F¼‡À¼F„¦ƒÀ ¼F„¦ÀÀ¦Šb…À‰Nf‹Àb NŠƒÀ¹Z,´ŒÀb©º‹À‰N cƒÀ´,Z¹ŒÀfºŒÀ¦„F¼€À¦„F¼ŸÀ´,Z¹€À‰N c¡À¹Z,´€Àb NŠ¡À ¼\0\vŠbF2†¦£ÀZ)N/f¹¤À¼® \º¿¥Àºf€`ÿÀËÀ®?©@©ÿ€©ÿ€…ÿÀ‰€‡ø’ÿ€…ÿ€‡ð’ÿ€…ÿ€á†ðxð’ÿ€ÿÿÀ‚€@ð†ÿ€x€ ¿ÿÿ€ÿÿ‡‚ð†ÿ€„‡ ‡ÿÿ€ÿÿø‚ðxð†ÿ€áƒðxá†ð÷ÿÿ€…ÿ€x†€@ðƒÿ€ð‰ÿ€…ÿ‡‰ðƒÿ€ð‰ÿ€…ÿøŠð„ÿ€ð‰ÿ€•ÿø‡€€@x€€¿…ÿ€„ÿð÷Œÿð†‡…ÿ€ƒÿð‡ÿ‡ð÷…ÿ€ƒÿð ÿ€ƒÿðÿ‡ð÷…ÿ€ƒÿðŒÿð†‡…ÿ€ƒÿðŒÿ÷‡€@x€¿…ÿ€ƒÿðÿÿøðð÷‹ÿ€ð‰ÿ€ƒÿðÿÿ‡‡‹ÿ€ð‰ÿ€ƒÿ ðø‡jTTj‡ø†ÿÀ€€@x€‡ø†ÿ€ƒÿ ðxáV­­Wá÷…ÿ‡ƒð†ÿ€ƒÿ ð}úú}‡…ÿø„ð‡ÿ€ƒÿ ðx¿ÿÿ¿xjÖý„ÿø‡€€¿ˆÿ€ƒÿððÿðT¤ù„ÿð€‡ˆÿ€ƒÿðO¤ùÿù¤Tð…ÿð÷ˆÿ€‚ÿêÇ iÕýÿýÕj Çé…ÿÀ‡ø‰ÿ€‚ÿÏ• …ÿ…•Î…ÿ‡ð€ÿøðð÷‚ÿ€‚ÿ… …ÿÏ•„…ÿøðÿ‡‡‚ÿ€€ÿýÖj…ÿéÆ jÖý‡ÿø‡jTTj‡ø€ÿ€€ÿù¤T †ÿðT¤ù†ÿøá[­­\á÷ÿÿ€€ÿðT• †ÿù¤Tð†ÿ‡•ÌúúÌ•‡ÿÿ€ÿÿêÇ *O@†€}W* Ǫƒ€…ÏjOj€€jOÿÿ€ÿÿÏ•ˆ •Vƒ•T „‡ÿÿ€ÿÿ…áðáxˆðÇ•}ƒðáT¤êƒð÷ÿÿ€ÿÿ¿‡÷ÿðˆÿéÆ jÖý€ÿêÇ iÕý†ÿ€ƒÿð‰ÿðT¤ù€ÿÏ•„ˆÿ€ƒÿð‰ÿù¤Tð€ÿ…•Έÿ€ƒÿð‰ÿ ýÕ”W}ªÏ…j\Ëéˆÿ€ƒÿð‹ÿÖ£ O• V²ú‰ÿ€ƒÿð‹ÿýë }úŠÿ€ƒÿ÷‡¿Œÿ÷‡€¿‹ÿ€©ÿ€©ÿ€@©€@®ÿÀÅÀ‰`fºžÀ`‡  ´žÀ` ©†´Z ´˜À‚`0 ´†À`Z`…Àf‚  ´†À`„ ‡ f…Àº‚´Z ´†À` ©ƒ´Z ©†´º‹À`Z†`0 ´ƒÀ` ´•Àf‰ ´ƒÀ` ´•Àº‰´µ¿ƒÀ` ´¥Àºf€`0Z€`À¿µºŒÀ´† fÀ´fŒÀ¿µ†´ºÀ´ `ªÀ´ `ŒÀ¿µ†´ºÀ´ `ŒÀ´† fÀ´ `ŒÀºf€`0Z€`À´ `ÀÀÁÃËÀ` ´“À´ `ÀÀÞüüÞ‹À` ´“À ´ `ÁÞïÿÿïÞÁ†À``0Z`fºÀ ´ aÆüþüüýüÆÂ…Àfƒ ´À ´ ~üÿáÃÃáÿüÞ…Àºƒ´µ¿À ´ þáÐÀÀÐáþïÞÁ„Àºf€`’À´‡üÃÀÃüÿüÄÀ´€ f’ÀÃí÷üÃÀÃüÿüÄÀ¿µ€´º‘ÀÏáýðÞÂÀÂÞïýáÐ…Àfº’ÀßÿðØ…Àßÿÿà…Àf´€ÀÁÃËÀßðh…Àßÿÿà…Àºµ¿€ÀÞüüÞ‰ÀÁÞïð`…ÀÐáþïÞÁ‡ÀÁÞïÿÿïÞÁ‡ÀÃüÿð`†ÀÃüÿüÆÀ ÁÆüþüüýüÆÂ†ÀÃüÿð`†ÀÃüÿüÆÀ ÞüÿáÃÃáÿüÞ…ÀÏáýÀx0†`b~¿ýá ƒ` gØïø‡p``p€€ …Àßÿü„ ˆ …ÿÿ†ƒ ðÿðƒ f…ÀßüƼ© Zˆ´ÙÿÿÚƒ´¸ûÿû¸ƒ´º…ÀÐÞÂÀ´ `ˆÀÐáþïÞÁ€ÀÏáýðÞÂÀ´ `‰ÀÃüÿüÀÀßÿÿà’À´ `‰ÀÃüÿüÀÀßÿÿà’À´ `‰ÀÂÞïýá€ßïþáÐ’À´ `‹ÀÞüÿþùÓÀ´ `‹ÀÁÆü€ÿáÔÀºfŒÀÂÞ€àÐÿÀËÀh8mk ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿit327ÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀƒÀ¿½·µ´µ·½¿ÕÀ½´œ““œ´½ÕÀ·œT909Tœ·ÕÀ´“9 9“´ÕÀ´0  —   0´ÕÀ´0  $-•0-$  0´ÕÀ´0 $l‡•‡l$ 0´ÕÀ´0 -‡©•´©‡- 0´ÅÀ¿½·µ‰´©‡- 0´•À´0 -‡©­´µ·½¿‘À½´œ“‰‡l$ 0´•À´0 $l‡­“œ´½‘À·œT9‰0-$  0´•À´0  $-­09Tœ·‘À´“9Š   0´•À´0  ® 9“´‘À´“9Š   0´•À´0    – 9“´‘À·œT9‰0-$  0´•À´0  $-0-$  $-•09Tœ·‘À½´œ“‰‡l$ 0´•À´0 $l‡‡l$ $l‡•“œ´½‘À¿½·µ‰´©‡- 0´•À´0 -‡©´©‡- -‡©•´µ·½¿¡À´0 -‡©•´©‡- 0´À´0 0´½À´0 $l‡•‡l$ 0´À´0 0´½À´0  $-•0-$  0´À´0 0´½À´0  —   0´À´0 0´½À´“9 9“´À´0 0´½À·œT909Tœ·À´0 0´½À½´œ““œ´½À´0 0´½À¿½·µ´µ·½¿À´0 0´éÀ¿½·µ…´©‡- -‡©…´µ·½¿ÝÀ½´œ“…‡l$ $l‡…“œ´½ÝÀ·œT9…0-$  $-…09Tœ·ÝÀ´“9†   † 9“´ÝÀ´“9• 9“´ÝÀ·œT9•09Tœ·ÝÀ½´œ“•“œ´½ÝÀ¿½·µ•´µ·½¿ÿÀÿÀÿÀÿÀÕÀ¿½·µ•´µ·½¿ÝÀ½´œ“•“œ´½ÝÀ·œT9•09Tœ·ÝÀ´“9• 9“´ÝÀ´“9†   † 9“´ÝÀ·œT9…0-$  $-…09Tœ·ÝÀ½´œ“…‡l$ $l‡…“œ´½ÝÀ¿½·µ…´©‡- -‡©…´µ·½¿¹À¿½·µ´µ·½¿¡À´0 0´ÅÀ½´œ““œ´½¡À´0 0´ÅÀ·œT909Tœ·¡À´0 0´ÅÀ´“9 9“´¡À´0 0´ÁÀ¿½·µ©ˆ11ˆ©µ·½¿•À¿½·µ´©‡- -‡©´µ·½¿¹À½´œ“ˆq55qˆ“œ´½•À½´œ“‡l$ $l‡“œ´½¹À·œT914>ABA>419Tœ·•À·œT90-$  $-09Tœ·¹À´“9BNSNB9“´•À´“9‚   ‚ 9“´µÀ ¿½·µ©‡- HZ_ ZH -‡©µ·½¿‘À´“9 9“´µÀ ½´œ“‡l$ Vkr kV $l‡“œ´½‘À·œT909Tœ·µÀ ·œT9-$  )}œ¦ œ})  $-9Tœ·‘À½´œ““œ´½µÀ ´“9  .‹®¹ ®‹.  9“´‘À¿½·µ´µ·½¿µÀ ´0  9“´À´“9  .‹®º»¾¿‘À¿½·µ…´µ·½¿¹À ´0  $-9Tœ·À·œT9-$  )}œ¨­¹¾‘À½´œ“…“œ´½¹À ´0 $l‡“œ´½À½´œ“‡l$ Vkw†¬»‘À·œT9…09Tœ·¹À ´0 -‡©µ·½¿À¿½·µ©‡- HZfx§¹‘À´“9… 9“´µÀ ¿½·µ©ˆ14‘´‰À ´‘4 @NZo¤¹‘À´“9… 9“´µÀ ½´œ“ˆq5!A•µ‰À µ•A!!7?Jb ¸‘À·œT9…09Tœ·µÀ ·œT914>AJb ¸‰À ¸ bJ?7!!A•µ‘À½´œ“…“œ´½µÀ ´“9BNZo¤¹‰À ¹¤oZN@ 4‘´‘À¿½·µ…´µ·½¿±À¿¾»º®‹. HZfx§¹‰À¹§xfZH .‹®º»¾¿‘À¿½·µµ·½¿µÀ¾¹­¨œ}) Vkw†¬»‰À»¬†wkV )}œ¨­¹¾‘À½´œ““œ´½µÀ»¬†wkV )}œ¨­¹¾‰À¾¹­¨œ}) Vkw†¬»‘À·œT99Tœ·µÀ¹§xfZH .‹®º»¾¿‰À¿¾»º®‹. HZfx§¹‘À´“99“´µÀ ¹¤oZNB9“´‘À ´‘4 @NZo¤¹‘À´“99“´…À¿½·µ´µ·½¿¡À ¸ bJA>419Tœ·‘À µ•A!!7?Jb ¸‘À·œT99Tœ·…À½´œ““œ´½¡À µ•A!5qˆ“œ´½‘À ¸ bJ?7!!A•µ‘À½´œ““œ´½…À·œT909Tœ·¡À ´‘41ˆ©µ·½¿‘À ¹¤oZN@ 4‘´‘À¿½·µµ·½¿…À´“9 9“´À ¿¾»º®‹. 0´•À¹§xfZH .‹®º»¾¿™À¿½·µ©ˆ11ˆ©µ·½¿™À ¾¹­¨œ}) 0´•À»¬†wkV )}œ¨­¹¾™À½´œ“ˆq55qˆ“œ´½™À »¬†wkV 0´•À¾¹­¨œ}) Vkw†¬»™À·œT914>ABA>419Tœ·™À ¹§xfZH 0´•À¿¾»º®‹. HZfx§¹™À´“9BNSNB9“´™À ¹¤oZN@ 4‘´™À ´‘4 @NZo¤¹•À ¿½·µ©ˆ1 IZ_ ZI 1ˆ©µ·½¿•À ¸ bJ?7!!A•µ™À µ•A!!7?Jb ¸•À ½´œ“ˆq5-[lr l[-5qˆ“œ´½•À µ•A!!7?Jb ¸™À ¸ bJ?7!!A•µ•À ·œT914>AH[ ¦  [HA>419Tœ·•À ´‘4 @NZo¤¹™À ¹¤oZN@ 4‘´•À ´“9BNYmŸ³¹ ³ŸmYNB9“´‘À¿¾»º®‹. HZfx§¹™À¹§xfZH .‹®º»¾¿À¿¾»º®‹. HZfx§¹À ¹§xfZK 9“´‘À¾¹­¨œ}) Vkw†¬»™À»¬†wkV )}œ¨­¹¾À¾¹­¨œ}) Vkw†¬»À »¬†wnb@49Tœ·‘À»¬†wkV )}œ¨­¹¾™À¾¹­¨œ}) Vkw†¬»À»¬†wkV )}œ¨­¹¾À ¾¹­¨¥¡•‘“œ´½‘À¹§xfZH .‹®º»¾¿™À¿¾»º®‹. HZfx§¹À¹§xfZH .‹®º»¾¿À ¿¾»º¹¸µ´µ·½¿‘À ¹¤oZNB9“´¡À ´‘4 @NZo¤¹À ¹¤oZN@ 4‘´¥À ¸ bJA>419Tœ·¡À µ•A!!7?Jb ¸À ¸ bJ?7!!A•µ¥À µ•A!5qˆ“œ´½¡À ¸ bJ?7!!A•µÀ µ•A!!7?Jb ¸¥À ´‘41ˆ©µ·½¿¡À ¹¤oZN@ 4‘´À ´‘4 @NZo¤¹¥À´“99“´¥À¹§xfZH .‹®º»¾¿…À¿¾»º®‹. HZfx§¹¥À·œT99Tœ·¥À»¬†wkV )}œ¨­¹¾…À¾¹­¨œ}) Vkw†¬»¥À½´œ““œ´½¥À¾¹­¨œ}) Vkw†¬»…À»¬†wkV )}œ¨­¹¾¥À¿½·µµ·½¿¥À¿¾»º®‹. HZfx§¹…À¹§xfZH .‹®º»¾¿ÙÀ ´‘4 @NZo¤¹…À ¹¤oZN@ 4‘´ÝÀ µ•A!!7?Jb ¸…À ¸ bJ?7!!A•µÝÀ ¸ bJ?7!!A•µ…À µ•A!!7?Jb ¸ÝÀ ¹¤oZN@ 4‘´…À ´‘4 @NZo¤¹ÝÀ¹§xfZI 1ˆ©´µ¸¹¹¸µ´©ˆ1 IZfx§¹ÝÀ»¬†wl[-5qˆ‘•¡¥¥¡•‘ˆq5-[lw†¬»ÝÀ¾¹­¨ [HA>414@bnnb@414>AH[ ¨­¹¾ÝÀ¿¾»º³ŸmYNB KZZK BNYmŸ³º»¾¿áÀ¹§xfZH?NN?HZfx§¹åÀ»¬†wkV2>>2Vkw†¬»åÀ¾¹­¨œ})  )}œ¨­¹¾åÀ¿¾»º®‹.  .‹®º»¾¿éÀ´“9… 9“´íÀ·œT9…09Tœ·íÀ½´œ“…“œ´½íÀ¿½·µ…´µ·½¿ÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀ“Àÿþ ó ‚0<ñ?<0 0´ñÀ´0 <´áñðá´<?ÀðñÿðÀ??ÀðñÿðÀ??ÀðñÿðÀ??ÀðñÿðÀ??Àð’ÿüóŸðóü¶ÿðÀ??Àð‘ÿüðÏÃÀÃÏðüµÿðÀ??Àð‘ÿóÏoK?KoÏóµÿðÀ??Àð‘ÿðÃKKÃðµÿðÀ??Àð‘ÿðÀ? — ?ÀðµÿðÀ??Àð‘ÿðÀ?0<•?<0?ÀðµÿðÀ??Àð‘ÿðÀ? 0´•À´0 ?ÀðµÿðÀ??Àð‘ÿðÀ?<´á•ðá´<?ÀðµÿðÀ??Àð‚ÿüóŠðá´<?Àð•ÿðÀ?<´á®ðóü‚ÿðÀ??ÀðÿüðÏÉÀ´0 ?Àð•ÿðÀ? 0´­ÀÃÏðüÿðÀ??ÀðÿóÏoK‰?<0?Àð•ÿðÀ?0<­?KoÏóÿðÀ??ÀðÿðÃKŠ ?Àð•ÿðÀ? ®KÃðÿðÀ??ÀðÿðÃKŠ ?Àð•ÿðÀ?   –KÃðÿðÀ??ÀðÿóÏoK‰?<0?Àð•ÿðÀ?0¼ëú ë¼> KÃð’ÿüóðóü–ÿðÀ??ÀðÿðÀ?‚ KÃðÿðÃK >¼ëúûþ“ÿüó‡ðóüšÿðÀ??ÀðÿðÀ?0 +‚£²Áëú‰ÿúëÁ²£‚+ >¼ëúûþ“ÿüóððóüžÿðÀ??Àð‰ÿþúïëܰ: /޲ÁÍïû‰ÿûïÍÁ²Ž/ :°Üëïúþ‘ÿüðÏÃÃÏðüÿðÀ??Àð‰ÿûïÍÁ²Ž/ :°Üëïúþ‰ÿþúïëܰ: /޲ÁÍïû‘ÿóÏoKKoÏóÿðÀ??Àð‰ÿúëÁ²£‚+ >¼ëúûþ‹ÿþûúë¼> +‚£²Áëú‘ÿðÃKKÃðÿðÀ??Àð‰ÿ ù綤•w' ?Àð‘ÿ ðÂG/y•¤¶çù‘ÿðÃKKÃð†ÿüóƒðóüŠÿðÀ??Àð‰ÿ ÷ßž†w_?Àð‘ÿ òÊ_7/?iy†žß÷‘ÿóÏoKKoÏó…ÿüðÏÃÀÃÏðü‰ÿðÀ??Àð‰ÿ òÊ_7( ?Àð‘ÿ ÷ßž†yi?/7_Êò‘ÿüðÏÃÃÏðü…ÿóÏoK?KoÏó‰ÿðÀ??Àð‰ÿ ðÂG ?Àð‘ÿ ù綤•y/GÂð’ÿüóððóü†ÿðÃKKÃð‰ÿðÀ??Àð†ÿþûúë¼>?Àð‘ÿúëÁ²£‚+ >¼ëúûþ›ÿüóðá¶D D¶áðóü†ÿðÀ??Àð…ÿþúïëܰ:?Àð‘ÿûïÍÁ²Ž/ :°Üëïúþ™ÿüðÏöšP4*4Pš¶ÃÏðü…ÿðÀ??Àð…ÿûïÍÁ²Ž/ ?Àð‘ÿþúïëܰ: /޲ÁÍïû™ÿóÏoKCOnz~znOCKoÏó…ÿðÀ??Àð…ÿúëÁ²£‚+ ?Àð’ÿþûúë¼> +‚£²Áëú™ÿðÃK3z•ž•z3KÃð…ÿðÀ??Àð…ÿù綤•y/ ?Àð•ÿ ðÂG/y•¤¶çù–ÿ üóðá¶D3„£­ £„3D¶áðóü‚ÿðÀ??Àð…ÿ÷ßž†yi?/( ?Àð•ÿ òÊ_7/?iy†žß÷•ÿ üðÏöšP43O˜´½ ´˜O34Pš¶ÃÏðüÿðÀ??Àð…ÿòÊ_7/?iyw_?Àð•ÿ ÷ßž†yi?/7_Êò•ÿ óÏoKCOnz…™Ïãê ãÏ™…znOCKoÏóÿðÀ??Àð…ÿðÂG/y••w' ?Àð•ÿ ù綤•y/GÂð•ÿ ðÃK3z•¤µãôú ô㵤•z3KÃðÿðÀ??Àð‚ÿþûúë¼> 'w••w' <´á•ðêÛ³¤•w' >¼ëúøòðòøúë¼> 'w•¤³Ûêð êÛ³¤•w' ?ÀðÿðÀ??Àðÿþúïëܰ:_ww_ 0´•À»¯ƒw_:°ÜèàÊÂÀÂÊàèܰ:_wƒ¯»À »¯ƒw_?ÀðÿðÀ??ÀðÿûïÍÁ²Ž/  (( 0<•?>:/+(  /޲µ_G?G_µ²Ž/  (+/:>? >:/+( ?ÀðÿðÀ??ÀðÿúëÁ²£‚+   —  +‚££…77…££‚+  ƒ  ?ÀðÿðÀ??Àðÿù綤•z3‚  ›  /y••z3 3z••y/ ŽKÃðÿðÀ??Àðÿ÷ßž†znOC?<00<™? >:/+/?iyznOC? COnzyi?/+/:>?KoÏóÿðÀ??ÀðÿòÊ_74Pš¶À´0 0´™À »¯ƒyi?/4Pš¶À ¶šP4/?iyƒ¯»ÀÃÏðüÿðÀ??ÀðÿðÂGD¶áðá´<<´á™ð êÛ³¤•y/D¶áð á¶D/y•¤³ÛêŽðóü‚ÿðÀ??ÀðÿðÃKKÃðÿðÀ??Àð™ÿúëÁ²£‚+ >¼ëúûþ‡ÿþûúë¼> +‚£²Áëú•ÿðÀ??ÀðÿóÏoKKoÏóÿðÀ??Àð™ÿûïÍÁ²Ž/ :°Üëïúþ…ÿþúïëܰ: /޲ÁÍïû•ÿðÀ??ÀðÿüðÏÃÃÏðüÿðÀ??Àð™ÿþúïëܰ: /޲ÁÍïû…ÿûïÍÁ²Ž/ :°Üëïúþ•ÿðÀ??Àð‚ÿüóððóü‚ÿðÀ??Àðšÿþûúë¼> +‚£²Áëú…ÿúëÁ²£‚+ >¼ëúûþ–ÿðÀ??ÀðÿðÀ??Àðÿ ðÂG/y•¤¶çù…ÿ ù綤•y/GÂð™ÿðÀ??ÀðÿðÀ??Àðÿ òÊ_7/?iy†žß÷…ÿ ÷ßž†yi?/7_Êò™ÿðÀ??ÀðÿðÀ??Àðÿ ÷ßž†yi?/7_Êò…ÿ òÊ_7/?iy†žß÷™ÿðÀ??ÀðÿðÀ??Àðÿ ù綤•y/GÂð…ÿ ðÂG/y•¤¶çù™ÿðÀ??ÀðÿðÀ??ÀðÿúëÁ²£„3D¶áðòøúúøòðá¶D3„£²Áëú™ÿðÀ??ÀðÿðÀ??ÀðÿûïÍÁ´˜O34Pš¶ÂÊàèèàʶšP43O˜´ÁÍïû™ÿðÀ??ÀðÿðÀ??ÀðÿþúïëãÏ™…znOCG_µµ_GCOnz…™Ïãëïúþ™ÿðÀ??ÀðÿðÀ??Àðžÿþûúô㵤•z37…££…73z•¤µãôúûþšÿðÀ??ÀðÿðÀ??Àð¡ÿúëÁ²£‚+ 'w••w' +‚£²ÁëúÿðÀ??ÀðÿðÀ??Àð¡ÿûïÍÁ²Ž/ _ww_ /޲ÁÍïûÿðÀ??ÀðÿðÀ??Àð¡ÿþúïëܰ: (( :°ÜëïúþÿðÀ??ÀðÿðÀ??Àð¢ÿþûúë¼> >¼ëúûþžÿðÀ??ÀðÿðÃKKÃð¥ÿðÃK…KÃð¡ÿðÀ??ÀðÿóÏoKKoÏó¥ÿóÏoK…?KoÏó¡ÿðÀ??ÀðÿüðÏÃÃÏðü¥ÿüðÏÃ…ÀÃÏðü¡ÿðÀ??ÀðŽÿüóððóü§ÿüó‡ðóü¢ÿðÀ??ÀðñÿðÀ??ÀðñÿðÀ??ÀðñÿðÀ??ÀðñÿðÀ?<´áñðá´< 0´ñÀ´0 0<ñ?<0‚ ó ÿþÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀƒÀ¿½·µ´µ·½¿ÕÀ½´œ““œ´½ÕÀ·œT909Tœ·ÕÀ´“9 9“´ÕÀ´0  —   0´ÕÀ´0  $-•0-$  0´ÕÀ´0 $l‡•‡l$ 0´ÕÀ´0 -‡©•´©‡- 0´ÅÀ¿½·µ‰´©‡- 0´•À´0 -‡©­´µ·½¿‘À½´œ“‰‡l$ 0´•À´0 $l‡­“œ´½‘À·œT9‰0-$  0´•À´0  $-­09Tœ·‘À´“9Š   0´•À´0  ® 9“´‘À´“9Š   0´•À´0    – 9“´‘À·œT9‰0-$  0´•À´0  $-0-$  $-•09Tœ·‘À½´œ“‰‡l$ 0´•À´0 $l‡‡l$ $l‡•“œ´½‘À¿½·µ‰´©‡- 0´•À´0 -‡©´©‡- -‡©•´µ·½¿¡À´0 -‡©•´©‡- 0´À´0 0´½À´0 $l‡•‡l$ 0´À´0 0´½À´0  $-•0-$  0´À´0 0´½À´0  —   0´À´0 0´½À´“9 9“´À´0 0´½À·œT909Tœ·À´0 0´½À½´œ““œ´½À´0 0´½À¿½·µ´µ·½¿À´0 0´éÀ¿½·µ…´©‡- -‡©…´µ·½¿ÝÀ½´œ“…‡l$ $l‡…“œ´½ÝÀ·œT9…0-$  $-…09Tœ·ÝÀ´“9†   † 9“´­À¿½·µµ·½¿¥À´“9• 9“´­À½´œ““œ´½¥À·œT9•09Tœ·­À·œT99Tœ·¥À½´œ“•“œ´½­À´“99“´¥À¿½·µ•´µ·½¿­À´0 0´õÀ´0 0´õÀ´0 0´õÀ´0 0´õÀ´0 0´¥À¿½·µ•´µ·½¿­À´0 0´¥À½´œ“•“œ´½­À´0 0´¥À·œT9•09Tœ·­À´0 0´¥À´“9• 9“´­À´0 0´¥À´“9†   † 9“´­À´0 0´¥À·œT9…0-$  $-…09Tœ·­À´0 0´¥À½´œ“…‡l$ $l‡…“œ´½­À´0 0´¥À¿½·µ…´©‡- -‡©…´µ·½¿­À´0 0´ƒÀ…ãÀ´0 0´¹À´0 0´‚ÀÃ̃ÏÌâÀ´0 0´¹À´0 0´ÀÃÌäíðíäÌáÀ´0 0´¹À´0 0´ÀÃÏíùüùíÏáÀ´0 0´¹À´0 0´ÀÀÃÃÆÒðüÿüðÒÆÃ×À¿½·µ´©‡- -‡©´µ·½¿±À´0 0´ÀÃÌÏÒÛóüÿüóÛÒÏÌÖÀ½´œ“‡l$ $l‡“œ´½±À´0 0´ÃÌäíðóüƒÿüóðíäÌÕÀ·œT90-$  $-09Tœ·±À ´0 0´ÃÏíùüü…ÿüüùíÏÕÀ´“9‚   ‚ 9“´±À ´0 0“·ÆÒðüÿÿ…üÿÿüðÒÆÃÓÀ´“9 9“´±À´0 3œÃÒÛóüÿüóƒð óüÿüóÛÒÏÌÃ’À·œT909Tœ·±À´0 <´áðóüÿüóÛÒÏ ÒÛóüÿüóðíäÌÑÀ½´œ““œ´½±À´0 ?½íüüÿÿüðÒÆÃ ÆÒðüÿÿüüùíÏÑÀ¿½·µ´µ·½¿±À´0 ?ÀðÿÿüüùíÏÃÀ ÃÏíùüüÿÿüðÒÆÃÓÀ¿½·µ…´µ·½¿µÀ´0 ?ÀðÿüóðíäÌÃÀÃÌäíðóüÿüóÛÒÏÌÃ’À½´œ“…“œ´½µÀ´0 ?ÀðüóÛÒÏÌÃÀÃÌÏÒÛóüÿüóðíäÌÑÀ·œT9…09Tœ·µÀ ´0 ?ÀðüðÒÆÃÃ…À ÃÃÆÒðüÿÿüüùíÏÑÀ´“9… 9“´µÀ ´“<KÃðüðÏÉÀÃÏðüÿüðÏÑÀ´“9… 9“´µÀ ·Ÿ`HKoÏóüðÏÉÀÃÏðüÿüðÏÑÀ·œT9…09Tœ·¹ÀÃÏðüüðÏÉÀÃÏðüÿüðÏÑÀ½´œ“…“œ´½µÀ ÃÌäíðóüÿüðÏÉÀÃÏðüÿüðÏÑÀ¿½·µ…´µ·½¿³À ÃÃÆÒðüÿÿüüùíÏÉÀ ÃÏíùüüÿÿüðÒÆÃÓÀ¿½·µµ·½¿¶ÀÃÌÏÒÛóüÿüóðíäÌÉÀÃÌäíðóüÿüóÛÒÏÌÃ’À½´œ““œ´½µÀÃÌäíðóüÿüóÛÒÏÌËÀÃÌÏÒÛóüÿüóðíäÌÑÀ·œT99Tœ·µÀ ÃÏíùüüÿÿüðÒÆÃÃÀ ÃÃÆÒðüÿÿüüùíÏÑÀ´“99“´µÀ ÃÏðüÿüóðíäÌÑÀÃÏðüÿüðÏÑÀ´“99“´‡À…ãÀÃÏðüüðÏÕÀÃÏðüÿüðÏÑÀ·œT99Tœ·†ÀÃ̃ÏÌâÀ ÃÏðüóÏoKH`Ÿ·‘ÀÃÏðüÿüðÏÑÀ½´œ““œ´½…ÀÃÌäíðíäÌáÀ ÃÏðüðÃK<“´‘ÀÃÏðüÿüðÏÑÀ¿½·µµ·½¿…ÀÃÏíùüùíÏßÀ ÃÃÆÒðüðÀ? 0´‘À ÃÏíùüüÿÿüðÒÆÃÃÀÃÃÆÒðüÿüðÒÆÃÜÀÃÌÏÒÛóüðÀ? 0´‘ÀÃÌäíðóüÿüóÛÒÏÌÛÀÃÌÏÒÛóüÿüóÛÒÏÌÚÀÃÌäíðóüÿðÀ? 0´’ÀÃÌÏÒÛóüÿüóðíäÌÙÀÃÌäíðóüƒÿüóðíäÌÙÀÃÏíùüüÿÿðÀ? 0´“À ÃÃÆÒðüÿÿüüùíÏÙÀÃÏíùüü…ÿüüùíÏÙÀÃÏðüÿðÀ? 0´•ÀÃÏðüÿüðÏ×ÀÃÃÆÒðüÿÿ…üÿÿüðÒÆÃ×ÀÃÏðüÿðÀ? 0´•ÀÃÏðüÿüðÏÖÀ ÃÌÏÒÛóüÿüóƒð óüÿüóÛÒÏÌÖÀÃÏðüÿðÀ? 0´•ÀÃÏðüÿüðÏÕÀ ÃÌäíðóüÿüóÛÒÏ ÒÛóüÿüóðíäÌÕÀÃÏðüÿðÀ? 0´•ÀÃÏðüÿüðÏÕÀ ÃÏíùüüÿÿüðÒÆÃ ÆÒðüÿÿüüùíÏÓÀÃÃÆÒðüÿüóðá´< -‡©•´¸ÃáìðóüÿüðÒÆÂÀ·µ´µ·ÀÂÆÒðüÿüóðìáø´¸ÃáìðíäÌÃ’ÀÃÌÏÒÛóüüðÏô0 $l‡•“œ´½ÃÏðüüóÛÒÌÀŸ““ŸÀÌÒÛóüüðÏý´œ““œ´½™ÀÃÌäíðóüÿóÏoK<0 $-–03 CFBundleDevelopmentRegion English CFBundleExecutable gspiceui CFBundleGetInfoString gspiceui version 0.7.18 CFBundleIconFile GSpiceUI.icns CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString 0.7.01 CFBundleName gspiceui CFBundlePackageType APPL CFBundleShortVersionString 0.7.01 CFBundleSignature ???? CFBundleVersion 0.7.01 gspiceui-1.0.00+dfsg/html/0000755000000000000000000000000011752030331013754 5ustar rootrootgspiceui-1.0.00+dfsg/html/Makefile0000644000000000000000000000574711640447004015436 0ustar rootroot#****************************************************************************** # Makefile * # ---------- * # Description : House-keeping for the GNU Spice GUI project documentation * # HTML files * # Started : 06/04/2004 * # Last update : 27/09/2011 * # Copyright : (C) 2004 by MSWaters * # Email : M.Waters@bom.gov.au * #****************************************************************************** #****************************************************************************** # * # This program is free software; you can redistribute it and/or modify * # it under the terms of the GNU General Public License as published by * # the Free Software Foundation; either version 2 of the License, or * # (at your option) any later version. * # * #****************************************************************************** #****************************************************************************** # Specify string values #****************************************************************************** # Root directory ROOT := $(shell cd .. ; pwd) # Install directory INSTALLDIR = /usr/local #****************************************************************************** # Make these targets #****************************************************************************** all : #****************************************************************************** # Perform installation tasks #****************************************************************************** install : mkdir -p $(INSTALLDIR)/share/gspiceui/html cp $(ROOT)/html/*.html $(INSTALLDIR)/share/gspiceui/html cp $(ROOT)/html/*.jpg $(INSTALLDIR)/share/gspiceui/html #****************************************************************************** # Perform uninstall tasks #****************************************************************************** uninstall : rm -fR $(INSTALLDIR)/share/gspiceui/html #****************************************************************************** # Remove temporary files and backup files #****************************************************************************** clean : rm -f Makefile~ *.html~ #****************************************************************************** # Specify phony targets #****************************************************************************** .PHONY : install uninstall clean #****************************************************************************** gspiceui-1.0.00+dfsg/html/ScreenShot1.jpg0000644000000000000000000027133311633504756016644 0ustar rootroot‰PNG  IHDRwÄ$x^. pHYsÄÄ•+"tEXtDescriptionWindow Class: gspiceuiŽXÁSvzTXtTitlexœÁ±! Ð_騉¥`dtº¸¸˜s'µZôNŠñ÷}oºÌpµÊÓ|ÞÁMº×örÈG8-¦6é@)Ò>ƼÒ¶ ­þ#ëí%<œžn•å[ÉYÉ]£“9˜ ;c½KY¿Ç¼A$‰®úz IDATxœìy\TÕÛÀŸ{ï,0ûî‚‚ ¸ïš¢Zn©©¥mš™Vjæ[šXfejiù³l³²Ür×÷ 7DA@eßfænï§q6†a†­óýÜÞ9÷,Ïsι‡gž³ 6hæZÐâÒö¥€@ @4¼¼<í<Íg_²,ÛÔÛêéÔÜR @4™©ì¢Ömü`Z¶f•yiûRξ,-*j.É´q¿µ«¦6·@ M„û­]¥Eóš[ŠFÁ²liQ‘«‡ghâðÄÄ,-*j!&&@ ¢ÕÁY’»¶móööÎÊD @ ¬ ®qd6·$@ ˆVψ¨(Ή|™¶…]Ä. s³knAZÿÙ:1Sq«ÔÏk¡Žì¢ %½œ“Iëbd1»(hÓpåÿŸí·¡mTší´°VÎÏÇ*’˜Î$²£øþ+è÷‚ØEA¡®ÂÆ„hJ\= ª®ùùõ&çÕÃDPRXhNM€«=±¼¯ëØN’öRɰiåê]iUkãË€Û±u·TÕý÷,†…07»[/ù¶!Uó4ü‡‰ÅJýÝ—dX¯ï3J•t#Uk× ¼(éïà(ȯ¡þw»œ«ìyØšAnÓºÈ\ì‰ûåê•—Kö¦Ë-ÈYðå`÷A>öB¢RE_Ì­ýàBQZ¹Z? ëuÿŽ2>tÝöà^ÙSqœÓbyö=êUÜÌhñðϹ*Hzß?‹\‚îAóéçeï#ᡞ€cpjr‡áíE:O]í‰Â7;ß“³0ÜÉXr•¯IþjˆÃoûŽ2>ɰ—ójß=W”Rªª7¹±GÆÚèTNÍ¢šyÝ~=~é–°³õfÜÇÆ´K#¸ðXÑê jüËÞ áËFueõ!ËXΔßXç4?[«toc™láéïÈK{”ò0®_ây ¢ìÌoß&{L`Ž´¦[ëâêáakŒ3ÿô âÂCÃÂê I}™ÚÖª ËÕ<ż3|߉p°äîËwö_¾-PV¾ÙE *LÕÄ qΑeƒÖQMî·viîÓbyµÆ>ÀïQ^/É*ä5¿Ÿ½yîfJ{º'•%×S¿ïž+\û “çÅðûÕÍMh¡¯‘A¶ß«€™~˜8ÿ2=HgïWwà”ªÞø8f:‚ëFvïëÓNB쌻C¨_v_HéGÛ2ÂóÝg•J¹ãâm)S»g¬O”‹¡ÊD´ýϵ{Î_RZYýǹ[eåÏûKF9J¦êàv"ÎÄ€¹.yù¼»Zn:¹‰G&ÚhÇ}Àßîíi°],C£…µ2´X~uq‹*¨Þ7¬÷²›9|Ù¨®¬;d™ÈÙFò7Y2M'G>¬Ü~lé›ÞÚ•i¬}µûX Ñêë¦[+¢±ÿl”?Ç®mÛ´‹Ó¹×<5Y¾Ls22ÕÈ'\;Êøñ™y“×üZµÔàN”µ/-VxÔ=Ų°l\Ÿ?7_÷.1¬ÿ¸ÿ⃵ԣœ™*BêRîûÍ’óEs»;¶—ò÷eÈ_?‘_K±P÷Õ'Hó…æµPÇáNAΚe‹Twfs™¿ÙÃqa¸s€#¿RÅìÏ¿¡¨RÅX cãÙs_¾i˜»¿§K©ò,ŽÁÔ.2Ø—¤’yÏééaPN®Þ¿Pôz7ÇÎŽbC `xt'Ƀܺ8 H†Í('?¹ZçsÒ® `QOçy=œ:Èx%µô®´ª/kU¼s¶pvˆCˆ‹0µL=óX^r‰®™»¸—3°v÷©­§nöêÕ럣Þä»éÒiÅÓ­<9P ï}¿÷Bfq¿ˆ°#óG.p8½ï±Zêaf4o Þÿiÿ¥¬²>aÝþy;ÒÛÁÞ!ëRYp”ŽH3ƒeœ]Э£ç¤þÝV\ˆ•{u׉c¢ÏpDøû¬Ó­›»H[ñÈŽâuCÜ;9òíyxi-û°zÑù¢’Z]óóþ¸rïZæÍ<ðÙšázçPñ/~s¡·§Ýª®«OÜ‹ÓUçQ´ŸøÔý" ã{oÍt½{X?¹éÊ×$ï½=+'öwRìæí“ugÅxoGq¸üöç&’›xd¢Î?VÀ˜ˆ.¢ËÛõÔWÖ4Zp ¶K½ÝxÙÅâùaŽö<|Ñù";ûl°è|Ñ)•\¶&Fê×›•Á—nI/篆¸oN,ûLá{=7 u__öÁÅ¢ý\?àº>¡lÉù"ý‚Œhºoz}êÿ;šPÓàØ¨98ðôê¹ðdöÉØÀ¢­áàöË(ïI¥ääæÄòÃ=êMn»a\Ûfh&íßœ5òêæûÅ`wƒ:+ÝXç4³eMç ûRoc™hšòÔ§sžV_·} ö13µ0-˜6¦ÇRó{£>Æ[M[Ÿ``¶­¡p¦Ô®mÛ¦ÎžÝ ¦Ž Vo°0®xâÑÔ61CÂÂê-Ñ,_æÔÙ³]&R>vÌÕÃCûâT²…ƒ7ÚOÿ;rQÎw( ~VÞ¡·¼Cïx§>†hâ¸z§£»ÓÜ΀®gy5ü0Òºù3¦>;B2èa§QJg_M„ÂÄïçÕÔ*§ɾ%1æß¿ýÜšáN?ò uÄ&f코؎¯rº†;máéÈcþºt';7ÿnŽ{GH0š´@ÇÆS®¤ÿÉ’Àä^xŠòáíÅ^b^U­*öfÚkÏ6-çêþÎ Y‡n¤¹'î€_G{9 ö]KÝw)‘ª*éÉä+ëÔÉ’^Î놺; Ø¿.&©käïF8ÿ:H¨]u_ tNÊ)Ê)®èî&üi ¯¶RGà>žvp;+¯Ú;ô"ø€‡£$€ÌÕ‰¦ XïäCvêÒ½;„uòÑv×íÃKÅjŠ^÷ê¸5ó^üfÆP5Í®ÞuŠP×êä $°É¥°òÏØ …ª«Ã07£ýÍDŸ‰yqÔܲœ’§÷–ðŠåŠ=—ïn?{³²¢ü¥®¿ è;˜{yÚÀýÜbµÔ]Xúœ¾>¾ãYŸ¸œªvìÕyÄñѾâ‰÷U2OÀ0ƒÉMT¾vòEª².‘åÏÔxu’¢‹KJ•ÜDrL´·8ÁÛYÖžµŽÿà©J#íRo7^ÐUp7·ÔÕžøi¤ûòÞ7²K]í‰ï‡»:Vå€É@_ÓY|é8ã{ˆ“Jú8a ·= s¨‘äÝæîo‹•ä&êd¢sê¼éõªÏ½ì&Ô466n¼YÎå°ïrò±×¸Ù'c‹¶ «¸Ï –ÕªÔ×nß]ÑKÊeb:y½Z7r×qkéϤiËÿëoƒB+ÝDçlPËÌAÓuh0ƒMi0Ð`3S Ó‚icb,mPo4ˆÁÑR#¶±Gæ£119léÑôôòÒ”O{1CÂÂ<½¼êÍÁ,_¦&Sí¦ML.ÂÄDíа0sÖŠZ€»ˆ€ÜÒ*…GÐÔ`§ÑÞ\¸öªˆŸN\ëÒiqtß»’:5´ˆ¹' ¶Gº¸;Hf‡Kf¨iæ­¾÷ï¬ëÊ¿b÷\O¿:rÐÖ_ïøÑѪ}zhçð^„3Äì8±õø5•c;üP NÖÀ»Îp'3G¥Rß*Tô €AÞ=vœOto¨ŽVa{jõ„ÎÏ÷ ]væØ‹AÁpøÚ]‹¿=°“i9¿øûìæcWUN0Çö À±¥êÄ;·«ø%)|e%Oê©‚vÚeÍs€•ÛÿÙqù^`H÷¸÷£§„û.ÝýWŽ{á“'>s³OŸ>Gæ ïè.}´¯½µÿýneyAnWJÄÉE5½]‡wñ’þtªÒo v¶ÎvT+Õ´P¦_¨6›Gx8 ññ›w*E®:xÛKÄ…ë7ÕNº>N &*€Ÿ«vrJä,àDyÀ¦#—*kI†oo"¹‰G&Ú¨J]ÓYˆá¤’áÞ…ðͰGäwÏ™úÒ«_ Û¥þn¼óÔñ»³ÿ÷Ž€G|ö×±cwrrþ÷®HÈUgÅ1>&F}Lgeð¥»Y¨”«é®í=ȪÞöE•a¼¥ªŠ~^ö Ë^»ŸMzõÑ/ÈDçÔyÓëU¿®ª«itlf¦ÆÓWÁÄXÚ Þhþ`¢ÀèˆjÚ&&gäYàÑÔvIÖ‹v)\ˆù&&˜?cÎy.5VchXÔ7“¾kÛ¶P=oêݧíNkQ¤ ½%sóAnµwňô|£ÛSkê%vAUN¶åJÆ]DHì SÏ þrW‡ìÒê 3GhŒàÏ^Šúß=õ¨h?ɵÇU•ruOcÉMT¾Nr7{âØÄö==ì~:—üÕ¾s –à›Hn⑉6’ êbVT×â2µ1+“ûSÁ±|ûñêvFíýJ0Ø.õvã…¥E.Áu÷%Å.uf8êoV´Ÿ»Ž¦³2üÒ±p)·6ÊOòBX;O1oñßW×Ï=³W!ž”]P¥P©Ånúššèœ:oz½ês˜PÓØØ¨Â#ˆÛPbl`ÑVÁSÌ€ôü’jŸðDì©o¶¦Ç%[ ãÚ!<ãÓ‡ÚòÒtEìœ jYƒ9è¿/¦ëÐ`&ÚhšÒD N3S c‚é«`b,mPo40ш õ|÷7‹zÝ|¦i¨ïÓÓËKÛœ›:{¶ù­YV¦fbžÛO¤mJ×›J;¤ÞIv‹9šUýF7Ç9cúíß“u«HùÞÃrÎÓá§Ä’Eý¼&ô ÖÌ©"ýø=|½Ïå1½=ì€e!¿¼ dO­mäc)×ã0ëv<µôRyÊñ¹ƒ¥öBIÞm•ÙÉÃùL‰$ÐIÅU58¥ë_|$§üø}ÛŸ}(Žq>šÇÕ”¯Œÿö÷û÷Ä%q1Û¹:<.©Ä;ûk[™¦u4S sPÑìžûò7º;}5s¤£x\Zy5-[0Ü„œÜG5E“b7M>¦Ví¸ xæ÷Ŭg¿ìü×ù[µ.Oy‘s«©Ž2~g/×3EÒ`g'vQ…œÕÕE3”øßãx0Vwö9¾@9ÚWÜÝÏëøª§‡UVç–V1žü gdU’*šåãØy¥ëåäRAUþ‚Á]1 .Ü}ÀðìÀÌhÜÑ7SÒJ]‚Ï‚ÿr€v.²‡»Ê»Dj„qÏúI`úÐðéC놙HøœŸÝ¯Jóæ&úŒAÅ_ v€÷~:´ëbâ°nþ-™£»ÛéFaí³~’/W<ÇÀF(:ºH:ºh>öëÒá|z¼]yYt'¿=×ÒH±‹‰&*?º“X“¼£ŒrRûÎN‚uG¯µóX­[@W¨éä&™h#® å—Ë‹*«™öcbcR5³]"SV¦–\ˆÁv©·3 KÙIôïXÆÄ›¥/€é¬Œ½tç×FùIæEõ'ivï…„'+ª\¹÷²wb ¾~A&:§Î›^¯ú&Ô466 €hbÆtÔV!¿šj'åùº;)•r*Ô›¼^­9,ÆI†åã˜Ld,ô0~T¶üÆ„4QQ`¤s6¨e æ ÿ¾˜®ÃzmmôÛ—C§™©…1ÁôU01–6¨7š?˜hÄÝeV ÊûdÌG{¢\{¦9iͲ2u¼²`ž¿ÔàSMY×Ü\y¹$ª=`°ï­7Nå3ö|‘ »òjùoQ"íÀ?îU~ÜÏõó—£&>® õv€ã7S«*šÿT´‹S;¦—Ö^.P×RÞ£}ÅpþÎíe71ÓGõ¼_ñ\¨;¸z‡û³§Í×7Ë6 ÷ˆyqTDJA1+ÑAÔùçLÀ°oo•¯êþÕ«cõï[‰‰z¸ »8 ܾI¤O-à0­£™Z˜ylÄöTùÝü<œ`ïådŠ/"%îæÈÉâ„æ>wNÀùG^ùŠ~a®ת$u¬Ì-·+¾ì¶ú¥1=ï• ëìÁU]E’ÖòB±˜©ÕÃÊFu0ix§ä‚‘Á^ðý±+ ߎˆîÍî=¾s«ŸÓÝeZiR‰GièN’*%¹áÀnë™Ñ®å×i'úæçŽg׎ p€øôG:û§t‘ L^«ŠKyÈ…ú¸uòtžÒ?äÏ9ú%¦ûŒ¾ây5T'þ¬gzu lôí;˜Yý¬Ÿ¤PÇïÒ³AêÛFÿùƒIÃgN³N•ÂÓCdá+`Äòîdø÷q΋OR9x›Hn¬òÛ»:h'¿<­£·„÷¨´ÊÇ®œ3»~u£4·š2Ñv&Íëîh¬†¶@ìÍ4†ooÌ‘ÉQ>ÕÄSŽŽ2¾¶ôÛÅœn Ú©žÎÁØ›ÕÎÕÑ &²2öÒ{¬€ÎÞ® Yùµ$—¯z.À âî=TKÝ jZOçÔzÓÍR߸š´@lll€‚ÊKÌûxZäm…ýÂK•Ætt÷뢭Ÿ©•ôvYóRTß´²è®OM#˜—l1Œß,Töõ²_ùbä€\úµ^n`ˆŽBmù i¢¢êÚåéþ`IËouÞ—zÇvÓƒ¶6úíûo&Oú˜ùZ˜LGciƒz£~ÎÆFKØ[~6¼TÔLLØNæ˜}©:k1jhšÛ´W€š?%ïéå¥}q ¹Ëºöx~ Õgûƒ_Ï&ÚØkÝ&ú‹n攬Ý{.«P×W¿=UžRôÔƧWKמ¾WTYÓ·ƒ“Z¥úëÂíw¶T9ø°_;Ú× eÊêÊIþösº;HzgÜÝw~<¨–ý;™¸ñÐÅ¡íER>ì¿vïË¿Ï*:èýí­ò·öÝNË-ìñr¤¬¢ÒåÞ?°!¡ìÝ·sŠ+&…z¾,1ÊN%8§žhŽæh¡Šd)ÇL¯pñ±"§²nOÉßqI*§ŽæËùo&¹ŠþnؼîŽ==ìnd¾¹y/·ßY›µñ¥Ëÿ¹SY£œæmÔ§o¾÷Ó!¥S–0êˆÒáDvÍK{S Êå/õlÓä§{/üïŸËÚ̳âeUf…ÚÛætsæ#ŒMÎóãƒygˆùÑfËÛ#Cb'|-ÂSÆcö_O}kË>RüÔrFnºü÷3 /oÚ;í׋Ó~½¸`çx¦Ggo•î¼6˜Ñgt˜usý_eAc({Óõér÷0¡V@Ype'3-§ŽšâøŠRœT²8NÙ;V{÷ %nú‘E…©ö%©`xB•cûjïúUÇ«­pN#^(»òQÁ]žJÎðí® ºEÚ9ª ¤u ‹j‰{OwÊΡAÑpR!ɽ-à”šá ÕRjŸ0†o¯-‰Óý3üšb…{f©¿ºÈ)ý,`XIèó®É¸‚Èú™ÙgtçWËŪjÊÎQáÖY–sÝ`¼*Û:Ê;fçéO{°8žÞÓÊ¡ŸJSîÁé¡yE¥ÿ·uwIÈ8íG“ëWþÑ íêM®i}cmgâ‘Á6ÙA|rrûŸÎ&~ôË¡Òà(ÚN ØÆ:¤9ÝØØ=z³vÏmBc÷Æ^:`Y·¤}C)Ü»Tû„‰ S%y· ¸û„#“;iÔ Mƒ¾úB¯vaðþwñ޽Œ©©èŒv¥Y’¼ÛÜþ_®¶õu<ðR¸¶ "®&)QöuaÅ£Ÿé»qö¨œâŠÞ‹6…O1˜œ”¸Ùtç)Êe9×xÊ*ÊN¦tö•äÞÖèÂå¼må;¹¥•Úmm´”n°sþúÉbËZÖôxkB<Ó™ì<úí«MçM4­…‰zÓÁôXj~oÔÇàh©ûŒóPƒ©4iSÖÏ3áô±cƈÒ=V¯ñœ>vlêìÙ:¾EÎäÂMÊ¥m˜• õY‡VÄ2C³YÐôž Mû£ eQOçú8[ºñ#­ð·æùGˆ†Ò}ƾô4'¾Ú'LÑðb—öv¾|ñâíâZyû^ÝÈä#:fœ«uë,oQìúh.-š^‚¬Ò9ûyÙÏsš,+©ªé±pCaà˜ÆÛý&ÐQ¡—‡Ý/£=÷§WÛñð¹Ý„xÌ_'¾;T2ÖXÍ;ŒÛ¨­mѲMOÛÐÂ+³^LÔc Û̘oÑŸ#ge6ØËÝ4&&ÂlH(ûþØ‘\]Ü»¹eAØœZ—N:«`Ígm|™¨’P»ÔÕÉ-F-õ°âWÓæÒ¢é°EAc|Å3‚e™ÅUü|@ñµ72ÚJji’¤>èåˆãxfIõ'¯þ{¥Ö§þùÁæÂFmÝì}Ø*´ -¬EÛ`\qú… ×§Á¾Ì¦¤¹3Í"!Æ@}Ñb±JççßÜ¥…yû^:?²Õꇬ8¢¶–Jk]jÝêùuûÿÂ+Ù6tl¥Zpb›˜g¯×‘Ùº0†­Ldc"@ ƒ+ù2@ ͘#@ ¬òe"@ ¬n0”µôÊ|ð 08˜HÏÈðéØÑâ|i$±ìjvù[Z…´«íµ ºÐ….t¡ ]mà2H£fÌ323&‰¸;;r$-%åßäMâ½”ôqLLò;Athß~éûìäç÷”$–a$yFfæ°#?|بÌÍÆ ‚Æ"k˦}o ±*úÕ˜‘™9bÔ¨ìÌÌzR¶$-@¤Q3æ,Ë‘‘šªŸ»i‚™w’$gΚõÞÂ…{víÂ1,99Y¥V7¾\Óò7™vÐpµekJ9-@_¼zná!ÐÐØsÈé™™íýütÕ(ï/[Ò£GPhè¢÷ßWªTVôÐææç—””LŸ>ÇãáÑ#,¬OŸ>Ú’p7¿oßÞ="¢wÿþñ ?þòK÷ˆˆˆ>}âtdNÏÌô Бÿ·?þèÝ¿¿—.ÑÏ?Ÿõð! 0yêT𦂂‚‚’ïÞmU¬¶lC†×Üï?xP§Bº…‡÷ìÛ÷Z|<—[qŠƒ IDATIÉŒ—_ <|øïÛ·kêá×ß~ëÙ·¯—.á½{oýùg+ª¦ßÌé6 ÕÓvìÚÕ«_¿À®]—.[¦&Iëʆ.t¡ ]èBºÌ¼`eËš{éGÖ„<¹ù¿?¬ªªºwãêÕ’’’uë×7 ÿú.////¯ùo¿}òäÉ’’ƒ’Ð4——wóúõ©/¼0wÞ¼²ÒқׯOŸ6mõgŸÐBO~?_ߨ£GSïÜñ÷ó[±r%°ìž; ‚H¿w/ý޽Ю]›KAƒåjËvþÌ™å yªBòóoÅÇ¿0y²¦-Yâìä”|ëÖ¿ÿÞ๤¤dùÇ¿ysFjêùÓ§hEÕL÷£µª¥E\\Ü…3g._¸p7%eã¦MV– ]èBºÐ….t™y5À—i64M…†r×/Û¶i&457555Z¹|¹X$‰D æÏ?|äˆùù× A{wïvrv^ùÉ'a={N˜<9++K[îfîoà85fLAAÁ›sçr÷©©©:1õågYvÐÀŽŽŽAÌž5ëVb¢ÎÓæRÐD¹ÕÑ­×_ÇqüÙ1cÒÒÒX–­’ËÏœ=»léR¡Pèääôö[oq‘ù<ÇËÈÌ”WWK$’.VT}ºÿ…†FWo·ÑÖ⃥Kíììœß]¸pÿÁƒÖ• @ „™´'w’Ë‘’”¤ ÈÌ̬KþÄ(**¢(jø“Ý*,ËanþæÑ¾]»/>û JJJV~òÉ;‹Ø»W#'¤L&cY–Ïã ‰XÌÝ×-pÔÄÐN¥ ükçÎ-ß_RR$EéMÓ$IòùüÒ²2§ååå._¾cûö~}û&%'O|á ÓDh.–«%ÛS÷¦svq€‚‚OOOÈËËÓ<ñÌ3#žy†$ÉŸýõí… ¯\ºÔX5ÌÀœZeY67/ÏÇÛrss]ÝÜš@0@ fÒØsýÈ 5¡É²¬X,½êÓO+++Y–-,,¼g~þõR\\¼y˖ǹ¹,ËVVVþ¾}{÷nÝ JbìÞËËK"ÿsì˜J¥Úöûï:©Ôj5MÓjµú—mÛ¸@™LÆ-mlF•«-›ö½é ‹ÅÇýrÝ:¥RYVVö¿ï¿çÂóóóÏž;§R©‚°··ÇpÜŠª±Æû‰ZÕÖbíºu …¢´¬lã·ßŽî9ëʆ@ ÂLl`eêGÖ„h=úbÍP8tĈàÐÐ)/¾˜vÿ¾µwïÞ?iR`×®‡-+/_ÿÕWÆ$1xOÄÊ+>\±bèˆáá:©ÜÜÜÞzóÍñ“& Œ  â]œg½üòˆQ£Bzô¸›’Ò< ©XmÙ 5÷wRRLWÈÚ/¾(**ê1qÊ”è¨(Dz,MÓßlÚÔ£gÏ ÐÐÝ{ö|³~½U3ÕŒu­f%¢ß¾ÃGŽ8dH``à‚ùó­)@ ³1hObÜßìÒ¢"îsA~þÝÄÄ~ƒŒøpêÌ™OV¯¾pæLs b”Ì"£¢¤¥5· @ àê¥KSfÍÒØ“§›:{¶‘Ý?æåè ò0#Ãr-B_†æ’ÄF4™‚醸ûççç½qã˜Ñ£m½•Ƙj`†v¬Ö¿@ Z Úcž•žnYB+¢/CsIb#šLÁŠŠŠ÷/.-+cFzgÁ[ס1ÕÀ íXííó@ ZúsD[¢WDÄųgŸ jÁÝÀßÏ/ãÞ½–,!@ ÿqw^&@ aˆF­ËD @ bØÊÌü¸‰å@ @´% [™†ob9@ ­”=¿ÿ®høTv@ ¢1 Ý?@ 냬L@ „õAçe"@ ¬:É@ a}/@ a}кL@ „õA'!@ ¬òe",áÆõë½úôin)æ‚ÚË|P]!„µ@V&Â"Xu’Öj/óAu…@ V͘#@ ¬M|™ö"‘öÇZ…¢1¹µ^Ú0¬ ü=ß¹Œ¢išfhš¦h¦î†ahšþtÃOÖ-«ò¶HDð0о³R¿µE{µUlQW_ŠÖ@ Ä @ü§°òIFöb±@‘jkjìÅâÚšËrn]2ü'°ö_b’¢Þ_½Y'pÉ›3Ü;õXüÖËë7ÿfÝâ âæáÅ…ÅMP–†·ÅbX5ytmm­J¥æóùB¡€Ïçóùü·E"øÎ*=Y™æcÕºúRüÄÄ@ Äh"+æ@ -kžÊ.‹@¡7€ráœñgë?t-A†–Ãø hš¦(J­V+•J¥R™pã†UrfmPE \ºtéõë×ÏŸµÎƆf÷¡‰IIÀB·î¡IIwlZ–†bñªÉ£ÕjuáØ2¬(ij֤ aÕäÑàm±øÛÆÙ%¶h¯¶Šuëjí“#bàÉ@¤?L!DÃj3æb‰¤¦ºÚ`Úšêj±DbqέK†¡Ëñìq U, Ãb†anÎÎ{Þ?h»ru˜>cŽãaaaE©T*…BQSSSUUѳ'I’I·o7¶Ì*R4 Ÿ~úéèÑ£cccGŽÙ¿’¦¯_¿Þ§OŸsçzÏõÂ÷Ûv[±D±Dâááö 3‹ûèæêîáæÍîêê¦Ñ. s@~~ׯ¬ÎB‰dÕäÑE7bå$ÈÕ°º¿BÓП –»0Õ$HoÄJðùôq ÄâM‘¡•Ϙk^^ó±¼É¬WW_IÖi›˜8[“ûêk£®…@ -«Í˜×ÈåÆR‰¥ÒÆäܺdÀ0ì™s¹{’VU©Ê åEå•t>ÝdS–³_}µW¯^€eYŠ¢ ÇÃ0Œ¦i¹\Þ5$$åN£}uV·2)V¬X}ž%CQôÖo>ÛB3CÓ4cÅBÅRé‘#GBºöK$ú…Àò•Ÿ%¥$c,¬Z½*rä`¸|õ–¼ZY,‘ÔÈåÖ*šc¡Túùôq¯.UÁŠBÆN›Æ=;mÚê;àS0€„Ã˺ÀB‰dScdhµV¦X*­¨¨ Ã0–e9÷Ÿ31¹yóÚÚZ''§.ÁÁ©÷îY\Šg_xÞöÌ"©:_æý´´ ÆÆÆŽ=úûm»¯^ðàAbbbvZ¢ëÐÉQÒµ'ÜM¾]Cb‰7.Ü‹?Š+KX`q‘×ësæ%ÀiyµÂÕÕU"¶·nó½#•~>}\ñõÃÕ$¬(¬sa~6c†&‚Æ©¹Ö›‹`¡TºÑ"s¤µÏ˜ÁãñpgX–aÇ1À0 ð°°påÊ(   ÃÀR•­RWëôLÌ•ì¿V®X³ ‹'~Mîkp5²5DÛ¢Q¾Ìѽ;Ýün¦ÈÍ€ekª‡ôò‹`MéZ‰ Ú`OΆZÕï+Ýg¶w&Íxé%ÎÄtppP(,ËÊd2 ÃH’T*•$IRÅçóq—ÉdüýddXXË6^Æw€£ÇâÈè(¿Ð.£àÙÕ«W¨TЧO†R3¤²W÷ ®¾íݾ¾›`Å:|”óxì¸ÈÏ¿ø*'·äâáž®  „ö«ÈŒ”ì;_¯Ú7þ¥ežnóæ¾^_h‹æSÓ ¦ê‰£ ð¸®e™Öh/É2ƒáÕs«¬’¿A0 Ãq\ ¨Õj Ã4@×®»oßž@’d¯^G.\þo²fª«u² úå«°ˆ‰˜ÐXœO>÷¬õú› –¯ËÓÇ÷ÇE‚ÁN¤ HN~ýJdïN÷ /iSÐ(I[ª :ð„uff³,ƒãþ …B1gÎøá‡„B!ŸÏW*•;wî€Aƒq‘¹ùG‹ËjLÚ)üàhl"°$°$vôŸ“‹|É=M ÕçÎ:u*591Àßϯ½÷ƒ¬ì3§S4mÝZ-.®R’v·Ïþ¾t$F`2LhÏ·òx"ŒµÖß±›î÷‡¾›úÖú*¹Òºå¾ëàðùôqYq‡€ª/ã HÀž¯¶‡wd²o*+-(Ô**Hg9À@Ï1 €ä™Áp«À²,Ã0jµša–eŸ8ëÑÈb•SWë¾6¸êlÊÏb F^YÙª×Î"„>ÚýãÕ¡#ˆìA¥€ê2¦¢P«Nöœ±È#úø»f©ç¬eË  !"€ ëpîÁW~xþW=yÊ”°°0®\MésçÎ]·n]UUÕwß}§_$uðõÍÎʲ ,‹Ïœ:1ŽžH– °›ÒPîÑ €„߄ܽ`ذÿ+/b(5K“,¥fh2ûQ.EYÇÊìÖÝÛÓ>û|MÜþ/Æ…V˜… ø¸]ì 9N(£‡öaÅ^}Ç—ÛÿÃâïüyôèa_Pv;±Ñ§ž ¦(¦žhµ$|UÀN ÃXd5æ H™£ãSŸ ê éV‡ª7*,+Å4Ré:¹|‰f]&M3 ÃpÕѹóŸwï¾@’$˲—/0àÄ©SƒtÞ‚јºÚàø “[”ÉÁ-ͬ{1€~q @´EŒÌ˜›ŽaÀ'€¢¡º¢âAÚ¦ÃÉñJ5ã$I1$ÍP KR I³Í4Û³K»ôÂ7TVU4öRKcÄGCÇyÂÁ_ rUÍÛ'Þ!àëGý¯.Ίáaú®ºþÁÊ>_Z¥PžìŠ T*•L&ûá‡æÎ K–,ÑÄ‰ŠŠâóù555ìl!‰1¦N 8z2@Íù/°›’Àˆê`ÕÀ’oÍYµå·½ B!YºxÃ+¯Í™õbZÒœ‚R–¡_œ2‘Û„ÞH;íߨ_ÿi)ùÅÁ®ögå,ã.•|³'ùÛé,­ü¤D±`ñ<ªº6 sx\\]þܱÇ××?ùÎ=™££µúŒš0×ù]µÖÆs×úlRkóé§Ÿ¾¿x±æãW™ë›X Åõ–;®Ÿ¦†©ë ð,£éÏ͵ŸÞsÕªºÿ>[‹‡@ Må¾L{;€JÁÊKNÜz”Lû¹™¬T*†á •J¥V×ý«TªÔÜ•Š$)–e׬YÓø?-AŽS«ÏZ3Â?Ä·I«b†¬q±sýàÌü{Á1rù°Î}ý»´ š:gUÜ÷þÂ*åj£9´ˆÛî# ×­[§mbNž<™Çã‘$É<ÁbCÓâ„êÊ«,M ÂÃnŠ|#ª3Ԝũ9/³{I^7šä™½zte)5K“YYY¤5|™$I&%Þttp.*|¤fnŽT>¼”ÅÃì\xmBŸBF ‰³o{1¥®ÍÉ+&IêÆõË`=Ÿ“A_¦ö Ž+Z¶5Í€eXÜ^Ë—/×þøÕ+ëM  ãø¬,/· P} ÞtrÚXT4€eîw¡(š¦V¦¤L!I’aX®KŸ=;døð Gö2-§ ,««¯651 &f÷ìik’31‡ È—‰@ Ú"–û2¥"`hPÉk*Ê~?Ÿùñ÷û hš¦iZ©¬U*• …B¥Rq‡×Ö¡T(ªŠÚÌÌÌÜÜÜÆKoŽ fçäät阓“ó÷ß{KKKŸ{n¬}\\\vvvãeÐpâÃÓ#—£ûÐÎÎ8†q&&÷(råˆðÈ.®¾ò_>³Yû©µP«ÕšC‹H’äóùUUOmÈP*•œMkM:ZW†za(5ÃPÕE—F³í¥n'çª<¼äÝõ¯½1wöŒ´¤9%é™Ù#öÌzôxÊØ‘mo(äwΟ¿p@¿ðW^sHw_¦‚/¶2„óžÍï¿0¡ì9±•ªex.Lv ¿žóIÌŠËWoyz8[Ël=+ó³3>úóOÍSî£ÆÄìOïÉêfÌ[2ÚŽO µ1xzz¬tww×{²²k×ýÀèèqÖ*Ú¾vÚS7ïýä? 11+W>5?þï-@ Ú$ñeòbèÊüÛ•2ÿÞ]»†TT”ÛÙÙa˜ÇqÀqŒ;âêN¡išV©xjµ*55õÞÝ»ÖðeÖ#C~~^ll¬¿¿ÿßÿ}ëVâùóçgÏž½{÷ßÞÞ^ƒIOϰ®ÿàä§g#W ‰D_È?^Ñës.ó羶󦦤K}òº¬½\·8ë“øe+z}nÅÒ•JeMM whgÜë¬Åxzytˆ=ìßq^¯QëKÏ.J’´Ûsp +àÓj†ÇǪròU²0G÷ŽÛ–}xãfREY™ÅZDgÆ\ÛÄÔÿ̓Ȼè,HŽÎÎO}6².“ã£>j|‰úde=ðóûíáÃ,x²ˆû¦¼+1ñUwˆyùСÏ=7¾‰û67ë]÷¯Q¯æ“Èz&¦ƒ“×Ç¢Í`áIFѺ îµåå%å_Nï;ô¥œœl©TÊ­ÍÇqÀ0Ç ‚ ÇqÇ 'g¦ªJ~ýz|ãÏì0G†üü‚ŒŒŒuëÖåææþüóÏ×®]‹ŠŠêׯ_tt´··wll¬Õ9ùÉ™÷Ï-\Ñs&çCsp7¶=Ïݬ蹦.¶UKW*•UUUܹ˜$Ir;Ê`òäÉJ¥òÈ‘#È­( (Ša,=çÜÒÓ^hJÍ™˜ C14å“´¥ ãäÃûT$IRtÚík,¥bHCªJÅ*–T3”’!U,MQ”5O¶/È+ptqéÞ£MØõ¾¾6é§ê¢{Bª–Šq>Q3˜s_;Ó¾ÝÛvî9RQZjõ®bl÷ŽSúÄ<1C3PçË´@KÛë³5k ¬Ë4”•ã/.ðªMÜ­$I¦§ÏðõÝ–ž>ƒ³2†éÚu7À*šK?ahšfŽé9vl‚19ëÇÒºâLF][3&fUŒnLóܹsè$#Ñ&±Ð—y$.õÃW"¬½“¯,ú¾?ejee%÷K34Ms¿½ÁÙ:\‡J¥®©©9yòdyIIãýæÈÖ¥K—wß}wæÌ™‘‘‘555¾¾¾Ý»w'bÞ¼y ¶X µvèFÓÙÚhÖå‹ûäãã£T*)ªn>:**ŠkŒÞ½{ÇÇÇW?Üoå=zd¡cÌr_¦Še(Ω17U$©V“M/û¿eÍ­º£©:C=ÙíA7Â󪓫kaþ£”{©çÏ“W êÓc¾ƒŒ/€rŒQ0vÞ¸Èå~jÖµ¸]ƒ†Žâ–”—”X«èu%%K\]?Ÿ>îèáô޺L}/&P,0—ª`EïŽÅíõáÿýŸöǯ^_œA©O”ÿd…÷Ú $Ir³"Ü^ríÅÅ9æ)mC“{ÔÄ}†:tèPÍGƒ~M}“³F­2*"D‹Âòßþ©+j*ªvÇe† ™‘——'‰4ó°ÜÜ•Z­V«Õ*•šûÅ7Š"U*UffFii©µ†ÒzexøðaBBÂðáÃY–-((ؼysHHÈ·ß~›ŸŸ?f̘}ûö5å NªHîÆv…’$)—Ëkkkù|>w.&ŸÏ'IR¥R‘$Èù/¹¡iº1’X––[—ù¯‰IS C©Õ¤JMNzj•T­R]«TÕ*UWn”ü¹/Õ*…êãÓÎçôÉ£*µÚA&É~üøÄ©U={õêÑÇÍÝà²ü^òíÄK/u êòìØi4Kܺ}Ë«WÞã|+•_‡ÚŒ…¦ý â;Fãò´¸¬Öëâ —ýTbÓŽaØíÛºvݘ8že™ððCññÏö31µ¾ÌÒ CïÞódºœe(•šT“¤š¤8Gfü­r.²M…Ñoú²Šš+WÎ8¿¼²VxøP¬ídà Í&aL‚Ðy: c”@kmÙQ[>O¬L€ó燳,KQ$·4“$Ÿ¬à}2qÞ,rÝ©^[óüùóð´‰Ù,Ò"DÓ`¹/SâèÜ-))™en/9þäÌä:×I’,ËÈåÕ™™ÖýÖnŽ íÛw˜;w®L&ËÏÏ;v¬B¡HOOçñxfjj1?þÃ`x¸.R’“ sPç˜ÑÃþèáCk `Y&ì¸ /½_¯žËy4Õ$©VS*5y6.O§é<99¹?lùÞ@~n^S–ûea!|`Èâ!JZU=˜°5µMÌf•@ šË­Ì´ÛNhZK†ÞýúÅÆÆ&$$ìÛ·¯¨¨èâÅ‹GŽùý÷ßçÌ™£óÓ8ˆ&FÛÖl^ûRCAÓÚ—Ú ƒ²aØÖD&&ø/a¹•ÙZˆ¿zUs?hÈââb4Ä·(Zˆ}‰@Ø[™˜â?EÛ·2µ¹tþ|s‹€@ þshlMdb"ˆÿxýQ=º‡…5·ˆ€ÚË|lWWÈÄD ÿ5•‰@ °>ÈÊD @Xde"@ ¬²2@ ÖY™@ 냬L@ „õAV&@ Âú +@ a} ÿöOê;M,@ ¢-aØÊ mb9@ ­”ÜGôÑŒ9@ Âú +@ a} Ϙ#œ»“¹5öZzn1I3Í-‹Õàx Û£û õonYD Y™ÑDÜÌ|üÍ ó&Œôóíx~êáÃìoöŸ’Ù #üÛ5·4¢¥Ð††9㤧§}æ™32ÚûúâÁ0mg¹žù°,Kðx2'§êª*‚Çk{•À)H`ÏonYlÎçÖ&›O›6ßWõáTnïëû0#£GïÞÍ-¢5Ñjö˜c6uÊ”~üQ'¼¬¼üÕ×_÷  Z¾bEQ\xiié´3:øùõ8ðR\œ&¾B¡xoñâÀ  ÿÀÀwÞ{O¥Rqá?ÿòK÷ððö¾¾¡=z|¿ukÓ(ÕŠX¹jÕŠåË'Œ/àóqï߯߷7‚‘úOOO÷ðöÞöÛoA!!añññ?üøcPHH·°°øøxM„?ÿú«GD„¯¿ÿ¢%KÔ$Éd:Ã.]»v¿víÙ`kŒ<~Ò$š¦;øùuðóKNNnÍ-¯ªÂqœe˜ÿò%•ÉTJe³‹a»ËŽÀ ÚðeG`Í^ÉMsµù¾ªá!¯ªjî‘ÑÊh5V&¼9gÎö?ÿ¬©©Ñ\°p!ã)ÉÉ—/]ºzýú×ß|Ã…/|÷]™ìþ½{GÚó÷ßšøK–.•Ëå7oÜHºu«¸¸ø‹µk ¤¤dÙ‡þ¼u룇/_¼8dðà¦Ô«åSYY™””­ÿÈXýÓ4››{7)iú‹/¾úÆe¥¥w“’^š1#æ“O4.^ºt5..áúõ;wî|ýõ×õf˜———’œ—ž‘Q]]-“ɺ7‹‚-–òòr Ã\œuÂÕ?Çü·Þ"":::??ÿíùó¹û”{÷4–ô‘½½½‹‹Ëû‹ÿ½o_½¾5oAãÆŽ½—š Æ[Ó`dmZls7»¯¢%\m»ŽÖ†/ñòÇ·í¾jLe¢A´šu™oÏŸ?uÚ´aC‡rKJJ ÷±}ûöEEEšpŸ'áíÚ·çnŠŠŠ(Š8d÷‘eY‚ ÀÁÁá·_ÝòíX²rÅŠÞ½z5V-GGG–eËÊËŸ^÷m¬þ€ GGGðù@*•r÷š% †µÓj í†3¡Z­ã­i0²6-¶¹‘Ÿ€£ ׃‡mt뇇·áæÓç?¥,a­ÌÊìصk×}û÷s]]]àqn.g—<~ôÈÝÝ]ž››Ëš¹sñ]\\‚¸}ó&gôh©&É­[·Î™;÷VBBSéÔ pttìÞ½ûÑ£G_š9S;ÜXý›˲š„¹s›º”¡‰ÖÔÞúÛÞ2›û¿°ÀÚp= ¼­n0çxn>}þSÊ"КfÌ9¾ýö¯Û¶q÷R©4räÈOW¯®­­---ýjýú&MÒ„¯^³F©T–––~³i“&þøçŸ_ññÇ•••PXXxáâEÈÏÏ?}æŒZ­æóx"‘Ç[_µØšU+W~ºzõƒÕ$É0L||ü‚wÞ1Vÿf²æóÏkkkKËÊÖmØ0yâD0Þ 1ÖšqttäkB nîfŸk WÛ®Ηن/!͘·å«¹ÇHD룥ü}5Ÿ~ýúuÐ|üvãF•JÚoÀ€ž={¾÷î»\ø¦o¾)++ë4öùçµÜùfá]ß:vêôÜ„ ©©©@3̺õ냃;øùýµsç–Í››X©–ÏàAƒ~ß¶í÷?þèìðÑŠÏ Æë¿^‚8`@¿{öî´hÑ".¼AlMƒ¸ºº¾þÚk‡ éÔ¹óí¤¤–ÙܬmÈÎÉi£Ì­Žíê¡% $0›n¾™11:¢KGŠTiÞ¼~uÖ”ñáºwòž8æ™#û÷Øp÷5o 7eooQ}µioî1ÑúÀ€eÙÒ'«ß òóï&&ŽˆŠjV©mœ–FzÓsñÔ©v;š9ñöí-?þ˜zÿ>ã=#"Ì›×áÉâã–ÃÃìì©/½tíÂ…¥zœm~=˜/É 3fØÛÙa8.‘H"zôxuÖ,?__M„Ĥ¤ý5åÞ=š¢üüü^œ2eLd¤ueàØ~úú¢y¯Ú"gxü(ç™}¼}|ÞÿpEôsã¹ÀË/Ì{}Ö§_¬‹ŠGðx7®]ݽcûºMÿ³‘ ¶ü2sDÓq†Œ ,€R©´·³ã/œ:e#‘Ì¡éûª¦Orýüü~Ó;§¯ò8;{ðÈ‘Í-¢…rúر)³fiìÉÓÇŽM=»•­ËD Ú0fº nÝú`ùòÿ[²dØ!$Eí;pàõyó~ûé'O[Khø?lá2ÁqüüÉ“PUUuèŸ^;÷§-[:ùùÀ›7—­X±tÑ¢¯×®%püvròá£GGÛæO)w’‘Ø·{çà¡ÃÂ{öÚ»kǸçë¬Ì5«V,[¾rüĺ•'ý è7`€­$0o÷×Ù993fÏæîáI£Ó4­ÙÃ×ô4q_ÕôÉÆgÕÐzkÞzFü§h}3æD[…1M›7Ï}íµáC‡b&àó§½ðÂÐÁƒÞ¶a˜¬‡û ÊEËzøpà3Ïè*ŠÏ¾ü22:zDTÔ§Ÿ®T*¹ðÝ{÷Ž8qHdä³&üµkXUUµâ“OFDE=3f̪5kLäÀ±÷ÀQãÆ8ñÖíÛ ÃÌ[¸a˜¡‘‘C##SÓÒÌÔÎüzhšl%Éô)SÆEGÿüÛo\ÈÆÍ›ßš3gäðáŽ@nÝ–/[f †8Ža6ºþÞµcÜø ÏŸpþìéÒ’bꫪ’“nG}Îv…ê\Üî3a˜'çàáÃÏMžüÎ’% Ãü½ÿs“'‰Œ|eîÜœG#Œ1Ôoëíí-§¯L^^Q±lÅŠácÆDFGoØ´‰$IÆä{­©73×®gËdF ²2Í@çÎÑt¹>欋ªªªº—–öÌСÚ#‡OHÐ,œÒ^D¥sóåúõÕ55ûvî<¸gOyyùÖ_~aY¶¬¼|ýÆ«cbÎ?¾ó·ßzEDp‘Wù¥J¥Ú¿k×ñC‡&Œg"–e†),*:ºoß³cÆ|·e ˲ß}ý5ŽãgŽ?süxç€ó~™³Aèd;xàÀ¤äd–eåryÚýûöE¡úØn÷Oµ«ùùyQQÏvìÒåàÞ=•åe†¹¹º4éî³Ñ4 Ã0©÷ïïÞ¾ý«5kX–mçã³íÇO9Ò¡]» ›6iâèt0cýÖto7˜U³ôUƒÉ?ýüsÇìÛ·ã÷ßo'%ýúÇú‘Õ›9ŠkÇ·Lf¢A +h)˜³Ç³¢¢Ã0™L;ÐÑÁ¡¼¢B߫枻©U(Nœ>½pÞ<{;;;¡ðå3NŸ=Ë2 Çy‘]S]-²·ïäëË2Luuõ…‹Λ'²·Ç1¬kP‰¸"^œ<6xpfV–Å›p-HbA¶2‰¤J.×Ô§L*mš-ºÜIF¶¸vïükøðgd8ÏŸ¸{ç_8ÎÎN,ËV–—ÙtËÑÓ»°Ç\»¾öòË<‚àóx,Ãô —I$ŽO?þnJбf°ßÖÛÛ[N_e&2:š»öìÛÇ2LuuuÜ•+óçÌòùŽ2Ù«/¿|üÄ ý²ŒÕ›9ŠkÇ·àjâ!Ñ@ë2ˆ–c†«@*•²,[V^Î;ÏQZ^.•H¸_Óä£ùWsS\ZJÓôŒW^áR±,‹ò"±ø³U«vïÝûÍwßøûÏ›3'´kײ²2ÀÝÝ][*c90,‹ã¸X"aX–Ïç“$©#ŒÕëÁ‚ µ³-¯¨àjL"‘°,[QY)“ɬ[¨A„<Œ°ÁºL¥²öà}4M‡uµJUYYyïîÐÐÐî=züsäð˳fY¿TCy˜™Í§Ý?q—98h>zôÏ]»ÊÊË€¢(cÌ`¿­···¾Ê‰qüÐ!í²²2pssã²õðð(-+3ñ^k×›™Šk×3Ñ +h)˜ã*ˆÅ]þŸ½ûk"ù>)@Bo¡J¤‰ ЇŠÅ Xî°‹Ä‚çù³XQAÑSOìDA¬§wžâ݉ŠÒ<+=$€ô;ì‘7BB „@˜ÏÃã³™ÌÌÎî&ë7»³3ff¿?~<ÝË‹Ÿøè?;8 <‘@àñxM‘H¬¬¨ø¯NìV§¬¤„Çã¯_ºD¡PZ¬ÔÕÙÙÕÙ™Ë寯Ço ‹½pA™NÇPRR¢%00¾ÈšWøÿeÁÄîÞ¬±eKžýý÷ kk”Ç£**š›™=~òdʤIݼRa$4*ûÝÛ· Â_ÿ#/'‡¥,X°àڕ˶áá?ÿ¶pÁ|:]ÉÓÓ“H$¾|ùâ왳GŽJêsìZf‡²Šøœ|ýúu_ddäÞ½ö¶¶oóòV‹ü€ ûܶÿiï%ŸUakT¦ÓÀ—®¤¤DME¥Ýïu‹ ;´áÔSàsê-°ë íþ-_ºô×Ó§ò¤‰Ë­oh¸zýú£ÇçÍžÍCQuuu ™üøéÓFçzb"øöZ&‰L=rä¡_~ùZ]]óx‘šÊCÑ2&óŸ””F‡Ç+H8Ë<ÂÍ-úøñšÚÚ&.7+'§¯¯ð—©T*Ç+e2;¸]­ëéÆ?~µUÕÕW¯_¿uçÎ÷sæ`)+–.=óèñcNSÂã¥geíÜ·OmàI¬_æåË—¾ÿþ{C}=m-ìÏßYlì5áŽrÿîÒ¥KçΞ15` ¯÷ã¦McÆxH´_¦Eð 765ñx<*•ÊijнyShlYèç¶ÝO{ïù¬¶.N"“]]\ŽÅÄÔ74°++OŸ??ÆÃƒ×Þ÷ºE…Üp±Û A¯eBPoÑÁË ¶¶a[·ž:wnODDCCƒ²²rÔÞ½zºº(GÀã–/ßèб“'}fÌxúì™`G.Àú5kŽ<ùý¢E ꪪӼ¼íì.÷Ì… [ÃÂx<ž¡¡áæõëù™FGÏš;‡Ç6ÌÒÜ\T ‚«àÿKWRšîå5É€ÃEíÝkjbÒ½û¡ã°>pã½¼ð8…B±4(úÀcCClE¶¶aÿûßÙ‹÷<ÈCQ#ï3$tÉGž€ÇãºÿbfBó¤»|³f̘Õ<…Û°aIwf%J¾Ã×2[ô/ä—RUVžëã³rÍ•i“'ÿñçŸ-òðÿú¹m÷ÓÞK>«-¶šoCpðC‡¦ùø‰Ä1£GïëÛ‘ïu‹ ÛÝpê1pTvêž>|¨¢¦ÖÙR>~ \·nÍÊ•cF–D«z^‹%Æ~è+Š ½¼½¥Ý JŒÕe0¤ÝŠ"ÛŸU¡*X,8*;$Š8£²ßŽ—|Ãú#´ÃsgOž6­u"<.½P©xŒŒö†…¥¦¥555É5÷Ƀ ‚ Þ ý;æ~Ë—÷@;ú•sÇŽføúò„Çã!Âãñxòß‚àðx@ îß¹#ªx\z•n9¦â±²´´²´ìÞ:!‚ ¨ëàÓ?AAP÷ƒQ&AAÔý`”Ù[Àù»d<¦AP£Ì^EÑÜüüwŸ>I»!P·Ç‚ êç`”)}(оÿøQDRPP(a2áÕ/)AÁQÙ¥ïýÇ(ŠÚ;8T”•}*,,¯ªÒTU•v£ .ã˜r¤¨°°gš×ËÕÃýЗõ«q?ü¬>HJ’v éÃãñJtº‰……šºzÛ9;e/Y²äùóç555 ]h!ôŸ÷?655 vrúÊfãp8=Ï……¬ÊJÍÎö›œœ¼}ûö/^p¹Ü5 ¯ž'Þ1mjj’íñº¡þ~†!¨?àñxåLfú«W¶ŽŽJtz9;eâñx//¯E‹Í›7¯k-„A<ïääT]U…ÝTÅáp míªš²¢"§3qáï¿ÿîíí}äȑ۷o‰ÄäääÓ§O{xxÀãÕúxLêë{¤™A$>%%%‡!C²32†¸º¶‘­sQ¦–––¿¿nnn×Úý‡@ ÖVW öÛÃãpê**õõ¸ÎÌw¼~ýú]»vÍž={ùÝwß}÷Ýwx¼zX7S‚ êµTÔÔª**ÚΟþ‘2¡ƒÝðx<×ñJ*++SSSg̘ѭMƒÄÔ-Ç‚ ‚z3<ßîÿk0Ê”, ‡Ã©·× ‚ ‚ ¨ÇÀgÌ¥ŒU^ž›]YQ O Ðét£Ô:óôªª*Š¢,«S¥ é–c AA}Œ2¥EÑÔ—/ ¿|QÓÐöÝwê(WÎdæ½}›–šª­«k3hP«RQQqttŒ_ºt©DÛ µ­)AõuŽ28¶ ‘HÝߨþ!ãÍ›ÒââñžžJÊÊ(ÇãñPOS[[CS³¶¶öñ£Gyyjgß¾}>>>t:}Ú´iD"ñŸþùõ×_OŸ> WOêÞc AA}Z§ûe’Éd;;»ÆÆF2™L&“%Ѧ~¢ðË—±“&)«¨´~‹F£yŒ_R\ÜñÚF}ãÆ'NhhhÐéôàààñãÇx¼zV÷S‚ HfØ:8dddH»=­ÓQ&ú-I´©ŸÐÐÖ¦++‹z—F£ihiuªÂ#F<|ø°ªªªººúùóçØ¨Fðxõ¤n?¦Äår]Ý܆ *˜XSS¶s§“‹‹±±•Íšà`&“Ù¢àù‹G¸»ë™˜Lš<¹ÁÔ»UVVªkiëZXYE:$­– ²·—˜©#§Ê®«¬¬,++³°°»¸ØÇ]ºG >c.5&¦¦íd07ï™–@ÝEZÇôÌÙ³DáÓ§OuuuXJUUÕd/¯>\»|ùó‡< …EE‚¥bN:rôhôáß?|Hýz¾ŸŸ²è‚ Þ 3+KMMíó‡Ÿ>E<þéóçvKaO"v#›Íd2;3u{ºKGN•Ý"'7×dÀyyyñŠ‹}Ü;{¤ºŒ2¥CDÒÖÕm;¦––ìFÙwHë˜~ýúu_DĈ…œæ~Ÿ?ýïêêê'Oœ0`@WW÷@D„½`ÁKW®,Z°ÀÎÖ‡Ã)))ùúø`}* Œ gΞU×Ò*++D9²&8+xìĉÁC†èN1{WhbÜõë^Ó§oÜ´ÉÌÂÂÒÚúî½{Ý»áÔedf:88`ËÎÎ΀úúúòòòÙsçZXY1 |fÏ®¨¬\¸ti¦·÷šà`3 ‹_Ž•ÇÛ×w݆ fή®oóòŽÿú«ÃàÁÌÌù+mñíþðჭ½=Ç3µ°0³°àr¹­ó´nÀ¿ÿþ;ÓÛÛÈÄÄÈÄd–OÏï:¡D*Q=mïè¨od4ï‡*;¼»D÷²²²ZYaË­÷Õ¶;~˜?{wëöíÓgÍâ45 ¶S¼ã¾~ãÆGªçŒ2¥†@lçÑ+Ð3-º‹TŽiÄC† 155ÍÎÎ^‹ÝºeKÛS ©(+Ÿ¿p!!1‘Åf ¦+++×ÖÖ¢(sê”±±qUUŠ¢gÎ[ºd à`TTl\ÜÍ7Þ¿{glh¸#,LTbvNNzzú˜Ñ£ßæä¬^µj݆ ݾíÔßddd vpTUU…ïÜiannnfVSS³: ;333=ýëׯ§Ïœdee½|õjª—WþÛ·Ë–-•çÍ›7³fÌx›“3ÐÊÊwöl"ðêÅ‹6ŒŠÂÖØúÛmll¼cÛ6¯)S>øÿö-‘HzhÑ€e+VLš8ñß¼¼¼ÜÜM¡¡ÒÚ‚Ú8U†íÜùðÑ£ûwï¾{û‡ÃíÚ³tlw‰:ïeçä ´¶"Ζ«W'?{–‘‘qæìÙßÿýì©Sòrr‚íï¸ïÞµ«Å‘êù££LêÃ>}út2&&tãF€¹™YVv6àÏ'O´µµµ7jRô¡CÇÿß¶m–úÌžÍïŠDWRª­­ýãñcccc+K˪¯_ýþ»ŽŽŽµuyyùƒOüò‹¾žž¼œÜ¼yóÒÒÒ„&²srV®;v,Ÿíë[ZZÊ¿¡Ax2339bbn>lĈºººØ«Wñx¼‘‘ÑðaÂвòHwwì‹–™•°råèQ£òrr¢ò­Y3tèP<oiaa5pàâE‹ðx¼•¥%ÂåD}»3³²lll°&µ‘G°………‚ <ž¼œÜ`GG)í¿oˆ:U–””œŒ‰‰9qBKKKAAaª—Wzz:èÀî¢Ï{ÙÙÙ­¬Dí+U•þþ«V¯ŽŒŠºré’’’R‹&‰}Ü ç/‚z»ººº’ÂB‡PTM[[__ŸÿÖŽðð±cÆ :`mmýðÑ#™Ìf³õõõIí )`dlyð`äÁƒiii³çÌ9zìØ®;*ªªMMM¿ž<¹68øü… uõõgÏ X¹’D&ÿýü9‡Ã;aVŠ¢¶¶¶BIdrnnî®ðp¬ ŠŠŠªßŽKÿæÅ‹îÛIÔàpD"QEMMUM­[ ¢¾òyùùY C0ÿ¥Ë—?þîßQ­¯¯?|è‰LÎÎÎ>Å?ˆÊsäða,OÞ»wž“&aËï?|°´²õ•Ç N›6 ËÜFÁœ=}zoDľýû'Mœ¸{×.±8Ä?tmŠ:Uþýü¹£££¾ö²±±QCC£#» ô¼‡¢hNn®ƒ££¨}ptqŠ:UVVV*R(ü—I·oOœ8±#»KÔyïã§OÁ@_?))©õ¾deeÏ›;÷Üùó>ÞÞ-Þû¸·8R “G¡#»·]0Ê„ ^­¸ @]KËÐØ˜ÛÔÄ?9P Ý´iÉâÅü¾5_¾|9zô—‚¯)Sþ·uëÎ]»‚‚‚(dò»w8ºq£à—Q‡¹¹¹9ØÛ755]ÿãñãÛ·nao)++G9²õÿ())ýå—•+V`=JÙØìÝ·/--ÍÎή®¾þÙ³gc<<„&fee„«×®=}úôÈÑ£w’’Zlšàæ@P?A¥Ñ˜š~úø‘F£ &CÔW––Æ‚„/''GGGÇÒÒòëׯCC™L¦¥¥åoZ[[c?;;’§ººúó—/ÖÍ·V322°–B¿Ýõ õõõü^æBóddd6 éöm#CÚšš¯ÕÕ-yîÊ© +ûSÔ©ÒÑÁ!,<üÇzzzQ‡}þòå‡~øã?ÚÝ]¢Î{™™™µ¯Š‹‹½}|¢"#GemcóôéÓß|b÷GJŒ£Ðîîmì— A½ZCCƒƒÁmjâñx‚éW¯]+++  Ój6xð`*•š™™©¢¢r'))%%ÅÄÔTK[ÛÛ×W^^¾Å,êeee ,ÐÒÑ102ºpñâëלœ°·”••¹\.ö{šF£UUU-\°{kĈ«fz{khiÙÙÛ'$$àp8¡‰YYY¾>>)))Ú::!ë×ŸŽ‰±´´ì‰ýA½YQ‘ÓÐÀiîÉׂ¨¯< =# VÍöõmâpô ¦Ï˜1`ÀKKKyyùÌÌL[[ÛŽçÉÌÌ0`…Lß^úíV¤P–,^lkooni)*O‹üù矣FÖÐÒšº{×wÁx-‚ î—™•%Åq€!¨÷q H¸^°?eù¼'îî…Q&AÝ/;;ÛN^APÏ{­Á§ ê~EÒnAP‚ç½ÖàµL‚ ‚ ¨ûu:Ê ±´´¤P(êêê .¬¨¨D³ NÉÍÍ% ÌmøôéÓ‘#G*))©¨¨LŸ>=//¯ãe[¿‹Ãá¨nÞ¼Y\\ìéé©®®.Þ¸AõŽ2i4Úµk×jkkóòòüüü$Ñ,Hl?ž6mÚªU«Ølvaaáˆ#ÜÜÜ>þ,v…¡FÀ´iÓðx¼——×ñãÇ»±ÙAɘNG™Û¶m³µµÅápªªª6lxòä‰$š‰mýúõ?ÿü³··7‘H¤P(k×®>}zXXøö²enn.v%rôèÑ‚`×)_¿~Ý‘Uhiiùûû[[[Kn+ ‚ êëºôôσº«)P×UTT¼|ùòÎ;‚‰¾¾¾‹/Uä÷ß·±±©©©‘|ë ‚ êGÄ2ïÞ½»gÏžÇw_c ®b±X8®Å|£šššåååb׉ ˆ²²2ÿå‹/ÌÌÌÄo"AAýƒ˜QæÍ›7—.]š 8—$ujjj(Š2™LÁ@³¬¬L]]]ì: Beeew´‚ ‚úŒZOQÅÓ%âD™çÎ ¾uëÖ°aú½APW¨¨¨ <866våÊ•üÄ«W¯zxxäååáp8òòòL&{× æK€ºw†Y‚$‡ zø QQ7zšW£§*g¬® í†ômþ>|xëÖ­÷îÝsvv–Dƒ .Ú»wï¬Y³455§M›ÖÔÔtìØ±øøø/^ôõõi4Z||üôéÓ9‚åWQQA¤  @OO¯ãkihhàp8ØiõCMMMÒnBï%'''í&Èšûÿ¶3n`æ—u%â|G¶³A|7¯\õVN%å5›zíÇÑ=ÙÌ»wï¾9RŒÞóòò\‡g5_Bê%:e‰ÄÑ£ÿÛõ$©+}þ n7zôè7nlÙ²eÑ¢Ex<ÞÝÝýéÓ§FFF99¹ÈÈÈ+V„††ß¼y ©©`mmÃá?~looߢBì tþ˽{÷®\¹’L&c/±E{fë ¨wÁáª**ÞfeU²Ù<OÚ­éfx<^YUÕÂÚš®¢PðÇÇ\Îñx|ø°¨š…qø1€ @]MMú«WfÖÖV²×ù„ÇãU²X©ÏŸ»¸¹Q\.×gÞüõ‹ÎC‡òÓs²³m ŒÚ(+3px¼ƒáâæ–š’¢¡©©(p¨‰ŠŠ6<Í›7oûöí›ü‘ÿ½|劯O!f–ð™HÀ­ôйzª­lóæÎ½pñâÎðpÀùóççÍ»k÷nì­“'Oî?p€ÅbY[[Çœ<9`À“É\æïÿ×_é2«V®ÜÊb2±P~DDXx¸‚‚™S§\]]ùñý¤É“ÑÒÖDGG/Yº ú——û/_žœœ¬Ë`¬Z±‚ß¼ÚººÐÐЄÄDA¦zyØ¿_ZÛ`7aè?Ÿ?¦¶œAPØåå ŠÌ†˜Ôµ´ØÝ¢Ð6©ª©Uý*XükU•Ž®nÛ¥dŒªšZMu5Ög½ð£"Q&{z²Øì¿þú {YYYyïÞ½¹sæ°Ùìïýüt #£¡¡-úBðC-mí´´´“'OZ ¨©¥5jôè÷ïßcy˜Læô3´´µ>£Ö<¶Im]ÝêÀ@##†¾þÊU«zlWˆÃýïÐû²†ˆ»{|‰„v¾ÑsçνËår 3³²&N˜ÀËÄÄäYrraA©©éú °Ä+Wª©©}üðááƒ×bcù™)**ú7?Þܹ?mÙ"¸Š;II¡´¤¤´¤ÄNÄx>+W­¢Óé?|øíþý+W¯òÓƒ‚‚ª¾~ÍÎÌÌËÍe2™á;wvft'eBÿ100¨iÅ@27} H6ðx<'Ã!&ÇÓåEù¹99¹99‚)x®EÿTEåˆDÁ<2ÿ‡í‰öÓíTTD&“gΘqéòeìåõøxssóAƒ-_±‚@ üûîÝ«/þþûï}‚¥¾ qìì:9õž§#SY[RK«šÛn|r0¤N¶Wm·”¾¾¹¹ùo^º|y挂½AF¥ªª*''çïïÿâåK@uuõý¶oÛF&“ÕÔÔÖ…„V¸z5@˜êå••Ý©–WWWß½woÇöíd2Y]]}ݺuXzm]]l\Üî;©Tª¢¢âúuëâãã;Us7‚Q&AÔQü+v&Nœ0qbAAà•¼6Šô@’ÝÄˆŠæÍ{ãæMìšâåË—çÍ‹(a?ÿL!“5446mÚtYô× 3‘S¯ qÚUÇA×\xŸ]X7voÆ?ïª/ýÍüijG¯­|?oÞ…‹Ï_¸ðý·•OŸ9cko¯­«;yÊ”ºº:6t ƒÁÀ2è5/6ï ™Lîì°Xµüña ôõ±…²ÒR.—ëä쬫§§«§7uúôªoï0ô$Ø-‚ ¨Û)± E?þøcëD,„b–—Ïòö¾rå `–·wBB‚†è©P™{XÇM^^¾çWEEËÆîÍ8±ÐìÒßÌ›AÛ-åêꪦ¦–””4xðà—¯^]ºx Pô›CƒÒÒÒ6j8}æÌÁÈȲ²2vo]TäÄq°—(Šñ6¶Päq϶ØyGçü•ÿuäÎtx Tn¿€©S§†¬[ghhhgg———‡%²Ùì àà¤ÄD77·ÔׯÇÀæI)**ÒÕÕv¤~Á›$rÃ]óöÁªåDø¥yð#uuuð6'‡F£up[$^Ë„ ‚: »Vççç6ÄÉiˆ“SxX˜ŸŸŸàe¼Öedéár=<<<<<.Wd6‰Á¢¢afJ_j;Í›;÷ÒåËW®^ãá¡©©‰(ü¸äó—/ZZZ‚ùC,r:røpqaáí¤$ì(ó#',?râ‡8EEÅ……½»¿®Šüï›-¥ÝÈåÙPÉÖ^‘B¹sûöù³g9‚ ***çØ±cX"F7vìö;Ølöƒ;R¿²²2‚ ………=ƒJ¥&&&666ÿõW~µÆß¶}{}}}yyyÄþýüô™3f„nÚTUU())‘âdà0Ê„ YðúÍ› “&i3 ƒa#Fܹ{—Ÿ¯ªÑ‰!šEåÏËϧ«ªêèéa£<<º­ÝPŸƒ¢E/œ;7ÒÝ[éî~áܹ6,T†þ¸²pÑ"*F¥Ñ.ZÄE¡Ù$J¼¨hΜ9<~|úÌ™ysç‚æeëÖ­uõõååå»wïžíë+˜_0ÄéTäÔ«BœR â/4;¾Ðl¤½SìíÍÌÌS´µµCÖ®íá1ØÉÉÆÆ†Ÿ~ôÈ‘’’CÃ1ãÆÍ˜6Øë»þË–a7¾srröîÙ³&8ØÁÑÑE`Nœ£GްX,C#£q&øz{óÓ£££H${GG- “&åäŠiUÒàsêó8Ž·¯ï†uën%$àñø7iiœÆÆÎV"j´m @(1—Ë…C¢H•JõôôÔÕÕ•——ß³gOë D"q„ \.÷åË—Ïž=k;½mØu,ÁË–-^ -ÒÂÛ·o;9ÕTWcþù矻wïVTTðÓù9]†­ì7¢(ºrÕª2&óz\`æ¬Y+W­úåèÑžü ‹ŠÑþ-«ï`C—ŒŒŒI“&a)¿=4ÀÄDNNÎ×Çg}ó³#~ˆƒÃáîݹƒENšššK—.¿qËsôÈ‘eþþ††zúúË—-{šŠ¥GGGÿ´e‹½£c]]ŽŽŽÿ²e#GŽìž-ïnÉ$7/+`â.þÚÎÏssóÖÈš››ó‡dß¾mÛömÛ°å5Ø‚––VÂÍ›Øò»w5µ´ZTůA0qDÄþæ§²lmmý~ø[^ÙÑ%ðÿêóŠŠŠ˜Læ|??ì9ÇÁŽŽXú//Atôô÷ïÜyñòåÈH‹e=pà¯Ç0 /?è°a‘îÝ·ÏÄÄ$7'G0¿­ˆ±3- &ÄÇ×ÕÕ…þøã­¤$A¼&OŽˆˆ )(ÊËËW¬Z•üìCWwÅòå›6o.+.ÆŠ³™L¬*·ï¾++.­Ë±woø®]òòò§Ož:t( ªªj݆ ÷<@QtÊäÉG£££~ñòå…æXBCq8Üž]»$ºó¥EѼ¼¼´´´©S§ ÍàîîN£Ñ>¬  0oÞ¼ÊÊʬ¬¬6ÒÛYXMlã-Aü—/ÏÌÊzpÿ¾ššZöÿkë"Òî܉¢hȺuùùù·È$ îÚµ)S§†„„ìˆè±@Óâä[Þ 4 Deæw°ì½;w_ª««_ºp¡Ež6BœFN 7…8m›6{v­+77‡ÃYXXìܹsª—W­Zº`” A}ƒÁÐÕÕ]¼lÙ¼9sœÖh¾ë}+1qè°aük슊§Óh´€ÀÀ›6Å^½ @$--íUJ ÀçÏŸó·M° 8$¤±±1ãÍ·hÉ’]»vaÿ'Òéô÷ïÞÕÖÔÌýþû¶ëU ‚ …EEy99;wïÞ²uëo÷ïV2ÓÒ(Êë7o¾>>»vﮪª¢Óé\.÷z|üuÑUdUmmíëׯÕÔÔDe°µµ½ví‡Ãáp8ÏŸ?·µµÅ¢IQéíè|´'ôZ&–ØÔÔ´hñâŸ>Ý»s‡N§ÿÿÚES†¹¹åçÿTÕ××o Ý,ì%I¨­­å45ÅÇÅ‘Éd¬1d29>.nó–-µµµŠŠŠ=ІK3-{`-×o#'1TTT,Yº”ÉdÊ+(LõòúhL‚Q&õyrrr÷nß>¹ióæ?uq9M8!h¤»;¶°léÒY>>üôM7*((´½ AôŒ°å-›7c÷¿øëêêâ®_ÏHKæ¼Y»vñÒ¥Û·m«®®¾wÿ~Vz:™D"“H!k×þ0¾¨Uˆª{wõªUaê”)ÇŽTWWß¾};ýõk%%%À''€¶–Ö0W×› óýü>z¤¦ªjog×±](³¨T*™Læ?>\ZZúÝwßµ‘Þ.1ùHó¾ÿžÅb%%&Òh´ÿ²µŠ2Sž=}Š¥=yòdμyS&Oî±Ø)Ê¡ÈÈm£Ñh­%d¼‰Š¤WÑYý6rƒ««kV¦È)+eŒ2!HF<(c2C7mò_±»à'èì¹s‘‡ý7IóÀlA]ô4|áËÇü—yùù‚KKK¹\® Âæ±KZŒu¢ß<œ›P¢*CÊ‘š‡”c2™(ж®pîœ9§NŸžïçwõÚµO3ôOØh;üN·ØH(m¤·KœpJD”Éãñ~ÿý÷;vШÔÿσ¢‚è (øßðæ•äççïçwòĉA66R¿“ÞŸõÛÈ ê8eBLÑÔÐ œ4e h5IpHHâÇÇHo]Vì¾eØØ%Ù-†gÃîÝbfAó½xy99þØo¬æ±ßDU"|355q8 8>OOϵëÖeçäÜ»ÿçíÛÅÛY‚ìH$±€R^^K•Þ>1®eŠHÄãñq±±³||”••}›/®£„"nجÍüJØlöôY³6nØ0aÂ`BP/×鑌îß¿ommM§Ó]]]“““Û/IXnnn/yÈë¦#8úÍ›7‹‹‹===ÕÕÕI$’´(›Ê˜Ìƒ‘‘X WUUuòÔ){{€2ŽM’ à45ñÇ"9~â„Ðzów F›1}ú›7ÿ7vIiéŸþ‰¥7nûÏ?×74”——óÇ:a0T*õVRRcc㉓'Û®D(*•:ÙÓsó–-ÕÕÕ\.÷å«WX:™Dš:eÊ’¥Kn€öO555õõõü¡µ´´°‹Ù¢ÒÛÕ‘io:XàæævéâÅÕñ7n|3qNë©tPEÑÆÆÆÙsçŽñðX±|y»-é^µµµkÖTUU &VUU®YS[[Û"sw:’Ž2íììbÄyyy*•êââ’žžÞvzÛÚQRH°·FyöôiÿåË“nßLoEÑ• eïž=] Å@"‘ˆrr³¼½ëêê°”ºººYÞÞD99‰Ô"³Ø‡‚dL§£LmmmìæŠ¢8ÎÄÄD­‚ÄwäÈ}}}EEEƒ‰%ÖÖÖ.[¶L]]]EEeñâÅØl¶ØÐcÇŽijjêëëó/Kw¼†ÒÒÒò÷÷Ù@]§¤¤t:&&7;»¤¨èÓû÷Ξåw…Ü·gOÁ§O_>~4hжÿý¯¤°0ýõëÀ€lä s33vóo­óó[gkB&“#öî}÷ömÑ—/¯^¼Xîï¥khh\-),|ñüùˆ#øù˜7ïó‡™ii+–/Ç#ªÁu™›™ñ3Óéô˜_-øôéó‡Gæ×l``@&‘úÕã®6lX²d @ذaÆ ªªª!ÍóJÿùçŸ555«W¯^¼xqff&ÿArQéí@Q€¢lKpª›o^Š("|v(:~ܸ“'N,^²ä·ß~RD åêÕ«ÉOŸ2ôõµuuµuu#öïï±)pìÛ½ÛÔÔÔwöìúúúúúzßÙ³MMM÷íÞk½Äë—™ŸŸ?dȯ_¿:;;?xð ÛÛ‰­¬¬lõêÕÉÉÉÆ «ªªúÜ<¯×Š+?|ø€ÃáæÌ™³uëVlôfA Š‹‹·nݺaÆ¿þú«³5@Poó˱cÓ¦Më øö˜ÖS™³ÙìýÍÓÍq¹Ü¤¤¤¤¤¤yD¥· »P·`ñâ  ì±ô'OžìŒLZh‘ÌLMÙL&ÿ­Éžžÿ?ä–@:–³¬¸K©b³;R¹äD<¸lùrß9sêêêØ#wðâ%‰"Î “fff•••eeeªªª?ýôS·· ›¼¼¼œœÜÛ·o«««ét:v9ª¶¶öòåË ÑhT*õǼví¿HHH@˜9sfff¦x5´€ ˆ²þàv$iuuu ƒß>ü14TÚm‘q1'Nüoûö—¯^½|õê۷Ljèé+{‰cÇjª«kª«O;FèÀ<ÔŸ‰ÿȈººúÖ­['MštèСnlÔÊÊÊñññ ²³³Û³g««kII —Ëåß°F¿ FEE@&“±'L;[Ck¡²²R²Û õM‚÷»%B¡6_}‡$Ç455/_¼è1f àÑÇšššmÁáŹœÑkñø{wïˆrrÒn õv]z0™Ëåöüü­PÛ<=====9NTTÔœ9s>~ü¨¡¡A >þŒ_Ý5@Ôczx(l~Ȩ§§—˜€-´]/[Q&—AÔé/ÿ­[·¾|ù())Ùºuë´iÓ$Ð*HL………÷îÝkll”““STTÄNîJJJ¾¾¾k×®Å.1?zôHr5ÕÐЀ]+mhhèÔ“Cõ*xVVVVVVøoµ.‚ëzþ¸@PïÔé(3??ذaŠŠŠvvvæææQQQ’h$AvìØ¡¡¡A¥ROŸ>}þüy,ý×_%‘H4mäÈ‘m›@ ”–” ²mûö€Õ«cš§É…ZƒQ&$&ƒšši·‚¤ EéÊÊC† “v;$¬9Ä;a‚¥ ÐÖÑilläñx²ÝuWPPèÅ-1¢¢?ÿüó{?¿ƒû÷_%‰ÿý÷ù Ú2¹\®à„¥-^BØPÓ'~ý{y2&&,<\AAáÌ©S®®®€“'Oî?p€ÅbY[[Çœ<9`ÀÀ‰'ö|¸àµÆ¼¼<×áÃYL&–x(*jÏž=&¦¦û÷í|y+!Ah<„•Ú!fMš<A-mm@iI‰4·_2¸\n\\œ¥…A¢¢¢óóÃwîüiË–GLLLž%'Óh´•«V­ß°áz\“É Y¿þáƒ..._¿~ÅFì5r8Ù™™8nÁÂ…á;wþ¼c‡4·­ûÀ(‚ HMMMÒnBïCðÞ£ªªêMZÚT/¯æGäMZÚëÔTE?þ,øˆŽ‡Z‡Yw’’†¸¸Èd|‰ ˆ®ž` •Õ‘æ‡bW¯&S½¼Žþò –2jÔ(lÁßßÆÌ™ yv½¼ü|kkk%%%l®“ÚººØ¸¸ìÌL*• X¿nÝÂE‹`” AÔïápUo³²*ÙlÙëtˆÇã•UU-¬­é**ØMó?>äLÑ:3F361Ñh5PiIIÞÛ·5ÕÕ2?Ö‡S¤R ÐÓ×ï=£f²Ùl§¦¦Öñ"›7mRPPhý²íx¨u˜%«BQAÿe^^@PVVÉdþïÏÓgÎŒŒ,++`_:~éâÅè#G6lÜ8hР°;œËJK¹\®“³3VªíÙõúœö£Ì­[·ö@;úi7‚ nPWS“þê•™µµ•ƒCï‰*º Ç«d±RŸ?wqs£(*¸\®Ï¼y¢2—•–¾üç"‘(ø›ÅÊÊÌ´±³Ó70ù œ<¯¤¸øÕóçý^󤊊 Š¢l6[õÛ³D!êcW ¾l#fõgl6;(88)1ÑÍÍ-õõëqãÇcéÆŸ0~<‡Ã9úË/ .ÌÎÊRWW'osrh4štÛ, íG™úAÔd§§[ÙÙéèéÑh4Ù‹2ÀؘÁ`¼NIqruÅD]ÄáñZ::ù _› IDATÎÇ¿~ñÂyèP~zNv¶­££¡‘Qee×a0\ÜÜRSR445©Ti·”••ííì.X ˜.'/ ‡Ã‘——///ïHUЇdóÑaA‡sìØ1,±¨¨(+;û»#äåå)ll/6sÆŒÐM›v†‡Óéô’’’ÜÜÜ‘#GJ³õݧýÑËP¨»õÀq… ¨°ËË(™ 1¨ki±B¶OnªjjÕ_¿ ÿZU¥£«Û3§Ö^BUM­¦ººWM¥¶uÛ¶øøx‡Ããñž?¾|Å =ƒJ¥&&&666o~Pºmüx¨ªª PRRòøñcQ™•••),,ì®­è[´µµCÖ®íá1ØÉɦyY„ÇÛ½{·¡±±–¶öù N6ïöèèhÉÞÑQKGg¤I9¹¹Òkx7kÿZ& £"‚ ax<žÌÏ[o1‹¦Àÿ¹¹¹KKËÿόõ蟊¢¨‘úÓÿ#ØNèUýtÝÝݯ\º´s÷îU«Wóx<+KË€U«äääöîÙ³&8ø[·$%%u¤ªèè蟶l±wt¬««ÓÑÑñ_¶LÔU7 ÿeËœœq8œ`/Æ^%ùÁƒ6F€ÊÜܼŠ ‚)æææ,&[Þ¾mÛömÛ°å5}==ìñó(dòˆˆlKŸþ ‚:ŠÝ¡°°pÂĉ€ä§O FGŠô+Úf1¢"̰aÃ’[$úýðƒß?`Ë+W¬­B¨Ö•ÐxHT˜µ?"b/ŽœàTI=^Ë„ ‚: ûY^>ËÛûÊ•+€YÞÞ Ï‹-"K8@^^¾‡× £"¨ÏQ&AÔQØÿ~~~áaaCœœáaa~~~wnßn£L5¯ âááxüDz4â I‚øOÿÌž=;88¸zRËžn?й¹¹8ŽJ¥R(GGÇ/^Š‹‹===ÕÕÕef¢*¨ ¯ß¼™0i’6ƒÁ006bÄ»wyùùª]¯lhhX¸p¡²²²––VXXX»é]/(vÆ`ä|)ªH ¹¹¹ŠT*¶ÌãñV®\éèèXZZ*˜ÎÏIWVîÎS°¸x<ÞÊU«Ê˜Ì¸ØØ¸ØØ2&såªU<¯uÎîL’yâD™ ÅÉÉéÉ“'Bß…Ú%ÁÉÇϘ1ãýû÷---l+H¶1™Ìù~~rrra°££««+`Š—‚ ØÈôôt6›í·`ž¡¡±©é¦Í›±è»ÞyþâŃ1 Öc}ÎÚ†•:wá‚ÝL@]]]`P±©©±qÀêÕ XÎòòro__=='gç˜S§4utÀ·Yóòó5›ç)Z –ùÔéÓ&ææV66ÿü󖹪ªj©¿¿±±¾‘ÑÊ€@ÔáÃßÏŸÏoä†ÐЛ6uÏ.îA¢~þôÓO………_¾|IMM=þüåË—ÛNïzA¡Ú½Ú'¬ *ä¯ù-„Ë]ºté«ÔÔ÷ïkò/½ Ë)Ý?”Ç ÉÏÏ»vL"‘I¤¸k×òóóCBBPOøÖAP¿'N”9jÔ¨çÏŸ×ÕÕ }j—ä'—˽v횣££äVõB CWWwñ²ewïÝc6?Ý ¸•˜È¿ikk»2 €@ äçæ¦üý÷ßÿüqà– A'Ož¼JIIKMÍÈÈà§· A´´´W))W/_‡„|ýú5ãÍ›œÌLfyù®]»°lt:ýý»w÷îܹzíZÛuŠªA¢¢¼œœ¹sæližlU``}CCfZÚ‡wï°á¦}}|>|ˆäÇår¯ÇÇÏéƒOKˆú}xæÌ™íÛ·Óh4ƒrêÔ©¶Ó»^P¸v2!%Dž ›šš,\ø6/ïÞ;ªªªüôÖ9±×áÃÕ55±?E-,<\BgéÖjkk9MMñqqd2K!“Éñqqœ¦¦ÚÚÚÖ † t$ÊlÁÈÈHII)==]­Ä† ˆ²²2…Bùõ×_Ïž=+íæ@=JNNîÞíÛjªª›6o6³´œ0iv=[Puuõ½û÷Þ¾L&khh„nØ ómݲ…L&«««oܰ!6.®õ*Ñ72ÂþN4$¼iãF’‚B]]]Üõë;ÃéTª¢¢bÈÚµñ7oòWº}ëV2‰¤®®²vm[!ªÌêU«ÂÔ)S²sr°šoß¾½+,LII‰H$b¡hki su½™xøè‘šªª½x»´·)..f±XöööØK{{ûÌÌÌ6Ò»^P”v£±ÁâÑyß_TT””˜¨¤¤$˜Þ:'¶üìéÓ²’’²’’¸k×”””¦LžÜ©H±+(Ê¡ÈH&˜H£ÑEFR(”™;}€!HFuîs"‘8f̘„„~"ü:õ¡²²²¦¦Æ××÷øñãáááÒnÔ£ £”1™¡›6ù¯XñÛýû‚°kœzzzØKƒÒÒRl‡ÃñÓõõõùé‚—ù/óòóg7.--år¹.üI›g7ÆVÊLQ__¿MU ˜"™Ô$DŒ6ŽŠR ‘;;ëêë{Nžœ“›‹¥G:Äb±ŒML&zzòãW99¹Ý»v‡„ vvv2¤ÝJ„Š>tˆH$ZÙØ 03;}æ ?}îœ9YÙÙükc}‘Ð߇óçÏß¶m[MMMQQÑþýû-ZÔv:ŸØ…ãó6΄(ŠŽ9òìéÓþË—'ݾ-˜Þ:'Š¢+(ÊÞ={$snn ‰D"ÊÉÍòö®««ÃRêêêfy{åäH$R‹Ì>ä$£ÄŸÇœÅbñŸ…¤ËÒÒRpÌ™3gΜ9À^³ý†’’Ò阡oíÛ³gßž=ü—D<öüy?Ì›'ª~s33¶À£ëBSÈdrÄÞ½{÷¶(«¡¡q=6[ÎËϺÆË—·Q‰àºÌÍÌÊšûçÐéô˜æçI¤©^^¢6§÷ãÿ&İ/rxxøòåË ‰D ˜3g–Ghz^^ž³³seeeg ¶El6[UU•ŸÖâ¥Ð"m¼5~ܸ“'N,^²äüÙ³†††Â‹ (àêÕ«$FsÜu!!ëÚ|¤¬áØ·{w@` ïìÙW¯\øÎžmjjºo÷nœÐCÔ‘(S°kAP/÷˱cÓ¦Mëh/Ã^IèïC‰tæÌ™3WmÛH777ÇBÌÎì`Û,^ôÝwßž¾S›cfjÊf2ùoMöô,nî‹)˜Žå,+.ÆRªØìŽT.9Q.[¾Üw΀ºº:öÈü=A¢À(‚ QWWgfi©Ç`Ä^½*í¶È¸˜'fùúbWÿ·}{\¿Ùááıcã&LÄÇÆÂyÌû´›W®´ašÜÍËËââRUQÑí5÷N0Ê„ ~­õ½o‰®«L’ãQP(”ÂÏŸ%W?ÀãñMMÍË/zŒxôðaÛãàð˜¹7#âñ÷îÞåäzxÕR‰Šd›Û¸q¢ÞJ~ð@hz^^ž£““"…ÂCQssóCQQƒ»<Š`V––‡²ko¬ß¾­¶eâeëA‰2êéé%&$AXE‘½ÿDZL1ß“ºu0‚éWþë ÜJ²è"¡´¤„Çã…ïܹ:0ð¯ä6òvV'‚ Û¶oX½úé“'md|£—kÿ˃º[W‚ IÀ °²²²²²Â«uiŸq¥@¢‡ÀP„6Š`LIQ‘»»{ÀêÕ’k[Š~ºÇ{M™òáÃ@m]ÝêÀ@##†¾þÊU«øCCœONÖÔÐÐÒÕí…QEñx¼Ò¢¢”ädG~¢¨ÍäñxÌÒÒW/^X;‡™¹ù«”'gg --ÙÛE-`;!õÅ 3 )öÝl­ES]]}÷Þ½ì¬, ™L!“7mÚ´14tSh¨±‘FKÏÈx—Ÿ?f̘ôôô¼¼¼ç))Ç ÃãñmÄR F?]M‚Z[[ë7þ©S§ü~øËå:9;cï¢(Ê|àô™3##ËÊÊ@{Ý ZL¬*´ @èssGÃ(³¯ê'?!¨7£P©Ž..i/_V°X²wëÇ«¨© rt¤P©üQǯ‹xÌÇÓh4 KK•o‡g×ÖÑ©¯¯O{ýº¶¦FövQ x<ž¦¤ddbB£Ó{U”Ù"‚Áúùé7?¶eh`PZZŠ-» þôéÓß¿wss£ÓéO““SRRÜÜÜe¥¥¢b©¾ýt¢¢â¾½{]‡ óóó#osrZ ÓËf³ƒ‚ƒ“ÝÜÜR_¿7~|kîHAIwÿí.0Êì«`” AÒ‡¢teå!ÆI»Ö|¶;a‚¥ ÐÖÑilläñx²}Ú€ÇãzùŒ¾€/X ùùË­æ. nnnwïÞýøéÓú:~õêÕ””€ºººÐXª?0`€‹‹KllìÌ3B7mÚN§ÓKJJrssGŽÉápQQQáp8Ç:ÓS®#•••),,d0Ý´5£L‚ qÈõøp‰}™LîåW¿B£Ñ&Œ¿uëÖèèèºÚÚÝ»wÏöõÅÞáæºi“¦¦&ƒÁPRRZ²t)—˵³µÅJ ¥¤¹%½ÀâE‹BÖ¯O}ùrÛŽöŽŽuuu:::þË–9R[[;díÚÑšššK—.¿q£ƒuv¤ †††ÿ²eNÎÎ8NðBuo£Ì¾ ^Ë„ éjjj’vz/‚÷r¿=4ÀÄDNNÎ×ÇgýºuXº©©)•J>l€F£a—0±w£££Ú²¥E,%­MèÉtv¬KsssÁ±Ð§N:uêTÀˆˆ-2oß¶mû¶mØòšÀÀÖÅ…ÖÙÁ‚û#"ö·Zco£Ì¾ F™$}8\UEÅÛ¬¬J6[ö:âñxeUU kkºŠ vÓü‡E=Á€õË461Ñhs ¨‹ºaÔÕÕ/]¸ 4ÿ¿ùùüåcƒSÈäÖ±”Ðúû8URèt”™››kee¥¨¨ˆ½Œ‰‰ñm¾Òõ$Á(SUUuáÂ…MMM8ŽÍfÿöÛo%%%€‘#G+))555½ÿþñãÇü¡b!꺺ššôW¯Ì¬­­úJgüŽãñx•,Vêóç.nnEE—Ëõ™7OTæ²ÒÒ—ÿüC$[<uA}Ž8×2 BMMM·7êÁ(EQE£¢¢p8ÜðáÃÇŽ{îÜ9@ccã­[·˜L&‰D3fÌ„ nt¸_AíÊNO·²³ÓÑÓ£Ñh²e€±1ƒÁx’âäêŠ%ˆº‡‚Ããµttœ‡ýâ…óС=Ö@‚z3xǼ¯je‚æXóíÛ·ŽŽŽXʳgϰ õõõÏŸ?Ÿ3g¼ÏA݈]^nag'³!&u--vy9ÿeÛçU5µê¯_%ß(‚úq¢LAtuu™6mÚøwÏ¡ž$4ÊÄãñ%%%­ÿ'022*--…Q&u#×óVKWËY4Î!¹¹¹KKËÿÏŒÃÉ^ÿT‚ÄÖé™ttt222 SSSß¾},‰fA…ÃáÖ¬Y³víZ;;»;wî´xÓëáÇRiA2mVPP0aâÄ ' ¤Ý@‚z‘N_ˤÓét:À`0ÂÃçOŸ~âÄ 4 jG‹³9Š¢‘‘‘òòò^^^vvvO 433›8qâõë×±¹ª ‚Ćy˜åå³¼½¯\¹˜åí Ñÿ¦~ ¨]]Uþr•ô[XJccãÇœœH$–nmm=iÒ¤¸¸¸/_¾ ÄHûãÐOååçkêèH»ý ö÷óó  âä4ÄÉ)<,ÌÏÏ~ j­ÓQæŸþ‰’STT´yófl0R¨çµŽr°6›]PPààà€¢èàÁƒÇŒsõêÕ·´ n'íxýæÍ„I“´ †Á°#îܽ ÈËÏWÕÐèz‹KJ¬¬­Sòòó骪:zz +›%Ë–å¾}+Ñ6@= EŠ^8wn¤»;¶<ÒÝý¹sØ2èß‚zNG™Ïž=³··WTTtpp8p`TT”$šµ«u”Ã_~ýúµ££#‡;v¬¼¼üܹs×­[·nݺ   ž ½úé~8Ž·¯ïŒéÓ¿|üøùÇÃQQ*ÊÊ=³ê¿ý6ÆÃ£E"@(.((üüù¯§OmmmÇŽŸ“›Û3íZ+..öôôTWW'‘H‚é .TVVÖÒÒ ë`mØ^EEEðó/øR[AP_Õé(óÇ,))©­­---=zô(|À¼7`±X»víâ¿ÌÍÍ=tèÇÛ¹sçîÝ»÷5;xð  INQQ“Éœïç'''G ;:ººº¦xy!¢£§§£§—žž^WWdljj`l°zuCc#h¾ÞyþâŃ1 Ös8¬Ú_Ož´²±Ñf0,<úË/BWýÛo¿;VTÃTTTü¾ÿ~_ód!BÛ¨ªªZêïo`l¬od´2 KŒ9uÊÚÖV›Áð;öýû÷Xbyy¹·¯¯Žžž“³óÓ§OùëU3„Çã½¼¼Ž?Þ"ý§Ÿ~*,,üòåKjjêùóç/_¾Ü‘ÚÐöþ ‚øºÚ/’Ô›H÷ÃÀ`0tuu/[v÷Þ=&“ÉO¿•˜ˆ]V,.(°µµ  ùúõkÆ›79™™Ìòrþ/Až|ðàSJŠ““ÓË—“…ó‚ƒ ?$%Ýùý÷_/^”-¥®š—Ë9s¦Çç6 „Nž<Êd2y<Þ¢E‹Ž?®Tu²3ãu½  d™-•ºÓ*ðõ6]]Ý;·n™š˜,_¹ÒÙÍ­ÿ€²#2eee—¯\Ù°~=ƒÁ000Xôý÷W¯_—]ýã4Ífÿ°té¥Ë—BzzzºººïÞ½+))a±XmÚÔ\î“'O¼<= †âðŒML ÄP\\|ëÖ­ëÖ±X,Ž:3öèÞÝÄÄDWW7hÆŒ—¯^‘SÞ¹{7tõj•Êf³}ÿ½2kjÊÌÌ>>>ä[Ÿ˜˜efÔð«GžýÓR©=³ÅÖÖv×Ρ>Ùòå3gϾw÷®üÙÙÙb±ØOöœ@‚ÀqœÆ0ÌÊÊŠ¶¶¶ÎÎÎFž9ujÿËV¬ðòô éÔ±cµ…†ß»×§îÓå2y‘‘‘‚ø|>AÖÖÖÕfüåÔ©Ÿwï&{àWV’S"„x<ž,Ú/®¨UII †a4|Ë`0Š‹‹•™òH€ò Ël©(8 jaÆá, 0x0úü¯›ÍÆq<.:šÉdV›… ˆ´´42ÑLKK333#ËûõíÛ¯o_‘HtàСiß~YmÆð{÷Μ>ýÅîܽÛÙÏOA fff†Éb ååå}·hÑo×®uíÚ•¼ƒ!ÄápBéééd¢™––öŵµb0A”——“‰fII‰²d™@[\¿pAñCÇŽmžH´d™-Ë29|þÙ³gGieeUXXxôøñv>>!#CC‰D’‘‘aiiÉd2‡¶båÊuk×feg¿MH]m¹výúŸwì(++Û²u먑#B™™qqqÝôôô èôšÿj>~üX!¹º¸(¬  àìùó'Oº{û6B¨® Æ WþøãÞÝ»i4Ú›ÈÈíÛ‹*+%‰±±±H$:Tõè&“Ù¯oßеkwýüsiIÉŽªÚ¯¨ÉÂÂÂÔÔ422²sçΡ7oÞxzz*3#ËT#µdEIII_õè‘QõNËôí[רGááµ–'&&vôó+ÌÏWYPŸ-Ë·C:]Jînn{vïöööþâ,Íž2 Ël©”<½š‡Ù—®MT)ª¾~Ttô¡Ã‡ ô©ÔnݺÜ¿!Äáp‚fÌèÔ¥ †a¿ß¼¹g×®W¯nß©SYY™…¹ùŒo¿%ó0ÇÚwêTXX8bذ%‹!„¤Éæ-[&O*‘HÜÜÜŸ4sæ“'O,y¼¹sæü°l™@®oZá8>bĈÃGŽÔ¬ c÷®]›7ovtrŠ—H$\ss„PvVV3|ŠÁµ}€†èÖ­›º£J©õ6p*•zòäÉÂÂÂìììü±^UM™>ýï¿ÿ&‡ÿþûï)Ó§Ã=æšB¡œœœŒ*-+›lcgdz¶ž3w.y!tøðaWww3.×ÙÕußþý¡ÄÄDCcãºÆ4ˆÌi¸ææ‘‘‘GuoÓÆŒËýºgO²§ rö£ÇŽÙ98¸º»ÿûï¿dU………Ó¿ý–gmmie5köl²°®¨4–D"IOOOJLœ8qâÄÉ“ARbâ”É“WVmPŽŽŽ=JOKsrrZ²t)Y8{ÎSSÓ”ääûááåþ3+ ‹/_¾ìæêZk…‰äMdä눈K¿þú{Xù§BRLY& aÓ>– h=Ž>üShèËW¯^¾zõSh豪 g&‹ÅW¯]#»¯Z¸paaQQ\LLbBŸÏ_¿aBˆÏç/Z²äÔÉ“9ÙÙ¯^¼èñù5'µŽ•Ïi¼½½ëÊ222Þ¿{7aüøUUé×ì¹sË…ÂøØØÔ”Ù‰Z£Òp ‚ƒq<8##cá‚äpll,9ö믿&»c›9sæ‹—/BÅÅÅwÃÃCCBh4š©©éâE‹×/‘H,­¬lììž>}ºoïÞš’V._®¯¯OÕ¼}2œ1 UsqvÎûÒÉdÈûÀÌÌÌΟ=Û«wo„Ð÷ïËú%š‰ÌTÊËË™LæãGJËÊ.]¾Cvv»dñâ©Ó¦­]³†ì%7ñÝ;‹U­'ÅcI²g4Ìœ9søˆ²òàùóqH>E¬¸¸8,,,&:šÅb!„:v숪+*U}(MÇq²›6===}}}²£===ÙÔNœ<¹óçŸÿëŽM,F5ºc³ªP°ùëbkVHNÃf³›tÍš Ë ,ŒB!_VVV¿Ý¸ñÛVVV²B zXÓHd¦’–šÚ±C‡ãÇçdg‹Åâ:YZYYZY 6¬°¨!dhhxîìÙ_/^tvuíÛ¿ÿóçÏå+Q<–tâäɶ>>æ––ƒ.++“-LÅh4ZeUÇ·AØ|ÞEn]Qµ\yyy ¿ûnßž=™éé·ÂÂÈëIÈîØ222ÈiÒÒÓYa5šÖÿ ì(‹"ÇÝÝÝÝÝò9uêd``°uË–ýû÷# Ãqüm||FZZFZZfzzZj*9Mÿ~ýÂ~ûícrò€o¾™2ujµjŽ•Ïi”ÉHd¹Ÿ>¿uìõ¶Ö¨Z(‘H$ëŽí`Õ¢L&³oŸ>¡kÖ…¼¼§Q&"1ŒÁƒ¯X¹²¸¸X,¿|ù!Äd2kªå277_ôý÷={õjß¡ƒ|´û÷íËÊʲ±µíÝ·ïð¡Cup!”””d)÷XŠzU(ÃáÌ " 7áº4ì´ABB†a ƒN§ûúú¾xñ‚,¿{÷®‡‡‡¡¡¡A—.]Aï4)6»¨ @ÝQ¨Vnv¶‰Ü%_ò'Çk¾òóó™,–£_4}Ú´ÃGŽü¼s§>•êãë˵°è?`@|BBH"•nÚ´ÉÖÞžkn~úÌ™£Ÿw.VëXùœ&''ç‹9Ìþ½{upÜÅÍÍÖÞþØñãdáÞ½{kF¥RÂÃÏ9Rë«®Y\\\ÈþAeä°¬7"ùáМìì˜èèÁÁ²B.—{ãúõœì숗/­¬­Í¸\TG¿¤ò‹¨«ÂšÓlß¶-3=]C:Ò‡»´Žã%%%R©tõêÕAAA¯_¿Fy{{‡‡‡óx¼ÊÊÊ={öŒ=Zv- ñÚ´mûìÑ#3‡ki©}Çð¤RivFÆóG|ýüd…u­¦T*ågg¿zñÂC¹g†y^ߣÕ²!C† 2!´cÛ¶Û¶ÉOimeõÇýûuÍ^ëX„ÐömÛ¶WÕÓ¶mÛЪîý£ºS1CCÃUÉ¥ F«•ê¨ë’ä!WW×´´´ 6 TKͲL­B¡P†¾{÷nò­¹¹99@†aŽŽŽê -Dg0|ýü"_¾Ì´ïÔ9…B165õòõ¥3²Ç—_©ã!‡ …Édºº¹C÷ì*ÕÖùùùßΘÁçóõôõ‡®X±BÝ©d™ZE,_¼xÑWîéaïÞ½ëØ±cQQQ§NÂëxþ ÂÐȨ£¿¿ºãP±ª³Oÿþê -Ð¥K—ؘuGÑL ËÔ‰ÄÈȨ¬¬ŒÅbEDDÈÊ rss'Mš´jÕ*ÙaN@#éêêª;Ðhej Ç JJJÆŒsèСõë×Ëe³Ù«W¯0`d™Z × €ÆÑ¶ËÕ[9ƒ±k×®]»våææV%‹5­³Vh1È2µ“““¿¿?ÙWÙÍ›7?}ú„ÊÊÊZ½zõСCÕZ È2µÐÌ™3÷ïß_YYùîÝ;ooo—]»v©;4 a¡uý¨Ù‰Šº£µƒË¹´›››X,–½1bĈ#Bßÿý÷߯¾¸Ô®®nAANWw -FiI •FÓËÓ5Ë4… ‡ó!1±¤¸XÁsÀ‰ ˆâÂÂÔäd†¡!äåš r@³JLLìèçWí‘h’‘‘‘H$ú”’"ª¨€DS1 èT*ƒÅ¢3º8.NhÈ2Ð6¯_ÿ°lYä›7·³³ûqÕª4anWký¯€Â0ŒËå–³X• !•"¸âP!§ÑhzzzâÊJuÇjY&ZE$9rÙ?üF¡P^¿y#ª¨hAõB4¦îZ¥˜¥"©\XØ(ðñ UÒ32ø|þ”É“uuuqïо½¿¿?BhÀ A‰„knÎ57ŒŒ,-+›lcgdz¶ž3w®P(D%&&Ÿ:}Ú­MsKËà D"‘’õ#„ §û-ÏÚÚÒÊjÖìÙdáÑ£GÝÛ´1ãr¿îÙóÇÕj«5 P»‡‰%9Ep|´±àX&ZÅŠÇãñxS§Oÿß„ ;tàp8dùïaaýü²³²È·3‚‚*D¢¸˜ æLº~ƵkÖ „$ÉßÿñêUYiéÈQ£¶nÛ¶rÅ eêGÍž;!K§Ó_¿~M:::>~ôˆÉdΙ;wÉÒ¥W._–¯máÂ…µ†ªvýÂ…ºFÅÐ_ç1.®èÙœñ’’’¾êÑ##-­¾3&&&véÚUÀç«"ªƒc™h]]Ý»wî°MMX¶ÌÁÉ©O¿~µA¼tùò¦  †Á’Å‹¯^½*B§ÑØlö²eË~½xQÉú‹‹‹ÃÂÂ6mÜÈb±ttt:vìHNÿõ×_›˜˜èêêΜ9óÅ˗ʇªзoÍÏ÷ë_>9Z j%11‘Ábuûê+Y‰P(äY[›Êýån ''§¤˜òÈÉ3W\ ‹ƒ%&&6Il Ç2h‘ óó3ÒÒ***A˜š›[[[ËFÙÙÚîÞµ !”““³tÙ²AAÜ¿/?oNv¶X,îЩù– ÇÉa ì­¬Èakëìììš‹®µ~>ŸO„\¤'Oîüù眜„Pµ;@„!óæÅ å?ÐÄ0LWGÇ„Ã1·´„^¯¶²µµ•[.’öݱd-ãcL]³à8^PXצM„ÐͰ033³ÔÔT•Ǫ4ÇÉ3W"‘($4tFPÐߨ%È2hyJŠ‹SSRL8ž••>•Šª¨íŠF33³ï,è?`BH>K`³Ù8Ž¿g2™Õf!âSZ™h~JK333S†|ýfff†Éæ%ååå-üî»°ß~ ˆxýºo¿~ò³+CƯ[7•"¤Ò< åý{)Aðä¾V´Øº©:86§—ůÇM6aüø3gÏnX¿!túôé ãÇoÜ´‰uôèÑí;vcG:88 „ø|~ÐÌ™Ož<±äñæÎ™óòeuÚ–õBlß¶mÝúõúúú'ïÒ¥Kµ‰sssgΚõèÑ#KonÕÕðòôôôFuò—_êÿI4 8c@Ë“öñ#›Ëµwt¤P(B¡|Š™““³}ÇŽOii¡Â£ǎµk×!ddd$‘HÒÓÓBL&sÄðáË–//,,Deee=û›»fÍš²òr@°yóæ1£GW[t]õ3ŒÁƒ¯X¹²¸¸X,¿|ù!$‰$‰±±±H$:xð`µª‡A"×^jy‰D"“éàäTTPPZZÚ $ÿ×/é‡á¶Ûi›ÇØëà_8x?~üø‹—.‰Åâôôô˜ØØoú÷—"/FOOKsrrZ²t)Y8{ÎSSÓ”ääûáá/]R20‰D’‘‘ñþÝ» ãǯúñǚ̙;×ÐÐ0%9ùÞÝ»~ýµæB¡ðüùóýü”\b“ƒ,€–G(ZðxâÊJiçS©Ô¨èèž½zq¸\//A^ÞáƒBgfPP‡N,­¬¢¢¢öîÝ«O¥úøúr-,úŸ@ÎŽãx·nÝ|Û·÷ðòjÓ¦ÍÒ%K”¬!´ï^wqs³µ·?vü8BÈÜÜ|Ñ÷ß÷ìÕ«}‡žžž5W¤®0€æ ˆ„²òru€Jü!h÷cDva%B(äÚÇv¶ŒA>&_œËÆÚÚÅÅåÞýûçΟ1|¸®®®lT͋ы‹‹ï†‡‡†„Ðh4SSÓÅ‹)^ðüù8Ž Œ‹«6ª¸¸øö;kBCi4›Í^¼x±l”D"±´²²´²âZX\º|yÛÖ­Ê/±iÁsZ ‚Ð×ׯ¨í,9‹ÅúåĉZgÚ¾mÛömÛdowlÛ¶Cî­Ì¤‰'MœX×’Ôohhxâxõ“L¡!!¡!!äð‚à`„‹‹‹¬sx:VW@C`FDÍÿ3h2±à̇”\aŸ-ч§:Ÿû—}a%çýß„ gÎžŽŽ>ýùù蚣óù|„Ç#'°ªø"ÇŒŒB4­²FŸ dµVrWÒËÏHÞB$ Z½ºfÿÍŽe 5¢ëaôöwfE*í±! § ^mŒ”œwÈ!þù'N÷öö–’£ïÛ³'3=ýVXùŒP²Ç·ŒŒ rš´ôô& ž¬6­ê†ôOµÝ™N¥RÇ÷ôÙ³&Yb@–© 0 c0t:Ý××÷E=oËMHHÐÑ£ÚZKc½?—{}m^!–úØ0hJ?ìÇ€NÿýÖ­j2k½ÉdöíÓ'tÍ¡P˜——·cçÎ&‰œÉdöï×/$4´¼¼<77wÛöí5§‰D/^ttph’%6äZÇñ’’©Tºzõê   YŸØ(Oþ\6@ø99IïÞ•–”Ã@­0 £ØØÚò¬¬ÓÙ–¾åÐTçövÌ÷9õ»þ¸OµÙÅèfff3f̸zíY¾ß¾ ™3mlm­¬­g½Žˆ@è€]†¬ÖÖÎÎÊÚzάYd9ù¤7„F¡´oßþè‘# ^D#A–©U(ÊðáÃwïÞ³fÍ ×ÕÕ8qâÖ­[utt<==É+E|||„BaÏž=% ƒÁ@=|ø¼e€Zäçå%ÄÅyúøXÛØÈßVª‘J¥Y™™/Ÿ=Ã0¬am= T5l€=ò…´¾Öã...²ž‰j^ŒŽâr¹7®_'‡¿}ÛŒËEutÀ.«_~AòõËãp8×äfñí·ß’—)^‹fY¦V‹Å/^ôõõEM:•N§gff–”” 8pýúõ«W¯®u®?ÿüÓÓÓ³¤¤¤yƒP‹Ä·oÛ¶ookg‡‚#™ `Š×9 àÕ³g¦l6•J­×ìCÇŽUQ`5‘¶¹ºº¦¥¥mذaH``³-Z½ ËÔ‰ÄÈȨ¬¬ŒÅbEDD………¥¤¤Ðét:¾zõêï¾û®®,€æ(.*²°´„såJ215--)©¨¨¨o–Ùœòóó¿1ƒÏçëéë \±b…º#j&ej Ç JJJÆŒsèС©S§"„lllȱvvvYYYj €R‚ÐÕÑAe*‡‚aR©T"‘¨;EºtéSç#+µd™Z…Á`ìÚµËÇÇgúôé¡ÔÔT2Ñüøñ£¹¹9BHOOO"‘ˆD"===~ÕEð„bí •HRÞ¿Oz÷.?/!dlbâäìlçäD¡¨³+ ÍŒJóc#i~„@Eà@&Ðej'''ÿsçÎ 8pùòåGŽ)--]³fÍ„ BÖÖÖL&óêիÆ Û·o9‹±±±D"IKK³‚G·XåååÿÜ¿_QYéìæÖ¹{w„Pzjjttô»·o»÷îM¥Ñ”¬§ñ÷<ª"*UÐäØZJ„@u ËÚþk¡™3gîß¿ÿСCB¡ÐÜÜÜÍÍÍÏÏoåÊ•!]]ÝŸþyöìÙ®®®]ºt!§733›7ož‡‡‡‘‘Ñ›7oÔ;h‚ ÿõÅ{ô¨®_¬ÄÄDCccù’ZïyT{TM®1±1X,®¹¹¹¥¥«»û´éÓTóTÌGHzòäIÿÌ--yÖÖãÆOJJR0q3|à Þ^õxMY¦6pss#;'"1"##ÃÒÒòÊ•+EEE`÷îݲî0¦M›–ŸŸŸ’’²`ÁaÕ# ÷ìÙSXXXPPàS£÷/ ù>¥¤ˆ$’€=Èî¨d F¿LfÚÇU­±QôèóN½7›ûÔlîÓy§ÞSôè_Œ Çñ쬬¬ŒŒ§Ožx{{÷ìÝ;>>^u6àÓ{øðá˜qãfΘ‘–šú.1Ñßß¿wß¾µ>h,^õy)‚a<µ‚hÌeueÐâ½wpv®–ŽÈ¸zx¤¼¯dU²ÃZäÀÑcÇì\ÝÝÿý÷_5F…ÊËËûߤI<žÝË–ÉþVñùüaÇsÍÍÛµoôØ1S§^±-½¼ï~¿¸’_\¹ï~ÆÒ ÉÊÇfll¼ 8xò¤I›·n%KJËÊæÛØÙñ¬­çÌ+ûWXX8ýÛoyÖÖ–VV³fÏ®W„µŽUáÊU«~Zµjذa:::tmþ¼yƒoÙ²¥®` DöáÌ57ŒŒT&< jDãüÏ?ÿ¬+˜ßÃÂÈ´ÙYYòOdêÔˆÓÇÿüóϨѣge¤¥}HJ ð÷ïÙ«×§ÔTòÌ2Žã¹99üììݻϞ3'7''7'çÉãÇúúúäpnNŽ| Šk£P(7ÃÂr²³ÿÿ´5Aˆ**†6rĈ¬ŒŒÌôôýûö©ëŒ¹ ‡ó!1±¤¸Xq2 j"¢¸°059™ahH§ÓV Üý¨Sðüù8Ž Üà€Ã(..¾}çN\l,F£ÓhË—/ÿaÙ²åË–ß Oˆ‹£Ñh4mñ¢EãÆoæØLLLòóóB¥ee—._Ž‹‰!@.Y¼xê´ik׬).. ‹‰Žf±X¡Ž;ª4ž¼¼< ÃØl¶|!‡ÃÉBÍ h°Æ¤DËW¬XýÓOä? 6þü·ïÞmܼyßž=dµAP(”‘#F>|XV"¿Pù·ŠkÃ0lÂøñ{÷í ‘Í•––Æçó§N™Bkß¾}#ר1ŒŒŒD"ѧ”QE$šõ‚a•Je°XtCÇå/ÌSd™´x¦lvfF†%WëXŸß°{;p722BÑh´ÊÊJ5FEöºe]Õ‚­Mvv¶¬œWµ«:–¥ ¶áØûîgÈʇw`×76@`llŒÊÉ΋Å:u"Ë ‚Àqœ ’ kk%+¬aí ­;B‚ rssåM>ŸÏ65mp0 ù58*((ˆˆˆ¸våŠ| #‡Ÿ=gQuØ ±X|ñÒ%W7·ÿ&û<Ë”½U¦¶¹sæø,^¼X6ÇãñxS¦Nýßÿþ×±CŽr×±¨†a\.·œÅª”H©AÏ}õ¡ƒã4MOOO\ÿŸ€ÿjhÚ€ÍÏÅÝ=66ÖÝã֓‰qqvŽŽ-:*òWêSZ™h¦~úÄåreåä½n¡´ôôúƶe¬=Bèâ3>Bh´‡|[¯Ønß¹Ó¹sg„›ÍÆqüm|<“É”ŸÀÌÌ Ã0Yðõ°¾Ÿž‘‘Q;Ÿk׮͘1CVxåêÕ=zÔ ô˜«‰še  ÃØ¦¦ò5pØl@@ž\–H$<B¨»ûþ={\–‰>Ï2A|±6„¥…E¿¾}?Þ¿o_r.]ð;w¶ïØñÃ?$§¤téÜùàŽ [£&A£A×_ ×àÁu™hk;;=ÿçÏ?k>Œ>&"¢´¤ÄÊÖVÁìB9Ò¦»³ £200è߯ßêÕ«ËÊËsss7mÚ4vÌ„“ÉìÛ§Oèš5B¡0//oÇÎõM**Û;É1g_çœ}÷Nr¤ëQ”‰TPP°wß¾'O.Y´ˆ fÄðáË–//,,Deee=xð!Ä`0¼båÊââb±XüòåËzEØ€OoÝÚµ¡k×^¿~],———ïÝ·ïÆo¿-]º´®`ŒŒŒ$IºÒ9:h ¾Ûš<˜ÍÏÍ•/ÌáóMMMÉaÇ3ÒÒ2ÒÒîß»çáé)›vµ»¶•©œlá‚û÷ïUVÊ*±µµÝ½kWTdäûwï,y¼AAj»Ç¨d™´x†uíÑ£¼¨èÁ;™iiâÊJqeefZÚ·n}üðÁ/ @ÁÁ*‰DÂ63“½=~¬Q=~üøÀþýŠ GÇvíÛwèÐaÉâÅä”û÷íËÊʲ±µíÝ·ïð¡Cup¼b#ûËìÔ¹ó«W¯þ¸wÏÃõwï^}*ÕÇ×—kaÑÀ€øª®4÷ïÝ«ƒã.nn¶ööÇŽWu„Ý»w¿pîÜþƒ­ll>|xïî]ÛªçÍÖ †ÃáÌ êЩ“¥•UTT”2áUkðÝÖ†††í||®^»&_xùÊ•î=zÈnÇ®ë6íšo•¬ÍÕÕÕÃÓ“¼ý®Zµgá‚qññ ^#e¨õ»ŠÀs´•Fë=p`Êû÷o^¼(,(@YÙÚÚ9:*x¡‹‹KIQQµÂo§O'GÉîbvqqT=T]Q!„Î9S³ËåÞ¸~þýöm3.W-±‘è4ÚŽmÛvTÝÿ.chhxB¹ä²ñ’ÂïÜ©uT­Álß¶m{°5&sZ³fÍÄI“Ølö +ÅâãÇÿvóæßý%ŸÖº8Y¹ü[%k[¸`Á˜±cÉ·999gΞ=j”••UaaáÑ£GÛùø@.Ø:A– €– P(ÎÎÎÎêä3ªŽ*!!Ã0WW×´´´ 6 ÔœØOó#ªRÏœ,))©G¯^d_ýÝ»u;wæÌºõëçÌK¡Pºv½{û¶µuõË.¿¸P‚P¾6ÿÎ]œ£¢£APõõ£££:TPP O¥~Õ­ÛÁªU. ¸æ@½Vh8È2-X~~þ·3fðù|=}ý!+V¬PwD4úùsttü”’"›««¿ÿí[·jVèìä”Çç׬ÜÙÉ)'3SV^m2%k»NŽb2™ÇU¼F²€kÔkņƒ,ЂuéÒ%6&FÝQ¨d™´@ðd^Ð\ˆÆ=Å4 ö¥Koh ËÔf žžž5ûëOLLìÔ©<Úµå"ŸÌÛàG~ ¼Ò’*Þৃ†ùâ ^´Ð޵Aÿþýúé'ù’7n˜››×õ44T~^gg爈‹5}úô ܺu+''gþüù=ò÷÷/,,LMMUÓj/`0 CÝQí)f3spt|õüy‡N8\.¥S@*•ò³³_½xáàèH¥RÕ¨d™ZbòäɃ Ú»w/•J=uêÔäÉ“e£6lØ@§ÓétúO?ý´páÂjYfïÞ½Éyóæ 0!¤§§§««ûöí[///CCC//¯æ\h叿æÂŠŠ7e¥¥â+@¡PL¦­-“ÅÒ××Ww8 ej‰€€6›}ýúõŽ;>þüêÕ«d9†a6UÏ/¶µµÍÊʪ6ã‘#G¶lÙ’ª¬¬D]½zuçÎ .ôööÞ¼ys—.]šqU µ³µµ5ãrE‰Dݱh4Çõôõip SSA–©=&MštêÔ©·oßöë×[uAA©©©d¢™ššÊýüB@0{öìû÷ïwïÞýå˗ݺu#Ë8pà@‘H´k×®qãÆ¥¤¤4ïª@kG£R!y-\ð¡=&Mštÿþý#GŽÈŸ.G­Zµª¬¬,77wíÚµãÇ—%‰$‰‰‰‰H$Ú³gY˜žž~çÎŠŠ ]]]¸*HÍ v´ ttZH ´‡¿¿iii`` ¬Çñ=z¸¹¹988xzz®ZµJ~ ‹eË–uéÒÅÝݽmÛ¶d¡D"Y³f ‡Ãa0'Nœ8}út³®øÙ»º£4™Ò’*=ÍÖZ¹Vyðàü[777²»¢iÓ¦ÕZŽÚ¸qãÆÉáÅ‹#„lllžŸ_óïhªZŽeЂ»paÚ”)ÞmÛbÆb±ÆŒMv¬yæÜ¹‰“'#„¤Réšuë\ÜÜ<½½¯^»faeE>ý—S§ÆŽ¿tÙ2×6m<Ú¶}ð÷ßd…¹¹¹cÇwuwçÙØŒ;6¿ !ÛÆÝ]ÉE±{ï^__k;» '’‹Û°qãÊU«È322¬íì¤R)çˆQ£|÷³«ëƒB§Ïœñ°±·÷ñõ}ôø19ËÁÇÛwìhek;døðœœ•¬h¶è˜OÙۚșsçF³xéRgW×N]º¼ML¾»û˜±cupüÕ‹?,]ºs×.rƸøø¨¨¨Þ={¾Ÿ?wîâ¥KW(¿©ÖÜQØÛÛ¯ <859ùÝÛ·:::Jnõ°k7È2µYbb¢*Οͱw÷î®]»þâÖ¦Íè±cù|>Yëáá!>¼w÷n6›mhhØ»W/Ù!ɸ¸¸óçtíŠrqq‘Uhgg×ÕßÇqc#£Ý»—••‘×<–Y뢳²²Ž;vìða.—«¯¯?$00** !#÷{çѦ,Îysæôüúk„PqQÑ–mÛŽ=êêâ‚rvv¶¶²ÊÍÍݱsçᬭ¬ôtu'L˜©ªO€– ¸¸8õÓ'/OO„P]HLlì :wîL¡PÜ\]ÝÛ´™>m…Bqws“T=<=.>~Þœ9}úô¡P(cÇŒÉÎÎ.++SP¡lSÕÓÕ­uG+Ë}‘r[}Qa!làÚ ®ËÔýû÷ïÔ©Óš5kd%7nܘ9sfZZy¾´heeeYéé"‘„©¹¹µµµl”½ýÏ;wþ¼sgddäØqãö<¸qÄP\\\ûöíÿ}úÔÓÓÓÁÑ‘œXXQáååE¥Ñ‚ˆ‹ß¿o•FC%½ïѦ 9|îüùC‡%½ODyyùžÝ»õ©Ôø„„v¾¾ÔÏrYë¢ÿ}öÌ×××ÚÆ†œ¦¢¢‚Ãá—”ðù|ooo*•ŠŠOHðïÒ…¬-..nÏ®]äð“§O==<ª4ý÷Ù3‘HÔ§ò-AmÛ¶•äÍ‹Mûi B¦££cljjbjŠaX]S)ØäB¯_3 WW ÃêÚ@âââöíÙCn)‰II ‡?$'»¹»“à ׯ'‡…&¦¦üõW]Ê6UTÛŽ‚œfèСä4|>_™­6ðæ£\ÛkrejƒÉ“'¯\¹244TÖtNŸ>=aÂø~[¼ŠŠŠôÔT‡ge¥O¥"„*„š“y{{{{{“GR?}‹Åvvv·ïÜ124$'J¥á÷î-Y¼!ô15U";;;“£"## „ºs÷îæ-[Nÿò‹§§§T*mãéÙÖË+åãGÇm>ÿ«kÑtºlTØ­[ß|óMBB‚££#ùc#‹ÿù矠o¿ý/ÎÊJÙ‘T>ŸoX­ ŸÏ2dÈ©“'ëZº_·nŠ?@4!•æ )ïßK ‚ÃáÔ:Í7ù¨èhOOOro_ë’úéS¥HäääD¾ŽŠúnÁr8&&ÆÛË !TXX˜––Æb±Èòë7nôíÛWA…ò›j­; ©TßÖË‹œFù­6ðæ¡LÛSÈB´ÁСCgÍšõðáï¾ú !”ŸŸöìÙ³„„OOO±XLìÝ»÷§Ÿ~Ò××?þ|@@€º£JÉLKcs¹¶ööâÊÊj?6»vïhçãSYYyåêÕ¿<¸uó&B(::ÚËÓÃ0''§õ6|øðÁÒÒ2$44!!ßÍÍínxx›ªS]_\´o»vëÖ¯ONN¶²²Úµ{wê§O'N|ùâEyY™X,Æq|uHHnn.yZ-::Z> 6mÖ®[íå啜’R)¹¸¸xyznÙº522ÒÛÛ»¬¼üñãǽ{õ’ÿ#^kÎ €Æb0™NNSR˜L&™„U£`“'EEEÉ’¹Z7ù-‹<½îQu";::šüK‹ãø¯/~·páÇ÷íßÿ{X˜2¢:våBayy¹ì†q‚ ”ÙêaoN_l{ª×ej6zôèSU½Z\¼xÑÍÍÍÛÛ[~‰D’–––™™9yòä¥UWyÍ' -x²›<)::Z¶áÔºÈoY111t !$¸166vÌèÑÏŸ?7·°X´dɉcÇÜÜÜ”©Õ±£0 Ó¿>½­‹›BHÉ­6ðf¦¸í©†"BPÕw@Vffì›7½¾ù†|{ëêÕI³f5[4­Ä©ƒõèôQ&R)!•J ‚J¥rà ×ÑÁut®þú«ì‚y5¿—G 4(++‹J¥víÚuäÈ‘ß}÷ü±Lww÷¼¼ Ë@Kdef¾/.*ÒúýisÂ0Œ|,›µMÍ}wYIIÔ«WÎîíÚiÔž½IH¥Ò âÙ3¿€ºBH,ž0¡®‰s²³_>}ª££clb"+Ïbcb<½½­ml´þ “T*ÍÊÌ|õìBÈÚÆF¥Ë‚¶'?1´½æl{õY&Ú@›éÑ:ö§ÍI~ßmck[ml\T”»··…•“ÉÔ¾_z„²·çñx¯Ÿ?ïÐ¥ YP×?ŒBáZXtêÚõõ‹:w–•ÇÇŵõõµµ³S0¯ÖÀ( Ï/ âùsŽ™™ƒ¡ºeAÛ“¶‡š·íÕ d™hƒØ˜¯V³?mN²}÷ë/̸\*•*?6/7×ÕÛ[kæB±¹Ü¼Ü\Ù[ÅGÊMLM‹?zmQa¡…¥e«:¾nbjZR\, UúKm¯h{¨¹Ú^½@– €6(*(hmûÓæDþ€ …ÂjY¦T*Å0L‹æB å³ËþäÚXBBBÈÍÍíÿ'ưjס«£ƒZSË$?U_+ mAÛ«¡yÚ^½@– €6h…ûÓæDî»%‰ºQ?Ù?™ôôôþß|ƒzôð!ÇSf–V¥5®³ŠAÛS’F­3d™h‰Ö¹?ÍŒlfüÜÜ‘£F]¸p!4rÔ¨7npØlųh‘H„ÒÓÓSw ­ ´=ÔÛd™h íÛŸ6§·ïV²™Mš4iýºu;t@­_·nÒ¤I¿ßº¥`žf ¯H$’^½z!„üõŽãê§¶×Ûd™h íÚŸ6§–¸ïV‚@9uÊÄÄ„îѽ{[//ÍO›Ú¥D"™6mƒÉDM6íøñãÐ`𴽨ö(êÐ4ˆú¼ß½337¯×,ÚúK$S§Mc0™ &sê´ib‰¤ÖÉ4VffæÀÙlvµ;“d„BáÔ©SŒŒ¸\îºuë¾X®AAräßÖ5K5ƒ]³F¾ä·›7mlm+++k^H¥Ò9sçæðù—/]º|éRŸ?gî\©TZsÊ|šlÑ¢Ennnt:ÍfO:5??Ÿ,gÈÑÓÓc±XÕfÔ̶—@¥ÑLÙlŽ™™£“Óä)Sââ⚪‘<~üxÀÀ\.×”ÍîpáÂ…&©¶å¶=È2еî›êú-·³³ËÊÌl’Ý_‹Ör÷Ý2 %00ðСCuM°jÕªôôôOŸ>EDDœ>}úüùóŠËûbÖ^ÛüìÙ³äÛËW®¸¸¸xzz6âûT-:¾û矙L¦|!“ÉÜýóÏt:½ÚÄMôíi¢ðððvíÚU+qâDÍ™šÜöª216.ÈÏGQZZzéÒ¥M60 tú’Å‹¯^½Š¢¸¨ènxøšÕ«iTª©‰ÉâE‹jV.0 3%ïL‚¶Wî1@[Ô±ùßøñÃGÚ±m•Jýì·!ÙÀ‚ùóq eh`àþ4p?ŒÁ`Q^^Nþ¨—””0™Lå_VÿæQ× »t155½Ö¾}û—¯^;{Zž&»~ýúŒ3nܸѶm[ùò›7o–””Ô¼(ScÛQcT®@`dlL ”-‹ÛwêTµ@Çq¡>!dÉã‘s‘]ÁW«œ¼I—gbbRß8µË@KÔuE¼ì·üCròËW¯FEÈíg „p742"¢Òh•••j¿é[3_-”………©©idd$ùöÍ›7žžž Ê¿¨Ç“L<~ܸsçÏŸ¿p¡W¯^ç‹•«Qiiið‚………ò…………Á hÍõ œ:ujúôé7nÜèÖ­[µQ‡7n£Æƒ³5¹íUuûÎÎ~~A˜ššâ8ž—þéSú§OiiŸ>~$‚Íf#„ÒÓÓÉé?¥¥Õ¬ÜÐÐÐÇÛûÆo¿}1ÎújÑm²L´„‚T­¿å²YäçU\–iÑûnyB¡ìU^( …Âjc'OžRRR’‘‘±}ûöiÓ¦).W¬鸂¯`ÜØ±=xpòäÉñ|߉J¥êèêŽ5ª¬¬Œ,)++9j”Ž®.•J­6qc¾M ´gÏž… Þ¾}Ûß߿ڨÔÔÔðððš§ËIÛöd£òóó÷îÛwâäÉE‹Á`0†¾lùò‚‚‚ 233ÿzð€,ïÓ§Oèš5ååå`çεV¾víÚÕ!!W®^­¨¨H$OŸ=›5{v+o{e %ì¤jý-G­>ËlÑûny4ÍÛÛ»¢¢‚F£‘g!ŒŒÈ±ëׯ777çñxíÚµûßÿþ7nÜ8Åå_@ˆ òùKÁ>{[Ç,µ¾l¬­ý:u*-+п¿š¯fûÒ Chë¦MNNNcÆŽ-/////3v¬““ÓÖM›°šë¨]‚ƒƒ‹‹‹{öìIvÉ–{¢ã±cǼ½½;tè +im!‰DbniiieÕ¹K—W¯^Ý»{×ÃÝ»w×.ª¾¾o‡<Þ€AƒâãÉò}{ödegÛÚÛ÷í×oèСxmÝttïÖíÜ™3'Ož´wtäY[/[¾¼W¯^­¼íÁu™h‹º÷/äoytLÌ¿å5g©µPÛ‘ûîyÁÁcÆŽýõ„Põ}w Q3 vqq)(( ‡©TêÉ“'OžSGݱ•€,P˜Ÿÿ!1ÑÊÖVWO¯µýÒ „0 «‰>å¾äYZP0uGÓ¼x–Ÿr Ì--[ÏWO~ÝIññÃlìí[ÏŠWŸù |HLÔÑÑ146Vw8 éA– €FHIJ²¶³£àxë|ˆ9A¸ŽŽa:ººêŽ¥¹Qtuq ÃutZÏWO~Ý,cã’¢¢VµâÕÀç@~Övv)IIÞ;ª;Ðô Ë@#YXY­ïgFÇðVv “DűVøÕ3Y,ANN+\ñjàs àxqQ‘º£*Y& I+þ™!éëPZÛér’¾EÚÊN•"„p‚ ZáŠWŸ’HZÛ¥­d™hŠÖ|0ƒ¤‡S(¨5¦™z8¥Õ~û­vÅ«Ïh%È2Ððo^_‡Ò:ϘëëPZí·ßjW¼ø€V‚,MÑ ¯ý¯Fo­gÌqJ«ýö[íŠWŸÐJe )à”™FËL~Ÿ4ü›ž¯S›aYú:pƼµƒÏh%xŽ9š‚hQ’SR:tíÚ´uêãC ~%'%:™­Z¼@ö¶ Wñô®<ÓšÃäËÑÉ)ò]ª2ó6þ¥c þÐ>¦¦~Õ§OƒgWþ{lä‚jÕâš½Šhþç Šo_žº÷¾@UàX&š¢ñ§ÌÞDE9q".>^"ÛÛÛ=ºŸ>M[Md´M{šOoÔ±LC åÞß—,_Éæ˜‘U)¨P~‚/N¬`ÞÆSòŒy|BÂŽÝ») ÏÂbÖŒ_XñxݹÓà/Bñ÷˜òñ㘉ŸýóB¨‘ R@½îؽ»²²R*•&§¤tîÞýÊõë}4|øëÈH²’‹W® >ü«>} vî×_ÉÂZk“J¥eeeë7oî3p`¯o¾Y»q£P(lØ*èã †5ø…aB(hÖœ gN——•‘oÉQ+—|_\\ô4"úeT¼ 7wÇæM »tý&ŽãïR3ߥfzµõ–M,_Ãò¹?._zðØÉ¤OY?yÑí«î5çmLØ #e*–••ŸŸ8p …BA¹»º¶õô”}•òßi¿ÀÀÀ‘##£¢Î_¼Ø/0pà°a‘QQòS’Ã]{ö¬ö=^¾v-päȯúô™:sfê§OR©tvp°T*íÞ§O÷>}îÜ»'›½^J4ûý‡Ï™ÓÅÏÃ0 Ã|}|æÏž-«m@¿~ç/^$ßU•×\ QÇrëÚˆj~2äÊÞ yŠ›SÍõ’oß?7OÎy¶sîÍãÝ›Í>uâÄ©'&¸¹é[2ŸT¦éé´oU*oܼ8i’1má |ûmgg'm€¦í𨉍™!B§Ó•ÿôÓÁÿû«~½~=sÿþÅbÖ³]¨ÁšÎ!&¦“±¸ôNnÞºU¥R}›{¢ `ÞìÙXØÇƒÀ€fªL°®×---,KÀç“äíííç/\Xµ|¹••P x-:úDQþ !±` ¡©“'ßøí7B§ã²Ù\çöíÛíí<;;×ñãÍj tº®Î΢’’7ÿúW;[[[›èÈÈ’Ó§{~“Q.—#„›…þöæ›iÿÚ£Õ¨ñÇû÷îj4š)ž;áɱaóÛ”JÃö¤m’ÄQèµÿ‹üǼÅsCgýT~‰¶}ßžþa›M‡ÍÞóÉ'Á'»w¿xðà_{÷¬XöZÕ•þ}džËb’1'gç„Õ«BÍÍÍÿüì³>úhï®]ú0S6‡ceeegg‡·¨Õ†Cfø¯áÇ£ß~›“›ÛÔÜŒÒh4ƺôhR™ ªGSÅžÏ'¢E©ðù¡¯ssoß¹³|¹¡«ááï¾÷žŸ¯ï•³Xèÿ®ß¨Ñj9ìÿ.éüòËXxòÛoíDÆ2Ãb±ôI5jNóXú’cÁšÈ)Xd|:ÑÆe8úB£F2t¸À#T™`)ôå?ôöÆMøÿï̹s³_zÉP.tp@Éår§Q£ð†ÈÑ‘Ðé¾þ…-lOò÷Ÿäï¯Ñhåç¿¿yó¡/¾0«A(°Ùì¯àñx}Œ¥oeÇ—f°†·Þ~;âÕpüÑAÀŸ7þúÄunÞìààpW.¿öË/S¦LqtjµZycÃèÑ£q_µªûÕét¸{ccCíϵA“'ÛX[ÛÆf³Ù,dØ·÷ÿ‰MW˜:8,Z¸ðwßý?CidLõÛ\G§Ó©<àr¹-Íͤ^J¥rû'Ÿ|²m›ÌËë—_}}õjc:{:©LÓ£ÀùÆ=9~ü…|qúô?û“Ã7vìS®®Å%%ø££ƒ¼±ÑÉÉ ÷hhh‰DØnñÑ£z7ŒíDÆ2CÄÿ&áîÝá8 ½¥g}k*?ÿ7XCe¤éD—Áè³ Fÿ¿úï ÷•W|¤Ò^„`Ía³Y½?™éáîÞÚܬÿxº¤D¿=ŒÇKÞ¹3yçNR—ä;’wìÀÛ , }‹r;öÔÉ“Ts†}ûˆ5ƒs™V\îõë×óikk³¶¶ö–Jÿþ»úeL ÿå°Ù[¹rç§ŸîMK[8þ÷çÏö..Z¸ðõ·ÞrttœzúìYB§sæ½òÊ’eË‹õî›oêµ1ŸTfcïé´îÙgÙ«Wgþûß7of³ÙO=ù䆿ÿd]âééòÄu7nàïÅÇïÝ·oI\\·J%àóCfÌˆŠˆ µK»Ñf†ÐéØl¶L"YüÚkíííÓ¦L1¦“!=êk"Xcù!i01hã"íï)»w/X´ˆÅfO ô˜0õßAxÄ`!„‚PÜ»‡?Ë®ªš>kþøm~~ôÊ•ƒæÝ#Êþ½{­y¼°ÈH¼ëêðC}Ûl6›Ãår¸ÜüÜÜ!!T 0.–FßÇôû“'E¢÷Ü¢h¨¯%,l°½ =fÌ`{14+CtÚßùý÷˜+N?Þ/Ú,'ýsšŠÉÁÁlè_J .Y¢¯'K ÃcbàŠ9Ðÿ@•9ø´·µ]«©éhkCu´·×]»ÖÑÞ>ØN}Ơʀžá2vìÀ_VÕ¸€Ážþ|ìù|±ßÃ7ÌÞþÿyxà%¿€¡ Œ)À/Ðÿ@•9øÀ=|0¦U&ÐÿÀ}™ƒÜÃ÷èÑ‹1Õhµ õõã`<¶£ßõ¸NòPtìØ`»0…Íf žrwaº%T™`¨ÕêÇó…äB†€!„N§»ÿÇW**¼||&ZB•9ø´·µýþÛocÆŽå ÖÑÞ^çÎ..¡p°ýzO¯Çô«œœph!_M\[]ý̤I&Ú@• –¬ û÷îEÍ×iµ:N«Õêt:Vûß-­–Åfs8‡óÝñãŽ"Qks³i…Pe>p_棌)ðhÃf³u:™6ã Ì!B.—1o›n¼|ùò}ûöõÝ(Ö“˜˜(‹G˜»¡Û,¦õ`[úI(ŠiÓ¦1±ÒÇØÛÛÛ·mÛ¦ÿhÌg³þô ˜ç¹wÈårgggc£Ü¿˜žQ}×l zz1^=š™ƒâaô0÷ÐôL0¦§wóÇD¯˜˜ww÷É“'£ ³ ØQ ªL°,ÔjõÒ¥KKKKB¹¹¹ &ß»wï»ï¾‹ŽŽî£Q½ž¤¤¤“'OöQBÈ„³>‹D¢Ó§O›5Ñ÷ØIÇYc>›õgˆV™ ólùô×^ðð4÷‹ž^Œó™9X2×cQcÁ„–––üüü«W¯~ÿý÷hÀÇÂ,=:jaö|‡1 ÊËÂÊÊ*---;;[¡P”——ïØ±ÃDã]»vÅÅÅÙØØèÿ?O áoׯ_ïîî.•JõJp³M›6ùúúº»»755‘ôÐZ¹xñ¢T*•H$S§Nmhh@ݺu+88X"‘Èd²S§N!„’““¥R©T* (++câ3BH«ÕFEEI¥Ò   ¬9))Éð„¢\.‰D+V¬3fLjjª1=b±ØÇÇgåÊ•øüµW]]Ý”)S$‰¿¿mmmbbbpppKK‹L&“Éd …‚Ö[’?Ô¬2ÔCâÈ‘#óçÏÇÛ%%%3fÌ`Ò‹)m’‡r¹ÜÑÑÑtžݘ’2ÆÄB¨¼¼ÜËËËÇÇgÆ XBe&Pg1 gA¤q'é‘Ëåöööþþþ ,xúé§×¬Yc"RÃý‹Ú‹û¸qãZ[[õ}—.]úÍ7ßPõPÇ‚ºWRc_¶li¼¨>“FvfRÇ‹šCê{H3Šö¨EÕCõÕu&0 c½ ¡Z§özï½÷‚‚‚:;;}||&OžL;fÆ´AC¨Gc&sÃA\««»~û¶‰6f âþÝ»ø¯¦ª*7+Kÿ1{Ïèo²÷ìù2;[£Ñ¨S=46‚$¨Gc³sCOöž=Yÿú—²¥¥E¡húã{?œ?þüù .\ºxñ·_½}ãÆnÝjüý÷¬ý«]©<ž®ÿËÍÊ" êÉܬ,ç2ÀÒ°²²ÊÈÈÀ·ò„‡‡oݺÕXËŒŒŒ9sæ >œö[{{{77·¸¸¸œœ[[[½ÜÚÚ:22!dkkkmmmVR©¼sç>Ù6þü~ø¡­­­¼¼üµ×^ÃÚ\\\B•••Ï=÷œD"yýõ×Mœy"ÙâñxXóܹsÏŸ?OÛE xxx¸ººÞ¿ŸVR©¼~ýzHHBhΜ9´½°Ï«V­’Édñññ†ªz„±¬ö›Y³fh4šo¿ýV^Ó4´‘2ñPŸç9sæÐæ™:¦L2Fµ¥T*ûí·àà`„>(&£L”4댵$Í(Ò¸Óê6l˜£££½½½P(T*•Æ"%i&õ¢ÆxéÒ¥/¿ü2&&F©Tj4š‘#GRõÐŽ…á^ÙÝÝm6vªÏ´{¥Ùñ¢FJc9£Œaè!ÕÚØÍ7h£ íe6‡f{Ãìјä!ÃãéhÌdnãæ­[AÈd²±ÎÎjµú¾ÁÙz†@• ‹ÅrvvÆ,‹EÛF«Õ~úé§«W¯ÖwÁo°Ùì²²²E‹}ýõ×áááúŽ<Ïðw’ªE‚Áí8*•*""b×®]ÕÕÕ_ý5~êê9Õ)jZ¹••þVï‰i=Æz±ÙìŠŠŠªªª+W®TVVöÈ=Ʋj–ßÿ_œÚ¾};–¼úê«yyy%%%~~~B#ïR¥ö2‹Y™ ¨^)c$hm™Î¡±oIš:I ¤q7«ÏUj¤¦ç˜N§£ÆXVVöã?úøø;vìÙgŸ5«Gïžá^É0v&ó™Ú…:^f÷¦‡7£¨G-ZH2Ü{zÜÀͨ½˜Ìyj/†˜=“<¤µNòöh̬ÇPróÖ-µZííãÓÖÜÌb±žøË_º»º--=ŠªL’äççËd2WWWüQ(vtttvvêï*ëîînmm Y·nݵk×êÁª:;;•J%þèàààââR\\ŒOš4‰Ïçûúúfdd „4M}}½Z­Öh4ãÇGeffÒ꡵ÕÙÙ‰5õ.v@àæævâÄ „þN8|>ßÛÛ;;;!¤Õjñ¯2ÇëèèP©TÆb§B›Uª*cÇŽ­ªªªªªÒ?Î5}úôÊÊÊ}ûöEDD0ìÅ$RZ óH›Ò˜ÒfŒäÕ–@ puuÅ7ÆåççS­e’fꬣíEQ$˜è¡Ô¬fjìÞÞÞÕÕÕA¼òÊ+[¶lÁy6=çiÇ¢w>SGQf&íÜ0»7=¼E=jÑBòêmìfõ0‰1˜ó ar”0ë!­u’‡Ô£1“¹¡×£ÿ¨ÕjÙl¶ŸŸ_{k+®žY,Ögg‹e7lóÀá}™0$Ù±cÇ®]»ômllâââ¦M›¦?Vvvv†††ªT*­Vkâ²;IVµfÍ//¯#F”——#„233W¬X¡ÓéD"QNNBèÀË–-ûôÓO9ÎÎ;§OŸ¾qãFooo'''|­VÕ–P(ÌÌÌŒçóùyyy!™L¦Ñhðménnn»wïfâsFFÆ’%KÖ­[ÀåÒÖrrrbcc“““ ‚X²d‰···@ ˆ‰‰‘Éd"‘¨  `øðáTŸIþ¤¦¦R³JÕc,Û†p8œÙ³ggeeáß]†˜”vÜõy¶··§ÍóáÇIc:fÌjƘØJOOåp8>>>$ëúQfuÖQ¡Î„Þé¡FjV35v.—;fÌÿ©S§Þ¸qï‰&æ¼~,˜ûlx&˜ê3uI3!D/³{ÓCQ¤£­’‡´þlMœ8‘šÕÞ †ÇU*LŽf=dbÝÞÞžz46;7¨þp8œ'Çëhk3^N€ä±’À`Ñ£ß2&ç2Y¸ÊTÜ»‡+NycãÏUUÓgÍ¿ÍÏ^¹²WÕ0`”ý{÷Zóxa‘‘„N÷¿‡ƒm6›Íár9\n~nîŒ?Wˆ2ÆÅÒèû˜;öJXØW990²À Ð£ß²Ùóæ:ôbh(î[RX¸pÉ}=YRXWÌ€þªL ÿ*è Êú¨2€þªL ÿ*è Ê‹ƒ ¹\>bļMÛæäÉ“2™L"‘xyyS¥P(¦M›Ö/^ÅÄĸ»»Ož<™ª911Q,c‡-–ööömÛ¶1l,—Ëiå&Égcy6;Ê=Š`˜ìï0D*, µZ½téÒÒÒR„PnnnBBµF£‰ˆˆÈÍÍ­®®þñÇ===i‰D§OŸî»W---ùùùW¯^ýþû署“’’Nž<Ùˆ ýY IDATw+•¡Xi‘|6–g³£<cL`²¿ÀЪL°,¬¬¬ÒÒÒ²³³ EyyùŽ;¨mººº”Jå¨Q£B<ÏÍÍM.—;::FEEI¥Ò   ††„PRRéÔ×­[·‚ƒƒ%‰L&;uêB¨®®nÊ”)‰Äßß¿¶¶–Ö¥÷Þ{/((¨³³ÓÇǟˤj¦ÂDsEE…X,öññY¹r%>wHê%—ËE"ÑŠ+ÆŒ“ššjL3>´iÓ&___ww÷¦¦¦ääd©T*•JÊÊʃƒƒ[ZZd2™L&S(´zÊË˽¼¼|||6lØ`,.­Vk˜çS§NM:U^^.•J™DÊ$.ZŸ©PÇbýúõîîîR©O†z€AÉþCÖ1X`óG~\ÇüÁƒ111yyy"‘èàÁƒ ´cbbFõÕW_áuBEEEA¤¤¤DEEáfúõ‘1©©©A¨TªÛ·oPZZJÄwß}l,@’ª„Ú€‰f//¯ÂÂB쳓“µŽëêÕ«¥¥¥b±Ø˜æÆÆF‡³ÿ~‚ ºººT*U}}=n|öìY___†Nœ8±¸¸˜ ˆíÛ·c¨yÐç999yñâÅ:ÎÍÍíÆA¼þúë»víb)ó¸L§*lmmµ³³ëîî&B¡P˜èX ÷wú}sî`–·P°²²ÊÈȸ{÷.B(<<|áÂ…´Í233+**ŠŠŠÖ®]ûÃ?ÄÇÇóx¼3f „æÌ™³k×.j—¶¶¶òòòsçÎ!„¬­­]\\°dÕªU!NÇápú+ &š•Jåõë×CBB°Ïü1m/@àááÑØØxÿþ}š­­­###B¶¶¶¡ÊÊʰ°0¥RIDSS•Jåo¿ýŒš?¾±³Jú<Ï;w×®],+666+++11ñÈ‘#IIIL"eWO±··wss‹‹‹›9sæ¼yóz§0îï0D*,‹åì쌋‹e¬™¯¯¯¯¯ïìÙ³CCCããã ¿"?CÀf³+**ú^_RýìfR/¹\nee…õ냢ÕÌãñØìÿÞ¤R©"""Μ9ãããSWW§bÉ´-¥Ri"Û´àö111AAA'N|á…„B!þ 㢵h6›]VVvúôé´´´ƒ=z”¡?À`Áp€¡Ü— C’¢¢"¼Q]]=zôh„Pgggqq1B¨   00Ú…Ïçûúúfdd „4M}}=ŸÏ÷ööÎÎÎFiµÚÊÊÊ^û# ;;;•J¥Þ–YÍÀÍÍíĉ¡o¾ù†a/&mÔjµF£?~#Jž©tww·¶¶†„„¬[·îÚµk´± PeÀ$%%ÅÝÝ}âĉÿüç??ÿüs„P(ÌÌÌ”J¥yyy[·nEÉd2ýc ,@8p 77W"‘øùùá$''';;[,{yyá≠TÍ666kÖ¬ñòòòóóÃm˜hÎÈȈ÷ññùå—_¸\.Ã^fÛØÛÛoܸÑÛÛÛßß«E ‚˜˜™L„¯¡Sõ¤§§¿ýöÛÞÞÞW¯^5»>χú裰0**ÊÆÆfÊ”)ÆzQ#eÕgjžIcÑÙÙ*•J£££ñ4 Õ0Às’~”ËåçÀ†Âªª*R¯ñãÇ“^…ãæævöìY³æôWôŒiF½ÿþûï¿ÿ~4»»»×ÔÔ „>|ûömÚ^Ø.~.Û˜f’{¡µk×®]»oðÁxcÏž=†m¨zžyæ™+W®˜pØÙÙ¹¹¹™*ÿá‡bccM\î$EªwØt\TŸ%ÏÔ±¸téÕª€‡ T™ ………6làr¹øRþ£««+00Çã?~ÜD³G R€žU&< POæ ÂÂÂÂÂÂÛ‹>aggÇä~ÖG R€ž÷eýT™@ÿU&XAà%QOÞ|I‹B¡˜6mZ?ùEƒ\.Çϯ˜^m²ßéǸbcc9Ÿ——çéé)‹ª««±0==ÝÃÃC,Ëd2ÚÕÃi{ݺukÒ¤Ib±xîܹ´’àà`¼ä„ ©š{ç“'OÊd2‰DâååUPP —˹\®···——×öíÛ±f.—‹­ûùù9s¦V€ÞÑû;XPe€e¡V«—.]ZZZŠÊÍÍMHHè‹6‘HD[ uú+®ãÇwuuûö©§žºpáBMMMBBÂòåËBûÛßN:USS³sçÎ×_I/„ÐêÕ«—/_^SS3~üøäädZÉÉ“'«ªªªªªV­ZÕkÀh4šˆˆˆÜÜÜêêêüÑÓÓ!$ +++/]ºtþüyü’N¡Pˆ­ÿóŸÿ¤ xôïþ–T™`YXYY¥¥¥egg+Šòòrcë®_¿ÞÝÝ]*•âr¹ÜÑÑ1**J*•544 „’’’Äb±áÙ¯[·nK$™L†_?^WW7eʉDâïï_[[ËÄB¨¼¼ÜËËËÇÇgÆ X¢ÕjIÖI9rdþüùx»¤¤/ÒHµŽOêlÚ´É×××Ýݽ©©‰j×Å‹¥R©D"™:ujCCƒ\.‰D+V¬3fLjjª±T·´´lÞ¼ùÃ?4ÖÀ×××ÁÁ!$“ÉpP¶¶¶£GnooG)•ʧžzŠI/‚ Š‹‹qáqüøqªÄPCVVVtt4­K¤<Ÿ:ujêÔ©ø«òòr©TJíÒÕÕ¥T*G…âñxnnnú¯lmmßyçýû÷¶ÇsÉXN€þ…áþC¨2À²P«ÕqqqÑÑÑ"‘ÈÏÏoÍš5Ô6J¥rçÎW®\¹|ùòk¯½†…---ÑÑÑ—/_^°`Á{gJLL$½3222<<¼ººúÒ¥K¸ÚˆŠŠÚ²eKuuõæÍ›ßzë-†¶bbb’““úé§ &¬ÿÏÿüþE•†Ìš5ëÂ… ¸>ËÍ͈ˆ0f½¥¥ÅÕÕµ¢¢âòåË:ŽjWLLÌŽ;ª««CCCqÆšššV¯^——G»¤;æ­·ÞJLL6l˜±z233ñËç9Î×_=uêT—üãYYYLz577[YYݽ{÷¥—^9räþóªDß«ªªª­­í¹çž£ÕIÊó´iÓêëëoÞ¼‰ÍÅÅÅQ»ðùüE‹yxxDGGçç瓮Ɏ?þÆX³L&7nÜòåËáåš“ý†.Pe€eaee•‘‘—Þ×/ßbˆ½½½››[\\\NNŽ­­-òx<|‚pΜ9çÏŸ§öjkk+//Çµšµµµ‹‹ –¬ZµJ&“ÅÇÇÓ¾ ‰jK©TþöÛoÁÁÁ!ýéI½õ¹sçÒZ·±±™5kVAAF£ùöÛoçÏŸo̺µµudd$BÈÖÖvøðáÔHI(•Ê;wî`ëóçÏÿá‡BÀÃÃÃÕÕÕØ žŽ;¦R©^~ùeÚo )**:zô¨þEèK—.Ý¿ÿ;w–,Yb¢& õB¹ºº?~ÜÚÚÚ„!”™™¹xñbcjIyf±X±±±YYY*•êÈ‘#Æ:fff?~üé§Ÿ^»v-隬þMòøŠùíÛ·×®]›””dÌ a²¿ÀЪL°8X,–þý—´ËɰÙì²²²E‹}ýõ×áááÔÌŸ!`³ÙUUUW®\Áï}üý÷ßñS ø¹Z[&¹1ñí«¯¾š——WRRâçç' i­#„x<›Íf©±`­¬¬°'ÆRqæÌ™K—.yxxLž<¹¥¥…öZ3B¨¦¦æ7Þ(((àóù¡–––_~ùWØaaaÆî %õrttT«ÕøŸúúú'žx‚*Á‘I›ç¨¨¨Ë—/O™2ÅX¯”””7ÞxƒËåòùü½{÷"„ZZZ¼½½µZí¢E‹–.]z÷î]œO‚ x<Ü— @¿U& =†~éÒ%’Ãá8pÀPRUUEj3~üxÒs3nnngÏží©­gžyæÊ•+†’ææf&žïÞ½{÷îÝ&¬“–ʤµNëÙgŸÕŸŒÄ`%ø]ž¦]"Y4üHòóòË/Sïæ4ÛëÉ'ŸüñÇMKBÇŽ3í*mžøá‡ØØX[ IFCÒL’ô¨2†*]]]<ô.$KªLx ìììhïg°àé ÿ*è Ê‹ƒ ¼Ð"êÉ›/{B¡˜6mU.—ˆŇ§ùaØ2–Ÿ~§½½}Û¶mú‰‰‰¤…4úCÒð׀¡ŸÛ$ =d;m¤CŽÞß` *, µZ½téÒÒÒR„PnnP${»8€0?¤š)))‰ôB†þÐÖ^–?ʆ2Œý¨2~€ªL°,¬¬¬ÒÒÒ²³³ EyyùŽ;¨mär¹££cTT”T* jhh@ž"Ú´i“¯¯¯»»{SSÓÅ‹¥R©D"™:ujCCÑ#Gô B–””à… “’’H'ÊË˽¼¼|||6lØ€%uuuS¦L‘H$þþþµµµ¡õë×»»»K¥RZ÷0ÉÉÉR©T*•”••Q5ÓúCê%—ËE"ÑŠ+ÆŒ“ššŠߺu+88X"‘Èd2ürxª‡Ô(¨¢ Í*5?L¬SÇ‹©Wbbbpp0~i¥L&S(´>Sý!EA«‡Ô‹ÖŸŠŠ ±Xìãã³råJcg©±SÇ‹šCêLÐjµfól6vj¤§Nš:u*þ¶¼¼ÜØzN“ý†6AÜ¿{ÿÕTUåfeé?fïÙCýMöž=_fgk4õƒº»»»ºº:::ÚÚÚ[[•--­MMm--ííªîî/³³õcaøãbiô}L¤§·+•Ù{ö•˜˜˜   ‰'¾ð Æf¸¥ÑÓý†p_& I:;;‹‹‹BÔ...¸M~~þ¤I“BÓ§O¯¬¬Ü·o_DD­Z@àêêŠo¹ËÏÏGñù|ooo¼ò¸V«­¬¬ìîînmm Y·nݵk×hõ¨ÕjF3~üx„Pff&­fª?Ô^Tø|¾¯¯/^@\£ÑÔ××S=¤µE‚6 ³YebÖUµÇëèèP©TúfB¡°³³S©TÓCUY››Û‰'Bß|ó1ŸI±ÓŽ)‡fÛÑš3;m¤ÎÎÎ^^^ï¾ûnll¬^xÿþ}<ÿ` Ê€!‰P(ÌÌÌ”J¥yyy[·n¥m“™™/‘HŽ;†¯Gs8œÙ³gŸ8qböìÙ¸L&Ó?B±`Á„PzzúÛo¿ííí}õêUÜ&''';;[,{yywvv†††J¥Òèèhc¦ííí7nÜèíííïïÏåþ÷š U3ÉÚ^T8››+‘HüüüpiEòÖ Ú(¨Y¥æ‡‰u&P{ ‚˜˜™L„¯,ÛØØ¬Y³ÆËËËÏÏv¼h£ ê¡FA%###>>ÞÇÇç—_~1–|Rì´ãEÊ¡é6‡úè£h=4;m¤¡¨¨(›)S¦èÝÖh4uuu Ç€~„…"Bqïþ,olü¹ªjú¬Yøã·ùùÑ+Wšw(û÷îµæñÂ"# ŽÐétAèt:ƒm6›Íár9\n~nK£ïcZtìØ+aa_åä0Y¹\.‹aIÉþå1Ïj{{»½½=Bèðáý[Ýr˜àèè¸nݺAô†(=ú-›=o^Á¡C/††â¾%…… —,Ñד%……á11p_&€ 7lØÀårðeñ!GWWW`` Çë]‰ @¿U& =ôÏ ýÈcžÕ°°°°°°>*ÜÚÙÙ1¼/€îËú¨2€þªL°8‚ÀËE"#om”Ëå\.×ÛÛÛËËkûöíî £õ£iÛ(ŠiÓ¦ ¼?ú|šîÕÇu±—/_¾oß>Ó’¾@ÅÆX~ð —ýIZZš±9ÿæ›o6¬»»Û˜æ“'OÊd2‰DâååUPP ×ìéé„ß°jÕ*±XŒåX¹V«MHHH$žžžsæÌ¡úÃ$ †˜Ýß`èU&XjµzéÒ¥¥¥¥¡ÜÜÜ„„ÚfB¡°²²òÒ¥Kçϟǯ]Hz]eŠD¢Ó§OŠ?Lzõ¥Ê¼wïÞwß}mBb:?B¡°êO–-[†ŒÌùÂÂÂ矿•ªY£ÑDDDäææVWWÿøãžžžz͵µµ‹-ÂË/}öÙg'OžÄr¼Ç}øá‡ííí—/_®­­ýðÃiýa…Yîï0D*, ++«´´´ììl…BQ^^N»:¢[[ÛwÞygÿþý¡‹/J¥R‰D2uêÔ††„Э[·‚ƒƒ%‰L&;uê”þ|‰\.wvvÆöööþþþ ,xúé§×¬Yƒª««›2eŠD"ñ÷÷¯­­•Ëå"‘hÅŠcÆŒIMME%&&ê_[(“É B(99Y*•J¥Ò€€€²²2Ú6IIIb±ØðlÉgª-Z˜Ø¢B„é(¨¹\îèè%•Jƒ‚‚pV‘‘·|ïÚµ+..ÎÆÆ†*7n\kk«^¾téR‹eVBûvt­VKòë¦M›|}}ÝÝÝ›šš¨3ÚfýúõîîîR©T?Áz7¤9F«‡:Ǩ«¨¨‹Å>>>+W®Ä“Ó†sþçŸ>|xXXiÑ#½æ®®.¥R9jÔ(„Çsss3lbì=š{÷îݸq#^IËËËË„?Ôqï=Úß`Hb¸ºyMUUnV–þcöž=¶FûãCV£×…ጋ¥Ñ÷1=žÞ®TfïÙóàÁƒ˜˜˜¼¼<‘HtðàÁ„„ª¹ÆÆF‘H„·oß¾=nÜ8‚ <<<ŠŠŠ‚ؾ}{dd$A©©©A¨TªÛ·oë{566:99á [[ÛÚÚÚaÆ]½zÕÝÝ ˆ€€€ÒÒR‚ ¾ûî»àààÆÆF„ÐÕ«WKKKÅb1ÕL}}=Þ8{ö¬¯¯/mªä3­-* m‘ì2‰‚$Á½°‡)))QQQÆ:vttŒ;V¡PÐJ.\X\\ÜÒÒR[[K„§§ç´iÓÌJîÝ»Gö'99yñâÅXÈápöïßODWW—J¥¢ÎR›?þøÃÎή»»› ½Ï½ Ò£ÕCcÔŒyyyâ<;99a‡¥R\\L;ç?úè£ÄÄÄ;wîŒ;ÖØXÄÄÄŒ5***ꫯ¾Òét†z6mÚ4kÖ,ê˜677óù|RæIþ÷žÂd€£G¿eíJåôtý¯XnVaPOæfe!x“XVVVwïÞE…‡‡/\¸Ðt{¼ð±R©¼sçÎŒ3BóçÏÿüóÏÛÚÚÊËËÏ;‡²¶¶vqq‘ËåÔîÆ stt´·· …J¥÷—u:^e[ xxx466šxIMeeeXX˜R©$B¿ ‹i¨>?<[ 5SáñxØÃ9sæìÚµ ©ïëÉÈȘ3gÎðáÃi%—.]º~ýzfffqq±F£™3gŽYÉÈ‘#Mø3wî\½?ÖÖÖ‘‘‘![[[Ú¬’ÚX[[»¹¹ÅÅÅÍœ9sÞ¼y¨·cAc´zHsŒš¥Ryýúõœç?þýy…ZoËpöêû>vìXRRÒØ±cy<^UU•L&£ŽEfffEEEQQÑÚµkøá‡øøx|ºZ­V»»»ïÝ»×ØÐ“ ùC¢wôt€¡T™`q°X,}£ÿA5Æ­[·\]]  èUi4Ú:!Äf³+**p}‰’ËåVVV¸»1+*•*""âÌ™3>>>uuu“'O6ë 2ò ÃC²ÅDsïFiµÚO?ý/N+ ܲe‹ƒƒƒÏ±cÇž}öY&³þè”Çãák»&œ4lÃf³ËÊÊNŸ>––vðàÁ£Gön,¨˜m‰ç5c=Ïy…BQVVÇf³ïÝ»wìØ1™LF«Ù×××××wöìÙ¡¡¡ñññ´õ¢!B¡ÐÎÎNc‰1ú…žíï0´€û2`£R©RRR/^ìàààââ‚—ÃÎÏÏŸ4iŸÏ÷õõÅ‹¸h4šúúz¡PØÑÑÑÙÙY[[kL!ŸÏ÷ööÆVhµZcï¸æñx*• T«Õfüøñ¡ÌÌLÚ6T¨>3 ¹w¶˜DA+éììÄb!é¾Ìüü|™LæêêjLâíí]]]MÄ+¯¼²eË–ÀÀ@&Z[†þQƒb’ÕîîîÖÖÖuëÖᇬ™…¡?Ô9ÆP)?ÀÍÍ —k´w£¢ŸóÇ饗~ýõ×k×®}ùå—øÖLêXáêêêÑ£G›V®'66öƒ>ÀEsuu5“( ç2`HÒÒÒâíí­Õj-Z´téR„PffæŠ+t:H$ÊÉÉA8p`Ù²eŸ~ú)‡ÃÙ¹sçôéÓãââ¦M›¦¯`hÉÉɉMNN&bÉ’%´Ï ‚˜˜™L&‰ †¾qãFooo''§?Wi§¶‘Éd_¯tss;|ø0Õg³ØÛÛ3±ÅDµI‚ …™™™ñññöööyyy¸£F£1|jdÇŽú‹×´.—;fÌÿ©S§Þ¸q#00‰„Ö–Þ>Ÿ¯÷‡„Ù¬vvv†††ªT*­V»uëV†½hý!ͱ1cÆ0ÑCÍXFFÆ’%KÖ­[ÀårBxžàoÃÂÂbccIs><<_šG=ÿüΙœ IDATó555wïÞ¥jNIIyã7¸\.ŸÏ7v}|ÕªUgÏžÅ###6mÚ´f͉D¢ÓéÜÜÜRSSIþ$&&Rm@‚…"B¿º¹¼±ñ窪é³fáßæçG¯\9hÞ=¢ôh5úþŽãbiô}L‹Ž{%,쫜YËA.—‹ÅbÓ÷qž;wîÿø¾7ј0„6?íííööö¡Ã‡gddôn!òÌ<Œ2ðHң߲Ùóæ:ôbh(î[RX¸pÉ}=YRXç2zÏóÏ?O*5¨ÀÚünذËå:88àKðý¥ù!£ L€*€ê³äÀC",,,,,l°½ Ÿ§€þªL ÿ*,‚ ô«Aâw©€$ y|$ðÈU&XjµzéÒ¥¥¥¥¡ÜÜÜ„„€$¤ß%`!°ŽùÀë˜?zôã:æA¨ÕêÐÐP„P||<Ö€äñ‘À`Ñïë˜Ã¹L°,Ôju\\\tt´H$òóó[³f H@’ÇG2ØG èo8—9°À¹ÌGþ=—©ÓéE"Þ H@òXI`°è÷s™°öÏ kÿÒÞÞ¾mÛ6ýÇÄÄD±XŒ'O"%éé111îîî“'Oî]wL/ÆB\.wvv[0‡;ØðÀ+ÎáusssËÊÊvìØ1ØNY:B¡°ªª !tþüù¸¸¸ÚÚZ†E"ÑéÓ§™Òh4¥¥¥îîî †Ö?ÿüóU«V•””|öÙgr¹\,c9BèÃ?loo¿|ù2›Í¾råŠa¯>‚«CýÊ„IIIo¼ñ†X,îi¤$=ÌiiiÉÏÏoiia³ûtÚ¢§c1TlÀã œËËÂÊÊ*---;;[¡P”——C‰Ù#är¹££#B¨®®nÊ”)‰Äßßb±ØÇÇgåÊ•ø¼WRR’ái?¹\.‰V¬X1f̘ÔÔTZý]]]J¥rÔ¨Q!çææfømHHH]]mǽ{÷nܸ×a^^^ c¡úCŠ+11188¸¥¥ŸU(´ªH‘"„Ö¯_ïîî.•Jñc¨çâÅ‹R©T"‘L:WØï½÷^PPPgg§í¹L¹\nooïïï¿`Á‚§Ÿ~W±ÉÉÉR©T*•”••Q=d2¡òòr///Ÿ 6Ðæ‡)m6Hsƒ¡uÌç2À²P«ÕË—/ŽŽ¾p႟Ÿßš5kþò—¿dggëØØØ¼ú꫉äâÅ‹æ†B¸ùäÜ+11166Öð´_SSÓêÕ«£££W®\¹|ùrª!>Ÿ¿hÑ"™3gÎ;wÞ¼y†ß~ñÅÔ“ˆØ½ÎÎNÒ%]ì3ÞÞ±cGpp0µ#Õj\øÌ¥éÓ¢¤H•JåÎ;›››mllšššÁPÓzbbb>ýôÓ3fìØ±cÍš5_|ñÅÇüöÛo›î¨Õj³³³Ÿyæ™òòò¹sçnÛ¶íÕW_}çwBçÎûë_ÿZ^^Þ‹±Àþ|òÉ'ÁÁÁú ’”Ÿ¯¾úŠ)5!êÜ0k=%%Å¢ö”Þã ®n^SU•›•¥ÿ˜½gÏ ­Øþ(Ó£Õèõcaøãbiô}L¤§·+•xdu:]cc£H$ÂÛƒœ¥£ÏA[·n]¸p¡R©äp8øl™D"‘Éd­­­<·¹y󦓓µocc£@ ¢¡¡ÁÙÙÙ„Åòòò-[¶¸¹¹½ûî»Ø–§§ç¼yónß¾MÕÜÜÜÌçóùl".’?Ô¸hUÑ*7jµZ‰DõÅ_ttt0tÉ0‡7nÜxòÉ'™tÄß666:99566þå/!âØ±cb±xâĉXBô|,Hþ899QóC)Éun0Ÿ ðˆÑ£ß²v¥ò@zºþW,7+‹0¨'s³²œË „Åb9;;ß¿o?ªgMÆ™•°°°Ï?ÿ!Äf³+**8–+•J&Ý­¬¬B,‹0ùЕ¯¯¯¯¯ïìÙ³CCCãããÍÞa) íììzú„ ­?¤¸ha±X¦Õ²Ùì²²²Ó§O§¥¥¢ËÏÓO?M”ª§sãÞ+ *€!¾Ç‘ ·gÏ„PNNNlllrr2AK–,ñööÎÈÈX²dɺuë¸\.BH&“i4Ü×ÍÍm÷îÝLl¥¤¤¼ñÆ\.—ÏçïÝ»—¶ÍªU«Îž=‹5GFF&$$lÚ´iÍš5‰D§Ó¹¹¹¥¦¦Þ—–˜˜ÈÄ:5.@#“ÉD"QAAÁðáÃmllÖ¬Yãåå5bĈòòrj¤©©©¡¡¡*•J«Õnݺk¦ê¡ZÏÌÌ\±b…N§‰D999L¦boo¿qãFooo''§,ìÝX¤§§ÇÆÆr8ÚüŒ7Ž)ÉÖáÇ©s€~v'†6ÎÎΆ$tss;{ö¬¡ÄÝݽ¦¦!tøðáÛ·o#„¨—¹ñ] ø)ccæ i{òÙgŸ‘$VVV)))†ªÏ$ôwMúC !„ kCÞÿý÷ß_ÿ‘é¥K—¨©zH<ûì³—/_6æ'-úoqøßµk×®]»7øàƒh=d2Ï<ó ~-”j~¨‘Rm‘æmæèPeðXPXX¸aÃ.—ëàà‘‘1ØîÌ xH@• ÀcAXXXXXØ`{X"07à!oeú¨2€þªL°8‚Ëåx<Ú×õé¿í …bÚ´i}òoÈò8Ç0ð@• –…Z­^ºtiii)B(777!!¡õ‹D"¼ãcÈã;ÀÀU&XVVViiiÙÙÙ …¢¼¼\¿@3 ­V%•Jƒ‚‚BuuuS¦L‘H$þþþµµµ¡ŠŠ ±Xìãã³råJ¼êLRR’X,ÖŸ•Ëå"‘hÅŠcÆŒIMM¥5täÈ‘ùóçãí’’’3f „nݺŒñ;uêm›õë×»»»K¥Rc!P}þý÷ß=<<ð»câââ¶mÛ&—ËI‘&''ãUÊÊÊh£ Z'ÅŽºxñ"^ŠpêÔ© L²Á$ ïjjjÞ|óÍ¿ÿýïTÍÔ(ìííýýý,XðôÓO¯Y³†VsPPPvvvWWs÷Ö1X`óG~\ÇüÁƒ111yyy"‘èàÁƒ Ts¡¢¢"‚ ’““/^LD@@@ii)Aß}÷]pp0A^^^………A¤¤¤[¹!tõêÕÒÒR±XLZww·³³s[[AqqqéééA¦¦¦¡R©nß¾MmÓÚÚjgg×ÝÝM„B¡0–7ªÏùùù!!!‡ž1c^Ï]iJJJTTAõõõ¸ûÙ³g}}}©Q³NZqÛÃÃkÞ¾}{dd$“l0Œ¢££#33ó¹çž{á…öïßãÆ ªfj¶¶¶µµµÃ† »zõª»»;­æ+W®¬^½z„ ûÛß®\¹ÂÜI³À:æðˆcee•‘‘q÷î]„PxxøÂ… i›ñx<|Êpîܹ»víjkk+//_µjBH§Óq8¥Ryýúu¼¶Êœ9s>þøcZ=ÀÃã±±ÑØ‹µmllfÍšUPP°páÂo¿ývÛ¶mØÖ¹sçBÖÖÖ...!R{{{77·¸¸¸™3gΛ7V3Õg„мyóNœ8ñ·¿ý­²²¯R­tΜ9»víBUVV†……)•J‚ ššš¨Q0±®T*ïܹƒ5ÏŸ?¯~n6 £=zô /¼ðÅ_àuår9U35ŠaÆ9::ÚÛÛ …B¥RI«Y"‘$''oÛ¶-77wÊ”)6lxûí·º 0À@• ‹ÅÒ¯>‚+-³íBl6»¢¢×"!¥RÉÄ–••Ö@Ð=f„yõÕW?ÿüs‘Häçç' ÛÚÚ̶A•••>}:--íàÁƒG¥ÕLò!¤Õj¯]»Æãñîܹƒ¯òB„J¥Šˆˆ8sæŒO]]ÝäÉ“©Q°Ùl³Öiãe’ &QäææîÛ·/<<|Ñ¢E‘‘‘TÍ´Q¢Óéh5qîܹ¬¬¬Ÿ~ú)>>~Ñ¢EÌýèZ¦Y¡…lK«Õ¶65 ‡çôdV¸/†$ÅÅÅ¡‚‚‚   >ŸïííÒjµ•••ÀÍÍíĉ¡o¾ù¦/¶¦OŸ^YY¹oß¾ˆˆ„ŸÏ÷õõÅK¤h4šúúzj›îîîÖÖÖuëÖ]»vV-Õg„ЦM›|||¾þú똘\(F¨V«5 >G˜™™I«™‰u¬9??Ò¤IÆÂ7ýD?m3gÎ<|øpAAAggçäÉ“ÓÓÓI½˜DA«ÙÃÃc÷îÝUUUëÖ­5j”1Çúˆ²µõnc£²¥!ÔÖÚzO.okm푨2`H" 333¥Ré¡C‡>úè#„PNNNvv¶X,öòòÂÅSFFF||¼Ï/¿üÂårB2™,88¸¥¥E&“-X°€¡-‡3{öì'NÌž=K8››+‘HüüüpGjÓÙÙ*•J£££·nÝjL3Éç3gÎ|üñÇ^^^+V¬ˆ‹‹3Œ4//oëÖ­ööö7nôööö÷÷çù/5­ujì™™™ñññ‰äرcÛ¶m3æä;wd2™‰üP3qrrúûßÿ^[[ûÊ+¯º0‰‚Vó÷ßèС_|‘ÉIn€¾ pppúË_B!Bˆïà0ÒÙ™ïàÐ# ,„AŠ{÷ðgycãÏUUÓgÍ¿ÍÏ^¹²_}Ðþ½{­y¼°ÈHB§#t:A:Î`›Ífs¸\—›Ÿ›;#$„ªÆÅÒèû˜;öJXØW99ý8²íííööö¡Ã‡gdd?~¼¿4r¹\,3¿Kòa°eË– &0/ʆ(=ú-›=o^Á¡C/††â¾%…… —,Ñד%……á11p_&<²nذËå:88à Ü@/X·nÝ`»0ôý¾L¨2à‘%,,,,,l°½èú§ €ß—‰::âû29ލ'·ƒC• 88h5ý}™Z­¶§÷eB• áp¹¢‘#ñ}™g¸HÄf÷ì©qxÆ, ¹\Îåre’––†Š‹‹srr2ñ>=±±±&šÝºukÒ¤Ib±xîܹ´mÌÚÊËËóôô‹ÅÕÕÕÆšQõP­÷N ZFñÇZ­!¤Õj› ¼Í¨2Àâ …U²lÙ2„PdddII‰ÙŽÇ7½ÂõêÕ«—/_^SS3~üøäädÚ6fm=õÔS.\¨©©IHHX¾|¹±fT=T뽓¼/ ¦NjöDfKKËæÍ›?üðCc ‚(..ÆKVFDD{±‘Y[¾¾¾!™LÖÐÐÀÐgªõÞILæè7úþ¾L¨2ÀâÀoÇœú™™™Éü-’T뽓ôÑg€!ø¾L¼È-¾/ÓpÁ[&ÀÓ?`qà+æ=êrìØ1•JõòË/ËårÓ-]]]?Þ÷r­¨¨èèÑ£çÏŸïQ/ªõÞIËÎeÀ£À™3g.]ºäáá1yòä––©TJmãèè¨V«ñ4õõõO<ñD¯ÍÕÔÔ¼ñÆ|>ŸaªõÞIzí30À@• ;vì¸yóæµk×¾ÿþ{¡Pxùòej‹5}úôC‡!„<8ëÏ…d{JCCCxxø—_~9~üx潨Ö{'éÏÀÀU&X†÷e&%%!„"""|||š››Ÿxâ‰Í›7÷Zó'Ÿ|²gϱX|ãÆwÞy‡¶Y[[¶l‘Ë寽öšL& 0f‹ª‡j½w`H÷e€eáìì¬ÑhHÂ/¿ü’ywK2>ùä“?þø£i fmíÞ½{÷îÝf=¡ê¡ZïÀ¹L ÿ*è Êú¨2€þªL°8V­Z%‹¹\®L&Û¾}û@š–ËåØ.&-- !çäädzÙI³mòòò<==Åbq@@@uu5Oœº}ëÖ­I“&‰Åâ¹sçâ—kƒT™`q|öÙg'OžÄ+%$$ °ul³lÙ2„PdddII‰é^fÛ<õÔS.\¨©©IHHX¾|yzŒÐêÕ«—/_^SS3~üøäääþUô¨2`°~ýzwww©TºcÇ,©««›2åÿ·w÷q5ÞÿÀ?çœn,Ýœí4ÝH*É9uº¡L)SøNZJë;kˆ¾än#w#í·¡5Œßï&²Ø—ɦ;Œ¥º#‹J”Õé†ntn~\¿ßYç¦SN:x=þ¸úœ÷ç}}>סëíºÇårGuãÆ >ŸÏb±æÍ›gaañí·ßªÙK͵ûúúª>©NŒ»»»‰‰ !„ÇãUWW+ »r劳³³››Ûºuë¨–ŠŠŠ€€.—Ëãñ²²²ä»H$’ôôô°°0BHDDDZZZ—3€çU&€¶kjjÚ¶m[AAA~~þ¬Y³¨Æ÷Þ{/>>¾°°0..nñâÅ„úúú˜˜˜”””;v¨ßKžì3á3224>¤¤¤ÐÐPeŸFEE%$$\½zÕÁÁj‰ŒŒ /,,ÌË˳³³“ï"tuukjj&Mšdff†×h <•@ÛÚÙÙEGGOœ8qÚ´i„æææ+W®,X°€"‹ !ÄØØØÑÑñÁƒÔSÙÕì%:cÞKs9sæÌÉ“'/^¼¨ðÓ¦¦¦òòò€€BHHHÈÖ­[©1Ÿ?ž¢§§gmm­,³­­mZZJLí*@ÛÑéôË—/gggïÛ·ïðáÃ'Ož¤ÿøãi¥Èçóuuu !4M"‘¨Ùë9+**Z´hѯ¿þjdd¤,†F£u7­©©iGGGKK‹AUU•¥¥å³ 4gÌ´][[[ccc``àêÕ«KJJ!FFF®®®$„ˆD¢k×®iªWï©®®ONN¶±±QclllkkK]|yìØ1Bˆ‘‘‘»»ûþýû !B¡°ªªJ¾Fó÷÷?zô(!äðáÃAAA½4èT™ZgÁ‚Ôõ‘[¶liii™2eŠ‹‹ËÌ™3?ÿüs*æ‡~8xð ‡ÃqvvNOO—OÒ³^äï×enÞ¼™áææ&,--ãââöê2&>>žÏçÏš5‹Çãyzz*›ûwß}·dÉWW×›7oR-‡:rä—Ëõðð Êey‰‰‰»wïæp8wîÜYºt©²äð<áŒ9€Öùúë¯;µäååuj±³³;wîœl u9¦¹¹9ŸÏ'„ 0@^˜›› …ÂNÉÉÉ]Ž¹Ë˜;wîܹ³Ë<#GŽ,((m±±±éò&¤!C†\ºt©Ëäð<áX&hŽe¼ºx<^§–U«V…‡‡÷É`à%ƒ*àÕÕ{O,ÀsПOå¤ìÛ·Íf³»|$!döìÙ*Â***¼½½9NpppKK‹êT|>ßÜܼË5ö 3hT™Zç믿ÎÈÈ ÞÁ³bÅ BÈ’%K–-[VXXèââBÕòº¬2É_ïõ¡Ì™3‡™™™ÙåÒÒÒZ[[UÄÄÄÌ;·¨¨ÈÆÆ&!!¡Ë„êë½ÌЫPeh;±Xœ=uêTBHHHȯ¿þÊçó©ÃŠÒƒ‚±±±ÒGlòx¼ºº:5“ûúúvy ³¡¡!..nÓ¦MÊ$IzzzXX!$"""--MaØ•+WœÝÜÜÖ­[GµTTTp¹\G=Œ½g™@ ¡ÊÐv@OOO__ŸÂf³«««åc6oÞ,=üyýúu‹¥0•ì×»|¥ÔâÅ‹cccû÷ï¯b„ººº555“&M233Sö2ñ¨¨¨„„„«W¯:88P-‘‘‘ááá………yyyvvv=Î Z÷˜¼B¨2´[]~þùçöööÉ“'S{WÁÖÖ6--MY!ØÔÔT^^@ Ùºukssó•+WΟ?OÑÓÓ³¶¶îYfÐN8–  íLMMŸ>}ÚÞÞN©©©±°° ÑhÔGòïéѸ³gÏæåå9::Ž;¶¡¡ÁÅÅEá;::¨[sªªª,--¦’[}jf-„*@ÛÑét__ß'NBŽ;öÖ[o1™Ì'Ož´´´Ü¸qCf``ðäɪՠ­[·–•••””üöÛoL&3??_>†F£ùûû=z”røðá   ùccc[[[êâËcÇŽBŒŒŒÜÝÝ÷ïßO …UUU=Ë Ú U&€ÖY°`ôVêŽòÄÄÄ-[¶p¹Üüüü+VèëëGGGûùù>}ZÚËØØ8**ŠÇã3¦¾¾^afÙë27oÞL‰ˆˆpss–––qqq=sbbâîÝ»9Î;w–.]ª0æ»ï¾[²d‰««ëÍ›7©–C‡9r„Ëåzxx”””ô83h!\—  u¾þúëN-öööyyy²-Û·o§¾üòKiãîÝ»U¤577—?Þœœ¬æ¨ÌÍÍkkk•}:dÈK—.©Î0räÈ‚‚Ù›.oBR'3h!ËÍñL€—ÇëÔ²jÕªððð> ¼‚Pe¼œºûÄ"ÍÂsиpá!äÈ‘#+V¬èë½X,Vvvv_þªLí¢««»oß¾ƒÖÕÕ]¹reëÖ­ ÃJKKÇÇårGuãÆ >ŸÏb±æÍ›gaañí·ßR1W®\qvvvss[·nÂ$?ýôSHHµœ™™9aÂBHEEE@@—ËåñxYYY cÖ®];lØ0eÓá½{÷©×TFGGñÅ|>ßÔÔô½÷Þsqq3f õ~ö„„OOÏË—/+œ—üÚ7oÞÌáp¨£¿”ÜÜ\.—ëëë[]]­0ô*T™Ú¥££#::zæÌ™,ËÃÃcåÊ• ÃÞ{ï½øøøÂ¸¸¸Å‹BêëëcbbRRRvìØAÅDEE%$$\½zÕÁÁAa’   œœœÇBŽ9A‰ŒŒ /,,ÌË˳³³“ijjÚ¶m[AAA~~þ¬Y³”M¤Ó­¬¬>ûì³>ø 55õîÝ»Ô1Ú†††™3gæç燆†~òÉ'„3fäçççççoÙ²eþüùòóR¸öØØØNÏÝŒŠŠÚºukaaá”)S¨m(¿} Wásí¢««»ÿþššBHxxxXX˜|Lssó•+W,X@‹Å ƒbllìèèøàÁêÙéMMMååå„…õõõƒ‚‚Nœ8vêÔ©/¾ø‚Ê|þüyBˆžžžµµ5!¤SŒ¡¡¡]ttôĉ§M›¦p G8mÚ´_~ùeáÂ…×®]£Þin``@:u*Uü]»vmúôéMMM‰„zƒQ§y©³ö¦¦¦ÊÊJ*sHHÈ®]»äó@oC•  uh4šôE;T5&N§ÿñÇTõFáóùºººT¼ô†!e}e͘1c×®]ÔqS&“ÙÜÜÜe !äòåËÙÙÙû/ IDATöí;|øðÉ“'Õ!!D$•””TVVÊß$‘HÚÛÛ#""Ξ=ëææVZZ:vìXBH§yÑéô.×®ð–)ùí½ gÌ^ÿüs5GØØØxâĉÜÜ\}}ýyóæEGGõÕWL&3))iùò円†)))†††ëׯwuue³Ù Ó*\;Ç … <ÏÎÎîÇLJJš7ožX,f±X?üðƒú4U&À ÉÎÎîܹs²-Ôvsssê>nBÈÈ‘# ºLµsçÎ;wJ´±±ét'M§˜äååõ`„Ò×-^¼xñâÅ|>ŸÁ`:tH6æã?þøã©å7ÊÏKáÚå_täå啟Ÿ/Û"¿} WáŒ9hªLèÒ;œà¥„*4U&hªLí³fÍjùÁƒ†††wïÞ•}w¢T]]ŸŸß³¬‹Ïçëèèðx<wüøqeaÞÞÞ'88¸¥¥E> %%ÅÉɉÃáxzzª¹.ù™¶··?Ët@« ÊÐ.AAAÙÙÙÔrVVÖøñãõõõF²X,id1™Ìëׯ_¿~]Ù{t!111sçÎ-**²±±IHH:thNNNQQÑŠ+æÎ«æºÔŸ)¼ˆPeh—qãÆSï ÏÊÊ "„ˆD¢÷Þ{ÏÅÅe̘1ÕÕÕ„Í›7s8Ùcœ ......žžž—/_&„¬]»vذa... _/©&‰D’žžN½è2"""--M>ÆÝÝÝÄÄ„Âãñ¨áõx¦ðÒ@•  ]ôõõÇŒsáÂBHvv6U{544Ìœ93??ÿwÞ¡'Ûé©–3fÌÈÏÏÏÏÏß²eËüù󛚚¶mÛVPPŸŸ?kÖ,e«kiiqvvö÷÷///W tuukjj&Mšdffvÿþ}ƒOJJ Us] g / T™Z'(((++«¼¼\__ŸzÝ¢Á„ !ÁÁÁ/^TØëÚµk£Gær¹}ôQuuµ¡¡¡]ttô?üЯ_?…]X,VMMMAAŸŸßÂ… U ÉÖÖ6--MOOOEÌ™3gNž<¹aÃõ×%?Sxi ÊÐ:Ô‹ÊN"Óh4ùÆöööˆˆˆ;v?~\,ÓéôË—/¿ûî»ÇW¸"]]]###BȻᆱì®SSÓŽŽꦟªª*KKK…aEEE‹-:qâ•PÍu©ž)¼ÐPeh[[Û'Ož?~\Z{µ´´¤§§BNœ81fÌù.B¡:˜””Dikkkll \½zuII‰ÂIßµøË/¿ >\a Fó÷÷?zô(!äðáà ËÁêêêðððäääNÇ#kkk½½½U¬K~¦ðÒÀ{Ì´Ñ[o½µoß¾ÔÔTêG&“™””´|ùr##£””BÇ … <ÏÎÎîÇ\¿~½««+›Í $„´´´L™2¥½½]$}þùç ×rðàÁýû÷ÓéôŸ/ÏÈÈpppPý!xÑ¡ÊÐ:L&óúõëÅÅÅ¡¡¡óçÏW³—šUfZZZkk«Š€˜˜˜¹sçÙØØ$$$(Œ‰ŒŒÌÌÌTÝKYžÜÜÜyóæ:uJÙÞàå€*@{Þºu‹’››ëââÂår}}}«««¥Çù|¾¹¹9!$666 €z|&Ç«««S˜°¡¡!..nÓ¦MÊÖ(‘HÒÓÓÃÂÂ!iii Ã|}}edÊ÷R–§¸¸8"""55ÕÞÞ¾G›^¨2´Wjjª‡‡!$**jëÖ­………S¦LY¹r¥|äæÍ›322¨ƒ ×¯_g±X .^¼866¶ÿþÊÖ(tuukjj&Mšdff¦æImù^ ó´¶¶Nœ8qìØ±<O­ùÀ‹ U&€Ö¡I²ÙììÝ»·©©©²²r„ „ßÿ½giþùçöööÉ“'wikk›––¦§§×­üò½:µ´··'$$dggŸ?¾[™àE„*@ëP‡$ËËË©BS"‘t  ÑhÔ‚P(T?íÙ³góòòÇŽÛÐÐàââ"cjjÚÑÑAݾSUU¥æ¥“ò½æa2™aaaÛ·oŸ={¶êkCà%€*@KìÚµ+>>žbmmžžN9v옷·7“É|òäIKKË7dãŸ}ZlllÅãñÆŒS__ßã•&&&îÞ½›ÃáܹsgéÒ¥ c"""ÜÜÜ¥¥e\\œÂ^*òìØ±#)))''§Çƒí§Ó×€¿177¯­­•þ¸gÏj¡Ó¡ÇíÛ·S _~ù¥´q÷îÝ=XE'C† ¹té’ê ÉÉÉ]öêÔÒ¿éJ-,,:C€Že€æ¡ÊÍC• š‡*4U&€v‰‰‰Y³f µüàÁCCCêáDuuu~~~ÝJµlÙ2‡ãììŸÅbÍ›7ÏÂÂâÛo¿U–ÊÔÔ”Z¨­­533ëñ®\¹âìììææ¶nÝ:ª¥¢¢" €Ëåòx¼¬¬,ù.‰$===,,Œ‘––¦0sBB‚‹‹‹‹‹‹§§çåË—ÕÉLñõõÅLí‡*@»èëë3æÂ… „ììlªÊŒÍÈÈ «¯¯‰‰IIIÙ±c‡Šl7n´²²Ú°aÑ#G´´´8;;ûûû———+K•põêUª%222<<¼°°0//ÏÎÎN¾‹@ ÐÕÕ­©©™4i’™™Ùýû÷fž1cF~~~~~þ–-[æÏŸ¯NfxQ ÊÐ:AAAYYYåååúúú666 cŒmmmU<_²nݺÊÊÊéÓ§¯ZµJþS‹USSSPPàçç·páB…šššÊËË!!!!„æææ+W®Ìš5‹¢§§gmm­lí¶¶¶iiizzzÊ®]»6zôh.—ûÑGUWW«Ÿ´ªL­C]š)=]®®®.!„F£I$ÕÙh4ZTTõtù$FFF„wß}·°°PEu‡þSSÓŽŽꦟªª*KKKù˜öööˆˆˆ;v?~\,ww- ÍPeh[[Û'Ož?~\E•©Ž‚‚jáÔ©S Ï>óù|já—_~>|¸Â$ÆÆÆ¶¶¶Ô%’ÇŽ#„¹»»ïß¿Ÿ" «ªªä{Ñh4ÿ£GB>¬p"B¡:X›””¤ffxQ ÊÐFo½õÖÙ³gß|óMêGÐÐÐÀãñBCCÕL²lÙ2'''GGÇÔÔT…7 |Ê”)FFF)))ƒ R.ðʱLíÒÐÐÐÒÒbnnÞKù7nÜheeµaÆ#Gލ?¤™3gæç燆†~òÉ'½40Ð"¡°‹‘HÍT¨2^-ëÖ­«¬¬œ>}úªU«Ôìb``0aÂBÈÔ©S/^¼Ø›£€>&T475ÑÔK…*@»0™Ì×^{­ËsßÏ‚F£EEEuùf …$‰ÆÇZ‚NÈÝ;wTÇTUVR×t©“ ´ËìÙ³7nÜHÕs………Ì,}Qä©S§ìììÔìÕÒÒB•¤'NœðññÑàx@«Ði´{wï675) hii)/+c ÊxA}úé§úúúÔ“Œbcc !nnnÀÒÒ2..Na/ub–-[æäääè蘚šúí·ßª™‡Éd&%%¹¸¸¤¤¤|þùçš%h!Ï{ÜÜ,ÿi[kk^N“ɤÓÔ:gŽ{Ì´Ž®®î—_~)Û’œœÜe/ubÔ9KÞ)ŸÏg0‡ê²#¼XW_Ÿ‘aimmemmhd$‹›ššøÕÕ÷ïÝ3a2---‹»ºv“‚*þFÈbµ=ª©©¬¨ …„]]]CCC›!C hêÈ$¨2@5ssóÚÚÚ¾¸ºº:<<<99ÙÆÆFY­[·–•••””üöÛoL&3??¿[ã ær¹Ô{Õº„ë2´—££cHHȶmÛrrrªªªÄb1›ÍÞ·oŸ|d||<ŸÏŸ5k!D__?77·Ç+ˆˆ8wîœ@ °´´üðÃeoiß±c‡Ã™>}º··wóÀ+U&€véôFÇ={ö¨ÓkçÎ;wîìÙ*:INNîÔ" ¶°°j®^q8cš‡*4U&hªLÐ~HJÍ<‘‘‘™™™òí¹¹¹óæÍ;uꔥ¥eÏæ¯T™Ú+00ðÖ­[îîî&&&„W]]­,ØÔÔ”Z¨­­533“P3¯¯¯ôà¥TqqqDDDjjª½½}&/„‰D"‘¨Ž‘H$mêdÃó2´Wjjª‡‡‡ôǤ¤¤ÐÐPñ7nÜ»woÿþýÏ;§"¬Ë<´¶¶Nœ8ÑßߟÇã©ß ^D"‘HGGU}ØÞÞ®f*ËÐ: <z‰ùÞ½{©Æ3gΜ >>žÏçw™'""âܹsÀÒÒòÃ?”½]}ÇŽgúôéÞÞÞ˜hgW׎§Oï–—÷ïߟÉd¾öÚk„¶¶¶z ©±Ñjð`޳siI‰:©PehsssÙ“{öìÙ³g:•%—Ú¹sçÎ;»Ì“œœÜ©E: @ Î`àE£ÑÜG²²¶..*¢^Bèt:ÓÔÔËÇnjͦÑhj¦B• cöúëoúùIÄb±X,‹Å‰D,¦Ó»w¥%®ËÍC• š‡*4U&€váóù:::<oĈãÇ/++#„DGG³Ùlù?ʪ¨¨ðööæp8ÁÁÁ--- cÔÉ##ŸYuÀ ªµµõ³Ï>{üø±lã“Ç·lÝÚ­§&£ÊÐ:ÔSÙ‹‹‹CCCçÏŸO‰ŒŒÌÌÌTÝ+&&fîܹEEE666 cÔÉ##ŸYuÀ ª_¿~:::K—.mkk£ZÚÚÚV®Z¥££Ó¯_?õó ÊÐ^·nÝ"„øúúª>)‘HÒÓÓÃÂÂ!iii úÌ##ŸYÍuÀ ŠF£-_¾ÜÚÚzùŠíííííퟬZeeeµdñbõcDPeh³ÔÔTu"®®nMMͤI“ÌÌÌîß¿¯©1Ègî½u€– Ñh«W¯`jºråÊ•Ÿ|bjjºrùòn•˜U&€jhhàñxÔKÌ÷îÝ«~G[[Û´´4===I>sï­ ´Nß°aÓ–––––µkÖt÷a™Uf)zCèßD¢ç3ÐM}§Ôu™åååT¡©NSSÓŽŽêFœªª*KKKuzõ,sï­ ´ Nß½k×®;{PbT™}¥½­íAuµê˜‡55í]u ÚOãß©Á®]»âãã» ¦ÑhþþþG%„>|8((H͵ô sï­ ´®®®®®nÏú¢Êì3e·o«¸óçŸÏg$ )ÿNCBB¶mÛáææ&,--ãââ'&&îÞ½›ÃáܹsgéÒ¥ cÔÉ##ŸYuÀ+ï1ï3jj…Ÿ677?ª©yÎC‚g¤‘ïôÌO?%ÄÅýû›o¨G»ºBì 7N#ý´“¢¢¨…ÔÿüGa@иq]æQ#Ÿ¹ËuÀ‹èè?h*ªÌ>cae•qú´ÿĉÆLf§š››Ïff²°¨(+등AÏ<ûw*éÑ…/„ýî<À !tBèݽcàEÐ!‘ô¸ï?¦MÓàHPeö®‹KG{û/?ÿ<ÐÌl˜“Ó@33‰XüðáÃÛ·nÕ>zd>hða¨2_,ùNCÂÃÕY—D")ÊÏ¿_YiÆfup0ã †þ9¨E$6wîÜ»{× ÿ,ªMx™H$‘HôT(Ô×[ÙØ8»ºªù7\ƒG1)Ø-õæêáaim]róæïçÏSwÓ ž›ÛüÖ{iä;+¹],ËÞâwíÊ>ŸÈ45¥Z$b±&&ðò£ÓéX¬,–½£ã…³gëêë²X}=(¡Ñh::::::ýÌÍ+ËË;ž>u5Júi[[›¾¾þó©1Peö1ÖÀ^>>b±X,‰E"‘X,‰h==m Úà¿S±¢bñNy9ƒÁ2x°D"!„ÔÕÖÞ»w/hÊ—=fhh8fܸ³íFFúxø+¼tètº9›}·¼ÜzðàffTc¶m cÅŠÏ¡ÐD•  ]:=SS"‘”UTtttxxx´¶°è«QÁ³xöïT¶Ê¤Óét:½þáCù«g$b1Žej'ƒþýÉ_7c)[­B})8– /·N¿|$b±„I/ïMPeö%ƒ¡££Sz玭-Õ"‹ïÞ¿?€Å246n}ò¤o‡=ðìß©Hæ_»íàÁüÚÚ»UU–o¼![hÒŒG±ÍÍ5>~xvO?&„ô74T± Z¥©©IWWU&¼¬ÚÚÚètºìuümmmŸ¬Z5ÀÔtë–- £÷.ñG•ÙÇ[Y•WVÞ©¨be%‹+îÝ3a2‡Ò(ôê¥Ð{žñ;íô$#3&³®±±²ªÊâ7¤û@“Ò[·^ÇÍ Z©êî]Bˆýðá*–A«ð«« QeÂËJ ˜ššJX>yòdå'ŸXYY­\¾œN£õê T™}ÏjРŠ{÷ÊïÝëxúÔ {;»úÚZ”˜/´gùN;=óˆFˆÙ€µ ÍÍMM© kllmó¯^}òä‰nXÖ>–ƒ“¿N¿*[íÑÖÚzÿþ}›Áƒq]&¼”„OŸ666zùøHù|³g½]Ì’%x’Ñ+F£Y[Xܺ}›¡£ã4|x-Ÿçe¾èžå;UXŒ²Y,Cö–ê—‹Å2ãs™™ã'ND¡©mdß/ªl´DKKËåÜ\êªY€—ŒP(¼]Vf5x°›-m\²d žÊþj¡Ñh¶¶ý^{MP[Û×cÍèîwJ§Ó©ã”Êy¶·¶Òh4é§gç?KJ²Îœa³Ù¶¯³Ù8þ  &‘HÔÜÔt¿²²¢¬ŒÉdZZZâ]kð2‘H$mííMµY Ìqv–ý®©«Ã;½‘N!T™Z¤åñc ²ýrQÿ;515ÔÕB~MKëÖ**ïÞ­¼{W¿_¿žŒàUE#„N§3èô& X èëáhR[G‡t¹´¤¤´¤¤7Ö"¨«3ùëÇÊ ÊРÜœ®]¾ü¦ŸßÀ×_Ç¥{ µÄbqíÇW¯:»¹©ŽìºÊü÷7ßhhTð7ÇŽy–îø^´Ð³|§Æ&&ùܒâ⦋ñànÐË_0YIDATZt:ݘÉtârMLTGvQeN Ñܨ@cð½¼”X²ìëQhNÌ€æ¡ÊÍC• š‡*4OéÝ??Ÿ:E™2y²t(ïðAÝÇÔ2ö’Ú ßÑó!»;QZe¾ÿÁ“’¤?Rå&ÈÃ^Rûá;zþpÆ4U&hªLÐÿ<ã×_ËJK‡úgI‰úkäóù\¯Ë0õóŒ^î_=ÍÍÍñŸ}ökZZey¹A_ k ÷’½ºSèÕAFffà¤Iƒmmmííÿüë™3Ô²Ù1Ë–I@¼‰êã¹¹¹ïLŸnkoo=dÈ„‰Së¥YÈ ›1ã>ÿ\¶åô/¿ çpü|vÜjR¸å·oˆÆŒôòêôãñŸ~¢–ßž6m¨ƒÃÓ§O‰ò)ß,)Èf["ý“vúô³¼çUæÓŽŽï¾|H:thú¦gfúûùizD=$ ûz½‹ú¦ìììúz jy!ö’êï;~=sfÁ¢EËbbîüùçŸ7o®\¾üâï¿SÑéôÓ¿üòèѣ㷠þ9sæ?##Knܨ¸sgã§Ÿž=w®ÇÙÔ7#<üè?J$iKÊÑ£ÓßyGGGés5åÙ·¼—WÞåË"‘ˆRSS#ìè((,”þX^^îíåE©¼wï?þ`±X§ù…¨˜2ƒÁ`0*ËË¥&=û4{^e>¨®®­­ùÞ{ººº ÃÍÕÕËË‹ú¨±±ñÃ>êà`ko¿hñbi—srrvuÍÍÍ¥ZZZZb–-sptêà°8&¦½½üõ :ŽÁss»|ùòž½{GŒàòx—/_¦:&8Àss³²±™T^^N ~ç‘HDàÇŽ—þJÙ`!7nÞôõ÷—ö²²±‘ÿo–ÂR222!ßíßïìêjecÃqqùæÛo;eèt&Wż¨€rqs³:téòåO;:¨$õÁ¬9s†ØÙ98:®Y»–úÛIÅè«»{xD„ì(,,T6òººº‘‘ÖC†x}áâE…_®üŒdÿW*ûÿQ…›Wa£²ñ(Üze¿©Ð°0eƒédç×_GÍš%ýqUlìê5kFhœ²½dww T6…¿ëTï ÕÙw¨9Íññ7l˜0a‚ŽŽŽŽŽÎØ1c6nØ@}D£ÑÂÃÂöìÝÛãmµþÓO×®Y3-8XOW—N§{{yíøê+…T±£ìIAAõÁ¥¿j’†††_Ïœ ûû^FáÎëPrò»ÿü'0ÒËkÖœ9Ô²³«kQQ‘²^šÝò½|å !äîÝ»OžÞÞTØá””à©Sƒß~;;;ûÑ£GêLYM%EE&¦¦ªcz^eêêêžüï »vípgÊÛoSÿÏhnnN;}zÓÆÆÆÆ:::îîÒ.ÍŸÏ`0þ1eÊÍ’BHKK˱ãÇ7}ú©¡¡aÿþýc–,ùïÿ+ ^ðÑG còäÉ …£ß|“ H$ £S°ž®®žžž‘‘µ,=ÍúŸï¿ß¾s'uH‡ò£åÊ£&#ÌÈȘàïO1119˜”´{ϞصkGŒ±~íÚ‘Êv9/fiaA-[ZYQ#Rÿ –¶[ýÕN%d±XêœJe!³ ù¾êÏHáæUبl< ×Õ­MªÚŒðð¤ƒßûç?=Ú{gR¸—” èr§ šê]aöÊ0MM%‰ ¡*w ¯_/--7~¼lÌ ÂgÌð7Žú‘N§Ë^üG‰ÅÒ}¨õ!ÔBey9“É”H$õÁ¹c '¨pGÙcžžž H;}Ú•Ç»zíšì»µ‰Ê2ÀÇÛûÂÅ‹ååå£}|LLL~Ïɹ|åÊhÕ½4»å½½½¿Û¿_ÐÐP[Wgkkkff¶`Ñ"ACÃÍ’oooBÈá#Gü|} !S§N=räÈüyó”M™Á`tëž§F ËÍ<ÉÈÌÌì_ –ܺE-Óh´ûUU]öb±X #ÿêÕ²ÒÒ²ÒÒòÛ·oߺ¥Îêê‚å+W&&$”ß¾}<5•ú{L£ÑLÍÁtw„é™™ÔE™„ &ûñÇ[7o¾õÖÜyóz¶.ŠD"‘޶êþ}333BÈÀ !Òöû÷î½þúëò}e·€²‘S©ªdV¡pò3ÒÓÓ‰DÔå/uuuT˜ÂÍ«°QÅ–T¸õToR…ƒQhRPÐ7n–”üšžúÎ;*"zì^R}ª×u¹+Tsß¡S&ÓqذŒŒ 1ÜœœŽ?Nýhff&‘HîÉìe*++Ùlöÿ-ÿu‹ !„Éd:;;Ÿú{ý­l‚DÉŽòYÌ ;’’rôÇýüü:eS±óíãsñâEê¨áhoï‹¿ÿþûï¿ûøø¨îÕ]ª·üH¦ææÿ|ÿ½ç¨Q„###ssóÿ|ÿ½¹¹ù`kë¶¶¶ŸNœøíÂ…áÎpçë]»ŠŠ‹© 7UL¹KÒå½{ÆüÑ£G_íØA}Óûpqq!„Nž4iý† ÍÍÍB¡ð«W•e022 ž:uíºuÔ•s555çûMUw<}*‰˜LfGGÇÞ}û¨F&“I]ú)©þ`º5»••OÛÛìí !<ÈÌÊzúô©®ŽŽþ¬…{ügŸµ¶¶ÖÕ×oMH ¡†1! `S\\kkk]]Ý–mÛ¦+*˜d·€²‘S©ââãÛÚÚêêê·o—Ï£pFƒ 244Õ¿ëºÜª¹ïPSìêÕkׯÏÈ̉Db±˜*V:ù×Â…IPËÆÆÆoM˜°áÓOëêë !w++?ß²%|út…É?]¿~S\ÜOÿýïÓŽ±X|ùòåE‹+œ E~Gù,ÂÂÂÎ?ÿï￟!wÊKE¡BËlmk4h——WVvv½@@ÝÒãòF![¾_¿~<—]»w{yzR-^žž»vï¦î.O;}šÁ`ü~Ṭ¬sYY9.xyy¥¤¤¨žr—¤'ÊÕ9cÞó’H__¿¨°0pÒ$ËÁƒÝG_ÿU²$&$0 gW×aNNÿýoIôûõóôñlkûö´i%ê=®’Íf/þ׿'Mò=z„“Õ8pàÀ9³g~óM[{{Ùï@ýÁ¨?ÂôôtéL‘X¼uÛ6‡áí‡ 9tøðîî*d1ŒÑ>>^£G»9ÜÑqéÒ¥Tûޝ¾jooÎáxùø¸»»Ç,Y"ß÷o[ ¨HÙ¶Ýž˜X__oïè8eêÔwýãT8#]]ÝÍ›6-_¹ÒÓÛÛcäHÙí#¿y•5ÊGẺܤʣЌðð7o†…†v±é4JÅ^RMª×u½+,*Rgßщ²’nOLܲu«­½½Ý°aß%%íݳ§SŒ———½Ìóæ¾Þ±ÃÈÐpôرƒmm§¿°4&FáJÇŽóïþýŸÿ >|ˆ]ìÚµãýüN(ßQö˜µ•ÕÈ‘#[ZZ‚å?U¶3:thÿþý©zÎÈÈhðàÁž£FIÏŒ÷ ¼éÙ–÷ññ©­­•>äÇËÓ³¶¶Öç¯ÓåïΘaiañú_æÌšu45U(*œ²ôéÔŸý¿x@ªQ  Î•KT B$IÝ_—5ð<(¾~Ý?(ˆõúë“’¦LžLùùÔ©)ŠnþzeÍx÷Ý9³fI MM)--3n\ÍßÇÂ3ªªªòôñ¹YTD]ð ¬×_—î:±—|nºµ£Äw¤A%EEžcÇ6 ò ÔvÎ<}:ìý÷¥<óôéð¨(¼Ç¼'FûøŒ3¦¯GjÙ³wïÔ·ßF‰ Ðcò'Ê{ýóWÖ¢… ûzе––'.×bРäC‡úz,/0éÉqùp,S‹ØÛÛãt¹Tܹsñ·ß¬•¿9^ ØQ>gòw”?§{Ìà%¦âDù³ž1—^'ûþô|€/:™‡c/©ði ë¯'­*\¨Sþ`|¥U¦lý^qØKj?|G}¢s•iþÆ#\\Rì“ÑÀ Gö1FR ŽeÖ=|öþûÏeHðÂSx´øÿ^x*û`v€ž¡É.‘Hp9hƒ"‘Hh4š;‡S~û¶Âwh¨–yútùíÛÔL"ûól6!äÈ};>x…GEB¨“ÈV™ÔÏT­ Ð-Òú’ò¿Ÿ»ðžj¥QõIEND®B`‚gspiceui-1.0.00+dfsg/html/OM-PnlValue.jpg0000644000000000000000000011270611640201013016515 0ustar rootrootÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀç"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô øOÃz§ƒt=GQðþ•y}u§ÛÏqsqe’M#F¬ÎìA,Ä’I<’kcþOÿЩ¡ÿàºþ&É<ð×ý‚­ôR×A@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@^¡á­Fñ'…n4½M±µ9¤µµH˜¯ØîN P2ǰ¢µgñ…X_¦äú~…¼oq¬ë—¾Öô)ô=nÚ!r¶Ï(%€ày‹"€§ pGêH`¼|ð˜ÂÞñßü"ŸØóûOö¯ÿ>ÿ.Ï/þœûV¦·á}JßAñ‰üAiw«\xr[4ŽÒÝ¢ŠÖ1³¢’ä¸.AÜÀ8À8™\ÿü$ÿñpÿáûü¿´¾ÕæÿÓ_/fÌ~9϶+Èõï iOìýiâxd:â[Ø_G©¼‡íÈÆ%\`„U;Uzªq¸f»Ïù¸_û•?öî€:øŸþk™lþÅ}iw-•ퟛæùFØ+¿7NG63Å'‰ÿ¶üGâ2+á÷©LºÅ’0É´Ò+Ÿð¯‰ÿá&þÛÿCû7öf«>›þ·›åíùú gwNqަ¼ŸXÒì4mGÀ:‚o¼;ÖàŒß\MLÉ)É…ÕdypÝŸ3BíèÄU}kþIÅ/ûçÿÒˆ(è +Ïþ)ÿÌ•ÿc]þÏXw1ůü[ñ$ZLJ.üIŒ–‰a´>U¨–ÒnŽY\±ç$1GL-zårþ1ñü"ÿÙÖvzdú®³©Êb²°…¶y›p]™È!A“ëØF_Ã}Sðóëzcéwz‡ÅÂO¤Åyq²ÆO›É#€ŠÃ*:üÄ’I5ßèÿ´´³~î;¯ 4îü d[ìŠOÞ`¿19é@5_ë¾Ôl¿·ü1:4òÇ Ú­¦¤&ŽÕœ•S"¼hBçnXá@aÉ?-li'þÔñˆô±ù_Øßfýÿ›»Îó£/÷p6ãêsíGµ]Dð…ö£¯Ø}¿L‡Ëó­¼”—~dU_•ÈS†*yô®OH¹†Ëâ/Å;»‹©- ‚ÞÂI.cPÍ ­«’àÀqƒÓ¡é@™E|éâË=*/…c^Ð<¬ÛÎ×Þ¯ˆuˆÒè9p<íÂS+8À._xÆ{ÿøkS¾ø¤ëOá¨üM¢ÃdmÍ“ÝF‚ÚS&Zo.RÉC€;•+µMzeáòø~ß[øtÚ'„m5YRÏ[ŽïPðÞ­tmgH-öqŸ»|²)$ÿd¸Åtž‹AÓ¼ypDÔ¼-¬^Ù">—&űºd™ )”‘Ð1Ã1Û’øï5ÝOûÃÚž­äùßa´–çÊÝ·~Ä-·88Î1œ4-OûoÃÚf­äù?n´ŠçÊÝ»fô ·8Æqœ Ïñßü“ÏÿØ*ëÿE5pþðÇŽî<¡Ígñì–²iöï ¿ö$yHcR©¸œ¶O\PQáßj>&ð†‡¯éÚ™ý¡wå\AöÅe„HèÒî*7ã`;@îö®Â¾Ñäü-ÿ±®ý(ž¶4{_ëž.½×¼%}âKˆµ[­.+…–[&б"É2laÉÞ«Ÿ˜Ù&€=¢Šð}gEÖm¼ áêë}a^0‚×O”Ü£]­£ò˜º3(‘w1€6.='‰|5à¿ YiLÖf´Õod‘tM6fay Eåw`B&°$Qœ1) Õ(¯#ð”Oøç©ZÚx~OYÜhK9²ǶfYUD¦8™‘˨ö'‚æ°þxgNÓþÄ'Ùé÷òÙ\Ë32Úíó”*G›s¹°Aù~=â¹ÿ øŸþoí¿ô?³fj³é¿ëwù¾^ߟ Æwtçêk‡·ð‡`ð6™â}Z #[ò¡¾>%y¤lÍ Ì‘¼Ö]Ë'#kà~ðü ±¿|¡x‹QñÅæµiöüø‚þÒ8gbѤ©g†FùAqóas`¢¼OB{çýŸ<=¯D÷w7šÁÔQçË2E Ò#ÆÌsòy×°|§°Ò/-¼]ñ6ïU´¸ŽïKЬ–ÒÖU‰$‰îg;åx¦ò±¬hGQ¸ôÏÌÔx_±ð·‡ï5­I¤–¨üµÜÌI ª©b8ò@æ¹øgö…Û[nÝ/Ë.ìcŸõXÇ{=°|ÏíwÚdž¬|9ªj7vögÅh“^]>R´ˆJÁ €‡2XK)É õ$­hOà­Âß<q¡ˆôó=ÄÑMb’±!,å .ÒØÊ ‚ØÉ3NO ™\þ¯âì¿øs@û›ý³öŸßù»|Ÿ&0ÿwvsŽ£õæú=¯ŠuÏ^ëÞ¾ñ%ÄZ­Ö—ÂËH-“hX‘d™60äïUÏÌNì“Uô=?YÒ)ðýæ‹©,†Òé¿–ÛYH!•õ ç#ŽAV¥Çê¾]oìM©x—\žk ¸ï-dÝnžT‰œ«F伬F0ƒXOhë¡ø‡HÏ5®»w=åÏšQŒrKŒ˜þ\ ¥A\‚Aä×QEqw¢¾¸ÑeÔ|Oâ äÑî#¹¶ŠyaÚ]ÚdÛ.xÆX“ËsÉÎ¥÷„àŸ\“Z°Ôo´›ù¢ÜÉcåbåF6Du,¼€Ø #8À‡á_ ØøGK–ÆÆk»ƒ=ÃÝ\\]ËæK<¯Œ»pà™<’L~+ðv—ã ;x¯üø.-eZÞÚ?—=»‚Qðqœ ñØ ÐQ@Ï"ÔµM.ûX×õLi—êÞÞv†8¼Ñ÷]„Q!b§‘“ê: Åðv—ý§â;Ù|ù¿á!Š8oawÂlHÌx] 0ʱÏ'ÛÐQ@=ïÃ;]KÂëá»ïë“éQÅQC¾ü±]¼¤@¶ã¸sœn ÃCPðLÚ冻³ªÙêö–†Í¯-ž n#뉣1žIn œã…ÇQEqwŸ ´[ý.{k›­I¯ç½K÷Õ„ánÌéŒ(PIUP¡T<Ö¥„àƒ\Z¿Ôoµkøb0ÛI}åbÙNw˜Ö4E ÜØ,@8È=OVÓaÖtkí.á¤X/mä·‘£ 0WR¤Œ‚3ƒèhÒtØtmÇK·i +xíãi,U(' àz ¹Eqö¿4{Ohw7Æ×DÔP¶vtÞò+»€çn åÏÓš±sà˜óR¸Ó5WF]O滇Ox•$‚ £|lRBË!Rv‚y®¢ŠäÓáæ‹‡ü?¢Â÷qZhw±_[myP³eÉ!™Ø1׌+C]ð½¶¹¦j&îîËPÓFµºµ(Y‰±Ô¬ŠÈAê¹#œîQ@½‚`³ñl~&mgUºÔ…¡³”Îñš=Å€*#0výÍ£åÉ–-sÃÞÓ|9á8|7’ëO$B·{\È®ÌÌ>b1Ž•¹EqéðîÃìvºeÆ«ªÝè–²‰"ÒneàÂ’R6;<ÇIGr>U VÆá»?j}ŽIßûKP—P›Î`vÉ&7À^É÷­Š([- áÇÃøô©a¾¿Ó#ßn°›cs%ÃJÌDeQvüÌÛà–PO<Ÿ |#ÿ_¬´ÙWmô¿é7¼ç÷ÎWïò€©pvç½vP=WJ±×4»3S¶ŽæÎá6KôaüÁÈ ‚+—ƒáì–¾‹C·ñ—‰á°‰F±ÏÈŠ@ˆw€:cwN:q]¥ÍêžÑu/7„),t’ˆŠ–„+(WÁ`rK.I9'$žNk.Ïá…·öW:æ¹g¢J&²´º¸ËW_¸[djÍ·ørNå$âŠó?‡šM§ˆ<5âÔÔôù&Òuvêê¹…ãòÚ9p‚`‚20En‡Ð\ÞhÓêž ×5Hô‰V{X.æˆ!‘FܤjÎÂйÈf°¢€9ûï Á>¹&µa¨ßi7óD!¹’ÇÊÅÊŒl2,ˆêYy°Fq€3çøq£É¡éÚd77ÖÍc¨&¦/#tiæº\þöVu`ìKdäv€1]…W?¨x;KÕ<+áË¿=ìoeši|:¼“4ÙRð»dd€󞂊åßÀZ;h~Ò#3Ãk¡]ÁymåS$‘gO—qb[I9\ø&¼Ô®4ÍgUÑ—Sù®áÓÞ%I$ ƒ(ß‚2ÈT žFk¨¢€97øy¢ÿÂiáH^îÞÒÍÒ[k˜¤h†U}þj9k–-’áˆ$^ €øŽÃ_¿Öu]JþÃp¶k—‰R5dtp8Ñ~mà“ß"s€Aê( ^çÁ05æ¥q¦k:®ŒºŸÍwžñ*I!FøØ¤„–B¤íò3Qé¿4]%ü2ÖovƒÃÉp¶ªdHf\HÒdd’rxÚ=1]eQEQEQEQEQEÏø‡þCžÿ°¬ŸúEuE!ÿç„ÿì+'þ‘]Q@?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPE^úþÏL³’òþî KXñ¾iä¢ä€2Ç’@ühÅÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@ÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@ÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@ÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@ÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@ÏÿÂwàÿúô?üÃÿÅVÅýž§gå…Üv²gdÐH$FÁ á‡øPŠ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®¨£Ä?òðŸý…dÿÒ+ª(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ÿñ—ü€í¿ì+¦ÿél5ÐW?ã/ùÛØWMÿÒØh ¢Š(?RÖôí#Û®<­–“^·È͈aÛæ7ôÞ¼u9àjºx«Bvljp×9œ’!â$˜âCòÝ:¸ÁåC¶#ñ?†¡ñ5½„3\I³½Žë ,ÊY"pz£Æî„µÎFAǃáÝ´>‹ÃÏ$Ö†àIròBŒ× lH  1ˆíùÛ‡ò~e!Ø Æ-rÃKŒi0^ÛX´ï;¥ÆùÒ‡ÈhÆk„3‚cŒ§ROèÐÿh/6­„RM;yO·dë bM‡åm›¶± pH_K𥦵y­ÞÁcw«ÜÊ’‹Å³ñbáeF%˜)ØÇ¸ÞG=O?qðóSº¼Ô%ŸÄžtwš}݃yÐM#…œ/ÏóNcV‘"ž@Uv€uð”i?Ùßmó§ÛæùGÙ%ûG™Û<¾fí¿>6çgÍ÷y©4}nf]D[ùm¥ÂEÑÈgV‚)ƒ‚8Æ%Ç|ã9æ¹ýkÀrêZŒÚ¦¯%ä—¦à:ùÊ<¦·Š&…¼©£b A™Ü9P1ŒçSÂ>ÿ„WK{/¶}«w‘óù[1åÛCLž¾NïmØí’ÐQEW?àßùÜÿØWRÿÒÙ« ®Á¿ò¹ÿ°®¥ÿ¥³PAEPEPEPEPEPEPEPEPEPEPEPEPEP?âùxOþ²éÕx‡þCžÿ°¬ŸúEuEÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@Q@Q@Q@Q@Q@s~9¦ðÜq$Ò@ï©éê²Æ²yÌ72:òõºJçüeÿ ;oû é¿ú[ ðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG¨ü Cá¹"y¤ÓSÔ¥(g"òo˜ídõàèt•Ïø7þ@w?öÔ¿ô¶jè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®oÇ24>ŽT†IÝ5==–(ʆr/!ùFâONH¤WI\ÿŒ¿ämÿa]7ÿKa þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’*¿5+=4T‚úúÊ;­@Ã<¶¢âb‚ÞgPÇ&~d\áN=MsúoeÓtéàÕ¯`{¶Ô'†ÂMeÓMg·AnŸƒ±¿xÝLm±T³£þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’+—ˆîhO4ú%Þ•e.ŸÕÊBk5ÃLÆ?Ýáb|áÈ>U‘œ(è4ÿmÝhñÙÚÀðßEy$Ó­ÖäO³Ê‘7”BþõYÜmc³åçùhÇü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$V}¿Šu‰uícG]2Æ[¸.ÌvH.Ý¡X¡‘ÞV1¸óãhbZ@¸Ú¦CÒi:”:Îcª[¬‹í¼w¬€ ê‚Fp}MeÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEtP?ÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÐQ@ÿü$:§ý šçýþ²ÿäŠÀÒ4Þ’W†Hõ=Aš) –Bo&ùNÒFGN „×I\ÿƒäsÿa]KÿKf ‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ä?òðŸý…dÿÒ+ª(ñü‡<'ÿaY?ôŠêŠ< ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ çüeÿ ;oû é¿ú[ tÏøËþ@vßöÓô¶ظ±·»žÒiãß%¤¦hâ69FŒž:ü®ÃŸ_\V}÷…ôA¤y¡${±zd‚îX\L"î ŒýØÛ€p}3Y~8‡Zk{6Ñ Þû—m6äÁ!fŠàûPPA/„ ŽŠdéËÏÚ?…Öñ¤Ô¡ñ ÕÇ’ˆÈ®í¶D™ž2D@-åxˆ!KIYVIé&Ѽ#™ ¬’Á ¬¿fÓ!+~ñ–kiÃ8p|Äpýì‚qW4½3@Ó¯aµ±’3yh—¨÷m,ª%xå›væ,If‰‰l‘½zç‡Õ¼9©j´ñéÖ7sYÛ¤>#°žà²3ßÇ Com'šw0"g$†ùÔ„e¤#[³_ ¹ƒUƒL¿‹P»ÖRÖL¶¢âXçX -æsà»Â™Áeì&ðÆƒ«Ïqz ï$·bg–×Pš=³Æ*cq±‚îFÆ3Œ6HãbÂÆßLÓ­¬,ãòímbHaMÄíE(ÉäàÖ¼ŽöãPÒ¼ ª3Äm¬Vú…Ι,6÷W•®n[3±Vt3M¿ëY²YU£Ü~"ºø„tëÛ;èí^îkynm¦ºXÌۻǷ¬hÛŒ`È$2ù€!Ò*»ßÙÇx¶owÝ>6ÂdÛ!ÈÂõäG!î7¡¯/ðÔ÷Ú}Ÿ„­ZÓÄqÇ ¥­»Ba¹S „âWl£Fñ’Å ÌPÄ‘ˆaž’þ I~'Ú\[Åv,Ý-Ry#VòÙV-DÄp@f„àô,È ÒŠó¿‡ÜiÚ]¥›[ë)i™d“Ç}mr Wg(Â/1Idé¸.#Œ*‘îWÑ(®Á¿ò¹ÿ°®¥ÿ¥³WA\ÿƒäsÿa]KÿKf ‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ä?òðŸý…dÿÒ+ª(ñü‡<'ÿaY?ôŠêŠ< ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Çñ>Ÿy©è¢ ]Gwkr‹<†4o*xå*X+„g­lQ@ÿÛÌp¨­€;›‰’Ë^ñUõÖ£o£°¸ò–Ö%ÁcråѺm‘G8ä©ë+Ÿð÷ü‡¦®}³ÆôÐÿðs7ÿ"ÑàOù'žÿ°U¯þŠZè(ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ùº ò¿ßëZoOˆã‡RT‡Ãw;jׯåo.DHñÉó\¢q.áû²|Åàãåí>Ùãúhø9›ÿ‘k>kKâ-[û#Cf´žÛÊþ×›æó^ÝŸ³q'Ç;»cœ»‹Ý{VñÖˆ—ÑéZY_Eöåà‚K…3C#G¹È fÚA.Ý‘‡+V"ñiÔPÖ-&’(¡H4ûk;ˆäwŽé—ÍŸtîi£>ò˜e\Æ79ÜûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù¹vñü×~¾åóþÑi4N’F’©ZZ™ LC#mg`­’›°Iç&«ñ"ëO¶¸&×ZýºàâÆyRâ+{™bòÕ“"6Â)yíMèv°o”¨ûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ùº (ŸûgŒ?è¡ÿàæoþE©4}cRºÖo´½SN´´žÖÞ …k[Æ]eiWthAØõ¹\ýŸü”=gþÁVú6î€: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®¨£Ä?òðŸý…dÿÒ+ª(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ÿð÷ü‡W‘öoøGo<¿/vmòq·c¦+¨¢€9tñ‡ã¼kÄÒµUº|î˜xvð;d 9o'<ˆãýÅôúç†n¬%°¸Ñu)¬årò[ÉỶؾòJ˜pIo›>¼õ®²ŠáÒoGfÖiáYÖÕóºá[’„å|ŒrcŒŸ÷ÐQ4Þ¸³¶³›Â³Ékk»ìð¿…nJE¸å¶©ƒ “ÉÇZî( þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ®‚Šçÿá2Òÿç×\ÿÁïÿªz§«ã­n{xîÑL±B.­%·lù·g…‘T‘Ï\c¯¡®²¹û?ù(zÏý‚¬?ômÝtQEQEQEQEQEQEQEQEQEQEsþ!ÿç„ÿì+'þ‘]QGˆä9á?û Éÿ¤WTPàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEQEQEQEW?áïùx³þ±ÿé­tÏø{þCž,ÿ°¬úEk@Q@Q@Q@ÿ?äžxkþÁV¿ú)k ®Á~Ó®| áéÞçY&™lì#Ö¯A1)áVP{íQéoàÝ^òÒÖ×TñÍ{Mh.uRÜ\ “HêùIãž”èW' èkÙ¥ÕïˆÞ\ h5BBÒfÇË!ÀÚ¬K$йÿn—ÿ?ZçþoøõtW6|)¢­Â[µþ²'tgHψ/w2©ˆvH”Ûpõ©?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚¹û?ù(zÏý‚¬?ômÝð†éóõ®àö÷ÿU=LƒJñÖ·¼—n¦X¹7WrÜ6|Û±ÃHÌ@ã¦q×ÔÐYEPEPEPEPEPEPEPEPEPEP?âùxOþ²éÕx‡þCžÿ°¬ŸúEuEÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþÿç‹?ì+þ‘Z×A\ÿ‡¿ä9âÏû Çÿ¤V´ÐQEQEQEÏøþI熿ìkÿ¢–¸{¯øªßÁþ6:õÆ­§ÚûòİÛ³0eC–K˱E™˜~qÜxþI熿ìkÿ¢–¹¿üAšëF:¥ýÞ›©@š;êwk¤ÄU¬YÁ&ep]ƒ>Ü”ÿRÜv€gØø7X¼¶´ûF—i§Om¬K=“ 8XDÖ%Uã„K"¨ûHWØå†òhô xŠ÷J¿µÖ4(-á¹—JymË•’ë}Ó¶g—ÍbwHä4@ ‘ÏI­øÊú > t½6O·¥ì–÷Z}Ì{åÊZIs婉ÊïuXÀ`\3H+ZƒÄž~£vl£ûvŸmi ì×Îk‰¦'b#päãlèÄ¢Œ°?Œ´ÛÏØjÚf—çÝC§ÝBn"hãñ:Çæ3O1x„‰“˜·šÔð}”öPêŠÚLšE›Þï²±c!‹Éˆ«2(2 [õbO&«ÍãXcÔ4  Z^$ÑÊ…›ÂÝÛÚì?6Ü+ÌáˆÈ;r¤Ž¶&ñ®› ¬× ¹RÙç7b4Rm¡†W‰æ›înÊ—`Õ;X’ŠÃñµw£K£­¥„—ÆöôÛÉE…|‰¤ÊuPAŒg'¦{â£ÿ„ÇKil|>{{¸­æûJ&$¸m–åƒß¼pTmSŒe¶Žh ¢±ô?YëþgÙ£žaÆß™FFv(®~ÏþJ³ÿ`«ýw]söòPõŸûXèÛºè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Ãßòñgý…cÿÒ+Zè+Ÿð÷ü‡îÎq×w|qYïà-èwZLfx๻7o’’ÜO.EhÌjŠˆ¨Pª„Rå ,Â¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔ—Ãm>ÛN¶³‹TÔ”Z¼m"-º˜KÜCpvªÄH€T€‡M¡kêŸ ô=^Ö¯.®ÞxÒåé¡¶ieÊe|–„…!™Š” Wsc©­ÏøCt¿ùú×?ð{{ÿÇ«þ»MSQò4ëír;+Yquv5ËÃæ:ža2ààŒ;ÿ(¿>ãQq¤¥Ýõ¥Ô÷3»Z]›¨å „ÂЕárWÍÉÎã×ÍÇà—±B5;¸ôxt˳!Œ›µ·yIY÷FrŒ® …+¸c†í,¯#Òµ[írIŸ"Òðë—Š.À•`%fT`0Ô#Øÿ„7KÿŸ­sÿ·¿üz€+ø;ÂrøwN±û~£=ýô|6CÌØc·T2õ…cŒ–Ë0DÉùEuÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐW?gÿ%Yÿ°U‡þ»£þÝ/þ~µÏüÞÿñê¹¥xOÑ®..->ÖÓÜ"$²]^ÍrÅP±P ®Ä]Î:šÔ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñü‡<'ÿaY?ôŠêŠÑÂääàtÍWÓ4ϰù·}§P¸Á¸¹+·v3µrvF¹;W'$–ffm (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Ãßòñgý…cÿÒ+Zè+Ÿð÷ü‡ºçþ¯øÍð™ióë®àŠ÷ÿŒÐAEsÿð™ióë®àŠ÷ÿŒÐâKKMWÄ3Oc®$wz‚Mþü;ÐZÁºçþ¯øÍð™ióë®àŠ÷ÿŒÐAEsÿð™ióë®àŠ÷ÿŒÑÿ –—ÿ>ºçþ¯øÍtW?ÿ –—ÿ>ºçþ¯øÍjiº¥¦­nÓZ<„#”‘%‰â’6À8tpN 2„¹EPEPEP?âùxOþ²éÕx‡þCžÿ°¬ŸúEuEÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@Q@Q@sþÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôRÐAEPâŸÞhzŒ‘¤¶6vðZ-ÂI¨!Hï¤%ÿÑÒréRaÞÞH“;p‡;ð’Yÿodùsîó~Íö£ËûG•çy=wnò¾|íÙŽ7nùj¾¿ác¯ý®7×u[;[»O²\ZÛ4&7OŸ'FÅX‡ •# / ªv> k·woy$zoÛb¹µÒàXÅ¿îí¢‰ ¯—»*ÑîU ´€È þ8¶Ö”-mv¦á"E»h‘"–w¶[Ÿ-THî§ËbÜåFÒ7Œãø¾Ó¶þ-¸Ò´Ûý.{)o^ÊÍÚ)í#Ødˆ´’6ÙFÐáT‚r¡±ƒÐi> ÓthìRÞ{¶WÜGæ:œ²Y‹@qåŒöù¹éÅW—À6Woö]Ƨ©K¦Ço%½¥£‚Ú+DЂŒ#ÅcwQ½Ÿ®NH€$ºñd¾E×Ùôéíæ´Ô4û)¾×°®ë‡ƒzŽ~dI‡?wq,®¢°Ç…í½ÌS]ÝÌ÷7¶×ÓJå4°vŸ•@ý wlcŒnPEP?gÿ%Yÿ°U‡þ»®‚¹û?ù(zÏý‚¬?ômÝtÏÙÿÉCÖìaÿ£në ®~ÏþJ³ÿ`«ýw]rqüCÑ^îÞÌ¥Ú]Ïomp hÆä\ b­Îã”…u'#œd‚}ãE6·qi–WrêV©º·6í+Ù%24%œæIµ2cÈ`¤ƒÀ¶±ý§s‰Ž¡6 PÊZ6’UMà©ê»âŽP*è¤*ÃøQÝmcU´šêS4³C2îgóDŠ~e#åÊs·] v4žItëuŠÓZK½M¬?´t«ˆ„yÛÊ©2•ÜN#fþ$F±¨xàZZ»Ã¡êS\-Ŭe.0ÜKåÇ7ÌÜ`À#mp@ ¨àÙ^æ]OR’þ[Õ¼šø£ž\@`–Ž5ÂylÀmÃĆš§gðÃNÓÖðZê—Ð}«ì弋{8B¼‰bp±À«¸6G äp0¡iâ¿í¸·²ŠyçŽîâÎ[¨í7Ãg"ÊñÆ%A&æè¤í9ÚC°‰Xb=+ZÕ`º×^Ô4Ö³Ó.Ô}–ÂHÞGh¡‘HÌ®I&m’Ç9;jK_Á§ÝO.Ÿ¬ê¶Üê ¨Ý[Âñlžf—Ì;˜Æ\)Pª°W$±75 iºž›¯X]‰$ƒZ}÷¶åG)@ DŒ ÎgÐ òø×M³²žïT‚ïN†ÕÞ;ƸEak E‘QÌlÃ.Ž¥J’ !rª›ñúÝÖ­ú5Þœtû„ƒý"Hœ¹h’OùfÌÇr0WœîUÏÓ~iZnšÚz\]µ»Þ›é<»pÏåÀÛ P¸W@"DVÎEliZ(Ò®¯îýÝÓߥÔ!ÓÓ)Ï,eãpÏ–ÅZ0Øûêâ’2ßâNšú ßÛYÝ›±¦Kª-Œûcqn‘ïY‚FÆÜŠ î9b1”&†»à#Ä”šË]Ãxö_bó­§1²¨•fÔŽŽ’ e#Ôä0Æ$in×@ùëou¶–ÙdFÛÊ€6Æ0]q‚¬Ï‚° wš¯Œ´-U¾ÕbÑ®’ßGšñ&´I#X®c\˜™Ét9ÈpTüŒ¨ž,‚Hš4Ó¯›TIL-¥(ά’wù{BIß·çUÎò£›Áñ^ÛÞŪjú– ÷6SX¬³y(ÐÅ(`O.5;PåƒchÆ2s%ß„àžúkûmFúÂú[¿µ›o(¸Ì) Gó£# üʧ°ÀqãK9µ·±Iõ¸Óí¯¬í­¡ $ÑÊdËî‘Ô;Â%FYT\¶ñUåýµ¼0Ýù7.a†éâÙN¨ÎÐá°áÕQÉÊíY  Ö|>²³¸²»Óõ=JÊòÏL‡JŠæ#7Ùã$í!ãeˤœgäÀÜ }+ឤxŠß[‚æíîá0™RÒÉäy,ï ŒHÅ.Ã~ ’ØÉ ÒŠ( ¹ÿÈsÅŸöÿH­k ®Ãßòñgý…cÿÒ+Zè(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Á~Ó®| áéÞçY&™lì#Ö¯A1)áVP{í]åsþÿ’yá¯ûZÿ襠þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šäô2 +ÇZÜò]º6™bäÝ]ËpÙónÇ #1Ž™Ç_S]esöòPõŸûXèÛºè(¸Ñ­uˆz§Úe¾ÊÒ¬vý’þ{læ[¼çÊuÝÓ¾qÎ:šÐÿ„7KÿŸ­sÿ·¿üz‹?ù(zÏý‚¬?ômÝtÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Xþ$ðÕ†Ÿ§ÙÝCqª¼‰ªéØê×S!Íä#”y ž½Çz×q\ÿŒ¿ämÿa]7ÿKa ‚¹¿·>Ž2“SÓÑŒr20òÃ)O¸ ŽÕÒW?ã/ùÛØWMÿÒØhÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǪ¿„,¢ÓõÚÂó¼iª¦ ó¼Îsglyw%^çŽ+¨®Ãßòñgý…cÿÒ+Zè(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Áw^*_øymômH™l#y5iQ™|¥Á*-ˆ²qêk¼®ÀŸòO<5ÿ`«_ý´}³ÆôÐÿðs7ÿ"ÑöÏÐ CÿÁÌßü‹^gc¯ê^Ò<+âm¼@–òÙ§K©5Ì7¬Ðo ±†™Ð­)p©¶4qµ‰ [—Þ%Õµ¥Ê%œ®­¼WQZØ\[M|É®‚¬-"ºäe61`ì¾ïÈ@;¶xÃþ€ZþfÿäZ>Ùãúhø9›ÿ‘k›µñ桨é×mfm åô×·ìn#‰RîãÊl…` $ä|«ƒOëÚ¦‡âkŠXL:}ÄÓ[<8%ÖXHóg÷q¯œ›iÚ‹!!²»@4>Ùãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE«¡yvÚ¥ù‚K­:ì[<ÐFcIsr†YŠàJŽvçŒàlP?öÏÐ CÿÁÌßü‹GÛâmb/ˆz§öMÖt«3íwo·÷·xÆØŸ=úãsƇÛ>Ô>Ï¥ÚG4s]›}=&¹“M¸xîžè"­Âº„Hâ Äá°\£ Ó𷯬té÷ =ÌÞU‡Úd¸µ¹‘î~ØË¶A9,ˆª\Œ³í¢¬`.@;¶xÃþ€ZþfÿäZ>Ùãúhø9›ÿ‘jMÿRÕ´Bw–Ò9Åí彩X¬kÏòç)¸à®sŒf¹xÃZÕt Ýjoi(Ô_ìr „Å:Ê yü×ЍeA„ ó+¤€¨o,tŸlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"×AEsÿlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"×AEsÿlñ‡ý´?üÍÿȵâKŸI§Ù­þ•¥Aju];|jrJëþ™0¦œõç¥wÏøËþ@vßöÓô¶è+›ñÉ™|7[Ç“OO1¤ŽQY¾Ù` =ðqèk¤®Æ_ò¶ÿ°®›ÿ¥°ÐöÏÐ CÿÁÌßü‹GÛXиÙâ@P’ÍÐxR›UÒ|û…ŒOÅŬ†0B»C3Ä\IPÅ7mÉÆq“Œ lñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"×AEsÿlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"×AEsÿlñ‡ý´?üÍÿȵ_Ây&¡â–¿‚.Žª›ã‚c*/ú¶0ÅTž1ü#ÓžµÔW?áïùx³þ±ÿé­tQEQEQEsþ!ÿç„ÿì+'þ‘]QGˆä9á?û Éÿ¤WTPàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEW?àOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-7~×"K‚Ú ­àˆ›xf²d…âÚc-õ ${nèò»d8q›–ÚF‹£‹k{-"ÒÕ Á’%µ³ ©)sµp„ +¸ã9 ž@>ougâ+A¼žÒÃRÑ4û^¨†ò{{“k'–…Úts0”¶\‘„P~]¶5 ëŽ{k¦h2iÖ†âá­tÙ$| útð–_-Ìh,Š6CrpøPÂî×°3>™¦éð\\B-¬WtóÌAR5,î•0HÆ ©-o|-âï.UKù¢ûD ÔM1ècNU†\ðFqÿ°ot«¿:ÃK͆Ÿ­ý®ÒÂÕ£LÀÖ>K”²¢þúI‚W?9ä‘»Ä^ÔµËëíQ|)WWšV£i âÜ\Fï )÷X”¡l#¨;rØï4«mJ¸¸Ñô›;K'êk{[qâBÊ®v€ >S_”gµ\°¾·Ôôëkû9<Ë[¨’h_i‘€*pyu¬{=:];Å·2Ûéû4Ùtû;8L;!òšåˆÛB€ñ¨À?|``1†ùãÔe3øöÃJûW“âS¨]•¿K˜eXâk[“n ¿™»÷hñðÑ…ÝæOšYÀ=Riá¶@óËH]P3°PY˜*Ž{– Ü*Jñ¸ü/âK¯êÚ>´špúmÌ:iòQ'ž9Ù®³M.çhÈV™ÈgqÏià]>÷Mû|7Z<öQŸ,¥Äí’èüÀ´«²+M—›å2PPAk­é×’ùpÜ|ÆWK£ y¤WE,f2H ž„¡^O7„5!­ «ÿ ÿjØ Aæ{]Öïæ!›T`vÈáN>Ór‹ÕHá¥Ô`Ðì-58§QZEæK,‹!,r63†%äPçÀV'rã%Tb¹ÿÈÛþºoþ–Ã]sþ2ÿ·ý…tßý-†€: çüeÿ ;oû é¿ú[ tÏøËþ@vßöÓô¶ÜšnP$ñG*W êV §žá€ ö ¯y¤éºŠN—Ú}¥ÒNˆ“,𫉲Èä+@= $V_ŒluK­í: pI­ØJ·V+;aÆUÔöù£iœ}üåH 9=Á¾‘¤ß[+I-Õ³Ác¤Ý<á䊚VŽçqÇ1ÇtÈbÀ !eådÅt¤žÐtMN-BÇM¶Ól’¼€ØËEû°Ÿ2yŽÄÝ¿¸ljX®…cy§YA –™VÖÌ„·ó•“r®Ôݰ1c'—LñòøãP—JÓîlâMqiäkÑÜ\†yŒ í Yk3I4Ï+>¶Á¸!,^_ øºMJ¸¹nºu¿¶j­k2F$…-ÞÙŒ'+µ¤‰©.s q.Ÿáýzòü\éÖ7·m²º3Ú«œa&’Ãæ_ŒûŠÐ±°³Ó,ã³°´‚ÒÖ<ì†Äh¹$œ(àd’òù­¡ðê]ÝêZ'öO‡.uhôµ¼µ´q)··X¥L±¦+†I¸1G • ´ôm#ÅÛøJæÖÖ;»e¤Kß”‚K(Àí«™Ô eRX¬ldl' ¸ög†å Á,r vBÈÁ€eb¬8îGbª÷:¥¥¥ìr¼Ÿhã"w%UãF?(8¥L“ÐzG™¿†5-:ÄÛÙx?ÌŽßP½š!’Ý#”<Å£bT0ȱˆ’9”³Æ<Á倷QâíQÕ5ÝæÎß͆ÛošÛÕvâúÊ^„ŒüÊxþî:YðÝ[Åqo,sA*ŽHØ2º‘AG9©+Ïü¤êZœ¿‡§ÓaO³·¸€=¹@•’u &˳e¤0L? P\ÿ‡¿ä9âÏû Çÿ¤VµÐW?áïùx³þ±ÿé­tQEQEQEsþ!ÿç„ÿì+'þ‘]QGˆä9á?û Éÿ¤WTPàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEW¡[øÃDðö™¤ÿdhs}†Ò+o7û^eß±îÇÙŽ3Œã&» (ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ùº (ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ùº §ªÞM§éwvö’]ËnXS9oÈÔí Øj±Â~ó^ñUÅ­±Ð4inn_ñ)m îslEO¨,ʤ³×¼Uyqul4 +›gÄˬJi'cŒ[Q€$èAÃ+(ØÑ,áŽßû@]Çs|‰$—ɲ®2‚< íPORIfff5»8d·þÐ7qØ\Ø£ÉóãlKŒ¸“$ˆ…”‘ÐU•Y@)ý³ÆôÐÿðs7ÿ"ÑöÏÐ CÿÁÌßü‹ZšUäÚ†—owqi%¤²¦æ…ó•üÀ8=Fà­‚7*œ¨¹@ÿÛ}Ï/9@Ø`„TšÆö -t´‚ÚêËdºvÈâ’?¸¿(ÊÆFQ‚à”fQÖ€+ý³ÆôÐÿðs7ÿ"ÑöÏÐ CÿÁÌßü‹Zš^¥­`·p¬ˆ ¼o€ŽDrއŒ«+.A ã ‘ƒW(ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ùº (ŸûgŒ?è¡ÿàæoþE«ŸyhÚÝø‚;­Fì\¼0HdH±qUKdD;F7cœdìQ@Q@Q@Q@ÿˆä9á?û Éÿ¤WTQâùxOþ²éÕxþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQEQEQEQEQEQEQEs÷ÿñL}§V‡þA<ú…¸ÿ–Yî#›:½Ë¯Ï¸K$M®ÜE}}éñ8’ÒÎU*Ò09Y¦SÈ à¤gîðÍóíX£ñßü“ÏÿØ*ëÿE5tQEQEQEQEQEQEQEQEQEQEQEQEË®‡âK}cS¿µÖô¯ôÙU€¸Ò¤‘âT*F\/Ê>fÆÜî@±Uôë_ßjÖßÚúÙ÷km»û"cæf¥Ý´ñþ·çîç¾a\ÿ‡¿ä9âÏû Çÿ¤V´hz6±§k…íö©cq öÙ$‚ÚÁáýòª§™¹¦~¨ª¥z|ŠFíÝPEPEPEPEPEP?âùxOþ²éÕx‡þCžÿ°¬ŸúEuEÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@Q@Q@º]x“SÖµ¨,5 *ÒÖÂí-‘gÓäÛ0E)bÂte#íV>Çãúèø&›ÿ’¨ð÷ü‡†®}ÆôÐÿðM7ÿ%WAEsÿcñ‡ýt?üMÿÉT}ÆôÐÿðM7ÿ%WAEsÿcñ‡ýt?üMÿÉT}ÆôÐÿðM7ÿ%WAEsÿcñ‡ýt?üMÿÉU]î¼I¦kZ,ú†•wkvöΰiò@ëˆ%”0c;ޱŒw®¢¹ÿÿÈsÂö“ÿH®¨ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬êšfŠ'°0-Ô—v¶ÈÓÆdEógŽ"ÅC)8N2:VÅsþ2ÿ·ý…tßý-†€±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’« ¢€9ÿ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’ª?B·>ž Œ‚ÒK‹T¼)#&-Äb}̤O+~ãîÏÇ›MâM2?ßIgo>§É>”н¢J,ïòÊUTH6ýÓês@§ØüaÿAÝÿÓòUS²Ð|Ucu¨ÜE¯èÅïîÄ¡´ypEX_ôž›cSÎy'è9øÇãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ®‚ŠçþÇãúèø&›ÿ’ªÆƒ¨^]¶§i~`’ëN»Ï4˜Ò\Å¡‚b¸…Æã¹ã8Ïø{þCž,ÿ°¬úEk@Q@Q@Q@ÿˆä9á?û Éÿ¤WTQâùxOþ²éÕxþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQEsw—šõ׊®ô½.óM´‚ÖÊÞášêÉçgi^eÀÛ2„v=MIö?ÐwCÿÁ4ßü•EŸü”=gþÁVú6îº çþÇãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ«ž#šú×Ã÷—zh‘îí\$1ǽ§í<ȪS 7dF+ƒÑ|]®êŸÚWW—ÿaÓ­-&ÔÖàÙ†Ûk/“=¡uÇï0‚ê7ŸùfÃví®@;±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’«“Õ,m¼Eḵ?éZlšÈÖ,­¦…àIÉ ä#ìûÊ#cd“Þc%h·ñ]ÉñÊxR&™¶â]9m!û&È [g–)£\™ ±J”1B¥—qè,´XÝj7kú1{ûq(m\Gý'¦ØÔóžIú Ÿcñ‡ýt?üMÿÉUÇÁâ-GUÕ|=yyâ°Á6«QÛ[mŠ;›wµ•á•ÄŠ[÷Χ €_õ¨ÄGá;Ã>O‡EÌø´Ûºê2ØÎ¯t’É 4íx­¸%ý`;dò×iö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUyþ•ª^ê~ÑÄÚÜú„Úh6óîž]Cp»‹/”“ØîËd×°P?ö?ÐwCÿÁ4ßü•Tõ+ŸhÑ[]Üjz5Ì {ko$QérÄÅež8‰ nç¡é]esþ2ÿ·ý…tßý-†€: (¢€9=6çÅZÌW7vúžmÞÝ[Çš\²°X§’ K …™è:ÕϱøÃþƒºþ ¦ÿäª<ÿ ;Ÿû ê_ú[5aøû^ñ‡q:R\OnÆÍ~Ͼ8æ·&i°71šè `ƒx²€n}ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•\Þ—â]^çR°ŽMN6Óõ ƒx×B­íd–Qg»q:¢œ\:–ß$Asìõ 6ÓÇ–qÚϦ꺅αuÓÚN°ê®'Ì7¸&X"Ú0Û×îEµÕÜÚ}ÆôÐÿðM7ÿ%U;ÝÅW×ZuĺþŒÂàÜDG—ŒRE†ÿIé¶F‡—ð÷Œ'×u 'ö•¦¤.ž+»Ÿ-"ca4–—lÐd ¨Ê ¿z@@í†PÔîµ›ÛïÖ®àÔc’ÓBÔåmDGyžèy‘¹D !P䫲X`@ûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*¸½ ÄöÚKÆÉ{£Xhrk¾KµÚ=„(lü”‘•>j,‡jº\d±p0ôokrG§_Ëâ›ë»çÔ-™´ç¸¶…&it¡4qŸÝü‹$¹Œ»Ü ã}z‡ØüaÿAÝÿÓòUcñ‡ýt?üMÿÉUÉÅâéõ+;Ø´ŸÇ~ŒúK‹ûh¢ ]]¥P©(*²uÞw3qŽÓÃ×ú)’êO6hnî­L…@2g’%fq À$àÀ¯ö?ÐwCÿÁ4ßü•QÙÞkÖ¾*´ÒõKÍ6î «+‹…k['‘¢xWtÎ"cØtÒW?yÿ%Fÿ°Uÿþ´ ‚Š( Š( Š( ¹¿̶ÞŽwSÓÝ„q³±ò¨%°žÕÒW?ã/ùÛØWMÿÒØhÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆk ¢€9ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üfº (Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆk ¢€9ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üfº (Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆk ¢€9ÿøL´¿ùõ×?ðE{ÿÆj¿„/bÔ5ÝB“¤oª¦ð<.1gl9G‡Nãž½+¨®Ãßòñgý…cÿÒ+Zè(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¸Ömtˆz§Úb¾“ÍÒ¬vý’Â{œb[¼çÊFÛ×¾3Î:Ðÿ„ËKÿŸ]sÿW¿üf‹?ù(zÏý‚¬?ômÝtÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã5ÐQ@ÿü&Z_üúëŸø"½ÿã4Âe¥ÿÏ®¹ÿ‚+ßþ3]ÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã5ÐQ@ÿü&Z_üúëŸø"½ÿã4Âe¥ÿÏ®¹ÿ‚+ßþ3]ÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Xþ$ñ-†¡§ÙÚÃoª¤ªéØ3é7P Åä'—xÂŽÏ=:×q\ÿŒ¿ämÿa]7ÿKa ‚Š( Ã~%°ÓôûËY­õW‘5]G& &êd9¼˜ðéS×±ã§ZØÿ„ËKÿŸ]sÿW¿üfÿÈçþº—þ–Í]sÿð™ióë®àŠ÷ÿŒÑÿ –—ÿ>ºçþ¯øÍtP/aâMLÓ­¬,ìuÈímbHaOì;ãµ£&,œ:ÕøL´¿ùõ×?ðE{ÿÆk ¢€9ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üfº (Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆk ¢€9ÿøL´¿ùõ×?ðE{ÿÆk>ßYµÕþ!éfŠú?+J¾Ýö» í³™m15wNÙÇê+°®~óþJÿ`«ÿýi@Q@Q@Q@sþ2ÿ·ý…tßý-†º æüs Üøn8ÈMOOF1ÈÈÀÈG ¤>à‚;PIErz¦ƒ hÖ {{{â]÷zÆ¡+w *HX’Ì=j¾‘§xc]{¸¬5íRâ õ}F b,»—trH¬ ãœt4ÚQ\˜ÐtÖ_I[ßÄ·[—Q¬jV6bªKù›A%[ œ¤ã®Â¥ÿÏÖ¹ÿƒÛßþ=@Í h­pö묙ÑÞ1â ÝʬHRG V÷Ú}*OøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ®Ãßòñgý…cÿÒ+Z?á Òÿçë\ÿÁíïÿªþ²‹OÔÎêUäMWNÀŸVº™o!£ÈTõî8ëÖ€;Š(¢€9ÿÿÈçþº—þ–Í]pþðÕ†¡§Þ]Mqª¤ªê9j×P ÅäÄIއ=zÕu¶£“jž#ŽInÞÊ9&ÔuHá’u,¦5•œF[(ÀÜ‘“@Erz¦ƒ hÖ {{{â]÷zÆ¡+w *HX’Ì=jçü!º_üýkŸø=½ÿãÔÐQ\ÜžÑaxR[ýegÙ·ˆ/AvÚ[ ûîNÕcØÚ¤ÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: çï?ä¡èßö ¿ÿѶ”Â¥ÿÏÖ¹ÿƒÛßþ=Yöú5®‘ñKû4·ÒyºUöïµßÏsŒKiŒy®ÛzöÆxÏA@…Q@Q@Q@sþ2ÿ·ý…tßý-†º çüeÿ ;oû é¿ú[ IâÝ6ïVЖÒɤIÍ휞deF©s³à®UT¶9Æ0zW'­x[ÄVòêÒéóÏ«5ÏØZf¿òÜÞF­*Io±^XÑY%Ú6‡,êŃ;jwšFƒ-Î ß<°Û[­ÃŒI4©³ Ú ‚@äŽ:Ö=ö³â ÆöMFÒÆûeÝ”v“Y!‹í 4É‘ùo!Ù"äá‹í;צPmà¿[ÙÝßÇ£Z%ô©rÛ´Ÿ´Áö«Ð`N6¢ÂÖ§g›´¬), Šê\û¼ß³}£hòþÑåyÞO]Û¼¯Ÿ;vcÛ¾ZØ¢±ô?YëþgÙ£žaÆß™FFv(®Ãßòñgý…cÿÒ+Zè+Ÿð÷ü‡ß1UÞ2Œ‰• 9=Ÿü”=gþÁVú6î°õ‰è×W6rérKwl—Æh㘠Cžç(šgR3‚ à•m Æâ)þ!Ô, »Òžîa-óA3Y½»íɘ“»*ùb ¬PHNâs§xOÅZ\¾¶‹K€ÛÚŦ·Q±!—íq«ùë·v×fe̾iBHUÇa®ø—T‹ûOLÓ´Ùÿµìí%¿Sócx—&S¹¥eØcù[ )VùQŸ 9òÚ-^H§°Ð­nä³Ô$º…eŠFvùAû’¢BY•ÝäP ØÇNñW‰-ü5,Õ̇ZÑôËû½`@°‡ŽU ÖÈX#F¡¢”¸!NL]öȤ¤ñw†òxtiZt &vV’Þû y$TrTÂûGüóGƒl¯mµù¥Ð'Ñ-f´µÍ¼·1Íæ])šMÈì]ˆh‘ðÏ´g¥W׆ÞÂx5kéïf“Pû|sÁqsÄþBÃĆgü¡º¹ûØÆ­øA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâhoh'ìåmg‰­­"³¡¼š6Ž(÷lÚUÁ ºïûÛ]×8b È<=¦[i1ii†Ò;t«$ò;DÞvòìŘùŸ7$ç¿U?øA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâhh/~·¿efYDÄ%äÊŽâw¸RÈkâY†àqž8â·!…`Bˆd »?Ï#9Ë1cËq“ÀèÀVü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ4ÐW?yÿ%Fÿ°Uÿþ´£þOÿЩ¡ÿàºþ&®i¾Ðtk†¸ÒôM6ÆvB%­ªDÅr P2ǰ  J(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈsÂö“ÿH®¨£Ä?òðŸý…dÿÒ+ª(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüCÿ!Ï ÿØVOý"º¢ÿÈsÂö“ÿH®¨ ÀŸòO<5ÿ`«_ýµÐWÄ;ÿ’‡â_û ÝèÖ®~€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ÿ¢¾¢€>ßñü‡<'ÿaY?ôŠêŠùƒà—ü•í þÞ?ôžJ(ÿÙÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀç"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙgspiceui-1.0.00+dfsg/html/User-Manual.html0000644000000000000000000007470511633505073017020 0ustar rootroot GNU Spice GUI - User Manual

GNU Spice GUI
User Manual


Table of Contents

1.   Introduction

2.   Menu Bar
2.1   File Menu
2.2   Simulate Menu
2.3   Settings Menu
2.4   Help Menu
3.   Tool Bar

4.   Main Window
4.1   Node List
4.2   Component List
4.3   Analysis Notebook
4.4   Console Notebook
4.5   Status Bar
5.   Files

6.   Software Design



1.       Introduction


GNU Spice GUI (gSpiceUI) is intended to provide a GUI for freely available electronic circuit simulation engines ie. GnuCAP and NG-Spice. (It should be noted that GNU-Cap is not derived from the SPICE code base but is an independent implementation of the principals used to analyses electronic circuits.) gSpiceUI uses gnetlist to convert schematic files to netlists, gWave or Gaw to display simulation results and gschem is the preferred schematic capture tool.

Here are two screen shots of gSpiceUI in action; the first with GNU-Cap as the simulation engine, the second with NG-Spice as the simulation engine. The GUI is designed to be as consistant as possible between analysis types and simulation engines. The intention is to abstract the technical particulars from the user so that the focus may be on the simulation rather than the simulation engine or even analysis type.

It is important to realise that a simulation engine "models" the performance of a system and therefore can never be 100% accurate. And the simulation engine itself is an implementation in software of the model and so is subject to bugs. Consequently, as the underlying model and implementation improve the modelling performance improves. One of the reasons for the choice of simulation engines to support was that they be in constant development. This is also one of the reasons for supporting more than one simulation engine; if the same or similar results can be achieved using two different simulation engines then it's likely that the simulation results will bear some resemblence to what actually happens in reality.

The skills and judgement of the user have a profound impact on the usefulness of electronic simulation. It can be a technically demanding process requiring considerable thought, practice and persistence. The alternative is to go straight to building prototypes; in any case ultimately prototypes must be created to finalize a design. However simulation is generally a rewarding step in the development process, even if it only provides a better understanding of the internal workings of a design.


Return to top


2.       Menu Bar


The menu bar provides access to almost all of the functionality provided by gSpiceUI. However there are a few functions that can only be accessed via command line options.

2.1     File Menu

This file menu contains options mainly associated with handling netlist and schematic files.

2.1.1   Open

Open a netlist (circuit description) file containing component definitions and load it into the NetList text control. If the netlist contains simulation instructions gSpiceUI attempts to parse them and the settings are displayed in the GUI.

Notes :

  • Be aware that gSpiceUI will modify the netlist file; it will change the formatting and remove things it doesn't understand. If this isn't OK give gSpiceUI a copy of you're file.
  • There is an upper limit to the number of lines which may be displayed in any text control (the underlying file isn't truncated). This setting maybe adjusted by the user, refer to 2.3.2 Preferences Dialog.

2.1.2   Import

Import one or more schematic files. gnetlist is used to convert the schematic file/s to a single netlist file. The netlist file name is automatically derived from the first schematic file name in the list with the file extension changed to .ckt. Eg. if schem1.sch, schem2.sch, schem3.sch were specified as the schematic file names to be imported the netlist file name would be schem1.ckt.

2.1.3   Reload

Reload the netlist file. If the netlist was imported from one or more schematic files, the import operation will be repeated. As far as possible the simulation settings shown in the currently displayed analysis notebook page are retained.

When gSpiceUI is used to create a netlist file from schematic file/s it inserts a reference to the schematic file/s near the beginning of the netlist file. If the currently open netlist has this schematic reference, reload performs an import operation otherwise the netlist is simply reloaded. In either case the simulation settings shown in the currently displayed analysis notebook page are retained as far as possible.

2.1.4   Close

If a netlist file is open then close it and resets all GUI parameters to default values.

2.1.5   Exit

Close all files and child applications, delete temporary files if required and exit the application.


Return to top

2.2     Simulate Menu

The simulate menu contains options associated with circuit simulation operations and provides access to other useful applications on which gSpiecUI dependends.

2.2.1   Create

Create a simulation file based on the values currently displayed on the GUI OR the contents of the Simulation text control. Note, any changes made to the GUI have priority over changes made to the Simulation control contents.

If any changes are made to the GUI the simulation file is completely re-constructed, which then causes the Simulation control contents to be over-written and lost. However, if changes have been made to the Simulation control contents alone then it is written verbatim to the simulation file.

If a problem is encountered a message box is displayed giving a brief explanation as to why the operation could not be completed. The raw console spew generated by the process will have been sent to the Console text control, a careful perusal of this generally reveals the cause of the problem/s.

2.2.2   Run

Run a simulation based on the values currently displayed on the GUI OR in the Simulation text control. If the user has made changes since the last Create operation then a Create operation is executed as described above.

If the simulation file is created successfully then gSpiceUI attempts to run the simulation. The simulation results are formatted then sent to a data file (refer to section 5. Files) and are displayed in the appropriate Simulation Results text control.

If a problem is encountered a message box is displayed giving a brief explanation as to why the operation could not be completed. The raw console spew generated by the process will have been sent to the Console text control, a careful perusal of this generally reveals the cause of the problem/s.

2.2.3   Stop

Stop a running simulation immediately. This option can only be executed if a simulation is actually running. This is a useful option if a simulation is running too long or appears as if it won't converge.

2.2.4   Schematic

Edit a schematic file. If there is a schematic file associated with an open netlist file it is opened using gschem and may be viewed or edited by the user. Note : if changes are made to the schematic file then an Import operation must be performed after closing gschem in order for gspiceui to "know" about the changes.

It's important to be aware that gSpiceUI can't run a simulation based on any old schematic file eg. generated by gschem. In fact, gspiceui will fail unless the schematic is trivial or you're just lucky. Certain prerequisites must be met before a schematic may be simulated using gSpiceUI. The schematic must be translated into a form which can be interpreted by the simulation engine, in short everything must be explicitly defined. The extra information required over that sufficient for human readability is :

  • All power supply sources must be explicitly defined.
  • All signal sources must be explicitly defined.
  • Components not already defined in the simulation environment must be defined using models.
  • Component labels must adhere to the rules specified for the simulation engine eg. resistor names always start with the letter 'R'. In particular be aware that often a model file contains a sub-circuit which must be names starting with the character 'X'.
  • Net labels must adhere to the rules specified for the simulation engine eg. they can't start with a digit. Refer to the specific simulation engine documentation.

Note :

  • In gschem, models may be included by setting the component's file attribute or by use of a SPICE Model object. Either way the component value is set to the model or sub-circuit label. Check the example schematics that come with gspiceui to see how it's done eg. the LM555 or op amp examples.

2.2.5   View Results

View simulation results in a graphical form. One of the simulation results files is opened using a data viewer application eg. gwave or gaw. The particular results file loaded into the viewer process dependents on the currently selected simulation results tab and analysis type tab.


Return to top

2.3     Settings Menu

The settings menu contains application configuration options.

2.3.1   Simulation Engine Selection

The first section of the Settings Menu contains radio buttons allowing the selection of the electronic circuit simulation engine to be used. The analysis notebook is updated based on the chosen simulation engine, the selected simulation engine name is displayed in the status line and any simulation results are sent to the appropriate console tab.

2.3.2   Preferences Dialog

The preferences dialog contains the following settings :

  • Waveform viewer :
    A choice box containing the available waveform viewer utilities. The currently selected waveform viewer utility name is displayed in the status line.
     
  • Temporary files :
    A choice box containing the available temporary file management strategies ie. when gSpiceUI exits automatically delete temporary files, prompt the user or just keep the temporary files. Most of the files in question contain simulation results data and may be useful outside gSpiceUI. Refer to section 5. Files.
     
  • Results precision :
    A choice box containing the available precisions which may be applied to simulation results. The data are rounded to the selected precision not just truncated.
     
  • Max text control lines :
    A value control which sets the maximum number of lines which may be displayed in any of the console text controls. Simulation results files can potentially be very large, this value allows the user to have some control over the system resources used by gSpiceUI.
     
  • Sync sweep sources :
    A check box which enables or disables synchronization of the sweep sources. If a sweep source is selected in one analysis page, where possible the same source will appear in other analysis pages.
     
  • Show tool tips :
    A check box which enables or disables tool tips.
     
  • The paths to the various utilities used by gSpiceUI may be manually set via this menu selection. (Not yet implemented)

Return to top

2.4     Help Menu

The Help Menu contains the following options :

2.4.1   User Manual

Open the gSpiceUI HTML documentation in a basic HTML viewing window.

2.4.2   About

Open a dialogue containing application "About" information.


Return to top


3.       Tool Bar


The tool bar contains buttons which give easy access to the most used functions. The buttons are presented in groups associated with the different types of activities. Refer to the matching menu bar function in section Menu Bar.


Return to top


4.       Main Window


The main window is made up of various display objects which are described in the following sub-sections. There are lists of possible test points, analysis settings, console output and a status bar.

The main window title bar always contains at least the application name. If a file is open, whether it be a netlist or schematic file/s, the name of a netlist file will be appended to the normal window title banner. Keep in mind that this netlist file is the main file that gSpiceUI works on.


Return to top

4.1     Node List

Display the list of node labels extracted from the netlist file. One or more nodes may be selected (or deselected) by clicking on the node/s in the list with the mouse. The probes for the selected nodes will be calculated and included in the simulation results.

A single node may be selected from the list by left clicking on it with the mouse. To select multiple nodes press the control key and left click on the desired nodes with the mouse. To select a range of nodes left click on the desired range with the mouse while holding down the shift key.


Return to top

4.2     Component List

Display the list of components extracted from the netlist file. One or more components may be selected (or deselected) by clicking on the component/s in the list with the mouse. The probes for the selected components will be calculated and included in the simulation results. At present only two terminal components are included in this list.

A single component may be selected from the list by left clicking on it with the mouse. To select multiple components press the control key and left click on the desired components with the mouse. To select a range of components left click on the desired range with the mouse while holding down the shift key.


Return to top

4.3     Analysis Notebook

There are two mildly different analysis notebooks associated with the two simulation engines supported by gSpiceUI ie. GNU-Cap or NG-Spice. Each analysis notebook contains analysis pages reflecting the various analysis types supported by the associated simulation engine. The following brief outlines the various analysis types current supported. For further information refer to the user documentation for the appropriate simulation engine (much of what follows is taken from this documentation).

4.3.1   Operating Point Analysis

GNU-Cap :
Performs a nonlinear DC steady state analysis. If a temperature range is given, it sweeps the temperature. If there are numeric arguments, they represent a temperature sweep. They are the start and stop temperatures in degrees Celsius, and the step size, in order. This command also sets up the quiescent point for subsequent AC analysis. It is necessary to do this for nonlinear circuits. The last step in the sweep determines the quiescent point for the AC analysis.
NG-Spice :
This analysis type is not directly supported by NG-Spice however similiar functionality is provided in the DC Analysis panel.

4.3.2   DC Analysis

GNU-Cap :
Performs a nonlinear DC steady state analysis, and sweeps the signal input, or a component value. If there are numeric arguments, without a part label, they represent a ramp from the generator function. They are the start value, stop value and step size, in order. In some cases, you will get one more step outside the specified range of inputs due to internal rounding errors. The last input may be beyond the end point. The program will sweep any simple component, including resistors, capacitors, and controlled sources.
NG-Spice :
The DC analysis determines the DC operating point of the circuit with inductors shorted and capacitors opened. A DC analysis is automatically performed prior to a Transient analysis to determine the transient initial conditions, and prior to an AC small-signal analysis to determine the linearized, small-signal models for nonlinear devices. The DC analysis can also be used to generate DC transfer curves : a specified independent voltage, current source, resistor or temperature is stepped over a user-specified range and the DC output variables are stored for each sequential source value.

4.3.3   AC Analysis

GNU-Cap :
Performs a small signal, steady state, AC analysis. Sweeps frequency. The AC command does a linear analysis about an operating point. It is absolutely necessary to do an OP analysis first on any nonlinear circuit. Not doing this is the equivalent of testing it with the power off. If the start frequency is zero, the program will still do an AC analysis. The actual frequency can be considered to be the limit as the frequency approaches zero. It is, therefore, still possible to have a non-zero phase angle, but delays are not shown because they may be infinite.
NG-Spice :
The AC small-signal analysis determines the output variables as a function of frequency. The DC operating point of the circuit is first determined and used to generate linearized, small-signal models for all of the nonlinear devices in the circuit. The resultant linearized version of the circuit is then analyzed over a user-specified range of frequencies. The desired output of an AC small-signal analysis is usually a transfer function (trans-impedance, voltage gain, etc.). If the circuit has only one AC input, it is convenient to set that input to unity and zero phase, so that output variables have the same value as the transfer function of the output variable with respect to the input.

4.3.4   Transient Analysis

GNU-Cap :
Performs a nonlinear time domain (transient) analysis. Do not use a step size too large as this will result in errors in the results. If you suspect that the results are not accurate, try a larger argument to skip. This will force a smaller internal step size. If the results are close to the same, they can be trusted. If not, try a still larger skip argument until they appear to match close enough. The most obvious error of this type is aliasing. You must select sample frequency at least twice the highest signal frequency that exists anywhere in the circuit. This frequency can be very high, when you use the default step function as input. The signal generator does not have any filtering.
NG-Spice :
The Transient analysis determines the transient output variables as a function of time over a user-specified time interval. The initial conditions are automatically determined by a DC analysis. All sources which are not time dependent (for example, power supplies) are set to their DC value.

4.3.5   Fourier Analysis

GNU-Cap :
Performs a nonlinear time domain (transient) analysis, but displays the results in the frequency domain. Actually, this command does a nonlinear time domain analysis, then performs a Fourier transform on the data to get the frequency data. The transient analysis parameters (start, stop, step) are determined by the program as necessary to produce the desired spectral results. The internal time steps are selected to match the Fourier points, so there is no interpolation done.
NG-Spice :
Not yet implemented.

Return to top

4.4     Text Control Notebook

The console notebook contains various text controls which display text data generated by the different operations initiated by gSpiceUI.

4.4.1   Console

Display the console input/output for the last process executed by gSpiceUI. If an error occurs this is a good place to look for indications of what has gone wrong.

4.4.2   Circuit

Display the raw netlist file which was opened or imported via the file menu. The variables and values contained in the netlist file are those displayed in the GUI's display objects.

4.4.3   Simulation

Display the simulation file to be run. It is basically the netlist file plus simulator commands based on user input to the GUI objects. It can be manually edited by the user and will be run as is if the Run button is pressed. NOTE : if the create button is pressed the contents of this tab will be over-written destroying any user input.

4.4.4   GNU-Cap Results

Display the results from the last run of the GNU-Cap simulation engine. The raw data is reformatted to aid readability; non-data records are removed and the precision is set according the value set in the Preferences dialog. If required the raw output from the simulation engine may be viewed in the Console tab.

4.4.5   NG-Spice Results

Display the results from the last run of the NG-Spice simulation engine. The raw data is reformatted to aid readability; non-data records are removed and the precision is set according the value set in the Preferences dialog. If required the raw output from the simulation engine may be viewed in the Console tab.


Return to top

4.5     Status Bar

The status bar is located at the bottom of the application main frame. It consists of three panes which contain text messages showing the state of gSpiceUI. From left to right the panes contain :

  1. The last application status or error message.
  2. The currently selected simulation engine.
  3. The currently selected waveform viewer utility.

Return to top


5.       Files


Whilst running gSpiceUI various files may be generated in the directory occupied by the schematic or netlist file/s. To illustrate consider the situation where the gschem file test-amp1.sch is imported and every possible analysis type is run using both NG-Spice and GNU-Cap. The following is a list of files which would be created :

<path>/sch/test-amp1.sch       (The schematic file to be analysed)
   
<path>/sch/test-amp1.ckt (Netlist file with simulation commands)
<path>/sch/gspiceui.log (Temporary file for raw process output)
<path>/sch/test-amp1.gnucap.op (Results file - operating point analysis)
<path>/sch/test-amp1.gnucap.dc (Results file - DC analysis)
<path>/sch/test-amp1.gnucap.ac (Results file - AC analysis)
<path>/sch/test-amp1.gnucap.tr (Results file - transient response analysis)
<path>/sch/test-amp1.gnucap.fo (Results file - fourier analysis)
<path>/sch/test-amp1.ngspice.dc (Results file - DC analysis)
<path>/sch/test-amp1.ngspice.ac (Results file - AC analysis)
<path>/sch/test-amp1.ngspice.tr (Results file - transient response analysis)

All file names begin with the prefix test-amp1 (taken from the schematic file name). File name extensions then depend on the file type. Files containing simulation results include the name of the simulation engine used to generate the data and an abbreviation indicating the analysis type.

Notes :

  • gSpiceUI can manage (eg. delete) temporary files, refer to Settings Menu.
  • Not all analysis types mentioned above have been implemented.

Return to top


6.       Software Design


The following links are to object models depicting the static architecture of gSpiceUI :

Note :

  • The object models depicted here largely show the actual application architecture. However, the software is under development and is often in a state of flux, it will not always exactly match the information shown in the object models.

Return to top


Last modified : 13/09/2011
Author : Mike Waters
E-Mail : m.waters@bom.gov.au
gspiceui-1.0.00+dfsg/html/OM-Process.jpg0000644000000000000000000010664011640201013016405 0ustar rootrootÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀÔ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô øOÃz§ƒt=GQðþ•y}u§ÛÏqsqe’M#F¬ÎìA,Ä’I<’kcþOÿЩ¡ÿàºþ&É<ð×ý‚­ôR×A@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@ÿü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ5ÐQ@4|k¿¼ðwŒ¬ôï ÝÏ¡ØÉ§¤ïm¦Hm£i ’)r±à!Tg®zQUÿhïù(zý‚£ÿѲÑ@ÿàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEóíÿ%Oÿ°Tú6Z(ý£¿ä¡éÿö ÿFËE{ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPYúî§ý‰áíOVò|ï°ÚKsånÛ¿bÛœgÎ hW?ã¿ù'ž%ÿ°U×þŠjÃx½¼+iâ /Z_Ásn—+ok«±cdß’­ãj’I#×QáÍ~ÇÅ>³Ö´ÖÚ]!dók)«)¡dqÁ#šóÿÁñ*ëÂ$^øbÇK“L‰`¹H'šê$òG–Û„/÷s“ŒçƒÐåëÞÓ¬õï†igû E¨G;Á#DÓþé^Lœ’«!ÜAû®@#ŠöŠ+ÉÛÂÚ4Ÿ4ÏIgæxkLÑSµÓžWhÖäÝ]²s'Œ9# F95bòâãÁZ‹´ )áÓbðüšÕ©Àhl.s()• +•Þœ‚pêW“Ûø ðxLñ ¾­‘­ùPß¼Ò6fGæHÞk.å“‘µð?x~PXƒŸ£ØÚø§\ñuî½á+ï\EªÝiq\,°‚Ù6…‰I“cNõ\üÄîÉ4íW‹Ýx?Åן àÐ$Òçž;[V‹O¹Ô&¾ÓTåc’Dr`1F02;ž‹AÓ¼ypDÔ¼-¬^Ù">—&űºd™ )”‘Ð1Ã1Û’øôÊ+çû ¦ƒáÉ ñ¯…5X®¢Ô>ÒÞ,Ñîæ}ûÙŒìy’8Õ@'*ÝØ…|W¾A<7Vñ\[ËÐJã’6 ®¤dGÎh¶ñ®¥­ø—TÒü9 Çwi¥¹‚çQ½»khÀ8hœ±Îü –¯eñïì^"Mkòi:Æd×ÿ`’í$0„,$QÈÜ¥X€B’9' GðW÷ tÛ9>K«In ¹…¸xd¹(ëÕ[yxïUÑÿâ¥Ò>Áÿ¿øE.®¾Ûä§ü{üËåïÎï¿ÎÜc¿Zì4-OûoÃÚf­äù?n´ŠçÊÝ»fô ·8Æqœ Я#½“E¸ðÃíX‡YÔ£eŤi¤(»+Ò¶T„BU¾úŒàBåsôý:í~)x—JÑ4y<,u »A¸DV›x'+ 2ÆA,Ü‘‚ÝXжQ^¢èšW†mü,Þ&ð–¥á{í6áHÖìgŽX%8Pßj• (’;mÚà »#ð½ßü,=sYÖ¼'‰ô;Ë(ã†HnQ¥±c;Ò8]”—gBÜJ’ÌEzåsÿð“ÿÅÃÿ„Sìó þÒûW›ÿM|½›1øç>تÿ_K ±µÒ//®-ì÷[²ê'ý&ÝÔœÃ(ÀÚÉ»qÀ ŒŒÇø“NÖu?Ž±Ã¡ëߨ·Ká íqö4¹ÜŸi ¦×8$û{Ðq«øŸû/ÅþÐ>Çæÿlý§÷þnß'ÉŒ?ÝÁÝœã¨Ç½hiWzßÛ´t¿°y7rEoþ²ý¢²ñ÷wsòžF+ËçÒ7²xt€ûÛM-,e²ÌÌøüàÎ:“@ÙEy‹ü%¤xRãÀךT2G©Û[ͨ4„Ü\¬¥Œ¦WÈ\ŽsØ0 ±©ë–Þñæ·}©Í"iz¶˜52Ý æÜÞ(c$eÞ3 ë’Wÿ¢W'â/M¦x—NðÞ¤Iªë‰ç¼fS VÖù*e’M­¸cÇ©PÒ|=Òî4¿Ø›ñNûuýûµ¸…Úy‰‘·¨þ%Üþ8?†?Ñþ1øö)¿w%ÔZ|öèücX™Ô¼¡¾RGñÖ€._øÚûÚ¥œ^+Ò-4í.íÄê–úŸNÛŠ£«FŒ …'~ Ž2z‘©¤xŸûSÅþ#Ð>Çåc}›÷þnï;ÎŒ¿ÝÀÛŒc©ÏµaüeŸM‡á^²šœ²"Lˆ,L¡Þmá£wQ¹A`9ÚŽ•‡¥øcKñƯM«AöÈlþÀc´›æ­ÈÞñž”n ž›ÛŒà€HÖîõ{'KþÔ¾M¾]ŸÚ3,ùÛ€Iç®1Þ´+çϺ‚>&øBÌÉý“¥\ióÙ¤²3´BáãvŒ~àa:òI$œ×_âð5Ÿ‹–:&£¤]ëš]®Ž5´ØdT\yû<×"+€£nÖ,>còòÔê”W…ë¶zçƒtï]èV~Ðu x}Ôñ0´ºk„ÌI ÈQ'$ £n6¨®ÒO‡ÞðÆ£¢_èWPxrê+´·.dfûtLXµ±øfrxc¹†ÅÇÝê4ïYê~#Ö´8cn´#íê7š…×i's?Ëøƒã)¼ Á©A¤Iª<—Q%(UDrHÏ­ÀXÉÒÕ M=!X!T«ÂYÂàp€$¤k¨ñLÝj~·¸Š9 —S•$ŽE ®¦ÊèAà‚8ÅlOªØÛhÒësÓã·7MqΦ »·¹Ü6óÆsÚ¹¿‡:ÿ…áë[û;ìMÛ[y^›œ"6ìí_ïãí\ZÏwsà;/‡’Ëvúƒk@šPÉi+YÂD­4kÎäû6Åç®ÿâÈÝŸ6«}¢ü0øŸ¦ÜÉkvž(ºDš>CË 6cµ#‘Ô`ó@éEyŸ‰¼-¤xöú÷„ô™-õ 2â%HlØ—¾ŽYÑ d »åÎJ»qŒÃGŒüsâVñÇ©¦˜ñZYiîä Hä¶Vy6« ™C†# Ä0~Q´´Óµ?·ßjÖÞO—ýŸv¶Û·gÌÌ1K»ãýn1ÏÝÏ| ð}Jìó@Ó®ç¿Ón¼k›40MóËjÖñfÐ;>FТ/¾¿s‘]øZm7ÅÕ<'à«íKYRÒøÉql°ÍdÀ‡2,s³I"ðÀœ’F[q €ã¾'ÿ„›ûoýìßÙš¬úoúÝþo—·çè1Ý9Æ:šè+ÏþÌëÿc]÷þÉ^@Q@Q@Q@Q@0~ÑßòPôÿûGÿ£e¢Ú;þJŸÿ`¨ÿôl´P¿øþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]OVÓaÖtkí.á¤X/mä·‘£ 0WR¤Œ‚3ƒèjåOIÓaÑ´k.ݤh,­ã·¤ ±TP œ3è*ž£á»=OÄz.¹4“­Ö‘çý€FóP#ndà0Gã[P¯á{mWT´Õ¡»»ÓµKdh–öÈ w‰ºÄáÕ•Ó8`NÈÇ9¯¡ø+MÑ_YšYîõKeÁ¾›QuÊ¡J„Ú @€zt’ŠãÓá݇ØítËWU»Ñ-eE¤ÜËÁ…$¤lvy’0Žä|ª@«> ¯5+3YÕteÔþk¸t÷‰RI Ê7ÆÅ$ Œ²'h'‘šê( >†Ú¾ Ó¼/—ÖÖºt©qksÁYâ™Io061¸–~ظ>‚ r=jÿQ¾Õ¯áˆÃm%÷•‹e9ÞcXÑ3p `± ã ôPkðÆÂÇGŸD¶×5Èô)¥g}0\GåìfÜÑòüÕŒô 8È-“–$öA ­¼VöñG  HãBª(ÀqŠ’ŠäÛÀ6Px–÷^Ñõ=KF»¿@.ÒÄÅåNÀ“½’HÜoç¨ÇSݘ’Ëáþ›ieâ(e¾Ô¯.îy%‹vPiðÞÊ.ÃH¼ÖõKG²udÓ¯d‰¢}¹(²]ÑNBÅ~UÀ®\x&â‹ÏéÚΫ¥ß_D‘] G‰£›`±Icq¸F03êÙê(  ½@±ðÞ–¶ !̳O3o–âV契ú³±ê~€`ðÙÿÂeÿ G™?Û¿³ÿ³ü½ÃËòüÏ38Æwg¾qŽÕ±Ecê>³ÔüG¢ë“I:ÝiÙÑo56àFNã~5N×ÀÚ,^¹¦O—¶zÕì××q\Fù1¸€ ‚PFsœWIEqçáô7š4ú§ˆ5ÍR="UžÖ ¹¢dQ…w)³°À ±'®rØÓ¼7g¦xZ×!’vºÕü´#°(¾R]  ŒƒÎIü+bŠåàðLWšŒš~³ªÙZê7oyugÄäp„9ŒÊ›±ü.ÏÊWŒSÐþiZ è þ¥0О嬖wN¸um¨ ÉòÇ’0iEaêþ¶ÕuKMZ»½;T¶F‰olŠx›¬NY]3†”àŒŒsœ»¿‡=ÿ‡5m"êæúi5yVkíAÝ ÌÌ®m»B®Ð¡B… “]…¯ønÏÄÙl’tþÍÔ"Ô!òX ÒG¡²W“0}ëñö§xóÄz/†Îyd°»[íBàÛ2¤V»÷bS·>kQ°Ÿ¸Äò•éP\߈¼¦ø‹TÓµfžîÃVÓŸ6÷ö.©(^r¹X2ž=HèÌIEréà˜%×-um[YÕu‰-0Öö÷¯‚)vÊ"Ž4S ÜÀ1ŒúŠw? ì¥ñ½Ï‹­5½gOÕ.$Ÿe’/,¨ELxØ…<€xÀÇiEy¼)iៃúŸ‡ô‘©júµê:™7ÜÜ]ÜW'hëåÄÇ8 Ï''Ð5 Ûjº¥¦­ ÝÞª[#D·¶E¼MÖ'¬®™ÃÊpFF9ÎåÉØü<ÑmíõدÞïX}qÕ¯åÔdÒ"¡B…É+´¼`ü«‰-¼Þi·ž³ªë+¦|Öê$r”ìKÈ8g,FâG'5ÔQ@v¶Ó|Y«ø† »¿?UH–æÝг…F_—p gø±ó:cB÷M†úëN¸•¤apn" F ¤‹ ÇM²1ãô7( n?h±xòo,RR[!·ÈùŠÊ¾Õ @Æxä’ZøEƒK×4Éâ’öÏZ½šúî+’ß&2PAêÎsŠé( <ü>‚æóFŸTñ¹ªG¤J³ÚÁw4A Š0®å#Vv$õÎC07/<Þ%Ÿ^°Õõ-*òâÝ-î—“²p¤•gY#pÎÚ¨9é( >ßá¶…oáë½̾•nnÅÿÚå¸-sÐE_=$ÆVL¦üú³ºvÕ‹À_Úî-øÆq¸Œã#§¨¬ÿøNüÿC^‡ÿƒøªè(®þ¿ÿÐסÿàÆþ*øNüÿC^‡ÿƒøªè(®þ¿ÿÐסÿàÆþ*øNüÿC^‡ÿƒøªè(®þ¿ÿÐסÿàÆþ*øNüÿC^‡ÿƒøªè(®þ¿ÿÐסÿàÆþ*øNüÿC^‡ÿƒøªè(®þ¿ÿÐסÿàÆþ*®i¾%Ðu›†·Òõ½6úuBí­ÒJÁrHRN2@ϸ  J(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFËE´wü”=?þÁQÿèÙh ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçï?ä¡èßö ¿ÿѶ•ÐW?yÿ%Fÿ°Uÿþ´®‚€+ßß[éšuÍýäž]­¬O4Ï´¨ –8œzV|Þ)Ñ ¾¸±kÍ÷–òˆd·Š'’@æœ ª 9ŒJ•n+b¸ ü5³ðÖ£evš„÷_eˆÇ‰nvS"ÀìÃ’ÑÃ4óò•Ù€»P¦£âµØ[hQÚjww -rÑÀ¡ ’p|ÕG”Œ ‡Bp%Ÿ‹´é ·ûs}Žâ_µ‡Rãì®cÌ›B¬a‡ ûr ð ÅeÁðöØÃgo¨Kil—¿Ú7QO`˜º¹hdŽWaœašE R¥AÛ°&†µáu3jmfŽÄYYImh±À Á'™È1[¡ÙÐô`Ý&‰ey§hðZ_ßýºâ-Àϰ¦Wq*0ÌÌv®,ÌÇ$’MhW?yÿ%Fÿ°Uÿþ´®‚¹ûÏù(z7ý‚¯ÿôm¥tQEQEQEQEQEQEQEQEQEQEQE|ÁûGÉCÓÿìþ–Š?hïù(zý‚£ÿѲÑ@ÿàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEQEQEQEQEQEÉëÖSßxëDŠßS»ÓÜi—ÌeµX™ˆóm>Sæ#Œsž™às×7?áÕ?ès×?ïÍ—ÿ#Ñyÿ%Fÿ°Uÿþ´®‚€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈõŸo§]X|CÒþÓ¬ßj[ô«í¿kHËĶ™Ç•uÏ|ôÇ9ì+Ÿ¼ÿ’‡£Ø*ÿÿFÚPAEPEPEPEPEPEPEPEPEPEPEPÌ´wü”=?þÁQÿèÙh£öŽÿ’‡§ÿØ*?ý-ïþÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ž½{=Ž´Imô˽AΙ|¦+V‰X6Óæ>c ÇëžGqsþSþ„ÍsþÿYòEŸòPôoû_ÿèÛJçüY¬ê6þ!Ô¬íµmr×ÈÒ¡¸µ‡JÒV÷|Î÷ïÌMõh.€óÈ䀃þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’+ÓâE¶ý&ÎîM5¯æK8ïcŠù‰î=¢òÆTEfmÁBœ«9 ]¯Ä™t[ãâ ‹¾ŽîîvïÒ?.Ö9¤ˆGcC,™‰Â®í¹gMÊ´ØÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEX´Õ¯/¯µëh, ÿ‰l«o=É|†”îÅýâŒÇ©ÇBñÕæ¡¡éz…ÖÙ>ÉüN@ŠkŸ/ÊXÕ—-ÄÑ3䀡ð­!PÇü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$WAEsÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘]ÏÿÂCªЙ®ßë/þH¬û}Fêÿâ—öûMÙ¥_mû[ÀÞfe´Î<©¦;ã¨ÆyÇa\ýçü”=þÁWÿú6Ò€: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFËE´wü”=?þÁQÿèÙh ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçï?ä¡èßö ¿ÿѶ•°–6ñê3_¬xºš(á‘÷™¹QŽœóöyÿ%Fÿ°Uÿþ´®oÅ’x®ÃÄ¢M&J}6'‡W‘ "F”!ÜYª&¨<—WÛ’r€Ç„|7j–דÇ%¼e¼¬o¦Ž$ŠÙ‹Åæ áX!ËeÁ÷¨õ xWSºEÉÿJ\ÌmaÔ%ŠFŠâ]ÓTpZ6~¹Ê玕—kg¯i×ú…ÍÞ¥5´6ö­«L›æY®6ÓË“!ÂŒ4¸ÈÿVJ…’f®Oþ]wû;ÌþÌŸÎò¿áßìÜynòþöï;çÆqåû~ò€=cK:\­yw¥Ïÿj•&¸’¼ÀÎbŒ)à3ˆŒuù8ö^ ðÃÁ¦ÜÙ$ò[Áehõ)Þ7Ž'2Ñæ‘U˜•ÝàYwój ®êêCY]KÖ>eŒw )"Ú×ËD0ƒ"ÄXÜ1dÀÞ˜,7~_×!µÒ¼dòjVZðG¶67vóGa±,§û8v ‚~Tv‹nf~í0d¢¼n'ÕõÝ ôêzwˆ ·ŠãI»1/s!¹?h#÷Q±!“JcB¡“§aá‹ëÙ¼UÜ:Ê™IKÜG*À0ãle]<¤t ±Lë(Wv9Û@e½ýܲEmwÒEþ±#1O™“:|ÈëõFA«äóXj`× º´Õ~Ãý¡m:Ç snÛý³s$O›w•å¶SæÛ°úWqá[ÙåÓ+„¾Úe¸û#ÞA*JÖé&ÔówŒ«`€»ÉwUy, ®~óþJÿ`«ÿýi]s÷ŸòPôoû_ÿèÛJè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠùƒöŽÿ’‡§ÿØ*?ý-~ÑßòPôÿûGÿ£e¢€=ÿÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ŸÖlµøHtÝ[I¶±¹û=¥Í´‘]Ý<ë ÆùÇ’FElñ‡ý´?üÍÿȵÐQ@ÿÛÙãúhø9›ÿ‘j4Ö5)/äˆO¦¤uÄwÏ:´_išD¿uóTÚyv;>\n/šõæ•§h·w1j¨—º!–FÔïÍÊÞÝbFæ’5%œp‹––5Ú\¢ÐQ¡[øÃDðö™¤ÿdhs}†Ò+o7û^eß±îÇÙŽ3Œã&´>Ùãúhø9›ÿ‘kê:mÄQÍõ½é·’c¦\£Ì,‹yÄš(ˆ q¼I¼Q¤xþ]WÄVVk b ‹†³dŽÞfUu¦óV䨉тˆY$ÈÉ@¹öÏÐ CÿÁÌßü‹GÛÏ›n°jw°î³’7ž8ž@UÔíQ&AbÇÌ…”  }õ­@iÉ<­µœ^ ;Q¦»$[­“8ß$˯Ÿþz „å@&½Å޵ èâÖM­Õ•’]If·2›2È! •W $.ciY0ÄšØÑ|\×úm쑬zä¶·¿cI´e_.䘒RÃt…# ©Ý& NX%\oégìòÅçÍg%¤W²Ýªb;h%ÝåI&â+mn@;’ûš“Â3\ÏáØÞè]‚..RµÆé/³ºÃ¸8Ÿ,'-ó§$“[•—¥kê·âÖîÖxQ%òî£Ï –È$¨bŽ6¶×Nå^3¦xÖ‹Qmb ,…›ßȳì ÖöÓ´n꙲£ËÜ)%¾PG@²Šçÿá,ƒì¹þξþÐû_Ø¿³uçyÞW·vÿ+ýWï3¿ã;¾Zذ¾·Ôôëkû9<Ë[¨’h_i‘€*pyu  Ïø7þ@w?öÔ¿ô¶jè+Ÿðoü€îì+©élÔÐQEQEQEQEQEQEQEQEQEQEQEóíÿ%Oÿ°Tú6Z(ý£¿ä¡éÿö ÿFËE{ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPEPEP?ã¿ù'ž%ÿ°U×þŠjÔÕ´ØuûK¸i Ûy-ähÈ Ô©# Œàú’þÆßSÓ®l/#ó-n¢xfMÄnF0ÈädÒ±ÿá Òÿçë\ÿÁíïÿ  MOM‡UµKyÚED¸‚à ÑJ²¨ä7 Û=:×>ÞˆÚÇfšþ³ºF–vÈÐìµË‘í,¹S (28-Ô±5sþÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ  û:œRGS¾½º’Q#\ÝEm1Ú*§–И‚ŽHù7ò`1÷FŸ ´ño¦[KªjWúz,qÅp¶òn@J1nTdEÕ ‡PwY‹jÂ¥ÿÏÖ¹ÿƒÛßþ=Xúÿ†í#Š3N¾×#Ôõ ñ[Ëý¹xÂØ%§e2œªqÆ0]£RW~@Ï xOð‚Nº]íØ3¥¼lÆ+u;!f ‘(bÁØ36Xƒ÷Ñ«ø*Q·±žAw=–§o ÆÀ׿¹l.p1Ðg9<Õ=Ãv†òûH¿¾×%»±òÙf:åà78;%`²íVÜ’!1– ªÊ£cþÝ/þ~µÏüÞÿñêÏ»ð]Ô—6Wë×Íxš€º¸Ô&Ö1m,K`EåíLí+žFûƺM+M‡HÒíì i!L% ¼­ÕÈs³Ì{’OzËÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ®Á¿ò¹ÿ°®¥ÿ¥³Qÿn—ÿ?Zçþoøõjiz]¦`¶VI"À®ïûÉ^V,î]‰g%‰,Ää“Ö€.QEQEQEQEQEQEQEQEQEQEQEóíÿ%Oÿ°Tú6Z(ý£¿ä¡éÿö ÿFËE{ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPEPEPEPEPsÏ ­¼·Ç !y$‘‚ª($“ÀsšÇÐàšîâç[¾ŠDžáÙ-#™Hk{P@Qƒ‚¦B¢V•>ZãCUÒí5­.ãM¿IÒå6J‰+ÆY{ÈAÁèFy‚k/þÝ/þ~µÏüÞÿñ걯XÜIö=KO}ý„»Ñ3DÜKN3•ù”ÌH‹-hX_[êzuµýœže­ÔI4/´ÈÀ8<Œ‚:×á? Új~ Ðïï/µÉ.®´ûy¦íËÁ¹Ú5,p%ÀÉ'¥uš^—i£X-•’H°+»þòW•‹;—bYÉbK19$õ  ”QEQEQEQEQEQEQEQEQEQEQEQEQE|ÁûGÉCÓÿìþ–Š?hïù(zý‚£ÿѲÑ@ÿàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEQEpþðݦ§àÝþòû\’êëO·šgþܼ£RÇ\ ’zPqEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?Zçþoøõÿ’yá¯ûZÿ襮‚¸?øON¹ð/‡§{d<še³°Z¼Eħ…Y@QìµnÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÉÛi±èÞ:Ó­í.µ&‚ãL¼ycºÔg¹RÉ-°R®ÀÆF:šë(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(æÚ;þJŸÿ`¨ÿôl´QûGÉCÓÿìþ–Š÷ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Šæüs7^ŽÞâ(æ‚]OOI#‘C+©¼„Aà‚8ÅIÿ'ƒÿèTÐÿð]ÿ@ÉêÞðN£_j—Ñš +y.$XôØKE,@È8¢³àÓ|ðê¾Ñ´W³Hä™u;E ŒÊ½ &‘Ô ÙÊòF@;Ê+¹Ð>ÚE©I.‡áÏø–Eç^¢XÂïn›Kå‘T°Ê‚GãŒÖ\ÖÞµ·½ž÷ÀV–‰oe5üBm*Ø5Ì]‘A%HÜŸ,çpØôJçü ÿ$óÃ_ö µÿÑKXé¥ü;“ì2/†ô1k{§É©Gtút)ÀžVY‹(+ÄÊyÎ1UõH¾é1.áÉfm>]J ²žx#]Å“Œ€Hçœ1+èW/qá[OiøOC-u)‰?ÐmÆF~„xC‚{㑞ÚÂôþÌ?ÙÞeÕ%hlY-`e¸qœ… `à¿ï½H¸¢¹ÿøA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâh ¢¹ÿøA<ÿB¦‡ÿ‚èøš¯á =3PñM…¤–±ê©²#¢æÎØœ(àd’ê(¢¹¿Á íç‡,.âŽ{;­M’âÞU Ê-nSÃÈŒî õ€:J+Ÿÿ„Áÿô*hø.‡ÿ‰ªz·…¼£h×ڥDŽ´f‚ÊÞK‰=6ÅQK2Ψ ²ŠààÓ|ðê¾Ñ´W³Hä™u;E ŒÊ½ &‘Ô ÙÊòFl_h¿¬RìÂ;áùî-^(嵂ÊÝ¥JÁbB¸K³(ˆä2@iEpö:7‚/8›ÁzU­Ñ»6rÛOcj<£0‡Êmo±ù¹ ¶ÅŽ…ðãSŠ9l4¯ ]Ç$¦x-íä Rå– c®zP‡?äžxkþÁV¿ú)k ¯?¹±ð/›a“à­+\ûtSMé¶–L›"dG;Ý•OÍ"Ž ïéZÚû¸´Ù"Ðü9ÿ8¼ë${Qîh|ª2†8R ãŒóŠì(®M¼5ðù^õDðÀ{x¦Öß6êT°2qò œœp3V ð_‚n­â¸·ðׇæ‚T‘ØBÊêFA.#œÐIEsÿð‚x?þ…MÿÐÿñ4 àÿú4?üCÿÄÐAEqz‡†´Äž¸ÒôM6ÆvÔäF’ÖÕ"b¿c¹8%@8È»J(¢¸ øOÃz§ƒt=GQðþ•y}u§ÛÏqsqe’M#F¬ÎìA,Ä’I<’h¸¢¹ÿøA<ÿB¦‡ÿ‚èøšçì,<}¨­³xÆÞnç²·»›Nµ1Ï4&@ê¡IqÄRYTazä€@=ŠãÓBøq%­äzW…ÖîQ´ËonRi "60ÍF<ϰ°ðEö¢¶Íà;xe»žÊÞîm:ÔÇ<Йª…%ÇHAeQ…ë’è/?ä¡èßö ¿ÿѶ•ÐWm¦|8ŸIÓu´/YG¨Ú}²Þ;»KxÜÆ#1Á§-ŒëН¦/Â}gÍþϲð¤þM ½—p.Ÿ™²£n1óÊän# ErkᯇÌöHº'† ß¡{5¶ù¸P¡‰œ ägƒš¹ÿ'ƒÿèTÐÿð]ÿ@Ïÿ àÿú4?üCÿÄÑÿ'ƒÿèTÐÿð]ÿ@ÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢ŠùƒöŽÿ’‡§ÿØ*?ý-~ÑßòPôÿûGÿ£e¢€=ÿÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(Ÿñ—ü€í¿ì+¦ÿél5ÐW7ã‘3xn5·’8ç:žž#yº«}² ‚F{dgÔTŸcñ‡ýt?üMÿÉTsĺlÚÏ…u}.Ý£Yïl¦·¤$(gB œq“èk>óÂp.äiÆO=¯lî$šòêYÝ’„—nù 6WÚ¹À,zn&¤ûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€1í¼-¬I¦E¤]Å¥E¥£-¾¬Žó]=Ð’9ᢙ#ó] ¾æ ’@$Ç©xsĺÓë-:ÚY%þue䦱qsM"¢Æþ[F©P¯’£'yàÖçØüaÿAÝÿÓòUcñ‡ýt?üMÿÉTÉøƒáæµ7ˆÖÿAÔc·´…伆® ?i–xžeÃÇ"±‘~RVc» Á “A[9&±’êm?Yµ¸’K†ù^òQ,l Ä`¨ ò§R@ãÔ}ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@zö‹âZZÃ{§èÐ¥½Ã;Â/æ•n"{yáxË¡>h†q’Ø;B±e¡x:eÅøÓd»µÖ Ü®'ùæ„Û<Ò(ßÀØ£j"“Zµ>Çãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ ‚ŠçþÇãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ ‚¹ÿÈsÅŸöÿH­hûŒ?è;¡ÿàšoþJªþKÈõ­üðOt5Tß$˜‘¿Ðí±…,Äqâ>¼t ¢¹ÿÿÈsÂö“ÿH®« ®_Åéy&¡áe°ž.Žªû$ž*/úÎr¡”ž3üCמ”ÔV_‰tÙµŸ êú]»F³ÞÙMoHHPÎ…A8ã'ÐÕ?±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨;Ï Àºw‘§<ö½³¸’kË©gvHn]»ä,Ø_jç±é¸šÇ_ ëɤÁ¥Í£xcQ‚ÖßÊó¯äyõŒÑ<Žàň˄y™?y°’v’w>Çãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ  }ºݾ¡ku}wû˜5_µÇhúŒ·¢¾Ç$$,² rÍ$›ˆ'h0sšöž¼‚ÛOóM‹]Ziú5Ÿš $}’çÍœ)Û¬cԨȺ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨Ÿ›Áº´zw…"‰ ¸“IÒšÆáSV¸°Üä@7,¡f_Ü· õNox®]*ÞÒ}5ãµK$>x…·”J!$ÛÉ+¢ÁÌR•˜;IÖ}ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÿƒÇÚJ¨<¸É s'ØüaÿAÝÿÓòUcñ‡ýt?üMÿÉT‡…õí3F²·µ·Ñµ)ÓB‡Jxõ `…‘HvP#c"HJ_“"ÉÃNÓi³ÀI7W2ܸ–&´xˤCË!¢"<¨%pòHOÞÀ¦< â”Ó4ø¡¹±·º³ÓôëpÑ]’¯%¬’˜=»¬’ïRT”‘ᱺ»±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨?ÃÕ4».çQž f‚-H\“yg¹ºŽe „@päí^z tì+ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: +ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€É<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( ˜?hïù(zý‚£ÿѲÑGíÿ%Oÿ°Tú6Z(ßü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€9ÿÈÛþºoþ–Ã]s~9™m¼7î$)§§»ãgbä'…PK` =ªOøL´¿ùõ×?ðE{ÿÆh ¢¹ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€: +Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆh ¢¹ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€: +Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆh ¢¹ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€: çü=ÿ!ÏØV?ý"µ£þ-/þ}uÏü^ÿñš¯á ص CÅ7P¤éê©< ŒYÛQÀaÓ¸ç¯Jê+Ÿñü‡<'ÿaY?ôŠêº åü_{Ÿ¨xZêdãMUò æs›;‘ ,zöué@EÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã4ÐQ\ÿü&Z_üúëŸø"½ÿã4Âe¥ÿÏ®¹ÿ‚+ßþ3@ÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã4ÐQ\ÿü&Z_üúëŸø"½ÿã4Âe¥ÿÏ®¹ÿ‚+ßþ3@ÏÿÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã4ÐQ\ÿü&Z_üúëŸø"½ÿã4Âe¥ÿÏ®¹ÿ‚+ßþ3@ˆä9á?û Éÿ¤WUÐW¨köz¯‰<+¼:’:êr97Zmźãìw#†‘ÏL篡®Ò€ çü ÿ$óÃ_ö µÿÑK]p~ ñfmà_@öÚÉxôËdc‹xêH‰G ±ÃÜjï(®þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ ‚Šçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè(®þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ ‚Šçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè(®þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(æÚ;þJŸÿ`¨ÿôl´QûGÉCÓÿìþ–Š÷ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Æ_ò¶ÿ°®›ÿ¥°Ô~0צСÒÌZ†›§¥åïÙå»ÔP´Q/“,™Ç˜œ–Te¿‹½Iã/ùÛØWMÿÒØkR÷M†úëN¸•¤apn" F ¤‹ ÇM²1ãô ¿‡¼k6¡¥ÎóA§v·³[Z) ¥üQíÌщXEݱ˜¹MË…bYA!ñÃOâY!†ÚIt‡Ó-®lZ8—ͽ–råf@@+pÈ1±Ù™AkïÃÝÄÉ5ÙN÷¿m`—ky @%×aTBAæPsÀÄw ôKÝ=6vãŠÒÊÖ'‘b‘Z³˜ØB»˜ÊÙ$`r©iâ‹këÝ:Ò K³%ê\³d ÆÝÖ9VO›’$`Ÿ&àO íùªœ^22jz®žtK溳»û=¼1I =ؤŒê €Š¢E$¹çAí°Xм!aáõ°²ÎÿaŠê(÷ˆÔq*ÊùTUQ†@Pc¦#¹ð|Sj×:¶¯©Y]Ïp.7Ûù?!òV&Q¾6Ê:¤e•²7F„`ŠÜ°¾·Ôôëkû9<Ë[¨’h_i‘€*pyu«OIÓaÑ´k.ݤh,­ã·¤ ±TP œ3è*åQEQEÏø{þCž,ÿ°¬úEk]sþÿç‹?ì+þ‘ZÐA\ÿˆä9á?û Éÿ¤WUÐW?âùxOþ²éÕGã zm ,Ũiºz^^ýž[½E Eù2Éœy‰ÉhÕF[ø»Ö‡¼k6¡¥ÎóA§v·³[Z) ¥üQíÌщXEݱ˜¹MË…bYAê/tØo®´ë‰Z@öâ ¤`±ŠH°ÜtÛ#1ÈCÏë¿toK$×fA;Þý´Ha‚]­ä,–7]…Q ™AÏãñä·>-û –Ÿ=턺TÖKh&ºóŽð^UÙUÇΫópH-ÉÐi¾$³Õõ¶±Žya}>Anö…ŒÇ1aÁ!÷Œq·H8Ïßü+Ð5´å•ç2iö–öpJñA1²¨I)Ýæ’Ü`”B+]‰á»=Êû,“¿—§ÛiãÍ`wý‡€>cæ6ON  ø¼ddÔõ]<è—Íugwö{xb’{°#IÔDŠIr΃;Û`è,/­õ=:ÚþÎO2Öê$šÚFä` œFAkçÁñM«\êvÚ¾¥ew=À¸ßoäü‡ÉX™FøÛ(ê‘–VÈÝ‚+cIÓaÑ´k.ݤh,­ã·¤ ±TP œ3è(åQ@Q@Q@ÿˆä9á?û Éÿ¤WUÐW?âùxOþ²éÕtW?àOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-r~ø‰su¡›½_Ã÷°_ÙIuŠè'–óÜÆ»Šx  "¬SŇ ïÊÜ>KeŽ'R_[Cku+麞¶ jÑ¢K2\KåBêÀPÌmr¬»Nå^3'‰¼RžŸHØÏ<÷fi¢eýÉØÌ>Rw;¸  “‚[j¶^…ðÏFÐ-e·µ¹»d‘ìØ’!ÿE—Í>\k¸–ᙲÄwï[(ð½·Š¬­­®nîíMµÀ¹ŠkRÑÂ: «@rA@ ‚  šN¬š¬Sÿ£Okqm/“qm>Ýñ>Õp Fe9GFùXýì@Ь½E0½f¿»¾žöãíOt# [ËHÀ4U,kÛÖµ(¢Š(¢Š(Ÿð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢ŠùƒöŽÿ’‡§ÿØ*?ý-~ÑßòPôÿûGÿ£e¢€=ÿÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(Ÿñ—ü€í¿ì+¦ÿél5ŸãÛ?·Éá«oìÛK~ªßè—í¶1ir~c±úc#å<Ó¨Ðñ˜øGÒHàžo'P±™ÒZWØ—q;Š *“À=(ÿ„ËKÿŸ]sÿW¿üf€0ÚM_ÃO³„Ép-ôÍSP:m ed’# ²1BÛLQv…ÎÕù@ùk>}kMÔoíáÔ<_i«èq8—Q{wX¡†YArº6ÃjÛ$[–}þPfu|WYÿ –—ÿ>ºçþ¯øÍð™ióë®àŠ÷ÿŒÐŸÄµí, ðûXÙIoâV6‹§_yÖ+"i¯(Dd1 7(%¥ç-Áÿ ÄÖÃSºhçÓá¾Ö͵äðMm¾Òæ;+}и+ÞŽQæÀùx2+@ÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆhÏî|A-á‡RÕu¯&;?ÃÚ“X¼ˆCºõ|Ù¸*í\±c÷þb@M»ž&ñÔ¬.´}cM’²»F¼‰âDD¶…€˜å#rŒÛDŒ#2ƒg宓þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ oÂ>!ŠûÅ3Ïâ©.­¦Ó-¼´1¡ss<€œ3†DBèÅ]¤ãå1ªÓ´ÖõéúÌð\}¢3¿¨GÂ.Èd·¼!B• Å[ÌbÁ‰< ¥FAì?á2Òÿç×\ÿÁïÿª÷þ$Ðõ=:æÂòÇ\’Öê'†dþþ‘ 2"ÈÈ'¥sïã[u¶*ôÆÕE‘ñ’ß*¦Õç*X¯•æURBmÙ"€L›ŠöžÔ¦Ö<5¦ê7 –æÝ$c!#ï '!ï(l0nä »hwsÚM=ޏòZJf€ÿaß ŽQ£'ˆ¹ù]‡>¾¸«ð™ióë®àŠ÷ÿŒÐA\ÿ‡¿ä9âÏû Çÿ¤V´Âe¥ÿÏ®¹ÿ‚+ßþ3QøRSuyâ;Õ·»† ­M^µ[I:‹[t$,Š­ÈÃ8ìh¤®Ä?òðŸý…dÿÒ+ªè+Ÿñ8x®tCÈž[{ A¦¸ò!i]Q­§ˆˆ 7Ï"”g'€HÏñíŸÛäðÕ·ömŽ¥¿UoôKöÛ ˜´¹?1Øý1‘òž@éÔSi5 >Î%À·Ó5M@é¶€•’HŒ6ÈÅ lA1EÚ;Wåå­ÏøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€8ý[ZÑõ Xàºñ¾‡ªCÜSM ÜIö9Y¢ŸýäC±#&=É¿ÌdhÔ±”Ÿm¯]Ie¢®–³ã’[«H®!x.‚ÆuK8I·§ú²:¢”Q…_”…V¯@ÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆh“ŸÄúý¦“«HÚ„rºçþ¯øÍWOhqê3_­Ž¸.¦Š8dì;Q+óöŸáÿK¨ø®[í8.Ý徎}>2›ìVÞ*7ÀÃuÆí嘳¡@>Þâ¹{?hz| ­Ž¹m,“ý‡|rò;H瘻³1öÏUøL´¿ùõ×?ðE{ÿÆhñü‡<'ÿaY?ôŠêº ãîõˆu¿xj;+=WýP’iž}*æDû%Âd¼‘ªýçQ×½vW?àOù'žÿ°U¯þŠZè+‹ðÖ½m¡øWHÒoìµ”¼±²†ÚuG»•VD@¬¤eXd™I¨$P/áÝ>ûBøh|Geg¦é/…ÞDk½¯%0£¤óé°à3ýkò9ÝÔi> â,/ºçþ¯øÍyÞ™ ÍkðŽëT]?MÓ` J޶.Y¯™àVYfýÚê±Ëÿ®˜ÍSÅ··ú>·¾¿å_ÿb_ÝÝZZ´~f•=»F¢ nçs«;gq]Ñ”Wqÿ –—ÿ>ºçþ¯øÍð™ióë®àŠ÷ÿŒÐŸÏâëPÔíÛÄ·×öW„h·Ëqa¾k8¦‹g™²%Y{óW÷DÞåë¬ðψîõ[ÛkÝFú;{yt-6çìÀ"Eö‹—” ùÊ"ªîÇÍÐ’ jÂe¥ÿÏ®¹ÿ‚+ßþ3Gü&Z_üúëŸø"½ÿã4ÇÚkz‡týfx.>Ñ‹_Ô#‚ád2[Þ¡J…b­æ1`ÄžÒ£ Ø*Û­°ñT¦6ª,ˆ–ùU6¯9RÅ|¯0:ª’nÉdÜW ¿ñ&‡©é×6–:ä–·Q<3'öðÜŒa‘FA=(¸ñ&‡w=¤ÓØë%¤¦höðØå2x‹Ÿ•ØsëëŠÔðÞ¥6±á­7Q¸XÄ·6é#ù}9ßyCa€#p jW?ÿ –—ÿ>ºçþ¯øÍð™ióë®àŠ÷ÿŒÐàOù'žÿ°U¯þŠZè+ÁpMkà_[ÜE$3Ŧ[$‘È¥YD ‚ ƒÆ+r€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFËE´wü”=?þÁQÿèÙh ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+?XÔÿ²ìÑã‡íSÊ–öÐÚd‘Ž8$(v ¨ŒØ8ÅhW'y>«‹'¹›Ãz–¡ijˆšy·–Ûb±SæK‰&BïòùS´#mlH€$›Ã×o‡-›Oo´ëv®`fòW2t9;QgmÀƒ•BÊÀf5ÇAc}o¨ÙÇuk'™ äT©YN ° ‚¤ €Eséâû¹5¬Â:Ẇ(æ‘<Ë?•¸SŸ´c“þ^â¾¥¹|‡B¾°Ó.·]fî[|E9ÚQb•þWù¤9¼’ÞgÊÔQEQEQEQEQEQEQEQEQEQEQEQEQEóíÿ%Oÿ°Tú6Z(ý£¿ä¡éÿö ÿFËE{ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPEPEÏËây¿´ï쬼;ªßý†U†i {eMæ4“Ì™Xü²/jè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€ ?ù(zÏý‚¬?ômÝtÅÁ¨kQx«PÕÁúÏ‘qemnŠ'²Ü7˜ŸôŒc®9ìzwÔÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@ÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEtW?ÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÐQ\ÿü$:§ý šçýþ²ÿ䊯âû½3N¹¿¼ð޹­¬O4ÏæY¨ –88ô ¢Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˜?hïù(zý‚£ÿѲÑGíÿ%Oÿ°Tú6Z(ßü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (®^ÃÅ÷zžmgárK[¨’h_̳‘€*pn22ë@EÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEtW?ÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÐW?áïùx³þ±ÿé­ðêŸô&kŸ÷úËÿ’+/JÔ5«G\¸—ÁúÉKûÕ¸ˆ,öY -á‹ þ‘×tlxÏ}iEsÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@ÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEtW?ÿ ©ÿBf¹ÿ¬¿ù"´4]Y5½0^Çm=·ïe…áŸnôxähجË÷ô&€4(¢±õmx隥„Uö£uu³*ZFԌƓ,ˆ:ʽ3Þ€6(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚¹ÿÿÉ<ñ/ý‚®¿ôSQÿ ©ÿBf¹ÿ¬¿ù"²üK¨kZÏ…u}.ßÁúÊÏ{e5¼m$öAC:âàœdúí(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: +?EÕ“[ÓìvÓÛ~öX^öïGŽFÚÌ¿yBkB€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFËE´wü”=?þÁQÿèÙh ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ÿð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–€: ãüYª\Zx‡H²]OU±µžÒêY™`.¤wG€.WÉ”…Gç’9é]…W{y5oÚ<ÝCÆûÊŽP°ÇNLiù{šæàñ]õ¡[}gMŽ;ˆtË)î„åÝÄÁr¸Þ„n2`esÆXGsªë·z‹i·ûìöus-ª‹¹.·ì„¯Í·‘ h‹èNõzè.ôM:ú[©n-÷ÉuPÊáØ±³jÐÿ„+A<5¬ïó /y3Gl…¡Bûaeè­Rƒ… U9þéO-»Aq©Bô^\©\¼“0‚HF$2îC‡\•<„ r1€ƒJÔ¡Õô»{øDI“&9@tdp ÚêÀ«ÄÚ®U{ }3N¶°³Ëµµ‰!…7µ£'“€Z±@sþ ÿÏý…u/ý-šº çüÿ ;Ÿû ê_ú[5tÏÞÉCÑ¿ìÿ£m+ ®~óþJÿ`«ÿýi@Q@k¼ž3Ôímou)^ÛS·‚;b §ÙÚ(Vyü®,’¸Pr`ä+hYxºûRšî -9絸˜I¼Ú|„šHUdÍv†]©¸_šEÈÏIocoi=ÜÐG²K¹DÓÄïp‹<ôùQGž¹¬{ßh7ðK Ö³¤sy¢aäÐùÂGydØãzî’B²öÀšåíügªwcy.ËÆÖÀ²™-þI,†¦¶®…ˆÛæ.Jœs¶HÎKdƒâýFÿtZF½¯4«CIži—eÎÏ,F2 î2†Á# S$1ebãÂÚ5ÜÏg¾;M@êp5ÆË’í!~?3±Á㞘ÅaÚx4Öo'»»Žm.{+›Ó£ªÇ Ì„¨-;*±…Äkç À½‹NšþÆâúîöñ×ɳÔá[k¥–iŒ%#XÚæ!æF$Á.rÃ`6%ñ³.³¥éËi'öÚ^[ý‡ÎPŸi…¢á˜¦à›¥WùIŒçc3"‹—žÓg±¹·‚{èä¹–Ñæžkë‰ä)ÂUEw²HÁlõ`ø+A0ZEöYÃZyÆÞay0š33‡•„»÷îf¶s‚Ã8b\¿­­µ˜4«¸­ ½[ˆmníšý<å–VUO&‚»Êçü ÿ$óÃ_ö µÿÑK@ØüaÿAÝÿÓòUcñ‡ýt?üMÿÉUäö©yáO øCÅš•e³O!åÓä-=⵩‘štÄJUR7˜©gftEV]ÅëcûZïÅé0Í>¤tÏH¶É%›5ã¥ƒÜ ’HÃD~P2cj¶OΡ€ }ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•\>‘ã«ÿiWÿaÕ'—J+tRÔÉ ººòäED2*(@6¬›¤RÇqnqÐpO='‹õøFÃN2É´·½x%I!ò¦žÞáÑ­¿Ò%ßä'È .et+·aFRéŸcñ‡ýt?üMÿÉT}ÆôÐÿðM7ÿ%W©j²ø[Äž"¹k›´‡RÖÞkøþÄ’BRÎcŒ4ÛA¹Ë€#Àä/]g„õ½G^Ômîn®6C'‡ôûÓi(ΜÌ]²A~jÝŒO4¡ö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUyÿü&Z&‹ª¥ÏŠ¿e.¥=³ÞI=äðÏ"‹SòŠÉb€o ¸mTK9þÑu&Ÿ¬C ;yy(™FâØJ…ç®sÇJè?á(Ò³¾ÛçO·Íò<²Kö3¶y|ÍÛ~|mÎÏ›îóZO Õ¼WòÇ4 xäƒ+©Ásšâîü1â¨Y_ŨXͨ¶ª.fœY2A BÎXFaó²ìK[~ã¹AùcP:LþÆÐì´ã7œÖñ*4vnåW$"ç8Aò¨ÂŒhW?àßùÜÿØWRÿÒÙ« ®Á¿ò¹ÿ°®¥ÿ¥³PA\ýçü”=þÁWÿú6Òº çï?ä¡èßö ¿ÿѶ”&±¬jVºÍŽ—¥éÖ—sÝ[ÏpÍuxÐ*,MàmÉ$Ì;†?źF¡o Ë4 4ÈõWóã*°Û¸%ZI>⟕¸ÝŸ•Aš5 iºö³c{ªZÚ^ÁioæÔ°-à¨èÑËu^a­²÷O‰`…b8ýëeB©¸‡eR(Ô»ðËê‘È—v÷±Ëp`rÛî˜0Ý#{˜·pç Ÿð”i?Ùßmó§ÛæùGÙ%ûG™Û<¾fí¿>6çgÍ÷y© ñ‘u•½ôsI*ã¢|¦ð¢@6)óìÎíŸ66óXz·†õA«Á{¤ÜÀ&—[û|’Oô·A`Öü¨‘Käªô#ú§9þðF©¦jÅüÙ¶Ú„WhÛl·¶qÄYIûˆ÷†Z¨Â©Oõm¶€=Š( Á¿ò¹ÿ°®¥ÿ¥³WA\ÿƒäsÿa]KÿKf®‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFËE´wü”=?þÁQÿèÙh ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+—°ð…Þ™§[XYø»\ŽÖÖ$†òìÎÔPŒ›|œ:×QEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG­ IMLQÜÏsûÙfy§Û½ÞIF'jªýç=­ (¬}[A:ž£i«}§]ZÅ,*ö‚¹$1–Kޱ/Lw­Š(Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€3ô]%4M0YGs=Ïïe™æŸn÷y$iª«÷œô´(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý£¿ä¡éÿö ÿFËE´wü”=?þÁQÿèÙh ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠùƒöŽÿ’‡§ÿØ*?ý-~ÑßòPôÿûGÿ£e¢€3õߊ^2ðψu=HÖ~ͦi—rÙYÁöX_ʆ7(‹¹±Â¨$“ŽI¬ÿø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7EÂíø‡ÿCþI[ÿñº?ávüCÿ¡‡ÿ$­ÿøÝPÿ ·âý ?ù%oÿÆèÿ…Ûñþ†ü’·ÿãtQ@ü.߈ô0ÿä•¿ÿ£þoÄ?úòJßÿÑEð»~!ÿÐÃÿ’Vÿünø]¿ÿèaÿÉ+þ7Eéÿ4M;â߇®5ÿ[ÿjêv÷meûÚ °ª#…ÛU?4ŽrFyëÀ¢Š(ÿÙÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀÔ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙgspiceui-1.0.00+dfsg/html/OM-gSpiceUI.jpg0000644000000000000000000014151011640201014016433 0ustar rootrootÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ’ö"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô ønÓSðn‡y}®Iuu§ÛÍ3ÿn^ ÎÑ©c.I=+cþÝ/þ~µÏüÞÿñê< ÿ$óÃ_ö µÿÑK]sÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAErvÚlz7Ž´ë{K­I ¸Ó/XîµîT²Kl+°q‘ަйyÿ%Fÿ°Uÿþ´¢€É<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ~óþJÿ`«ÿýiEŸòPôoû_ÿèÛJ(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šó½Eõ/|H¹Ðmõk½7EðúA-úZHÐÏy4ªÌˆ$S‘^½sÁùYu'𞧦ëšv¥áÝføF²¤WÖ:ž¡5Ì[œïd¹„ßwiÜðNyýOX·øqñ3VÖ5´tOEo·PH‹%´ð#/”ʹc¹~`p=0@f'Å«‡ÇDÔõ ÙG©kSÜ$÷wÖW3M¨•Ø—v¢™J„$Ÿ p(Òþ ?ˆ#ñ‡s ^N²iö—š„Ö–Û¨$on­ ˜¬´íl1Á9—þ!‡YðV•­é72,·ºqVG‚½Ü*èÛIÁda“ü@ÕËÏù(z7ý‚¯ÿôm¥yÿˆí¯<ãì¢_3@ñF·gu¤D›[å¹äÜäýـ瑀ª’Ô}¾óþ¯öwÚçûü#^Ù¼ÃåùŸiÛ¿oMØã=q[šìóC¬xa"–DIµ7IUX€ëöK†Ãzʧ¸µrzõõ¿†>2YøƒY“ìzEÞ‰ý™ã©1ý§íö1Ùòó–ÀÀ<ðqr_Xø§Ç:áù#ÔàÒî%¼Ôo-ßtVÀÛIk»\¹˜ýÖ$llŽ;Kù®-ô뙬í~×uNðÛù‚?5À%Sqárp2zf¼áÕ·ã (¿ñ®³7‰/^S,ÚòÚË „dˆ`GØQGÌÖrÖ5i/¡Ñ¯¥ÒáŽ}A-äkX¤8W”)ا‘Ál£ê+Ëã×>xÃÃS_xÂ×F³Ö6jÜÆ-îÒh€ÜŸ4—)$”ó• ’_ÿ´ð^•ÿ †£>£'ÚþÂ×ñG¸•%ÌrH3ž#Q»›9ûÇ“rÃǶ×^ Ó´[ÝYÒ®õ+v¸³û|P£s.QÛk…É*Ø#¾ ù%õõƃð×÷ú„—×:-‡Œ"›JyÔyÒéÑ«˜ÈiäÛ»Œ.ÚìüKâ=#Ç~ ðná»èïç‹SƒZžHhà·ˆ1>a(ä°P¤dmÈÈdž¼]¢éß 4ýh^ë7–’»Åmý¢Âkû©L®« ~w,P?„ àF¦ã‹=WXM&ëKÕt{é¢[Eª[ˆ¾Ò»C0Œ†`Ì¡”²çpÏ#†Ç—ø}?‚Õ ŸÚlô­oí×§ ÞL 4á¥Ú„1Ù¸6zd‚ ×¤/‰ô}wÆšU¦gc®5¼SMqªA*H4Åaµ@pÝ!v«Âä‚(½ÏÄëìõ-BËC×5-'OæMJÎÞ3€¢-"™H`Ì ´œã» ë}ON¶¿³“̵º‰&…ö‘¹§‘GZñ? ê¶ž øxlõßjZ>¥¤¼ÑÜhÐ¥¡•\ÈYDk$,Î:°`Å~bw=SÀú5žà½/N°KèíV/5#¿Nža2`\‚;b€9}5/ü{ãM^öm^úÏÃÚ%Üšd:}Ä–Ïq:…ó$•ã`J‚~PaÂüÁ÷,ü3ªè¾,‚ïKÖ.çÑnÖþËS½’äÄB)­ËåÝ»væÁ§¾“¯Øü7ñŽ»¡ø¤´´Öµ95M?S‘q¦]â$gaFþ& c“´ÝÆkºO4ßø?þ½7ÍLj-£ºÔàžy BB‰™ƒnù[+³­z†/ï.>)xöÎk¹äµµþÏûâÖ]E òÚæIb>Rä ØXwnRÃ:ddðÅýåÇÅ/ÙÍw<–¶¿Ùÿg…ä%"ÝÚ§…Éäã­tž$Öáð熵-f,¥»Ê䉕7…› 8<‘Á®OÂ_òW¾"ÿÜ3ÿIÚ£ø§kÏáßÇ4vôµË€¸6Ð/™"† ùØW^H@2þ\øƒEñji¾(Õo¯¦×ô¨õ8ZûtBÞpÄËmd‘¸ BíÀQòÓ¨¸ø‰a‹ï<+k¥j·ú½®ÂÐÛEÖFy}îꪫ•S¸¯Ìê5ÍüBÒ¯<4š?¤ñ¥~tÔi’â;|ýšf̨©ì ˜€pAÅWÓ<]¢øsã—,5‹ØìŽ –M ó°H³¸%YÉÂ’ŒðpFs€@:ñ7Eÿ„#PñSZêIo§\}–îÒH\C.õB…KŸOÞè}AEñ+M{ÎÒu›{ bãìöŒÖê ™‰Â.¡ø+¹AÏ@Hó̺ï‚>&ø¾ÌIý“ªÜiðY¼±²4¢ÝãF>ác€zðAŒWGãh_< káÿ]ý§Uñ °Å°R^ÛlªîÓ…ÉEP§'œõPH5ÝwìšÇÄÿímW\‡L±þÊòÿ³.6Ío½F|ÇjîlnÆ23^¯xºÏCÔlôij¾Ôõ;¯™,´ø„’$yÛæ¾YU#Ü@ÜÄ Ÿcøÿ5‹þà¿û-z­yoáÿ‹ðk¸‚ÏL¼Ñ>Ã¥;•Efi E³µw'Í—쟼„?t'Ðîu£¾µº·•mßJ¸·)}ç?1F!ÎKH9\pFy[XxöÚëÄv‹{¢ë:UÞ¥n×oÊneÊ;mp¹%[wÁ ?Ä~2»{{íKÂö–šeÖ±g§Ëâ‘ H³E†Y&;€#`±‡bÈw¤E;»Ý0ücð5ä^/Ÿ[¾Ùšia0FÆ,*#D‰˜ÅÀ#–æ<ðW Þ/Ô¯µ¯ˆ¶š¼Z­Ž™¦iñKDmÖ{0`f}®Œs#rêrÀmä¯ôð˜ézƒt¯øšê2_ZDlmU<ûû±å†,T™‚üÎÙǾH‹¿žñ'Æ‹v–1;èð:FXne[7 @ê@, žÛ‡­H?â]oðÄ7ºÒ4ý<ÃwvßršÖ4Œ¿÷T·Ê22FEwÇVŬ­õ•õ…ö“h׳Ø\¬~tÝæFUÙr ä7 0qÅc‹š9Ðá×ή IRÔ²yQ³c%†ýûU‰BÁJîRcŒó~7Öì|]«jAÔ¤žßBðæ§%ôö£}¼ÆxUR"œò—î2ƒ¸;dñ—üšõ·ý‚´ßý ö ó}5/ü{ãM^öm^úÏÃÚ%Üšd:}Ä–Ïq:…ó$•ã`J‚~PaÂüÁý"¼¿CÖlþxÓ^Ð<@ÿcµÖu µ}?Sœ„‚máL‘ÎŒryô\¨` ÏÛüâòÃP¾¾Ò5­B-2êÇQ¾’!ܳîeÆ$, ä  çø?ÇWj>1°–Ë\×.¬õ»ÙvZ¨—ìÖÊT"ƒ#¨ä‡Ûd­ë¡­ø“þ?é„n ¾·´Ô ¾Öo"mÐà N’${ö•fv ÆAãv0üãÏxYñÞ—¬j1ØÏ»{|nH÷!;³‚Ÿt œŒÎ:KÅÚ.µáÿ kPÞë0ZjZżVßba4¤ºùS‚y‹r°`3œ dsZ~=¶MRþÃMÑudéèÆê}:x£uÁh·»¨i@+”\žqŒ‚—¤7‡ü?¬¼RC»ñ -RÖ9T¬‹ …‚o!w  ƒÍlhÓÛøcTñŒ:ï‹®ü7+k:ŒvÀ[bâÞL–?2'2µ†Ô$‚¸*Pñ<¡Ià»_Ç$ïgw„¶b&y¦$¨…ø¤Ü àqÁ9ÛÍG¦øöÚþý´é´]gMÔÜÜZZê$-z+ oØ]A\©`W<ã ŽK ;hž(Óí5[­>O§ˆ5Õch£!‘çÙß”|² ŒH+‘]ÂøŸG×|i¥Zhöv:ã[Å4פ¤ƒLVTÒWj°l.H"€+ü8ñ&­â/øI¿µc~Å­Ïmoæ¬CËŒcþ윲w' îfç.u«=KFÔ4‹Ë´M*ÞãUº²†àÄ·±C-¶ôs1±Üò¡Õ…SÂ×8·Yc3§Š/ã 7*±P¤Ž ¬ï´úWA©Á ׎´»{ˆ£š t}A$ŽE ®¦[@A‚ãOÇÚãÁàµ5ü }­ËŸ¦Ü‡b…ç WN˜BÎtuà?‡þ.];àÆ‘­k×·w—¼±&æi®.¥3È©rîpƒ°Œ¿hê-Óü={öã⸆K‡Û \Èìb¶&.¥E¸b¯Í×/‡£A7ü(ßêKi¤ë©¨_:)c ¼wo“hä…È'œdô€=cJñ•¶¡ª[é—šn¥£Þ]Ûý¦Ò-J4CpŸÄk°Þ£ဠãÆ\ß4´ûEÌF¹y¤[Ê#“Wµ³ó-1óo‘X6ç6>çU mï•Έ_Þj tkËû¹îî¤ó÷Í<†GlO cÉÀ~ÜWŸüÿ’C¡ÛÇþ”I^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ýçü”=þÁWÿú6ÒŠ/?ä¡èßö ¿ÿѶ”PàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEQEQEQEQEQEQEQEQEQEQEQEQEQEËøÓÃwž#ÿ„{ìr@ŸÙºÝ¶¡7œÄnŽ=Û‚à·#à{×QEQEQEQEQEQEW/¡ønóLñߊõɤ­u±ý‰uò¢(Û'ŒøWQErÿ<7yâïjZ„GuuålyØ„eG9 ÑOjê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9øbóÄÚ‡¶^Amc¦j ©Kº"òK$dlEä¤4™'$¸šê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ûÏù(z7ý‚¯ÿôm¥^ÉCÑ¿ìÿ£m( ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢¹ÿøNüÿC^‡ÿƒøª?á;ðý zþ aÿ⨠¢¹ÿøNüÿC^‡ÿƒøª?á;ðý zþ aÿ⨠¢¹ÿøNüÿC^‡ÿƒøª?á;ðý zþ aÿ⨠¢¹ÿøNüÿC^‡ÿƒøª?á;ðý zþ aÿ⨠¢¹ÿøNüÿC^‡ÿƒøª?á;ðý zþ aÿ⨠¢¹ÿøNüÿC^‡ÿƒøªÐÓ5Ý[ó²u[ÿ'gÙ.]™Î3´œg¯¡  (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ *ž¥«iº5ºÜjš…¥Œ áK©–%-‚p 3€N=eÿÂwàÿúô?üÃÿÅPAEsÿðø?þ†½ÿ0ÿñTÂwàÿúô?üÃÿÅPAEsÿðø?þ†½ÿ0ÿñTÂwàÿúô?üÃÿÅPAEsÿðø?þ†½ÿ0ÿñTÂwàÿúô?üÃÿÅPAEsÿðø?þ†½ÿ0ÿñTÂwàÿúô?üÃÿÅPAEsÿðø?þ†½ÿ0ÿñTÂwàÿúô?üÃÿÅPAEGðÝ[Åqo,sA*ŽHØ2º‘AG9©(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿ¼ÿ’‡£Ø*ÿÿFÚQEçü”=þÁWÿú6ÒŠ< ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€9ÿÉ<ð×ý‚­ôRÕɼG¤[] iSzºx ƒpÑ V<‘Œ” ŽÄ:ñTü ÿ$óÃ_ö µÿÑKYþ&ðx‡Z:²j“Ú]-¤qCˆÖDŠx¦Á8Vãr“"z¬Œ\œ€li~)ѵ˜­$Óï<ïµî1'”êø ³!‘v²Ì>dx?:æ§Œìf¸ñž9 ´Ñ“Î{£ó,‘";p+$¡ç` £³ð‡öV¦oô˨!’;E°µY­|Ñ ªFqgps¶P\Ãpr­’“>O†–Pé?aÓµ+èó¥O¤³ÞO%Ðò¥W*ŒáQƒGùR.ÞT¨AŠ4™"½“ÎËʉ-%B­"«$`2‚Òéò.[, Œ(¶ñNyg-Ô›¡†î;)I‰ÁŽy ace#!³*ùI!°Tâÿ†.n!Ö¦­%¬šê]îUu ¢ØÆ7G#÷[²Ž‡8+¸6‡|y£ø†Ö{«ÏµCm¾ãÏ S|Œ÷$ŽØw%™ˆ'0à’$$bÓÅÏwypñéþn™ ÝÅ“Ík#OO]èÖZ}îq%æ¡¥YYZÛF¶èD O;+J€‚—.vï\-÷Nç‚í5? "jÐyÒ]ÝÜIc̸’A»Àà3c8ÉÅtÏÙÿÉCÖìaÿ£në ®~ÏþJ³ÿ`«ýw@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿˆä9á?û Éÿ¤WUÐW?âùxOþ²éÕtQE‡sã Í7ÜêQÄ ]ºîF…«ŸhÆIR’# W"Öôé¯Î;×M,ù;z´`,¸Ê® Ç |ÈðNõÏ/¬|5³Ö5ëÝR]Bqö¹a‘¡d ¨¢&‚áõUšªq† ŠÙ;@5¶¯©]¶¡>£ntùKZ«2Y2Ñ#d}þc‡ä~ó ±6€XÑ|gc«h׺¤‘Ékomqå+7Ïç#ª<.€ ÄÈ’ÄBcvæÛ‚zÜ›Å:4v×R^bÅO”ä C‰EÆcT<;8P‡†*kŸÖ<<Í>ƒs;Ü\Ka½oç–ïo‘v²‡ $›¶ª´¥“?7vœî¯wàÝu® ŽßQ± qi©%õܺx’×ÂÁRÜË…á]ÊJ±pÌä@¢£‚¶·Š2)’Fv rÌIcîI'½I@Q@ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?yÿ%Fÿ°Uÿþ´¢‹Ïù(z7ý‚¯ÿôm¥xþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEp~ е¼ áéSÅšÌúe³,QÅfU‰~Qºp:rIõ&·?áÕ?ès×?ïÍ—ÿ#ÑàOù'žÿ°U¯þŠZè(Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üTô)ì|u­Åq©ÝêtËÝ,JÀy·(òÑ8ÏLòy鎲¹û?ù(zÏý‚¬?ômÝtQEQEQEQEQEQEQEQEQEQEQEQEQErþ/·–ïPð´ÞÏe#j¯‰à]1grx¬¼ôä¾¼ÕøGµOúõÏûóeÿÈôx‡þCžÿ°¬ŸúEu]sÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏøþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs÷ŸòPôoû_ÿèÛJ(¼ÿ’‡£Ø*ÿÿFÚQ@?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPà½wQ‡À¾‰<'¬Î‰¦[*˶a\—槯 P+sþSþ„ÍsþÿYòEÿ’yá¯ûZÿ襯?Ó|{{¦ZøoUÔuVîÎöÓ:Šêlv°,­˜Äˆ2| e×awbª›¨Ð?á!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"¹{ïÜ][éw–—60ØÛ꯫sgx."h£µk–?’Û×`ù°ªÛ ë¼h[üDKëé,-¬n® –Í#Ž Ie3y($‘‚H¤Ê¡ÀpÍž6?á!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"«ëÞ'¼Ñ¥qý¡jÖú‹Ã%Ä‹ŒÉFáˆòpÞ0rzæ¹ùF½ý§Ì’k1ý½çº¿]Žï ‰¸ó ¹ ÀI•0‡vÕ—nöŽ!Yz†‘®Øj×úÅ®=ìž»šçJE!¡öÉ[¥Ç$ìŽ@ˆW«©?1ù hÖZœ¦-!à2[ÚCdÉæBÂÒ¤jFN0ÞräòJ°$•ã>OøcX³óBO5­×Ÿ0x5)ÂH·%^P HÊ«m/p99æÚËPÐu›-ò]f_ ÚèVvò\iÐÜn’æ6•B¨‡s eù˜®É³`í|û;WNðÿ‡-o¤ÖtëˆF¶¶†y°”LáJ«—2) ÊÀF ¼À\¢¼nåüQ­Xx—NÔ´íIe“G¿L—f)îctXD!¢DT#~Ԙȇ÷›ŽIê4«ëøLíâøƒì’'—ž;ı|«0‘ l¯™æ—ó÷H±°0 Ñ/ìä¼k4»®“;¡뀄åzð$ŒŸ÷×ÔUŠòý~ÃX“Pñ¬PZ_=­ÞŸ¨ìDÊM!³°Hð Ùª÷áÀï]G„ïY§¿´5S§¬¹²}J …(HüÅ-0Ü˽ò¬í¸’êl@¢Š( ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿ¼ÿ’‡£Ø*ÿÿFÚQEçü”=þÁWÿú6ÒŠ< ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€8¿ jÖá]#K¸ð~²ÓÙYCo#G=‘RÈI¸‚µ?á!Õ?èL×?ïõ—ÿ$WAEsÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘]ÍÏ­_][Ëoqà}fh%B’G$–,®¤`‚ Æ#ŒV|Z̰ÛkàKM´’â4Ùj¶(­,ޱ®U'êX ÏÓ< í+Ÿ·ÿ‰ïˆäºnl4‰|»R8]le•ò>ò¢ÉåŽFÎ U ½‹îõ8î­|#®I äd³R$2²›€U A*Çü$:§ý šçýþ²ÿäŠ"ÿ‰ˆÖÔdž³,’D:.‚dP?†EI$è0ë!$™sÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘]ÏÿÂCªЙ®ßë/þH¨ôA¨]x«UÕ.ô‹½: l­-â[©!fvîˆò¤p%N¤w®’Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠçüOïÚtÛ-:{ÿ°ê 4ÐÀñ«ì6ÓÇ‘æ:©ù¤^ôÂCªЙ®ßë/þH®‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"º (Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Y÷RG}¨Á¨Þ|7¾¸¾ƒo“s2éï${NåÚÆ|ŒHÇC]…gëzŸö>=êÃçÌ»c‚ Û|é‚G컕wrx€9÷ñ릦ºqð®¸nšQPö„y†7”!a>lFb ÈIûËøHuOú5ÏûýeÿÉ$~…´I¬n®$’ââãí“]ƿډÔÜ#*VÜÆŠwÍR›RÒÔÞ,qêîmïcŒ«2pÅA9Ü:g’އ½Sÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè( þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’+ ¢€1ü'cq¦x7C°¼ËºµÓíá™7µÖ5 288 ô­Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ~óþJÿ`«ÿýiEŸòPôoû_ÿèÛJ(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢ŠÏ×T“C½Dx#ÔÞ&Ki'm©žŸ•³·®6œãg5ÍϨx‡Â~–TðæŒº~“dYbZ™˜E}ѺۓµqÉúší+Ÿñßü“ÏÿØ*ëÿE5SÕañV¯¥ÜXO¢èÈ“&‘kR‡‰º«¡6§k«Ê{jé,>Ùýmý£ä}»ÊO´}Ÿ>_™»fyÛœã<â¬Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sz½ž¼þ%´¿±³Óo--mØCÕëÀRg8w C $ ¤m < ä7%Éɯxª-fÛKmFóî-æ¸FÄ»BÆÑ«þœæUÇNòXÚø‘¼[§w§éV¶²Úk±¡$Ï&Ö- Ð(KJ0Ï›“ª*Åçü”=þÁWÿú6Òº (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçï?ä¡èßö ¿ÿѶ”Qyÿ%Fÿ°Uÿþ´¢€É<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( OI×¼U¬èÖ:¥¾£,¶ñÜF²k† ê‹b3ƒêjçÛÙãúhø9›ÿ‘k ®UÖu#â÷%ç›D‹O³KȨKo6[ö¢Xð©å€øþÜx±öÏÐ CÿÁÌßü‹Yúí¿Œ5¿jzOöF‡Û­%¶óµæm›Ð®ì}˜gÎ2+›ðW5 WOÐ,È'¸·K{Û†um Þ|’’ÃmDæWWÞ2Tnx TÕ59b›T½ûLÓxMºm‰å¦ùä– ’1½Àlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"×?eâNââK[Yl`u »C=ÊMp†oµJŠŒáÿrʾK„r¾jÇ–9'ƒo/µh—úÄw—VQO,©–º†û¹#8#8À'$lñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"×AEsÿlñ‡ý´?üÍÿȵ&¬jWZÍö—ªiÖ–“ÚÛÁp­kxÓ«¬­*àî Â{¢·+Ÿ³ÿ’‡¬ÿØ*ÃÿFÝÐAEPEPEPEPEPEPEPEPEPEPEPEPY~ ÕfÑ´ŸµÛÛGs;\[ÛÇ’˜”´³$@– Ä_=JÔ®Æ_ò¶ÿ°®›ÿ¥°ÐöÏÐ CÿÁÌßü‹GÛÍi=·•ý¯7Íæ¼-»?fãN1ŽwvÇ:lñ‡ý´?üÍÿȵÏéž/¿–ÇY¾Š( žªÝYÜÂæGžíÄÇjBK6׌*œïvòÀ‰B±¯Œîµ½>A»vÝéϼöÀÅqxªch "íB<À\>6® GÛÕÛ“êÌÌ}KÔÖ\>8Õl4M?Pû4w6pèúUÌöÅ$×S½Ó¼XÚBr¥T€Á‹œ‚ÀÀ¬ûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù¸û¯ÝkÞ½Ž?=ñ.•±á‰'··‚ÞÕ^æØ­ªÄÎÈbî‡/Øÿ ã®Â=Ju›-VO>ÞÞ‡bÒ²4Š sœæ&ÏÇ^×(‹“Vøe5ì7²ê{¸_|S´ÖÅÑ·™2­œƒ½™²;’zš,õo†Z}½Õ½–¡áh.ÓeÌpÍl‹2àŒ8 0Ä`úŸZí( >Ï]øq§Ù›;-W–֦UœÃ ź!‘H*ûAÆàUH=FÑéZðø?þ†½ÿ0ÿñUÐQ@ÿü'~ÿ¡¯CÿÁŒ?üUðø?þ†½ÿ0ÿñUÐQ@ÿü'~ÿ¡¯CÿÁŒ?üUGàiáºðÜ—òÇ4êzƒÇ$l]MäÄGÎk¤®OÃú¶›£xn{SP´±µEK©–%-öÉÎbp DZ ²ŠÇðߊtoiÒ_èwŸkµŽS ?”ñáÀŒ8£ζ(¢Š(¢Š(¢Š(¢Š(®>ã]ÑôOˆz§ö¶«caçiV>_Úî-ø–ï8ÜFq‘ÓÔU‰~!øZÓÄwúþ­…ý–ÒëxÂ$udG\ü§ïŒ†á¸ÀÍX³ÿ’‡¬ÿØ*ÃÿFÝÐÿ ߃ÿèkÐÿðcÿTõ/ü>ÖmÖßTÖü1}¸uŽêêÞU ‚23‚F}Íu”P&|Kðù­Òݵ¿ Ý­R3uoµa`Fp…PW¡Ú=*;íwáÆ§‘_ê¾»ŽIDî“Ü[È@¡O,Ï\ t®ÂŠáÅÿÂż†ð]ø4]C³Ê˜Ik¾=€ÚÝFЪ:`c¥\Oü>[ð¢$Hª.­ÀU‰·D<c•Ây®²Šâìµo†ZjH–‡„mRGÝ`šÙ26ä'’­È="´$ñ§‚fx^_ø}Þß5ü$£m+•ù¸;Y†GbGzé( >×]øqc¨Ï¨Ùê¾·¾Ÿws źI&ã¹·099 ž¦´?á;ðý zþ aÿâ« ¢€9ÿøNüÿC^‡ÿƒøªÀÓÃuá¹.-åŽh%ÔõŽHØ2º›Éˆ Ž#œ×I\ÿƒäsÿa]KÿKf ‚Š( Š( Š( Š( Š( Š( Š( ~óþJÿ`«ÿýiEŸòPôoû_ÿèÛJ(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Šçü ÿ$óÃ_ö µÿÑK]p~ е¼ áéSÅšÌúe³,QÅfU‰~Qºp:rIõ&¬i¯k¬Ü5¾—ñ6îúuBí¬ºt¬ d…€œdŸq@¥ËÝi—>GÛ<{ªÛùò¬ùË`žd÷QsoËÉ«ðjŸô9ëŸ÷æËÿ‘è ¢¹ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG ‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€: +Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè+Ÿ³ÿ’‡¬ÿØ*ÃÿFÝÑÿö©ÿCž¹ÿ~l¿ù©è6SØøë[ŠãS»Ôé–,%ºX•€ónþQå¢ qž™äóÓeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sþ2ÿ·ý…tßý-†º æüsMá¸âI¤ßSÓÕeŒ)d&ò˜nduäê jk:gö½ŒvÞw•²îÚçvÝÙòfIvã#®Ìg¶sÏJÃoÌ£u¾¯$„ÔU]" ÿ¥\¤ýCìØv•b•d %ö™q¦YÉyãÝVÒÖ]À@ f\hÿgÂ{ªý»ÊóþͶÃÌòó·~ß³çnxÏLÕøGµOúõÏûóeÿÈôa,n.·âýKT¹ºû™6Áka¦D‘lÄh T¨ËùB÷wQ]G„<-£xGÆZ톇göKY4û™<ד.dºåÉ=~UÜWq§]_üCÕ>ͬßi»4«ßdHÌÌ·xÏ›ôÇlu9Ïì(®/R{]ámõO‰·v3²Xî¥Ó¢b¹# 4ã ŒûÔÿ„{Tÿ¡Ï\ÿ¿6_ü@ËØé—œw–=ÕnídÎÉ [ °H8aoƒ‚ü*Çü#Ú§ýzçýù²ÿäzè(®þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘è ¢¹ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG ‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€: çüÿ ;Ÿû ê_ú[5ðjŸô9ëŸ÷æËÿ‘ê?FÐønHži'tÔõid ȼ›æ;@=xz@%Q@Q@Q@Q@Q@Q@Q@ýçü”=þÁWÿú6ÒŠ/?ä¡èßö ¿ÿѶ”PàOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEÏøþI熿ìkÿ¢–¼îãHñ~Ÿá/jqGÕæ—e¶ 84æ†{|Ú6ýîÞi/µ5]ЦWŒ°!BDð'ü“Ï Ø*×ÿE-gé?,õ=CÕ¤·ûzŒ­Ê\ÌÙí·’r̺V0À¹IøËÚÚkºÄ:tñÚ_C=†·1ÓÒîâôÇ}™ZW‘c•ã3ðY×£4`•8&‘wâ-cJ¿Š{=rÎ9eÒ™–I®„ÛžëDHÑÄS÷aw,CËA’¸×pÞ2ÒDúd(·Ò>¡vÖh¢ÆPÐȾ%R¡£ùpFà V €°’ÓÄKsá=']x£€j fÞSÈÄ!£P»•I$08œd¨Éÿ ½·ñV›«iñjO:ÐÍþŸg ÝÜI}qäDa´•—”fY3·&ÛdVÃJ£•±7‰í-|TúÒIû<Çq±ÌlÒ¼¨˜.Ô9ŒÜÃy|‘Èå–ž#Òâî·F†ÑåyHö¡Ä…]€Vxr¤ì<6cMÕ-5kvšÑä!¤‰,O‘¶ã€ÊpAÀô ÐÊ(¢€ çìÿä¡ë?ö °ÿÑ·uÐW?gÿ%Yÿ°U‡þ» ‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¹ÿÈÛþºoþ–Ã]sþ2ÿ·ý…tßý-†€Û^]ø}"°\ÝhXº”&Û¸˜³( •P Gò:תÙx“DÔuíA!þи½þÏû\¶6ÒZ·Ì±”‹ËYdóíg|³ùo…ØU zEýõ¾™§\ßÞIåÚÚÄóLûIÚŠ cÉÀ¥céþ+·ŸÃ–ú®¡m=”ÒK%³Ùª›‰Dñ»¤‘ ˆ1“79Q÷T±€7´OAö¸º~ªò͵¼ñ<÷‹!¶û]ÚŒ˜ËîXŹ-åù›Gd±ë<.u›ë¿O¨Ç©CVú™häyÕF.#Kq&ð­!òKm2®æåˆÝ“]CøHK‹H~Ý›´G‰ããÚç–uT9á ¼ð¹6çgÍ÷y©ÄzB\ZCöèÜÝ¢r[øqŒåÿÂ}ÿ!_µkŸöþݹÿUÿ]|ïøøï÷¼¯àÿ¦Õ±cá½Q³ŽêÖû\’Èë—ÊA†VS(*À‚  ‚cIðÇö¨l/?wŸe§¢ÏóåÛ´„’A\³,„g3‚>ZÃÖ¼|mmeÓnã’î Ù&A$?(êP]³¼dF±€AnÄ+sþÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ~ïÁºë]A¾£bâÓRKë¹tñ$!®%…‚¥¹— »”•bá™É=ä­µ¼P!¤hL’3±c–bKrI=ëþÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚¹ÿÿÈçþº—þ–ÍGü!º_üýkŸø=½ÿãÕ©¥évš5‚ÙY$‹»¿ï%yX³¹v%œ–$³’OZ¹EPEPEPEPEP\ýŸü”=gþÁVú6îº ÇÔ<1¦êz‰¿œßGtÑ,,öš…ŶäRÅA:ƒ‚í×ÔÐwú>¥ý³&©¤j6–³Ïo¼ëwf× V6‘®Ù#*s+ç$çåÆ0sNÃÁßa»¶›ûN{#PKÝ× ¾I6Ø‹L;ç–8Þ[ž1ެ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔeà+Í;N³Ómµ˜>Â’Ø\] l‹I,–¢H+ xø*äÜœ€,Iá=bMWѶ¬F™¨ý»åþÎ:?´´÷üí§kIýÁ1ÆsZð†éóõ®àö÷ÿQÿn—ÿ?Zçþoøõeßü?[û9 mNHßf b–4eh¥¸ºK˜ä\Äñ¯ù±Û¥Gcðê!o:ÅܤڧR–)íÞT“ýÛ„>t²1Ç–cÓŒlÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔ³áu)´÷µš;$ÓíÌVФ¢°šÞhø|ŠÖÊ Œd1®3EÎ…­jz¯¥êšÕ¤ÃQ·žðX„ãT] ÊÄ€DŒrI%Æ …Á“þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ  ý[Ãz Õà½Òn`K­ý¾I'ƒz[ °k~TH¥òUzýSœø¼ªG~,’þÓŸ§Ãq3[eçxgšGâAö¼6à›—ËÛ°c ÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ®Á¿ò¹ÿ°®¥ÿ¥³Qÿn—ÿ?Zçþoøõjiz]¦`¶VI"À®ïûÉ^V,î]‰g%‰,Ää“Ö€.QEQEQEQEQEQEQEÏÞÉCÑ¿ìÿ£m(¢óþJÿ`«ÿýiEÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Ï<6¶òÜ\K0D…ä’F ¨ d’OÎkðM:K®ßE$WÚŠ/î¤Rº³´12öp²ùÉÞÎÚ SK´ÖlÊõ$hÑÿw+ÄÁ‘é „0!”‚:W'âÏ Úiž ×/ìïµÈî­tû‰¡íËõÖ6*peÁÁ­lkÿñ(¼‡Ä«Ä±^‘ÛLÃi;HùÚ²ŒÍûî‚£žn­å·¸Š9 • IŠ]HÁ#ŒP•ÏÚÿ¤ø¢{­+ä´]ÑêõŽæe@AÞDÆÖ`Èv_ÜÓ‘5(µ›o µìŸÙ÷ó\¥à•¾Ô!£V€·\æUÄÙß´€ÿ½=DCko½¼QÃH8ãPªŠpb€$¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿ¼ÿ’‡£Ø*ÿÿFÚQEçü”=þÁWÿú6ÒŠ< ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ çüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覠‚Š( Š( Š+Ÿñ™øGÒ8çž;P±…Þ š'Ø÷q#êC «Áh ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +‡ñg†í4Ïë—öwÚäwVº}ÄпöåáÚë82ààÖ¶?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ¬{o ÚIã-NÁ¯µÃkŸi4iý¹yò»ÉrçÍÏ"4ü½ÍwW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPyÿ%Fÿ°Uÿþ´®‚¹³àm®á¥ÖL茉!Öïw*±€>n@%T‘ßhô©?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®Â~´Ôü¡ßÞ_k’]]iöóLÿÛ—ƒs´jXàK’OJØÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +‡¹ðݤ~2Ó,û\³i÷sHŸÛ—Ÿ3¤–ÁN|Üð$ÏØVÇü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\^½ ÛhÖv—¶WºÊκ‚~óX»•J½ÔHÀ«ÈT‚¬F=k´ Š( Š( Š( Š( ~óþJÿ`«ÿýiEŸòPôoû_ÿèÛJ(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢¹{MsÄššÜOa¢iMkÝŲ4ú¬‘»yR¼EŠ‹v% ÆOZê+Ÿñßü“ÏÿØ*ëÿE5lñ‡ý´?üÍÿȵŸ®ÛøÃ[ðö§¤ÿdhpýºÒ[o7û^fÙ½ îÇÙ†qœã"€; +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€: +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€: çüeÿ ;oû é¿ú[ lñ‡ý´?üÍÿȵŸ¬ÛøÃW±ŽÛû#C‹eݵÎïíy›>LÉ.Ü}˜uÙŒöÎyé@…Ïý³ÆôÐÿðs7ÿ"ÑöÏÐ CÿÁÌßü‹@ÏÙk:Çü$0i:¶—cmö‹I®c–ÒýçÿVñ)RÆ|Ðr èk  ŠÏ×u?ìOjz·“ç}†Ò[Ÿ+vÝû¶Üàã8Æpk?íž0ÿ ‡ÿƒ™¿ù€: +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€: +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€ÿÉ<ñ/ý‚®¿ôSWA\~»oã oÃÚž“ý‘¡ÃöëIm¼ßíy›fô+»fÆsŒŠÐûgŒ?è¡ÿàæoþE ‚ŠçþÙãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE ‚ŠçþÙãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE ‚ŠÃÑõJëY¾ÒõM:ÒÒ{[x.­ouu•¥\Ñ¡OcÔVåV_ˆ5Y´m'ívöÑÜÎ×öñÅ$¦%-,É%‚±ÏCÒ©ý³ÆôÐÿðs7ÿ"ÐAEsÿlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"ÐAEsÿlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"ÐA\ýŸü”=gþÁVú6î¶xÃþ€ZþfÿäZÏ†ßÆx†÷VþÈÐÏÚm ¶ò¿µæù|§™·gìÜçÎÆ1ÆÞùà°¢¹ÿ¶xÃþ€ZþfÿäZ>Ùãúhø9›ÿ‘h ¢¹ÿ¶xÃþ€ZþfÿäZ>Ùãúhø9›ÿ‘h ¢¹ÿ¶xÃþ€ZþfÿäZ± êך›jp_ÙAiuav-`¹3£f(å ¢’Œv  Š(¬}{V¼ÓL‚ÂÊ »«û³l‹=ÉI)bÁôˆŒc½lQ\ÿÛƒ«^jm©Áe¥Õ…ضu‚äΘ£”0bˆzJ1Ú¶(¢±õíZóLm2 (.î¯îͲ,÷&\E$¥‹sÒ"1Žõ_íž0ÿ ‡ÿƒ™¿ù€: +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€: +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€ Ïù(z7ý‚¯ÿôm¥tÇÍoã |Ce«dhcìÖ“Ûy_Úó|ÞkÂÛ³ön1äãçwls¡öÏÐ CÿÁÌßü‹@Ïý³ÆôÐÿðs7ÿ"ÑöÏÐ CÿÁÌßü‹@Ïý³ÆôÐÿðs7ÿ"ÑöÏÐ CÿÁÌßü‹@ÉêÚ÷Š´mûT¸Ð4f‚ÊÞK‰=bRÅQK3lp=Eu”QEröšç‰55¸žÃDÒšÖ;»‹diõY#vò¥x‹ìJŒž´ÔQ\ÿÛÌ:ìÆ{g<ô­¶xÃþ€ZþfÿäZè(®íž0ÿ ‡ÿƒ™¿ù¶xÃþ€ZþfÿäZè(®íž0ÿ ‡ÿƒ™¿ù¶xÃþ€ZþfÿäZè(¬}V¼ÔÛS‚þÊ K« ±lëÉ1G(`Åô” cµlPEP?yÿ%Fÿ°Uÿþ´¢‹Ïù(z7ý‚¯ÿôm¥xþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEÏø7þ@w?öÔ¿ô¶jè+‡ðß‹<7¦i÷–wþ Ò­.£ÕuðÏ{n¹¼˜Œ©9Æ€;ŠçüYäÖ¶ÚIò½ßïí’ôÚÍuŠF1Ã"à‰2ÀÜ „ °Rhÿ„ïÁÿô5èø1‡ÿŠªz—‰~k6ëoªk~¾\:Çuuo*†Á‰Á#>æ€9ø¼]sg¤Í=ºÝ¼º~™­HRW ¯m4A#m²˜(m†MÌNÓó\Vå‰5„ñz]üv3FºÓ^âxÌ’CtFKlUP˜±mÙ@»X‹]øqšÙŪøR;UŠH¸·#ƒ"Î6±‘Ðãš±ÿ g€üÿ?þyÞoŸæ}¶ ÞfÏ/~s÷¶|¹ë·Ž”ÏÛøÊòûP𬷳Agk-¥¦¡tèÆ4ýõóÈ–Ç–¦`Ld“‚ãÅúýíµÍ½¤°Y^Cw¦±’m.t;›“‹dÅöíæP8$F–·Ã-)÷éÚ‡„lÜ8}Öó[Fweå#®ã>ŒÃ¹ªñÏðš™"—ÁH“&ÉUZÔ]Á°Þ£r©Áîí@èÞ/¿›CÑîDP$)™Ô3iÍß”¢HÙ˜‘™ÎÛÌŒ’/ÊWqÔÐß]Ñõ¿ˆz_öN«cäéWÞgÙ.]™–ÓÚN3ƒ×Ð×a@ÿŽÿäžx—þÁW_ú)« ®ÇòO5׬⾹h4Ùà‰5;¤@G Œþ[!;˜Hò 7È“‡ÆÓÐIãOÌð¼¾%ðû¼/¾&køIFÚW+ópv³ ŽÄŽõ]üKðúDt}oÃ Ž’£)º·!–VÝ(<ò†X俀9ûêö~3ñ>‘ô…õ ˆ-´tÀsk ŠØO R>`«r“lE);y&OxÎêêß–rKö¸o­!·i¼ìZUµ2¼rÃËfÝÆclå‹d2ƒþÏùþü$ó¼ß?Ìûl¼Íž^üçïlùs×o+<_ü,[Èo߃EÔ;<©„–»ãØM­Ôm  c¦:P?ø»U¿] ]-¡³¹{{%VC*;iÉvdi^F.3¹0Fy± çÑ+“ƒÄ¿­DBß[ðÄ"'ŽêÝv0Ê`ðD&»ÇN*çü'~ÿ¡¯CÿÁŒ?üUtW?ÿ ߃ÿèkÐÿðcÿGü'~ÿ¡¯CÿÁŒ?üUòPõŸûXèÛºè+“Ðum7YñÖ·q¥ê—Ð.™b%¬Ë*†ónÎ RFpAǸ®²€9ÿÈÛþºoþ–Ã]s~9ž_ Çqq,pÁ§§¼’HÁU^BI$ðæ¤ÿ„ïÁÿô5èø1‡ÿŠ  ϧæébkW‡z, x¼ÝŽÙÁ š·Ã-BÞÖÞ÷Pð̉²Ú9¦¶u…p…P0=¥jß ®uAªO¨xF]@:¸»y­šP˧y9ÈÀÁÏNok–:ÍÌ©c/•i«ÜÙ*ÂéåýŠo(,‡yó7îS‘³#œäXÖ/ï5]4Sw=¨ñYHöR¥’°ûVÒã•Ëà»NÞ22I¸þ%ø}":>·á†GIQ”Ý[Ë+n”yÃ,?ˆòsUãÕ¾C¥Í¥Å¨xE4ùŸ|¶‹5°‰ÛŽY3‚~UäŽÃÒ€2ïüFÞ µÕ­,µiõoìÙeºš«k‹©­ãò’U·iªÛœ¬ò± Ü>Ö+Ð7‰/IJ[àþÏPM1)3Ýg‚Ì¿8BI4…‚«Ÿ5ÿÂË‹;k9®ü%­®ï³ÂòZ”‹qËmSÂäòqÖ£Óï>iº´Ú¥¾±áxî¦9ͶëuXR‘‘ʦÔéŸânÇÞQ\ÿü'~ÿ¡¯CÿÁŒ?üUðø?þ†½ÿ0ÿñTxïþIç‰ìuÿ¢šº àüiãO ÝxÄ6öþ%Ѧž]2å#Ž;ø™ŒL6I'ŒWy@sþ ÿÏý…u/ý-šº áü7âÏ éš}åÿˆ4«K¨õ]G|3ÞÇ®o&#*NFAñ â¼ÿĉª^xËP´ÓcÕ^ê=*Ù¬¥·¿òm­'y.@–hüÅ.U $ÈB6ž‡ ÿ„ïÁÿô5èø1‡ÿЍÇ<·p¾%ðøÑQäðîeRJ‚wd€Yˆ·Z§ÿ ±wâ­OA³{¤ŽR-¥šÝÜEpÛ¼ŒàH<Æ-tŠª61b@S§Mªk>%¿º³[ç‘u FKÈ5O3NŠom$±ˆËû•¥ÚÂLŠÙSÊì_k¿58¤ŠÿUð¥ÜrJ'tžâÞ@Ò‚y` .zàc¥X³ñg€ôøŒV^ ðå´gnRتx²ª¨ô A@qø¯R°ÑõGˆÇ#éÏ©êµææ70Åw:ù0ò0UQAs‘h†ÆßòçøÅþ&ðö§yv÷ö“i–ÚèµktÓ˜°€Ù þgWbs–`ŒÃ àQè/uo†Z’F—ú‡„n’7‘ÑgšÙ³¶ç#'‚ÍÉ=Ï&‹Í[á–¢ó½ö¡á§Ñæiæ¶s#"•BÙ<•R@' $ Nñn§%ªyc­ÿgÜO5„ÖþdbÐÜ’°ÈÁãlabÃØ €;Šãìu߇dQÅaªøRÒ8å3¢AqoY ”.<1RW=pqÒ´?á;ðý zþ aÿ⨠¢¹ÿøNüÿC^‡ÿƒøª?á;ðý zþ aÿâ¨ð÷ü‡‹}ko-ÅÇŽ5˜`‰ É$‘ت¢’I6øsRxïþIç‰ìuÿ¢š¤ñ¤]xÄ6öñI4òé—)q©fv10É$ñŠËÓ#[ó²~$__ù8ó>ÈÚ|»3œglÁëèjÅÖ™qcä}³Çº­¿Ÿ*Áœ¶ æHßu6ü±ÁÀšçõÝ?Å:nµs®DÐj:šè“ÇÙXuEI¢wLŸ9žgRÞX'j²‘·5súŠxš÷BµÔ,´ýT\ézÜ’YÀÓÞâĻ᥌<ŒdÞ¨ÒÆÃsyxd%XÒ?áÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù¹}õ­@iÉ<­µœ^ ;Q¦»$[­“8ß$˯Ÿþz „å@sÆ^Ûø«MÕ´øµ'ž-2í7Z¬²ÃÀÄÍ1 ö Ö‘c;WŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_üQø>ie‡T@5!aîËíæYL^LLÜÌ<ÆkK‚ÙôI@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]Éè6SØøë[ŠãS»Ôé–,%ºX•€ónþQå¢ qž™äóÓesöòPõŸûXèÛºè(›ñÌm7†ã‰&’}OOU–0¥›È~a¸‘×G¨5_R´mÝn5Oˆz•Œ áK¯°D¥°Nkp3€N=\ñ—ü€í¿ì+¦ÿél5Šíu+«Ï-£Žxµ6vš[vš8—ì· —Ue8%‚ƒ¸rïBŽ™q©ÙÇyaãÝVîÖLìš°‘ƒ†ø8 ÂìËíìïøOu_·y^Ù¶Øyž^vïÛö|íÏéšãîmuÿ¥ô"Ê{Û{ÍnY/å²YìÌÌöñ:£¥ q[êe£‘çU¸-ě´‡É-´Ê»›–#vMgÉé¾)×–â/ *óSpöKy#¶mb1”dÉoYÕŒD0"8Šë?áÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù®xjkëŸ éê‚A¨Ie Ý #ØÂR€¾WiÝž01Z”ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz¯á ym5Á5ì÷².ª™žpß6vÇŠ«ÇNéëÍuÏø{þCž,ÿ°¬úEk@rþ/·–ïPð´ÞÏe#j¯‰à]1grx¬¼ôä¾¼×Q\ÿˆä9á?û Éÿ¤WTOR´mÝn5Oˆz•Œ áK¯°D¥°Nkp3€N=Ic¦\jvqÞXx÷U»µ“;&l$FÁ á…¾#ð©¨$„–P½Ð’=Œ%( åp6ÙãOþíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (—ð…¼¶š‡Š`šö{ÙULÏ8@ï›;cÈEUã§tõ溊çü=ÿ!ÏØV?ý"µ®‚€9ÛËw¨xZog²‘µWÄð.˜³¹<V^zr_^j=JÑ´ku¸Õ>!êV03„Y.¾Á–Á8­ÀÎ8ö5sÄ?òðŸý…dÿÒ+ªÅvº•Õ燖ÑÇ=ÕdºµÛöˆQl Ÿew(·Êär3Ö¼ïTOønë]‚ÖÆîèÏq=ìz|3Û£Þ˜¢`ÞT18d•U$rŽÑÌdf%vìkÚ¾¬k3ZXjWv¡¬¤îïÈû$,Ž­Hëñ*“"$ÎÅ+@§ü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#Ö„ÿ¶.µ{ícíË1ðþŸ½eßhs1Ÿ÷| “"<ñ•ƒÇãQÐô]VÖÞ«E.¥6š †òbׂy fVÁÝ#@S““1“sb€=þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (ƒñ¦…¨Ãà_Êþ,ÖgDÓ.Y¢’+0®Mò°ƒÓ‚¡ÞW?ã¿ù'ž%ÿ°U×þŠjè(®Ãz5ýÞŸy<>&Õl£mWQÄGjQ1y0à¼,Üõäž¾œWq\ÿƒäsÿa]KÿKf  ¸^ÖçT:\nåÔ²D—NiC.w ‚ ä`äcŒПE¾µ·–âãÇÌ0D…ä’HìUQ@É$›|9®]´ j{Y.Œoam⇻ŽÅ4ò.puÛ'šÌÀ 汩(ܬ{—ñFµaâ];RÓµ%–Mü\y2]˜§¹Ña†‰PûR6c"Þn9$Ð Ño®­â¸·ñƳ4 xäŽ;WR2"ßÎjOøGµOúõÏûóeÿÈõçúíß‹­õ SN´³ÕCÃݼ6Ó]ʯn,äx6æ=žg™å!‘¥2ì ÓÆú\røFÚÝSR–;KÛ"ÖYÞs\G¼’„Èä&æÏ' 7Þ€ ŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_üXþ½Ôæñ4qÝ&ª&kKŸíSqËkö„–%ìåÆÁS6Ýœ²í2e†k¸ þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚Šåü!o-¦¡â˜&½žöEÕS3Î;æÎØòUxéÀ=y®¢¹ÿÈsÅŸöÿH­k  Š( ~óþJÿ`«ÿýiEŸòPôoû_ÿèÛJ(ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š+Ÿðoü€îì+©élÕÐW?àßùÜÿØWRÿÒÙ¨>ÃÅ7—(]>â[|Û¹í×M™ ibM· ]ÇŸùcÌûÇËlÇ¥üC¶½´µc§jS<É q˺¸¸’Ý.H‚Fd;$¾ps': àø§Õ-nïµ}Jú K×¾·²ºò^(åmø ù{ðžaÚ |¸\}ÑF“à­7FŽÅ-ç»aeqÄ~c©Ë%˜´áGXÏo›žœPŸð˜én©$>|ÐÉ„Ñȉ€éy)Š"G#' `犯aâíÑ©¾³œ+jÙµÌ1b±w%¼!‰l³9U`l–¤|eÓ–ORŽ +{s˜ŠÎ¶’!.Le³¸œí+š§yð»Iº¿©}À»kÄ‘c·‘ã”ÎgùH™‘C·ÜRóK9` ,¼|.&¶[­2îÎk‡¾† #–[™-æH°Œ²`™²ÀÚì\"nk—^:°µ‚Úf²¾xäŠêk‚«ú[:Ç9“.3±›»ß§náŒÇ7€l¥š;…Ôõ(® ¸¹¸µš3ûVždš@„ÆxÜ…~lådu9bOøAlL{)¯o¦ó-/íd™Ú0î/$JÇj ¸q€ÏC@^¡†ÐuÏZÏMm­ø§NšÆ6}1íÓNB†öIRÕEË6Nçm .â¹ö‚ ±/ƒ´¹õåÖeóÞénÍÖÒÿ»$Å{JãA‚yGJǸø]¤Íýšc¿¾†M:+híæÛÉ"˜6ùlH™“î‚U ¡;ŽÜ³dæŸã‹iÓKY­®Ø]ÙY\Ëx±"Eºb‘O1œu# ¼.F[5bïÅ §ø¾].æÒC`-í]ƈ¥žibU|¶â’5]ªpI,@äþ Óm­míÒ{²[éöêK®JÙÊeˆŸ—©c†õ1Ö¬\x^Úîî{«‹»¹%™íX’P`[Ü=ÄJ0£Ï´÷*9Ëÿá1ÒÖ[ï?Ï‚ÞÒ+‰¾Ò锕-ÛeÁP¤·îÜ…;”g9]ÚÐÒudÕbŸý{[‹i|›‹iöï‰ö«€J3)Ê:7ÊÇï`à‚'?€nî4Mjµ9'¸ºMLY[HSì¶ÍtòqˆÃïÚø$–ÀyðÕÔi(Òžîioîõ »§S%ÍØ~Õ\* ˆ  ùˆuw=XÐ¥Q@ýŸü”=gþÁVú6îº çìÿä¡ë?ö °ÿÑ·uÐP?ã/ùÛØWMÿÒØj?kÓhPéf-CMÓÒò÷ìòÝê(Z(—É–LãÌNKFª2ßÅÞ¤ñ—ü€í¿ì+¦ÿél5©{¦Ã}u§\JÒ°¸7#ŒRE†ã¦ÙñŽ@ú =7Åé$x¿‹k\Åw;^FU-– wn vÈŽ@Ѻã9 n¢o^]Þ[išf•<÷[¤FÔ£1¢[ƒqØfŒy$¤Ÿ8Ü|Õ©©è:ÅÇ›z²H†ÊâÅâ µ^)Ì{ÁÇ9ýØ‚1“íŒóá)%s=ψõ›‹´t{k‰ Ú²¬ŠJ"Ä#Ë,®¬Y[# ©w>¸±Òí/DºV«jº©´º½°”yml¶Í<“*«¹FŒ)ÊÅ„go\l[x½'¹Ô¢†/íKµŽÂ¬÷h&2nf ´¾ù*¼ å™CX±ðœ—1ÝM¨ß^Ý. u4þP/!¶6Ø!FЀ#9íX÷? ô ›Vž~5¾‰¤Š ¼Ñ¼”Y"e„T0q±9ùF$¸ñÛKwåiÚthÉ¥Ï ü¥|¹¢»¸X¸MÁÔíÜFGU9ß±}â(tíJþ „Ž-íí"Ž!¹äžY"E [³"¯!Bç%ˆ'nyð ’ÚÃo§©@ÙYY¡C?è’ù°ÉóF~pÙøH'åèDൟíÏu¯j·7‘GÍ(·â4ó~O,D#u"i¬9‚ € O‰¥Õ|Cw¥6‹}f¶Ö‘\îJ.YÞD)´1<ØVÚÄ»ééž5…âÔ[X‚K!f÷ò,ûG5½´íº…fl¨ò÷ Io”ÒÆàø´I–[]_R$[ÇlÊþIVD™åQ ‘ãv€„U"¾¯à¨ntMFÞÆyÜöZ¼&w^?šå°¹ÀpÇAœäó@Mã« h¤ûM•ô7þk^[2Æ^Ò(Ö7’W!ʲªMaØï)!€ê+‡¹ðÔúâ߯‰uU’[K‹{›åhè«ù#B!Ú‘¯—#|¡X3’Y«´‚mmâ··Š8`‰GjQ@ÀŒP•Ïø{þCž,ÿ°¬úEk]sþÿç‹?ì+þ‘ZÐA\ÿˆä9á?û Éÿ¤WUÐW?âùxOþ²éÕGã zm ,Ũiºz^^ýž[½E Eù2Éœy‰ÉhÕF[ø»Ôzo‹ÒH4ñÖ¹Šîv¼Œª[,îÜí‘£uÆþr@Ý[—ºl7×ZuÄ­ { ƒqR0XÅ$Xn:m‘䡯©è:ÅÇ›z²H†ÊâÅâ µ^)Ì{ÁÇ9ýØ‚1“í€]ñÔÚT6K¤]Ån÷¡.MìF3öO&iZtÁ<ªÄXÆÀI…ÁE,¦®[xÆÞKIOúZEv©f¶fy`û44¸îUó‰Èë”PÙCX·ð±MNÞþ÷]Õu­¥Ya[–…QŽhøXãQȲz©Î+oK£Å$þ¹ž;ù.å”<·i†5hcͼª#D!WfT €à€Go㹯¯ìæ…­,ìîžÐZÙê˜g¾ŽtŒÊΔóH1ª¹ÌxÈ2.5/¼ig ž®ñ$ñµ•¥ÝÄ3¼!Ò³“mPàŽBÅ7gå$|Ã>ÃáéoiÚ^­­_OkVbçNL–’< Ú7Ä\FZ J†Ëp7’ßÀ"â×P‡WÔîçŠéõ´f?*Ùn¥s½?vÍØäe‹c{ÃPÄþ*±¶¸”<7fÎ70µôqo„Î<‘·.ÏŸ—…*_÷`ùŸ%\ÒudÕbŸý{[‹i|›‹iöï‰ö«€J3)Ê:7ÊÇï`à‚©à-ZÞêÆ}OR].áæ‘´ä1y"IC–|˜Ë’FbÂÕç†ü%ká{Y-ôû©ÄrÝ›©WÉ‚5rbíÛjª¿*·ÊÜ9$^‡ãá é²Ýé—cX»··‘,aƒ?›¸xÉ“`B!˜€î¬g#%CjÂc¥´¶>GŸ=½ÜVó}¥ \6ËrÁˆoÞ8*6©Æ2ÛG5—qàºiZݡӒÞݧÌm †.cB¡£e.MÇÍ‘ŒtÁ‰à5"¿Úwi¥ýŠÒÞXÆZù£–i$7£%ƒ™>m¤oß&î´ÚQEÏø{þCž,ÿ°¬úEk]sþÿç‹?ì+þ‘Z×A@ÿˆä9á?û Éÿ¤WUŒ5é´(t³¡¦ééy{öynõ-KäË&qæ'%£UoâïRx‡þCžÿ°¬ŸúEuZ—ºl7×ZuÄ­ { ƒqR0XÅ$Xn:m‘ä¡çíXé¸ óŽÔ†õoj±hÚ­Õ¶”úN©LðÛïY¬‘—|$»6&ȶ0ÌÈ´‹¬Äo5ôAä”·š ²N³¹Ž£w˽ÁP$(ÊGÎsQÛx6ÚÜ[@ú–¥5š²´i5µ6ˆlxÑeÊÆì ³±ç<° 0ÿáXC§Û\Tž ®¥²2bÞÖQÊÊV(y€o ƒ75?4^McN´’i ìjáC‡7K±ýà»Á. îÛJòKé¶Öݼd2\I\p¥sï¼,÷ö¿bÖo´ûU‹QKjè'-u‹€ ýÅ÷š‡ˆ~Ä׺UÖíBîÒK Xȹ²Ž'”,ÒŸ1²§ÊEûˆ32óÐ5øé5mH¹{)æšþÑH’ÙTC-ß’e{xË>w¯ÉùR¥Ã+¤Ó4Øt«W·¤d{‰î r Ý,­+ãs=±×­sú?€l´9tÑi©êFÏNq%½‹˜¼•“È0—â0Ù`ÎÄ»³c$Ð=â)Õ<¡qáëëFŸO¶»·_:áçß¶8Àlò#f Ûpªìâ0¹;–ž(¶¾½Ó­ ´»2^¥Ë6BlmÝc•dù¹"F ònòßš°æø]¤ÜéØ\ßß\C ¥µ¬~tvòò3ÄØhˆÜ¼gŒ21 9­M'Á–Z-­¤67—q½¥½ÜÊ Wí¬®ÁDaVA´Ú,¼PÏâGG»´’8ÒôZYÝ(]’?ÙcœÆß1mø26v…ÂÜ߯ºmÍ„×iØ –òA"áÊ[º|ØF@r¥z¸AÍ\ÿ„nÏûWûGÌŸÎþÐþÐÛ¸mó>Ëöltû»9Ç]ÝñÅrö¿o`𭔚ÔójpE§Â³?–RÍ š9$ÿºvmÛ#Ý÷h´Òõ(uk»…d@]ãxä4r#”t8$eYYr Œ¹Yú>’š=›Â.gºšY^iî®v™fv=Xª¨àmQ€0ª phP?áïùx³þ±ÿé­tÏø{þCž,ÿ°¬úEk]QEs÷ŸòPôoû_ÿèÛJ(¼ÿ’‡£Ø*ÿÿFÚQ@?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEP\ùðf‘æÍ$oªÃçJó:A¬]ě݋±²…f'€:×AEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP>Ÿá7LÔEüúK¥‰¡W»Ô..v£,•Ø ”^ž‚¶(¢€+ߨÛêzuÍ…ä~e­ÔO ɸÈÀ†Œ‚zV?ü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]—¥xOÑ®..->ÖÓÜ"$²]^ÍrÅP±P ®Ä]Î:šÔ¢Š§ªivšÍƒY^¤:?îåx˜28u!†2ƒGJËÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿÇ«CIÑl´H§ŽÉgÿH—Ι繒wwÚ©’ò37ÝE{V…V~­¢ÙkqAêÏþ/ Ás$µ“!ãeoºì:÷­ (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (?IÑl´H§ŽÉgÿH—Ι繒wwÚ©’ò37ÝE{V…P~­¢ÙkqAêÏþ/ Ás$µ“!ãeoºì:÷¬ÿøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (›ŸÀÚ-Õ¼¶÷ë3A*’95»ÖWR0A\G®’Š(®|ø3Hóf’7Õaó¥y Ö.âMîÅØ„YBŒ³Àk ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (?IÑl´H§ŽÉgÿH—Ι繒wwÚ©’ò37ÝE{V…PEP?yÿ%Fÿ°Uÿþ´¢‹Ïù(z7ý‚¯ÿôm¥xþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs÷ŸòPôoû_ÿèÛJ(¼ÿ’‡£Ø*ÿÿFÚQ@,x³Åž$Òüe®iÚwˆ5[;]Bâ {k{Ù#ŽÖFUDP@UàXÿðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@ü'~0ÿ¡¯\ÿÁŒßüUðøÃþ†½sÿ3ñTQ@¡ð]Ö5¿ˆw_ÚÚ­õÿ“¥Måý®áåÙ™aÎ7ŒàtôQEÿÙÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ’ö"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙgspiceui-1.0.00+dfsg/html/OM-Analysis.jpg0000644000000000000000000020030511640201014016544 0ustar rootrootÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ³9"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô?ø/·^ðõÅdž´i§—L¶y$’Â&gc’I+’Iç5¹ÿ'ƒÿèTÐÿð]ÿG?äžxkþÁV¿ú)k  þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšè( Æž ð­¯|Cqoá­âÓ.^9#°‰YDÄBäyÍw•ÏøïþIç‰ìuÿ¢šº çü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWA\ÿŽÿäžx—þÁW_ú)«  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(—ñ¿ŒáÓ­šÛLŸVÔï%ò­4ëfý丰mª£’òTg#SÃzÜ>#ðÖ›¬Á儼·IJ$‚Aó&áÔ«eOxÁßj7Z—ÆÙûSµðΞ# Á†êäÞ7È›”Ä6òNéÜãè7Øü<ø“áIì§²þÇŠîK[YJ7‘kËåþãÍò÷n‘Sï`ã³Óµtó¦&‹ö|ñÍœ¶ÒY¥žºÐEd×ah¢h”¯žB±nGRIï^§â¤ð×Ä]^º¸ò4ÍFÒ].òYîÖ(!tÌð1«L¹=7vθ¢¼NóÚ¿Œ¼>½gc%ìºÖºš”ö‘e-Ο1ÃnÎØ¨à“ŽK œè<ƒ§xòà.‰©x[X½²D}.M‹ctÈ3@S)#  c†c·%ðÞh—zöέ¥ÿeß>ï2Ïí ?—† |ëÁÈñÓ8íZóæáÝ_YøaðúòËE^°Óî/d»Òd¼,ìeqß) Aàç;±‚«Ðþ'‡ì5ÏYivz®w4¢â]P FPÍnŠJ˜Ù² +ò¨]¹ëÑÂääàtÍ}Ey_‹ÀÖ~.X蚎‘w®ivº8ÔbÓa’5Qqçìó\<ˆ®»X°ùËËW!ãPм-ã3a ]éÔ-í® ½Ôð°Šð]F‰"‘‚#!É÷P€>ƒ¢¼¿Ä~ð¼/8”ký±w½âÙLó]êòe–åòå¶-ȧßOƒDøÇิ¿ ÏáËY­.­ä-7Ö<[öËÏxz 4h¥ò­¯õ ç¶û^8fD¹ÚÆN?0ÁK?ˆ¨úN¾5 7ì!Ðí$ººÑÞé\”ùŠË"‚H* å'tΧÃéá¹øsá·‚XåA¦[¡d`À2ƇÃìAÃøê}6oø•-å‘õ|z—JJ"îVŒqÈ™‰±B:šôÍ SþÛðö™«y>OÛ­"¹ò·nÙ½mÎqœgµê?ðý‹û/þ%Ÿdó´>пë·ãÊòþ÷Ýù·tí^N<¡/ÀøuãZ‡JMZ-PJ~ÓÉtU“¨Bª0ÝQϯßMâ©|Fƒü77ÊÑ®U%/¿ 6x Øçß4í”W…ÛxBßXøsk5‡‚õ‘â ›xµµ´¼¶½áŒ0—ÍyüÀŒÜ•ÀÆI t“X¿‹¾!éO‹£‚Hí|?§&‘¹¼±zeÚï…ʺ® aØŒ?‚Æ€;ø’ÏÂ>»×/ãžK[]›ÒÎçTÕ‡zد ø…á-AøyâË[ ÛK¨,^Ñì´æYtƒ$‘ù›]™D¿{¸ÎM{„Cko½¼QÃH8ãPªŠpb€9;Oyÿ/|!6öxስ½óÏÅÌ"‘£U*2ÁeÜ@b@Æþ%|G·øw§XÌÖ_nº¼•’;4Åò(Ë>í¬8%;îö5‡âdk sÅ$†}Äp]Éä[,²½³Y[Gp‹Ÿº nXžŸ bŒ|õèP7­ø#HÖü5c¡3]ÙÛéÏ ØËi9Imš!µ ±Ï!r2s×=pD–>‚ r=jÿQ¾Õ¯áˆÃm%÷•‹e9ÞcXÑ3p `± ã ôPÂÝ×GÐ,lõ VÖmYe²½†d/˜Å[(Q”’z t';šG…í´­RïVšîïQÕ.QbkÛÒ…Ò%éUTLåˆU''m¾ï/?s“¿n8Æq·åéÅwP>ÞÒÿ´ü9{Ÿü#ÑI ”(ùM ¸8Uä{æ²âøoeoáùü=o­ë0èr¤È,#’%XÖBÌ@“ËóH‰Ásœa·) ö”P?û ´ï[®«ªÃuáþ,/á–5™Sv0Ù±—hPr¼…Á'-›–Þ ÓUõIµîõk½NÜÚ\\Þº‡û9\SËT§RB€I9$œc¤¢€8»O†öPévEæ·¬êZ=“«&{$MíÉE¬jîŠpB+ò¨ÆÚQEcø[Ãv~ð妇a$òZÚïØó°.w;9ɬ{V=×ÃïÚþ‡%ÍðµÖõÔ.]]7¤Œèä!Û€¹AÁõæ» (Wð½¶«ªZjÐÝÝéÚ¥²4K{dP;ÄÝbpêÊéœ0 §dcœáÍð·GºÑõûÍCUº›^–)oof™ Íå°dUÂU^‡ÇqEcø‹Ãv~%³µ‚êIá’Òî+Ûià`£9VSÔŒ0#ž™Árx+i:íÞ¿¬Üê[¹‚I¥ÈQb ‚27îûß*íë(  }Ãv~þÔû“¿ö–¡.¡7œÀí’Ln €0¼ “ïXïðîÃìwZe¾«ªÚh—R™%Òm¥ Ã^5;<Ĉ9Dp>f×aEaÁáM6×ÅQx‚ÜI ñiƒKŽÞ=«BxÂAã®1ګɧé¿ñ‹®'»ý {ßÝ™V%…6ªŠ[9cÎ1ž5ÒQ@à C Xjº¨°’Â}nöK¥´’1[[ïo&"Š© Äà`ûOÝ®òŠ(ÓþÚèw—òøZÕt{{éDÒYZy >0J$‘>Ì÷ÁôŇ€ô»jºOÚ/®dÕ¢x¯µ©¼Û¹Ã!AºB?…NcÓ$稢€<îƒúT>‹Ãϯx‚} .Ãiò\Æ#rv’±‡ØO;CŸ˜a¹ [.«ñÏPf³’ãO‡ÃŸÙ÷o%»<Ö•d1#kŠqÏë^‰Ep÷_ l/´x4Ks\“B†UtÓ Ä~^ÅmË/ÍhÇ@ œ¸9PFæ¯á{mWT´Õ¡»»ÓµKdh–öÈ w‰ºÄáÕ•Ó8`NÈÇ9Ü¢€8û¿‡=ÿ‡5m"êæúi5yVkíAÝ ÌÌ®m»B®Ð¡B… “]d´6ñDóI;¢id ÈxídõàèIEe¶c,:Ô¬“A¬9k¸Ù°0¤%TŒ Æ;ç$óÓü 4~Mਤ»M>gß,êPNíæ 2ͳüª¹+÷@«´¢€0õ Ûjº¥¦­ ÝÞª[#D·¶E¼MÖ'¬®™ÃÊpFF9Î\4uÓ¼Cmys}¨Í¯ÿÇíÝë£ÈpM€(EØI+…àã°vPÿ »—K}OÄ椺\±Oh—SE„’6VÛ#S#aJåË;ãæ´/¼'úäšÕ†£}¤ß͆æK+*1°È²#©eäÀ` Æè( ,|2ÑáÔ<*×Z“Ûê7j»»’p÷K½\¹b¤gäQ÷zRMv”Q@Q@Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)« ®ÇòOâµ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñßü“ÏÿØ*ëÿE5tÏøïþIç‰ìuÿ¢šº çü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ çï?ä¡èßö ¿ÿѶ•ÐW?yÿ%Fÿ°Uÿþ´ ‚°î|a Y¦ûJ8K·]ÈÀ°µb³íÉ*Aàr@$dkr¸}cá­ž±¯^ê’êµË eE4§ª¬Ð•SŒ0dVÉÚØÔ<]§[hwú£}®KM>kó „,{W%tÅ•— e`”`#_ØçN‘ã’{Ë)®˜Éþ¶ŽHcò j 2ï›fÁ“½v€Iªóø-§·ñB?7_·ž©ªîƒ$$AÄq0B¤á¶† rôõ‡žg‹SÄ:F¡4[æ†gæ"ÝHÈ&™°ë»ÌŠ1^:—74°|g£ FÒÐË8[›I®þÒÖî°Ä‘$¹FÊI HÃm%C2Òmím.6ßJ·7fÏËŠÆVš)M.¾bü©Ÿ»œ2¶6œÖçÃË›í:yu¨ÒuKòóÃlñ‘-ÅÂܤ‘â\¡ŽXЀKnŽ3š’ÇÀÚžŸoî@÷éªHM=¬Ó!Í©¶ØCÜvLœtÆ8 ‘üG¤%Ť?nÍÚ#Äñ‚ñísˆË:‚ªð…ˆÞx\ž*¸ñn‘%«\[Í$è·ða#*[Ï•bŽEÝñl‰*Á[i8Åss|5yts¢6©i_e}JÝ­uı2—hÙeJºÇlPU@*áðMö£ÒøƒW´Ôžå4ø¤+§yk"ZÎÓèd`ÆMÌ0÷{PYc}o©YÇwi'›o&Lr 8ËžªqÆH ÕŠ§¥YͧévösÝÉvð'–.%Îùp¥É'síÆæãqÉÀÎÊçï?ä¡èßö ¿ÿѶ•ÐW?yÿ%Fÿ°Uÿþ´®‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWA\ÿŽÿäžx—þÁW_ú)«  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(®O^²žûÇZ$VúÞžãL¾c-ªÄÌG›iòŸ1cœôÏž¹ë+Ÿ¼ÿ’‡£Ø*ÿÿFÚPÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@}¾uañKûN³}©oÒ¯¶ý­ _/ÚgTi×=óÐcç°®~óþJÿ`«ÿýi]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsþ;ÿ’yâ_û]覮‚¹ÿÿÉ<ñ/ý‚®¿ôSWA@ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEP\ž½&¥Ž´FÒí-.gþ̾ —W-…óm9 ±¹'8ãÏÙãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE®>×âLº-ññÅ‹_Gww;@÷é—kÒD#‡1¡–LÄáWvܳ¦åZî-5kËëízÚ (?â[*ÛÀÏrGŸ!…%;€C±x£#qêqÀ¿ÛÞmb_ˆz_öµ®4«ï/ì—q»÷¶™Î蓺g9=1Ïa\ýçü”=þÁWÿú6Òº (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( ¹ûÏù(z7ý‚¯ÿôm¥tÏÞÉCÑ¿ìÿ£m(aìmäÔa¿hóu RCî?*9BÃ91§åîkë†fÕ$´» ý¥– ‹‚–g¸ĉ•Ý‚•<œÐV?¼+­k×®‰4vÉynÐ^Ïæ”’7„™ìäSÎг WœKÐà2WÒü1©ÛêVSiòGn÷RÔ-#¸Œ¬·3Ë+ÊrÛnO˜m2|Œ 0¢ š…§5;¡¥ÜÜüÃO¹ÔɆöx£kK‰wLí"0VŸ’ Ž€ ê4±díyugñ5Ü©4æhdˆ»˜£íp1ò‚¤˜5y¿ü ïövß.;ÍþÂÝæ3ûV?¹çg÷ùëž:~ê·/ô]CûwTžóE“WÑnoZVÓãxOžßfµHäe‘ÕYÇ8ÚÇï`§”CJð…¯,4COŽííÞÙìÏÛ®B´Q¹š ÈÏógʇ8ÔM<6Èyc‰ ªv 3QÏrÄ;’xž‰mugwáO ]ÍöO[y‘Ix—pN°¯Øg©€K¸ùjÉ÷£ »Ì!šYô,ü+¯^è·Ë¬øZýî™r¶âYcšéÁyä#Fv™deiz€{gÅ­éÓ*ºÜb6–HŽŒ©æ$¢BÄ`1í9oáÈÍøbÃSµñUü÷š$–ép’;ß4±’î\e™Ðe„lñÆcãæ5‡¬xOV¸·¶£ý¶î讀Û|GÍŽMZÞáWÁNècs‚qÆ Åz…ÏøV+Û=1-ntéí!indxØÚEæ~î&(ä *mD ʆ~‚€9ûÏù(z7ý‚¯ÿôm¥tÏÞÉCÑ¿ìÿ£m+  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÇòOñÝøðÑ¥’8Q=Ñ@¬êGðƯ$}N]¤$¿ÿ‰¹¨Ÿñç¨Ë ¥êtÈr‘LêÌÍMÁ$ÎUc9>Ùãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE®‚ŠçþÙãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE®‚Šæììõë¯Zjš¥ž›i­•ź­­ëÎÎÒ¼-“º îzŠé(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWA\ÿŽÿäžx—þÁW_ú)«  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ªz´wÓh×ÑisG öò-¬² ªJTìcÁà6Cô5rŠåìWÄúuœv¶¾Ðã…2@:ÜÌI$–fclK1$’Ä’I$’MW°Õ¼Iâ?[^Â7¡½Ž¥h’ù7´‡tr ;]~ÌAààŽEvÏøþI熿ìkÿ¢–€.xrÛR³ðý®­$r^B†6t™¦Ü …•K¾Ð»›hËn ÅjQEQEQEQEWá­?ZÖ|+¤j—0ÖV{Û(n$XಠÐ16äã'ÔÖ§ü#Ú§ýzçýù²ÿäzè(®þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘è ¢¹ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG ‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€: +Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè(®þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘è ¢¹ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG ‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€: +Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè(®þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘è ¢¹ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG ‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€: +Ÿÿ„{Tÿ¡Ï\ÿ¿6_üTçƒUѵÝ[Äš•ô·¯o4Q[*-§c…XѯZë(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š(  }{P¼´m2ÒÀÁÖ£vm’iã2$XŠIK ¥²"+óÎ0kýÆôÐÿðM7ÿ%QâùxOþ²éÕtÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•RxÒy­| â‹yd†x´Ë—ŽHØ«#˜‚äyÍpú—‰uø5];Kû\–šÅª}–wž5hîƒ^ØÄ—^R°$I$ÀÈ*Lˆ*MvŸcñ‡ýt?üMÿÉT}ÆôÐÿðM7ÿ%W?sãR-SLµýÂÉ/Úì§“fmÄésm spK>iZ1ÃɱÙJ;¡ íæâ‹)¯¦¾›íú­Åª]Y\›«IcÄÞ\áäHžZîtŒåÏó¾:±øÃþƒºþ ¦ÿ䪧¤è>*Ñ´k.ß_Ñš +xíãi4yKE ÅÈÀô‡câýmtÍ*kx¬e‡û+I•íæ2ï–[ÉûòÌUTª±,²1眜Ñ{âcPÐ|ZžlÿÙš%Éó-ÑÒF¸Ynáó·ü‹þ¸. þùÛÈQö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUsvºÝ·{©Y‹}JÈIonÖVÚ¤Ï¨Ëæ—JàE$Ò0Ø–=˻ʡdu°ž7½¸Òlî¡[HмâòYà”*yS{d—Ë•¼Ù,^[ hsì~0ÿ î‡ÿ‚i¿ù*±øÃþƒºþ ¦ÿäªËðÇ¥ñ¼-M¼‘Aqo<ñÇ-”Ð=±†D£wpW&O˜&eJåò»JãõÛhžÔõoí}o°ÚKsådL»ö!m¹ûIÆqŒà×a\ÿŽÿäžx—þÁW_ú)«  Š( ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Ä?òðŸý…dÿÒ+ªè+Ÿñü‡<'ÿaY?ôŠê€: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWA\ÿŽÿäžx—þÁW_ú)«  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(—ñ}ìZ~¡ák©’w5WÈ‚™ÎlîG€±ëØq×¥Xÿ„ËKÿŸ]sÿW¿üfÿÈsÂö“ÿH®«  nè·VòÛÜXk3A*’9ºçþ¯øÍtPãOi×>ñ m¬‡“L¹E2h·ˆ ˜˜rÍ =Éw®ò¹ÿÿÉ<ñ/ý‚®¿ôSWA@Q@ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPX~"¿Ô­eÑí4¹m!ŸP½6í-Ô 2¢ˆ&—!UГ˜€ëÜÖåsþ!ÿç„ÿì+'þ‘]Pö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUtP?ö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUaøû^ñ‡q:R\OnÆÍ~Ͼ8æ·&i°71šè `ƒx²×—ĺºéÚ}ÒjqˆµWžo2X@ºx¸Ê]© pD2Â¥dÈí´G.à“ì~0ÿ î‡ÿ‚i¿ù*±øÃþƒºþ ¦ÿäªåü3¤ÇÇwz¬z……¶·‹¯7M)2½œ’ žìC0‰biSËU)´>çRÿ1l© ãì~0ÿ î‡ÿ‚i¿ù*±øÃþƒºþ ¦ÿäªàüAñUÑ4åI"<)~mîƒ[(½–ÖâHBJ$eÀÚ±³—{™Í›=çƒäsÿa]KÿKf ì~0ÿ î‡ÿ‚i¿ù*±øÃþƒºþ ¦ÿäªè( ]î¼I¦kZ,ú†•wkvöΰiò@ëˆ%”0c;ޱŒw®¢¹ÿÿÈsÂö“ÿH®«  Š( Š( Š( Š( ¹ÿÿÈsÂö“ÿH®« ®Ä?òðŸý…dÿÒ+ªè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Ä?òðŸý…dÿÒ+ªè+—ñ}”Z†¡ákYžtõWÉ‚w…Æ,îO„0éØóÓ¥WÕ´h‘A%íçˆÿÒ%òaH5]JwwÚÏ€‘ÈÍ÷QNÔØQ\~¤xk^³{­7R×&Ž9^ kWñ¼R)Ã#£Jz0zR @meô•½ñ¼Ku¹uÆ¡µcf*¤¿™´U°¹ÉÚN0(¬¢¹ÿøCt¿ùú×?ð{{ÿǪ8ü)¢Ìó$Wú˼/²U_^’´6÷ܬ§±½t”W?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPã¿ù'ž%ÿ°U×þŠjè+ƒñ§„ôëoø†t¹ÖKǦ\º‰5«ÇRDLyV”†Ä{×y@Q@ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐP\¿‹ïbÓõ ]L“¼iª¾D<Îsgr8D^ÃŽ½+¨®Ä?òðŸý…dÿÒ+ª?á2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè( þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ®‚Šçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè( þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ®‚Šçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè( /P×ìõ_xV xu$uÔärn´Û‹uÇØîG "('ž™Ï_C]¥sþ!ÿç„ÿì+'þ‘]WA@Q@Q@Q@Q@sþ!ÿç„ÿì+'þ‘]WA\ÿˆä9á?û Éÿ¤WTÐQEQEQEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢šº çüwÿ$óÄ¿ö ºÿÑM]sþÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@ÿˆä9á?û Éÿ¤WTxŸI½Õnt±\ÏkömA¦šæ/|IöiÓ H¬§,ê¿týìñŒƒÄ?òðŸý…dÿÒ+ªÆ%›ÂðéwIoÖó^ùW…‰+u†Yd‘qԢǻ%€ @'ªx[ÄV©q­¿öŤº¬“\ŨGË^«ÛÆVgC4(|¹¢XþU µ‚îEc^x‰,ãÔ"Ó ›U}+K·¿¤s=ó)•ncvóP·9p²yJ„•$WPÞ5•nä[[íXdÕRÆ×ì2 g¬VëÌØ#r[ø”m Œ‘ƒrÛÆv7šÌ}¤r\ýªÊÖúÕ¢ûÒÅ3H •`6",a‹üaq¸ª°?€¼?©éú„÷úÆŸ›%¶±1'ÚîŸÊ@®ûFöø@ÄvñNãÃSZø—Y¸>þÑÒ¯u4Ö°‹e[°Öñ푃ºïòåI³à¸óYjÅŸŽ¯N¿º¼šÅ&‹JŸQ–Ä@RïMd DrÂò—!Δì"‘©'Ä 6pnlu(c…îvÊaWY#¶¥Ä£c©;–ȈZØðÔ7ÖÞÒ Õ ‡PŽÊº2I½Œ¡|¶Nã»<äæµ+‹ñÆðYÛOi¦$ZšXÜê:¢+[‚Ö¯q…T9â5Ë~7v±eãX[ÃkIu½ÈžêÁ@°Á#F÷-€„(p€»p¡ö“@eŽþ$³Sºµ’9Ò L­Íó(Bâ1)GlåvCo#g nÝòÔšV¹«qqn-níg…_.ê0Œð¹a€J†(ãkmq´îUã ”W øé/ü/o¨j6SÛß›KIžÙU|nÈŒXr¼•w°#}£š¹qã]6Ú·‚ì†K‰'QwZÇná.þl¤!bÝP8æ€$ñßü“ÏÿØ*ëÿE5tÏøïþIç‰ìuÿ¢šº (¢Šçü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ çüCÿ!Ï ÿØVOý"º®‚¹ÙE¨jµ™çHßU|˜'x\bÎäðèC=:PQEqz®›á½âÞÞîëÄí=Â;Å®£©Ü±T*‘±A“Ž¢¬iZ‡uÍ.ßSÓ5MfæÎá7Å*kרaÿr9A@eÉÚè:åýõ”¾ iì]ã:Æ ª¬ÈÆM¬v²’œdgsþÝ/þ~µÏüÞÿñêè(®n h·(^ ýfTÈY²³„¥†§©Z8ÔÛRŠHŒL`c €Dãe,gj®< ±ià­6ÎâÒæ)îþÓj™K3FfÜíòážAs0rzï$moš¤ÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ>O‡¶·‘yz¦µªê›4ùôøóÈg&UGuuˆ1ª¹‰êÙÎM\¸ðV›skqnóÝ„žßP·bròQ,¤|½C / ëžµ'ü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@÷„໹’êFúÊ鵨  ò‰I°¶ÀŒ6”ìA99ÏjÇÕ>i:Í™†úþúyŸÍ3ÝK¼²Ê\òÙxˆ€Â†Œ!Úˆ2B&Ó^ðݤcÓtûíq/ïåØŽ5ËÆ0ļË. §_•I|Lj0ÃQ¥xnÑ5Ý/Q¾×é%’kWmrñ~ÑlÄT qû²þQ䟕Y±æ.@4Á­¬G¨ÝêW׬±<2Er2Ï«ID£,ìþ^í±…Tü)à ?ÁÎí¦^ÝâDŠ9â·Q"F² ²%,s!%ÌJ®[çü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@÷žDÑb²Òïg†hâÓ-ViIH¬çóƒ& õI À¨î< <—¶­o¯êVãì÷©y}D.îw„Œ·”T±mB• ^jÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔ †×ᧈmíâŽ"ÑîR8ãPªŠ!`€ãÒW7?´[«ymî%Öf‚T)$rkw¬®¤`‚ ¸ Ž1]%QEsþÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@sþ!ÿç„ÿì+'þ‘]WA\ÿˆä9á?û Éÿ¤WT·¢ê—Š´«»Kû½> {+¸å¹µ–ÜïnU•`„s?„r3ƒÁë>ñu¶‹Ž™eöØãŠõ óŠK4{´W~cÜ&&‘\9“ ce;UC²× xƒÆ:_†æMSÏŠx¡™¤ É$¾Q*3–ØJÀà:u,G/tØ"ó&‚íÜIim¹ý*á'h (w`9e* ¶ìádØÉëžÕ¡ÕuK½/E±¹´¾Õ|Û›7´ŠU¹ì±m•”Í}³,¿#¶7JdÁeS]„ôMF×Q·Ôu‹}×ÃÃú}“ÜÊë$žršuÝ’O&2OF8äãŠqx×R}{ÃÖ& Co=Åí®«8FÄ- >lF&–6 ­»'å‘“cIñÃ^%ªÉm%Õýî™m©A§ÙÄ¡öLÒŸ¾ò!T36Áœ`æE@ËÍáMVÃIÕ,¬|+$ßPm9mžÚ%´¹i º_Þ “ĪÜ<_g!F×®W¦øòÞ]Dº»·ž[‹è¬…ÃYÂZyî|½¨ÄŸ—ýfîIÂíÉËÆMOÇvÖZ^¡{m§]Ý‹{)o­H(‰{[DÈE.¿3¸щ2ÖQXö~ KÍLØ>ú6M©<ŒŠÉÆ1/’åXá‚2Àù ±°ï¼k6¨øŠ)`ŽTÒ­î®"‰P©•a·´— &ã´î¸aÂŒtÛóv”V~“«&«ÿèÓÚÜ[KäÜ[O·|Oµ\Q™NQѾV?{4(Ÿñü‡<'ÿaY?ôŠêº çüCÿ!Ï ÿØVOý"º®‚€ (¢€ (¢€ (¢€ (¢€ çüCÿ!Ï ÿØVOý"º®‚¹ÿÿÈsÂö“ÿH®¨ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñßü“ÏÿØ*ëÿE5tÏøïþIç‰ìuÿ¢šº çü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Žyáµ·–ââXá‚$/$’0UE$’xsRU{û}ON¹°¼Ìµº‰á™7¹Ã#‘OJËðü\=νwÜjI—o*•{kuRc‰Ç>ç‘ÛŒƒ!\°@jM~ÆâH¡ÔôèüÍOOß-¼[‚‹T†˜ã üsœX؆ك_þÝ/þ~µÏüÞÿñêÇðŸ†í5?èw÷—Úä—WZ}¼Ó?öåàÜí–8àd“Ò€; ë}ON¶¿³“̵º‰&…ö‘¹§‘GZ±Tô½.ÓF°[+$‘`Wwýä¯+w.ij’Ä–brIëW(¢Š(¢Š(¢Š(Ÿð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º +Ÿñü‡<'ÿaY?ôŠêº ÏÕ´[-n(#½YÿÑåó¡x.dÑö²dÛÊlBœ®Ù׿fœgä\ón?á Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêçî| ¨ÙË¥Øhw>^‘ ¶Ý î×35³D7û;Þ\–D\»×u‹O…zŒº«[<ðǨÚ]Y¼QEb(î3+c·.òÁGb¤×|?c§Ù$vWËêwŽmì#—]¾ØÓlfȘaQ™¹Î…Ë {/ [iúÜšf¥ªx‚â+„ì.fÖîÔÈʘ–#²@ †^Û„ŒqÀÅ·ƒâ·ñ¶²Ú¾¥=ÄSù?¼R*î#ÜÅÄ{¶+cj€ª}à­7PºÕn%ží_S·¸·˜#¨ ³ELWåà…¶B3žKuÈOøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€,iš Óg–áõ[ëË©¥4÷"ò"¡U‹åBƤ—@ù‹üÌÅsÿð†éóõ®àö÷ÿQÿn—ÿ?Zçþoøõ!ÿç„ÿì+'þ‘]WAXö>Ól/#ºŒßO4y1›ÍBâäFH ²¬®Á[Àg Ã8';QEQEQEQEW?âùxOþ²éÕtÏø‡þCžÿ°¬ŸúEu@Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)« ®ÇòO‡ xSJY5›AunK„ì<ÅY0ÆeÏÊ“#@®Á¿ò¹ÿ°®¥ÿ¥³U;? |>Ô..­ì´O \Ïhû.c†ÖÝÚÉpTåHÁô>•Ÿ{¦ø -:ëNð†¬¦£pmí¿³¬í;‘Øîb©€"|üÝF(¼¢¸»máôö×røwÃö‚âàÚ$wVVèßhWdhGg Œ¸RAÚH$sW!ðŸ€î/.láðÿ‡$ºµÛöˆRÊñn]ÊW#‘ž´ÔQ\½„ü©ÙÇyaáÿ]ÚÉ“AeˆØ$08 ¬ àÿú4?üCÿÄÐAEsÿð‚x?þ…MÿÐÿñ5OAÒtÝÇZݾ—§ÚXÀÚe‹´v°¬J[Í»!@À>€:Ê(¢€ (®>ãBÑõ¿ˆz§ö¶•cäéV>_ÚíÒ]™–ï8Ü3ÓÐPaEsÿð‚x?þ…MÿÐÿñ5—{¡øOñ—¢Üx[F[½Q'k\i‘cVe'okdvùO9À ¥Áéö_ uH鉠ø~C|ª–³X@²H#–X™cæ ñ’šVƒáž‹¢Ë«]xCû,R´O³Lˆ¸Ù:ÛÈÁ ‚U€$휌€zsþ!ÿç„ÿì+'þ‘]V{øwÀqj7Ösø_C‡ì6‘ÞO4¶,k™@;ˆãKœ1Ï\W¾Ñ¼m,Yx/JÕ.¦óJÁeck±0IIi ¨ÚìªFíÙ=88î(®>Û@øww›$Z‡?âgdc =Âm•FPÇ A‰ñKþÉÒ¬l<í*ûÌû%ºE¿Úc;@Î2zúšì(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Ä?òðŸý…dÿÒ+ªè+—ñz^I¨xYl'‚ £ª¾É'„Ê‹þ‡sœ¨e'Œÿõç¥XûŒ?è;¡ÿàšoþJ  ž%ÓfÖ|+«évíÏ{e5¼m!!C:àŒŸC\~­à]Wþ¼Ñä´kâò+{»™ –¼¶¸•AÚÁ"am¸`Gãc¤ûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€9óà½bk‹ AÞÆ+«Yo.…ªLï’[¨fT“,¬"rY””’Mè¿"°þ×à]/N²hÃL»ˆÛÝ&«<.-VUo% TÙ&"_(sœn8,El}ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@w¾ Ô®tëÛtžÐ<öZݺ’í€×— ,Dü½Œ7¡éžµb=^7jÒæ® 5í­íÚ&_± ]­/” Ÿ¼ü!è|O±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨?SÒü]késc ÚÝ™ÒäOôeò„`G<–ïŸùhNb ûÝ¡‚¦Ÿ°ðlj"{mììU`Ò´›yïEÌ›ckk‰˜<9‹HWÚØUb¡ƒ©9ì>Çãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ ‚ŠçþÇãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ ÇòOñ¬5]* Sªê;#ŸL’W_ôɳ–¨<çøG§=h¸®nóÂpj~*»ÔïÌ’ZIeol°%Ô¨²y™Ä±© ""Œ6à~`F2}ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÿá¼ÿ„ûG̃ÉþÛþÐÛ¸îòÿ³þÍŽŸ{8é·¾x®Hø{¬Ùi6rÍ­mÔìþÆb¶‹aƒÑ¢üæ‹ÎUp%ÎÒùî6¾[Qö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUcÉá SË*[Æ-Z2²êÂîí&UÃ)qYI*ÁXƒ¶@9cÁÞ*š7{æ´¹ŸûauÃW– ~ÆmÊ™`·Œ©!WH=2ÝgØüaÿAÝÿÓòUcñ‡ýt?üMÿÉTÇê>ñLÞ“N²¹±·kˆ¯"hÅÙq Îä²ùÒÛÉ,ªß+71¶ýÇqvÂ)½Ó5+K“¥YµÅ¤Í[Ü‚]<‹+…+o+†2Fí.A 0Qö?ÐwCÿÁ4ßü•GØüaÿAÝÿÓòUGàý#WÒ¡Õ$Ö®#žîö÷í–a)Ú!Š0–(†vz ãNMt•ÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@söòPõŸûXèÛº>Çãúèø&›ÿ’ªžƒ¥޵µÕ.í.gþ̱*ö¶Í…ónø*Ò9'9ç=ÇrÖQEW?gÿ%Yÿ°U‡þ»®‚¸ûˆu‰~!êŸÙ7Ö6¸Ò¬|ϵٽÆïÞÝãeLwëœätÇ …s~#ðªøR·k‰¤ŠÑ,§€¼´sÇ+Ko$RFáVƒ9õ Á©>Çãúèø&›ÿ’¨ûŒ?è;¡ÿàšoþJ NÃÁ¾*…nÆŒÒ_<2]Ï Ì«öiþ{¢ð¡Œ‡ L»C7/Ìr„ Ô­šð$öŽ—šœwÒnvÝ—¨µÈ J’CDøÛªêHÌvŸcñ‡ýt?üMÿÉT}ÆôÐÿðM7ÿ%P&þÔ<3qs}Gw¤Ø= Óì]®'’X£7G.ØälG%Ê´eUð 8#x4]P»ð¶—äxwMˆGq¨:Ã5ÅÆŸ=˜’éš?"EˆHˆS ¨YJôSÖ}ÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@¿†¼L.ãÓ'’;×f”·z­Ôìe†âi¡ÄX•ׂ7ãø ‡ÜÀØ·ðn½kµb£Mž cS’éï^åÒ{(ZrꯖAt¤FÜ¡eœeºO±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨/À¾×ô[‹©õë›Iì­-"Î¥TBe$*¬1OÞ «†#Ÿ˜ñ]¥sÿcñ‡ýt?üMÿÉT}ÆôÐÿðM7ÿ%PA\ýçü”=þÁWÿú6Ò±øÃþƒºþ ¦ÿäªÏ·‡X‹â—ý­}cu*ûËû%›Ûíýí¦sºWÏn˜Æ\ðØQEQEQEQEQEQEÏøïþIç‰ìuÿ¢šº çüwÿ$óÄ¿ö ºÿÑM]sþÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@Q@Q@Q@ÿˆä9á?û Éÿ¤WUÐW/âûØ´ýCÂ×S$ïj¯‘3œÙÜŽc×°ã¯J±ÿ –—ÿ>ºçþ¯øÍtW?ÿ –—ÿ>ºçþ¯øÍð™ióë®àŠ÷ÿŒÐAEsÿð™ióë®àŠ÷ÿŒÑÿ –—ÿ>ºçþ¯øÍtW?ÿ –—ÿ>ºçþ¯øÍð™ióë®àŠ÷ÿŒÐAEsÿð™ióë®àŠ÷ÿŒÑÿ –—ÿ>ºçþ¯øÍtW?ÿ –—ÿ>ºçþ¯øÍð™ióë®àŠ÷ÿŒÐã¿ù'ž%ÿ°U×þŠjè+ƒñ§‹4ëŸø†¶ÖCɦ\¢™4[ÄPLL9fˆä€;×y@Q@Q@sþ ÿÏý…u/ý-šº áü7â[ ?O¼µšßUyUÔr`Òn¦C›É‘•={:u âŠçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè(®þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ ‚Šçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè(®þ-/þ}uÏü^ÿñš?á2Òÿç×\ÿÁïÿ ‚Šçÿá2Òÿç×\ÿÁïÿ£þ-/þ}uÏü^ÿñšè+Ÿ³ÿ’‡¬ÿØ*ÃÿFÝÑÿ –—ÿ>ºçþ¯øÍSÐu85_ksÛÇvˆºeŠui-»gÍ»<,ФŽzã} u”QEÏÙÿÉCÖìaÿ£në ®>ãYµÒ>!êŸiŠúO7J±ÛöK îq‰nóŸ)o^øÏ8èh°¢¹ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€: +Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆh ¢¹ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€: +Ÿÿ„ËKÿŸ]sÿW¿üføL´¿ùõ×?ðE{ÿÆh ¢¹ÿøL´¿ùõ×?ðE{ÿÆhÿ„ËKÿŸ]sÿW¿üf€: çï?ä¡èßö ¿ÿѶ”Âe¥ÿÏ®¹ÿ‚+ßþ3YöúÍ®¯ñKû4WÑùZUöïµØOmœËiŒy¨»ºvÎ8ÏQ@…Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)« ®ÇòO8iüK$0ÛI.úeµÍ‹Gù·²Î\ LÈcn6;3"¨-&³àMÄ·7O4Ûî“PûTŒ#‚c †Ú8ŒedÀR‹•#9ÚÞ˜.þè—º)µkNÛWÔ¬®ç¸íüŸù+(ßeR2ÊÙ£B0EnX_[êzuµýœže­ÔI4/´ÈÀ8<Œ‚:ÕŠÇŽMÁÞÓìï5(,ìmbŽÎ¯§H÷mL(,p ¤ñèx­H'†êÞ+‹ycš P¾ŽYëP\\A¨6¡4ÝFóG"Ýý¡ƒ(ä(… ŒÆsÍeÅðÏÃZIÔå[™- Ô­î,-áXÖêEùU–0ÄîÚ¨¶2hB_[iºoÚ5+k³äÛÈfž(F×DÒË#|ác“8,€©O0°"´5ßO¢è–º‚è×w2OqoZ¬‘+ÄeuO˜–ÚH,‚Hä.Xs÷Ÿ ü5«kº® —2G=ÃÌ·QZ¥¸òä–ÛÊ|·–d¤›ö–Áf AÍušÖ’šÞ˜l¤¹žÛ÷±L“A·z'€ÉÙ¸k“C¡‘¢11Ü#ó0A,W~ ØÍWð׎ÿÃúEÖ©m'Ú.ÒµKm¬¯9J7ïå÷Ç€7YÄa…h^ø´Aá=k^·Ò®æM1îPBÏü†dvS¸á7+uù°§ xO†~·Õ4k£s$©ioRß}ËZåã%š2ûö§Í±—*˜èµÐ Mºðþ¯áôº‘à¹{¤º)"™"k‚Ò¸é… MèW9ê@ o[\ßÛZ›K¸¾Ðæ™ÂÅ£;Á•c—UGË.Pe߸m­ÊãâÑt›XC7‰çk啯 Ò¥šÝD’˜^'•cXÃüÀÊì….]±ÖºÉç†ÖÞ[‹‰c†¼’HÁU ’Ià9ÍIEPEGðÝ[Åqo,sA*ŽHØ2º‘AG9©(®~óþJÿ`«ÿýi]s÷ŸòPôoû_ÿèÛJè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Ä?òðŸý…dÿÒ+ª§ãmxø~Ú27S3­ÊÆ\[H–Ó˜¥aÐ…—Ë8<€zâ®xž+ß´è7¶Zt÷ÿaÔi¡ãWØm§#ÌuSóH½èÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@?—}x~ٮ麬|Kºìéð\«šgÒÅå~÷ÉiW ꑞ¤Uˆ ñMî£os#ßZ½*ÂïÔ¬‰6nÌrºü.Ña^-_aÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÍéRyZ„ô› K ;'o:É´Ë ,eû<ánøŠA¹¶g ¼¹`I Šzwöþ™á«7ûqñi¢^\yž}ÄÞs\¥Ïþ­tc€ ùFãžÃþSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’(›±’TÔ4ê¶:”ÐBúºDïa4ÓÂe»Sî‚QÀ;@ …8ÜËžúûG¸Ó“Hðæ«¦ØCv-Ë ·’è´²"…òåexº")¿a}âû½:ÎK«¯둘‰,Ø’H ª¢à–bH@$’š-|_w{ç‹ëŒÐJÐʦK5dq؃q‘CUeaA úµu.¿w9mVtIu%¿ßm;@‚y'iS EÛåÄ>|»1.€5‹{ûO]ßÁòGw­ˆ§ù¤0½°ÓT†Ø~AûäUóÎFÜã"µ!Ö¯­¤ÖbBìåRK™‹1âã©bI=É&¤ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@âBO¥ÿŸ¬µ½Õ¾–÷ÓM±ž{„IþÌJî`èLj°©„1ä¹+èšæ}µÀ»òÖâdµkØÞ9Úä'˜®7±,ÊÛ ÅE1©Ü-œ6cÀZ¨µ‡g•k ‘ì ¦ÕûFÒªF:`c¥Xÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@Žÿäžx—þÁW_ú)« ®/况¬øWWÒíü¬¬÷¶S[ÆÒOd3¡PN. ÆO¡®Ò€ (¢€ (¢€ çüÿ ;Ÿû ê_ú[5tÇè÷z¾‰mue'…u[Ÿø˜^L“A5¦ÇI.d‘HÝ:·ÝqÔ Ãš¥$És¨\G¥ž±¨]ÚZ‹FŽ]Ï5Ây ÈRV`/T9 Üý¤ͧ…­’ò-fáßB¿gYîejÝsÛŸ!cBc^¨Q¸ç´ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Uï¼_w§YÉuuár8S‘%›IUT\ÌI(’@“@zéÞ,ÒôíjúãKò5-cD¸óf°¹{™…ꇒ%ùPð%•îH!wêj’jše¥þœ–šÍÍ„z˜Kv7[Œ?g‰ö™¢Ž[†W†|… €6å‹îõ8î­|#®I äd³R$2²›€U A*Çü$:§ý šçýþ²ÿäŠó»û½sPÒîí5(dÕÒ²¢(±8/Æÿ”îR>^N寻¯ÛøÚÑäÑõ]¦SÄVí<ñìòj òVÜ+M±„¦Mà6bîDê?á!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€<ýõOÇÛ­ž¹}fÒ…¾™Ž¡lfr®VTŹš%ø¢˜¶Ö”¢ô_ëŸt‹]B æÔåþÉšø$2BêMÄFB@Ú˵ÉÚALdíâ¶?á!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€8ýWRÔìí¬ìnf×E‹W{Ago4ó—‚åÑ™W™TFßòÔì“*\’A­ mWSŸÇÂEñ½‡PŽÞXbYžÆ;cg®­&Ña+³+óìCµ+¡{âñc¨ÙÏê±ÞMºvy,wáŠîý£åRÞRó€XÆ¿y”‘ëWмÏõ”yŸ|¬²X‚í´.[ý#“µTdöv ’¹û?ù(zÏý‚¬?ômÝðêŸô&kŸ÷úËÿ’*=j^*ÕuK½"ïN‚[+Kx–êHY£{†b<©‰S©è¤¢Š(®~ÏþJ³ÿ`«ýw]r÷O©iž2¾¿ƒB¾Ômn´ûXUí%·^9. %•IW¦{Ðâ½Xµ:Õ´Û9æ]GuŬvÏ$·qµ”) ‘cþyÊòÀÁV“9(¢¶!VŸ/ÚÚ TOuªÆ_0Ïö9m>Åf/ƒ°tá€.Y ÄŽƒþSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’(Ïôï럇|/¦j_[ÞÚKk$3´.b´TÓå0ÉåýÐÑÏëÌÊ7a4}Þ¶nu)u{mWN·ŸPss>›e+»ÜÅmk4JØÛ³¤î© 墹Ã27aÿ ©ÿBf¹ÿ¬¿ù"©êWm¬Û­¾©ðóR¾\:Çuö T6È pFpHϹ LºÔAÓZÎKP¼¿}&êêßPÓî åÚþú;¸†#(.dó>hÏËŒîЛTÖo­|Eý˜úÌ·¦ßXŠR"bVŠVŽ×È|ló@vÅÙfc½n júÖÞ+{ë0ÁŽ8ä±UE.0b³çñªh¦[wð~³n ÔÂ3g¶%y9’B³áff,ØÎÙ¢9zÞ©­Û}º{H5ÇñKp±ÛÁo)³‰½(Ñ5VVùßÎuSònŒlxþúK ´Ô-o Œê$œ\ÊV?!“$ñ¬…wù¿4€ ü€‘´V‡ü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$PŸéßnÐ4¿ i7¿Ûi76šx¹Š?´¼ÂcmvÒÆ…3*a¡·%€ t›:ZÖä¿Óâ¸mUµhôý:kx£¶•QžYåYMÒ¢ì‹|h›·†ò¾sâ¹n²Mjúg…åð>²ï KQ¶•Êÿ¤pv³ ŽÄŽô jùná|¬‰ÝA%ŽæU$¨'í bmÇÖ€:Jçï?ä¡èßö ¿ÿѶ”ÂCªЙ®ßë/þHªö¯©j~2±¿ŸB¾Ó­mtû¨Yîå·;žI-Ê€"•ÏH›®;PQEPEPEPEPEPEP?ã¿ù'ž%ÿ°U×þŠjè+Ÿñßü“ÏÿØ*ëÿE5tÏøþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQEQEQEQE^þúßLÓ®oï$òímby¦}¤íE±ÀäàÒ¬Q@ö67·‘꺬~\É“ifX0´YˆÈiˆ$ E$y$Ô´Ùžáu-5£‹RbBDw1‚O•&8É%\P’@ º=?ù?ì_ÿÓwÿsÿè¯úçþªIç›]¸–ÆÆY!ÓâsÝäLU¤`pÐÂÃAÈyÝåWçÜÑhiz”:µ‚ݲ .ñ¼r9Ê:2¬¬¹ƒŒ‚F \¨à‚­íâŽ"@‘Ç…TP0€ã%QEQEQEQEQEÏËÿﵩÿ Xä”uÝ,¨Àÿ jñÉÐåÚ21t5ËFÓC½ŸH²ûn¤±7Ù %@y ¸³(Ú äŽp+JÔ/´.ÞÂøÒÁ’YìKÊÝYÜ‹¹Ù‰f=É'½\‹þ$>#[Qÿ̲Iè º‘@þ$“ Ã¬„’dtÅÍ®Ë⯠+Â~ 6z…ºËÄRÙ# `9StùWSµ”‘@=EtšÆ£w¡ÙO«Ù}‹Rh—í0¤$ƒ†ÚU˜m'$rNÏ9¡EPQÏ<6¶òÜ\K0D…ä’F ¨ d’OÎjJæüV5 ŸOµ‡H»ÔtÇw{øí¤„.&H™FfÜpND{J¹ MÒ—[²Ô¯õ{ik–ë ZK¹M„,/Œù’Vnêd+–¦®h×E6™¨Éæjz~È®%Ú\‚ ¬ê£WçŒ`:È ¶ÌœûÝÚOi þ×K¹L02Ìïp!\qò£}=qUç»Õî5Í:úÓº­¤ÂT†îI¦´ -±È!öÎÇä-æ.Ÿ•”`HÆ€; (¢€ (¢€ (¢€ (¢€ (¢€2õ]Jh.-ôÛµ+´wˆÊ—hT<¯‚ .€ ±`2£s­7M‡L·hãi%’G2Oq)Iä î@8ª€©i°êvë$RFâH." I€ g‚ ‚URAÏ_[šß]híï MÙX¥Òn å‰,ʦ1–Ve_˜23€F?â––‡:Ò¤ ëe#°DEáfeP1’ýÙý×AXö67·‘꺬~\É“ifX0´YˆÈiˆ$ E$y6(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñßü“ÏÿØ*ëÿE5tÏøïþIç‰ìuÿ¢šº çü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ +/ZÖ†Œ,•l.ï§½¸û<0Z˜ÃòÞBI‘Õ@ wôªðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: çü ÿ$óÃ_ö µÿÑKGü$:§ý šçýþ²ÿäŠËðÖ¡­hÞÒ4»ë-=•”6ò4sÙ,ˆ‘›€q‘è(´¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹tñ}ÜšŒÖ ápÝCsHžeŸÊŽ\)ÏÚ1Éÿ/qV?á!Õ?èL×?ïõ—ÿ$PAEsÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@ÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEÿ’yá¯ûZÿ襮‚²ü5¦Í£xWHÒî6žÊÊy2J–D HÈ‚µ(¢Š(¢Š(Ÿñü‡<'ÿaY?ôŠêº çüOïÚtÛ-:{ÿ°ê 4ÐÀñ«ì6ÓÇ‘æ:©ù¤^ôÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè(®^ÏÅ÷z„ 5¯„uÉ#Yd„Ÿ2ÌaãvÇ7™X{ãŽ*Çü$:§ý šçýþ²ÿäŠè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚¹ÿÿÈsÂö“ÿH®¨ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Yz®¡­_j:Ä^ÖBX^µÄ¡§²ÉSo4X_ôŽ»¤SÎ8è@;J+Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$U{ÿÝéšuÍýç„uÈímby¦2ÌíE±À¸ÉÀ¥uQEQEQEQEQEsþ;ÿ’yâ_û]覮‚¹ÿÿÉ<ñ/ý‚®¿ôSWA@ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPErö/»Ôôëkû?ë’ZÝD“Bþe˜ÜŒSƒq‘GZ±ÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’(ñü‡<'ÿaY?ôŠêº âõ]CZ¾Ôt;ˆ¼¬„°½k‰COe’¦Þh°¿éwH§œpÐêÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè(®þSþ„ÍsþÿYòEG/ŠîmL {á}fÒ n!·óä’Ñ•Y5$$ìØÜã 4ÒQEgëZ²hša½’Ú{ŸÞÅ CÝîòH±¨™Wï8êEhQ\ÿü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$PAEsÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@ÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEòPõŸûXèÛºè+‹ƒPÖ¢ñV¡ª7ƒõŸ"âÊÚÝOe¸4o;1?éÆ%\sØôï©ÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉ%‡ˆ¤ºÖcÒîôMKNž[y."k¦•Ö6X*W æTêzÜ¢Š(¢ŠÇÕµã¦j6–iWÚÕÔRÌ©haR3bL² ë*ôÏzØ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠ<ÿ ;Ÿû ê_ú[5tÅ膵¥iÒÛÏàýeïnîIìˆÛ-Ä’¨æàsµÀ>ùëÖµ?á!Õ?èL×?ïõ—ÿ$PAEsÿðêŸô&kŸ÷úËÿ’(ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@ÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEtW?ÿ ©ÿBf¹ÿ¬¿ù"®hºÐÖEêµ…ÝŒöWgš £`ÞZH1»)d^þ´©EÏËây¿´ï쬼;ªßý†U†i {eMæ4“Ì™Xü²/jè(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚¹ÿÿÉ<ñ/ý‚®¿ôSQÿ ©ÿBf¹ÿ¬¿ù"²üK¨kZÏ…u}.ßÁúÊÏ{e5¼m$öAC:âàœdúí(®þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’( ¢¹ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH ‚Šçÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"€: +Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘ZšN¥³£Xê–ë"Á{oÄk ‚º†à‘œS@(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( ÀŸòO<5ÿ`«_ýµÐWà¿xV×À¾·¸ñ. ñi–É$r_ĬŒ"PA²Þ]Isqâ= æ“ìûÛûR1Ÿ"S,\þb}óƒ‘ÅeéÚö¯¬kíµÝ¦—{<'ì6kɱs*#*ì@D{‹Ç&X;´.|msc£h÷ÆÒÒù.4y5kÉ¡™âQK s 2Äù¹Ur0Hí^[߆òÉâm6ÝËÈìöšù·g/#HÛš9T°ß#Bïlc&¤}Ká´št6 ¯èfÖ>M24þÕO–ÙÂLïÏ"4ç¯y4&¥ã‰ Òoç·±g‚ËW¸ŒÉ!eÝe0ˆ‡'wQŒcžµbØk¸’][ıêÖ‹¦I<±\G¼âXŠîx±±D>óòŸ>Ö}½çÃKkÛ›µñ#ܤé,së"XŠÎáå'¢‡` ÑïÃtI•üM¦Üg™w¯›‡Œn û·’RÑÊ” åõU åŽ?´ì#û½ÝüšÓÐAæZ4‚pHœ&JˆÁòó¼mÆ>j,ukß^N,5)ô{x¢-ÁÛL¬ `Þ`tXÔæ26îób•r6ØsÅðíå·hÎÎÃÄUÝÔš®²/c‘Û“…'øPq\ÿŒ¿ämÿa]7ÿKa®‚¹¿Ï ¯†ã¸¸–8`‹SÓÞI$`ªŠ/!$’xs@%ÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@m¬jòxÏSµµ½Ô¥{mNÞìEˆ6Ÿgh yYçò¸p²JàAÈAƒ¬j^6¾þÄñGiœðÙj“ióÇ7œI³s3« w*ðFrF9Ô·ñoí'»šèi%Ü¢iÏö”G{„XÁå¸ùQGž¹¬ùu/†ÓÁ,2kúG,Wp¸þÕA”¹q$ãïÿ}»`Pi¯jO™«ÜjÒ[‹ëÕ†°f·Ž&còî\#²\ûOΈ$pB±65ŸÍ¢Ük]*9-,X"‘nŽùfK/µá“f ]Á˜ä—"¼×¿ ç½Oâm4p·^Jkå óUÄü•”Gãyùyl“’I©/õ/†Úš\¥æ¿¡È·R¼ÓíT­Í³ŒÄJñõëÍXÖ5½FûPMM¸þÍëi§Év¨²¿–,þÖņÕc÷2Á€äàœ>·{á&éu]cJÔ&M@ÛÁsywDhĪ· €D;C´ÅiÇ{ðÞ+)­WÄÚiÜ}©¦m|´â]‚=ë1—ÌS±BpÃåÈèH!½ønmÒ!âm5Ÿí1ëå.°îœJ$`B Ã1DÀ¸Ð8†d´»·±éïeku4²{xnY–6Ú.Æi e£p-Èìµ=ZÚѵ¹õYîá}nM<ØËKFošÙ 2 pÊ6³0 0À,rí¡øom©A:ø³M6–¶ö°ÚÚn±˜%’T-ûïÞλUÁ ³ŽÅ›áŠê1Þ·ˆt©$ŠíïcŽmtÉ s±f2,M)Œ6]ˆ!x'#€,x^o\Úøs[¾ñ$C«De¸Óæ·Ž$_2#,klTo,€`‡fÜ¡›‚+¸®ÇSøu§^Gsoâ](4Yò"“[ó!ƒ ÝDÒ JŠ0¤¨À$VÇü'~ÿ¡¯CÿÁŒ?üUtÏÞÉCÑ¿ìÿ£m(ÿ„ïÁÿô5èø1‡ÿЬû}wGÖþ!éÙ:­ÿ“¥_yŸd¸Ivf[Lgi8Î_C@…Q@s÷ŸòPôoû_ÿèÛJè+“×µm7FñÖ‰qªj–06™|‹%ÔË–ómbp DZ ²Šçÿá;ðý zþ aÿâ¨ÿ„ïÁÿô5èø1‡ÿŠ Oþ+Õãð©×®'ÔµX"ПP¼ûu˜µT¸TGXáaFvXy€lNF~k+ñ†¯g \=¸ŽÃR³¸º·¹0ž=˧Mr…Ð3ä“•©ŽN§ü$ÿáþÀÿ„CþÌû'ؼíHÿÔìÙ·výßwŒç>õ^ÿRøm©¥Ê^kú‹u+Í0þÕA¹ÚÜÛ1áøÌD¯^¼ÐpxÞdÔ¬á¾Yx-îmµ H +æ_,¶‘Æ"/ƒ±ÍÀ(Å‚••Kƒ‹:þ¹¨Z\Åwa%ަ-5²h®&޳¬¦Xƒ.ntØÎPœ sµkêºÃÍNöãRoxûRK/±%ËêJB 1Õ•yY`ÊU 8#/I_ÛØO­ã*öi5·Ç<Ì!ÒŸíÑ\C2>ºY6\6ù‚¡—jn` ÚÍðÆ)nf>!Ò§¸¸‰a{‹­tÏ2¢¶õ $’–†HÃz€@I¢Á©Ùjšþ¹©Hf·óR4º„6åa UJ™VÚwƒ Öåqúgˆ|¤y¦×Å:SI.Ís­ ‰ áwÉ#6Ñ–!s€Yˆ':ðø?þ†½ÿ0ÿñTÐW?áïùx³þ±ÿé­ðø?þ†½ÿ0ÿñU_Âözž¡â›Ë ¸.ídÕSdÐH$FŰ8aÁÁ~ÔW?áïùx³þ±ÿé­tÅéþ%ÐtoxªßTÖôÛÛSÖ;«¤‰ŠýŽØd ã Œûí+Ÿñ¦¡q¦xiîmng¶ÝÚDf·„K"¤—£ìB­¹¶³`m<ôÑÿ ߃ÿèkÐÿðcÿUï|[à}B†ëÄú‘¬±Ìö”C¬ˆxn̪}ñÏNÛ_Ö­m-¢ŽÚMEïu3ia6©›$ˆ[´ÌòªÃ•!ã•ò× )ç;›Uñ¾®ú¶•u¢,’X][ØÞ›'€4²C$7ÒÊŠ“)Xh ê£8-ž’ãž»žÒiüO¡¼–’™ ?ÚQ ŽQ£'†çåvúúâ³íµ/†ÖsØÍ¿¡¤–E ±þÕC±"IcAËó…žQÎs»œ0&™ã6¿¼ÔÂ95O6áf°…6Ãþˆ-mevËÎéÆrZEª†dÏÔüS«Ë£ZøZïKÓdÑâ¿‚H`0†VvŠçlo(‰TGó¢ Á|°;@¯¨›y¿±y¶‘”d²º*¹'2:®Â'BÿÆI§Ás©KeÞWµkÏ=QÌêæ26>Ì^öa†ä¨÷•ÏÍÿ êûUÕ/µ/éW_n•œCý³²8Õ­Vنŗibþ|ñر{7ÃBye¹ñ”ë/šZ®•„QÒF B+2Èù`%Øç$š’çâµÇ…ngPÓl®Úôii{âMk®‹!•%`ªá#båX.挠ä‚K-wSñRx^+-^;yesu5„QÊZX(ž(šMèÌ•Žì6B §&M?Søu¦N'·ñ.”ó Z2ç[ûCyŒ‹|É#|Û(=B–›%Χðêçq>%Ò¡c+;×[û;«>7…häRªÅC2‚˜n ·4Òxy¯Ž‰ jwöš…äO$2ÝZ®Ô”£²d¯E|(Ü£€Û€àV¥rö>-ð>g­¯‰ô8áL¥I%™˜±,Ä’KI$’I5cþ¿ÿÐסÿàÆþ*€: çü ÿ$óÃ_ö µÿÑKGü'~ÿ¡¯CÿÁŒ?üUÿ’yá¯ûZÿ襠‚Š( ÇòOâµ< ÿ$óÃ_ö µÿÑK^wq¤x¿O𗃵8£ŽêóK²ÛœsC=¾m~÷o4—Ú®ÅS+ÆX¡yu¦\Xùlñî«oçʰCç-‚y’7ÝEÍ¿,pp&¬Â=ªÐç®ß›/þG®ÖÓ]Ö!Ó§ŽÒúì5¹Žž—w¦8Óì ÊÒ¼‹¯Ÿ‚ν£©Á4‹¿kUüSÙë–qË.”̲Mt&Ü÷Xº"FŽ"Ÿ» ¹bZ •À&€;øGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG¬?A{oâ­7VÓâÔžx´Ë´Ýj²Èf?4Ä'Ø$ZEŒí\lx>ie‡T@5!aîËíæYL^LLÜÌ<ÆkK‚ÙôŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäzÇñ&i§ÙÏ7‰µ[Ø×UÓ³ñÚ„|ÞB9) ·x#§§ÜW?ã/ùÛØWMÿÒØh ®oÇ1´ÞŽ$šHõ==VX–Bo!ù†àFG^A ×I\ÿŒ¿ämÿa]7ÿKa  ÷ÚeÆ™g%åÿu[KXñ¾iÖÂ4\XÛàd?M´mfÝ®4¿ˆz•ô åK_°J¡° [r3‚=Å\ñµå߇Ò+Í×ö…‹¡1Bm»‰‹2‚ U±äp#­pzÕ§‰to_\Ëm&¥¤–ßm¸Ób¸²*Ì#P`I¥Âìbì±2@¿*´þ̸þÑþÎÿ„÷Uûw•çý›m‡™åçný¿gÎÜñž™«ðjŸô9ëŸ÷æËÿ‘냚?۠׾ũM{u£é)©'™q¶æ˜N#XÑö:·”X"nEi íwÉè<.u›ë¿O¨Ç©CVú™häyÕF.#Kq&ð­!òKm2®æåˆÝ“@ŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü\œ>›âyn"ñÒ¯50÷d·’;fÖ#FL‘õXÄC!Cˆø®ãÃS_\øWHŸT BK(^èIÆ”ò¸NìñЧÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þG¬û}:êÃâ—öfûRߥ_mûZ@¾^%´Î<¨Ó®{ç Æ9Ïa\ýçü”=þÁWÿú6Ò€: (¢€ äõë)ï¼u¢Eo©Ýéî4Ëæ2Ú¬LÄy¶Ÿ)óÆ9ÏLð9ëž²¹ûÏù(z7ý‚¯ÿôm¥eêOk£\-¾©ñ6îÆv@ëÔºtLW$d€dŸcZŸðjŸô9ëŸ÷æËÿ‘ë/Xѵ­OÅZÔVV–v—z=µ´’ÝéÆéd;î².©• Ë‘Ž¼½­ß‰l.<7a“©Ak¾–¶¸{†ò!b‰p“ªÁå< +†22…RŒŠ­» ¥®™q}çýǺ­Ç‘+A7’¶åÈ¿yü0ÈÈ<бÿö©ÿCž¹ÿ~l¿ù¼ßPOxoJšÛLÓõYayu+‹FIïD¹[©m XäÞ¬†6EvXÜù¬û‹‘¦YO>«âŸ¶=ð†{´† Ï*(„ZÓÙó´¹dÁÝžr£ü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×áÙuM?Dðõ™·ñWp&œ–±‹k¯%"gD»n\oŸ‰>DÊ1àä×®P?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü]ÏÿÂ=ªÐç®ß›/þGªþ·–ÓPñL^Ï{"ê©™çóglyª¼tàž¼×Q\ÿ‡¿ä9âÏû Çÿ¤V´ÐW§éW—Þ$ñT¶þ Ô´ôœjbµŽÝ”Ÿ±Û|Ç̉ÎyÇ\p8ëžÒ¹ÿÈsÅŸöÿH­h.µ¹Õ—ÄÛ¹uì†Ñ%ÓšPËÃ`ƒ99ã´'Ño­m常ñƳ !y$’;TP2I&ßÎk—mZžÆÖK£Ø[x¡îã±M<‹œAöÉæ³0ù„¬jJ7Å«åüQ­Xx—NÔ´íIe“G¿L—f)îctXD!¢DT#~Ԙȇ÷›ŽIô4[ë«x®-üq¬Í¨9#ŽÅ•ÔŒ‚·Ásš“þíSþ‡=sþüÙò=rú}߈­þ![éÓYß Xnä·7"k©`{1nïßËÝ»Ë !‘¥2Ø@^iw|$Ðý5™nâ}6æíV[—ºÝçDÓÚ|ÂTÞv•UpÒÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=cøj÷S›ÄÑÇtš¨™­.µMÄ-¯ÚX–?³—eLÛvrË´É–®â€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôRÐAEP?ã¿ù'ž%ÿ°U×þŠjè+Ÿñßü“ÏÿØ*ëÿE5tÏøþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEsþÿ’yá¯ûZÿ襬ý'Æï6m­ØA§ÚÝiO«Äð\µÆØF_ÌZÀJ˜ »8n˜Ðð'ü“Ï Ø*×ÿE-S³ð›§øëÖQÚ[Ow¦}†æúEF™¼¢žk€rÇ,[÷<óš“TñΧØYÞÇ÷Ïvö ¢$I*§• æ>ÄUC´·š¤d› âË/´O®i_Ùö1ÚKx'Žc?—{K,ÁP“ T2µð~PZž«àxu{‹‡žúDIµ?íåFÄßbû2ìbN×VU|p@ãŒÕ;¯^jwš¥åýþ”·WúUΚóXéFo4FÈÆf2l€O4Ò[x‡L»Þ\ò+ÜÜTŠX$ŽA(¥(èÊÅ,7‘‚>ðÎ=Ï‹¯¯.#‹Ã4z²2=HË5çÙU’RÞJ&Q‰wØçæ O5%÷…¯$Ô$Ô,58 º:¨Ô“Ï´2¢ÿ¡‹R„ ž2ÙÈôÁëQØxSRÑmìWHÕ­xtËm:w»±i–E€6ÆUYP¡&GÎK1ƒ Ki×ÓÛ[f{{¹âI>Ïq #FÌ‚O%ÛDÁãíÁ~lmæ«Ëã,Ù´Ö^}üÞlqEkn›e¸.NÖˆHT6ÞÚÓK‚ÒÊÎ'%­â€*í!Ž)Nâœã9útÍcÃQk- ·†i­äŠ@èe`@T4¡›*Œ ‡ …Éâ®Mâ ;k©/1 Æâ§ÊrP!Ä"ã1ªœ(CÃ5ÍÝx&úÇB··Ónãžî}ÍHp Z\ïiHÞ26±;åÀ$ž#»ðnº×PGo¨Ø†¸´Ô’úî]¤µ,Œ°¬ªûÔ8,æ†Øa¢F%±Š“Dð?öDIö‹ü­Uµ/&ÂÃìÐŒÚmŠ›Ûo]äääçŽs@â=!Hú7-Z0]Yn$1ÂCA ÀŒŽN5е{›Ó,’]jm§”º 8Úæ&›É (J “¿pP[n*œ^¼·]2u˜­­¦™mp¯dKËö)LªÊÂ@q8 †Åh ꈳYZëßcÓ$»{±ä[bíå30—(WÌ$`Är‡iÏÞ  |S£Ogsuæa·ÚXùN ‡8£\fEsÂ2xRÆ©Ýx–æ{Ý6×A³´¾7¶÷ØF!xÑ”°}Òà©©RÑ,r‘¬ËåãÊQÔî%˜å˜’Iã-Fúéí¼; }¾k{F¸º[»Å¶òÜK$BB¾é7Ã0Ï6¼‚ jj^$];ÃÚãØ]ªLö¡­¤„ñ‰¤0QCë¿îI#­eéžÕ45YtÍv¾š-—Óߨy¢góe˜º,rGååî%ã-ÆÑÆ mKk&ÓLmFI µ{'IgS$ò5¼Ë#p \"Œà`î<çI¼S£Agmu%æ!¸ÜTùNJ8‘¤\f5Có…xb¦¬méßÛÙ_hÿKé·clÝ·—¿|ÍŸ>ÌîÛóco5ÉêÕÚî }:öÒ8$·Õ–âæêÈ\*ý®â9B‹€N7 Êv¯ÌX±ð®¤¾$»šK¨âÒ"Ô⻂'F’âm–qBÏ2nQ¹H ®æ Á‰W €v•ÏÞÉCÑ¿ìÿ£m+ ®~óþJÿ`«ÿýi@Q@s÷ŸòPôoû_ÿèÛJè+Ÿ¼ÿ’‡£Ø*ÿÿFÚP}sÅ7šF£¨¤ZdØéš|z…ìÍvRA²#O,‡`!c‚Ê du­HüC¦K­Í£¬ò ÈŸË`ÐH¨_`“bÈWc>Æ ´q“ŒŠóx[M»ñSë×¶¶—s­¼[yÖÊínÑ<¯½ä‚Lƒ¦1°r{GÿÇüO?´¾Ùÿ1_í//Êÿ§/²ìÎàyǶ;Ð=Çêú¦›a-Œ–ϨhöúœR&éwŸ#8p¨Ì1÷‚¹ÀÛÍÆÚF­Žq†§o±Ú\«<>qMÀ`•NOLB@Þ™Ïáô+¥Ål÷‘Éqm¦XÚYܵ°&Þâ×Í1Ü(-×t™ÛÓ‚Hb+Ãþ×<9¨øg@‚9.táç7Q–g·˜1Ü',G™1|¡˜íÜÀ&ƒâÿí‹8µ)­`·Ò.mòÞù.¼ÄŽ4+¹n UX¤¾èg$œüœÜoižM­À¹Ž(%¸x&7k%»ÀV˜îGL©Ú›¾}ƒiÝ“• ÉêßõK«]OP¹½±¿ÕßD»±G³±û—’É¢´ïæ•|lÀ²1 ÿ^jÍÕþ³¿‹U‡TG·²1úŠD¦3!ÏÌC3nÜÊdB ‡Åú[¤Ò]Éged’ÞT’ iP®è‘C!.áTBH ¤Ó¸ñMå­ö³$šdØÚ<¢;»¡v|å_&9YÄ^^ ¨gçÝ…lp§^øu¬ø…î§»ñDqÜ]Û½¤ßgµžŒ%@EòÒàn(ÆfË—Î`FSVð†©¨¶¹k»®™­J¯uØoœ'•2"HdÚ7$xÉŒãqô&£â­^ ýU4Ï I¨Ùé/]:]žFdYAÓæÐá™7µrkCXñ=¦‡¬ØÙ^¤‰Õ¼óµÊ£²Ãå´C/µHDĤ—bvòyª÷¾ÔžëSþÏÖ#³´Õ\=ßú35Â7”‘ ¢E‘©£a²yPk¾›^IÄ÷ñÆòé—úp)np«pÑíl䢯þñ$ü½(SûoNþØþÊûGú_M»fí»ü½øÛælùögvß›y£LÖôígÍûÇ›å`œ£&ålí‘w¾6ÁÚë•lƒ\ü>Õ'ñeýíÅÌécUŽú(Dšb¶‘Å‘(“÷k¸WnX+J9ð/†õMN°›Y¹®¢Ò­¬VÞ<¿$F "F0• à.hÛ …sþÿç‹?ì+þ‘Z×A\ÿ‡¿ä9âÏû Çÿ¤V´ÐW?áïùx³þ±ÿé­tÏø{þCž,ÿ°¬úEk@ôïÞ]j0%Ι67Z…ÖŸk4WfIHLÙ.†5 ¤A!Èf9*1É"Eñ®™w¤Ç¨i¦K”{‹H‚K–ìRâd% ê O˜Àa¶4/ iº×WqZÚ6¡sqq,·«l©+¬³4»º¹Uäó´ƒ.×À¿f±´¶þÑÝö{M*Ûw‘ßb˜Ë»¸ßœcøzüÝ(K_Cug}*ØÈ“Ùë ¦<2Hõk¡n³©ÆJ»·Þ×?.jKßèPé—×v—°\µŸ$ æ8ÓϓˉÝÈÂÆO͸gäÀÁ—v?ˆ>YëúWØÚûìÓKw;]]En “ZËt×&ß$ñ‡(Có‚§Œ3&eã íKY¾¼1éWs[ÙCmq%”eHŠYÔÄ—2ä“nw©ù¸®HAˆM­”ÒkVrY\Eqö*Ýd¹±@àÁµÊ6“œ'$쥨›ÅZd­s±x'„Ú¬“É8”Ë·b"ãlLÃac€Ä… “ËÁà=KF¸³›HŸMŽâMcí’ù-¥´bÊH~[o;©b2U%Á9 W,üy¥jÖz¶›¬À—öúTzY7FHYD#°E‘veŠíPv¢©PÛ´¤ƒÄzEÕüVV÷ÑÍ$¨7Œ‰ò›Â‰Ø\§Ï³;¶|ØÛÍe§ìÏü$²=¬ÿgÐâkƒ*~ÑùŠûA †A:`à!¸ÇÓþjz~µo¨¯‰<æ‚Y.–9 ™ÜIÇ#ù~xU¥’IHTo* ¸Ÿ tË{(¬í¯µ/#û2m*o´]É9h$ES°;‰ÁUvà·î•ÔѵvçQK=kßÙÞm ¹Žh.ÅÌjÀ€ÑHÛWlƒr‘ÊÃvå5%—‰í.|E¨è²¤\ZÜ"fGÙ>`Žl+í ¿ß bØBØÇBÛM×¾Ñ%Õî³i,éo$VÉodñ@Êò¡™Œ„Ã.8ÏÍ‘ü#ñ<þÒûgüÅ´¼¿+þœ¾Ë³9ÿçØï@èonóGw$]UR;y^I·U¢@»¥F ä:RÈ$+±ðÝ[Åqo,sA*ŽHØ2º‘AG9¯3Ó<â›k ]=åŠ_éñ[Û”ûÙkZÎæ…˜yíºEPArÅ@ ùô LþÆÐì´ã7œÖñ*4vnåW$"ç8Aò¨ÂŒhW?àOù'žÿ°U¯þŠZè+Ÿð'ü“Ï Ø*×ÿE-tQEsþ;ÿ’yâ_û]覮‚¹ÿÿÉ<ñ/ý‚®¿ôSWA@ÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEP/aá ½3N¶°³ñv¹­¬I )åÙ¨ 6ù8u«ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (‹ÕtýjÇQÐíâñ†²Rþõ­å-–B‹y¥Êÿ£õÝŽsÁ?Q©ÿö©ÿCž¹ÿ~l¿ùÿÈsÂö“ÿH®«  þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#ÔrøRæèÀ·¾(ÖnàŠâ"Hí]¢‘dPJ@­È:]%V~µ¤¦·¦).g¶ýìS$ÐmÞ‹"‘¹Y~ò Ö…ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEqpiúÔ¾*Ô4¶ñ†³ä[Ù[\#,·‘çVýÄKŽ;ž½µ?áÕ?ès×?ïÍ—ÿ#Ñgÿ%Yÿ°U‡þ»®‚€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üRXxvK]f=Rï[ԵⷒÞ%ºXQdhÙˆò¢BNbN¤÷­Ê(¢Š(¬}[A:ž£i«}§]ZÅ,*ö‚¹$1–Kޱ/Lw­Š(Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚Šâô ?ZÕtén'ñ†²®—·và$@mŠâH”ónyÚ€Ÿ|ôéZŸðjŸô9ëŸ÷æËÿ‘èðoü€îì+©élÕÐP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AEsÿðjŸô9ëŸ÷æËÿ‘êæ‹¢^³_ÝßO{qö‰§º†-å¤`*€5íëZ”P\ü¾›ûNþöËÄZ­‡Û¥Y¦†¶dÞ#Hò<ÈY‡Ë÷®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚ŠçÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ji:l:6c¥Û´•¼vñ´„*Š€p=\¢€ (¢€9ÿÿÉ<ñ/ý‚®¿ôSWA\ÿŽÿäžx—þÁW_ú)«  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(—°ñ}Þ§§[_ÙøG\’Öê$šó,Æä` œŒŒ‚:ÕøHuOú5ÏûýeÿÉxþI熿ìkÿ¢–º çÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"³üYª\Zx‡H²]OU±µžÒêY™`.¤wG€.WÉ”…Gç’9éD~,Õ-.¬­5]*Ziï¨nU\§L;®¡­_j:Ä^ÖBX^µÄ¡§²ÉSo4X_ôŽ»¤SÎ8èu?á!Õ?èL×?ïõ—ÿ$V^¥ã‰ Òoç·±g‚ËW¸ŒÉ!eÝe0ˆ‡'wQŒcžµbØk¸’][ıêÖ‹¦I<±\G¼âXŠîx±±D>óòŸ>ÐÏøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH¬ûiØGö {»ù5§ ‚ÿÌ´ià‘8L•‚3åçxÛŒ|Õ—âˆöÖ‡H–×P´±M‰} û¢Ê 2yOÂre_ß1Y•í¶;À 'ü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$V>¡7ˆ¯o¼KucâH4ÈtycŠÞ íãû3í†9äk‡`_k vå m žMwÏÿÂCªЙ®ßë/þH¨åñ]Í©¯|/¬ÚA-Ä6þ|’Z2£K"Ƥ„›œtºJçüeÿ ;oû é¿ú[ tŸ­jÉ¢i†öKiî{) w»É"Æ ne_¼ã©¡\ÿŒ¿ämÿa]7ÿKa þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’+ ¢€9ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH¬6Ö5y\€ CZ‹ÅZ†¨ÞÖ|‹‹+ktQ=–àѼìÄÿ¤c•qÏcÓ¾§ü$:§ý šçýþ²ÿäŠÏÖ5½FûPMM¸þÍëi§Év¨²¿–,þÖņÕc÷2Á€äàœ>·{á&éu]cJÔ&M@ÛÁsywDhĪ· €D;C´Å@4?á!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"©C2Z]ÛØÈt÷²µ¿ºšY=¼7,Ëm‚c4„²„Q¸ä }^mwF4~(Ô®—¡ èx-peu¹m°‚B˜P€1Îsq@'ü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$V?†õ}F_I§ÿhê·Úcéæ}ú¾œ¶r,Ë \EòDÒ.Öù¾Bìù¾|Wq@ÿü$:§ý šçýþ²ÿ䊒ÃÄR]k1éwz&¥§O-¼—5Ó@ÊëF¬•+s*u½nW?yÿ%Fÿ°Uÿþ´ ‚Š( ±õmx隥„Uö£uu³*ZFԌƓ,ˆ:ʽ3Þ¶+Ÿ¼ÿ’‡£Ø*ÿÿFÚPÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÐQ@ÿü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$W'áßêñøTë×êZ¬hO¨^}ºÌZª\*#¬p°‰£;,<À6'#?5øÃW³Ð.ÜGa©YÜ][܈˜OåÓ¦¹BŒè òIÊŽTŽG$¤ÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Gü$:§ý šçýþ²ÿäŠÃƒÆó&¥g òȳÁosm¨ZE_2ùe´Ž1|ŽnF,¬ªXŒX¹×õÍBÒæ(të» ,u1i¨=“Eq4pýe2ÄpÃs ÆÆr„áªh†µ¥iÒÛÏàýeïnîIìˆÛ-Ä’¨æàsµÀ>ùëÖµ?á!Õ?èL×?ïõ—ÿ$V=´ÈRѶîãûcÎ# Â+iYLe}¤¬‘~ìª)bØ*»scIñ|ºµ³dZÿjÈ’Ï,§íH£ìâæh£1°P®Ïå6Åàa~yÃ8‡ü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$V^•ãK/^É¥ézŒpyöísmucsÓ¤hèË#‹o]ªÁ‰]Û„l6Ö;jzÅ®—a-ωu—ZíÕŒ’[ØÁ4©?k Ü’XÃcµº6ŒÐYÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉ_Àú–£©iÚˆÔfž³jÁo-ÕºÛÜ<8VS,Cæ8Ê¡dØÛFêê(Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘W4]hk"õZÂîÆ{+³ÍÑŒ°o-$Ý”‚²/ZÔ®Ãßòñgý…cÿÒ+Zè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( ÀŸòO<5ÿ`«_ýµÐWà¿øVëÀ¾¸¸ðÖ4òé–Ï$’XDÌìbRI%rI<æ·?áðý šþ ¡ÿâhaìmäÔa¿hóu RCî?*9BÃ91§åîj½Ö‰§^]Isqo¾i>Ͻ·°Ï‘)–.þb}óƒ‘Ågÿ àÿú4?üCÿÄÑÿ'ƒÿèTÐÿð]ÿ@KáS¹#»·rò;=¥ôöìåäisFêXo‘È!w¶1“R?…´i4èlÏ6°éòi‘§šÿ-³„ ™Îy§=xëɪÿð‚x?þ…MÿÐÿñ4 àÿú4?üCÿÄЖþÐí¯nnÖÒIå'IcžâYb+;‡”Š(vÍøGGD™^;»ƒ"ló.笠xÆàß»y´gr£e9D=UHþOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøš§?Ãý)å·h.5(BÞ‹Ë‚u+—’fIĆ]Èpë’§NF1±eáÍ#O²’Î ͼ–ñÚ¼s(hQ6,gy? \ü½2Ìz³OþOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøš’oè÷XîØT–?·Nà*…ýòoÛ1*“ bÀr+r¹ÿøA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâh ®Æ_ò¶ÿ°®›ÿ¥°Ñÿ'ƒÿèTÐÿð]ÿXþ$ðŸ†ôÍ>ÎòÃÃúU¥Ôz®²h,£×7ƒ†# ‘øÐq\ÿŒ¿ämÿa]7ÿKa®‚¹¿Á ׆㷸Š9 —SÓÒHäPÊêo!x Ž1@%Ïÿ àÿú4?üCÿÄÑÿ'ƒÿèTÐÿð]ÿ@ö6ö“ÝÍ{$»”M9ÜN÷±ƒÏO•qéëšÏ—ÂÚ4ðK –{£–+¸\y®2—.$œuþ&ûvÀªÿð‚x?þ…MÿÐÿñ4 àÿú4?üCÿÄГxGGžô]½yªÿð‚x?þ…MÿÐÿñ4 àÿú4?üCÿÄБøGGŠÊkUŽì‰n>ÔÓ5ôí8—`zÌ_ÌS±BpÃåÈèH!ðŽŽmÒ!Ú:;?Úc¾.°îœ8‘ ƒ Äaâ?øA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâh·ÃíÛR‚u7fÒÖÞÖ¶O¶3²J…¿yûÀ×j¸!vqÁÀܼÑ4ëÿí´ÛùŸÚ‚ÊëçaæB7áx<­~FÍ׌ÿøA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâhaìmäÔa¿hóu RCî?*9BÃ91§åîjÅsÿð‚x?þ…MÿÐÿñ4 àÿú4?üCÿÄÐA\ýçü”=þÁWÿú6ÒøA<ÿB¦‡ÿ‚èøšÏ·Ð´}â—ý“¥XØyÚU÷™öKt‹~%´Ævœdõõ4ØQEW?yÿ%Fÿ°Uÿþ´®‚¹={IÓuŸh–ú¦Ÿi}é—αÝB²¨o6ÐdgŒûšë(®þOÿЩ¡ÿàºþ&øA<ÿB¦‡ÿ‚èøšÐþÄÓ¿áþÀû?üK>Éö/#{©Ù³nìîû¼g9÷ª÷þѵ4¹KË?1n¥y¦kÎÖæÙŒÄJñõëÍWÿ„Áÿô*hø.‡ÿ‰£þOÿЩ¡ÿàºþ&€$Õ|+¦jw·“[Gý©%—Ø’åÚBùˆv«¯+ J° a‡eé>†ÞÂx5kéïf“Pû|sÁqsÄþBÃĆgü¡º¹ûØÆ­øA<ÿB¦‡ÿ‚èøš?áðý šþ ¡ÿâhßÃíðÙÀæìiöö÷p½²ÞNsq";—”H*ÙV$þ®^ø+A¿‚Xfµ#›Í/&‡Î;Èë&Ç×t’­7¶Ñÿ'ƒÿèTÐÿð]ÿGü žÿ¡SCÿÁt?üMX°ð¾“¦jÒêv°Î·RyÙ/w,ˆ¾l‚I6£1TÜà´•b=N‹ìÛ-ñök¹obùÛåš_3{uç>tœîÀÆü žÿ¡SCÿÁt?üMð‚x?þ…MÿÐÿñ4±ocoi=ÜÐG²K¹DÓÄïp‹<ôùQGž¹«Ïÿ àÿú4?üCÿÄÑÿ'ƒÿèTÐÿð]ÿ@sþÿç‹?ì+þ‘ZÑÿ'ƒÿèTÐÿð]ÿUü!ag¦j)³°´‚ÒÖ=U6Cb4\ÙÛ… ’Oã@EQ@Q@Q@Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)« ®ÇòO‚·>Çãúèø&›ÿ’¨ ¢¹ÿ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨ ¢¹ÿ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨ ¢¹ÿ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨ ¢¹ÿ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨ ¢¹ÿ±øÃþƒºþ ¦ÿäª>Çãúèø&›ÿ’¨ ®Æ_ò¶ÿ°®›ÿ¥°Ñö?ÐwCÿÁ4ßü•Xþ$¶ñ$z}›_êºTö£UÓ·Ç™$Nßéã g`9ÇðŸN:Ðq\ÿŒ¿ämÿa]7ÿKa®‚¹¿‰›Ãq­¼‘Ç9ÔôñÈ…Õ[íà•3Û#>¢€:J+ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: +ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: +ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: +ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: +ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: +ŸûŒ?è;¡ÿàšoþJ£ì~0ÿ î‡ÿ‚i¿ù*€: çï?ä¡èßö ¿ÿѶ”}ÆôÐÿðM7ÿ%V}¼:Ä_ô¿íkë¬éWÞ_Ù,Þßoïm3Ò¾{tÆ0z瀊( ¹ûÏù(z7ý‚¯ÿôm¥tÉëÑêRøëD].îÒÚìËâÏulÓ©_6Ó€«"sŽsØñÏeÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@ÏýÆôÐÿðM7ÿ%Qö?ÐwCÿÁ4ßü•@sþÿç‹?ì+þ‘ZÑö?ÐwCÿÁ4ßü•Uü —‘ê)[ùàžèj©¾H!1#¡Ûc YˆãÄ}xé@EQ@Q@Q@Q@Q@Q@Q@Q@Q@ÿŽÿäžx—þÁW_ú)« ®ÇòO¹¥gØÇi-àž9Œþ\qí,³@L0!PÈ×ÁùA` ?kzŠ´Û¸µY!ƒû2íÚÒFO!¶<å)òä—b°b!•ÜÛ¶<¬ ZQ#ÕcÕ­ì¯~Ïò´lfS RÆ0Ò2ü p£<ä oé—bÛËžE{›ƒj‘K‘È%´¥C!Ø¥†à20GÞǹñuõåÄqxcFVC¦G©f¼û*²J[ÉDÊ1.ûüÁ@ÀÉæ€:Ê+ÃÄÚuôöÖÙžÞîx’O³ÜBÈѳ “ÉvÆÑ0C¸Ç»p_›y¢/èÓi××éy›[Œó¹‰Çî€$J Œ¼d+muʶӴœØ¢¹1ã ¹¼?¥ÝÛhr6©¨^¶ž,%¹DXfŒÈ&ß(ÈØ¢H* l /%¾µð®·ªêZ$–—zJNÏlfÝâ4Þ­»Fäe#’ ƒ¸• ’ŠÇÿ„£IþÎûo>ß7Èò>É/Ú<ÌnÙämó7mùñ·;>o»ÍHþ#ÒâÒ·FæíâxÁxö¹ÄeAUxBÄo<.O©\ÿŒ¿ämÿa]7ÿKa®‚¹ÿÈÛþºoþ–Ã@sþ2ÿ·ý…tßý-†º çüeÿ ;oû é¿ú[ WøƒÚ<&`û4^f¡`žEÁÄræîµÎå=ƒÐô¯?¸Ôn¼ â=BÍí Ðìµ/³ÈË£O“lÛ% ´ÝâY%òdÜÞXP° Ã<›—ÕÿÅ’XÙÉ©„ûUİfÏ6±KH0‚LÍó¸eÄcÌ}õÜxkR›Y𮑪\,k=í”7,`… è’N2}M â=!Hú7-Z0]Yn$1ÂCA ÀŒŽN5е{›Ó,’]jm§”º 8Úæ&›É (J “¿pP[n(¬¢±áñN=ÍÔw™†ßicå8.â6q™ÏÈ9áKÏÕüOmcm¨é}ý„òÃo¾{Ù-äYd˜C´Çä¶6³ ÀÀ†r0@:Š+‡Õ|qªhöº½ýΉbl4ybŠõ×TÄ™h¢‘ü¥x•_vRä`HÐkÞ ‹@m0Ío<ÑÞÝ›b`‰åtýÔ’nŠÌßêñ€8Îz Ø¢²ßÄzB\ZCöèÜÝ¢Fp2áQ˜cïs·›7´Zâ85 NÞ)c´¹Vx|⛀Á*œž˜ „½2ÃøwƳ¦‰áäŸÄ‘ÉxSNH­§’)QK‡Hå‘›‰Œ¨He0¸p+×+—Ð|_ý±g¥5¬úEÍ£Þ[ß%ט‘Æ…w-Á*«ƒwÝ ã䓟“›â­3ɵ¸1Å·Æíd·x ÂóÈé•;Swϰm;²r¡€7(¬3âý -Òi.äŒ3²²Io*IÐ 4¨WtH¡—pª¡$RkÉ­ëÑxªÛHmMò.iÒàjO¸CƬJy߉T…ÝŽÜ:’ŠâÛÆ×ÐMk=Ö‘hš]ΰúLs&£™÷‰žo)£PAdÉ ìB’pvšØ›Äö–¾*}é$ˆýž c¸Øæ6i^TÌjÆîa¼¾ÈärŠËOéqwÛ£ChŽò¼€¤{PâB®À+<9Rvб¦ê–šµ»MhòŽRD–'ŠHÛáÑÀe8 €@È`zhåsþÿç‹?ì+þ‘Z×A\ÿ‡¿ä9âÏû Çÿ¤V´ÐQEQEQEQEQEQEQEQEQEÏøïþIç‰ìuÿ¢šº çüwÿ$óÄ¿ö ºÿÑM]sþÿ’yá¯ûZÿ襮‚¹ÿÉ<ð×ý‚­ôR×A@Q@ÿ?äžxkþÁV¿ú)jŸ€´Ý?À·^²ŽÒÚ{½3ì77ÐÚ*4Íåó\–9bØ'¹çœÔ–»Ó4ëk ?k‘ÚÚÄž]™ÚŠQ“o“€Z±ÿö©ÿCž¹ÿ~l¿ù€)꾇W¸¸yï¤D›SþÐT`r[øqŒÜÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzLJÀº¶½¥êÄÓÝC§J®«~&šIÊhˆb&X·mvȃg·Å©èžÔ§ðþ™o¯jÆb²±·{{8š #[sæ2¬§sùÿá û V†«§ëV:އoŒ5’—÷­o)h,²[Í.Wý®èÔsž úOøGµOúõÏûóeÿÈôLx,ÙJóiz”‘È·«¨@o¼Ë½³yÝ÷³HÐÆFàU†w žÔµjºmÞ±Ϫ$Éq(¶o.5x< !ŒÈJB9›'MÃlŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü@ú·†õA«Á{¤ÜÀ&—[û|’Oô·A`Öü¨‘Käªô#ú§9ñx#TŽüY%ü ¦ ?O†âf¶ËÎðÏ4Ž!ăìÿxmÀ;7/—·`ÇAÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈôÐW?ã/ùÛØWMÿÒØhÿ„{Tÿ¡Ï\ÿ¿6_üQËáK›£Þø£Y»‚+ˆn<‰#´UvŠE‘A)¶7 èEt•ÏøËþ@vßöÓô¶è+?ZÒS[Ó ”—3Û~ö)’h6ïGŽE‘Hܬ¿yPh?hø‡Iþθòü†¸·–E’1"ȱ̒*x!‚müz•øvÎ6ÑRÂ(,mt»·¹Kx! º)c*À^f-œv÷ÍWÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäz˳ð$Úké×v:¬i¨iúe¦Ÿ ÒZ–FXVU}êGóCl 0Ñ#ØÅI¢xû"H$ûEŒ~VªÚ—“aaöhFm ¶ÅMí·®òrrsÇ9­øGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG  x¼ynºdë0 [[M2Úá^È——ìR™U•„€&âpA ŠÐ>Õf²µ×¾Ç¦Iv÷cȶÅÚ;Êf`%.P¯˜HÁˆåÓŸ½V?áÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€9y| ¯ÙGw=¾¯íÅ̺vX§/È»YwîšåبV”g9ÝÒEáy¿°¾Ãsܾ§£4Ñ[˜ã,·+>Ô‹y@§’KÌÌLŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü@õiº„ºõãÇiý©¨¾û]A­§±aq!GÎì«G¼Wñ޵±{¥M}¨é×RÜÆÂôÝD‹ÉSo$[îëºFmÀþ#OþíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘蟃Á¤WPiÉiPiZeœÓµ¶é. ´²³ydH -‚¿>©pT†\Ö‡|7ªhúu„ÚÍÌ u•mb¶ðAåù"0I0‘„¬ 7pÛ@ÞÙÐÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè+Ÿ¼ÿ’‡£Ø*ÿÿFÚQÿö©ÿCž¹ÿ~l¿ù¤°ðì–ºÌz¥Þ·©j3Åo%¼Kt°*¢ÈѳåD„œÄIï@”QEÏÞÉCÑ¿ìÿ£m+ ¬}[A:ž£i«}§]ZÅ,*ö‚¹$1–Kޱ/Lw æð¶›wâ§×¯mm.ç[x"¶ó­•ÚÝ¢y_z1É™Lc`äöþøži}³þb¿Ú^_•ÿN_eÙœÿÀólw£þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘è.?‡Ð®—³ÞG%Ŷ™cigrÖÀ›{‹_4Çp ·]ÒgoL !ˆ¬øS\ðæ£áä¹Ðt{‡œÞ<FYžÞ`Çpœ±dÄò†>c·suŸðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü@¾­ðÿTºµÔõ ›Ûý]ôK»{;±Iy,‘*+NþiWÆÌ@P[#пðæ¬Ñ]_ë0øµXuD{{#;¡ˆ¤Jc2üÄ36íÌ &@T+±ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈôÍëßµŸ½Ô÷~(Ž;‹»w´›ìö³Ã„¨¾Z\ ÅÌÙràùÌÀv“ižoˆlµo;f´žÛÊÛ÷¼×…·gÓm¹‚;Hµc©µñÔ’ÑVr­rfh·ƒ» ˆœò¤ñ–¬^x^kû·»¸¿Ï•4Ñ'—nUKZÜ4ä€\¶ÜdíÆrÕ'ü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#Ð/uàívëA×i`fhµ”Ó좈$Œ×2ÈÈ^o0†R;UË)oš5#°Ðô›Í>}BïQ½‚êîöUvkkcoª¢  ¾[ƒ—'qWî¢_þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘è ®Ãßòñgý…cÿÒ+Z?áÕ?ès×?ïÍ—ÿ#ÕÍE0½f¿»¾žöãíOt# [ËHÀ4U,kÛÖ€5(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüwÿ$óÄ¿ö ºÿÑM]sþ;ÿ’yâ_û]覮‚€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Šåì<_w©éÖ×ö~×$µº‰&…üË1¹§ã# ޵cþSþ„ÍsþÿYòEtW?ÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÐQ\ÿü$:§ý šçýþ²ÿäŠ?á!Õ?èL×?ïõ—ÿ$PâùxOþ²éÕtÅ꺆µ}¨èwx?Y az׆žË%M¼ÑaÒ:î‘O8à¡Ôÿ„‡Tÿ¡3\ÿ¿Ö_ü‘@ÏÿÂCªЙ®ßë/þH£þSþ„ÍsþÿYòEtW?ÿ ©ÿBf¹ÿ¬¿ù"øHuOú5ÏûýeÿÉÐQ\ÿü$:§ý šçýþ²ÿ䊎_ÜÚ˜÷ÂúͤÜCoçÉ%£*4²,jHIÙ±¹Ç@h¤¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñßü“ÏÿØ*ëÿE5tÏøïþIç‰ìuÿ¢šº çü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€9ÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  ?Åš¥Å§ˆt‹%Ôõ[Yí.¥é–êGtxå|™HP$~p9#ž”GâÍRÒêÊÓUÒ I¦žúƒÇqóE=Ô­D2¬‹É2 )ÈÜFPö6òj0ß´yº†)!÷•¡aŽœ˜Óò÷5^ëDÓ¯.¤¹¸·ß4ŸgÞÛØgÈ”Ëÿ ±>ùÁÈâ€8½;^Õõ‘­}£V»±´Òïg„ý†ÀMy6.eDe]’@¨qxäˇv…Ï®ltmøÚZ_%Æ&­y43óòŸ>Ö…¿„4;kÛ›µ´’G¹IÒX縖XŠÎáå'bŠ€$3D~ÑÑ&WŽîàÈ›<Ë»éî1¸7îÞG-ܨÙBQUR2ì|qý§aØ-ìnïäÔž‚ ÿ2Ѥ‚Dá2TFÏ—ãn1óV]ÏŠS׿u«xƒN³:eµÂ[éúZܺJòN²,Ø‚Rަ5R¤ŒaÉü?Òž[v‚ãR„-輸'R¹y&aŒHe܇¹*yäcšn‰§i>Ãoål´†É~vlCï-y'¦öç©Ï$ñ@ί¯ ÝxÆ;øÈµInWHòÖ8¼„bZ9˜«È.µ•VE T…bÝåcÿÂ/¤ÿhý·ÉŸw›çùk—ìþfwoò7y{·|ùÛÿ7Þæ¶(®Æ_ò¶ÿ°®›ÿ¥°×A\ÿŒ¿ämÿa]7ÿKa ‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÇòOe‰$ P“,H‘C+m;IÁÆ\>Ôíµí/P&žê:Uu[ñ4ÒH¾SDC2Å»k¶D8-¸–-OFð õφ,-bom.gov.au What can gspice do? Current features: * Import gschem schematic files using gentlist. * Load and parse circuit description (net list) files. * Provides a GUI interface for GNU-Cap OP, DC, AC and Transient analyses and generates appropriate simulator commands based on user input. * Provides a GUI interface for Ng-Spice DC, AC and Transient analyses and generates appropriate simulator commands based on user input. * The raw output may be viewed for any processes initiated by gspiceui. * Formatting of simulator output so that it may be plotted using gwave. What features are missing from gspiceui? Wish list features: * Complete GUI interface for NG-Spice. * Complete GUI interface for GNU-Cap. * Place buttons to select and de-select all items in "Nodes" and "Components" list boxes. * List sub-circuit component labels (eg. R1.X2) in the "Components" list box. * Create simulator engine selection/configuration dialogue. * Create tool bar with the following buttons: Open Import Reload Close | Create Run Stop | View * Give the user the option of deleting all files generated by GSpiceUI on close or exit. * Develop a mechanism so that the user can enter model parameters (eg. from a data book) to be converted into model definitions in a library of components. * Add configuration file functionality. * Allow the user to specify the results precision; a lower precision makes the raw data easier to read, a higher precision gives more accuracy / resolution. * Use standard component values in PnlValue controls displaying R, L or C values. * Automatically add .MODEL statements to net list file if they are missing. What is the current version? The version numbering scheme uses the format: vA.B.CD A is the major release number (rarely updated). B is the minor release number (infrequently updated). CD is the modification increment number (incremented as a result of almost any modification). For example version 1.0 would be designated v1.0.00, any version with a major release number of 0 is pre-version 1.0. Until version 1.0.00 is released the version number will represent a percentage of the development completed towards version 1.0.00. Eg. v0.5.60 would signify that roughly %56 of the development effort has been completed towards version 1.0.00. Where can I download it? gEDA's download page.gspiceui-1.0.00+dfsg/html/OM-FrmMain.jpg0000644000000000000000000014370411640201013016322 0ustar rootrootÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀêò"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ô ønÓSðn‡y}®Iuu§ÛÍ3ÿn^ ÎÑ©c.I=+cþÝ/þ~µÏüÞÿñê< ÿ$óÃ_ö µÿÑK]sÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAE|qâÏøŸLñ–¹agâ}r;[]BâSûJcµF 2['´V?Žÿ䡸—þ·_ú5¨ ¯ü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¯?ø³á¿øK´}Cyr]jå9l"Ú\ºn8?.å\àgÇ4èW7æ»ø4Õì.4u_ Ig¦ëW«g x Ä äù^l%RÀd€í´ž@¼ Šùãá߉~éþÓm|Ko¥>®žoÚ úKLç2¹\¸Œçå+ߎ•èú¯lü-…ôÿ xoûB×\Ši, ±Å¸Uuù €ªÆL³m˜ƒŒP Q\{x§Ä¾F™o‚ç:½Öçºï[YÄ f¹ UØðÛÆxàf½§îׯ ¨èŸdÔ¼3šXìKèbi¬›A‚ž«À#¾@î(¯3—⎯oàè<_qàù"ÐÝáóïÀ¸Xßh2¬E0ɹ¶¯Ì ­…S‘±kã=^hº½áÈô÷Ö-ä–Úk{ñpH×{Æãbà…î7 ‘‚y ´¢¼þ/뺮}®xwÂ?ÚZ496“6 "šùUйŽ‚­ÃÄc“´v³gâËW°}ö·q,©’ \õVÁ 09g‚  +ÌîôØ|}ñSQÓµ†‘ô ¥³¦œH1]\LŒâY9 ¿.Ã}@,­¡sðæÓKñf—â?ÛZi—ipP„;ÇÅ«.×4Þ0¬ m]Ã-“Šï(¯3ð¢ºN—ãÛ÷¶»¹ø¢ù¼‹Hid? ¨¼’Oà:’&´&ñο¤Üh?ðøJ; }^õlwC©­Ä–ò±"0êA ŒåXàžp¤¼¢¼ý¼®ÞÿÂG>…áí MíìØ¶ #šæDǘ#ŒFÙÛ×’ 0 eF†µã{‹ü3e§hSÜê^ ÜÑ[]Ê-~ΊÜÊpÄ2†PFî …Ïøs]Õ5[ÍRËWðüúUÅ„ª‹'™æÁrŒ ›WwC‘Ž2¹ä9ŒWÖúfá;ûÉ<»[_ÙÍ3í'j(±ÀäàÒ€="ŠðÿŠ_¼â?‡¶“¤ë?h¾ŸÉòâû,É»lÈÇ–@žMzÚôïø\ŸbþËÿ‰Ÿü#þoö‡ÚýOÚ1åywï|Ûºö Šóø¼®êº=ö¹áßÿihÐäÚLÚ€ŠkåV*æ8DlF · CŒNÐj¿¼/&‰¢Ï¬ÿÂEÏm3ªº:*ÕF°çwɵ8ÅzÇ·Š|Käi–ñø.s«Ýn{¨ñEµœAÊk¥] ±lgŽqï¾)ÜiZ?ŠæÔ|=åj^–Ý%¶KÐñÌ“0ë&ÌŒ‚[zc¹!@="Šàßâ§g¥Ë}ªøJîÀÜÜCk¢ÛËu–þYwlGˆ-¼ñ’9#æ—ã-Gþ;MÄšö=Ö¡I`ñÞ-ÒNÈåBUAFPèÚpØ'À…áÿ ¼Y®èßîÇÂÿl°ÒbšIg¸½æÞÈï䮯܍¤e‰\Ê+^™¤ø¾_Y±²‹O»Ž ý=ZÖæEYKÑžÁÔ!Òü)%ç…àvaöøã–Xx–T…†p¦6³+6WŽNÐD¢¼ÏYñ«wñ+À-¦Iö.¤—3E²òDq·K–* *장;už;ÿ’yâ_û]覠‚ŠàþFº¾³à³4r>zV¡‹iÇ;™ÁÚzt'‹øs-Æ£ñ¦ûÄ-?üO4I¯¡ŽxOjX¡RÁýÜHsßw~¤Ü(®ÏÇÚ¾¯au­è¾’ûÃñ?î.Vð-Åäjådh ØNT«®ÈXcœ —þ:óu+MðÖý³}¨Z& ÏöXá³bLÌÊIä)lÀàŠó¿ x­®¼KâÍC]ÓdÑgÒ´Ë5¿¥[Ss.ådûÃËu< ç#rMñ_ƒÃCÄïๆ]dÜš‚½×ÙR¡\m9+¿ ç8PZ€=Šó¸'†ëãìWòÇ4øH$Ø^_Â#ö;Iî<ÙÏ7“.5ß¹ÛddžwPñ~ÂóSø[¬ÙØZOwu'‘²#2;bxÉÂŽN'ð£ìŸð½´~É?Øáò>ÓåŸ/ÌûN훺nÇ8ëŠî( Ðtåðo‚$Òõ-Å×zæœò¢Ûéwëou¹Ë#Dñ7”¨CŒä6T·q|6úgоG§èSØØÙE¨=Ìíp–O,!Š4¼çç,'žÕêPø®=Aþ#ií¨Mâü.šc²®.1%ß™‚²}œ1°©ÀÊð~ð>y¬xzétω–šO‡µÄ‡RþΞÅ&µžW¹ "´­½·ľò¬wŒœ€U‚ýEqÿì5;GÔtëO¶6‘ªÃ¨Ol±¬’K W+pÒaò£ƒ‘òØ«þ!ÔõYÛi:lñèÑDòj7z”ÖÌXŒD‰–l‚[*T.9ÉÅuP•øOIÔ­¿g+.}>î-@é—è-YK3M´l#99ç"©ø¡/ü3ð³ÁÞ+¶³u Ú[†ŽøH6¤°$B€›sFyÆ6žzƒì‡«xuµgOº¸Õ.×O³uœé±íXæ4NÌòó³;IT8Nàü£Üh> Òì/^w¾y·m<¢Góä&IrÃï|îÜóõ=kâ—ª$ú/Šô;/í K@–Y>Â_h‚TÙ(\ ™¯ãÃ)î( /Rñä¿ØÊÚ7‡|Aq«\ H-¦Ò&a•”íó @Ø CŸQÇ5ÃêzN½à[‡W§ê^$ŸL}Aõ,!yXµÁŽpI ÈÄÆý¿Ã“l¢€<ì5Ï‹¾*hú„^¥g¥øzÞwûeí£À.åyh’l(–Áäc*OáM{¿|8× ½õÆ›¦K¨GzšsÊ·(³JÈ®‚"ª°¶Ø=Í{Åü7uÌ6w_dº’'Hn<±'”䯴ðØ88=qYþðÝŸ„|9i¡ØI<–¶»ö<ì ÎÎr@«ÔÉèzv¥ãÅžøƒÈÒ­ËÛjú½åàlƒkG7 ’ ç-Ž«Óî“OÃ:ž±àÿ‡ãÃo¡ßOâ=?̵µK}9Í¥Ã3‚U —‡RìÌ­ò¹o›¯¨Q@w¯Ûj¿ðŸ|8¿½³’g¶K´¿šÂÞI †Y!D€J¡rp[rz]G šëÀ¾!··ŠI§—L¹HãK3±‰€I'ŒVååÿt¿kG7‡¬§¼þÞÓÛA¼Üì`µ );¢Ü+Î7t\£hXho¦|d¶6vǤZøQ,¡›cÔ­ÀÛóÕ‚€pNqÍzå~Õ/~ü<: ç‡õ›ícKy‘!²±–X®÷H]9•J!Æs†o— …tûÿ†÷Z­Î}>›y¢$7omk%Ü–·qË$ÌÊɹu IQØ}bŠóxcÖ<_yãµ:lú}­þ•†—-ì•@¹RîHùÝŽ °¡+ÈÏ?½½—´ý%ü-ã-KYò£ÓîtÓy ±`<·&Pæ Á ©+†^Îßh¢€<þÃC}3ã%±³°ž="׉e ÛÆ¥nØ÷ž¬‚sŽkÐ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€> ñßü”?ÿØVëÿFµxïþJ‰ì+uÿ£ZŠúÿÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢±ï¼Yá½2òK;ÿiV—Qã|3ÞÇ®@#*NFAñªÿðø?þ†½ÿ0ÿñTÐQ\ÿü'~ÿ¡¯CÿÁŒ?üUðø?þ†½ÿ0ÿñTÐQ\ÿü'~ÿ¡¯CÿÁŒ?üUðø?þ†½ÿ0ÿñTÐQ\ÿü'~ÿ¡¯CÿÁŒ?üUðø?þ†½ÿ0ÿñTÐQ\ÿü'~ÿ¡¯CÿÁŒ?üUðø?þ†½ÿ0ÿñTÐQ\ÿü'~ÿ¡¯CÿÁŒ?üU\Ó|K ë7 o¥ëzmôê…Ú;[¤•‚ä ¤œdŸq@”QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|Aã¿ù(~%ÿ°­×þj(ñßü”?ÿØVëÿFµõÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?àßùÜÿØWRÿÒÙ« ®Á¿ò¹ÿ°®¥ÿ¥³WA@gË®èðYµäº­Œv«s´Ïpr#rÙÆÖ €zqZæöß o"ñ4ZŒº„ZÅvÉ*h¬VXî`…?…|¹ã+ŒÆä»UT´ÖuÛmÖYY$ºû-»'šLÒˆ£á™@‰$•½(³Öâ™à‚þÞM*òáÝmìïf‡Íœ*†fAŽyç#€0O/kà‹Øü1>‘#Z!º½³¾™í§–=Œ’DÒÅ9DE„,EJáv)©v¹©x>4.}ÑÿgÝÛ:êW2ÝišÜã2ù˜R°¸ä2©`v8ܤrOè0épê’ëzjió>È®ÚéNÜð¯œò·ö>•qïìãŠêY.àHí3ö—iáCçø~RžÄ•Åè^ñœwz¼Ö’•Ö?´ZQuæÈÊlšÛiÛKv€2 Ï#-ž¿õ{-Ê 2êÒÖîÎËLV ³@ó4Å·DàƒçV(O˜ªÄ9ôˆ'†êÞ+‹ycš PÕoc]WQÄðIjóy1à<ÊÜtäžœÖÇü$:§ý šçýþ²ÿäŠ<ÿ ;Ÿû ê_ú[5qñø“YþÔ¶’ WUšFñ¶SÚϦ"Ø­°¹’!‹ƒa‚…Û‰³áv’ÄÃþSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’+Õ¾$ˬ[-§…î,L×RÀmî"¿F–8MÌ0±’3ˆ™ŒÉ´0c´³0VO,êEñCMº·Ôî,E¥ävÚeÆ¥n°^«HñÂ"d0–.¥AÜqÁ  ÏøHuOú5ÏûýeÿÉÂCªЙ®ßë/þHªþ2ñ%ÿ…¼ º×Ù¬|È¥·‹4òâG‘UʲÆY±»í|Ø$l:N³q}¨ÝØ^éÿbº‚(®B „¿º”Èq 1>å”q‡lð_þSþ„ÍsþÿYòEðêŸô&kŸ÷úËÿ’+ ¢€9ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH®‚Šçÿá!Õ?èL×?ïõ—ÿ$V}¾£uñKûN}¦ìÒ¯¶ý­ào32ÚgTÓñÔc<ã°®~óþJÿ`«ÿýi@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xïþJ‰ì+uÿ£ZŠØãݱÌfÚ«½°5æz[ø–}+Ã776ZÌþ-³IXÁwÀµP,®ìqwcffóHÊJµn]jº´WZÂèÓëš•ªE§›ˆ/£¸·¸ $·++B;×-±™‘8Œ®ÄëóÃko-ÅıÃH^I$`ªŠI$ðæ¼~çû^AáíRê×Äܵ¾£jZ¼EÜ¡‰%Ú¢EB¬žiŒÉ’’Y^Âïí:§ÂZ8íu#s.™y v÷Hí9m²*¨ÜªîRÊ—ia¸šì!ž”/±ÊÙ #•аã¸`Aˆ"¤¯'ŒjÖ¾'»¼x5é<©‹n jWyIH1’é†pv#@Hú¤3,è]€dùãd9V*x`28=Á’¹ûÏù(z7ý‚¯ÿôm¥tÏÞÉCÑ¿ìÿ£m( ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âÿÉCñ/ý…n¿ôkQGŽÿ䡸—þ·_ú5¨ ¯ü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€8ýïWÑ-®¬¤ð®«sÿ É’h&´Øé%Ì’)§Vû®:ZðêŸô&kŸ÷úËÿ’+ ¢€9ÿøHuOú5ÏûýeÿÉÂCªЙ®ßë/þH®‚Šçÿá!Õ?èL×?ïõ—ÿ$V]ݯ†­î®,¾]éPlßs$?ÙÐ.Õåȸrzd×i\ýÿüOuÈ´´ÿ=:Xnï_¨’A—ŠGFVXånAF0Ë!À=7Æ·:µ»MiàÿŽRD”ÚE$m€pèó†S‚ †¡®ÂCªЙ®ßë/þH£Sÿ‰±²Ÿ»ÓçÌz¦8DùG—rßîí±|®ŽØ†: çÿá!Õ?èL×?ïõ—ÿ$Qÿ ©ÿBf¹ÿ¬¿ù"º (Ÿÿ„‡Tÿ¡3\ÿ¿Ö_ü‘Uí_RÔüec>…}§ZÚé÷P³ÝËnw<’[•E+ž‘7\v®¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠøƒÇòPüKÿa[¯ýÔQã¿ù(~%ÿ°­×þj(ëÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ÷ó\[é×3YÚý®ê8á·ó~k€J¦ãÂäàdôÍrú5ö©¥iÉ ž×.nß]Ý™,•®fÀ !i8Î œ*…Q…PaErpx¢]wFŠtð^³u§ßÛ‡Q#Ym–'\ò­qЩèG~kSà ¨Ç¡Ã¥é$?ºŒÝH¯;Ƽ+LU™|ÃÜ«ß{å,QkøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠøƒÇòPüKÿa[¯ýÔQã¿ù(~%ÿ°­×þj(ëÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ^Ó\ñ&¦·ØhšSZÇwql>«$nÞT¯b¢Ý€ÉBq“Ö¬}³ÆôÐÿðs7ÿ"ÑàßùÜÿØWRÿÒÙ«  íž0ÿ ‡ÿƒ™¿ù¶xÃþ€ZþfÿäZè+‹ñqš_h¶‹k¬Þ@öW’=¶—~mX²½°WcæÄ˜c'ïtî5>Ùãúhø9›ÿ‘hûgŒ?è¡ÿàæoþE¬v×õ‹};U[e‚ßìz†Ÿ¦ZGyÏ$^p¶ÞÓ0”ù¬>ÑÙ‡)’͜ֈ¼Qâkݬ,ä´²Ô.. wp» Ko¨ÁlÎàƒ„‘¥ÿWómU ´›ð &…oã ÃÚf“ý‘¡ÍöH­¼ßíy—~Ä »f8Î3ŒšÐûgŒ?è¡ÿàæoþE®NËÆÓjž%\·¸‘47Ñçû¤Ä„ž`m1(³—ŸÈÚ¡Ê´l,ÅhÔ¼u¨C Kz±Ç%ÞŸ{s y-®-Ršt·*LÁÔgjírÀãpÁ*T¬ûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù¬h:…åÛjv—æ .´ë±lóA%ÌQÊ!f+(\n9Ûž3±@ÿÛÙãúhø9›ÿ‘k—Ó¼_ªjÞ2ŸL‚/ì»ù´ûq,ó¢²$¹ój2ï‘Ô+. î‰|ÌáB˜Ï5T¸MAÌk§ßéšlÖÖéc$ÿc–èËóHÑò Ç´£{4J 3³íž0ÿ ‡ÿƒ™¿ù¶xÃþ€ZþfÿäZæÛÆÕÔZ}õ“ÚF‘Ùj“ÝAu …nM¤ñD0de6å¾có– ¸† ·5 þ4¹Yc¾K)%Ó丞ÑlÝÅþøà’}å¥Ö,,EA+"9a€Síž0ÿ ‡ÿƒ™¿ù¶xÃþ€ZþfÿäZåõojšMÍ©˜ØÜÃû»×{&ýË[ImxáKÅ• °s*Y~ìyù[Ñ -¼Kq$rN 4(¬Øä…$3Û'¦€0þÙãúhø9›ÿ‘j½Þ¹âM1mç¿Ñ4¥µ’îÞÙÚ VI|ÙR ÁMºƒ‚àã#¥uÏøËþ@vßöÓô¶è(¢ŠøƒÇòPüKÿa[¯ýÔQã¿ù(~%ÿ°­×þj(ëÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ã~,ðÞ™§ÞYßøƒJ´ºUÔwÃ=ìqºæòb2¤ädØÿ„ïÁÿô5èø1‡ÿŠ£Á¿ò¹ÿ°®¥ÿ¥³WA@ÿü'~ÿ¡¯CÿÁŒ?üUF|ià–¸K†ñ/‡Ì茉!¿‡r«X» ªHï´zWIEríâÏ¿™»Äo6TžLÞÀwÈ›v¹ç–¨Ú¾‚£>%ø|Å k~% º·ùY¤±ðLŠ®OvPzŒ×YEroâ_‡Ò#£ë~dt•MÕ¹ ²¶éAçì2Ãø'5NÞÿáe¤REmwàØc—ýbG%ª‡ùY9¯Êî¿GaКî( n?x&™âñ/‡Ñæ}ò²ß ¶Ð¹o›“µTdöv©?á;ðý zþ aÿâ« ¢€9ÿøNüÿC^‡ÿƒøªÏ·×t}oâ—ý“ªØßù:U÷™öK„—fe´Æv“Œàõô5ØW?yÿ%Fÿ°Uÿþ´ ‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( >ã]ÑôOˆz§ö¶«caçiV>_Úî-ø–ï8ÜFq‘ÓÔV‡ü'~ÿ¡¯CÿÁŒ?üUòPõŸûXèÛºè(—ÿ„³À~Ÿÿ ‡<ï7Ïó>Ûï3g—¿9ûÛ>\õÛÇJŒø—áó-­ø`”vt&êßåfJÄsÁ2*¹=ÙAê3]eÅÞjß µïµÝ<î3O5³™ªÉ䪒= Q6­ðÊåO¨xFTëjæ¶`!V ±ò~à`^€€k´¢€8y¯þ\YÛYÍwàÙ-mw}ž’Ô¤[Ž[jž'“޵cûwáÇöÇö¿ö¯…?´ÿç÷íþwÝÛ÷ó»îñ×§ØQ@]†­ðËJ}úv¡á7u¼ÖÑÁYAùHçk¸Ï£0îkBx&ÖÞ+{ø~"@‘Çü*¨ ``8Åt”P?ÿ ߃ÿèkÐÿðcÿXþ$ñg†õ=>ÎÎÃÄUÝÔš®²/c‘Û“…'øWq\ÿŒ¿ämÿa]7ÿKa ‚Š( ˆ¿ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüÿ ;Ÿû ê_ú[5tÃøoF¿»Óï'‡ÄÚ­”mªê8‚íJ&/&…›ž¼“×ÓŠ’µ¹Õ—ÄÛ¹uì†Ñ%ÓšPËÃ`ƒ99ã€;J+—¾Ó.4Ë9//ü{ªÚZÇóN¶¢ä€2Æß$øÕøGµOúõÏûóeÿÈôÐQ\ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#ÐAEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü@ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tÏÞÉCÑ¿ìÿ£m(ÿ„{Tÿ¡Ï\ÿ¿6_üYöúuÕ‡Ä=/í:Íö¥¿J¾Ûö´|¼KiœyQ§\÷ÏAŒsŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ~ÏþJ³ÿ`«ýw]q÷uÕÿÄ=SìÚÍö›³J±ÝöD¼ÌËwŒù±¿LvÇSœñˆõ'µÑ®ßTø›wc; uŽê]:&+’2@2ϱ ÒŠçÿáÕ?ès×?ïÍ—ÿ#Õ{2ãS³ŽòÃǺ­Ý¬™Ù4 a"6  -ðpA…uW?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈôÐQ\ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#ÐAEsÿðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_ü@sþ2ÿ·ý…tßý-†øGµOúõÏûóeÿÈõâMþÓO³žoj·±®«§f ãµù¼„rRn:ðGON(¸¢Š(âÿÉCñ/ý…n¿ôkQGŽÿ䡸—þ·_ú5¨ ¯ü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€9ÿÿÈçþº—þ–Í\›hÔö6²]ÞÂÛÅwŠiä\àê¶O5™€@Ì%cRP¸-]gƒäsÿa]KÿKfªö¾'¿’ íRóO±µÐ¬¥»I®¾Û#Ì©nò#?”!Ç&2pð{ž(ÏæOkú’YjÚ~«[¸žõ­§¼¼‘ßÛ¢´yŽ4HÄFf_-˜•Üï@Õr-GÆ7)âg²Ô ½þÇÔ’@×L’]#*ÀmÃĉÆò‚&f`Ar\dúÏ‹ô;+„†òîKRÖñܳÜ[ËpÆå‚]”,D”`ÊœŒc\-Ñåq‰ŒïPØð²¬ÿ´vgÏöøF¿á"ó·3ËÏú½7cœîÆx÷ õ .ö÷ᇋ-çMJ[Ë—ÔÚ8ÚYL‰eª ä!UŒ_•èCǦ^ßÂK¦Â©®oû[Ã!š Ÿ²ýƒìîðÒ ¾fï$;9ó|Ï1s³µ/üq•á;Zò伉.±gfÒÌíÙ•Æï(0@ʤ(KH KÏhV˜Ó®õ8!º;¾W$¶3+eº ¨»›'å „ãzäbŠçÛÆZHŸL…úGÔ.ÚÍXÊĪT4.Ü*Á±°Oâ%ƒÅ‘èMj]!e•¤l±‘n[j¨R2©<cÎ@ ¹EcøwÄÚw‰ôèï, é¾(æ0ÜÂÑHªã*ÛXr§\©*Ø'¶(®Æ_ò¶ÿ°®›ÿ¥°×A\ÿŒ¿ämÿa]7ÿKa ‚Š( ˆ¿ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šçüÿ ;Ÿû ê_ú[5gÉðïG“GÕàû-ˆÔõ·ÄÏìIçGö–ýï¼v¬›~ðȳŠÐ>š)fþÏñ«§ÛË+ÍöhÙÑ]Ø»d…ÛævfåŽ3€øGµOúõÏûóeÿÈôj~þÑÕ./~ÙåùßÙÿ'•œ}–å§ëŸâÝ·Ûç¥eßx®àU‹X’Úxžòh&Kuc³^Çwa‰#D ƒ÷<­jÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=sz§Ã nm/ì4ÍrK>íKjVb° ·ŠÉ“Ì;bówŽ€(ù‹è]økùu‰î5XüýRÊæÖC©UFš X‹€\œk»nùru?áÕ?ès×?ïÍ—ÿ#Ö^¥§ëIpºn›ã f]JD™ ²1ÛFIl˜·* @ tè/t©¯µ:ê[˜ÂX^›¨‘b9*mä‹cÝwH͸ÀÄy8<ªEuœ—ð&••¦YÍ;[n’àÛK+7–D€ÂØ+óኗHeÍ\›OÖ¬5AÿŒ5‘crê–×) !Àò¥Í¿›î¿“°€Û|ÍOøGµOúõÏûóeÿÈôŸáÏ ê–Ú§Ûu˜.õµµŠ ²=Ë8g”Hw©^vm,¥dR; çÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù€: çï?ä¡èßö ¿ÿѶ”Â=ªÐç®ß›/þG©,<;%®³©w­êZŒñ[ÉoÝ, ¨²4lÄyQ!'1'R{ÐåQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ýŸü”=gþÁVú6î³üMà4ñ´udÕ'´º[H⇬‰ñL%‚p­Æå&E õY¹9Ô¿ðì—ZÌš¥¦·©iÓËo¼«j°2ºÆÒ2“æÄäÊýíQÿÂ=ªÐç®ß›/þG ôÏäkqê“F©ºXC@Çfˆ¡!W'vDŸvyUƒmFL¿øV¶ÙßdþПoößö®ÍƒËòñå}—güñû?î¶çí·ä­øGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG  {Ï^5ޝma¬Áö¼W÷m=‘—É5Ä«å"íeûL€“¸)Âàƒâk:Ƨ…O‰¡q¨Ç¨D{yäŽgYÖà;lža…ò— Ë nÃþíSþ‡=sþüÙò=W¿ÒîôÍ:æþóÆúäv¶±<Ó?‘fv¢‚Xà[dàÒ€)é^½ÓM¼­¬Ç5ÄzÇö“»Á+†Smöcd™ß;I!‹¶>\ V¥ß†>Õâû]í›|'÷VwyqݧÞÏû^zû\sö¶ž(ƒQÓ¡ÕüUªÃ¥ç,"8l·Ã*–’8Ÿ0fh$•ZÃ0uÇAÿö©ÿCž¹ÿ~l¿ù€)økš–‚ µkK—¶²¶Óà1Ø´#ɉŽíãÍ;ܩ“•_™Ãu•ÏÿÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tÏøËþ@vßöÓô¶?áÕ?ès×?ïÍ—ÿ#ÔrøRæèÀ·¾(ÖnàŠâ"Hí]¢‘dPJ@­È:@%Q@xïþJ‰ì+uÿ£Zо˜®“JðþŸ£\\\Z}­§¸DIdº½šåŠ¡b ]ˆ»œ u4©EPEPEPÄ;ÿ’‡â_û ÝèÖ¢ÿÉCñ/ý…n¿ôkQ@_øþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQX~4žk_ø†âÞY!ž-2åã’6*ÈÂ& ‚9s@”W?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtWâÏ Úiž ×/ìïµÈî­tû‰¡íËõÖ6*peÁÁ­lÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔÐQ\ÿü!º_üýkŸø=½ÿãÕâÏ Úiž ×/ìïµÈî­tû‰¡íËõÖ6*peÁÁ­wW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtWâÏ Úiž ×/ìïµÈî­tû‰¡íËõÖ6*peÁÁ­lÂ¥ÿÏÖ¹ÿƒÛßþ=@ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÔxþI熿ìkÿ¢–º æàð6‹ko½¼ºÌ0D#Ž=nõU —Æ*OøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿǨ ¢¹ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üz€: +Ÿÿ„7KÿŸ­sÿ·¿üz±üYá»M3Áºåýö¹Õ®Ÿq4/ý¹xvºÆÅN ¸8 u âŠçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®NÛMFñÖoiu©4eãËÖ£=Ê–Im‚%v€î21Ô×Y@Q@W7â¸Õç‡,šâî.µ6I¾Ës$ ê-nѲ¶7"œg° ’Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(®þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ ‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñê<=ÿ!ÏØV?ý"µ®‚³ôËDŠxì–ô‰|éž{™'w}ª™/#3}ÔQ×µhPEPEPEPÄ;ÿ’‡â_û ÝèÖ¢ÿÉCñ/ý…n¿ôkQ@_øþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]W'¤ëÞ*ÖtkRß@Ñ– Ûxî#Y5‰Cu űÁõ5síž0ÿ ‡ÿƒ™¿ù€: +ŸûgŒ?è¡ÿàæoþE£íž0ÿ ‡ÿƒ™¿ù€: çüwÿ$óÄ¿ö ºÿÑMGÛ¾Úy—IÓ,¥hü¹T¶g˜†XÚ2Lc|¿»`¡‹=ÅpwžÖïµIõ)t[HîçDIßÅ·ð©£jBsÕ˜õ';Ÿlñ‡ý´?üÍÿÈ´ÐQ\ÿÛ±©]k7Ú^©§ZZOkoµ­ãN®²´«ƒº4 ƒ ìzŠÜ Šäô{ÅZÎcª[è2Á{oÄk&±(`®¡€8¶#8>¦®}³ÆôÐÿðs7ÿ"ÐAEsÿlñ‡ý´?üÍÿÈ´}³ÆôÐÿðs7ÿ"ÐA\ÿŽÿäžx—þÁW_ú)¨ûgŒ?è¡ÿàæoþE¬ýv߯߇µ='û#C‡íÖ’Ûy¿Úó6ÍèWv>Ì3ŒçØQ\ÿÛÙãúhø9›ÿ‘h ¢¹ÿ¶xÃþ€ZþfÿäZ>Ùãúhø9›ÿ‘h ®Ä?òðŸý…dÿÒ+ª>Ùãúhø9›ÿ‘k?Q·ñ…ýö“sý‘¡ÇýŸv×;µæ>fa–-¹û7ësž~î;ävW?öÏÐ CÿÁÌßü‹GÛ·á†GIQ”Ý[Ë+n”yÃ,?ˆòs@£â­v/x·H‹SœjFïP»µ¹Œ†{K{ž=~ý«Ç»ø<ø°ÙGioãin|fšJÛÈ5ìº{E-”ÈèéËæ™ˆòˆ`ƒlc$««î °þ%ø}":>·á†GIQ”Ý[Ë+n”yÃ,?ˆòsQÿnü8þØþ×þÕð§öŸüþý¢ßÎû»~þw}Þ:ôâ€3ôŸkh¶³Þ¥Œ—WiA¡…ãEŽö)“iv%”+Ùî(Ç5ïõ;ÍkXÒÖ[=Vê?ø›ÆÖÚ=ñ´'È»ŠÝì(9ù.Hé±.»ðâ{6³—U𤖭p4/qnPÇ&4+œmRI Ï^kÿ…—vÖs]ø6K[]ßg…äµ)ã–Ú§…Éäã­S±ñÕêØxÍx,íïÊZJûî&tœ‹äÄrÈ9a*ºíÚ¬ŽÝg…5 Í_ÂZN§~`7W¶‘ܸ‚2ˆ»Ô0P 1à3žqž3ÏÝ_ü,¾ò>ÙwàÛ"%‚:KWòã_º‹žŠ2pµ ñ§‚mmâ··ñ/‡á‚$ qߪŠ6ŒPI\ýŸü”=gþÁVú6îøNüÿC^‡ÿƒøª§ êÚn³ã­nãKÔ-/ ]2ÅKY–U æÝœ¤Œàƒq@esþÿ’yá¯ûZÿ襮‚¸?øÓ¶¾ðõ½Ç‰thg‹L¶I#’þ%da‚-AãÞU{ÿ¶g\ÿgynòŸìÿhÏ—æ`íߎvçÇ8¬øNüÿC^‡ÿƒøª?á;ðý zþ aÿ⨱ø¡y®ßcI‚Æ+òï!žùŠæÏɘÌdþëeÄ#/Ì£z­ò—¹©I/ˆ¼7mâ ›RÓ¥ŸSµµŠÚ Fh( äp²J±K³Í ¾î&퇔Íl?‰~HŽ­øa‘ÒTe7Vä2ÊÛ¥žC°Ëâ<œÔâÏ¿™»Äo6TžLÞÀwÈ›v¹ç–¨Ú¾‚€#¼×ntËß²Ú¤bÏO¸³²š;¦w¸¸‘¤ˆå²KýöÞdd‘~R»Ž>³â½JãÃZ´ªc·KÍ P½³îK‹&€*‘³þ·tƒ òÙrÿzµ.µß‡ÚŒæ«áK‹è6ù73\[¼‘í;—k‘‚Ièj4Õ¾Gqwpš‡„V{Ôtº‘f¶ :¹Ë‡9Ë`Ø?uv‘W!Õ¾[j‡TƒPðŒZvsv“[,¥›;Žðs“““žrj;;ÿ…š|¦[+¿ÛHvåá’Õ ÚÁבèʬ= ƒÔPqEsÿðø?þ†½ÿ0ÿñTÂwàÿúô?üÃÿÅPgÿ%Yÿ°U‡þ»®‚¹=VÓuŸkw^¡i}é–(ÒZ̲¨o6ìà•$g{Šë(Ÿð'ü“Ï Ø*×ÿE-tÁø/Æžµð/‡­î$êW:å¾¶v’N],ætÜ?Ó"ºŽ;Ä ÜÈ!”L­ÙA-œ0] sZÕâÕ4È&Óm¥±{{ynMÑ…/ç Ë‚Ï*¯pÄJìŠÙ„³jÂYà??Ïÿ„ƒÃžw›çùŸmƒw™³ËßœýíŸ.zíã¥W¹×~^@Ð]j¾žߘ帷e;ÜHüüNªÇÕ€'‘@vÞ ¾²Ôí¬¡½»Ól­µƒ ô:Ô^sEØšãoÚ|æ >G|–,»ÐB¼—/×ïm®mí%‚Êò½5Œ“is ÜܘŒ[&(Ï·o2€¡Á *0ÈÔƒVøeko½¾¡á`Šà]Gs[*¤À`H8ºÕxçøM L‘Kà¤I“dª­j®àØoQ¹Tà÷ö  ãï1TÛZHŠ#'“çKox–ðF޾ð ?ÄF1Ò±îµKÝcYÒ`5-H-½ï›<ºd…•­J´±K4mFYÛ!ÕÇ …ØM[á”ww ¨xEg½GK©k`Ó«œ¸sœ°cÉ9ïUÌÿ šÝ-Ú_ÙÒ2Ö»U˜Ä€ª ï´zP{^­‡‡ü׎êIÎÞü¥¤¯¾âgHØùȾLAw,ƒ–«®ÝªÈíÖxsP¼Õ,nîo .¡wo Ã]±Å3Ä»‰c¹ŽÂIãdó÷Wÿ /¼¶]ø6ãȉ`‡Î’Õü¸×î¢ç¢ŒœÀ­H|ià›d)‰|?g*—ð¨,ÌY Ô±$žä“@%söòPõŸûXèÛº?á;ðý zþ aÿ⪞ƒ«iºÏ޵»/P´¾tËi-fYT7›vpJ’3‚=Åu•ÏøþI熿ìkÿ¢–º àüãO ÚøÃÖ÷%Ñ¡ž-2Ù$ŽKø•‘„J ¶AŒPyY~#ԦѼ?yªB±°²Aq2¸'0¡ (\óùaöä»nxÍSÿ„ïÁÿô5èø1‡ÿŠ£þ¿ÿÐסÿàÆþ*€9½ÇÚ–¹q~°E¦Áš\\‰Ý„mo›ymžCŸÜ‰`–NX lÛ~VJÐÑ5ÛíoÄzMÔÉ%¥½Õ–¢ëbÍóF#žÙ͈óGÎHà¦ò‡•blü>[w·]o÷[WŒ][íhT±‘œ˜è7Z¯«|2Õ_~£¨xFñË—Ýq5´‡qUR~byÚˆ3èª; ¯yâ»Û=wZµ·6‰êùóOæÊ±¡¶Ñd I™¿}·ËO)‰Vf$çëÚÕÆµ5Ü×w¶‰â1k ¦”æÊsösM°Éç&à‘ŽXd£…Qu./þ]ÅW7~ š8¿Õ¤’Z°O•S€z|¨‹ôE©/5o†Z‹Î÷Ú‡„nžwG™§šÙÌŒŠU dòUIž€(.×Åú¥–ƒ|¢-“hñ]ÞLºóx"–@¶ñȬCȨd—sùlT0vfÛÒhíö«¬ßØN–4ÔÍ<-‘u)f£²ˆ»H`ß¼Þ”Å²æ¿øYqgmg5߃dµµÝöx^KR‘n9mªx\žN:Ö„^,ð¬±xƒÃ‘Ⱦf×KØc“?ÄÀ1õ#'šê(®þ¿ÿÐסÿàÆþ*øNüÿC^‡ÿƒøª,ÿä¡ë?ö °ÿÑ·uÐW' êÚn³ã­nãKÔ-/ ]2ÅKY–U æÝœ¤Œàƒq]esþÿ’yá¯ûZÿ襮‚¸?øÓ¶¾ðõ½Ç‰thg‹L¶I#’þ%da‚-Aã¹ÿ ߃ÿèkÐÿðcÿ@\~!ÕìâšÎúæí¢½ñúépªªº ‰ìóÄìRã=QGš±eã ~?éÒݼwš„öúMâIi £J“ÜG‘2³W ” ½¶…òØŽ‚Oü>™!Iu¿ :Cqö¨•®­ÈI·óžs1Ü9É'½W²Õ¾i©"XjµI7u‚kd ÈÛœJ· ö<ŠÇÖµMJçK5Ü“ZG£¥ôØ÷ldÍæÈ³<4bx¶*Þ˜ÄØŒ`5Ä:Æ¥%¶”ð[µÖ¶–‰%õ¼Òlû9nrb2!VÈÆÑ´ ’WvI//þj‰onüs ݇šKW#snO«31õ,OSZð–xÏóÿá ðçæùþgÛ`Ýælò÷ç?{gËž»xé@úgõRûC·û-§ö§Ù.º¼Þ]¼ÐÜɳ9LÉþ‹÷±æcklÜÙún­q§êÑj7_Ú°Ú¶·¨Ay}w¨ -^’ä*¤&V)°¤d°v¬nIž’/ü>…àxµ¿ Föè‰ %Õ¸1ª+*…ç€GØw5^[á•¶¨uH5Ũg7i5²ÊY³¸ï9999ç&€+ÚøÛP™5+v·íñ%¼#Y\@@•¤Ü«¡d¸1$2I” e UUªñüD¸mJÞÓËÌwÖ×,nq?Ÿ(ˆH®FÛp§9I 7˜’EÁ@íb9þB“$Rø)dÙ*«Z€ë¸6ÔnU8=À=ªD¿øY¶²ÇwàÔ’Ófu’ÔpÅÆÃü?1-ÇrOZî+Ÿñ—ü€í¿ì+¦ÿél4Âwàÿúô?üÃÿÅV?‰!êŸÚÚ­‡¥Xùk¸H·â[¼ãqÆGOQ@…ÏÿÂwàÿúô?üÃÿÅQÿ ߃ÿèkÐÿðcÿ@_‰|C«èïã·{›³¦È’[ÚÎŽi· aˆwgp³àc"¨ËW.¼Y®Ùh:äÓ]A#µ—ÓåŠ$¶kYdT2Á×|åUTª«ni;—>%ø}{osow­øbx.œ=ÄrÝ[²ÌÀ(Á8b ÿtz ®š·Ã(î.îPðŠÏzŽ—R,ÖÁ§W9pç9`Ç’sÞ€)ë;µ½=jK‹ëI›U¶±Xm5 ˆ<¨þÚI$ÒdÈ (ÀÈ Ì;j_êÚ–­ÙøoOkB÷( ½Õô¦Ú5FÈ™Z@ò»˜Ûa 0‘û–/#x³Àoænñ‡Í•'“7°ò&Ý®yå†ÄÁê6¯ ¢_xyZY|AáÉ$o/s½ìŸ-‹Ç“ŸábXz‘Ísz¾¥ã4³Ö»©#ÿÂ9gr™;Y:å¦Ì¤!ùV$9Lî;ìô_ê’\X\j~$‚÷MUD[µ¶ûÉÒ^ༀ¶6’Êø a”žÕM‰¯þ\YÛYÍwàÙ-mw}ž’Ô¤[Ž[jž'“޵px—áòß½úë~Žêïp.­üÆeBŠKg$…fP{#¡  žÖ/õOµG©¤]E±šÕb’9-Ëg(Áø‘ARèvHC` ¼ôÇéšïÃÍþÉÕ|)açcÌû%ż[ñœgiÆO_SZðø?þ†½ÿ0ÿñTxËþ@vßöÓô¶è+‡ñ'‹<7©éövv Ò®î¤ÕtíÁ{ŽØ¼„œ(98ŸÂ»Šçìÿä¡ë?ö °ÿÑ·uÐWq®èú'Ä=Sû[U±°ó´«/íw üKwœn#8Èéê+Cþ¿ÿÐסÿàÆþ*€6/þÙýsýä}»Ê³ý£>_™ƒ·~9Ûœgâ¼ÿDøyâi,ô‹h#µ»Ù=Äè]þÎÐNÞ À.ê9ïP1¹YºøNüÿC^‡ÿƒøª¯‹<«,^ ðär/™µÒöG˜ÁäÁÏñ0 }HÉæ€9ý[SŸÄÞñ&´Z{Òí.™°Ô¥RÒ,;ÌÅ¢u¦0ê @¤  —^*þÀ×¢Ðm!»0ZÜZÁ »Šêáç2YËeQ±ÁrÅÊ:›A:Ä¿–Ýí×[ðÀíÖÕãVûZ,dgfz ÇÖ£º×~_j0j7š¯…./ ÛäÜÍqnòG´î]¬NF $c¡  ½KÅ#¸Úé÷m¤º}í•¥Åדç¥ÓMr±y€¢ ÙÝóy‘«s%›ÏxŠëÄš­µÐñç3Û˜–í­RßÈ&ÖP£v7må¸Åh\ë¿/ h.µ_ O oÌrÜ[²î$~ þ'UcêÀÈ£ûwáÇöÇö¿ö¯…?´ÿç÷íþwÝÛ÷ó»îñ×§Íßx‹ÄÃÜ7•£Kö-zcq«C"‹Y1Èí!›vîNG'.}R¸õ×~/Ú6ê¾ió|ü\[þ÷ÍÛænçæßµwg®ÑœàV‡ü'~ÿ¡¯CÿÁŒ?üUtÏøËþ@vßöÓô¶?á;ðý zþ aÿâ«Äž,ðÞ§§ÙÙØxƒJ»º“UÓ¶Cìr;bòp äà î(¢ŠøƒÇòPüKÿa[¯ýÔQã¿ù(~%ÿ°­×þj(ëÿÉ<ð×ý‚­ôR×A\ÿ?äžxkþÁV¿ú)k  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(®~ÏþJ³ÿ`«ýw]söòPõŸûXèÛºè+Ÿð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–€: (¢€ (¢€ (¢€ (¢€ (¢€9û?ù(zÏý‚¬?ômÝtÏÙÿÉCÖìaÿ£në  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(®~ÏþJ³ÿ`«ýw]söòPõŸûXèÛºè+Ÿð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–€: (¢€ (¢€ (¢€ (¢€ (¢€9û?ù(zÏý‚¬?ômÝtÏÙÿÉCÖìaÿ£në  ÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(®Æ_ò¶ÿ°®›ÿ¥°×A\ÿŒ¿ämÿa]7ÿKa ‚¹û?ù(zÏý‚¬?ômÝtÏÙÿÉCÖìaÿ£nè ¢Š(¢Š(¢Š(¢Š(¢Š(Ÿñ—ü€í¿ì+¦ÿél5ÐW?ã/ùÛØWMÿÒØk  ~ÏþJ³ÿ`«ýw]söòPõŸûXèÛºè(¢Š(¢Š(¢Š(¢Š(®Æ_ò¶ÿ°®›ÿ¥°×A\ÿŒ¿ämÿa]7ÿKa ‚Š( ˆ¿ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º àü¡j3xÃÒ§‹5˜ôËfX£ŠÌªü£tàtä“êMXÓ^×Y¸k}/âmÝôê…Ú;YtéX.@É 8É>âµ< ÿ$óÃ_ö µÿÑK\^™ xš-+À÷rInìlšKvÓÚ²JÖNÜÈYÜ (•DygRyUZë.´Ë‹#íž=ÕmüùV|å°O2Fû¨¹·åŽäÕøGµOúõÏûóeÿÈõæúzx›^ÕtëŸìýVÚkic¸u ï<µ¹{[Âí)1Å…Þ¶ê˘Ô1TÀ‘”èi~"Ö4«ø§³×,ã–])™dšèM¹î±tDE?vrÄ<´+€MwðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_üX ½øQÓâÔ¤šËSÞÿ`YduˆÃ(b±¦C?@¥ÁL° ò3ƒ±àù¥–QÔ…„W»,´c™e1y13s0óy­. gÐpÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=tP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz§ ÙOcã­n+NïPs¦X°–ébVÍ»ùG–ˆ1Æzg“ÏLu•ÏÙÿÉCÖìaÿ£nè ®Áz£7|=*x³YL¶eŠ8¬Ê 1/Ê7@NNI>¤×y\ÿ?äžxkþÁV¿ú)h/M{]fá­ô¿‰·wÓªhíeÓ¥`¹$,ã$ ûйu¦\Xùlñî«oçʰCç-‚y’7ÝEÍ¿,pp&¸;#Åú„¼©ÅwWš]–Ø,àÓšíóhÛ÷»y¤¾ÔhÕv*™^2À…nZÚkºÄ:tñÚ_C=†·1ÓÒîâôÇ}™ZW‘c•ã3ðY×£4`•8 Çü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#פ]ø‹XÒ¯âžÏ\³ŽYt¦e’k¡6çºÅÑ4qýØ]ËòÐd®5¹ãH/müU¦êÚ|Z“Ï™v›­VYáàb Çæ˜„ûƒkH±ƒ«€ ÏøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG¨ü4²Ãª °Š÷eöŒs,¦/&&nfc5¥Álú¤ þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈôÂ=ªÐç®ß›/þG®‚Šäô)ì|u­Åq©ÝêtËÝ,JÀy·(òÑ8ÏLòy鎲¹û?ù(zÏý‚¬?ômÝtÁø/BÔfð/‡¥Ok0#é–̱G™T%ùFè ÀéÉ'Ôš±¦½®³pÖú_ÄÛ»éÕ ´v²éÒ°\’q’}ÅjxþI熿ìkÿ¢–¼îãHñ~Ÿá/jqGÕæ—e¶ 84æ†{|Ú6ýîÞi/µ5]ЦWŒ°!BòëL¸±ò>ÙãÝVßÏ•`‡Î[ó$oº‹›~XààMXÿ„{Tÿ¡Ï\ÿ¿6_ü\=­¦»¬C§O¥ô3Øks=.î/Lq§Ø•¥y9^3?z3F S‚i~"Ö4«ø§³×,ã–])™dšèM¹î±tDE?vrÄ<´+€MwðjŸô9ëŸ÷æËÿ‘èÿ„{Tÿ¡Ï\ÿ¿6_üX~4‚ößÅZn­§Å©<ñi—iºÕe. Ì~iˆO°H6´‹9Ú¸Øð|Ò˨€jBÂ+Ý–?Ú1̲˜¼˜™¹˜yŒ<Ö—³è8 ?áÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=SÐl§±ñÖ·Ƨw¨9Ó,XKt±+æÝü£ËDã=3Éç¦:Êçìÿä¡ë?ö °ÿÑ·tÐWའQ›À¾•ÀÌ­+ȱÊñ™ø,ëÑš0JœãþíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë‡Ò.üE¬iWñOg®YÇ,ºS2É5ЛsÝbè‰8Š~ì.åˆyh2WšÜñ¤¶þ*Óum>-Iç‹L»MÖ«,pð1cóLB}‚Aµ¤XÁÎÕÀçü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#Ô~šYaÕ HXE{²ÇûF9–S“731‡šÒà¶}ÒP?ÿö©ÿCž¹ÿ~l¿ùøGµOúõÏûóeÿÈõÐQ@ÿü#Ú§ýzçýù²ÿäz?áÕ?ès×?ïÍ—ÿ#×AErz ”ö>:Öâ¸Ôîõ:e‹ n–%`<Û¿”yhƒg¦y<ôÇY\ýŸü”=gþÁVú6îº óÿ é7qü<Ðïeñ–«ejºU¼¬6YˆáA“ó<…»ÀäÖ†™zß›ý“ñ"úÿÉÇ™öFÓåÙœã;`8Î_CTà‚k¯€Q[ÛÅ$ÓËáp‘Ç–gck€’OªzîŸâ7Z¹×"h5MtIãì¬ º¢¤Ñ;¦OœÏ3©o,µYÈÛš€: ­2âÇÈûgu[>U‚9lÌ‘¾ê.mùcƒ€95cþíSþ‡=sþüÙò=pö¶šî±Á ÚÒ,`çjãcÁóK,:¢© ¯vXÿhÇ2Êbòbfæaæ0óZ\Ï à$ÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈõâMþÓO³žoj·±®«§f ãµù¼„rRn:ðGON+¸®Æ_ò¶ÿ°®›ÿ¥°ÐA\}ÆuñTû6³}¦ìÒ¬w}‘ o32Ýã>loÓ±ÔçU‚9lÌ‘¾ê.mùcƒ€95É隉¢Ò¼w!´–îÆÉ¡´·m=¡û$­dáMÌ…ÊTG–u'•U¬½=_™å†b8V`HVl€hÂ=ªÐç®ß›/þG£þíSþ‡=sþüÙò=gø6ö{­Fÿjk‹bm-fÿ‰ÄÇ'Ú\Ëç¼8ecýÚŸºN{ çÿáÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ùº (Ÿÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( Äš5ý¦Ÿg<Þ&Õoc]WNÌÇjóyä¤*ÜuàŽžœWq\ÿŒ¿ämÿa]7ÿKa®‚€8û:êÿâ©ömfûMÙ¥Xîû"@Þfe»Æ|Øß¦;c©ÎxÄzkÚë7 o¥üM»¾P»Gk.+È!`' gÜV¥Ÿü”=gþÁVú63@ñ4ZWîä6’ÝØÙ46–í§´?d•¬œ)¹³¹@P#*ˆòΤòª´Ö]i—>GÛ<{ªÛùò¬ùË`žd÷QsoËÉ«ðjŸô9ëŸ÷æËÿ‘ëÍôôñ6½ªé×?Ùú­´ÖÒÇqêÞykrö·…ÚRc‹ ½mÕ–51¨b©#)ÐÒ.üE¬iWñOg®YÇ,ºS2É5ЛsÝbè‰8Š~ì.åˆyh2Wšî?áÕ?ès×?ïÍ—ÿ#Ñÿö©ÿCž¹ÿ~l¿ù°þ'Az!ðþ£§Å©I5–§½þÀ²Èë†PÅcL†~K‚™`ägcÁóK,:¢© ¯vXÿhÇ2Êbòbfæaæ0óZ\Ï à$ÿ„{Tÿ¡Ï\ÿ¿6_üGü#Ú§ýzçýù²ÿäzè( þíSþ‡=sþüÙò=ðjŸô9ëŸ÷æËÿ‘ë ¢€9ÿøGµOúõÏûóeÿÈõâMþÓO³žoj·±®«§f ãµù¼„rRn:ðGON+¸®Æ_ò¶ÿ°®›ÿ¥°ÐAEPÄ;ÿ’‡â_û ÝèÖ¢ÿÉCñ/ý…n¿ôkQ@_øþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]rþºûÂÍóìóÜy%¼¾Mºo’M°)Ú‹ÝŽ0sBx÷G¸ÕfÓ,D÷·qËJ–á ËæZ½ÌlŽX)VHØŸ¼9ÂÕcÀŸòO<5ÿ`«_ýµ_Bð…áË«9ôøç_²E,0Ç$¥ÑUåyàÿy²ª·ÞÛ#‚[4xæÆMF×ì²ÆÚoÚÒòâaå%ïpA,AR‹YF ƒækLñö±7…íîµ[H,u8ôýBûP‡ìÎZ³•Ù’ά–h¤ù˜eF8Þz ü¥ÝørmêâúãN¸ò ñÉ6L‡g-Œ†¨/‚2w0 ÌÌl\ø;K¹ŸÄs~þ9¡ Á¶:yvuŽ9Îb‰T,’–Þ›©Ëà8#|Bú±Ú}2Öi"Hí0ñI×X‹¯X/æp¼†ÉÎ\$Öm.Å3G-ùÔÍì3Æ ¹`¦Þ8J7™l¨AÙœÇÝC’Fh¤Ò\RHfWÝ-L!ÈûÀí}{†Ú—ŧÉ}kåÚOi ÇpwB²<Ž®„ƒ‰#ó¥T¼F¶kCPðv—©ørãÃ×>{i3K‹e}¢$GG!+S¦~PÅT¨ —Ó<}¬Má{{­VÒ N=?P¾Ô!û3–ƒìåvG䳫eš)>fQŽ7†]Æñ¬?ÛÐEäI%”÷ |èºd’AV.À™H'ÎJlÜ&åσ´»™üG7ïã“ĉk|Qú…GŒ2ä6×ǧÊ8ÎsŸ/€àŽòu éþÇhmôËY¤‰#´ÃÅ${]b,v¼`¿™Âò'  ñ•µÈ¸Š 7R}Bƒltó,ìër9œ&Ũ.X)$-½7Iá§ŠQ’ÞÆxm-¥ ¸‘—(ñ$ªáAÜ¿,ŠpÀpËÑ·*óp|8“Y´¸oÍ·çS7°Ï‚å‚›xá(Þe²¡fp#uI®£Ã~¶ð¼3Agww,$ åÎP„1B†T²Æ™É##€2hŸ³ñõÛáÓ$¾»Ô쬧{{@‘”i¡¹”•i$‡ú9NÜw1;Gia}o©éÖ×öry–·Q$оÒ7#Tàò2ë\ßü 6Q 5¬õ=JÒ}:ÞÚÞ â13‚9ãRCÆÊI[‰3Ǧ1Žw4%4{8­a¹žXc‰Sí%Ü/+0PZG-–$òFp 9ТŠ(Ÿ³ÿ’‡¬ÿØ*ÃÿFÝ×A\ýŸü”=gþÁVú6îº åü'uö…šçÙç¸ò4Ky|›tß$›`Sµ»`棈z/öŒ¶©w}hZ\ Ÿ%õ¯—i=¤/ÁÝ Èò:º$ΕQþðYÙ  ã+9[M¾µšÑn®î-ñØ>\RHfWÝ-L!ÈûÀí?¦xûX›Âö÷Z­¤:œz~¡}¨Cög-ÙÊìÉgV Ë4R|Ì2£o ½F¡àí/SðåLJ®|öÒf–7ÊûDHŽŽ"BV<§Lü¡Š©P)sàí.æÍûøäñ¢Zß~¡Qã ¹ µñéòŽ3œ€SoÃý½^D‘èòYOp—΀‹¦I Dbì ”ò|ä¦ÍÀ‚lAã+k‘qn¤ú„7Øéæ4YÙÖ8är78MŠ%P\°RH [zn§/€àŽòu éþÇhmôËY¤‰#´ÃÅ${]b,v¼`¿™Âò'9p|8“Y´¸oÍ·çS7°Ï‚å‚›xá(Þe²¡fp#uI “Ã)O6£%½ŒðÚ[KAq#..QâIUƒ¹~Yá€á—£nUóñõÛáÓ$¾»Ô쬧{{@‘”i¡¹”•i$‡ú9NÜw1;GAá¿ Ûx^ ³»»– òç(B¡HCªYcLä‘‘À5Ÿÿ ”CMk=OR´ŸN·¶·‚xŒLÁ`ŽxÔñ²’VâLñéŒc’ÂúßSÓ­¯ìäó-n¢I¡}¤nF©ÁädÖ¬V~“¤¦g¬73Ë q*b]¤»‚Ååf Hå²ÄžHÎ':W?gÿ%Yÿ°U‡þ»®‚¹û?ù(zÏý‚¬?ômÝtËøNëì? 4;ϳÏqäh–òù6é¾I6À§j/v8ÀÍuÏøþI熿ìkÿ¢–€)¿Ä=ûF[ T»¾ž+ˆaai–Ý®U üéå£ð¹bWNW27Œ¬åm6úÖhEº»¸´kÇ`ùqI!™_v<µ0H‡ gï´ õì>hZ\ Ÿ%õ¯—i=¤/ÁÝ Èò:º$ΕQþðYÙ­ CÁÚ^§áË\ùí¤Í,n-•öˆ‘D„ ¬yN™ùCR (P_Gñö±s¥hÚ¶XêwR°Ô û3î‡PB‘ùlá‘™n¢}ÌN¸cq¼köôyG£Ée=Â_:.™$@‹°&RÉó’›7 ¹7ƒ´¹umGR|wŒ¶S\ì~ídƒŒáTã¨`äœù|p/“¨_Oö;Co¦ZÍ$I¦)#Úëcµà‹üÎÙ9|@Óq¨±Ô’M1ÿâcB¡­#«´¯ó`  ´±}ŒcªZµ4}r]WSÖ¬äÓg´]2ì[,²HŒ'Ìhû€RHáÁÁìËßr¯¿ —]kûÏÜçR¹–AçÛýžwhZ(Pw¶PLD©DR»ŽI5è:JXjz¥ìw3¿öŒ©4¾Ý‘ºÆ±åp¡¹TLäžœc' ž‘ãë»ÍKºm2Kû»Ûˆ-ÞÞÐ$Eìì•ó$ÓՓƒŽJåûK ë}ON¶¿³“̵º‰&…ö‘¹§‘GZæí¼ec§ÚÚØjz•«ÚÜEq™Ã% ´猩5çåêIà Í'IMÎ+Xng–âTÄ»Iw‹ÊÌ‘Ëe‰<‘œN@4(¢Šçìÿä¡ë?ö °ÿÑ·uÐW?gÿ%Yÿ°U‡þ»®‚€8½'R›Fø'cª[¬m=—‡#¸d©d¶ Á¢£—âÛ3w¼ÖºV¡uf&ËÁuja qÇGí9ùXpy¹á­6gá‘¥Ü4‹î… ¼‚¼IgÐÕOÁZn«ªjòÏwßé’é³G ª¦Ù6†” §÷»QqÏ£ ŽãÆöv‰h×V³Ú´šÓîaœƒ%¼ŸgiÔq#0…T$“ xmªsøºú/-¬Ëi§¡¸·‚; A|¹îÄ‚2ï ÆAÌ„ÐHI‡˜¸¹'l/Æ«{}©É,¬òËrÑ«ºy ò³.# ,Œã ìÙÉ9/üº¦èµ{U»±–X&žÆqnðÌÑyx²Œa™Tª’[dÐxü}gÅÄ76—ÒGo+$×PÛ‘fêkx—`v‘Ùž£bœä.¥§Š-¯¯tëH-.Ì—©rÍ€[wXåY>nH‘‚|›<ƒ·æªñø+MŠK—Yîóqq Ãå׆ŽòKµåéæJÀÿ²àònXønÏO¿†ò)'i"ûfÐì?ig“Ïgä“…÷>G•Ï—ÉBAL‚7>à ËoXÞ_Û[à ߓrænž-‘´êŒíUœ®ÐUà­W»ñCiþ/—K¹´Ø {Fq…")gšX•_-¸†dWjœK9úWÃ=Hñ¾·ÍÛÝÂþa2¤¥“ÈòYÞA‘‹]†ü%±“[ø^Úêc=ÍÝܳºX«ÈJæÖf™€ e™Žì1Ð-W·ñ®›sa5ÚAv¥¼FÈ»®£¸r–îŸ6‘P©^®sUõíJ[–—p¬ˆ±aÇ £‘/âGC‚FU•— qHÁ¬»_‡·°xVÆÊMjyµ8"ÓáYŸË)fM’ Ý»?Œ6í‘îûµ¡­i)£øbEÌ÷SK­ØM=ÕÎÓ,Î×ÐòÅUGjŒ…U€(°®NãR‡Iñž¹{p²LÓDŒ€~íZâéK¶HÌ{*±í]erïco©øËÄV‘ù–·Z%œ3&â7#Ixdr2 é@ÅñEšõí‘.ñÅÝ½ÜÆ0ÔÛ¼hí!ÎvfXÎåÙm¡XŠúŸfŠÃíštÉîq}¦‰†’XÞ5ˆ`6XLg‹jü®:¹°¶,þh¶6ïOvÉ%½­´žd·¤!‚À¤Q$ QF3Z~±Ô-ô˜/¦»ºM*õo­Ì²å‹ qvêÁwŒrvžl€súŽæšëEPkK4–Ê)uc8Iš+–‘ .<‘ZHps“´…ÚMhAã&}gP¶ŸM»‚(íížÆ #Qqxò´ãåMü°ƒ‡P/´Dà Òò&Žsoy¨O¨Ošv¼“[´ ýà¥]›ä1àUï|t<ýFßW¾¾Öÿsök‹¹`‡ÉòüÕॹ^RâaóFùÜ:±cãÍ/QXå··¾6ÿk6sÌðìÒ™L(’+Áñ…²‡RáQéþ8v¨óhz”7 quÙSË™Ä6òùrMò·!X¨(»œ’B«¸áèß -Vâ×VÕæÆ²·jíÒºÝI:1‘ W݇Ub›2 ` ؽø{ky°ÿmj±F÷rݨ_!¼™ÞLž&òÙZI ºáþnX…M +KÙnSWÔ˜oº–ÚòJZK;—yc^K‚ιlaш %Q@ÿŒ¿ämÿa]7ÿKa®‚¹ÿÈÛþºoþ–Ã]rw”:OŒõËÛ…Àšfš$d÷j×J]²@ îcÙUj"ø‡¢ÍzöÈ—x‚âîÞîc jmÞ4vç;3,gr‚l¶Ð¬Dco©øËÄV‘ù–·Z%œ3&â7#Ixdr2 éQÙü<ÑlmÞží’K{[i<ÉoHB)€%H¢I@:¢Œ f€1õψ”Z&§s ØÇwvÖöwzL/ 3ÝG3ȸòÕ·1Ù’Œ`…a¹AFÎÀñŒ-©»5Õ¤zZÞ­ªNuuû»iL›Âªm+ƒ†û‡®ü¦€ð­‹jš>£q5ÝÍΓ¥›Ï.â¢\¸õrv‚Ä’ -¹¾j§€4(<=e ,s2Î[‰#€ÊyY’dd-÷¶…Àçw Éç Áã&}gP¶ŸM»‚(íížÆ #Qqxò´ãåMü°ƒ‡P/´D–><ÒõŽ[{{ãoö³g<ÏÁm)”‰"± ßP (u.05^÷Á×CÏÔmõ{ëío÷?f¸»–|Ÿ/Í^ [•å.&4oáŒ}áEªÜZêÚ¼ØÖVïíS½º@âW[©'F24 û°ê¬SfBŒ@šŽݪ<Ú¥ Ã\]GöTòæq ¼¾\“|­ÈV* .ç$ªàn6¿ð'ü“Ï Ø*×ÿE-tÏøþI熿ìkÿ¢–º æàð6‹ko½¼ºÌ0D#Ž=nõU —Æ*OøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǪæ•áý?F¸¸¸´û[Opˆ’Éu{5ËBÅ@2»w8êkRŠ+›ƒÀÚ-­¼Vöòë0ÁŽ8õ»ÕTP0\®’Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè(  ½+Ãú~qqqiö¶žá%’êök–*…Š€ev îp1ÔÖ¥P7´[[x­íåÖa‚$ qëwª¨ `¸1RÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=W4¯éú5ÅÅŧÚÚ{„D–K«Ù®Xª*•Ø€ ¹ÀÇSZ”P\ÜÑmmâ··—Y†$qÇ­Þª¢€à8Åt”P?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEsÿð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtP?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿWAEeé^Óôk‹‹‹Oµ´÷‰,—W³\±T,T+±sަµ(¢€9¸< ¢ÚÛÅoo.³  Hã[½UE%ÀqŠ“þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê?á Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñêƒ46$}Vo&T™}bîTÞŒIF”©Ã(<ƒÒº (¬}CÃn§¨›ùÍôwMÂÏi¨\[nE,T¨8.Ý}MlQ@ÿü!º_üýkŸø=½ÿãÔÂ¥ÿÏÖ¹ÿƒÛßþ=]ÏÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@?‹<7i¦x7\¿³¾×#ºµÓî&…ÿ·/×XØ©Á—µ±ÿn—ÿ?Zçþoøõ;ÿ’yâ_û]覮‚€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ñàÍ#͆IU›É•&DŸX»•7£RQ¥*pÊ ô®‚Š(PðÆ›©ê&þs}ÓD°³ÚjÛ‘KDê ·_SUÿá Òÿçë\ÿÁíïÿ®‚Šçÿá Òÿçë\ÿÁíïÿ£þÝ/þ~µÏüÞÿñêè( þÝ/þ~µÏüÞÿñê¯á½LÓ®oï/µÈímby¦íËãµÇ\œzWQ\ýÇüO|Gªóa¤Kæ]À’ëb´Iƒ÷•O0ð0þIRJ°½‡†æ±Ôm®5ëíq-u8yÛ—^^s‘¶ë)/¼>Ýìq¾>1梣þÝ/þ~µÏüÞÿñêÔÕtØu}.âÂv‘dÀ’"ÄÝUÐvº° §±öªú¥5ý½ÌW‹_Ù\5­ÒÆRÀWœ£“n[ný¤’¦€)ÿÂ¥ÿÏÖ¹ÿƒÛßþ=Gü!º_üýkŸø=½ÿãÕÐQ@ÿü!º_üýkŸø=½ÿãÔil2Hú¬ÞL©2$úÅÜ©½:’)S†Py¥tPEPÄ;ÿ’‡â_û ÝèÖ¢ÿÉCñ/ý…n¿ôkQ@_øþI熿ìkÿ¢–º çü ÿ$óÃ_ö µÿÑK]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsþ;ÿ’yâ_û]覮‚¹ÿÿÉ<ñ/ý‚®¿ôSWA@Q@Q@Q@Q@Q@sçÁšG›4‘¾«+Ìé±wov.Ä"Êe˜žë]ÃèÞ´»Õ|C ÷ÚãÇi¨$0íËÁ± ¬ļüÎÇŸ_LWA¦xcMÒ5oíMó]K…ÞçP¸¸Ü€’$vØôÜØês_Ãßòñgý…cÿÒ+Zè(¢Š(¢Š(¢Š(âÿÉCñ/ý…n¿ôkQGŽÿ䡸—þ·_ú5¨ ¯ü ÿ$óÃ_ö µÿÑK]sþÿ’yá¯ûZÿ襮‚€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +?\ÔŸGÐïu¬ç½š™ãµ‚6w™ÿ…UcÉÀÎ:ž®Oáåìm¨øšÑ¦Ô®.$ÔÍÓÍua< ó[ÛåG˜¿ HXÉ,/Qó ÏÿÉ<ñ/ý‚®¿ôSWA_6|uøƒ­7‰î¼'g<–Z}¢(ŸÉ†º2F‡#&×Û³¡äœðà/Äk]½»ðÞ±<— v»†òy J£z©F'–|‚NFä`(ºQEQEÉÜé±ë>:Ômîîµ%‚ßL³x£µÔg¶PÏ-ÈbDN ’Nz ¹ÿn—ÿ?ZçþoøõòPõŸûXèÛºè(Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€9ÿøCt¿ùú×?ð{{ÿǨÿ„7KÿŸ­sÿ·¿üzº (Ÿÿ„7KÿŸ­sÿ·¿üzøCt¿ùú×?ð{{ÿÇ« ¢€3ôËDŠxì–ô‰|éž{™'w}ª™/#3}ÔQ×µhQEQEQEQE|Aã¿ù(~%ÿ°­×þj(ñßü”?ÿØVëÿFµõÿ?äžxkþÁV¿ú)k ®ÀŸòO<5ÿ`«_ýµÐPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPY~ ÕfÑ´ŸµÛÛGs;\[ÛÇ’˜”´³$@– Ä_=JÔ®Æ_ò¶ÿ°®›ÿ¥°ÐöÏÐ CÿÁÌßü‹QÇ'Š¡yž/ø}gß+.¯(.ÛBå¿Ñy;UFO`jé( ø‰ð—Äž;×"Õá¶Ðô˯(Eq‹ù%cî±ÅºÀpI' (ãÜømðËÄ?n.ï–¨j 䉎«4KY¨O³œ’Ê $öÎ}’¸}bÊ7ÆV×K&¹Ùãúhø9›ÿ‘kŸÕc¿ðãÞÛh^#ŸÌ’ïLck©$—¿fI®<†+#¸b¯·•,vì|m. ÜѵKRñm¡ºž1&±C ².Ø.à… ‚Ä3à9ÝÇß Î@$†ßÆx†÷VþÈÐÏÚm ¶ò¿µæù|§™·gìÜçÎÆ1ÆÞùãCíž0ÿ ‡ÿƒ™¿ùº (ŸûgŒ?è¡ÿàæoþE«žÕfÖtŸµÜ[Gm:Ü\[Ér™T4SÈî_.†eQ&YÝ6.Æ@®=¥î¥¯iþ*·µ¸Õth´¹-îo¤y,]Z(axRæ}¹Û/ßÚÛ¼à\OYþøÜYßZ,\’µÄA|»y7„¸q»)1°!€tÆ]QA`çz;ø£GO éƒNÔ–8­ôÏ*E’í–$‘]$©å2#ü°¬}öSÉ¢ê1ß½ð’ëP¾ÜežPëžEË9Ìkå„Û³¡œÖ·ñî´ÕÑ4Y.¯n$²»º•ßVÁ^¹\ÞŸâ†ÔüGŒ’Ehɨ+<ÁwHöÓÃäÚÇYä0íu,¼PÏâGG»´’8ÒôZYÝ(]’?ÙcœÆß1mø26v…ÂÜ’ŠåáñÕ…ÌQýšÊúk‹)¬í•cw‹#Ç*áUY!•°ìŒ6T ôÖúžmg'™kuM í#r0N# Ž´bŠ( ¹ÿÿÈçþº—þ–Í]sþ ÿÏý…u/ý-š€: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€> ñßü”?ÿØVëÿFµxïþJ‰ì+uÿ£ZŠúÿÀŸòO<5ÿ`«_ýµÐW?àOù'žÿ°U¯þŠZè(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®Æ_ò¶ÿ°®›ÿ¥°×ATõM.ÓY°k+Ô‘ gGýܯG¤2À†Pré@ÞhÖwúŒW—Iæì´žÌÂà4rG1Œ¸e#ŸõJ=0NAíÍèŸ ômÂîÊÞæíà»KhæVHÌŽ,¼¸Ô8pÌ®_qe$ZŸð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõGàÛm@éí6¥©o°I󘆒9s2Æ7†"¤òv|ûòÙ%ð|W6·Ku«êSÞ\=³öòD¨ —͉UV1–<¡'q‘ŒIÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPx^ÚÖa=µÝÜS¢_*H †êe™Ø¤eYFÜ‚1Ô5IÿÝŸö¯ö™?ý¡ý¡·pÛæ}—ìØé÷vsŽ»»ãНÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿP7cðçP¶´ðËIâ ³¥¤Q´ãÉo²Æ¶òÆÉl 8Ã4‰’à–T\œª×q¥i°é]½„ #¤)ƒ$¤•º³¹nvbYrIïYð†éóõ®àö÷ÿQÿn—ÿ?ZçþoøõtW?ÿn—ÿ?Zçþoøõð†éóõ®àö÷ÿPA\ÿƒäsÿa]KÿKf£þÝ/þ~µÏüÞÿñêÔÒô»MÁl¬’E]ß÷’¼¬YÜ»ÎKY‰É'­\¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(âÿÉCñ/ý…n¿ôkQGŽÿ䡸—þ·_ú5¨ ¯ü ÿ$óÃ_ö µÿÑK]|qâÏx“Kñ–¹§iÞ Õlìmu ˆ-í­ïdŽ8cYUAT€cÿÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPÛôWÄðøÃþ†½sÿ3ñTÂwãúõÏüÍÿÅPã¿ù(~%ÿ°­×þj+y溸–ââY&žW/$’1fv'$’y$žsEÿÙÿØÿàJFIFPPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀêò"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?ÿÙgspiceui-1.0.00+dfsg/html/ScreenShot2.jpg0000644000000000000000000027216411633504770016644 0ustar rootroot‰PNG  IHDRwÄ$x^. pHYsÄÄ•+"tEXtDescriptionWindow Class: gspiceuiŽXÁSvzTXtTitlexœÁ±! Ð_騉¥`dtº¸¸˜s'µZôNŠñ÷}oºÌpµÊÓ|ÞÁMº×örÈG8-¦6é@)Ò>ƼÒ¶ ­þ#ëí%<œžn•å[ÉYÉ]£“9˜ ;c½KY¿Ç¼A$‰®úz IDATxœìw\S×ÛÀŸ{o$!ì-2EDpà^UTŠZ«V­ÚjûkµÚj[W}[­ØZÛºµµZ»´µÎºµ–º.ˆŠ ‚²7ä®÷‹1f!aõ|?÷£7çžñ<çœ{xòœ¬Ïä ÁÅí @ xAX–ÕüÈSßqö¥Öã¦[“âæÔÔR @4ù)윖mü`Æd­•yqû.¨¤°°©$ÓÄåÖî|ßÔR @4.·v—Îhj)˲%……†qV%žš˜ÍľD @´D8cr÷Ö­œ¡‰7µ<@ ˆVŽ™@ s1(:šsg"_¦eaç±s‚­šZfĶNLTÜ,õó¿P;vNм® ɤe1¸­˜´a «…òÿÏöÛ†Ð:*ÍrZ˜+ç†çcIŒgå-~ð–ýq;'(ÔIØ‚‰“«þAÕÉÕ5?/¯Îä¼:c)Š LÉ¡p²&uwî'ñ²á‘ ›Z¦ÚZ¹"¡¸[÷J”a¿g2,„;[Ýzð5)ê§鿨×ÓZ÷i´¯¤BI§ÛÚËM¨7¹ñÊW'Ÿb[TZ¶óbRiEe”·øÄ+.V*™ñäFi£ä<ÿ ››Þv©j-Ì•a½àW5«‚ê|ÓÁ|/»‰Ã—…êʼC–‘œ-$£u!ãøÙñ`Éöã Þ|$ðЬLCí«ÙÇš‰PWo4>Øšµýg¡ü9voݪYœÖ½ú©Lòe𒑉X¨F¾èåä-å'däŽ]þ[5T6nwƒlXë’"¹kíÑS, GDþ¹ñ¸´¯GÚˆ`îO.<,VÙ¸aô ¦’°ñWîûͼs…ÓÃì¼løûÓeïü›WC±PûÕ'Hý…æ¡v³"ìƒ4Ë&*{ïÊâ2¯“Ýì‡;~…’9.›¾°BÉÔCdž³÷lÃ7ÇHŃñí¥°7>I)õ˜ÖÅU¯œ\ Ì?_øNG»vvbM2`xŒŸä›>Îí$æ—‘_\©õ9iÖ 0§‹ÃŒNöm¥¼âzwjå§‹4ª>êã³áâ)ùó­<6Ð>Þ¼ï|FQÎáGß¼ ³í©ýOT6®&Fóð`þÏ.f–F†wüûƒ([kÛÌ‹¥ÁÑZ"M–À¬üŽÞnczv\|>Næ¦ÇHŸáèìï¹bXÇŽ."MÅ£¼Å«ú¹øÙñ­yxI ÷¨jιÂâmó+þ¸|ÿ¡JêÁ<ðÜ’ît÷pѯz~s¡››ÕÒ^NËþ½;¬ƒÖ£_ñÉ…Æ÷Ø’átïˆnr㕯NÞm{fvÜï¤ØÙÃ3óîâQvâÙí˽$7òÈH{"€aÛ‹þ>"kÓEWÙz Ö‚û¨·]êìÆ /½ngÍÃçœ+´"°¯ú8csÎþ‘\ÁekdP  ú¼oYé}éæuuXÙÏecbÙ§ >îâ°¦¿ËŠ„ÒO..îáôE/§Õ7Jç+Ô-Èð€¦ý¦×¥þ³ЈšzÇFõÁ§–M‡§³O†M[ç_‡xŒigóXFnL,[?еÎä–Æ5`úfҞ嬖HGŸoúºèÕÑPé†:§‰-k<í—ÂpÊDÝ”'¿œö¼úÚí«·™¨…qÁ41>–šÞu14ت;ØêzfÛ^Δڽuëø©S_È£©eƒÕ™0$<œ+žz45MÌðð:K4É—9~êTC—‘T§ŽwruÕ¼8•,áàñ•ÀG/Èø¶¥Á/ËÚv“µí–`Yî×Oçà•»Þ.öÓÛÚœ)äVSðãûcV½?iü˃Ä!}ù Q8ø¨#|.¾ð ·ºF11HúM(‰1Ïþös_hfEØÿ<Ä-ÔQ—˜¾ïbb¾ÒþÁ)˜a¿i›ÙqñnVNÞ»íö ’`4YN™‚þ;Sc»úñäe½Äîb^e2îfêÿ^îk\Îe=nd澞꒸~êä Ø5eÿÅDª²¸ “-,¢U'óº:¬êïâ `w\HRUË>êìð[¡fÕ}ÓÛ!)»0»¨<ÌYøso+^M…–À‘nVp;3·Ê#ôø€«$€ÌÑŠ&§Xˆðó$ýz„„…@¸Ÿ§¦¸ÎhŸ^,RQôª·G,ŸñúºIýU4»l÷IBU£•ƒÀƶ³€%ƕ˕mœl8ìoFúLìëCîæ”f?§¸‡„W$“ï½toû™›åeot°ýµ—@×ÁÜÕÍ ä©l\ÔÅ¡#uðñ/{ÆgWþ¸sŸÖ#Ž õÿ›ø@)u Ó›ÜHåk&¿^¨,mUøRµ{G )º¨¸˜PÊŒ$7òÈHq‹<¤^¬yüÏUh—:»ñ¬‚{9%NÖÄσ]u³½žUâdMlèdW™ FG]Œg¥÷¥ãŒï~öJ›'7z{XÀÛjIîmîþÖÙ8IN¢nAF:§Ö›^§úÜËnDMCcãú›e\û/Ýù)î*7ûdh`ÑTai/—ÉÁÒ¥êêí{‹»Úp™O^§Ö ƵÜZº3išòÿ6ÌC¯†J7Ò9_¨eõæ ‹ñ:Ô›‰Þ¦Ô¨·™¨…qÁ412–¾PoÔ‹ÞÑR-¶¡G¦£619,éÑtswW—Ï{1CÂÃÝÜÝëÌÁ$_¦:SÍÆML.ÂÝÄDÍÐðpSÖŠÖ9%•r× ñÁö;c<¸pÍU?ÿ{µgˆßܘî×w'ø½hÓOäort±•LLPÑÌÌŸürÿÙ¬ë’q{¯¥]ÜgˤޯExvìï*ÏNš9|ÜÙbwþ»åŸ«J»6øádœ¬€:;ÀÝŒl¥Ru«@Þ%ytÚy.Ñ6âEu4 ÛSª^mgûJ÷Ð…§¿ G®ÞS²ø½ýŒËùÍ_g6¿¢´o‹Ùy€ÇªÊ¯ß½]ÉO/Næ+*x6nJh£YÖûáö°dûß;/Ý ‹Ÿ3.ÂgÁžÙ.¹_ì<ñË雑‘‘GßáíbóxYà Íl…Ô¨HJä ¤jí9;†“r†/RGûòJñ†®‹' ^ü4Db%à˵¿S‰v<³êu?~oÇw€+i9§î<¬òÔvRÆøIì­ˆâJù唬céå“Â\ÇGþs¾”¸€Fú̲Ý'9}+2²›¦â¿ß«(ËÏéé6ñÂêvNÛ»Ûü|²Â··f¶VT)T´Pª[¨&¹Ú ñQw)DNZzyXÛˆó×nªìµ}œjŒT~/_'Íä”ÈÁF€ÿíŽ^¬¨!¾µ‘äFi£JUmL!†“ †¯ºÏFäÎûÒ«[ zÛ¥în¼ëä?÷ždýð¡€G|µãøñ»ÙÙ?|$òCU™ñŒ§‘@WãYé}én(d*ºƒ—«-YÙÛÃ:½°"ÜÏÃFYÞÃÝšaÙ«²H÷HÝ‚ŒtN­7½Nõk«Ú°šÇƳv¶€_º^)dœÁðÀ¢©Â¤`),Ù~|וûñ¹òÍŸ½ ÆÇ%Kã&v6CB*ÝHç|¡–Õ›ƒîûb¼õf¢·)õêíc&jaH0]ŒŒ¥/ÔMLÔbQMAÓÄ䌼zx45]’u¢Y bº‰ ¦Ï˜sžKµÕuͤïÞº5TÇ›zïy»Ó\Êi ÏÝÞ†®¥–©¾¿œõAOoxº ™‹£ ©åñy¢ý?·×LK³@`€ãðž®!)íYȳª}×?|‰—éï:¡ox€»ã7½ÿ¼xOáèËExXPZÕ&< oÎR±UY–ÖðäeÀ«©ÙUžár—@OV¨¹-_yGYE %&êh¢¦pìaU¹‚òt”qÇÆ´³€½ñI ;/#rr÷WR³ª=:Ê]j§>>[ðmOé/³^€’ê“ E¿ÜÑö0qK¤äWµ‰¸!𠃶Pþ˜®Ý1sóaN•GxŽ4ø<‚§cV(i+B$°!æ×úæe5 \B2ügѾ»U–t?m„Í#ˆk©ÙÛçN,®¬Æm‡±‘h{†{vqµúêÐÕ-‡O¾;´Ç¢qƒ~š5¾ÛÎÇZ9pÓåÿÞJ¥Á¾Gä¤0b{t_±>+ÓHŸ¹ù0§Ê£“–â?F¹½Ûñ¹5õ+ 2_+Û2ã""$V†©ã³ƒmVI՚ɃÔFðWoDÿp_õÇC*ÆWrõIey…LÕÖÍPr#•¯•ÜÙš8>Ú«‹«ÕÏgï¬ÜVîÂ|#É<2ÒFRAmÌòª\ª2der*8mÿ§ªA;@·ô¶KÝøaAI¡cpí}~q‘cퟄªÚÈ›ãë¢%€ñ¬ô¿t,\Ì©‰ö•¼ÞÆMÌ›ûוÕS†NîÚÖVˆ'eåWÊ•*±³®¦F:§Ö›^§úFÔ446j"w â6”X4Upó -¯¸Ê3"{î›­ñqÉøfÏðô¡¦ü†„4^Qz;ç µ¬Þtßãu¨7MÔMi$P«™¨…!ÁtU02–¾Po4}0Q‹ u|÷7‰:Ý|ÆyQß§›»»¦97~êTÓ-Z“¬LõÄ<·ŸHÓ”®3•fH“ìõæXfÕ»í¦ ëq`oæ­BÅÇÊ8 L‹Ÿ‹çôpµ{°f`v%ékËïäãq6—éæj, ye• }nm{Oë‹9®GXçRJ.–%ÿ3½¯µP’{[meú¹:œ.–Ú  ¨²§´ý‹e”¯-?2ÐëÌ#)ðpŒóÑ<©¢|¤ü6ØŸÄÅlãdû¤¸oç¯ie×ÑD-LAI³{ÈÞ ³_9y°xRRq%5K0ЈœÜGE“bgu>¦Tî<Ÿ îûÍ”—×öuØqîVãs^äœ*Ê[ÊoçîtºÐ&ØAÀ‰]X.#¤µµGÑ %~vÆjÏ>'ä+†úˆÃ|ÝÿyHuqµ€ÂŠªœ’JÆä €Ì RI³|;§pºt§DP™7«o ƒó÷2<+01wôÆÍäÔÇà3à¿ ¤£ôÑî²öQjaì„Ä˾˜Ø?bbÿÚáF*ŽôµúM¡gÞÜHŸÑ«øÁ¶ðñχw_HÐÑǼI€1Ú»®Ô¼ì+ pw³õl„ÒÂÛQâí þØ£}Ûsi Ve¥1~¾{¯¦’bG#;ŒT~ŒŸXÜ[Ê?1Æ«½`Õ±k+w¯q¨v5žÜÈ##mÄu¡¼2YaEã%0$6¶&E=Û%0fejhÁ…èm—:»1ð”•D÷€eŒ¼YºÏÊÐKwîIM´¯dFtO’f÷¿ñéØ3£{Àåû(k{–àëd¤sj½éuªÏaDMCc#°€æ(fHGMòª¨66<ûÓ%6œ u&¯SkŽz ã$ÃòqL*²:>*HS~CB©(0Ð9_¨eõæ û¾¯Ã:mMtÛ—C«™¨…!ÁtU02–¾Po4}0Q‹ Úˬ^ 3î“1͉rÍ5š¦¤5ÉÊÔòÊ‚iþR½OÕd^ssÉ¥âh/~ï`Ÿ[ïÙŸÌc¬ùú#vÉ•²mÑ"ÍÀ?îW|ÞÃéë7£G?©õ°€n¦TÊ•4ÿ¹hÆ{§•Ô\ÊWÕPC}ÄpîîCÍe7±‡tyP>2Ô^¹ËýÙÓdíÍÒ ]c_Ò99¿ˆ j+j÷K`Øw·ÊV÷wYùöð>=»W`¢NÎÂööçu‰´à¹Æu4Q Øž"{7ÌÞ×Õö]ºCñE¤ÄÅ9YœPßçL 8÷Ø=OÞ#ÜI²¥äI¢–•¹évù7}—½1¬Ëýâí\¹ª+¯VÐ^(Öè©®kn”ñ2f ßüÁÁî°ùøe†oÅD÷§ú@—_îÞ*ǧ…9Nho“TìÚÖ¦SŒŸ¤RA®9xžÛúcb´«y5ýÚˆÖ½;òŸ¬šÁNöXkÿà¸ö6B“Õ(ã“q!žÎ~nãz†üy0[w¢ÄxŸÑU<·šò³åOy©kXxİ`ƒoß¡Œª—}%=ƒ¼¿OËØ:ôYäOÆ œBØO9YÏ‘,€A‹~¼›•ïÜ-ÄQ8#!Iiëa$¹¡Ê÷r²ÕL~i‚·‡„÷¸¤Ò–Ç.™6‘;­¼^’SEi;#f„Ùj£þmDw3•á[rdrFŒ7ò”Ã[Ê×ÔBn»˜ÒA3Õó9z³Ú8ÙéÀHV†^º³OäÐÎÃéFf^ IÅç)GØ@üýG*½šÖÑ95Þt“Ô7¬&- ¿šró>Ÿu[n=ûb…!]|ÛkªðgJÅ'Ý—¿Ý=µ4¦ÃsÓÆÇ%K ã7 ÝÝ­—¼Õ+‡þ_WgЇ·­PS~CB©¨Úvy¾?Ô§eõ·ZïKc»ñA[Ýö}–ÉÓ>fºFÓRÁÈXúB½Q7gC£¥ZìM¿è_*j"Fl'S̾z©Zk1_ÔÐ4µ+h®5}JÞÍÝ]óâr—yíñ¼j*rûÃßÎ$ZØÿ:ÚŽöÝÌ.^±ïlf¶¯~{Š,¹ð¹)Œ/¯”¬8u¿°¢º{[{•R¹ãüí·RÚz²_3ÚÚ¥ŠªŠ1þÖÓÂl%½+þÞ‡?RIŸM&®?|¡¿—Ȇ®Þÿö¯3 û¶ZEw«læþÛ©9E#‚]ß ’”–W8ÞÿÖÜ(ýèàíì¢ò1¡noÛˆÅ'o8¤üûB:š¢…z(’&7~¼Â…'òìŠÚ=%Å')í½M—óY&9òžÎØŒ0».®V×3 ÞÛ¸Ûï¬ÉŠ„’Eß­¨VL÷°ê§S7?þù°Â¾-KtDiñoVõû’óËdotñÂiòË}çøû’æs»ÌxBQ™Q®ò°‚imx ãîdýéa±¬Ú-Äôh“Žç¸ž.±þ¯³›”Ǹ–2sÓ~RüÜrFnºü÷Ó7ÞܰoÂo&üvaÖ®ËðR§vJíym0¡Ïh1åŸÜ´¼Òo·.®VË'ж=¹²¨J5$"ÐŽ¬]®>%ÄvJˆ-w?$"ðÍ0giÖUîcaÄxîR'/ :°{—Ç•ªÔô •ÔÝHrC•ã+ÑLÎmÏ÷r”¾;´û̾í>ìlï]™Ž“5FÚÎÈ##m4!HJ3ì–®(m=פ)hia„vcCo–é¨1ôÒÝ(PT©hHHyDZ;ÄçÕòWS³H‰³Þ‚Lïœ&ªod146À¢ø¢Òªš~¡~³"Ý%OnÒQK…ØËÅ»of‰­ýÚˆÖý{ h†5^E&j]a|Æ©‚䜒¶n1¾¢5'ïê­Ãè;Mù i¤¢ôÒÀ–5„)c»‰è¶oC´0]0#cé õF=9l9±M­Ë ¶Á¸«ÎøºÛ}ôn2¦ÿÂd~^Þ½ÄDÓW}ê&W'Ô¼×¥ÃÜM¦8´À)…8ïž°2'kXŒ ¬¤*[¹K{çq›Ò ¡”µ°¬CJOQêo!,+οk]úWÕ0<ÊÖCæ¡ee€$'Q +$”2Œ¡žP%u¯ò gxBÎA8hÑ—iQQ®ªVÚµ‘µä¾Š=W4€uÉCë¢4BQ FYÛ•æ2·.N·.Jç)+Y §…6J»6š6):Ñ‚“¡MÿWo¼v"1mòê¥AÃ(k[ãõéxï¡’@ip4e%5.§–š¶ãùòœT°8NYÛUyt"%κ‘E)ÖÅé)gxB¥W•G'ݪãÕ”;¤Ä/”UY¶(ÿO)cøÖr§¹kí¢Í•ù6Onªj#T—jÏ0ÊÊö…¢á¤\’s[ ËÇ)êl\«<þµ¦$öNó«‹ä.Aê¥NüªBû´3€aÅ¡¯8Ý9ÈD~ÖÃÄ>£¥8¿ªHú8PVQVvrçvÒìkzëäÝPé–!±»N}ñÄ•ÅyðüžVÝTêrM Í-,ù¿-{ŠCFh>Ò›\·ò½Ú¦ÎäêÖ7ÔvFém£ÁmÅ'Æzý|&ñ³_—GÓV6Ð0 ia¨CšÒ ݃¾7kÏŒ¡F0to襖uNÚ1”Ü¥}•g¸¨ E’{ŠÂ^=:ÖO³ ÐÔèª/ðjf·€^ó¿O°ëjHMõ@ghl´*É”äÞæöÿrµ­«ãÁ7"4UñpI‰²® Ë¿þR÷õS‡d•w›³¡0bœÞä¤ÄÙ¢Ã8O^&;ÊSTRVR…ƒ$ç¶Z.ç­K>Ì)©Ðlkƒíh t½ó·/æÖ¯e·FÄ3ž‰ÞΣ۾ZÑ´ÞDãZ©7-Œ¥¦÷F]ôŽ–j±O;ô×›J6yõ #N?nèÑ hícõΩãÇÇOªå[äLA.ÜH¡\Ú³2¡.ëÐŒÔÏÐlÔ½ç|ãþ(È‹2§‹Ãg‘¬ÌØ”û›óü#Ä‹Ò}ƺä¡MvB•g¸üň]ÐÍáÒ… ·‹jd^]ëQt“׬À.ýls;Y›ÎuÇ®‹¦Ò¢ñÐ*È,³‡»õûáö“ƒ¥Å•Õf¯)Öp»ßZ*tuµúu¨Û´*+>=ÌÎVˆÇîø÷ûSI%!à åдø…ÚÚ-Ûø´-L±2ë41ÀÈA=–°Í ùMñ9rVæ {¹ÇÄDX‚57J7¿,’©*ƒ»5µ,‹Sãè§µ ÖtV$”Š*•S@ÝQ-¼Þ¨l\ÍøÕ´©´h|,QÐ0ñ¤`iFQå'¿Ta|ÍŒ–@K…âš$©OºÚá8žQ\õ͉+¿Æ]®ñ¬{~°©°P[7y6 ­C sÑÈ6Wœn¡†Âuya_fcÒ‚Ü™†f‘C >ƒh¶˜¥sŠóîŠóïÑB‰Ì««Öl5„ªÚ63ž¨©À€¥„65N5Îuüºýá•l:¶P-8±Ì³×éÈlYèŸ1·Ð©éõæ¥UÁ´ ¡@ - Îú<=oTS b4½›gÌ-tpzýøn°Ì:ið§œ@ Z(œÓ¬L¯zÒ©“Öܸþu™/ Ö(ò˜Ê½æ%@ â§ÿùG7ÐÀîVû÷”@ ÓÑoe"@ Ñ X™È—‰@ hhÆ@ a~/@ a~p½¡l}¯Œ‡ƒƒY€´ôtOoïzçÓðK-Iý®&—¿¹UH3¹Z_»  ]èBºÐÕ .½4hÆ<=#£ï€"‘ˆûØ®Ýñ£GS““Ÿ%oŸèí¤¤ÏccïܽKD[/¯óçŠòóõ}N’úa yzFÆ€AƒžáÂN‚BCçÌŸ¯P*Íè¡ÍÉË+..ž8q"Çà ¢Sxxdd¤¦$ÜÍïÛ·‡uîÜ­gÏ„7~úõ×°Î;GF&ܸ¡%sZF†O@€–üÛþø£[ÏžþíÛǼòJæ£G,ÀØñãiš  ºsï^“(h¨b5eë7p úþÀ¡CZÒ1"¢K÷îW¸ÜŠŠ‹'½ùf@PPßYz'} IDATß¾]]¿mÛÖ¥{wÿöí#ºuÛòË/fTM·ÿ˜Òm@£§íܽ»k:,X¸PE’æ• ]èBºÐ….t™x½€• ,kê¥Yòôæÿ>ý´²²òJ|üõ+WŠ‹‹W­^ýù×uyº»»»»¿ÿÁ'Nœ(..Ö+ MÓ¹¹¹7¯]ÿÚkÓgÌ(-)¹yíÚÄ –}õ•-tä÷õñ‰;v,åî]_ßÅK–Ëîݵ‹ ˆ´û÷ÓîßíС©Ô[®¦lçNŸ~&gHÈs’—w+!áµ±cÕ•0gÞ<{û;·nüë¯r‘‹‹‹}þùæÓSRÎ:Õ·wo3ªf¼ÿ¬U -âããÏŸ>}éüù{ÉÉë7l0³lèBºÐ….t¡ËÄë|™&CÓtPh(wýºu«zBS}S]]}ððá%‹‰E"‘H4ëý÷=jzþuBľ={ì–|ñEx—.¯Ž›™™©)w3ýÝwq6,??ÿ½éÓ¹û””­˜ºò³,Û§wo;;;‚ ¦N™r+1QëiS)h¤\½êhWÈ;ïà8þò°a©©©,ËVÊd§ÏœY¸`P(´··ÿ`æL.2ŸÇãñx鲪*‰DÒ>0ÐŒª±Ï÷Ÿ ÐИ#êì6šZ|²`•••ƒƒÃG³g8tȼ²!0½ödÃN2bY‚ ’“’ԵɟZ………E |º[…eY‚ LÍß4¼Ú´ù櫯 ¸¸xÉ_|8gÎÁ}ûÔpBJ¥R–eù<ž@ ˆÅÜ}íGuLÍTêÀ»vmÚ¼¹¸¸HŠÒzÚT ,W¯:Ï«¦®+¡PE’,ËrÚ¹¹¹q‘ÝÝݹÈ666?mÞüó¯¿.Yº´Cpð§ véÜÙlŠéë?C^~ÙX·ÑÐÃ0wwN`OOÏ¢ÂBóV;@ ˆ†``¹ùptt$âÚ¥K‰ÄÒe999Íœ>}ì„ /”ŠÏçÓ4M’$ŸÏ/)-ÕzZVVöé¢E;·oïѽ{Ò;£_{ ÃÔšJAƒåjÈöܽñœ ??ßÍÍ rssÕ½ôÒ —^"Iò—ß~û`öìË/6T 0¥VY–ÍÉÍõôð€œœ'gçF @ „‰4tÆ\72hLh²,+‹GÄÄ,ýòËŠŠ –e .ÆÇ›žmÜ´éIN˲¿oßÖ±£^I Ý»»»KÄâ¿W*•[ÿ]+•J¥¢iÚÖÖV¥Rýºu+(•J¹¥M¨ ¡r5eÓ¼7^!b±x`ÿþß®Z¥P(JKKؼ™ ÏËË;sö¬R©$ÂÚÚÃq3ªÆî?FjUS‹«VÉåò’ÒÒõß}7jäHóʆ@ ÂD,`eêFV‡h<úfùrPØРàÐÐq¯¿žúàµ÷îÝ5fL`‡½û÷/-+[½r¥!IôÞ±dñâO/î?hP爭TÎÎÎ3ß{oÔ˜1£¢‚ƒ‚¸@G‡)o¾9hÈNî%'7‚*VS¶‚‚õýÝädã²â›o Ã:w=n\Lt4ÇcY–¦éu6têÒ%(4tÏÞ½ëV¯6£jÆú¡n£Ñ¬AôìÞ}ààÁ½ûõ œõþûæ” @ „Éèµ'1îovIa!÷9?/ï^bb>}ôÆFüG8yúôË–?}º©1HÆÃ‡QÑÑSS›Z@ påâÅqS¦¨íÉSÇŸ:ÕÀîÓrô Ð y”ž^ë…® M%‰…h4ÓÒÓ1 ð÷ÏËË[»~ý°¡C-½•Æj`‚v¬Æ¿@ š! Úcž™–V¿„fDW†¦’ÄB4š‚åååÏ[RZ*† òá¬Y–®CCª Ú±šÛç@4?ô;æˆÖD×Î/œ9ó\P3îþ¾¾é÷ï7g øÓ°ó2@ }4h]&@ ¡ýVfÞ“',@ ¢5¡ßÊì5p`#Ë@ h¡ìýýwÝ@ý§²#@  íþA @˜de"@ Ì:/@ a~ÐIF@ óƒ|™@ óƒÖe"@ Ì:É@ a~/Q®_»Ö52²©¥@˜ j/ÓAu…@ æY™ˆzÁ²¨“´$P{™ª+0hÆ@ a~,âË´‰4?ÖÈå É­åÊЊa-àïÙüíBЦiš¡iš¢™Ú†¡iúË5?›·¬fÈ"ÀÃ(høÞLýÖíÕZ±D]}+Z±‹"ñŸÂÌ'Y‹ÅzE"¨©®¶‹kª«ë—sË’á?¹ÿ“5ÙF­ÀyïMrñë4w曫7n3oqzqvu€¢‚¢F(KÍb1,;´¦¦F©Tñù|¡PÀçóù|þ"|o–‹¬LÓ1k]}+^ ±± ±êÈŒù#D³Åœ§²‹Äbë  \8güYú]s¡ù0êÕWiš¦(J¥R) …Bqãúu³äÌZ )ŠÖ¸`Á‚k×®Í}Ê* šaB“’€…Ža¡IIw-Z–šYbñÒ±CU*UÁõ¸R%,.À³Â l ÂÒ±CÁbñw ³K,Ñ^­óÖÕŠ§&&G,ÄÂÓHw˜B ˆV†ÙfÌÅIuU•Þ´ÕUUb‰¤Þ9·,ú/ìóÆ€V°,0 ‹a†9;8ìÈråj1qÒ$ÇÃÃÃ)ŠR*•r¹¼ººº²²²s—.$I&ݾÝÐ,0«HÑ4|ùå—C‡‹‹:;¹¸:{°€;99«µ h——Ïõ+³3["Y:vháõ8 2,+Á/Ó4ô$ˆEŽL 6×ãlðõijÄâ ‘¡…Ϙ«_^Ó©“™¯®VJViš˜j8[“ûêk¡®…@ ͳ͘WËd†R‰ml’sË’ðw'OçîIZY©,+–•WÐyt£MYN}ûí®]» –e)Š’Ëå<Ã0š¦===e2Y‡ä» öÕ™ÝʤhX¼x1D>=J†¢è-ë¾ÚD3CÓ4cÆBÅ66G éÐE,‘ôê‹–|•”|caé²¥QƒûÀ¥+·dUŠ„„Kb‰¤Z&3Wѳml¾ž8âÉå#%JX\€Àð ¸GÃ'LX¶k|éÊpãÈÂö0["ÙÐZ¬•)¶±)//'Ã0–e9÷ŸÏ™˜Ü¼yMM½½}ûàà”û÷ë]Šg_{ÅöÊ$©Z_æƒÔÔY³gÇÅÅ :tóÖ=W®%<|ø0111+5ÑŒuho' éÐîݹ]Mb‰×ÏßO8†+ŠY`q‘û;Ó¦÷-ÀiY•ÜÉÉI"¶6oó}hcóõÄE׎T‘°¸ Ö…ùÕ¤Iêj§æ FHÌ €Ù66ëëeŽ´ôs‚ x<Žã ÃË2 ƒã8†a~._‚a€a€aÔWe³ÔÕ*s ûìÃ’%Kb—b±ðÔ¯É} ®B¶&h]4È—9´›ßÍï'‹œ]X¶ºª_W߸„‡æ”®…È  öôl¨¥=Vj?³¼3iÒop&¦­­­\.gYV*•bF’¤B¡ I’¢(>Ÿã¸T*õó÷˜ž^Ï’X¶áê¼6ÊŽ c¢}CÛ€——-[¬T@dd$C©RÑ5,¨C€—‹íÚ{7ÌX‡³Ÿ õõ7+³sŠ/ùñ•àêÀ±@hM¸’LOκ»véþQo,ts¶1ýü¼K4ŸŠUG9 | €Çu­ú‰aŽöâü(Õ^5½Ò,ùëÃ0ÇJ¥Â0 @}tè°çöíWI’ìÚõèùóŸ%k¢ºZ%]£;Q¾‹…ØXˆµÅùô#pÏZ®¿@ ôRÿu™Ã"ý÷|>ZÔ6¬„@*1äÄÚ·¢ºù=È׿¤ýav~ƒ$m®2hÁÖš™M² ŽûK,ärù´iÓàÇ …|>_¡PìÚµ úôéÃEææë]VCÒŽ{ÕŽÅ%KK`Çþ>1wÖ·ÜÓB¡êìÙ“'O¦ÜI ð÷õõòx˜™5iòDЦÍ[«EE• Òêö™ß ÆLŠ ­ùÖBO„±VzÚuôÏÙ|øûñ3WWÊæ-÷#[Û¯'ŽÈŒ?T]WS@2Ö”J×UTÔ£P³¨`3Åzƒlš$?Jõ†›–e†Q©T ð,ûÔáX‡FõV¹!uµÚv­Þµ˜PkSÆêy ±²ŠŠ½v@ tiÐî÷¶Þ ²¥ªJ™òB¥<õÕHC‘Eú¿Z_ÏYó–ABDAôÖáôCoýøÊo*zì¸qááá\¹êÒ§OŸ¾jÕªÊÊÊï¿ÿ^+¾H$jëã“•™Y²ê}¦àøÑpìß4`I»iÊ=špc›» ðe… ¥bi’¥T Mf=Ρ(óX™aáanŽðÕ×Ëã|3"´’À¬(\ÀÇ­â®ËpBÓ?’»º·óU|üÀs7ÿôËС /¿ôvbƒ7N=EEPLÑjHXY…À'ö ÃÔËjÈR;»ç>÷Ö/@å»å6[l+ß-¯_)Ʊ±Y%“ÍS¯Ë¤i†a®:ÚµûóÞ½×H’dYöÒ¥!½zý{òd­·à…hH]­±[gÄÄäerpK3kŸ@, _\C ­3æ&€cð  h¨*/˜ºáÈ„‡%êq’¤’f(†%)†¤YŠfHšíÒ¾MZÁ³ ••å ýƒÔdàôYÀqž„°õ·™²úƒß!ેüPgñÀð–^ûdIä·f)T‹§»"(¥R)•JüñÇéÓ§À¼yóÔq¢££ù|~uu5ûKHbˆñ£ŽÈPqþKì¦$°sU2°*`əӖnÚ¶ï†PGÌ]óÖÿ¦My=5ézv~ ËЯÍmBo ~îѳwzjr^Qy@pg'ë32–q±‘¬Û{练i,­ø¢X>kî ªª& ]D[ÿܹ×ÇÇÿÎÝûR;;sõ`‚/óû*çNuÙ¤ææË/¿œ?w®úãÊŒÕ,€Šâú Ë×OÓ ÃÔö†aX–Q÷ç¦ÚOoЉ¹tiíÇgO –ÃÒâ!DãS_¦µ•@)geÅÿÞz|‡ö=zóŽB¡`†3t”J¥JUû¯B¡Tq”J’¤X–]¾|yÃÿ48N.;;dù ÿŸ6žž$­Œí·ÜÑÊé“ÓïÞí®ˆÁ‹´ëîß¾MДÐiKã?ù¼Û7f)Wõ¡EÜv¡P¸jÕ*MsìØ±<$Iæ)õ64ëPUq…¥i¡}`ØM‘OçªtgqªÏË +ÎíH“œ#³k§,¥bi233“4‡/“$ɤěv¶…UŒÀÕÙŽ*BÀ‚—œ-”•ÿ{5r–‡ÑBâàã%¦T5Ù¹E$I]¿v ÌçsÒëËÔÜÄqYö¦¨Ÿõn¯E‹i~\ùÖjãh9>+ÊÊêQ¨.ùùïÙÛ¯/,|€eîw¡(š¦–$'#I’aX®KŸ9ÓoàÀóÇŽu5.§êWWkí×41 6v)÷ìyk’31 È—‰@ Z#õ÷eÚÙˆ€¡A)«./ýý\Æç›÷çççÓ4MÓ´BQ£P(är¹R©ä¯©E!—WÉå5999 —Þ=ÊÊÎÎnß>0;;û¯¿ö•””Œ9ÜÊÊ:>>>++«á2¨ù÷ÓSƒ  #i‡@Ã8“{µdPDT'G[' ß–aÙo_Ú¨ùÔ\¨T*õ¡E$IòùüÊÊç6d( ÎΦ5&Í+C0”Ša¨ªÂ‹ £ÞöR»“ƒsU™÷Ñêÿ½;}ê¤Ô¤ëÙùÅiYƒzwÉ|üdÜðÁzmQ=Ì n—÷þì^="Þzç½~a>L9_l-d‡½ç¿öj$ìýw UÃð0\ö„lq;-û‹ØÅ—®Ürsu0—Ù:VæW“&}öçŸê§ÜGµ‰Ù“ >–ÖΘ7g4ŸZjCpssXâââ¢ódI‡!º11#ÌU´)¬µ_[;ïýô?5±±K–<7?þ쉆‰‰@ ­’†ø2ù@1tEÞí' ©·BÊËˬ¬¬0L€ã8Gà8Æqµ'Ð4M+•<•J™’’rÿÞ=sø2ë!//7..Îßßÿ¯¿þºu+ñܹsS§Nݳç/÷¾}û¥¥¥›×pâË3Q‹ŠD¢odŸ/îú5—ùÈÍ1Vn”ä4ϼ€ðö+.Õ.Îú"aáâ®_›±t…BQ]]ÍZÄ÷Zk1=Ú­[7’$¹¹uÎÐlä4­bhŠa(–¡|R¶Ý”t®JÀâÿ^Αÿ7wC©XŠìÒ1¥je²”êazš¹vÿÜO~nî®mãŽø{Ïè:duÉ™¹B C’V{mb|ZÅðøXevžRnçâ½uá§×o&•—–Ö[k½h͘kš˜º€y¹Þ.ºz¤;‡ç>X—ÉñÙgŸ5¼D]23úún{ô(žîâ¾)ïNL¼EÕ¢@FE]:|øàÈ‘£¹os³Þµÿôj>¬cbÚÚÛs} @ Z õ<É(¦Wû¾]¡¦¬¬¸ì¯KiÝû¿‘eccíÍÇqÀ0Ç ‚ ÇqÇ 'g¦²RvíZBÃÏì0E†¼¼üôôôU«VåääüòË/W¯^ŽŽîÑ£GLLŒ‡‡G\\œÙ9ñÅéùgg/î²\óáéG¹›W·¾ÂÝ,î²¼6¶YKW(•••ܹ˜$Ir;Ê`ìØ± …âèѣȭ( (Šaê{Îy}O{¡)gb2 ÅДgÒ¦üôœW’$IÑ©·¯²”’!• ©d(%C*YRÅP †T²4EQæ<Ù>?7ßÎÑ1¬S'š°ê>puMÒÏU…÷…T a#Æùš31iŠa(•ŠTªÈ1/C‚ªQ¨jÊ…òòõâ?÷§˜¥P]<Ûxž:qL©RÙJ%YOžü{ri—®];uŽtvqÁ0¨(»çvâÅ Ûµyøš%nݾåÞÆ=÷Iž™Ê¯EeÂBÓžñ–£vyÖ»ÌÖëâõ—þ\lÑŽaØíÛ¯vè°'1qË2‡^îÖm)gbj|™¥†Þ³'xܸ¦¬«%§iÚš†LÌÒb Ö@4õÿퟒrÙù;9%ïù¯-))%I8MS$I)•JÕóTTT¦¤¤›kb¨N6nüáäÉ“999)))7n lWVV¶uëÖáÇwïÞ½°°°WŸ>—.\0‹0º Y…ã8n…ñ„8Xã|!¿öÅ< W®Dtíjoo㵇ÃWWW«±q7ÜΑYIê=cN?µ2é§óæœ/“$U*‹$kK± 5 åö?ÿèÝ«ÇÉ'/]¹ÞÆÓýÈáÃíÚ{‡‡ÀùôŒ?ÿüÓ»­÷‰§kªß5z\\Üß iFyVÍwv^8f`ÜÑ3F¢õ$ˆÉ|†3F•°²¨¨iû§ô§"cEX µ/žº3€$) (’ëÞõÌÖTŸ,ZŸÂêUW±{vÀÙ³±gAÃÄÔckê51ëݬѼ©ÿîŸêÕÚc÷G¼û郾@ àv73 Ëø*•R¥"ÕÇ ÉdU¹¹9×®%”škb¨NJKK¦NÚ¿ÿÐÐÐàà`…BQ^^NQTuuõ… ââ⊊Š,7K… ñȨ.."'‘P$áÛò‰Ú#Ç-:/v3!¡SçÎR©T]g\>Ý!A‘$)—ËŸde5ð‡ê9cþÔ—©61ºÖ—©T‘J’R’¤’$•*,YQ%……Ž..—/_u°·»u#‰ =:zÚ´™B+ᇳßKJ¬u£Ž9tÉ’Å©²ÌØo9V.pqéÀ‡ñ<¦'ApÛÉ5§Ë{Äx£d’IXÑÿlTóB’$†vùònÝŽÀ… ƒ¸o•jÓòé¥>‹ ÑN2šU8ÓÑÅžš’Ka)°5uML³÷+h>Ôÿ$£ÄGåo¿5µ{÷ÈœœŠ(•*‚ÀqœÐZÉ͘WUUWVVÆÇÇ—šQú:e˜6mÚ† œœœz÷î½qãÆ­[·RõÊ+¯dff>~üøØ±cæ•G NNB¯P”V(JžX® -nß¼Ša˜H$R/bS¯Å¤i:';»Ñ„Ñdû®äÉ:À«æ3O§ËY†RªHIªHŠsd&Ü*ã"[Tݦ/-¯¾|ù4óË*jÔGÇYNÎÐ Àa Æô$­§c0FA¤3°Â’µùóÔÊ8wn ˲ErK3Iòé Þ§çM"!×ê´5Ï;Ï›˜M"-@4õ÷eJì‚;&%ÝaY†ÛKÎ…?=3¹Öµ@’$Ë22YUFFz~~¾y¿µ›"ƒ—WÛéÓ§K¥Ò¼¼¼áÇËåò´´4—žžn¢¦õæç¡è o×Eò;Ð.(ˆs̨aü葹¨_&ì¼o¼k—Mç<š*’T©(¥Š<Ÿ«ŽÓøžììœ7ýæè}!¾-(øÄÕxcpp@Î@öÓ8 —§å:ÌŠ œ\] =6,ÚPªF>Ɉ+8iõÚš ab6DBhÔß—IQô¶mÛ”J%††qksÔÎ8qÆ gä°,[TTœžšj¡M—¡ªªjÒ¤I~~~3fÌ6lX÷îÝãââîÝ»7sæÌ5kÖ<~üؼò47ÒR´wÏ44mÍo½®T‘GNd¨Ã›ŠŒ´t7O /'·1Ëý¶ >ÑgHqÅ-ªŒØšš&f“ʈ@ Aý­ÌÔdËNhšK†n=zÄÅÅݸqcÿþý……….\8zôèï¿ÿ>mÚ4­ŸÆA42š¶fÓÚ—jò×¾Ô”­ ý¶&21ĉú[™-…„+WÔ÷}úõ+**BC|³¢™Ø—„%в5‘‰‰@ þS´~+S“‹çÎ5µâ?‡ÚÖD&&øO×Ð!,<¼©E@¼¨½LÇru…LLñ_Y™@ óƒ¬L@ „ùAV&@ Âü +@ a~•‰@ 0?ÈÊD @˜de"@ ̲2@ æGÿoÿ¤Ü½ÛÈr @ Zú­Ì ÐÐF–@ ÑBÉyüX7͘#@ ̲2@ æGÿŒ9@4³w3¶Ä]MË)"i¦©ei|ôt~wh÷¡þM- @´$•‰@ ÌÏÍŒ'랟ñê`_oÀ[ø8ÃPe­;pRj-ììߦ©¥A ˆC ýM#--­ÿK/åê[—Š@4JŠŠ²33«e2–e›Z–†‚a˜ÄÆfÓ¥ô9ã£=¼Ú6µ8æ€àùùûÏÏßtäôÌ^­£™ Á5Ÿ—¯¯£³sSË‚@ Z<-ÃÊLKKëÙ§Ï“VQ/ê IDAT'¯]½ÕØè\½zuŪU·)ŠjøÞôécFnj¡L%--­Oÿþ¹¹M-ˆA*ÊÊ>xÐÆÛ›/´óÃ0R¥z\|ÝÓÃÇšZóáéáþ¸¸ÜÍãu4“!¸æ{øàdzµ·ojqD˦ÅìþÁqüø?ÿ5µ ÿ9.\¼8ùÍ7'Oš”’œü(#ã‹¥KÏž;×ÔBµ*¥§{ùø<Ã0lˇa‚Ç#0ŒÇçã´š‹ÇçÖjšÉ\óyùø>¡:mÞ²¥q”j,Yºtñ¢E¯Ž%àóqïÙ£Çwë׃šOKKsõðغm[PHHxçÎ ?þôSPHHÇðð„„u„?wìèÔ¹³¿ÿœyóT$Éd<Ãö:„ED\½z•‹¬·õF5f MÓm}}ÛúúÞ¹s§6´¬²Çq–aZÓeE`­ì²"°&¯ØÆ¹p‚UV6õ›@ Z<-ÆÊ€÷¦MÛþçŸÕÕÕš³fÏ&p<ùÎK/^¹vmíºu\øì>²•JÜ¿ìðá½ý¥Ž?oÁ™Lvóúõ¤[·ŠŠŠ¾Y±Š‹‹~úé/[¶<~ôèÒ… ýúömL½š3III111º Õ¸oAÙ™™Ù™™îîîͰ¡Y–¥†aÙÖt yx“{Í~ yx“Wlã\4M³­wUh4Z’•éîî5xð¶?þP‡Èd²OœX²d‰µµµ““Ó‚yóöüõ—:üóE‹¬¬¬?þðC.¾\.ßàÀ—K—J$±XüñG:tø|>ŸÇKKO¯ªª’J¥‚ƒ›DÁfHYY†aŽZá†jžãý™3 ‚ˆ‰‰ÉËËûàý÷¹ûäû÷Õ}ö™µµµ££ãü¹sÿÚ¿¿Î gΘAĈáÃ理€ávÔY“fÛÐMî»2û% p°Vv ˆÖær6r5õ;@ Z-c÷šÞü„ ú÷ç>@OO—Waa¡:Üóix//°¢¨ÞýúqY–%lmm·ýöÛ¦ülñâ%‹wëÚµñ´jÆØÙÙ±,[ZVæðü>C5AØÙÙ€€Ï666ܽzq†am4šF³ÉŒghee¥R©Àp;ê¬I³mèÖç7òp¢mýáòðÖ×Ra9Z˜•Ù>0°C‡ûà>:99À“œÎ:yòø±‹‹‹:<''‡34sž<áâ;::qûæMÎôÑ$*****JE’[¶l™6}ú­7K§f]XXرcÇÞ˜MQ¾¾¾¯7,*Ê\¥o?umÎŒ·Í•›Og¿Ô+ÒÃÓsþ§‹cFŽâ/]8?ã)_~³*:fÁã]¿zeÏÎí«6ü`Ær×lúuò Hãqú  ,€B¡°¶²âÏŸzäÍ)SÌ_êS„<ÌÄ–RW>ò8ŽKmmÕ ;öçîÝ¥ee@Q”:ŽX"aX–Ïç“$ɰ¬H,þjéÒ=ûö­ûþûÿÓ¦…vè Î¶¨¤„¦éIo½Ååɲ,N†²Òí Ñ8 +hz,â:âfW5rŽ¿|¹cHË0±8°]»³çÏxùeó— ;•ýø±cA\º|EÀçs!S§NݳkgØW_}ùå²·¦N±µ•ÆÄÄðx¼ë×¶mݶñsî1ç|™&EUWþó­PYY¹rݺu+V„‡…¥>x0óãµãhÜ÷ŒŒìIQÔÞýûc—-Û»}»ú©TŠãø¾;D"ѳ2 e¥Ó¢q@3æDÓÃ9œÌ~©s®ÉvïÛwäï¿'¿þ:2ãÝw7ÿòË©³gU$I3LÒ½{ËW®4cÑZ—¹sçŽÉ“'{{µqwså®éÓ§íÝ»‡¥©ýûíØ±ã÷m[üýÚzµùôÿþoðàAf_—YÊ×l_%I2 #‘HT$¹÷àA½q¸û¢¢+×®)U* Ç…VV†i>µ²¶~iÀ€ ›6UÊdœk3áæMCYI$†a ŠŠ^´ó DA¾L¢é±„Ÿ‰e†a†Ž‰c˜H$êÔ±ã÷kÖøz{seE„…-ûüómþ¹ríZ†e}Ú¶}môh3Š! p3¿3óÐÓ_—U3vôè±Ov¡O¯^G6{¡j&û2µÖeªS9ØÙM7næ‡ÚÛÛ>ü̹sZqÔÿÒµuûö%Ë–1 ãííýÙüùZ1çøÿìÝw\çÿð'¹’v€°÷’%bqá^(NÄÑÒ:q¢ˆ³¶_ÅŠ{áª{[Å=«­UlUTD¦ ‚lÂ!är¿?®ä#ž÷+Ü=yžçžÜ‘ã“»çžgéáãÇ¿5KPS£§£3ÞßßÓͭѪ˜ššüý¿Ÿ3‘Û·ÛX[·ý® j •‚”ìÙ£GÚººÊnEËËÍõPv+ÚØÍ«WÙle·¢ƒ”r¹pTv‚šO‘QÙïDG·ú¬ÙÓg?¾a"<(M+(A©¤¦ï˜ÍŸßíè>Î> ˜(FQ±XŒ¢¨X,£èK(J AäÁÝ»²*¥óh“ AAª>ýAAµ=eBAAmF™œÒMÅÀ AA0ÊT> ÃRÓÓ?~ù¢ì†@mP‚ 0ÊT: Ã>gfªS(êêê¼ÖÕÁ AA88*»’}ÎÌÄ0ÌÝã´¨èKnn1g ££ìFAŠSà€ŠP4/7·cšµR·:RoßVv ê\ˆD¢&“imo¯«§×œü-‹2óóóçÌ™óòåËÊÊJ@ P ¡ÿ÷93³¶¶¶§—WyI @012ÊÊÍå–•´|Œî˜˜˜ðððØØX‘Häää´lÙ²AƒÁƒÕÁ; µµµª7€¹J‚‡ ‚ nN,s8ïß¼qõôÔd2›Ìß²(“H$úûûÏš5kÆŒжúŠ¢D"ÑËË«‚ÇÃï«¶¡!¯²’ª¡!lI\øçŸc®Ö66Md°³ë˜–@mBYôô™3$ùòå ŸÏÇSx<ÞÿŒŒŒ+/fed<~øAܼ<éR'NžúßÿôôôŽ=jee066Þ½s§»››tÁß.]šõÃn®®ASS3pʼC…™¥eNn.àô™3z,VQQàÀÁƒKCCñ‚‡íÙ«—‰¹ù¸‰ñwMŒúýwÿ V¯]kkoïàì|ïþý¶ýàÔ %$&zxxàËÞÞÞ€êêêâââ©Ó§Û;:²Í̦LZZV8ÿÛo“–††ÚÚÛÿzø°¬<+V­²µ·÷öñù–väØ1ž=­lmoܼ)Ùh½owFF†«»»X,¶±··µ·‰D ó4lÀ§OŸ&XX[[X[Ož2¥ãw]£d*1 Ûwà€»§§©…ÅŒï¾+köî’uÞKJJrrtÄ—î« 7~÷ý÷ø»ëÃÃ'Lž,¬­•n§bÇ}åêÕõŽ”²ŽŒ2•!5ñÜ‚ Ó¨M(å€îܽÛÃãW¯^666ÉÉÉ€ÜÜÜ+W¯®ÿùgùS iki;þÆÍ›Ü’ét--­ªª* ÃNœ>¾ÑD@rJÊâ… ‡ F$§JnèC¤˜ÄÄÄýZÛÙõéߟÏç_½|™H$ZXXôíÓAm-­¾¾ø-1)iñÂ…ƒ ¨‘ɲò,[ºô›o¾!‰ööŽNN³gÍ"‰Ž¨HõíNLJrqqÁ›$'trssQEÅb52¹§§§’ößWd* ŽŸ8qâèQ‹¥®®>Îßÿýû÷ » È>ï%'';9:ÊÚW:ÚÚ ‚ƒ-Y²72òÒo¿ijjÖk’ÂÇ]úH”uàx™Ôyñùü‚Ü\¡P0L×ÐÐÔÔTòÖÆˆˆaC‡~óÍ7ggçGS¨Ô’’SSSJSã XXZîݳgïž=ñññS§M;tøð–Í›Ú::µµµÇŽ_zîüy~uõ™³g/\H¡Rÿ}ùR(9¯Ã0WW×F)Tjjjê–ˆ¼‚š ¯Ç¥Ûv; ‚ºD"iëêêèêÊ¹Õ ë+_SS“–žž”Àf³¥óÿvñâ‘#G>~ú„aXuuõþ}û(TjrròþÈHÉy@Vžƒû÷ãyÒ>~ô=_þœ‘áàè(ë+?~<žYNéœ9ujûÎ;ví=jÔÖ-[´¥ÆâPüTкý)ëTùïË—žžž¦fføjMM¾¾~sv Ñó†a)©©žž²öÀ³gÏí;wž5þÖ¿ÿþ{ãÆ ƒaec¨®®&‰}ƒü–ô^wsssss“\hÔb2߯Åõïßÿú ÉÉÉcÆŒp8œqãÆ=}Zºø¡_m˜Èãñrrr$¿È¯ß¸1|øðzÛíÝ¿ó A*‹K¸ÜÌOŸÄ¦¯¯ßh9_ùä”V/Ô¸ÿàÁ¶íÛÏ9ãââ"‹\\\{ôÈÊÎÕÖÚÕ=n(+O­PhSÓ$¼ºt)¾œ˜˜èÖ£ñ•‹ÅÉ))®u—ÍS¯______‡3qÒ¤³çÎ- ‘¼¥ð© •ûSÖ©²¬¬LƒF“¬Þ¾sgÔ¨QÍÙ]²Î{™_¾ bfjzûöí†û ””´,4tÆôégÏ›Pï]…{½#Zxš³{› F™ÔIåçäè±Xæ––¢ÚZÉÉ€aØšµkçÌž-é[“=pðàìœÿ±cÿ·~ýæ-[–-[F£R?~üxäèÑ5«WKOq¹o_¿~ý<ÜÝkkkŽþëÉ“;·náoiii8xpýÿþÐÔÔ<ôë¯ ,À{”öpqÙ¾cG||¼››¿ºúùóçC‡ i41)) AËW®„.[öìÙ³ƒ‡ݽ}»ÞG“þ8ÔMÐ +›/™™ £Ñ92d}åñññ’'H$RRRŒŒŒÊËËW¯YÃápþxôÈÙÙÿÙÙœ<YÙÙÎu·Vð–~»«‚êêjI/óFó$$$H7àö;...ææ•••åõynÍ© 5ûSÖ©ÒÓÃcSDDFF†‰‰Iä¾}YÙÙß}÷Ý_ýÕäî’uÞKLLtrr’µ¯òóó¦L‰Ü»wРAÎ..Ïž=ëÿuÀ§ðq¯w¤8 MîÞf‚ý2!¨“Fl¶¨¶V,K§_¾r¥¨¨(bÓ&Vž={ÒéôÄÄDmmí»·o¿zõÊÚÆ†eh¨¦¦Voõ¢¢¢~øeddfaqþÂ…k¿ÿîåå…¿¥¥¥%‰ðßÓ ƒÇãÍüáü­þýû/Y¼xR@€>‹åæî~ãÆ ÐhbRRRà”)¯^½242 [¹òÔ‰±¿ ¨Ó£jha]O¾zd}åïð`EÚÔÀÀZ¡ÐÔÌlÂĉVVVjjj‰‰‰®®®ÍÏ“˜˜heeE£RÁ×ÀývkÐhsfÏvuw·sp•§^þþûïAƒë³XcÆŽþîíÛ4*µ9»KÖy/99ïÙp_UVVNœfŒtâã{÷¦|ÿ½$ž||ï^à?Àk™µ¥Ä¤$¥ AZë§€êëûS•Ï{­Û½0Ê„ ¨-%''ÛÁ™« êNàyOøôAm)/'GÙM€ êPð¼' ¼– AAµ½G™aaa4MOOoæÌ™¥¥¥íÑ,¨ùRSSIRÓ>{ölàÀšššÚÚÚ&LHKKk~نﺔëׯçççûùùéééµfh‚ ‚T^‹£LƒqåÊ•ªªª´´4@ÔÍ‚óäÉ“ñãÇ/Z´¨¤¤$77·ÿþýúõËÊÊR¸BA*¥Œ?žH$úûû9r¤ › AAêiq”¹aÃWWW ££³jÕª§OŸ¶G³ Ŭ\¹ò—_~  ‘H4mùòå&LØ´iøú²ejj*~%rðàÁ(Šâ×)ãââš³ ‹ìììÜ~Ÿ‚ ‚ Ъ§>|èááÑVMZ©´´ôõë×wïÞ•N œ={¶¬"þù§‹‹Keeeû·‚ ‚ îEñ(óÞ½{Û¶m{òäIÛ5j.—K êM9j``P\\¬p(ŠjiiIVcccmmmo"AA݆‚Qæõë×çÎ{ãÆ é åÒÕÕÅ0ŒÃáHšEEEzzz ׉ HYYY[´‚ ‚º†*¡XC ÂÓ‰2Ïž=zëÖ­>}ú´yƒ …ikk÷ìÙóêÕ« .”$^¾|yÈ!555E…B¡šš‡ÃÁß%t‚) Ö@[7Ã,Aí‘=vG;QQz–Vi¢C¶ÔSWvCTA‹¿ û÷ï_¿~ýýû÷½½½Û£APklß¾}òäÉãǯ­­=|øptttll,ÀÔÔ”Á`DGGO˜0áàÁƒx~mmmEsrrLLLš¿@  ñÒênjkk•݄΋L&+» ÝŒŠZêú¥K²ÞJ)£Å•Яü8¸#Ûƒûøñã€à=--ͧo_nÝõ£N¥ÅQfHH‰D<ø¿@¡PZÓíj[ƒ¾víÚÏ?ÿûûúúÊ^jÖ¬Y³fÍ——.]Š/ìß¿ÿþý²jnôpÿâWV¾óÆÖÙÙÑÃCõzžˆÅâ2.÷íË—½ûõ£ihD"Ñ”3de.*,|ýâ‰DÒÖÑ‘¤—p¹I‰‰.nn¦ff*S,äç¿yù`jfÖ›P *?a‚——×OëÖIRnß¹²tišÜù8T)Ä‘ÏÜÜ\zµZ(~ðíÊ1æô/‰²Š RÆã%'';99nݾm``КA©UœÇ‚ ¨Å’ß¿wts321a0ªe€¥%›ÍŽ{õÊËÇOõã’@$²ŒŒ¼ûö‹õþæIzJr²«§§¹……œ²*ƒ@$±Ù½ûõ{ûꕾ†Ô- 6ÔÒ¨hÆŒáááë~üQò'zñÒ¥À)S䄘ÝÙ¦Y$„°pˆÑå“ò²Í˜>ýü… ›#"çΛ1}ú–­[ñ·Ž?¾k÷n.—ëìì|âøq+++‡Ã™üÏ?ÿ³Ù‹.\½f —ÃÁCù];wnŠˆPWW?}ò¤$¾=f Š¢,CCÀæÌ‹ýÒwÆ‹‹‹ƒçω‰1f³-X i^Ÿ¿fÍš7o¢(:Îß÷®]ÊíÕ; C••Eoþ>ƒ YJŠ‹Õi4• 1è±X%R¢0¹ttu+ÊË¥‹—óxFÆÆòK©]ÝÊŠ ¼ÃzDE²2Œñóã–”üóÏ?øjYYÙýû÷§O›VRRòmP›mfa±zÍšz}!$!ËÐ0>>þøñãŽNN,Ö Áƒ?þŒçáp8&NdzôìyüÄ ÝºMªøü%!!flSÓ…‹uØ®P˜Pôß/ ÏE‚÷r¶Z’&¾ÑÓ§O¿rõªH$ÊÍÍMLJ5r¤ä-kkëç11¹99666+W­Â,\¨««›™‘ñèáÃ+W¯J2£(š——÷)=}Æôé?ýü³ô&îÞ¾ HaAAaA›Œ‘|.ZÄd2332þxðàÒåË’ôeË–ñÊË“ÓRS9NÄæÍ-ÙmF™˜™™U6`Ö>÷} HˆÅb Â!&€H$~ÕåÃ$¯Ô””Ô”é"P¯*†adI:Ê¿ðЮýt[Q©ÔI'þvñ"¾ú{t´]=æ/X€ ȧßÄÆþûï¿;vî”.õUˆãæÖ¢È©³…8òÝ|Ëõøùm!¯°áÚsúw&K™™šÚÙÙýñèÑo/Nš8Qº7È AƒtttÈdrpppìë×€ŠŠŠ†oØ@¥RuuuW„…IW²d ‚ ãüý“’“[ÔòŠŠŠ{÷ïo §R©zzz+V¬ÀÓ«øü«QQ[7o¦Óé+W¬ˆŽŽnQÍmF™APÓ$WìrrrFŽ5rÔ¨œœé+yrŠt =»(͘>ýÚõëø5Å‹/Θ>P6ýò JÕ××_»víEÙ–DN0Ä‘ƒ/Ä–žÿœœË¶=áÅÇŠßþåü4®¹V¾1ãü… çΟÿöëÎʧNŸvuw7463v,ŸÏàã²Ùl<ƒIÝA|Ò*•ÚÒa+ðj%ƒÃ˜™šâ E……"‘ÈËÛÛØÄÄØÄdÜ„ ¼¯ï0t<Ø9‚ jBqŠ‹'\ºt 09 àÆú²ç}ÀTîIA|755µŽß4e †mO8:Óö·9×—95YÊÇÇGWW÷öíÛ={ö|ýæÍo.àŠi]€bnfVXX(§†S§OïÙ»·¨¨€ß[—9IB|Ã0Aû°€¦Fxþ³[À”ÒËn~Á'­¦‹7n\ØŠææænnniiixbIIɲÐÐÛ7oöë×ïm\Üð#ø$)yyyÆÆÆ€œÜÜæÔ/}“„,5ÖµdH¼ZÉ(„Ùuƒééé!ò!%…Á`4ó³´7x-‚ j~­.(((bÓ¦^^^½¼¼"6m ’¾Œ×°Œ*½P‘hÈ!C† AE"™ÙÚ õ±ÕLÈ®jQT4cúôß.^¼tùòÐ!C ðE—deg³X,éüÒ!9Ü¿??7÷ÎíÛøQ–DNxIä$ qòrròrròsss:wç~cmµ?×ö˜7ȰF$v7£S›=¬½v÷ÎsgÎH' …BEµµµ…BááÇñDƒ1|ذðAIIÉî={šS¿––Š¢¹¹¹6›N§ß¼y³¦¦æÈ±c’jGޱ!<¼ººº¸¸xç®]’ôI'®Y»–Çã ”> 8Œ2!¨k‹{÷näèцl6Û̬Oÿþwïݤ¥§ë|=£½|²ò§¥§3utŒLLð× !CÚ¬ÝP—ƒaÃΟ=;Ð×_èë{þìY9¦B/ŠÎœ5‹Î`ÐŒ™³f‰P´ÑlíJ±¨hÚ´i=yrêôéÓ§ƒºeýúõüêêâââ­[·N ”Î/â´(rê„!N“ÔIÄ#3mÌ´èÈlQAww[[[éCCðåËÒÓËËÅÅE’~èàÁ‚‚3só¡Ã‡O?žÔŒë»úúúÁóæá7¾SRR¶oÛ¶44ÔÃÓ³·Ôl8‡är¹æÃGŽ ¤8p@Bq÷ôd=:%5µEŸ«ÍÁ(‚º0¡P8q„ìÌ̬ŒŒý‘‘ÚZͽé#!k´m‚ ù99øë¯Ç›_joùùù~~~zzz²F*3gÎÔÒÒb±X›6mj2]>ü‚¥¶¶¶t7DéUYEêIMMÕ Óñe±X¼páBOOÏÂÂBétIN¦–V«ºI¶±X¼pÑ¢"'êêÕ¨«W‹8œ…‹‰Åâ†98Ž-¢@TdnfÖ»w着ªÑ£Gã)¿:$¨©±²¶öèÙÓËËkeݳ#8駨¨¨E‘Sg qäˆyøð±cøKãã-gÞcɪ¬"vvv ‡µ³³“ ɾaCQaabBÂÒI"‹ÅºqýzQaáÛׯMLM X¬zUIjNܵsg~nn^NŽ««kÐwßåfg''%-\°@R­¾¾þµèh¼Ú9sæHÒiTêî;3>}*ÌÏ÷öí‚ùóÛdw) öË„ .,//Ãá|„?çØÓÓOë‘‰ àÁÝ»±¯_ïÞ»—Ëå:;9;rÄÊÊ*-=ý›>}öîÙ³}ÇkkëÔ”éü®2ÆÎÔ+x#:šÏç¯ùñÇ[·o£(ê?fÌÎ;)êê€âââ‹Å<Î66^0þÚuëŠòóñâ%^U¿ŠòóV‚gÞ¹}{Ä–-jjj§Žÿæ›o<oŪU>Ä0lì˜1‡ˆÜ¿?öõëóu7°V­YC ¶mÙÒ®;_éˆD¢¿¿ÿ¬Y³fÈ/ý§Ÿ~ÊÍÍÍÎÎ.//''góæÍãüý;lÓŒ2!¨ c³ÙÆÆÆ³çÍ›1mšWÏžúuw½oݼùMŸ>ùu]¯JJKŸ=yÂ`0‡„¬^»öêåËEãããß¼z…••%_>邀а°ššš„wï¬9s¶lÙ‚ÿOZÂd2?üXUY9ýÛoå×)«EsóòÒRR6oÝúóúõŸõûï›#"ð±K–/¾~PQQqÿÁƒðõ멊žž^Øòår6!«Ü’E‹7vlrJ ^ó;w¶lÚ¤©©I"‘zyy Y¬>>>×oÜmÚÉS§¾ º|åJ½§º§ÊÊJ@­û—F§Ó+**ä¤7I‘Jƃçb±øÏ?ÿܸq#ƒNÿÿ<†¢¨‘Ô€‚ÿ o.UIzzú·AAÇíáâ¢ô;éÝ9)»P£LRúúËBBF ŒEvóÚµ¾}ûâ¤7,«pß2|ì’ä„„zóá÷îsssñ@3§î^¼™,û[7ö›¬Jÿ˜A2Pœ„ŸŸßò+’SRî?xðKx¸bG•Ðét ê««ñ€²²²ß½²Ò›¦Às‰D"1êêÕÉS¦hiiN™"IG$OªÛ>k³¤’’’’ “'¯^µjäÈ‘0À„ .¡ÅwÌtÈóç7Ù’¶UUU²t)Ç“Näñx!K—VUUÕË܇‚TG‹£L77·‡òx¼²²²€€€)u?C!€ ˆôLèãÇǃ=r䈲›¦š(êêï†nhlìêáQRZzøÐ!€¾¾þ¼¹s½}|L-,8EE¡Ë– >¼×7ß8;;7Ztþ„„„µad¤:…ÒÓÛÛØÔÔoÌÉØ%öíãr¹–ÖÖ£üü&OÆÉdòÖ-[BÃÂzz{{÷êÕd%:°o‰Drtq±²µ=uú´$}ú´iIÉÉÝé¤$ðÙh>‹ ´ï¿ÿ~Æ •••yyy»víš5k–ütùšQ²‘"2ào 8ðÌ©SÁóçß¾sG:½aN Ã.^L£Ñ¶oÛÖÊQ …D&Oàóùx ŸÏŸ@"“)J½Ì JRI-Ž2 ñ[`†kkëvh¤ ƒšššjhh°Ùì½{÷â‰UUUóæÍÓÓÓÓÖÖž={6þ¯¿zøðaSSSÉ5éæ×ÐLøc°²‚¨•455O8‘šœ\—÷åóçógÎHºBîØ¶-çË—ìÌÌ=zløßÿ rsßÇÅ…,^Œdgk[R7¾ZÃü’ĆÙ¦P©ÔÛ·üð!/;ûMlìüà`<]__ÿ÷«W rsc_¾ìß¿¿$ÿw3fded$ÆÇ/˜?oŒ¬J¤·egk+ÉÌd2O;–óåKVFÆÁýû%5›™™Q)”nõ¸+•Juss«©©¡R©øð´´4­º1S#""ð3¶‡‡Ç·ß~+y\Vz0 `X —+=ÕÍW«2Š4>;† 1|øñ£GgÏ™óÇ4RD*åòåË1Ïž±MM wîÚÕaSþرu«MàÔ©ÕÕÕÕÕÕS§ÚØØìØº•Ðð3B$E‘;­ééé½zõ*//÷öö~øða›· RLQQÑ’%KbbbúôéÃãñ²ê¦öZ°`AMMMFF@˜6mÚúõë·mÛ@Q4'''??ýúõ«V­úçŸZZu*¿><~üøÎ3ohxñÌÎή¬¬ _¦P(§OŸ>-u¹W~zs¶õÃìÙaË– 0ðôéÓ]{÷ÞˆŽn~ó¶66%Žä­1~~ÿ?ä–T:ž³(?Oá•”4§òö¹gϼùó§MèééáÜÁ‹—$Ÿ"#ÙÚÚ–••éèèüôÓOmÞ&H1jjjd2ùÇL&¿"UUUuñâÅÝ»w3 :þã?^¹rER$,, AI“&áC™(PC=(ŠjI‘ŒoAíŠÏç³ÍÌþxôèÇ5k”ÝwâèÑÿ…‡¿~óæõ›7ÿ ?!£§¯êAäèáÕ•GFš1O AŠ?5¢§§·~ýúÑ£GïÛ·¯ )LKK+::zÏž=Ë–-sssÛ¶m›OAAH$’ܰƾ#F[[@¥Rñ®]-­¡!A$×Q HBú~w{ Ñh¹u—Þ¡vB$/\2t(àñ£GrŠˆ*5$3‰H¼ï€D&+»-Ô5´êÙd‘HÔa“kAÍáççççç' ###§M›–™™©¯¯ HVV–¦¦fÇÔAJ’„Œ&&&7oÜÀä!ªV” €ce@P‹´øpëÖ­ììl@AAÁúõëÇß­‚‘››{ÿþýšš2™¬¡¡Ÿß555—/_Ž_bÌÏÏüøqûÕÐ(ùÁBÔ%¥8:::::¿Ö°¡ûéøãAY‹£Ìôôô>}úhhh¸¹¹ÙÙÙEFF¶G³  (ºqãF}}}:~êÔ©sçÎáéÇŽ£P(ööö càÀIIIíZƒôx™‡= A]‘HüofÕ%‹¥cGùцaõM<ä"v'øç…‘&I´øŽùòåË—Ë’ê`"‘`fföÏ?ÿ4Ì@£Ñ8pàÀFKáËø%ÆÕÐhK}â>† ©=½rUï‚\\X¨#5©üN–¥\.ãëN5tƒËå°XíվΧ”ËÕd2‰*×O@õ\¿tI~†ñS§6§ž´´´^½{óJKÛ¢Qª©SÌAÔµ8¹º¾Œ‰1Ð×g«^T!‹ óò^ÅÄxöî-I”õ1Åb1§°ðMl¬ó×sÙÚÙ½yõÊËÛ[ŸÅR½]T¾ÞÆÆÚÚÛ·GßÍĸ8ù\<<Ú|£ª­ßðá²ÞŠ‘1DcZZš§——&Æ0G‡ýûöÁ»sM‚Q&¤ˆ¬¬,''§z‰ÉÉÉfffJiu0îÙ»wüë×¥\®êÝ:'‰Úºº=<=itºd¤ñße\þ!‰ ÃÞÁA[GG:ÝÐȨºº:>.®ª²RõvQ=D"‘¡©iamÍ`2Ûé !9q¤ü”Çãe|ùRQ^Ž@£ÑLMLXrGh=>Ÿÿêõë´ëVZÏÜܼÑt9g#RXP€¢è†ððÅK–œ¨›&’F™"ÌÌÌ*++•Ý R cjiõêÓGÙíhgu!æ°‘#(mieehdTSS#‹U»ß "‘¨®®ÞÙ.n•––&&';ØÛ³½½)+-ý’•Åf³EµµrJásûÉZm& £ª¢B‘Fwzø8ÓGÃWŸ8±)"B]]ýôÉ“>>>€ãÇïÚ½›Ëå:;;Ÿ8~ÜÊÊ pôèÑ]{ö”–”0µ´–-]ºháB@Ÿ¿fÍš7o¢(:Îß÷®]*6ŽŒ2!‚Z† ‡Kl6øÌŸr}úüÙÖÚÚÜÂB(u55G{{@óü9~­‘ÏçǾyãÛ¿?~ÒÞÖ6óË*fgc#½êîꊢhú§OÅÅņéëéÙÙÚ‰D¼”­MFf&‘Htvtd2™qññ†Ý»w0 _?e'‰¢¢¢ìí(Šæåå}JOؼù§Ÿ~üèÀÚÚúyL ƒÁX¸hÑÊU«~Šâp8a+W>zø°wïÞåååøX=€eË–Õ…ɉ‰ᇙ3#6oþeãFe~¶¶£L‚ –©•{¨›ƒ!xç!‰**+Ù&&šÉãž(Š kjÀ××5 >ŸaXuMMß¾}ÕÔÔ*«ª¤Wðöí[L,ö0!‘âââ²rr,Ì̆‰1ÌwÀ€Ì/_>gfzyzz¸¹½zýzÔ¨QêT뮊¢Æ&&'GǃuOĆ,Y‚ È8ÿC¿þЧ 4_ž8i¨›Z/-=ÝÙÙYSSŸè¤ŠÏ¿•œ˜H§Ó+W¬˜9kŒ2!‚º=WZú!)©¬¤Dõ:‰D-{gg¦¶6~Óü¯G$aJÃÌ ÃÒÚZ¿Ao¿Â‚‚´*+*T~   A§[ZY™˜švžQ3ñŸC*•ßìPÏÞÞž@ ª«…ô*Š¢EEE¾Èd¡@`jb’œ’bgkËçóÖÖÖô˜ÌŒŒ 5uuP¼ªXˆ @$/'G²š––† ˆ––€J¥J~ž:}zÏÞ½EEEü‹Ãd2»páÀÁƒ«V¯îѣǦ½½½‹ E"‘—·7^JþÔz]TÓQæúõë; ݇µ‘‘²›APkñ++ß¿ycëììèáÑy¢Š¶"‹Ë¸Ü·/_öîצ¡‰DSfÌ•¹¨°ðõ‹$Iú .7)1ÑÅÍÍÔÌLå/pŠÅâ‚üü7/_L;ÍCøL˜B¡°™Q>@PSS“„¤Ò«x%1ÏŸðßètD"áÙÈd2¿²!1 S±iEPRR²,4ôöÍ›ýúõ{7|Ä<}äˆ#GŒ …‡~ýõ‡™3““’ôôôù’Â`0”ÛæöÓt”©««Ûí€ êB’ß¿wts321a0ªe€¥%›ÍŽ{õÊËÇO§ˆD–‘‘wß¾q±±Þß|#IOINvõô4·°SVeˆD#6»w¿~o_½Ò70РӕÝ" “H :½  @OGG:ÐÄGÑǯÁ tÿ¨’â«d2™@ :TÖÅ6I)Õü:´„P(DQT[[[(>|OÌËËKJNп¿ššš†íÅ`0&Mœ¸fíÚÍL&³   55uàÀÊl}[kú7µ©8¨µ·’âbuMeCLz,VIq±dUþ™MGW·¢¼\ºx9gdlÜ1çÕNBGW·²¢¢SÍ£kme•’’RÌåŠÅb Ãx<^Jj*…BA¤  @,çææ6§‰d ¯Ÿ””TÁãñ++ËJJr³³e݈'‘H†uªýБ Ö/ýÀꊻ§'ËÈhäèÑ)©©Êkx»húZ&#‚ ¯‰Åb•Ÿ·šXoM©ÿ©©©‡ÿÏL Ô럊a™DÝé?¾:U?]mmm·=2¾|INIÁ0ŒF£™›™Q¨T[kë„„ALÙìb.·9UÙÛÛgff¾xõ EQu556›­'55”45556ûÉ“'€þ}û¶áÇiC1ʳQvvvõ¦ù‘N±³³ãr8ørø† á6àËKCB¦&&øãçõШÔÝ;wîÞ¹³…mé2àÓ?APÓ$WrssGŽˆyöŒÍf7§H·ÒNŸ¹Ééda0nnduuü.-&× …FFF¦ffjêêÃ,­¬4m°Ô½Úz«„H´¶¶vtr»cb&ª­•ÎF£Ñùúâ˶66ÎÎÎ$2¹ùu¤fN µ¼– A5 ÿ_À).žpéÒ%À䀀7nè˸ Tñ߇P(¨©©uðv[9$Š¢(Ÿ_/QT[+›½V(ˆÅbéqÔë­† á×õHg“^ÖÔàC&AÝŒ2!‚ ¦áÿ ‚‚‚"6mêååˆØ´)((èî;rÊtXó:Š¢C† <ùë/Õq‚ÚƒâOÿL:544´ûR« 6?„©©©N§Óh4OOÏØØX@~~¾ŸŸŸžžžŠÍU5÷îÝÈÑ£ Ùleé*q IDAT¶™YŸþýïÞ»HKO×Ñ×o}åiééL#ü5hÈÖ× uU0ìüÙ³}}ñå¾¾çϞŗ (1z‰Ptæ¬YtƒÎ`Ìœ5K„¢fƒ Hš‚Q¦««+ÞÁ¹ƒC4ÐGAÊÊÊÊÊJ??¿yóæˆD¢¿¿ÿ‘#GÚcsPç! 'N˜™™•‘±?2R[K«m7 H~Nþúëñcé·d Ó )FÖC@0sæL---‹µiÓ¦&Ó[_°QøL[[[ú„&½*«H=©©©t:¾,‹.\èééYXX(.ÉÉÔÒjËó¯¢ÄbñÂE‹Š8œ¨«W£®^-âp.Z„?µ]O3w&uŠD™4ÍËËëéÓ§¾ É׎ǒHœ8qâçÏŸ,+88ŸÃ Rayyyçû  2™Œ HOOOÀXEñ ïß¿/)) úássK›µëÖáÑ!~½óÜ… N=z°ÍÌ–††â}ÎäÃK=ÞÅÍmÒ”)>Ÿ²l™¥™¥åâ%Ku=±Š‹‹LL¼¼½OœEãããß¼zuùâE@hXXyyy»w)‰‰œââ-[¶àÙ‡„0™ÌÏ?Þ¿{÷ò•+òë”U Š¢¹yyi))Ó§Mû¹n²E!!ÕAb||ÆÇ3ø8eÊ£Gx<@$ý=­ >C*ëÇáéÓ§ÃÃà ›Í ;yò¤üôÖl\“Y#%džkkk˜9óCZÚý»wutt$é sâ >}ûêà/ cSDD;¢ªªªÖÖFGEQ©T<…J¥FGE kk«ªª6‚ ‰Ïeaa¡©©ùþýûöh ¤Eµ´´h4Ú±cÇΜ9£ìæ@‡L&ß¿sGWGgíºu¶#GÆ/fK«¨¨¸ÿàÁ/ááT*U__ͪUÒ1ßúŸ¦R©zzz«W­ºÕp(ŠšZX௣u# ¯]½Z]]¢®Îçó£~ÿ}sDN×ÐÐ[¾<úúuÉFÃׯ§R(zzzaË—Ëù²*Á-Y´AqcÇ&§¤à5ß¹sg˦Mššš$  ÅÅêããsýÆ À£ÇuutÜÝÜÛ¥M~~>—ËuwwÇWÝÝÝ夷¾ ,MFcÍ,‚Ç£3¾ý6//ïöÍ›šššÒé sâËÏŸ=+*((*(ˆºrESSsì˜1-Š[ƒF£íÛ»—Á`H'2Œ}{÷Òh´z™[|€!H¥µìs‰4tèÐ7nHá—ª3@¤¬¬¬²²200ðÈ‘#ÊnÔqÌÍÍ#÷ìq8kÖ® ^°à¤3à×8MLLðU33³ÂÂB|™@ HÒMMM%éÒÉÎÌ”¬¦¥§#"¹°°P$õ–LBˆaø³·øF%ƒ)šššÊù²*Á·®¥¥ P©µµµx͆5¬pú´i'Oú>(èò•+Sål®k©¬¬$T*_¥ÓérÒ[_PEÎöÁ0±XüçŸnܸ‘A§uE¤àüoxs©JÒÓÓ¿ :~ôhx{‚:¿–E™šššÚÚÚS¦L‰D°xñ⨨¨üüüvl#Ô% @RÃ/ÕÕÕ\.wûŽ“'·´ câ„ ?®[‡÷‰,(,üûï¿% ÿå—j ¸¸x÷ž=x~6›M§Óoݾ]SSsôøqù•4ŠN§ñó[÷óÏ"‘èõ›7x:•B7v윹s½zö¬€viFFFºººñññøê»wïð™‘e¥·¾ , œÜääìׯßo., ‰¾vM:½aN|¡¦¦fêôéC‡ Y0¾B§^ÅUUU…,]Êãñ¤y<^ÈÒ¥°_&Éײ(S,WÖÁŸþ©¬¬DQ´Ý¿å*¤½hppð¡C‡jkk©Tª››[MM •J•܃T E]ý}BÂÐáà ]='fy( ‰LžÀçóñ>Ÿ?9 €D&S(”z™[|È!H¥)>9—Ë•< )‘ƒƒƒô°…“&Mš4i€]f»MMÍS'N4úÖŽmÛvlÛ&Y=/ã±°ïfÌønÆ YõÛÙÚ–H=ºÞh •Jݹ}ûÎíÛë•Õ××ÿýêU|9-=½Ñ-.˜?_N%ÒÛ²³µ-ªë™Ãd2OÔ=‡$ÍÌÌŒJ¡Œó÷—õq:?ÉB|ÿGDDÌŸ?ŸÍfS(”Å‹O›6 ÏÓhzZZš··wYYYK 6 Ã%%%:::’´z«‘óÖˆáÃ=:{ΜsgΘ››7^×/_¦¨«³ëúã® [!÷‘²6D`ÇÖ­‹CB§N½|é pêT›[·m0AušŽ2¥;xAuZ¿><~üøæö2ì”ýqH¡PNŸ>}Zꪭœt;;;<ÄliÁf¶í‡Ù³Ã–-0`àéÓ§»öî½Ý¢ckcSÂáHÞãç—_×S:ÏY”Ÿ§ðJJšSyû‰Ü³gÞüùÓ¦ôôôðGîày’F™uy|>ßÖÁÁ„;zù²²Û¢âN=:90¿êü¿ðð¨n³Ã9zøðð‘#ÑW¯ÂyÌ»´ë—.ÉÏ0¾ÜMKKëÕ»7¯´´ÍkîÌ`” AÝTÃ{ßíº­¢ö‰‚F£åfeµ_ý€H$ .^¸0dèPÀãGäK@ ¶xHæÎŒD$Þ¿w@"“;xÓ‰qqò3¸xxtLKTF¿áÃe½óða£éiiiž^^4šÃìììöEFölõ4(Òu::8ìß·Ï­©±~»V´Út”IT­ÓA¤IÈhbbróÆ 5«,ª÷ï£ÞóIN)+åóù/ccÁ0LCCÃÞÎŽA§·[»žÿº7#»‚ …b±8bóæ%!!ÿÄÈÉÛ\x(Šn_¼dɳ§Oåd–~ £Khú@€ÚTT‚ 6G”âèèèèèHüZÃ"Ê>Ý*AÇù¨Q£Fi``–žÞ~q·ê¢J$ýÇŽÍÈÈTñùKBBÌ,,ئ¦ -’ qüøqG''kÐàÁ §dkAI“&¥¥§7,˜––ÆÔÖ>sö¬“³ó„I“Fƒ¢(ËÐehØ®³M4}-³™ÓB@ÍdJBP×G$ÿ›™Fu‰Åbé D~U/³$¿ê]Δß .Ò€_U¥­¥•™™©N¡”óxÒÒJJK‰D"ËÀÀÆÚš@ äp8×=/^½¢kh¸8;þyñÂÕÅ…N§£(šþéSqq1†aúzzv¶¶D"‘Ïç¿zýÚÞÖ6óË*æîêªìÚAD"Qôµkø4­Ë–-« “ Â3gFlÞüËÆkkëç11 cá¢E+W­ú½±ù{ëÕå`oßhAEßÅÇǽ}‹aXVVV¯Þ½ :à“¶^ÓQf¸ ͢ќ=|¸õ•¬_¿¾õ•@mÂÚÈHÙM€”@GO¯¼îQnUU\X¨#5‹˜üN–¥\.CSS:…Î`p¹\ƒº‰¦ºƒR.W“Éì„5†a…EE4HLùðAÁƒc››kfb¢Åd~üô AÅbqEe¥:•ZVR‚¢¨>‹US]œšŠ‰Å¾ $R\\\VNŽ…™^suMMß¾}ÕÔÔÕÕÊþ íEQc“êêjƒñ<&¦ŠÏ¿•œ˜H§Ó+W¬˜9ke4/¤¤Ô¦·¤¤dYhèí›7ûõë÷6.nøˆͬ¹9;a÷_9`”Ù%Á(‚” ØZZ½úôQv;ÚYÝ©fØÈ‘ ”¶´²242ª©©‹Åª}Î"@$ÕÕÕ;çt¾’(¿ÒV]]‰Å@ ¦¦†G-ZZZÜâb~uµ ™L.(((++³°°@Q”L&„¡C‡Ê%´þK²²²êÝ»÷Õ«W'Mœ¸fíÚÍL&³   55uàÀB¡EQmmm¡Px¸%ÝäšSPKK EÑÜÜ\6›ÝFŸ¦Á(‚ ¨eÈ>\b×E¥R;gàÕ=‘H$]]ÝÔÔTkk‘H”ñå‹‘¡!#þ×5S]]CCCÑ„âb€aÚÚÚ555$É@_?))ÉÒÜA¡PXUU¥­­­ìO£d³gÍ [¹òíë×6nt÷ôäóùFFFÁóæ 8ÐÐÐ0lùòÁC†Ì;7úÚµfÖÙœ‚úúúÁóæyy{é[íŒ2»¤nøÃ‚:ÚÚZe7¡ó‚!x'ç`oÿñÓ§çÏŸÁŲ··GE"FCŸ•A*•J¡PD¢Eööö™™™/^½BQT]MÍfwÑn‚1¶t¬K;;;é±ÐÇ7nÜ8Àî;wïÜY/sø† á6àËKCBo´Îfܵsç®[ìœ`”Ù%Á(‚”Œ@à•–~HJ*+)Q½N‡D"QKGÇÞÙ™©­ß4ÿëÑ#YO0àý2-­­õåεR“Óÿ4D£ÑX/QLvvtT£PðÛߢÚZaM þV_Ž^žžT 1‘hmmíèä„wÇÄ0LT[Ûhý]B{L 5ªÅQfjjª£££††¾zâĉÀÀÀ¶nÔé(SGGgæÌ™µµµ¡¤¤ä?þ((( 8ÐÒÒRSS³¶¶öóçÏOž<‘Œ AP+ñ++ß¿ycëììèáѵ:ã7‡X,.ãrß¾|Ù»_?š†@$M™1CVæ¢ÂÂ×/^H¤zAmEá $ÅbqUƒA¯1 «‘ñH¸ôs<Õ|~½bB@ØŒú!HB‘k™‚Tv³Ê:é(Ã0 Ã"## Bß¾}‡ vöìY@MMÍ­[·8…B:tèÈ‘#¯5»kAò%¿ïèæfdbÂ`0T/ÊKK6›÷ê•—ž ë Hdy÷íëýÍ7Ö@‚:?xǼKªe‚ºXóÇžžžxÊs|Ô ª««_¾|9mÚ4xŸ‚ÚJIq±½››Ê†˜ôX¬’âbɪüˆŽ®nEyyû7 ‚ ®D‘(EQcccEÇ¿{÷nÉÝs¨Ã4e‰D{{û‚‚‚†ÿ ,,, a” AmE,wÎy«ÛPýY4¥N ©©©‡ÿÏL ¨^ÿT‚Z©Åó1%$$äææ¾}ûöÇ¡¡¡íÑ,¨EÂÒ¥K—/_îææv÷îÝzïâÃz=zôH)mƒ H5`urrrFŽ5rÔ¨œœLвAP§Óâk™L&“ÉdØlvDDÄ„ Ž=Ú ƒä©wBÇ0lïÞ½jjjþþþnnnOŸ>•¼ekk;jÔ¨ßÿŸ® ‚ H1øi‡S\<9 àÒ¥K€É7nÜÐïâ#Ú@Ô~Z;·,üýªØ×𔚚šGyyyQ(<ÝÙÙyôèÑQQQÙÙÙÔ>”ý·ÐM¥¥§)»Ý þ±iS//¯^^^›6ÁïA²´8Êüûï¿ñròòòÖ­[‡I u°†¾PRR’““ãááaXÏž=‡zùòåzwµ ¶¥ì¿÷îÝÈÑ£ Ùl¶™YŸþýïÞ»HKO×Ñ×o×íæ8:;K§¤¥§3utŒLLØffŽ..sæÍKýð¡]Ûu( vþìÙ¾¾øò@_ßógÏâË | êlZe>þÜÝÝ]CCÃÃÃÃÉÉ)22²=šÉ×0Б,ÇÅÅyzz„aÆ©©©MŸ>}ÅŠ+V¬X¶lYÇF_Ý…rÿ„Ba@`àÄ ²33³22öGFjkiu̦þñÇÐ!Cê%"’Ÿ““›•õϳg®®®ÃFŒHIMí˜ö@ åççûùùéééQ(ét@0sæL---‹µiÓ¦fÖ†ÿÁkkkKÿýK¯¶Ã'€ ¨kkq”ùã?TUU:t>`®t\.wË–-’ÕÔÔÔ}ûö‰ÅâÍ›7oݺuG={ö(±‘P;ÉËËãp8ß‘ÉdAzzzúøøÆúû£(jdbbdbòþý{>Ÿ²l™¥™¥åâ%K55 îzç¹ œzô`›™-  ÿqùØñãŽ..†l¶ƒ“Ó¡_mtÓüñÇðaÃd5L[[;dñâ o¿ÝQ7 Z£mðx¼¹ÁÁf––¦ /ÆOœ<éìêjÈf6ìóçÏxbqqq@` ‘‰‰—·÷³gÏ$Û’U3D$ýýý9R/ý§Ÿ~ÊÍÍÍÎÎ~ûöí¹sç.^¼ØœÚ°¦^Aõ´¶_&¤¨ÓPî_›Í666ž=oÞ½û÷9Ž$ýÖÍ›øeÅüœWW×а°òòò„wïR9ÅÅ’Ÿ%(Š>}úôÍ«Wñoß&$$ìܽÀápV®^}úäÉ‚ÜÜW/^øúú6Ünmmíóþ4hüæ5êÅË—ø²¬6, ©ãã3>~œùÃx¢µµõ³'O²33mllV¯]‹'. a2™Ÿ?~¼÷îå+W$[‘U3Äb±‚ƒƒ¿îØ8}útxx8ƒÁ`³Ùaaa'OžlVu’;ã²^A_ƒQf—¤ìÈ úÊýK “É÷ïÜÑÕÑY»nÝÿ±wßqMœÿÀŸË%! I6ÈFPŠ(V­ZWݳժ÷¨Z«]‚U[WݳjýªUë¶jUj[ëj]8˜ "  !dÝï+ù¥BP ƒÏûÅ‹×å¹»ç>¹ñ¢E†¼;PÛëׯÅbqhh(ù244411ÑMüê€ ‚gÿ˜%£'7ÀtxxxlÙ´ !T(-[¾|ƬY¿]½ª=AAAR© ×<' p'‡1 suu%‡ÝÜÜ B666GÚ¹kײÏ?oÓ¥sg…ÆýöÛ»õŸ.×(‹y<žžD"Annn:3þïСÍ[·’Ýo) rJ„‹‹‹&Úߨ“D"Á0ŒÉd’/Ùlv…aÏ¡†<ÐXeš% B]ÁÂùó‚þû;„Ïçã8žœÀáptf!"''‡L4srrÈòþýúõï×O.—ïÚ³gêÇ'>y¢3cÜo¿9|¸Á®\½Ú5<\O †ib ²xñ/gÏvïÞ¼ƒ!$B¹¹¹d¢™““Óà»ub³ÙATUU‘‰¦D"1tÕA– ,ŹãÇõO0lܸ–‰ÄâA²b–ŒzŠü‡q[B¡H´ióf2å*++Ûwà@‡ÐP„ÏÆF¥Rååå!„8ΈáÃ?ÿ⋲²2„P~AÁ_ý¥©á›Õ««ªªÄbñºõëG…Ê{ýúÚï¿WWWÓh4k«öOš—/_VËåþ~~z+--ݱk×ÁC‡ÈSÛõÅÀf³ôÅW_UTT(•Jòä¸\¡P©T¶¶¶r¹|OÍC8Nÿ~ýb¿ù¦J&+**ú¾æn6ýïÔæäädooÿ¤æ—Ããǃƒƒ ™ΘQâ£Gúÿšc¡R©ôæ­[ÍQ³)ˆìׯ¾¿úfIKK³±µm™ðÒÒÒØ\®ÐÑQ öŒŠzRë§~³´Xx†ƒc™fÉÀ3\ 84tmb³bXY=MHسwoii©ƒÑ£GÝ;w"„Aôôé]ºuÃ0ì× ¶mÙòÕŠ»t‘J¥NŽŽÓ?þ˜¼§ÇñÈÈÈŽ]º”••>üÓÅ‹Bj•jíºu“§LQ©T{wïÖYèÕ¸¸úî.'ol§P(\'"""îÊ•¶ä¨úbؾuë¢%Kƒƒ)ÊÁƒ;uìè(~²paŸ~ý>ž6ílÍu–Û·n9{voo7W×™3fÄ×|³ÖW3@Éd2²ë™L†"»4šæLSD š‘´²Ò†ËÍÌÌ´b0$ååéÏŸ!àóý|}É«brss_¾z¥P(hTª››››««öÑÊÚc=yBÄåË—BBCËËË_fg+ ¶µuÛÀ@&“IÎîëã“™•E¡P‚mllBJ¥2-=]\\Œ‚Ïç „T*UQ™,•J•›››‘–¶vݺ'OþðƒÈá/¾úêZ\BÈÛÛûö­[göœ9Ÿ.]zúÔ)„Ð0aS• IDAT¬Ù³ííí³23¥Réøÿþ¼¯R©zô(;'ÇÓÝ].—§edtéÔI ª”JiUNGR)BÈšÃ)‹kírïÁƒ÷Þ{<È­R*#ºve²XOŸ>}ž™Ù>8˜\®š ¢zöÌzùòEVV§°0•JE>x¶WTÝÊŠ¼Ô§Z&«3*ã®´-˜?Çñ¡C†¬ùöÛ… ÃÛ¶o'Çjºž1cƈ‘#BWãâR““™L&“É\²xñø ôÔ¯R©œ]]Bmwlß®¹~ZS!é‹åË­¬¬šã 6 È2h¥ü|}‹:Y€ylÉÁÁáØO?õéÛ!ôûµkš~ €i"âÊ•+*•ŠJ¥Ftë¦P( £zö¤Òhr™ÌÍÕ59%ÅÏ×W©TR0¬Z¡H$„¨ŠJë:? …¢gl¥D‚âñx8ŽËªª„OéVVH"Ay{{#‚àÙØdffÒ­¬*ÊËEEEQQQTM&•ZÑh …B¥RÕ•Ü„Ÿã…ã8ÙMN·²²";j Óéš'¨ýxðà¦Í›ÿíŽM©Dµºcs­гˆ¼šÎ4꬜†Ïç7é;kbehVsÓÕÕõ—óçÉ£F†aØ€ Å£Gróò|>A·nßFèßk 0 £R©T*5888777))ÉÚÚÚÛˈËÕT¢,)ïõëìW¯È‹  Ž“K§ÑhR‰§P‚À(…Bâp8ÒÊJò µJ%—ËëŒÊ”³LýŠ‹‹~òÉÅ_~‰ŒŒŒô¨_ÿþ¨¦;¶¼¼;uÒîvçŽùùùî}ûõ1lÇBÎ ¨¯Bm`Ftt§.]¬­%Á±L³—ššhmm­V«öìÙÓ¹sg„ÐÕ«W-Z”““£T*Û·o¿~ýúÈÈHc €…°ãóËKKEó**(°Óºä Ó›D–ˆÅœZgQIqvrJþ¼{DDFFÆ?÷î©T*+:ÝÅÅ…Ïçe½|™”œL„µµu»  íëK§Ó]]\®_¿Žêâáî~ûöm:æìì,Ò{Áw€Ÿ_Æ‹wþþ!Äçóy¶¶j•Êßß?++K'*Uc:]j¬[qqíÓÏϯ¬¤D{€ÖôF¤=[Ó킚;&…Báùš€½|ÙA(Dùøøh_©³,ÚÖžfㆠ7lhäÛj^eZÇ%‰Z­^±bEttô£GB!!!qqq... …bÛ¶mcÆŒ!Ÿx{mÛ·¿{ë–ƒ@ tv¶¼cxjµº /ïÞ­[aáášÂúÞ¦Z­<¼?Ȱg7óøa±X½{õÒ¼NNNtÃÇÛ;°m[*•Š"B©P0¬¬:uìÈ`00 CH­VWËdšÙë‹òõñ ¢Òh!.—@£Ñ‚ðööÖY:‹Åz§æY T*5Ðß?¤}{œJE©”Êj• §P¼kEÕ|Y¦± ™ššŠa˜¿¿NNΚ5kÞ:Ô(a´$È2-…B1bÄÖ­[É—ŽŽŽäA†‘›= I°Øì°ðð'”ˆÅ–wêœB¡ØÚÛ· c±ÙšÇ—Ÿ®çÑÏ …ÃáøØB÷ìÍFσôS«ÕÚ½¦+•J¥D‚’ËdòÿNI¨ÕURi}³×9!$¯®ÖÜ££=¬Ëu–®=L™§þ7¢vT¦¤¤äãéÓE"ÝÊêý¡C?ÿüscGÔì Ë´J¥òĉaaaš’ôôôÎ;———wéÒ%..Έ±`i†Çëaì8šYMŠùî€Æ  Э[·¤ÄDcGÑ¢ Ë´*•ŠÇãI¥R.—¯)÷õõ----**š4iÒ—_~©9Ì x4ÍØ!€€,Óà8^ZZ*‘HÆŽ»gÏžÕ«Wkåóù+V¬8p d™–‡¼° 0A–vÑzkÆf³·lÙ²eË–¢¢"QJ¥Ò4ûk€¥‚,Ó¢øøøDDD]¶^¸páÕ«W¡üüü+V 6ÌØÑ ,ÓÒ̘1cçÎ …"===""ÂÚÚ:$$ÄÏÏoË–-Æ @ý0Œ°¸þ šÙƒŠ±£úÀE]f/ @©Tj^Ž9räÈ‘¡E‹-Z´ÈxqhVZZÊb±ŒˆÙ¨”HL&.O7ap,0>;àEZš¤¢BóàoP‚ *Êʲ33Ù66—›2øh!iiiÃÃu‰ ñx<¹\þ*+K^] ‰¦~†1 6—Ëb³i8®}B˜È2°ñ}¶lÙ“Ç)8îééùÕ—_8° s»:ëûj! ÄBa—«P©µÁ‡zQqœÉdÒét¥BaìX@½ ËÀBÈåò‘£F-ûì³_/^¤P(?Ö<íÍ,ê „˜L&ÓØ1˜‘fJ1+åjk:\RØ`%`!róòD"ÑG“'Óh4Ç;uì8x°J¥:: ŸO¸¾úBeeeÓ>þØÅÍÍÙÕuæ¬Ydá¾}ûÛ¶u ßéÝûÅ‹:µÕÝÍ4Ia9mp, áêââââ2eÚ´&NìÜ©“@ ˽x±sxxA~>ùrzttµ\žœ˜ˆaØGS¦¬^³æ›•+B*•꯿þŠøPZY9jôèõ6|ñùç†Ôš5gB(%)‰Åb=zôˆ,ôöö¾}ë‡Ã™=gΧK—ž>uJ»¶… Ö4·sÇ×7*¥”õ¨˜}âóÞ-)##£g¯^y991--­[÷îb‘¨9¢zKp, A£Ñ®^¹Â··ÿlÙ2/Ÿwû÷¯óâÉS§¾[³†Íf[[[ºdÉ™3g4ccbbXL&ŸÏ_¶lÙÏ'NXEEÅÅ‹¿ûö[.—K¥R;wîLNÿÎ;ïØÙÙÑh´3fÜðÀð0 ¹EöëWûÏ%ìÿ½òê&®s–´´46—Û£gOM‰L&sqs³×úÉý6|||Þ ÅÔFFHž¹:9 <8--­Ib{cp,3SVR’—“S]]ÂÞÑÑÍÍM3ÊÓÃcë–-¡ÂÂ¥˖MŽþýÚ5íy ”Je§.]È—Aà8NcææêJ»»¹Ô^tõ‹D"‚ ܵ ýxðà¦Í› B:w€ê Cãñýû†¯ÐÄ0ŒF¥Ú ŽÎÎÐë5°TÚ/«äê~;â?ìÁ~™Xß,8Ž—–•%''·mÛ!táâE‡ìììfÕ`8Ž“g®äryLlìôèè¿®_7b;u ®ýFê ˜¦µµ\&“VU;šÅ/ñâ_Å”)B1g_vð`µkp.w77??¿ß®];zìØÈ#h4šfTí‹Ñ+**®ÆÅÅÆÄ0™L{{û%‹ÞüyópèФädQ—¯\YËd2ù|þ’%K4£T*•³««³««ÐÉéä©SÖ¯7|‰ÍΘ`VÂÊʪº®³ä\.÷?þXçL7lظaƒæå÷6|¯õRcÒ‡NúðÃú–¬§~›èždЉ‰‰!‡ÌŸòóóÓtÏb2ë ˜ ¨ý{ • ޼È*’½».aïߣ‹Î-lkà¼Lœxä§Ÿÿ÷|tí‹ÑE"BÈÅÅ…œÀµf A8Žóx<„“ÉTÔꔬÖUëJzíÉ[ˆd2Ù×+VÔîߣ…Á±L´.,:vû«_n«Ê^kžâÔ§-ÏÀyßÿý?þøƒÅb…„„h É‹ÑwlÛö:7÷ÒÅ‹ä3BÉßòòòÈirrs›$x²ÚœšÒ_Õug:ƒÁ?~ü?wï6Éßd™f/55Ã06›Íb±ÂÂÂî7òÎÜÔÔT*ih]œmé,oýŽcµRêÎfü°kë×K—tdÖy1:‡Ãé÷î»±+WÊd²âââï7mj’È9΀þýcbc«ªªŠŠŠ6lÜX{¹\~âÄ o/¯&YâƒôÂà8.‘HÔjõŠ+¢££5Ýb` ísÙ#f¤§WJ$äÁ0P' ÃXÖÖî.®®oÓÙ–•²gŠoGOÎóÂÆ]Ü!4T§Ds1ºƒƒÃôéÓÏœ=K–ïܱ#zÆ wW7·™ÑÑâãÑ[tÀ®AVëáééêæ6{æÌøøx²œ|ÒB£P:vì¸ï‡ÞxM²LËA¡PFŒ±uëV„X,ž9sf\\FûðÃׯ_O¥RSSSƒƒƒÉ‹ERSSCCCe2YïÞ½U*›ÍFݼy“¼k@Ë+).NMN usw×¾­èP«Õù¯_?¸{ð7ëlëV\Ü­šak„‚ì§Hëëü5îçç§é™¨öÅè!¡PxþÜ9rø×Ë—„BTOìšúµ¤]¿6@pVëaü19±¤¼\ÿ»haeZ¥Ryâĉ°°0„Д)SX,Öëׯ%É AƒV¯^½bÅŠ:çúã?‚ƒƒ%IË @WÚ³gí;vôðôDÁ‘L=0 ÅÉÅ¥kdäûwíù|ƒÑ¨Ù‡×LÕF^Õæï“³fÍš÷‡m±E›È2-J¥âñxR©”ËåÆÇÇ———_¼x1++‹Åb±X¬+V|òÉ'õe™LDEy¹“³3œ+7½}¥DR]]ÝØ,³%•””|<}ºH$¢[Y½?tèçŸnìˆZd™–ÇñÒÒR‰D2vìØ={öL™2!äîîNŽõôôÌÏÏ7j€FJEe†‚ajµZ¥R;}ºuë–”Xï#+-d™–ƒÍfoÙ²%44tÚ´i¡ììl2Ñ|ùò¥££#BˆN§«T*¹\N§ÓE5×yÀCŠ-€Z¥Êzþ<#=½¤¸!dkgçãëëéãC¡³ ‚ Š‹ŠÊJJdUU!“ickkÇç›B“3Í5¦Íô#ÍdKY¦Eñññ‰ˆˆ8zôè Aƒ–/_þÃ?TVV®\¹râĉ!777‡sæÌ™áÃ‡ïØ±ƒœÅÖÖV¥Råää¸ÂÓŠÍSUUÕkת ߀€®QQ¡Üìì„„„ôgÏ¢úöe0™Öóö÷¿¸¨ÈðÚ EbRÒ[·nݹ“ž‘¡9’'—ËŸ$$ܸuëîýû¹yyݼiHmš5¶ôxæŽky¢ …¨B±ãZÞÒã™Èà5fkk»`þüÉ“&­]¿ž,©”JçÍŸïîééâæ6{ÎÍO¸²²²iìâææìê:sÖ¬FEXçXý~ñå—_ùåðáéT*‹Éœ7wîÐ!CÖ­[W_0&ûp::>yòÄð@s#Þέ[·Þí×Oàà tt=fLZZYžššÊ`2íù|[;»ˆîÝ?~lÏçÛóùvööd9ù—ššjÍfXÛìÙ³5/mx*•*//ïyzúÄ ¾üê«ÆÎ.«ªb°Xõe0™äý@Jyö £Pz÷îU!‘¼ªypê³gt­OïÞ‘Ý»‹ŠŠaA5kì̃ÿdºäËF­±AþóÏ?äðÂ… ËÊË“ÓRSE"Ñê5kÈòYsæTÉd)IIÙYYÓ¦N5¤Ú7þLKKKã=>|¸váÈ#þøãú‚ùõâEòmA~¾ö™1½Åéã7nŒ3fftt^N΋ŒŒÈˆˆÞ}ú¼ÊÎ&Ï,ã8^TX(*(è5köì¢Â¢ÂÂ;·o[YY‘ÃE……Ú1è¯B¡\¸x±° àÿO[„¼ºzØðá£FŽÌÏË{›»sÇ[ÏXgÌí‚ii’Š ýÉ(¨ ˆŠ²²ìÌL¶ «þ¹!àî@æÏ›‡ãøûC‡îܵˈa(•J±XÜ+* Çñj™ÌÃÝ=ãùso/¯*©T\\üN¯^ ¥Z&swuM(+káØìììJJJB•RéÉS§’ÉŸ.Y2eêÔoV®¬¨¨¸xñbbB—ËEuîܹYã)..Æ0ŒÏçk ‚"±!ÔÂÁ€7ö6)ÑòÏ?_ñõ×ä/ &“9oÞ¼gééß®]»cÛ6²Z‚ (ʨ‘#÷îÝ«)Ñ^¨öKýµa6q„í;vÄÆÄhæÊÉɉDS>úˆ<Ö±cÇ·|GoƒÇãÉåòWYYòêjH4Ã0ƒÁærYl6 ǵ¯Êk,È20cö|þë¼jä‹Å¶¶¶¡Â‚¥RÙ©K²œ ÇB"‘ˆ w77+Ô‰°î…Ö¡AEEEÚ‰¦H$âÛÛ¿q0 å½q>TZZöôiíF1köl¢æ°AJ¥òÄÉ“þÿNöß,SóÒÚæÌž¹dÉÍ\......M™òÁtîÔI ¼Ù{i† …Â*.W¡Rj52>ÔÌÇ™L&NW6þ+à?õ4U@€–瘔”TçI´ädOoï–ÊŽÏ/‹ëË2õ_µ©ƒ¼q­ªªŠ¼Š_&“Ñét ÃÈr™LF~ʪ« ¬P³ÆÖkƒ:qW„. _6j]¾r¥k×®!>Ÿãø³”ÎOÙ;88`ö*'Ç­1Ý„½ñgÊãñ:„†ž={vúôéšÂÓgÎôêÕ«¾`L¡ïR ëM³L±XŒaßÞ^»Ÿ/‹É“Ë*•ÊÉÅ!Ô60pç¶mH+ËDÿÍ2A4XBÈÙÉ©¿~Я9J»reã÷ßöÙg™YYݺvݽk—·—×›½£&ÁdB×_oî-SL×e`ÖÜ<=é8~ã?j?‰>1>¾R"qõðÐ3»L‹ºénÆäÙÙÉ««ÿÿ/-E ¹œgg§gvµÇíííSSSÕ!W(2_¾trt$‚J¥ÚÛÙ¥¦¦¡P(²³³ ŒM³ÆÔréöIÞ…;ºîèº}’7‹N1d‘JKK·ïØñãÁƒŸ.^Œâp8#GŒX¶|yYYB(??ÿúõë!6›=dÈÏ¿ø¢¢¢B©T>xð Q¾Ágºê›ob¿ùæÜ¹sJ¥²ªªjûŽçùeéÒ¥õÃãñT*UnÍ¥®À¼ñÝÖäÁlQQ‘va¡HdooOã8ž—““—“sí·ß‚‚ƒµoÓÖ¹kÛÚÈÉ.X°sçN¹B¡©ÄÃÃcë–-OŸÕ«—ævìúnÓ®ýÒÀÚüýýƒ‚ƒOœ™÷-ù€!*%‹õ–O1Õà ^˜hÍfoÀ€_ýµvÉùóçë{$”ŸŸ¤˜æKàèOæͨyŠ1‡Ç³þï-ÿ ¹a 1ŒýqÀT³7yòä/¾ø"66V³½>|xâĉpÂ" ª««áɼ YaÆ`2¹<ËÚšÅd6aý@?r7‡3 ¤V«a]™8HDÌÞ°aÃfΜyóæÍž={"„JJJ.^¼x÷î]rìbbbJKKÇ¿mÛ6:®}&}×®]ß}÷]QQQ»víŽ9âããƒÚ±cÇwß}W\\Ìãñ>ýôÓ… ñ݆¹¹»K$’ª&}Z:¨T*‹Å²f± ™µ$k6[,;…ÆÄ<”ˆÅ.—ìI˜&È2Í“É3fÌ¡C‡È,óĉ!!!©©©*•ê?þHMM­¬¬ÿܹs;w¾wïÞ™3gÈr ÃÜkaìáᑟŸ¯3ã?ü°nݺ‚‚„B¡@ñx¼3gÎlÚ´iáÂ…!!!k×®íÖ­[ ¾hÕ<<<„ByuµJ¥2v,& Çqº•dš6È2-ĤI“:ôìÙ³þýû k®é!";;›L4³³³…ÿ½ÖG,Ïš5ëÚµkQQQ<èÑ£Y>hРAƒÉåò-[¶Œ?>++«eß ´jL’'`ಠ1iÒ¤k×®ýðÃÚ§ËB_~ù¥T*-**úæ›o&L˜ =J.—«T*;;;¹\¾mÛ6²077÷Ê•+ÕÕÕ4ÍÚÚ. 2&è€Ë݃Ör áééQYY9tèPM!Žã½zõ ðòò þòË/µgqrrZ¶lY·nÝÛ·oOªTª•+W 6›ýã?>|¸EßÐBvÀnì(M¦R"a0™ÐÍh= ­[Žëׯk¿  »+š:ujå¡o¿ýöÛo¿%‡—,Y‚rww¿sçN D d'¼HKóôö¶f³áøf Iyù«—/mììX,‚ÎnAëY&&ŠÇãÉårè€ €aƒÁ`s¹,6›†ãõ=› Y&& Ã0¡PXÅå*T*B­Fp8sFÅq&“I§Ó• …±c …@– €Ic2™LcÇh*b‚VîþM²LÐô ËM²LÐô ËÀ¢–™™ÙT¶ïÐ!!!¡©jÐz@– €¹:üÓO=¢¢Ü<==½½üúõk„†aããÛ´iÓ$‹(---,,ô÷÷7dÑ€früçŸÝÛ´qoÓÆÙÍÍÁɉöòõ•ËåÆí_íBCáç(¨ z2À,í?pà‡ýû÷ìÚÕ¾]»ŠŠŠËW®ðx¼&_JJjª·—NoÖE«T*Çß.R,Ù¸±cNjڰqãã'OŽ:d”0êÛTÅÅÅ"‘¨öÏÑ7¨ X8– €Y:züøÔ> ißÃ0.—;v̲cÍ#G~8y2BH­V¯\µÊ/ 8$äÌÙ³N®®äSÑÿwèи –.[æß¶mPûö×ÿú‹¬°¨¨hÜ„ þ.îîcÆ+)-E%%%µ 4pÑAlݾ=4,ÌÍÓs⇒‹[óí·_|ù%9c^^ž›§§Z­&ã9zô‚O>ñõ÷ßµ{7Bèð‘#‘‘îmÚ„†…ݺ}›œe÷Þ½;wvõðxĈÂÂÂf_­˜¶„ÄÄà  ÍËÚÈ‘£GG»déR_ÿ.ݺ=KKÛóÃ:vôòõ=ÿË/ä\§NŸ:|øgË—ûúû]¾rE…Ú›jíEfffûÐPµZíãïïëï¯T* ßêa·xe`–ly¼ÃGŽœÿåqq±vyRRù%´nýúÇß¹uëö»÷ìäÇĤ¤2äYròG“&mÙ¶œQ"‘Ì›;7911ñéÓòòòD%§¤´ÕúJÓ¿èUkÖ\ûý÷«—/g<{†aØ·k×"„ž&&ÕÔ””àïO¡PÈá¾?thú³gÑÑÑ;wíÚàÀdgfžüùg„Ц-[Nž:uîìÙm<ŸoccÓ·OÍ!ÉäääóæEvïŽòóóÓTèééÙ="Çq[¯WT”T*%'®},³ÎEçççïÛ¿ÿÞ½B¡ÐÊÊêý¡CŸ>}ŠJÔú¾ILNjÛVçÜÙ³{¿óB¨¢¼|݆ öíó÷óCùúúº¹º}¿iÓÞ]»Ü\]é4ÚĉŸˆ˜½aÆ͜9óæÍ›={öD•””\¼xñîÝ»©©©ÁÁÁJ¥’ؾ}û×_meeuìØ±ÈÈHcG ö:'‡/z´i£T(t¾l¶lÝÙ!4T¡Pœ>sæÏë×/]¸€JHHhŒa˜Ïê5k^¼xáì웚šJž´"Ïd‘×H!„ž<}º|ùr„PJJŠ““S@@@yyùgË–‰D¢€€€«qqmkNu5¸è°V­^™™éêêºeëÖìW¯>üðÃ÷ïWI¥J¥Çñ11EEEäiµ„„í0‚Ú¶ýfÕª„„„víÚefe)är??¿vÁÁëÖ¯òäIHHˆ´ªêöíÛ}ûôÑþ!^gÎ €Ébs8^>>/³²8™„éгɓž>}ªIæêÜ@´·,òôzP͉섄ò'eRRŽã?Ÿ8ñÉÂ…7oÞܱsç¯/R!ªgGQ%“UUUin'­6ð–Ô`Ûk>p]¦Ùc2™cÆŒ9Tӱʼn'BBB´§Q©T999¯_¿ž>>sçÌiÖ¥¤§í5ƒÉüåäÉ~ƒkþ~ùò˜É“5ùäï—/ýè#8–i "##ù|þ¹sçž?~ïÞ½ &èL€ã¸­­-BˆÉdšÎ³"@óyŸŸŸº}ûvLlì’E‹Œ †QÚ%&%5ªût`Qàîðf&MštèСgÏžõïß_(;`d<úÍ7J…ÂÃÓóû ¢¢¢ŒÀ$$''kwa@³‚,ÓBLš4iÕªUOŸ>Ý´i“±cÆmì(&'/'ÇØ!€VΘ[OOψˆˆÊÊÊ¡C‡;8–iA®_¿®ý2 @©TjÃ2èͲLhU‹÷Ì ÞlÅ€¶ôk¾¶÷fL+0} …ÂØ!˜.fì,´== í™ È20oÒ J³ÅR¹’ c‡c90 cÑ©®vl_!§ÔêþÃÊJJž%%•×ׇ¶ù¢P(<;;ÿ  [[D¡?¯]SÖsB¡p8œ6ÞÞQùùiÏžI**,¾ebfÍf·ñòrusköÞÅ¡íiM m¯EÛ^ãA– €yûûùë¿^\zš•S!WYøî´Eárãл÷lïÝÝ×Yg¬T"yúð¡oPP`‡&¸gKjµºT,Ž¿{7<2’emR*•c&N¬oâ‚‚ÿüC¥Rmíì4åÅbqRbbpHˆ›»»ÅdR«Õù¯_?¼{!äæîެ˂¶§=1´½–l{o²LÌØ Qùãç¹'>ÿl@È ðv,†•±#²2¹âꃔUî3è¸í%øÏ3’Ÿ> qruåp8–÷MBmÚ¸¸¸<ºw¯S·ndA}?a0 EèäÔ¥{÷G÷ïwéÚUSž’œÜ>,ÌÃÓSϼ£Pœ\\Â##ãïÝ88X³ÙÍ·,h{ÐöP˶½7Y&fìEaÙ‰{i+†t‚ZÁþ´%YÑiC#Ú³´ï~¹à樓eù‡„Xì×_ÿ,–D.—#„ètº±i] í!³m{e`ö,oÚ’ÌtßÝòÈf6iÒ¤Õ«VuîÔ !´zÕªI“&ýzé’žyZ,¼ R©úô郺þçŸ8Ž;œVÚžù¶=È20–µ?mI*•jð{ýB—¯þf^ûn# „БC‡ìììÈá^QQíÛµÓÓü,©]ªTª©S§²9„Д©S8 ¦å@Û3Û¶G1v€·E4æ/##£»k£f±Ô?¥J5sÆt6›ÃfsfΘ®T©êœÌd½~ýzРA|>ŸÁ`Ô9L&›2e Ç …«V­j°\?‚ ‚°µµ%´h¿¬oC† ‰]¹R»ä— Ü=< EÓ›µZ={ΜB‘èÔÉ“§Nž,‰fÏ™£V«kOùŸ£)[¼xq@@‹ÅâóùS¦L)))!ËÙZèt:—ËÕ™Ñ4Û^jj*ƒÉ´çóÞ>>“?ú(99¹©ÉíÛ·$ íùüî‘‘Ço’jͽíA– €Ù«sß4zäðoW¯Ò.ùõÒÅ@?wç/_5ÉîϬ©ÕêOÌ/9vìȱcE¢¢OÌ7£}7BˆB¡ :tÏž=õMðå—_æææ¾zõ*>>þðáÃÇŽÓ_®_ƒY{]óµÿ>˜8ñرc„Z­)9zôè¸qã¨8^çôFÿ#ÔêÅ‹§§§Ÿ:q‚É`0ŒS'N¤§§/^¼Xû]üûgY8Ή'*++ÓÒÒd2Ù¤I“Èr‰–ž={N˜0AgFÓl{!Ç‹ óóïß½òÎ;ï$''¿}#¹~ýú¨Ñ£?š4)ûåËÂüüï¾ýö÷߇¶‡ ËÀÔµ{7nüÉ?kï‰N?>jÔh“ý.oÉ?B­þü³¥Ï3Ò=ưb0¬GŽ{ž‘þùgKÍeß …3fÌ ªo‚ƒÆÆÆr8—Å‹8p@y\±uÌQ‡Áƒ‹Å·nß&_–””\¾|yâøñÍõ{â­UVVÊŠ3§N1™L²„Édž9uJ®PTVVêLüFŸ¤éЉ‰iß¾=†avvvK—.½qã†Î/^¼øã?¢££uÊM³í‘9ÀãñÌŸ?yòäï¾ûŽ,‘H$³çÎuqsstvž9kVUUY^XX8tØ0¾ƒCHhè?üÀ³³«]íòÏ?ÿ&6vÔ¨Q4 ðî{vï~ˆGXDÛƒ,³Wçû÷ .).þûï¿É—%¥¥qqWÇŒŸ–žæ(°'"þx ÀÏ'$¸í?ÿücôSØ-ö'­ªR(??Á`2É“ùÓñ …BZUÕðasðúõk±XJ¾ MLLÔSÞ ¿ œ…Á`Œ1â§Ÿ~"_ž:}ÚÏÏ/88ø-¾‹›‹ÅÚºy3‡ÃÑ.äp8[7of±X:7ѧgŠâââ:tè S¸oß¾°°°°°0íB“m{H+Ë$ 8ðïþ!‡ç/\X^V–’””öìYaaá7«þ=4cæL{{û—™™×~ûíç'jW^ZZúøñã¡C‡6gcY@Ûƒ,³WçîÉÊÊjè°á??F¾<öŒ¯¯oÛ  r_Dî”T*UnnnBrê˜qãcW|Õä»H“Åd2×mü¾ö¾{ÝÆï5Ç 4Œýñ¾!‰D‚a“É$_²Ù슊 =å jp­Ö9OL˜pöÜ9YU"ˆ£GNœ0Á臷›ìÏB]¾|yíÚµ[·nÕ.T*•?þøc홦ÜötFÙÙÚ––” ‚¨¬¬ŸOÔüî×Ðn *++?]¼¨ö¾ûÓÅ‹ÌeßM’Édd¯ò2™L&“éŒSùŸ—õÌR矻›[x—.•RéÀŒQ„Þ? ¡õß}çãã3vܸªªªªªª±ãÆùøø¬ÿî;¬ö{´,óçϯ¨¨èÝ»7Ù5&_뉎û÷ï éÔ©“¦Ä ÚB*•ÊÑÙÙÙÕµk·n>üíêÕ À@rìö-[VVa:9¹¸ }ú@ÛCðì,Aýû7W·N;'%%õï?àßÉ4ÿu^ê­ÇÂ`­Z½fñ¢…“?˜xèÈO¡ÉLôööZµzÍ¿ûn3Q; öóó+--%‡ ÆÁƒ<¨3M}å†,ë£iÓ/\سgO„Ð76nÞ|þÌÃÃÓvéÂC&3[6mŠž9sìøñ!>Ÿ¿¥æ˜–±ãj^zÞ`lllll¬v‰é·=_Ÿ²ââú¦d0ë×­[¿nÎ(àì©SdÉå+W„Ba•wëÚõüÙ³ Æð̺íA– €ÙÓ¿»9}æœödÞ>>¯r_¡ ³²sÌe·ÕTÖ­ß8oîœÉ~€²çó׭߈Ìgßm,û÷î5vì†uëB_ÇÆžúùgcGÔBpß»{w¿BgNž4£GüY cµ½ÔgÏ0 ó÷óËÍÍývíÚ¡ƒ·Ìr5̺íA– h¥pß¶}ÇûC!„~:vܼöÝ-B¡ „ŽýôSŸ¾}B¿_»æàà gŒbQeQ)”+—/#„¨4š±ci]ŒÛöJËʦGG‹D"++«¡C†|þùç-ß°Í·íA– €Ù³°ïò–D¥PÎýr™á¾»åi𙫫ë/çÏ“úg¡X\ˬï‘ñ Y·íuˆH6¬÷øfe¦m²LÌžå}—·$+óÜw·<ífhÈ,†5[8 ¶g¾ ËÀüÁþ´ÅQ(µZmì(š—Z­Öþv×ÿµ­3±fúVõˆ\ ͽ5BÛÓ?1‚¶gJ ËÀŒa†cH¡R[QášÂfQ­TáXi¼Ÿ_^s;­¥**(°Óê¹Fÿ…%b1‡ËÕ.as8b±ØA(l®øLO‰X̵±iîäÚžh{¨¥ÚÞ€,3Æ¢S=l¬n%½èÛÁߨ±X¦;Éž6V]§¼mûöwoÝr„ÎÎ&¸gKjµº /ïÞ­[aáášÂúÞ¦Z­<¼?è¿Ïqñõó{xï^§.]B¡å­"äJˆ¿ß×ß¿¹¯Ÿƒ¶§=1´½–l{o²L̘§€;ª“÷×gïV+Tý:XÑ`‹n2Õ eÜÃÔÕL ÷õs¶×Ëb³ÃÂß©yAÛ3´=Y&fŒ‚aÝ}¸¬Nþîe•U*•…ÿjoI†Ø º—ƒm°»îÕ]4èöÈ`šG_‚&mÏpÐöLd™˜7 C~Ž‚ *Êʲ33Ù66,«Îi`“ÍÁ¶×|à LÇ“Ë寲²äÕÕð­€YÃ0ŒÁ`°¹\›MÃq¥RY{ØäAs0¤í5È20Q† …Â*.W¡Rj5ÅDp]&FG¡P,þé,†Z­6ðÑe`d6¶¶%b±±£ R"ÛØÚ2%œ1ÀÈüÛ¶}tÿ~û°0¾ƒƒ¿€–§V«‹ ŸÆÇ· 3dzÈ202®M`»v©IIå·oés&‹B¡py¼¶íÚqml ™²LŒÏžÏ·çóДàôhze€¦Y&hze€¦Y&hze€¦=LÂõÄç{¯ÞMÏ)T–ßi( §ø¹¦÷ïìmìX ¹@– 0¾øç9›Ïݘ5¼oODiû%µ2+ë忳׏L«0oWcGÍ¢ìÍ0yb‘(;3³²¢‚ cÇÒÒ0 cs8»îd,ûž³›»±Ãi)8ÕËÛ{ÑXÚ® ÌŽði==ùq»µiƒjµmÁzÐZö±cͲLŒ¬¬¤äEZš«‡Nomß4! Ãrù«¢.ÎNÌØÑ´,g§WE¥ŽÎέç£'?„aîmÚ´ž7®Ö¹^¤¥Q©T[[c‡š d™YVF†›§'Ç[çCÌ ‚À©Tè4š±cii Ç0œJm==ùqsmm%åå­êë€õ@®7OϬŒŒÎh.e`dååN®®DëûšÑÆÀ1¼•È$1p¬~ô.W\XØ ß¸X¯(/7v A– €‘¡jÅ_3$+*¥µ.'YQ)êVvª!„S©A´Â7®ÖR©ZÛ¥­ d™_k>˜A¢ã ji&§´ÚO¿Õ¾q°Àÿ±wæqQUýã?³°Ì08*$‰Fó ÒÙX‚$Ì 1qã ŵl³K5+,7èQKdµ0AEC ÷°R P -´\¾ÈhË°Ž³Üßçi¾ó»÷ÎpYdÑÏûÅË×½çžóYϽsH2teA i…+[hÛ}Þ1¿rõjÒÖ­WÿÍf»<ñIJ˜˜žtq9uôh—a97nÞ ‹Œ<ö,B¨›Š,Ð)~üùçÔŒŒëüÁæpþG,Ž ÷ 7nÞ ˆ˜=sfB|<¶<"*êÜ©S¦.`Œ‡h…÷æIdJ§â`ÎY|”6>T!´ÝɜƇ”}à1æ2 ïéæd@IYÙ{ï¿?súôc‡Ÿ:vìíåËÏ_¸Ð#Ó ´ôˆÍ$𗌺óÇb±æ†½œ±k'ÞEè¿åím­¼÷¶ÂÃMú?#ãßyCû ÍB/‡ÌÔëõÏŽþì¨áU—/+g+ÝžøïlåW點WŒöù„¯Ì##e©í•Ë—º;—ÉewœZíÛqqS&O>YPp² `ÕÊ•|>¿û1·œÇ‡‘e’üÎ69[\üá'Ÿ¼²hщ‚‚¢#Gb/.+/Ç¢Ølö™~PÕÕ&–S]°àT/ŸD¦&u¶>­³„ùøxHÝ©Ë<ä‹+ÐÇÀ(úC÷ø÷_¼¾dIàĉ6!$—Jÿõþûƒ¡¾¡áýÕ«'M™>=iëV­Vk0þ¼qãùñã:ô3‚CBÊ/^ÄBr yqÊ”—æÌÙ““ƒ i%çÀ Ckkk↠S¦OŸF™Ð÷C—ÿX,–€Ï'•777Ÿûé§åK–ØXY ‚W.gβ7ß¼}û¶i"ðÆüÐPBþº~XÞ¾þǤš¤VxÃÇÓS`oÏa³ÿ9{ö¯UUæštªSYþël·olh`±XüAƒðî̹s_ziÊôéFiCö÷õ=”ŸOë e½æN" ‘Ymceå ¼Yxüx׺}â`ÎYËñaÞhý2fÿì?¼õÚk<;;6‹5ÚÃ艋Àÿ¾} ¼ý}Ow–˜³··'¢¡±Q ˜–×ÕÕ!„†Š…;99©êê a 6›=ÈÞÞ@VVVZ­Ö@¼Aƒ×­Ë=pàóíÛÅO?ýÚ’%’Ñ£-HÀ6ÿ¥RéõúˆÅ‹±F‚ ØN×|±ávksãüâh1c$ìg!Äa¡aC‡p8œK—«ø|¾i}.‹…Ì¿ýcZ4ujÐÔ©<øÏÎK_}¥âÒeÓ¶ÝdžËb1'gç¸+Bõõõÿþâ‹>ýtç¶mÆD˜æ”ÍáXYYÙÙÙáíZ­iÊLÿ5Ý=üÝwÙ99uõõ!Ng®I§:U‡Nuª«ØóùA4¨Õ>!t0'çæ­[QK–˜šöÞûïûx{ÿW8‹…þÿõuz=‡ýß%=§OÇ…Ç¿ûÎÜId.2,Ë„aÆá 0÷¥;q0笅øœEæ»­_¦Ù'6l˜©Á=xI`” }OwþCo?hÐ3ÿó?§ÏžñÒK¦åB„R©t6 oˆ ƒáû_X£ÉöX_ß±¾¾:n_^Þ‡Ÿ|²ïë¯;” Ølö={x<^7}éæWÙñM,áíwÞ 9 ï:øsBBV'¬úø“Oî*•WûmüøñŽŽB½^¯¬½3|øpÜV«iÿ?qn^[{§êת€qãl¬­í b³Ùl2mÛu‹ÿƦ“+L æÏ›÷æ{ïý©4“Sã6—Ã1 Ú¸\nC}=©•Z­ÞôùçŸoܨÉ~ûý÷×W¬0'³³Ê2rœ?hÐS£FýôóÏÿ˜<ùïöd÷GŽñ´›[щx×ÑÁ@HY[ëää„[ܹsG$a½E‡Í0w™‹ Aÿ„»wã t•ε5㬥øüÿΚ #u'z¿L²Ï2Éþ%ôÜEx$;æÐ÷à ƒ.ÿ½³3-íÄéÓ´Z½Ápé×_×oÚdkg7ÖÏogZZ[{{]CCÆW_Nžl:3aº}ﯿ~¾pAóà‹Í¶±µe±X‚èP‚­Ý¤ ¶îØ¡njÂS›%¿üÒ5ºù\&ÛäYÉÿ±Ï<óŒq÷‹mÛìlmžóñ~Òexpðô߯^á°ó°¡K–,yÞÏw¤ëˆË—+õz½³³“ñï§Ÿ~ÄÍ‘Á°qãñÓn.ßÈÎþzWJ ©í¯—+»ÿ\f‡ÁQÕÕ}µw¯òî]A¨›šò~æ™gH©¤æÔt{È!<;»Ó?ü yðà@~>©•F«5 ööö´Ú}‡áB{{{ƒÁp÷¯¿HgÞ©,ÿu¡Û¿µ}çΟ.\Ðéõzƒá÷kרî‡Ï›wðða¼kÇãùûùmOI©oh0DMmmúîÝÿøÛ`&'md°º”ŒŒ¶ööú††Ì¯¿œ8±Ë'oâ@ë¬åø0ïN´~³?. `ûþÓÜÒ¢Õé~½rÅÐ^¹Ä}Ìe@ßÓÍÿú{ÊdŸ¬Y“•½)9Ù@£\]CCBƒ!~ÅŠ¤­[gÏ›Çår'MZfú”•é¿z.óë¯×~ò‰Á`9rdB\>Ô¡„¸·ßÞ™šºà•WÚ5š!ƒÏž9ÓK.ï‚ Ö6›ÕõÉLw÷Æúzãî©'ŒÛƒx¼¤-[’¶l!5IÚ¼9ióf¼=oî\Òјèh„ëˆ'§ª3mÛM¬ÌeZq¹×®]Ë;t¨©©ÉÚÚÚS.ÿà½÷HOõ!JNMÿå°Ùo,[¶eëÖ©©óBB~8wδÕ`¡pþ¼y¯¿ý¶££ãìààSg΃ƒ@0gæÌE¯¾ŠX¬÷ÞzË(y§êÐ÷Îvûžž½bEÆW_­ýä6›ýôSO­ùà’véèÑ®O>Y}ý:Þ}?6vç®]‹bbÚ5Ÿ4eJdx8­^Ú“ˆ62„ÁÀf³Ré‚W^innž8~¼9™ éT[ Κ‹I‚…îDëé|OÞ¾}îüù,6{œ¿¿Ç3Ï ž»$,„Aª{÷ð¾²¶ö׊ŠÉÓ¦áÝïòò.[ÖgÖ=ŠìÞ¹ÓšÇ ˆÀg¯¿×g²Íf³9\.‡ËÍËÉ™D•IéWt?¡??î(õ¾åýŠ;553CCûÚŠ> ß¾á..}mEP¯R Ðnëöí¨¥KO~ÿ}Hë?qèY¿˜S¯R ìe¥ÀÃàDAÁ¼E‹ŒãÉaQQpÇèy`”ÙÇ475]½|¹¥© !ÔÒÜ\}õjKss_tH(``” Lq1¢÷o+÷ª_@ßoÿô1ö|¾‡D‚ãdoÿ?xÕ/`€  üþ=Œ2ûxŒï e=<—ÙÇÀc|]H¨N¯¿SSÓ;æýÇ6ûm«ã$ …GŽôµ SØl¶ÀÁáiwwÑ!LêÃ(ú­Vûx~@Aê@ †ûýu©¬Læå%ppè°>Œ2û˜æ¦¦Ûþé2boР–ææš[·žtu…}mÐEºœÐÙÙ½`ÐB0¾•:10°ª²ò¹±c;¬ £Lè/À¡@Ÿ°{çN„PHX˜A¯7 z½Þ`0ôúÿnéõ,6›Ãáp8œcßï(5Ö×3 £Ì>žË|Ä€„6l6Û`00ªù°M€9A(•Ê!C†àmË•—,Y²k×®î+År$Éft[À²¬Ëè# •J5qâD&Zºé{ss󯻿lîÐ’œó8w ¥Réììl.Ë=‹åÕ}ÉýANòÕ©žÙ'vJs -÷srºÖ,´ŠŠŠrww7nêõ\tH/_µ`” ý­V»xñâââb„PNNN\\œ…Ê÷îÝ;vìØÂ… »©Ô('11ñøñãÝ”†² §C›E"Ñ©S§:TÑ}ßI×Ys6whÏe2Œsÿ§§Î‚‡'¹Gät!_Ì{f_YÈ\N¿Êòòò®\¹òÃ? ^ÏE‡têªED‡ó–Q&ô¬¬¬RSS³²²T*UiiéæÍ›-TÞ¶m[LLŒñÿÓx ]½zµ»»»\.7 ÁÕÖ­[çíííîî^WWG’C«åüùór¹\*•N˜0áÎ;¡7nJ¥R…BqòäI„PRR’\.—Ëå~~~%%%LlFéõúÈÈH¹\€%'&&šN(*•J‘H´téR—””srÊÊÊ$‰——ײeËðüµUuuõøñã¥R©¯¯oUUUBBB```CCƒB¡P(*•ŠÖZ’=Ô¨2”CâСC!!!xûĉS¦LaÒŠê)m’…J¥ÒÑÑÑrœ]NIc¢ !TZZ*“ɼ¼¼Ö¬YƒK¨Yfµ×™Ã´'AÊ;IŽR©´··÷õõ;wî³Ï>oÁSÓó‹ÚŠäûÈ‘#m/^üí·ßRåPsA=+©¾¿úꫤ|Qm&e¶gRóE!µ=¤E{բʡZHõ‚ª‹Ú˜äÂ\+S¨Ú©­Þÿý€€€ÖÖV//¯qãÆÑæ¢Ã«1­…æ2h õj̤o˜ƒ ˆ«ÕÕ×nÞ´P‡AÜ¿{ÿ]®¨ÈÉÌ4îfíØA=JÖŽßdeét:íƒÚÛÛÛÚÚZZZšššÕ uuM ­ÍÍšööo²²Œ‰0ýƒ¤ô+ºŸÐ=iiÍjuÖŽ<ˆŠŠÊÍ͉D{÷î‹‹3§´¥¥eĈ*•Š ˆÚÚZ‘H„7œœœ‚hll´³³koo'×ÁG9ÎîÝ» ‚hkkÓh4$9¦¢Œxxx±iÓ¦ˆˆ‚ üýýSRR‚Ðh47oÞ$¢¦¦W>s挷·7­ªÍ!,9))iÁ‚Tp+W®K$Z9AÈd²‚‚‚ ’““œœh[ùùùqìØ±ÀÀ@Z im6-4Uj+Ë´··;;;755“––ư!ÉSjª…¦qNNNŽŒŒ¤5›šSjÄ:ÔEĘ1cŠŠŠ‚Ø´i“1Ô,wµ×ÑBíQ¤¼“äÔÖÖÚÚÚVUU 4èÊ•+îîîæ<%I&µ¢ú>oÞ¼¢¢¢†††ªª*‚ F}ïÞ=Z I¹ ž•´¾“òEµ™šARÚ|M¯GQ¯Z´rHÒzAÒÅäºAõÂ\+SÌEƒÚŠäíÕÆòÕ˜j¡¹ ’ ^;ìF²vìÈüÏÔ *UÝ_Ý«­ýñܹsçÎýôÓOΟÿó÷ßo^¿þ¿7nÔÞ¾ùŸÿ4«Õ{ÒÒH¿e9™™„Éx2'3Á\&ô¬¬¬ÒÓÓñ£OmůÆ$ iµ“,¤½3Ë1-ùãÆ ­VëéåÕT_Ïb±ž|â‰ö¶6UCC§|ÄÀ(yyy …ÂÍÍ ï …Â–––ÖÖVãSeíííAAA«V­ºzõ*C9XTkk«Z­Æ»®®®EEE¸òرcù|¾··wzz:BH§ÓÕÔÔhµZN7jÔ(„PFF­Z]­­­Xr~~~@@@×|b±øèÑ£!ã“p$ø|¾§§gVVBH¯×ã_e×ÒÒ¢ÑhÌùN…6ªT9TFŒQQQQQQa|kòäÉååå»ví gØŠ‰§´šÆÙßߟ6>¤œÒFŒdU—@ pssÃÆåååQµ›Ë2I2µ×Ѷ¢ö(LäÐzÚ¡dªïžžž•••AÌœ9sýúõ8Ζû?77!¤P(t:~,],oß¾‰Íééé‹-Zµj•ŸŸ—KAËÎÎŽŽŽNJJ"bÑ¢Ežžž **J¡PˆD¢üüüÁƒSm&Ù“’’B*U޹h›Âápf̘‘™™‰wÒ¡§´y7ÆÙÞÞž6Îû÷ï'åÔÅÅ…1&ºÒÒÒ¢££9Ž——I»1ËL ö:*ÔžÐ59TO;”LõË庸¸øúúN˜0áúõëøL´Ðç¹`n³éL0ÕfjI=!DÍW‡gÓCíQ¤«­’…´öt3†Õ®å‚Ãë*&W‰-d¢ÝÞÞžz5î°oPíáp8OÙÒÔd:AËf±†8:jÚÚ:¼íCoÿô"ðöÏ#F¾ýÃDÝ™3gÆ×}³{JNoꢕƒ_£!bß¾}Ó¦Më¾–~K<íÂËI‚‡×{^_íN..\¸0zôèî[eJ×ΦÞìQý3ƒ~b!é퟿”Ê»wîÔÞ¾]sãÆ­?þ¸Q]ݵ·`./¾øâÙ³gûœÞÔE+§  `Íš5\.×ÁÁßzTy|<í‡×{ûÛùUZZúꫯÖ×ׯ_¿¾ûÒLéÿgSËÅãÿ[Ø`” À&44444´¯­è ºà©ñM2 ÏéZ.|||L˜{ØtØÇÕÿ½ès U÷ï_­ªj¨¯×ëõ!6‡ãàà0ÊÍM$uVŒ2DÄ/¥¥5·o‹†õñÅ!C‡Ãý¿þúý·ß.þò‹óðá©´Sa”  ÊŠŠ»µµS§O…„Á`0ƒa˜³óÐaÃúgF1 IDATZZZNŸ8ñ{gÞ¯Gð%#èWa\{øû³P%Pò˜”@ßRsûö”—^::RñùüÉS§*kk;%F™Ð_Ðjµ‹/...FåääÄÅÅA ”@ÉãSÒc—è*CÌ,âóùCœ:-”€/õ"ð%£GŒžý’‘V« FÅÆÆbùP%Pòø”@_¿dtó?,ÿ–ÝøãXÇ$Z­6&&fáÂ…"‘ÈÇÇ'>>J JŸ’¾¾;6¶¶ÎÇ[®3ÌÉÉÆüBêô0—Ù‹À\æ#FÏÎe ã÷x ”@ ”s挷·7C ÇŒSTTDĦM›°=Ô8㜔”´`ÁƒÁ ‹¯_¿NÄ믿¾mÛ6&ž2÷ËrØ©…vvvíííA¨T* ­€þÃóz‡‡´Ž9·/‡·˜`ee•žž~÷î]„PXXؼyóh«edd”••®\¹òÇŒåñxS¦LAÍš5kÛ¶mÔ&MMM¥¥¥gÏžEY[[»ººâ’åË—#„ ‡Ãé)/˜HV«Õ×®] Â6öÙg´­‡‡Gmmíýû÷-H¶¶¶Žˆˆ@ÙÚÚ"„ÊËËCCCÕj5AuuuL,T«Õþùg`` B($$Äܬ’1γgÏÞ¶m‹ÅŠŽŽÎÌÌLHH8tèPbb"O™ûÕYìííÅbqLLÌÔ©SçÌ™Ó5!@¯Áð|€ Œ2 Áb±œñàƒÅb™«æííííí=cÆŒàààØØXÓCãwØlvYYY÷Ç—T;»&™ÔJ©TZYYaùF§h%óx<6û¿ÿh4šðððÓ§O{yyUWWßX²¬K­V[ˆ6-¸~TTT@@À˜1c&Mš$ ¶eè­F °Ùì’’’S§N¥¦¦îÝ»÷ðáà íú †ç; \à¹L`âÊÊÊáÇ#„Z[[‹ŠŠBùùùþþþÔ&|>ßÛÛ;==!¤Óéjjjø|¾§§gVVBH¯×———wÙ¡PØÚÚªV«º:”,ÄbñÑ£GBß~û-ÃVLêhµZN7jÔ(„PFF.äñx---Æœ@àææ†WÍËË3ç©iœBÎÎÎ2™ì½÷Þ‹ŽŽ¦mBõ”¡_$›%ÎTÚÛÛƒ‚‚V­ZuõêUZßzeÀ#99ÙÝÝ}̘1ÿþ÷¿¿üòK„P(ÌÈÈËå¹¹¹6l@) ãksçÎEíÙ³'''G*•úøøà!HvvvVV–D"‘ÉdxðĪd›øøx™Læããƒë0‘œžžëååõÛo¿q¹\†­:¬coo¿víZOOO___,!$¢¢¢ E@@¾‡N•“––öÎ;ïxzz^¹rÅœïÆ8ïÛ·ïÓO?Å…‘‘‘666ãÇ7׊ê)¿¨6SãLÊEkkkpp°\._¸p!î´rz ¸cŒ‚‚Ó]¥RÉápöìÙcZXQQAj5jÔ(Ò§pÄbñ™3g:Tg¼£gN2BèÃ?üðÃ;%ÙÝÝýòåË¡ýû÷ß¼y“¶Ö‹ßË6'™dBhåÊ•+W®ÄÛ}ôÞØ±c‡iªœçž{îÒ¥K vvv®¯¯§–ÿøãÑÑÑnw’<5lÙ/ªÍˆgj..\¸@5€* w€Q&}@AAÁš5k¸\®ƒƒ¾•?àhkkó÷÷çñxßÿ½…j€§]F™0°¡Næ BCCCCCûÚŠnaggÇäyÖGÀS€®Ïe=Œ2€žF™Ð /™ˆ:óåKZT*Õĉ{È.”J%~Åòj“=NúmÎøÜÜÜÑ£GK$??¿ÊÊJ\˜––æáá!‘H íêá´­nܸ1vìX‰D2{öìÖÖVÚ’ÀÀ@¼ä3Ï<ãèèH•Üå8?~\¡PH¥R™L–ŸŸ¯T*¹\®§§§L&Û´i–Ìår±vŸÓ§OwA Ð5zð|€þ Œ2 ¿ Õj/^\\\ŒÊÉɉ‹‹ëŽ4‘HD;èô”_ßÿ}[[›¹£O?ýôO?ýtùò常¸%K– „ZZZÞxã“'O^¾|yË–-¯¿þ:“V¡+V,Y²äòåË£FJJJ¢-9~üxEEEEEÅòåË{p Nž““SYYùóÏ?=!$ ËËË/\¸pîÜ9ü‘N¡Pˆµÿûßÿ¦õ xôìùýe@ÁÊÊ*555++K¥R•––š[çpõêÕîîîr¹WP*•ŽŽŽ‘‘‘r¹< àÎ;¡ÄÄD‰Db:ûuãÆÀÀ@©TªP(ðçÇ«««Ç/•J}}}«ªª˜èB•––Êd2//¯5kÖà½^OÒNâСC!!!xûĉx‘Fªv<©³nÝ:oooww÷ºº:ªvª_çÏŸ—ËåR©t„ wîÜQ*•"‘héÒ¥...)))æBÝÐÐðÉ'Ÿ|üñÇæ*x{{;88 „ vÊÖÖvøðáÍÍÍ!µZýôÓO3iEDQQ8†‡‡ÿý÷ÔS ™™™ .¤5‰ç“'ON˜0*--•ËåÔ&mmmjµzذa!'‹‡lmmß}÷ÝÝ»w›ÖÇ}É\L€ž…áùe@A«ÕÆÄÄ,\¸P$ùøøÄÇÇSë¨Õê-[¶\ºtéâÅ‹¯¼ò .lhhX¸páÅ‹çÎûþûï#„H_ÇŒˆˆ «¬¬¼pámDFF®_¿¾²²ò“O>yûí·ꊊŠJJJúå—_žyæ’öþóŸÆUš2mÚ´Ÿ~ú ÏrrrÂÃÃÍiohhpss+++»xñ¢Á` j§úµyóæÊÊÊàà`±ººº+VäææÒ.éŽyûí· d®‚‘ŒŒ üñy‡sðàÁ &¸ººþë_ÿÊÌÌdÒª¾¾ÞÊÊêîÝ»/½ôÒСCÿ÷ÿ—ZblUQQÑÔÔô /ÐÊ$Åyâĉ555üñVCmÂçóçÏŸïáá±pá¼¼<Ò=ÙQ£F]¿~KV(#GŽ\²d |\³×`r¾À@F™Ð_°²²JOOÇKo‡……—o1ÅÞÞ^,ÇÄÄdggÛÚÚâB‡'gÍšuîÜ9j«¦¦¦ÒÒR{ölZí666Ó¦MËÏÏ×étß}÷]HHˆ9íÖÖÖ![[ÛÁƒS=%¡V«oݺ…µ‡„„üøã!@àáááææfîOGŽÑh4Ó§O§=jJaaááÇB_¼xñîÝ»oݺµhÑ" cR+„››Û÷ßommm¡!”‘‘±`ÁsbIqf±XÑÑÑ™™™æÐ¡Cæfdd|ÿý÷Ï>ûìÊ•+I÷d_’ÇwÌoÞ¼¹råÊÄÄDs= “ó:0Ê€~‹Å2~ÿ’v96›]RR2þüƒ†……Q+0‡€Íf—••UTT\ºt ÷ñöíÛø-ü^­. ‹ÜX8úòË/çææž8qÂÇÇG(ÒjGñx<6›ÍÐSsÎZYYaKÌ…âôéÓ.\ððð7n\CCí½f„ÐåË—ß|óÍüü|>Ÿjhhøí·ßð;44Ôܳ¡¤VŽŽŽZ­¿âSSSóä“ORKpÃìÙ³ÇÜír8ÎQQQ{öì9tèФI“pTiñööþàƒ<¸ÿ~Óò7n¸¹¹™–„††ž?žV©oЖ¥Ãó:0Ê€D{{{cccPPЪU«ðrä¡ÖÖV¼øu~~¾¿¿?µŸÏ÷ööÆ Ïètºšš>Ÿïéé‰_þÐëõxœ7bÄüžô¢ênnnø±Î¼¼<ªö€€Z³'Ož\^^¾k×.|»œV;OI888¸ººbíyyycÇŽeÃÍ›7ÿñÇW¯^ýᇄBáÅ‹qùýû÷îܹöÍ7ߌ5 —ØÛÛ[[[—••!„Ξ=;räH&­X,ÖäÉ“÷íÛ‡Ú»wï´iÓ¨%¸æáÇÝÝÝIÃ>S¨qvvv–Édï½÷^tt´¹V………x£²²røðáÆrF“œœLš-))1ŽzIúm Xû­­­ÁÁÁF¯×o± …ÂŒŒŒØØX{{ûÜÜ\„B¡Ðétøy;±X¼ÿþ={ö¼úê«[·nåp8[¶lqqqÉÎÎŽŽŽNJJ"bÑ¢EžžžLt¥¥¥EGGs8///’v>ŸµSáp83fÌÈÌÌÄ#K„P×´SýÊÈÈXºt©Á`‰DÙÙÙ݉­N§«®®ÆÛëׯW*•ø›óçÏs¹Ü¯¾ú*22!$ŒkEZn…úüóÏÃÃÃ7mÚäææöÉ'ŸÐ– „222,OdÒÆ922òâÅ‹ãÇ7×*99ùÍ7ßär¹|>çΡ††OOO½^?þüŋ߽{Ç“ ÏeЃÀ(ƒ¾pá©ÃáìٳǴ¤¢¢‚TgÔ¨Q¤÷fÄbñ™3g:«ë¹çž»té’iI}}=Ë·oß¾}ûv ÚIKeÒj§úõüóÏ'#1Xþ–§e“HMwIÖb¦OŸN}š³ÃVO=õÔÏ?ÿl¹!täÈË¦ÒÆùÇŒŽŽ¶p³µ  €T¢ÓéH’I%=Œ2mmmþþþ<ô-$€þŒ2``CšìììhŸgè?ÀÛ?@Ï£L çQ&ô#‚À -¢Î|ù²Ë¨Tª‰'RË•J¥³³óÃÐøð$? ]æâÓã477oܸѸ›@ZH“¡=$9 [õƾMÂÔB†¾Óz:àèåóze@A«Õ.^¼¸¸¸!”““Ó Ÿ!‰Dæ¾. ^ŒiÌ”˜˜Hú C{hÇ^ý?˦2ôýeöþù½Œ2 ¿`ee•ššš••¥R©JKK7oÞL­£T*###åry@@À;wÐßSDëÖ­óöövww¯««;þ¼\.—J¥&L¸sçΡC‡Œ Bž8q/T˜˜˜Hš4*--•Éd^^^kÖ¬Á%ÕÕÕãÇ—J¥¾¾¾UUU¡Õ«W»»»ËårZó0IIIr¹\.—ûùù•””P%ÓÚCj¥T*E"ÑÒ¥K]\\RRRpå7nJ¥R…B?Oµê’´Q¥Æ‡‰vj¾¨^Z%$$âV* •JEk3Õ’´rH­hí)++“H$^^^Ë–-37ûKõš/j ©=A¯×wç}§zzòäÉ &ࣥ¥¥æÖsêW09ßàQ€ ˆûwïâ¿Ë9™™ÆÝ¬; GÉڱ㛬,N§}ðàA{{{[[[KKKSSsc£º¡¡±®®©¡¡µ¹YÓÞþMV–1¦”~E÷º'-­Y­ÎÚ±ãÁƒQQQ¹¹¹"‘hïÞ½qqqTuµµµ¡ÂÂB‚ ’““###q!‡ÃÙ½{7AmmmÆÃÃ×Ù´iSDDD{{»³³sSSA111iiiFi"‘È(|̘1EEE¸•““A~~~ÅÅÅA;v,00°±±ÑÎή½½ •Je.&555xãÌ™3ÞÞÞTÉ´öZaO¯\¹R\\,‘Hð!ÿ””‚ 4ÍÍ›7©ÒzA‚êmT©ña¢6_$/¨­HŠhKH…´¹è°­=2™¬  ûN1ZßióEŠ¡…:III , 5»C/¨»ƒA,_¿~ ˆ×_}Û¶m´^ô+˜œïÐktê·¬Y­Þ“–Fú-ËÉÌ$LÆ“9™™¾dý++«ôôô»wï"„ÂÂÂæÍ›G[ÇãáÉ¿Y³fmÛ¶ Z[[GDD „lmmÕjõ­[·p/¿üÒÆÆfÚ´iùùùóæÍûî»ïho5ªÕê?ÿü¯Ó²y󿦦¦ÒÒÒåË—#„ ‡Ã±··‹Å111S§N3gŽ9GÊËËCCCÕj5AuuuTÉ´öZ!„‡‡Gmm-þT¶çìÙ³Ø_WWWª…T]Tóh½ ª)L´ÓFƒÖ‹[uÃ\thZ­¾víZPPBhÖ¬YŸ}öµ ÕwD—/j -Ô™={6mœ»‹ÅŠŽŽÎÌÌLHH8tèPbbbOI~x0<ß`@£LèG°X,ã÷/-,èb„øûÇf³I…¦¼üòË_~ù¥H$òññ …æ´“JØlvYY™éH¨¤¤äÔ©S©©©{÷î=|ø0UˆF£ ?}ú´——Wuuõ¸qãh%“ì¡meee…ÛÒzDk¡Z­î0nl6Û²ÔYÖN Õ &­ºïs{ºm¾L!¢Ã:æ|dÒó©DEEŒ3fÒ¤Iæzx£³ç; 8à¹L`´¶¶!„òóóýýý©\]]q¼¼¼±cÇ"„&Ož\^^¾k×®ððpZ±ÀÍÍ ?r———‡âóùžžžxåq½^_^^ÞÞÞÞØØ´jÕª«W¯ÒÊÑjµ:nÔ¨Q¡ŒŒ ZÉT{¨­¨ðù|ooo¼€¸N§«©©¡ZH«‹­F•‰vZuT9ÔV<¯¥¥E£Ñ« …ÂÖÖVµZmN­T9"ÄbñÑ£GBß~û­9›I¾Óæ‹ÃëЪëÐwZOe2Ù{ï½m,¼ÿ>îÿô 0Ê€†P(ÌÈÈËå¹¹¹6l ­“‘‘+•J9‚ïGs8œ3f=ztÆŒ¸ŽB¡0¾B1wî\„PZZÚ;ï¼ãééyåÊ\';;;++K"‘Èd²¢¢¢ÖÖÖàà`¹\¾páBsªííí×®]ëéééëëËåþ÷n U2ÉÚVTöìÙ“““#•J}||ðЊd!­.´^P£JíL ¶QQQ …" ßY¶±±‰—Éd>>>´ù¢õ‚*‡ê•ôôôØØX//¯ß~ûÍ\ðI¾Óæ‹CËuöíÛ÷é§ŸÒZءﴞ"„"##mllÆo4[§ÓUWW3Ì = !D„êÞ=¼¯¬­ýµ¢bò´ix÷»¼¼…Ë–õ™u"»wî´æñB#"ƒ0 A “m6›Íár9\n^NΔ  ªHJ¿¢û -±‡I«îŒ2ïÝ»wìØ±… Z(L±¡PXñ7¯¾ú*2Óç ^|ñEümTªdNž““SYYùóÏ?=Ú(¹ªªjþüùxù¥/¾øâøñ㸟qüqssóÅ‹«ªª>þøcZ{˜xÑ! ÏwÐÀ(ú VVV©©©YYY*•ª´´”vuD#¶¶¶ï¾ûîîÝ»BçÏŸ—ËåR©t„ wîÜAݸq#00P*•*Š“'OçK”J¥³³3Þ°··÷õõ;wî³Ï>ª®®?~¼T*õõõ­ªªR*•"‘héÒ¥...)))¡„„ãg  …J¥B%%%Éår¹\îççWRRB['11Q"‘˜ÎÆ‘l¦ê¢…‰.*AXö‚Z¢T*###åry@@Ž*2ó•ïmÛ¶ÅÄÄØØØPKFŽÙØØh,_¼x1‹Åê°„öëèz½ždNëºuë¼½½ÝÝÝëêê¨=ZgõêÕîîîr¹ÜØÁº– R£•CícÔˆ•••I$//¯eË–áÎiÓ>ÿ믿<844”´è‘Qr[[›Z­6lBˆÇã‰ÅbÓjAAAæ¾£¹sçεk×â•´d2™{¨yï:ß`cººù劊œÌLãnÖŽ½¶RûcB§¤'-EIé‡t?¡{ÒÒšÕê¬;kÖ¬ÁƒÓ–øûû_¸páÚµkEEE:nÖ¬Y– :Ô‚=³gÏ6Úcmm²µµ¥*©ŽµµµX,މ‰™:uêœ9sPWsAíc´rH}ŒµZ}íÚµ   çÏ>û ý}‡Ú¨Ë´÷û>räHbbâˆ#x<^EE…B¡ æ"##£¬¬¬°°påÊ•?þøcll,ž®Öjµîîî;wî4—z${¨^tΞï0Q&ô#X,–qcüA5Ç7ÜÜÜ/ Eét:Ú ƒ!Äf³ËÊÊðø!¤T*­¬¬pssZ4MxxøéÓ§½¼¼ª««Çס1ÈÌ‹IÉ]3!¤×ë·nÝŠ§-ñ÷÷_¿~½ƒƒƒ——ב#Gžþy&%ÚcL(ÇÃ÷v-iZ‡Íf—””œ:u*55”(?Ÿ IDATuïÞ½‡îZ.¨tX÷1jÄ:îó*•ª¤¤$&&†Ífß»wïÈ‘# …‚V²·····÷Œ3‚ƒƒccciÇ‹¦…B;;;ãƒ%æè¦F:u¾À@žË€‰F£INN^°`ƒƒƒ««+^;//oìØ±|>ßÛÛ/â¢Óéjjj„BaKKKkkkUU•9|>ßÓÓ¿Z¡×ëÍ}ãšÇãµ´´h4¼«Õju:ݨQ£B´u¨Pmfâr×t1ñ‚¶¤µµ[˜ŸŸïïï IÏeæåå) 777s%žžž•••AÌœ9sýúõþþþLJhu™Ú@uŠITÛÛÛƒ‚‚V­Z…_²fž S{¨}Œ¡R|X,ÆÃ5Ú§QM1öùï¿ÿþ¥—^úý÷߯^½úÍ7ßàG3©¹(,,Ä•••Ç·,ÜHttôG}„Í•••L¼À0— Œ††OOO½^?þüÅ‹#„222–.]j0D"Qvv6BhÏž=¯¾úêÖ­[9Ζ-[&Ož3qâD㆖ìììèè褤$‚ -ZDûò¬@ ˆŠŠR("‘(??ðàÁk×®õôôtrr ú{•vj…B¡ÓéðýJ±X¼ÿ~ªÍbooÏDQÔV¤„P(ÌÈȈµ··ÏÍÍÅ u:é[#›7o6Þ¼¦-ár¹...¾¾¾&L¸~ýº¿¿?“Z]F{ø|¾ÑFµµµ588X£Ñèõú 60lEk©¹¸¸0‘CXzzú¢E‹V­ZåççÇårB¸Ÿà£¡¡¡ÑÑѤ>†oÍ#„^|ñÅË—/ß½{—*999ùÍ7ßär¹|>ßÜýñåË—Ÿ9skŒˆˆˆ‹‹[·n]||¼T*5 b±8%%…dOBBU´°BAW7WÖÖþZQ1yÚ4¼û]^ÞÂeËú̺G‘N-H?åïŸRS )ýŠî'´ðÈ‘™¡¡²³!­ý¥R)‘H,?ÇyöìÙýë_øÙDs%€)´ñinn¶··Gíß¿?==½k ‘÷fä!ËÀ#I§~ËfÌ™“¿oß?‚ƒM%œ((˜·h‘q>>§OŸfÞV¥RMœ8±SêŽ?®P(¤R©L&ËÏÏ7j=zt@@ÀÕ«WBË—/—H$¸|Ó¦M!½^'•JG=kÖ,S› Ejjj§l0¥¹¹yãÆÆÝ„„‰D‚;O§<%ÉéQQQîîîãÆëZsLraD©T:;;÷Ž.: ·¯ à¿àçðºÆ999%%%›7oîk£ú;B¡°¢¢!tîܹ˜˜˜ªª*† E"Ñ©S§˜+ÒétáááÅÅÅîîî­­­wîÜ1Õþå—_._¾üĉ_|ñ…R©”H$¸!ôñÇ777_¼x‘Íf_ºtÉ´U7Á£CãÊ„‰‰‰o¾ù¦D"鬧$9ÌihhÈËËkhh`³»5aÑÙ\ ]À\&ô¬¬¬RSS³²²T*Uii) 1;…R©tttDUWW?^*•úúúâAgYY™D"ñòòZ¶lž÷JLL4öS*•"‘héÒ¥...)))´òÛÚÚÔjõ°aÃB<O,› ª®®¦m¸sçεk×âq˜L&cè Õ’_ xNT¥RÑŠ"yŠZ½zµ»»»\.ÇŒ¡œóçÏËår©T:aÂ<Â~ÿý÷Z[[½¼¼hç2•J¥½½½¯¯ïܹsŸ}öY<ŠMJJ’Ëår¹ÜÏϯ¤¤„j!“\ „JKKe2™——ך5khãCõ”6¤¾ÁP; ¹Lè/hµÚ%K–,\¸ð§Ÿ~òññ‰â‰'²²²Œlll^~ùåǤäüùó !„ð𨾾¾¹¹ÏQEFFnÙ²å…^(,,|ûí·‹ŠŠ^yå•Í›7}þùç¸UBBBtt´é´_]]ÝŠ+.\¸lÙ²%K–Pñùüùóç{xxL:uöìÙsæÌ1=úõ×_S'±y­­­¤[ºØf¼½yóæÀÀ@jCª=T¿ðÌ¥åiQ’§jµzË–-õõõ666uuuÈdÔ²œ¨¨¨­[·N™2eóæÍñññ_ýõgŸ}öÎ;ïXn¨×ë³²²ž{î¹ÒÒÒÙ³goܸñå—_~÷ÝwBgÏž}íµ×JKK» lÏçŸhA’âsàÀ’§Ôh „¨}£CíÉÉÉýêLéå3:éêæ—+*r23»Y;vôѺí,Zž´=$¥Òý„îIKkV«qZ Cmm­H$ÂÛ}í\Ç+‚ 6lØ0oÞ<µZÍápðl™T*U(<×ùã?œœœ¨mkkkAwîÜqvv¶ ±´´týúõb±ø½÷Þ«­­ÅºF=gΜ›7oR%×××óù|s6[ð‹dÕ/ZQ´ÂM õz½T*ŒŒüúë¯[ZZšdÃëׯ?õÔSL⣵µµNNNµµµO<ñAGŽñ÷÷—H$cÆŒÁ%DçsA²ÇÉɉZOIº¨}ƒyO€GŒNý–5«Õ{ÒÒH¿e9™™„Éx2'3Á\&ô+X,–³³óýû÷ñö£:kò0fVBCC¿üòK„›Í.++ãp8¸\­V3inee…b±X„Å—®¼½½½½½g̘Ûá–B¡ÐÎή³o¨ÐÚCò‹‹eY,›Í.))9uêTjjêÞ½{>ÌÄË1aˆÁ`Ðh4ááá§OŸöòòª®®6÷Γ\P=¥Æ§ ž2Ñþ¨ž•0— < `” ý—+V¬X±‚Zø˜”tŠ’’’'Ÿ|’Ïç{zzfee½òÊ+z½þÒ¥Kžžžb±øèÑ£AAAß~ûmwTþãÿ@UVV>œa«èèè>úè‹/¾`±X•••C‡í‚jZ¿x<^KK‹F£±±±ÁÕ„Bakk«Z­´rÚÛÛÕjuPPаaÃÂÂÂp!U WW×¢¢¢)S¦äåå;¶ . „´Z­N§5jB(##£kBBÀÍÍíäÉ““&MÊËËCtñyöÙg©žRåt¡o<Âg%ô80Ê`ƒŸq$‚ÇãíØ±!”””DÄ¢E‹<==ÓÓÓ-Z´jÕ*???.—‹R(:·‹ÅÛ·og¢+99ùÍ7ßär¹|>çδu–/_~æÌ,9"""..nݺuñññR©Ô`0ˆÅâ””Óç2CCC˜h§ú%¢¢¢ …H$ÊÏÏ¢µI.ž{î9üY(#ÔøP=¥ê"õ ÚÈÐe`” À#NAAÁš5k¸\®ƒƒCzzz_›ô# oÀCF™<℆††††öµ@úßÓÓ3++ !¤×ëËËËX,>zô(BèÛo¿íޮɓ'———ïÚµ+<<!Äçó½½½ñ):®¦¦†Z§½½½±±1((hÕªUW¯^¥Kµ!´nÝ://¯ƒFEEᲩ§þþþZ­V§Óá9ÂŒŒ ZÉL´;88¸ººbÉyyycÇŽ5ç¾å7úi½˜:uêþýûóóó[[[Ç—––FjÅÄ ZÉÛ·o¯¨¨XµjÕ°aÃÌÐMÔwkkÕ ¡¦ÆÆ{JeSccäÀ(B¡0##C.—ïÛ·ïÓO?EegggeeI$™L†Oééé±±±^^^¿ýö—ËE)ŠÀÀÀ††…B1wî\†º8ÎŒ3Ž=:cÆ \²gÏžœœ©Têãデq¤:­­­ÁÁÁr¹|áÂ…6l0'™dóéÓ§óóó?ûì3™L¶téÒ˜˜SOsss7lØ`oo¿víZOOO___®™ÿRÓj§úž‘‘+•J9²qãFsFÞºuK¡PXˆ5ò''§>øíÝi\S×Ú7à•„Á"C0ÒPD@D @* VQ[‘*Hyj© ÖªGQ±UœŽ"}Z‘R¥Z‡J=§Å¢ç8`+“cQ¤*”– ˆ‚AÁ0(‚dx?ìǼ)!JÐÿõ뇕{Ýkíê¾Ýãê›7o¾÷Þ{º¨³ 3_¸páÈ‘#ï¼óŽ:¹ºÃÔÌŒýÖ[¦L&!ÄÄÌÌÂÒÒÄÌLƒ<4BˆD"©ð€úÌ¿¿äÆ ÿÀ@êã©£Gç|ò‰–æ „ò¯ï¾302š.‹%b±X"‘ˆÅb™e:ÎÐÓcèé=|xâäÉòð£è”îÿ gNž|oÖ¬ôŸ~ÒâÏúøñccccBÈÏ?ÿ¼ÿþŒŒ me~iø|>‡ÃQÿ*É!>>ÞÉÉIý¢ —êÒ¾ìÝ3Ž9òδi²²OŸùè#i=™}úthD®Ëx>}zýúõzzzfffÔ nÐÀš5kzz =@[×e¢ÊxÍš5kÖ¬Y==‹n‘Þ/u]&!„inN]—É`0X]¿U&ü¦ff"¡Pz]¦H$ÒìºLT™ðÿ1ôôXÔu™ £‹E§kr¿8î1Ð|>_OOûܾ}û!‘‘‘l6[Åót¤æÍ›§"¬²²Ò××—Ãáµ´´(Œét¬´´4‡ãíí]\\¬,L>üèšµÀK  ë>‰D„‘H$¨¯§–» U&€a2™7ž›?>!$<<<;;»ÓŽªßpÅãñìììÆt:–ƒƒC^^Ç‹‰‰‰ŠŠR&ŸG~tÍZà%Àó2^ ~~~Èlhhˆ‹‹Û¼y³²‰D’™™I½²2,,LÙƒ:ËËËËÌÌŒÂårkjjÔœ³üèšµ¨Ü 5Úz^&ªLB=9œ’••¥f¯¥K—ÆÆÆöíÛWY€@ Ð×ׯ­­2eŠ……Ž{÷º9Ï””õŸ")?ºf-Ýœ3¨‰º.“zÉ-u]¦ì oÕ‡»tuƼK]Nž<ÙÖÖ6uêT>Ÿ¯:ÒÞÞ>##£ûåÚ™3gNœ8qéÒ¥.õ’]³è-p, w;{öl~~¾³³óرcÜÝÝåcÌÍÍÛÛÛ©hª««­­­5ŽÇã-Y²äøñã&&&jv‘]³ç =U&@ï–P^^^ZZzáÂ&“YXX(C£Ñüýý9B9tèPàóWÈvUMMMhhhjjªú½äG׬E³9@OA•  Cd¯Ëܲe !$,,ÌÓÓS X[[ÇÅÅiœ9))i×®]çöíÛË—/WÓéXñññ|>îܹ\.×ÛÛ[ÙXòyäG׬z\—  +,--…Ba‡ÆÔÔTõ»«x%ã Aƒ._¾¬:C§c%'''''w:ù<ò£kÖ½Že€ö¡ÊíC• Ú‡*´U&€Y´h‡ÃÑÓÓãr¹[·n}™Cóù|j\ʾ}û!‘‘‘l6[õk';IKKsqqáp8ÞÞÞÅÅÅêÌÄÒÒRÍiWVVúúúr8œ   êáš #Peèo¿ý6++‹zPLLÌK—2þ|BHxxxvv¶ê^Æ888äååñx¼˜˜˜¨¨(mΘèè訨(ggg—˜˜¨ÝäШ2tÚºuë† âîîž@µ”••7ÎÕÕuäÈ‘7oÞäóù,kÁ‚VVV{öìQ³—š£ûùù©>©NŒ———™™!„ËåÖÔÔ( +((pssóôô\¿~=ÕRYYàêêÊårsrrä»H$’ÌÌÌBHXXXFFF§k/ ªLÝÕÔÔ´mÛ¶¢¢¢Â¹sçR~øa|||qqq\\ÜÒ¥K !=ŠŽŽNKKÛ±c‡ú½äÉ>>++Kë«“’’2sæLeßFDD$&&^»vÍÉɉj  -..ÎÏÏwtt”ï"ôõõkkk§L™baa×è<•@w;::FFFNš4iÆŒ„æææ‚‚‚E‹BÄb1ƒÁ „˜šš:;;ß¿Ÿz*»š½äQgÌ_кœ9sæÄ‰—.]RømSSSEEE@@!$888!!šóùóç !¶¶¶Ê2ÛÛÛgdd ÄÐ5¨2tN¿zõjnnî¾}û:tâÄ ªñ÷ß—VŠ|>___ŸB£Ñ$‰š½^2·dÉ’_ýÕÄÄDY FëjZssóööö––##£êêjkkëîM´ gÌtWkkkccãäɓ׬YSZZJ111ñðð8pà!D$]¿~][½^œšššÐÐÐÔÔT;;;e1¦¦¦öööÔÅ—G%„˜˜˜xyyíß¿Ÿ" «««å{Ñh4ÿ#GŽB:ø‚V4€*@‡,Z´( €º>rëÖ­---Ó¦MswwŸ3gΗ_~IÅüôÓOàp8nnn™™™òI4ëEþ~]æ–-[!aaažžžÀÚÚ:..Na¯Ncâããù|þܹs¹\®···²uÿþûï—-[æááqëÖ-ªåàÁƒ‡vuu>|8U.ËKJJÚµk‡Ã¹}ûöòåË•%€—gÌtÈ·ß~Û¡%??¿C‹££ã¹sçd[¨Ë1---ù|>!¤_¿~êôêÀÒÒR(vhLMMítÎÆ$'''''wšgĈEEE²-vvvÞ„4hР˗/wš^>ËíñL€×—ËíвzõêÐÐЙ ¼’Pe¼Ž^Ü‹(8cÚ‡*@‡,Z´ˆÃáèééQ÷˜Bþúë/oooWW×iÓ¦=~üXa¯ÇõÕW*Òòù|*'eß¾}„ÈÈH6›Ýé $ !óæÍSVYYéëëËáp‚‚‚ZZZT§âóù–––ލAfÐ5¨2tÈ·ß~›••E½ƒ'&&†²lÙ²+V»»»Su§¼N«Lòü½>”ùóçBÂÃó³³;RFFÆÓ§OUDGGGEEñx<;;»ÄÄÄNªïÅe€—U&€î‹Å¹¹¹Ó§O'„ÿúë¯|>Ÿ:¬(=(+}Ä&—Ë­¯¯W3¹ŸŸ_§2âââ6oÞ¬,@"‘dff†„„BÂÂÂ222†¸¹¹yzz®_¿žj©¬¬ puuår¹ÔÃØ5Ë : U&€î†††„6›]SS#³eËéáÏ7n°X,…©dŸ¸ÞéC(¥–.]Û·o_3Ô×ׯ­­2eŠ………²—‰GDD$&&^»vÍÉɉj  -..ÎÏÏwttÔ83è,ÜcðZ ÊÐ.u9yòd[[ÛÔ©S©‡½«`ooŸ‘‘¡¬ljjª¨¨ „'$$477œ?žb```kk«YfÐe8–  »ÌÍÍŸ={ÖÖÖF©­­µ²²¢ÑhÔWòïéѺ³gÏæçç;;;;¶¡¡ÁÝÝ]á ÛÛÛ©[sª««­­­¦’N[}jf…*@wÑét??¿ãÇBŽ=úÎ;ï0™Ì'Ož´´´Ü¼ySfddôäɪբ„„„òòòÒÒÒ .0™ÌÂÂBùæïïäÈBÈ¡C‡åcLMMííí©‹/=J111ñòòÚ¿?!D(VWWk–tªL²hÑ"é­<ÔåIII[·nuuu-,,Œ‰‰144ŒŒŒ?~üéÓ§¥½LMM#""¸\î˜1c=z¤0³ìu™[¶l!„„……yzz kk븸8眔”´k×.‡sûöíåË—+Œùþûï—-[æááqëÖ-ªåàÁƒ‡vuu>|xii©Æ™@gáºLòí·ßvh±àEÀsÐ>T™:D"‘Hß!)‘HºŸPú"ÊWX}}ýøñã{zЪL]ÑÞÞþñÇ_¼x‘røðᘘ˜žžQïÀb±rss{zЪL]¡¯¯¿oß¾Ô××$$$( +++7nœ««ëÈ‘#oÞ¼ÉçóY,Ö‚ ¬¬¬öìÙCŸ¹¹yzz®_¿^a’ÿüç?ÁÁÁÔrvvöĉ !•••®®®\.7Õ¯p‹ IDAT''Ga̺uë† âîî®lzò3¼{÷®³³3õšÊÈÈȯ¾úŠÏç›››øá‡îîîcÆŒ¡ÞÏž˜˜èîîîîîîíí}õêU…ë%?ú–-[8uô—råÊwwwWWW??¿šš…yà%@•  +ÚÛÛ###çÌ™Ãb±†¾jÕ*…a~øa|||qqq\\ÜÒ¥K !=ŠŽŽNKKÛ±c‘˜˜xíÚ5'''…Ióòò?~L9|øpXX!$<<<44´¸¸8??ßÑÑQ>¦©©iÛ¶mEEE………sçÎU¶"fhccóÅ_|üñÇéééwîÜ¡ŽÑ644Ì™3§°°pæÌ™Ÿþ9!döìÙ………………[·n]¸p¡üz)=66¶Ãs7#""Š‹‹§M›FmCùí/î1Ðúúúû÷ﯭ­%„„†††„„ÈÇ477,Z´ˆ"‹ !ÄÔÔÔÙÙùþýûÔ³Ó›šš***!ÁÁÁ :?~<$$äÔ©S_}õ•ùüùó„[[[BH‡cccGGÇÈÈÈI“&͘1CáZ(œáŒ3~ùå—Å‹_¿~z§¹‘‘uptúôéTñwýúõY³f555I$ê FÖKÑ›ššªªª¨ÌÁÁÁ;wî”Ï/ªLB£Ñ¤/Ú¡ª1yt:ý÷ß§ª7BŸÏ×××§â¥7 )ë+köìÙ;w›2™ÌæææNc!W¯^ÍÍÍÝ·oß¡C‡Nœ8¡Î !"‘¨´´ÔÈȨªªJþn$‰DÒÖÖvöìYOOϲ²²±cÇB:¬Nïtt…·LÉox pÆ 7111ñðð8pà!D$]¿~]>ÆÔÔÔÞÞ>''‡rôèQe©üýý¯_¿¾wï^êt¹‰‰‰——×þýû !B¡°ººZ>¦µµµ±±qòäÉkÖ¬Qöòq…3üç?ÿéééyìØ±ˆˆˆ¦¦&BHKKKff&!äøñã£Fjoo …vvv„””…™ÕÝÌÌÌÖÖ–Ê|ôèQ___e«/Žeô2?ýôÓ¼yó%ÉG}4gÎù˜ï¿ÿ~Þ¼y ÃÓÓSYƒñî»ïþðÃTEH9xðàüùó·oßÎ`0¶mÛfeeÕ!¦¥¥eÚ´immm"‘èË/¿Ts†Ç¿r务¡á‚ "##¿ùæ&“™’’²råJccã´´4ccã 6xxx°ÙìÉ“'+L«pt.—+ ¸\®££ãÏ?ÿœ’’²`Á±XÌb±~úé'õ7,hªL€^ÆÑÑñܹs²-ÔvKKKê>nBȈ#ŠŠŠ:M•œœœœœ,ýhgg×áNš1ýúõËÏÏ×`†Ò×-]ºtéÒ¥|>ŸÁ`ûì³Ï¨åM›6ɯ—ÂÑå_täããSXX(Û"¿}à%ÀsÐ>T™ð²Iïp€WªLÐ>T™ }¨2tEttôÚµk©åû÷ïß¹sGö݉RõõõãÇïÎX|>_OOËår¹ÜcÇŽ) «¬¬ôõõåp8AAA---òiii...ÇÛÛ»¸¸Xͱä×´­­­;«:U&€® ÌÍÍ¥–srr&L˜`hh¨0’ÅbI#5Æd2oܸqãÆ eïÑ!„DGGGEEñx<;;»ÄÄDù‡¼¼<¥æXê¯)ô^¨2tŸqãJJJ¨÷†çääBD"ч~èîî>f̘ššBÈ–-[8Žì1ÎÄÄDwwwwwwooï«W¯BÖ­[7dÈwww…¯—T“D"ÉÌ̤^t–‘‘!ãååeffFár¹Ôô4^SxÅ ÊІ††cÆŒ¹xñ"!$77—ª½æÌ™SXXøþûïS“ŒíðTËÙ³gnݺuáÂ…MMMÛ¶m+***,,œ;w®²áZZZÜÜÜüýý+**}}ýÚÚÚ)S¦XXXÜ»wOÅäSRRfΜ©æX ×^1¨2tH```NNNEE…¡¡!õºE##£‰'B‚‚‚.]º¤°×õë×Gíêêúé§ŸÖÔÔ;::FFFþôÓO}úôQØ…ÅbÕÖÖ?~ñâÅ*¦dooŸ‘‘a`` "æÌ™3'NœØ¸q£úcɯ)¼bPeèê‚Ee'‘i4š|c[[[XXØŽ;Š‹‹;&‹étúÕ«W?øàƒcÇŽ…††*H__ßÄÄ„òÁ(»kÇÜܼ½½ºé§ººÚÚÚZaÇ[²dÉñãÇ©„jŽ¥zMà€*@‡ØÛÛ?yò䨱cÒÚ«¥¥%33“rüøñ1cÆÈwioo …ÔáÀ””BHkkkccãäɓ׬YSZZªp é»ùå—¡C‡*Œ¡ÑhþþþGŽ!„:tHa9XSSšššÚáxd]]¯¯¯Š±ä×^1x9€nyçwöíÛ—žžN}d2™)))+W®411IKK#„p¹\¡PØÐÐÀårþùç 6xxx°ÙìÉ“'BZZZ¦M›ÖÖÖ&‰¾üòK…£8p`ÿþýt:½ÿþP6™¤¤¤°°°­[·ÚÛÛÇÅÅÉÄÇÇóù|êêOCCÃ+W®PíB¡°¬¬LõXÖ^1¨2tKRRRRRµlii):ܸq£CËgŸ}FÝDÙ´i!$??_õ(²]T4hÐåË—U$'''''˷˾CRÙX²k ¯œ1íC• Ú‡*´U&hªL]Áçóõôô¸\î°aÃ&L˜P^^®fÇÇõÕWêDΛ7OöÕ”TVVúúúr8œ   ê1™ò"##Ùl¶lù^Zø|¾4>++ËÉÉIõk„àÕ€*@‡0™Ì7n”””Ìœ9sáÂ…jöR³ÊÌÈÈxúô©Š€èè訨(ggg—˜˜¨0&<<<;;[u/ey®\¹²`Á‚S§N){À;¼JPeè¢É“'ÿñÇ„+W®¸»»»ººúùùÕÔÔH òù|KKKBHlll@@õøL.—[__¯0aCCC\\ÜæÍ›•(‘H233CBB!aaa ÃüüüddÊ÷R–§¤¤$,,,==}ðàÁmèePeè¢ôôôáÇB"""Š‹‹§M›¶jÕ*ùÈ-[¶deeQAoܸÁb±&\ºtilllß¾}•(ôõõkkk§L™baa¡æImù^ ó<}útÒ¤IcÇŽår¹j­?ô~¨2tuH’ÍfÿðÃ{÷îmjjªªªš8q"!$88ø·ß~Ó,íÉ“'ÛÚÚ¦NÚi¤½½}FF†A—òË÷êÐÒÖÖ–˜˜˜››{þüù.e€Þ U&€¡IVTTP…¦D"é@£Ñ¨¡P¨~Ú³gÏæçç;;;;¶¡¡ÁÝÝ]>ÆÜܼ½½º}§ººZÍK'å{)ÌÃd2CBB¶oß>oÞ<Õ׆À+U&€Î122Ú¹sg||}ZljjÁårÇŒóèÑ#MJJÚµk‡Ã¹}ûöòåËÆ„……yzz kk븸8…½TäÙ±cGJJJ^^žÆ“€ÞB¯§'ÿÇÒÒ²®®Núq÷îÝÔB‡CÛ·o§¾þúkiã®]»4¢ƒAƒ]¾|Yu†ÔÔÔN{uhéÛ·¯tP+++@ ÎT ·Ã±LÐ>T™ }¨2@ûPe€ö¡ÊÐÑÑÑk×®¥–ïß¿ollL=œ¨¾¾~üøñ]JµbÅ ‡ãææ6räH…7tóù|===꥔ǎë4¡ô…–ꨬ¬ôõõåp8AAAÔƒ3µ%22’Íf˾âtªL]˜››K-çääL˜0ÁÐÐÂb±¤íjZ»v-Ç+**ŠŸ?¾ÂéK)g̘ÑÍ™wÅãñìì쵘9<<<;;[‹ àÅA•  +ÆWRRòøñcBHNNõ<ó-[¶p8éÑ;>ŸÏb±,X`eeµgÏe©ÌÍÍ©…ºº: §TPPàæææéé¹~ýzª¥²²2 ÀÕÕ•ËåæääÈw‘H$™™™!!!„°°°ŒŒ …™ÝÝÝÝÝݽ½½¯^½ªNfBˆŸŸdô¨2t…¡¡á˜1c.^¼HÉÍÍ¥ªÌØØØ¬¬,Ù°GEGG§¥¥íرCE¶M›6ÙØØlܸñðáà ZZZÜÜÜüýý+**”%‰ˆˆHLL¼víš““ÕZ\\œŸŸïèè(ßE èëë×ÖÖN™2ÅÂÂâÞ½{ 3Ïž=»°°°°°pëÖ­ .T'3ô.¨2tH```NNNEE…¡¡¡ÂSSSggg{{{ÏW'„¬_¿¾ªªjÖ¬Y«W¯–ÿ–ÅbÕÖÖ?~ñâÅ 3455UTTB‚ƒƒ !ÍÍÍsçÎ%„ØÚÚ*ÝÞÞ>##ÃÀÀ@YÀõë×Gíêêúé§ŸÖÔÔ¨Ÿz T™:„º4Szº\!}}}BF“H$ª³Ñh´ˆˆê5èòILLL!|ðAqq±Š êNý9ssóöövꦟêêjkkkù˜¶¶¶°°°;v;vL,wuÐ}¨2tˆ½½ý“'OŽ;¦¢ÊTGQQµpêÔ)…gŸù|>µðË/¿ :TaSSS{{{êÉ£GBLLL¼¼¼öïßO …ÕÕÕò½h4š¿¿ÿ‘#G!‡R¸"íííB¡:X›’’¢ffè]Peè–wÞyçìÙ³o¿ý6õ‘Ëå444p¹Ü™3gª™dÅŠ...ÎÎÎééé o:pàÀ!C†šššªâèßÿý²eË<<ûì³Ï>ët2#FŒ¥ØÙÙu¸IÞ Aƒ._¾¬þ6mÚ¤fæÔÔÔNf :Ç2@ûPe€ö¡ÊíC• Ú‡*@‡ˆD¢˜˜WWW—éÓ§B"##Ùl¶ê×*ª³bÅ ‡ãææ6räȼ¼<ó¨ U&€Ù¼yóãÇ oÞ¼¹yófBHxxxvv¶ê^êĬ]»–ÇãÅÇÇÏŸ?_ã<j“ŒtÈwß}wãÆ :Nqss#„øùù©xbEsssj¡®®ÎÂÂB<|>èСӦM+**211IKK0`€úë¯9ËÐ ---–––/(ÿ¦M›lll6nÜxøðaõ§4gΜ™3g~þùç/hb  DBa'"Q—¢Êx]¬_¿¾ªªjÖ¬Y«W¯V³‹‘‘Ñĉ !Ó§O¿téÒ‹œô0@ : ¹©‰Ö•„¨2t“É|ã7:=÷Ý4-""¢Ó7)$‘H´>ÐtBîܾ­:¦ºªŠº¦Kýœ +æÍ›·iÓ&ªž+..Öbfé‹"O:åèè¨f¯––ª$=~üø¨Q£´8Ð)tíî;ÍMMÊZZZ*Ê˨2z©þ󟆆†Ô“Œbcc !aaažžžÀÚÚ:..Na/ubV¬Xáâââì윞ž¾gÏ5ó0™Ì””ww÷´´´/¿üRKk :‡Fˆ‘‘Ñ¥sç77ËÛúôi~^“ɤӺpÎ÷˜è}}ý¯¿þZ¶%55µÓ^êĨs–¼C>ŸÏ`0<ØiGxôïß¿þѣܬ,k[[[[c‰XÜÔÔ᩹w÷®“imm]ÒÙµ›²Pe¡ÑhýY¬6“‡µµU••B¡¢¯¯olll7h‘‘­+2 ªLPÆÒÒ²®®®§g/•¡ûÍ7ét:Á K1¤Âu™ }¨2@ûPeè >Ÿ¯§§Çår‡ 6a„òòrBÈŠ+8Ž››ÛÈ‘#óòòä{¥¥¥¹¸¸p8ooïN~4oÞ¼þýû+û622’ÍfKø|¾t9++ËÉÉéÞ½{®¼~Peè&“yãÆ’’’™3g.\¸²víZWTT?þ|ù.yyy</&&&**JEòŒŒŒ§OŸªÏÎΖo¿råÊ‚ N:emmÝŀתL]4yòä?þøƒbnnNµÔÕÕYXXÈGzyy™™™B¸\nMM²„ qqq›7oV1¨ŸŸŸü‘Î’’’°°°ôôôÁƒwu-àu†{ÌtQzzúðáéåM›6íÝ»·oß¾çÎSÑ%%%eæÌ™Ê¾]ºtilllß¾}»4§OŸNš4ÉßߟËåv©#Že膆.—Ëf³øá‡½{÷Rëׯ¯ªªš5kÖêÕ«•uùDö–ö;vp8œY³fùúújœ^+¨2tE‡7:îÞ½[^ÉÉÉÉÉÉš ÑAjjj‡i°•••@ Ps‚3æð" ÊíC• Ú‡*´U&€®àóùzzz\.wذa&L(//OKKsqqáp8ÞÞÞÅÅÅÊ:®X±‚Ãḹ¹92//O>@Í<‘‘‘l6[ú’I>Ÿ/]ÎÊÊrrrºwï^÷V^#¨2tõTö’’’™3g.\¸ÐÁÁ!//ÇãÅÄÄDEE)ëµvíZWTT/ûø!)5󄇇gggË·_¹reÁ‚§N²¶¶Öl½à5„*@Mž<ù?þðòò233#„p¹ÜššeÁæææÔB]]………|€šyüüü¤/¥JJJÂÂÂÒÓÓ¬ÁŠ@¯Ð.‘H$Õ1‰¤µ½]ýœx^&€.JOO>|¸ôcJJÊÌ™3UÄoÚ´iïÞ½}ûö=w°NótðôéÓI“&ùûûs¹\õ{@o$‰ôôTU†mmm]Jˆc™:¤¡¡ËåR/1ß»w/ÕxæÌ™'NlܸQEÇõë×WUUÍš5kõêÕÊbÔÉÓA[[[bbbnnîùóçÕï½Ñ3¡Pu@ccc—¢ÊÐ!Ôu™T¡IáñxK–,9~ü¸‰‰‰ê¾4-"""33Sá·êçé0ŸíÛ·Ï›7ïéÓ§êw€^G ˆÅbeß …BoSU&€Î122Ú¹sg||ü­[·BCCSSSíììTÄQ §Nrtt”¨©©Q'2AAA®®®±±±ô€ÞÂfàÀêû÷…ŠŽh Ÿ=ûó?¬mm»”×eè"ggçàà`—~ýúÍ;—bhhxåÊ…Á+V¬¨®®‹Ål6{ß¾}òñññ|>¿ÓF>³:c@/õôéÓ/¾øâñãDzO?Þš ÁS“Qeèê©ì%%%3gÎ\¸p!!$<<<;;[u¯èè訨(ggg—˜˜¨0F<ò1ò™Õ z©>}úèéé-_¾¼µµ•jimm]µzµžž^Ÿ>}ºš U&€.šF>³šc@/E£ÑV®\ikk»2&¦­­­­­íóÕ«mll–-]ÚÕÇT™º)==}øðáêD }}ýÚÚÚ)S¦XXXÜ»wO[sÏüâÆA£ÑÖ¬YÓÏÜ|ÕªU«>ÿÜÜÜ|ÕÊ•”˜U&€Nihhàr¹ÔKÌ÷îÝ«~G{{ûŒŒ ­OI>ó‹ tN߸qã“–––––uk×jö°L‚*³§ˆ½$ôo"ÑË™ h…¶~PêºÌŠŠ ªÐT§‹¹¹y{{;u#Nuuµµµµ:½4ËüâÆB§Ówíܹ39Yã“ Êìm­­÷kjTÇ<¨­m{~á-è8­ÿ FFF;wîŒollì4˜F£ùûû9r„rèСÀÀ@5GÑ ó‹ t¾¾¾¾¾~w2 Êìåý¥:àöŸ¾œ™€VhýuvvÞ¶m[XX˜§§§@ °¶¶Ž‹‹Sœ””´k×.‡sûöíåË—+ŒQ'|Œ|fuÆ xyOyX[Û ˜™™)ü¶¹¹ùamíKžt‡V~Ð3ÿùOb\Ü¿¾ûŽú8ÚÃâ8`@à¸qÒé·|A-¤ÿûß Çë4ÂùÌŽ½Ñ‘Ÿ~ÒnBT™=ÃÊÆ&ëôiÿI“L™Ì_577ŸÍÎ`eUY^Þ#s tÿ•hzá‹a×`ðš£B×ìŽYÝÖ.‘hÜ÷Ý3´8 ªÌžáêîÞÞÖöËÉ“ý-,†¸¸ô·°ˆÅ<øë?ê>´0ÀiÈT™½ˆV~ÐàÐPuÆ’H$¼ÂÂ{UUl¶ƒ““å[o1ôð@-"¡°A ¨¼}ûî;F}ûög±Pm«D"‘ˆD¢gB¡àÑ#;;75ÿ×úQL vN=ƒF£y nmk[zëÖoçÏS7 Ó 333®§g?üÅ×Ûhå+¹],ËÞâw½ €ÏçLžÌ47§Z$b±6VàÕG§Óû±XýX¬ÁÎÎÏž­ô¨?‹ÕӓЦ§§§§§×ÇÒ²ª¢¢ýÙ3¯‘#¥ß¶¶¶¾ÌUfObõïï3j”X,‹Db‘H$‹E"Z7=«›?¨XQ±x»¢‚Á` 8P"‘BêëêîÞ½8mš™™ŠK7îlVV›‰‰!þ ¯:nÉfß©¨°8°¿…Õ˜¸mƒÁˆ‰‰yi…&ªL]Ñᙚ‰¤¼²²½½}øðáOš›©*³ôæÍþ&ffân\|/ÈãæfBˆ±‰‰ŠeÐFÆÆV66<`¿ùfOÏ@ûôôôúñŠ‹ß?žjY¼dIttô游5kÖtç)˜]˜ÃKÔ!{,“*1%ÉðáÛ%ÏkÊ`ÔÛoã(¦nº[QAqæpT,ƒN±8°êΗ³»xù˜LfuMt—aôÆß$%­Œ‰Ù°aÆõë Æ‹žªL]!½.S"‘”–•öéãááÑøè‘Dæ°¥H$êoa¡ðÜ:ô8+òü_ Ê–A§›˜…Bú‹ß×ôˆ7ŒŒÄb±ì_> [·ÆÄÄDFFîÚµ«›]ïªÌ#‰Ê++mÿþŽ>‘X\ûà­•UOÍ 4ÖýT¶Ê¤Óét:ýуòWÏHÄbËÔMF}û’ç7c)[Bý(8– ¯¶ùHÄb !’—²7A•Ùc †žž^ÙíÛŽööT‹X,¾sï^?ËØÔôé“'=;=èªîÿ "™?íöòëêîTW[¿õ–l¡Ig0>|ȶ´Ôúü¡ûž<~Lékl¬btJSS“¾¾>ªLxUµ¶¶ÒétÙëø[[[?_½ºŸ¹yÂÖ­ ãE_â*³' ´±©¨ªº]Y9ÈÆF,WÞ½kÆd: Ô(¼„«%@|)còIDATëºùƒvx’‘“YߨXU]mõÖ[Ò} ™™YÙ¼‰›tRõ;„ÁC‡ªX¯©166F• ¯*@`nn.=`ùäÉ“UŸncc³jåJ:öN° Êìa6TÞ½[q÷nû³gF}ûvt|TW‡³÷êÎÚá™G4B,úõ«khhlnîonN]Xcgo_xíÚ“'OLpòî±8>ùW¯ŠD"BHmm­°½½¨¸Xú±¢¢Â×LJRu÷îï¿ÿÎb±Nÿò Q±Ê ƒÁ¨ª¨þ7%0°û«©y•y¿¦¦®®n·êëë3 Oê«ÆÆÆO>ýÔÁÉÉ~ðà%K—J»üpàÀ7+W®P----Ñ+V89;;89-Žnkk#Ïÿ)öÃÎÆq==¯^½º{ï^çaÃ\¹Ü«W¯RS~øëéicg7)0°¢¢‚ôþû"‘ˆ*À;&ýÇœ²ÉBnÞºåçï/íecg'úXá )YYY„ï÷ïwó𰱳㸻·gO‡ ÎäªX/*ৃÝ==í–¯\ù¬½JòH ˜;þ GG'gçµëÖQÿwRñ?<èáå&»Š‹‹•ͼ¾¾~vx¸í A>£G_¼tIá+¿F²ÿ>–ýW¬ÂÍ«°QÙ|n½²¿ÔÌe“é ùÛo#æÎ•~\»fíZ…‘Z§l/ÙÕ•Máßuªw…ÅÅÅêì;Ô\²{ïÞí[âã7mÜ8qâD=====½±cÆlÚ¸±«[C~Ç'»î]Ú§tÉ”ÀÀGÁåç5ICCïg΄ü}/£p ƒ©©üÏÿP#||æÎŸO-»yxðx}ú½÷ÞáÇ©ÿ=~Üið`ΰa²1 =jÔå+WÄb1ŸÏoöìjA!äÎ;OžÞÞ>#GJ?Žòõ¥Â¥¥MŸôÞ{¹¹¹>Tg•ÕTÊã™™›«ŽÑ¼ÊÔ××?ñßÿöë×/vݺ¡δ÷Þ£þ!ÕÜÜœqúôæM›LMMõôô†{yI»|ºp!ƒÁxwÚ´[¥¥„–––£ÇŽmþç?ûöí½lÙÿû_ið¢O?e0S§N½ÿþâE‹¨å›·nQߎ{ûí~ææúúúóçÍ»öûïÊ&©b2êP1ü˗‡q8ÆÆÆúúúúzzeýõøñcSSS—¡CUçT½^„µ±±o¼ñ‹ÅŠY±âç£G©µ8“™¹aÆ7Þx£ÿþ«V®L“©?‹‰100044TgæTªõk×öéÓ‡ÅbEÿýà.Eý5R¸y6*›Â±ººI•a³Ù¾>>ÇOœ „ääæ²úõswsÓ,@W)ÛKvÐéNAÕ»B ö„{{{e·(¼õÖ[üûßÒ–€F£™3™ÔGW.—º›V¾¯ê­!¿ã“] õ÷)˜züäIêXãá´´ÐÐPÙo• 4pà@ccc^IIÞåËãÇ·d³ËÊÊ.ýö›·7NW=½.myÕ[x´¯o^^!äòå˾>>>>>ÒT•yåÊ•šššÉ“&988 qr¢¶­²U‰DöƒKÿ+//W½é¼U„¢tëʃ¶¶‰ „‡®Y»öÓÅ‹OŸ:UWW'‘Hl¬­;3 &“IéÓ§u ꃄBáè·ß¦$ ƒÁèl ¯o```bbB-K‰ÿûÇ·''Sˆ´??­,OÙdÔ¤b†YYYýý !fffRRvíÞ»nݰaÃ6¬[7bøpe ;]/fmeE-[ÛØP#Rÿì“¶ÛEÞÞÞýúõË8}ڃ˽výºì»µU4Ê×÷â¥K£G233û-/ïjAÁèQ£T÷êê–W½…}}}¿ß¿_ÐÐPW_ooooaa±hÉACíÒR___BȡÇÇûù™ššB¦OŸ~øðá… ([eƒÑ¥{ž‚Nc´s}«……Å?/~oÆ j™F£Ý«®–þO£ ‹Åb0…×®Q®Ô÷H X¹jÕÑŸåë{£°pê»ïBh4šÂ‰©9™®Î03;[úÃLœ8qâĉÏÚÛ÷ìÙµ`ÁuåÇV;%‘H¤³­¾wςҿBˆ´ýÞÝ»o¾ù¦|_Ù- læTªêêj«çC(œ†üˆD¢gííúúõõõT˜ÂÍ«°QÅ–T¸õToR…“QhJ``ÌgŸÝ*-ý53sÆ *"^Ù½¤úTÿ]×é®PÍ}G— qrrqq9zìõÑœÉt2$++kÖÌ™òÁUŠŽÝ¹­¡pÇ'Ü¥}Šf‡„NKû믿Æßat5ê—_­ªªŠ^ºÔÌÔôHzzAAÁüyó´;=Õ[xÄðáMÍÍÿþñGï‘# !&&&–––ÿþñGKK˶¶­­­ÿ9~\$ åp!Ïž=kllä•”p† S±Ê*åñ¼ÇŽm¤ *‚5?cþðáÃovì¸W]MillÜÿÃîîî„ccã©S¦lظ±¹¹Y(þ~íš² &&&AÓ§¯[¿žºr®¶¶öü… ê Ýþì™H$b2™ííí{÷í£™L&ué§l¤ú“éÒ ïTU=kks<˜rÿþý윜gÏžéëéÑéÝ}iü_<}ú´þÑ£„ÄÄ™ÁÁÔ4&lŽ‹{úôi}}ýÖmÛf½ÿ¾|GÙ- læTª¸øøÖÖÖúúú¤íÛåó(\£Ÿ:uêÙ³gßïßOE*ܼ •ÍGáXnR…“Q¨OŸ>ïNºà“O<==5û—€f”í%Õ§úïºNw…jî;ºê‹§üðƒôcìš5ë6lÈÊΉDb±˜ºûDžê­!¿ã“êÒ>E3!!!çΟÿ×?Ζ;å¥b êXæÓÖÖøøøääæ>¨ÛB´;=[¸OŸ>\w÷»vùx{S->ÞÞ;wí¢î.Ï8}šÁ`üvñ⹜œs99y/úøø¤¥¥©^åNIO”«sÆ\ó’ÈÐÐW\/Y’ †›‡Ç—ÿú—Š$I‰‰†}úx5ÐÞþ½3JÕ{\%›Í^úLž2Åwôèa..TcÿþýçÏ›7úí·í–ý ÔŸŒú3ÌÌ̤î.'„ˆÄâ„mÛœ†µ4èà¡C»¾ý¶«CÈb0£Gò=ÚkĈ¡ÎÎË—/§Úw|óM[[ÛPÇgÔ(//¯èeËäûþm ðxʶíö¤¤G vvž6}úûÿìbôõõ·lÞ¼rÕ*o_ßá#FÈnùÍ«¬Q~> Çêt“*›ŒB³CCoÞº¢è_/ŽŠ½¤šTÿ]×ù®ÇSgßÑA§$÷ññ,óP¹ÀÉ“·'%mMH°<ØqÈïSRöîÞ-ßKÅÖP¶ã“RŸ¢[›#F´´´Nž,ÿ­²úöíKÕs&&&ô9Rzf\ƒé)Ûòª·ð¨Q£êêê¤ùññö®««õütù³g[[Y½ùÜü¹s¤§ …B…«,}:õßþ¿_< Õ(PÇ/¥ *Ð!‰¤þùeüû÷KnÜð d½ùæ””iS§BNž:E-eöÌŸ;WZhjKYYÙ˜qãjÿ~8º©ººÚ{Ô¨[<žVN¬PXo¾)Ýub/©±ºãÃo¤Eò'Ê¥ ÔvÎ>}:䣤<ûôéЈ¼Ç\£G3fLOÏÔ²{ïÞég@cò'Ê_ø=毭%‹÷ô s---.®®V¤<ØÓsèŤ'ÇåTÀ±L2xð`œ.×"##£ÊÛ·/]¸`«äå@г°ãÓqÒG¯«XPU&( âDywϘK¯“ýèã5Ÿ À+§^æááØKê&üFÚÂzþ¤U… õ¾,¥U¦lý^sØKê>üF=¢c•iùÖ[ÃÜÝÓè‘Ù@¯#û#)Ç2ë<ù裗2%èõ-þ¿žÊ>˜@3Ô#Ù% î1ícB$ Fóâp*þúKõÛKÊ>}ºâ¯¿¨™Dz]f]mm6›rø‡zprÐK…FDBÏ_ D#¿(“ª5ºãÿ^©¸t‰"ÈIEND®B`‚gspiceui-1.0.00+dfsg/Authors0000644000000000000000000000134511640200222014355 0ustar rootroot Authors --------- Start Date : 04/04/2004 Last Update : 27/09/2011 ------------------------------------------------------------------------------- gSpiceUI - A Graphical User Interface (GUI) to various freely available Spice electronic circuit simulators. Author : Mike Waters Email : M.Waters@bom.gov.au ------------------------------------------------------------------------------- This application depends significantly on software written by others. Credit should be attributed to the authors of : wxWidgets NG-Spice GNU-Cap gSchem gNetList gWave Gaw ------------------------------------------------------------------------------- gspiceui-1.0.00+dfsg/gspiceui.lsm0000644000000000000000000000073511526570637015363 0ustar rootrootBegin3 Title: gSpiceUI Version: 0.9.99 Entered-date: 15/08/2003 Description: Provides a GUI for various freely available electronic circuit simulation engines : GNU-Cap and NG-Spice. Keywords: SPICE GUI Author: Mike Waters Maintained-by: Mike Waters Primary-site: Home-page: http:// Original-site: Platforms: Linux and other Unices Copying-policy: GNU Public License End gspiceui-1.0.00+dfsg/fig/0000755000000000000000000000000011752030331013555 5ustar rootrootgspiceui-1.0.00+dfsg/fig/Makefile0000644000000000000000000000523111640200712015214 0ustar rootroot#****************************************************************************** # Makefile * # ---------- * # Description : Build system for GNU Spice GUI project xfig diagrams. * # Started : 06/04/2004 * # Last update : 27/09/2011 * # Copyright : (C) 2004 by MSWaters * # Email : M.Waters@bom.gov.au * #****************************************************************************** #****************************************************************************** # * # This program is free software; you can redistribute it and/or modify * # it under the terms of the GNU General Public License as published by * # the Free Software Foundation; either version 2 of the License, or * # (at your option) any later version. * # * #****************************************************************************** #****************************************************************************** # Specify string values #****************************************************************************** # Which figure translator TRANS = fig2dev # Directories ROOT := $(shell cd .. ; pwd) OBJDIR = $(ROOT)/html # Objects OBJS := $(patsubst %.fig,$(OBJDIR)/%.jpg,$(wildcard *.fig)) #****************************************************************************** # Make these targets #****************************************************************************** all : $(OBJS) # Compiler Rules # ($< is the name of the first dependency) # ($@ is the file name of the target) # (-L is the output graphics language) # (-m is the magnification at which the figure is rendered) $(OBJDIR)/%.jpg : %.fig $(TRANS) -L jpeg -m 1.0 $< $@ #****************************************************************************** # Remove temporary files and backup files #****************************************************************************** clean : rm -f Makefile~ *.bak $(OBJDIR)/OM-*.jpg #****************************************************************************** # Specify phony targets #****************************************************************************** .PHONY : clean #****************************************************************************** gspiceui-1.0.00+dfsg/fig/OM-Analysis.fig0000644000000000000000000002166411412210414016344 0ustar rootroot#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A 100.00 Single -2 1200 2 6 450 1125 7650 9405 6 3330 4230 4725 5220 6 3330 4230 4725 5220 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3330 4770 4725 4770 4725 5220 3330 5220 3330 4770 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3330 4500 4725 4500 4725 4770 3330 4770 3330 4500 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3330 4230 4725 4230 4725 4500 3330 4500 3330 4230 -6 4 0 0 50 0 16 10 0.0000 4 120 570 3420 4950 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1140 3420 5130 PnlAnaBase.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 825 3555 4410 PnlAnaBase\001 -6 6 4275 5220 4545 5670 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 4410 5220 4545 5445 4275 5445 4410 5220 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 4410 5670 4410 5445 -6 6 3510 5220 3780 5670 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 3645 5220 3780 5445 3510 5445 3645 5220 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 3645 5670 3645 5445 -6 6 450 5670 3825 9405 6 450 5895 2025 6885 6 450 5895 2025 6885 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 6435 2025 6435 2025 6885 450 6885 450 6435 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 6165 2025 6165 2025 6435 450 6435 450 6165 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 5895 2025 5895 2025 6165 450 6165 450 5895 -6 4 0 0 50 0 16 10 0.0000 4 150 1335 540 6795 PnlGnuCapOP.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 570 540 6615 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1020 720 6075 PnlGnuCapOP\001 -6 6 2250 5895 3825 6885 6 2250 5895 3825 6885 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2250 5895 3825 5895 3825 6165 2250 6165 2250 5895 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2250 6165 3825 6165 3825 6435 2250 6435 2250 6165 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2250 6435 3825 6435 3825 6885 2250 6885 2250 6435 -6 4 0 0 50 0 16 10 0.0000 4 120 570 2340 6615 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1350 2340 6795 PnlGnuCapDC.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 1035 2520 6075 PnlGnuCapDC\001 -6 6 450 7155 2025 8145 6 450 7155 2025 8145 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 7695 2025 7695 2025 8145 450 8145 450 7695 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 7425 2025 7425 2025 7695 450 7695 450 7425 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 7155 2025 7155 2025 7425 450 7425 450 7155 -6 4 0 0 50 0 16 10 0.0000 4 120 570 540 7875 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1335 540 8055 PnlGnuCapAC.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 1020 720 7335 PnlGnuCapAC\001 -6 6 450 8415 2025 9405 6 450 8415 2025 9405 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 8955 2025 8955 2025 9405 450 9405 450 8955 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 8685 2025 8685 2025 8955 450 8955 450 8685 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 8415 2025 8415 2025 8685 450 8685 450 8415 -6 4 0 0 50 0 16 10 0.0000 4 120 570 540 9135 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1320 540 9315 PnlGnuCapFO.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 1005 720 8595 PnlGnuCapFO\001 -6 6 2250 7155 3825 8145 6 2250 7155 3825 8145 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2250 7155 3825 7155 3825 7425 2250 7425 2250 7155 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2250 7425 3825 7425 3825 7695 2250 7695 2250 7425 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2250 7695 3825 7695 3825 8145 2250 8145 2250 7695 -6 4 0 0 50 0 16 10 0.0000 4 120 570 2340 7875 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1290 2340 8055 PnlGnuCapTR.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 975 2520 7335 PnlGnuCapTR\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1215 6885 1215 7155 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1215 8145 1215 8415 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3015 6885 3015 7155 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 3015 5670 3015 5895 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 3 1215 5895 1215 5670 3645 5670 -6 6 4275 5670 7650 8145 6 4275 5895 5850 6885 6 4275 5895 5850 6885 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4275 5895 5850 5895 5850 6165 4275 6165 4275 5895 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4275 6165 5850 6165 5850 6435 4275 6435 4275 6165 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4275 6435 5850 6435 5850 6885 4275 6885 4275 6435 -6 4 0 0 50 0 16 10 0.0000 4 120 570 4365 6615 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1365 4365 6795 PnlNgSpiceDC.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 1050 4545 6075 PnlNgSpiceDC\001 -6 6 4275 7155 5850 8145 6 4275 7155 5850 8145 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4275 7155 5850 7155 5850 7425 4275 7425 4275 7155 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4275 7425 5850 7425 5850 7695 4275 7695 4275 7425 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4275 7695 5850 7695 5850 8145 4275 8145 4275 7695 -6 4 0 0 50 0 16 10 0.0000 4 120 570 4365 7875 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1305 4365 8055 PnlNgSpiceTR.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 990 4545 7335 PnlNgSpiceTR\001 -6 6 6075 5895 7650 6885 6 6075 5895 7650 6885 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 6075 6435 7650 6435 7650 6885 6075 6885 6075 6435 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 6075 6165 7650 6165 7650 6435 6075 6435 6075 6165 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 6075 5895 7650 5895 7650 6165 6075 6165 6075 5895 -6 4 0 0 50 0 16 10 0.0000 4 120 570 6165 6615 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1350 6165 6795 PnlNgSpiceAC.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 1035 6345 6075 PnlNgSpiceAC\001 -6 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 3 6840 5895 6840 5670 4410 5670 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 5040 5670 5040 5895 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 5040 6885 5040 7155 -6 6 5175 4230 6570 5220 6 5175 4230 6570 5220 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5175 4770 6570 4770 6570 5220 5175 5220 5175 4770 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5175 4500 6570 4500 6570 4770 5175 4770 5175 4500 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5175 4230 6570 4230 6570 4500 5175 4500 5175 4230 -6 4 0 0 50 0 16 10 0.0000 4 120 570 5265 4950 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1185 5265 5130 NbkNgSpice.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 870 5400 4410 NbkNgSpice\001 -6 6 1215 1125 2610 5670 6 1215 4230 2610 5220 6 1215 4230 2610 5220 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1215 4770 2610 4770 2610 5220 1215 5220 1215 4770 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1215 4500 2610 4500 2610 4770 1215 4770 1215 4500 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1215 4230 2610 4230 2610 4500 1215 4500 1215 4230 -6 4 0 0 50 0 16 10 0.0000 4 120 570 1305 4950 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1170 1305 5130 NbkGnuCap.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 855 1440 4410 NbkGnuCap\001 -6 6 1215 1125 2610 4005 6 1305 1125 2565 2115 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1305 1125 2565 1125 2565 1395 1305 1395 1305 1125 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1305 1395 2565 1395 2565 1665 1305 1665 1305 1395 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1305 1665 2565 1665 2565 2115 1305 2115 1305 1665 4 0 0 50 0 16 10 0.0000 4 120 570 1395 1845 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 1395 2025 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 900 1485 1305 wxNotebook\001 -6 6 1800 2115 2070 2565 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 1935 2565 1935 2340 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 1935 2115 2070 2340 1800 2340 1935 2115 -6 6 1215 2565 2610 3555 6 1215 2565 2610 3555 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1215 3105 2610 3105 2610 3555 1215 3555 1215 3105 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1215 2835 2610 2835 2610 3105 1215 3105 1215 2835 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1215 2565 2610 2565 2610 2835 1215 2835 1215 2565 -6 4 0 0 50 0 16 10 0.0000 4 120 570 1305 3285 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1245 1305 3465 NbkSimrBase.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 930 1440 2745 NbkSimrBase\001 -6 6 1800 3555 2070 4005 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 1935 4005 1935 3780 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 1935 3555 2070 3780 1800 3780 1935 3555 -6 -6 2 3 0 1 0 7 50 0 -1 0.000 0 0 0 0 0 5 2070 5355 1935 5220 1800 5355 1935 5490 2070 5355 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1935 5490 1935 5670 -6 6 3375 2790 4635 3780 6 3375 2790 4635 3780 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3375 2790 4635 2790 4635 3060 3375 3060 3375 2790 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3375 3060 4635 3060 4635 3330 3375 3330 3375 3060 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3375 3330 4635 3330 4635 3780 3375 3780 3375 3330 -6 4 0 0 50 0 16 10 0.0000 4 120 570 3465 3510 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 3465 3690 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 585 3690 2970 wxPanel\001 -6 6 3870 3780 4140 4230 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 4005 4230 4005 4005 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 4005 3780 4140 4005 3870 4005 4005 3780 -6 2 3 0 1 0 7 50 0 -1 0.000 0 0 0 0 0 5 6030 5355 5895 5220 5760 5355 5895 5490 6030 5355 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 5895 5490 5895 5670 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 1935 4230 1935 4005 2970 4005 2970 2430 5895 2430 5895 4230 -6 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 0 0 8100 0 8100 9855 0 9855 0 0 4 0 0 50 0 16 20 0.0000 4 315 5640 1125 720 Analysis Class Hierarchy Object Model\001 gspiceui-1.0.00+dfsg/fig/OM-Process.fig0000644000000000000000000001063111412210414016167 0ustar rootroot#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A 100.00 Single -2 1200 2 6 990 1125 5715 6885 6 990 4230 2430 5220 6 990 4230 2430 5220 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 990 4770 2430 4770 2430 5220 990 5220 990 4770 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 990 4500 2430 4500 2430 4770 990 4770 990 4500 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 990 4230 2430 4230 2430 4500 990 4500 990 4230 -6 4 0 0 50 0 16 10 0.0000 4 120 570 1080 4950 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1185 1080 5130 PrcGNetList.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 870 1215 4410 PrcGNetList\001 -6 6 2700 4230 4185 5220 6 2700 4230 4185 5220 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2700 4770 4185 4770 4185 5220 2700 5220 2700 4770 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2700 4500 4185 4500 4185 4770 2700 4770 2700 4500 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2700 4230 4185 4230 4185 4500 2700 4500 2700 4230 -6 4 0 0 50 0 16 10 0.0000 4 120 570 2790 4950 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1200 2790 5130 PrcSimrBase.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 885 2925 4410 PrcSimrBase\001 -6 6 3330 5220 3600 5670 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 3465 5670 3465 5445 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 3465 5220 3600 5445 3330 5445 3465 5220 -6 6 3285 2115 3555 2565 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 3420 2565 3420 2340 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 3420 2115 3555 2340 3285 2340 3420 2115 -6 6 2835 2565 4005 3555 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2835 3105 4005 3105 4005 3555 2835 3555 2835 3105 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2835 2835 4005 2835 4005 3105 2835 3105 2835 2835 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2835 2565 4005 2565 4005 2835 2835 2835 2835 2565 4 0 0 50 0 16 10 0.0000 4 120 570 2925 3285 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 885 2925 3465 PrcBase.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 570 3060 2745 PrcBase\001 -6 6 2790 1125 4050 2115 6 2790 1125 4050 2115 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2790 1665 4050 1665 4050 2115 2790 2115 2790 1665 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2790 1395 4050 1395 4050 1665 2790 1665 2790 1395 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2790 1125 4050 1125 4050 1395 2790 1395 2790 1125 -6 4 0 0 50 0 16 10 0.0000 4 120 570 2880 1845 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 2880 2025 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 765 3060 1305 wxProcess\001 -6 6 3285 3555 3555 4230 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 3420 4230 3420 3780 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 3420 3555 3555 3780 3285 3780 3420 3555 -6 6 4455 4230 5715 5220 6 4455 4230 5715 5220 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4455 4770 5715 4770 5715 5220 4455 5220 4455 4770 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4455 4500 5715 4500 5715 4770 4455 4770 4455 4500 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4455 4230 5715 4230 5715 4500 4455 4500 4455 4230 -6 4 0 0 50 0 16 10 0.0000 4 120 570 4545 4950 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1035 4545 5130 PrcPlotter.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 720 4680 4410 PrcPlotter\001 -6 6 1935 5670 5040 6885 6 3600 5895 5040 6885 6 3600 5895 5040 6885 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3600 5895 5040 5895 5040 6165 3600 6165 3600 5895 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3600 6165 5040 6165 5040 6435 3600 6435 3600 6165 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3600 6435 5040 6435 5040 6885 3600 6885 3600 6435 -6 4 0 0 50 0 16 10 0.0000 4 120 570 3694 6615 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1140 3694 6795 PrcNgSpice.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 825 3881 6075 PrcNgSpice\001 -6 6 1935 5895 3330 6885 6 1935 5895 3330 6885 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1935 5895 3330 5895 3330 6165 1935 6165 1935 5895 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1935 6165 3330 6165 3330 6435 1935 6435 1935 6165 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1935 6435 3330 6435 3330 6885 1935 6885 1935 6435 -6 4 0 0 50 0 16 10 0.0000 4 120 570 2025 6615 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1125 2025 6795 PrcGnuCap.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 810 2205 6075 PrcGnuCap\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 2655 5895 2655 5670 4320 5670 2 1 0 1 0 7 2 -1 -1 0.000 0 0 -1 0 0 2 4320 5670 4320 5895 -6 2 1 0 1 0 7 2 -1 -1 0.000 0 0 -1 0 0 4 1710 4230 1710 4005 5085 4005 5085 4230 -6 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 0 0 6660 0 6660 7335 0 7335 0 0 4 0 0 50 0 16 20 0.0000 4 315 5595 405 720 Process Class Hierarchy Object Model\001 gspiceui-1.0.00+dfsg/fig/OM-PnlValue.fig0000644000000000000000000001217211412210414016301 0ustar rootroot#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A 100.00 Single -2 1200 2 6 945 1125 6075 7200 6 3240 4320 4545 5535 6 3240 4545 4545 5535 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3240 4545 4545 4545 4545 4815 3240 4815 3240 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3240 4815 4545 4815 4545 5085 3240 5085 3240 4815 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3240 5085 4545 5085 4545 5535 3240 5535 3240 5085 4 0 0 50 0 16 10 0.0000 4 120 570 3330 5265 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 3330 5445 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 915 3420 4725 wxStaticText\001 -6 1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 3867 4468 72 72 3795 4468 3939 4468 4 0 0 50 -1 16 12 0.0000 4 135 105 4006 4487 2\001 -6 6 4770 4545 6075 6975 6 4770 4545 6075 5535 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 4545 6075 4545 6075 4815 4770 4815 4770 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 4815 6075 4815 6075 5085 4770 5085 4770 4815 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 5085 6075 5085 6075 5535 4770 5535 4770 5085 4 0 0 50 0 16 10 0.0000 4 120 570 4860 5265 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 4860 5445 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 690 5040 4725 wxChoice\001 -6 6 4770 5985 6075 6975 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 5985 6075 5985 6075 6255 4770 6255 4770 5985 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 6255 6075 6255 6075 6525 4770 6525 4770 6255 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 6525 6075 6525 6075 6975 4770 6975 4770 6525 4 0 0 50 0 16 10 0.0000 4 120 570 4860 6705 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 990 4860 6885 ChoUnits.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 675 5085 6165 ChoUnits\001 -6 6 5265 5535 5535 5985 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 5400 5985 5400 5760 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 5400 5535 5535 5760 5265 5760 5400 5535 -6 -6 6 945 4545 3825 7200 6 945 6210 2250 7200 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 945 6210 2250 6210 2250 6480 945 6480 945 6210 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 945 6480 2250 6480 2250 6750 945 6750 945 6480 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 945 6750 2250 6750 2250 7200 945 7200 945 6750 4 0 0 50 0 16 10 0.0000 4 120 570 1035 6930 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 1035 7110 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 780 1215 6390 wxTextCtrl\001 -6 6 2520 6210 3825 7200 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2520 6210 3825 6210 3825 6480 2520 6480 2520 6210 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2520 6480 3825 6480 3825 6750 2520 6750 2520 6480 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2520 6750 3825 6750 3825 7200 2520 7200 2520 6750 4 0 0 50 0 16 10 0.0000 4 120 570 2610 6930 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 2610 7110 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 150 1005 2655 6390 wxSpinButton\001 -6 6 1710 4545 3015 5535 6 1710 4545 3015 5535 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1710 4545 3015 4545 3015 4815 1710 4815 1710 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1710 4815 3015 4815 3015 5085 1710 5085 1710 4815 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1710 5085 3015 5085 3015 5535 1710 5535 1710 5085 -6 4 0 0 50 0 16 10 0.0000 4 150 900 1800 5445 SpinCtrl.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 570 1800 5265 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 585 2070 4725 SpinCtrl\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 1620 6210 1620 5985 3150 5985 3150 6210 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2385 5805 2385 5985 2 3 0 1 0 7 50 0 -1 0.000 0 0 0 0 0 5 2520 5670 2385 5535 2250 5670 2385 5805 2520 5670 -6 6 3195 2790 4500 4050 6 3195 2790 4500 3780 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3195 2790 4500 2790 4500 3060 3195 3060 3195 2790 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3195 3060 4500 3060 4500 3330 3195 3330 3195 3060 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3195 3330 4500 3330 4500 3780 3195 3780 3195 3330 4 0 0 50 0 16 10 0.0000 4 120 570 3285 3510 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 900 3285 3690 PnlValue.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 585 3510 2970 PnlValue\001 -6 2 3 0 1 0 7 50 0 -1 0.000 0 0 0 0 0 5 4005 3915 3870 3780 3735 3915 3870 4050 4005 3915 -6 6 2475 1125 3780 2565 6 2475 1125 3780 2115 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2475 1125 3780 1125 3780 1395 2475 1395 2475 1125 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2475 1395 3780 1395 3780 1665 2475 1665 2475 1395 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2475 1665 3780 1665 3780 2115 2475 2115 2475 1665 4 0 0 50 0 16 10 0.0000 4 120 570 2565 1845 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 2565 2025 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 585 2790 1305 wxPanel\001 -6 6 2970 2115 3240 2565 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 3105 2565 3105 2340 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 3105 2115 3240 2340 2970 2340 3105 2115 -6 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 2745 4545 2745 4230 5400 4230 5400 4545 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3870 4050 3870 4410 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 2430 4545 2430 2565 3825 2565 3825 2790 -6 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 0 0 6930 0 6930 7650 0 7650 0 0 4 0 0 50 0 16 20 0.0000 4 315 5730 450 720 PnlValue Class Hierarchy Object Model\001 gspiceui-1.0.00+dfsg/fig/OM-FrmMain.fig0000644000000000000000000001633211412210414016106 0ustar rootroot#FIG 3.2 Landscape Center Metric A 100.00 Single -2 1200 2 6 225 900 10485 6750 6 5040 900 6345 3780 6 5580 1890 5850 2340 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 5715 2340 5715 2115 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 5715 1890 5850 2115 5580 2115 5715 1890 -6 6 5580 3330 5850 3780 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 5715 3600 5715 3780 2 3 0 1 0 7 50 0 -1 0.000 0 0 0 0 0 5 5850 3465 5715 3330 5580 3465 5715 3600 5850 3465 -6 6 5040 900 6345 1890 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5040 1440 6345 1440 6345 1890 5040 1890 5040 1440 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5040 1170 6345 1170 6345 1440 5040 1440 5040 1170 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5040 900 6345 900 6345 1170 5040 1170 5040 900 4 0 0 50 0 16 10 0.0000 4 120 570 5130 1620 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 5130 1800 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 120 630 5355 1080 wxFrame\001 -6 6 5040 2340 6345 3330 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5040 2880 6345 2880 6345 3330 5040 3330 5040 2880 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5040 2610 6345 2610 6345 2880 5040 2880 5040 2610 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5040 2340 6345 2340 6345 2610 5040 2610 5040 2340 4 0 0 50 0 16 10 0.0000 4 120 570 5130 3060 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 915 5130 3240 FrmMain.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 600 5400 2520 FrmMain\001 -6 -6 6 6165 3780 7515 5040 6 6165 4050 7515 5040 6 6165 4050 7515 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 6165 4590 7515 4590 7515 5040 6165 5040 6165 4590 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 6165 4320 7515 4320 7515 4590 6165 4590 6165 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 6165 4050 7515 4050 7515 4320 6165 4320 6165 4050 -6 4 0 0 50 0 16 10 0.0000 4 116 552 6252 4770 Refer to\001 4 0 0 50 0 16 10 0.0000 4 145 1205 6252 4950 NbkSimrBase.hpp\001 4 0 0 50 0 16 10 0.0000 4 116 900 6383 4230 NbkSimrBase\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6840 3780 6840 4050 -6 6 4680 3780 5985 5040 6 5265 3780 5625 4050 1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 5354 3974 76 76 5278 3970 5430 3979 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 5355 3780 5355 3960 4 0 0 50 -1 16 12 0.0000 4 135 105 5507 4009 2\001 -6 6 4680 4050 5985 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4680 4050 5985 4050 5985 4320 4680 4320 4680 4050 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4680 4320 5985 4320 5985 4590 4680 4590 4680 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4680 4590 5985 4590 5985 5040 4680 5040 4680 4590 4 0 0 50 0 16 10 0.0000 4 120 570 4770 4770 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 930 4770 4950 wxWidget lib.\001 4 0 0 50 0 16 10 0.0000 4 120 750 4995 4230 wxListBox\001 -6 -6 6 3195 3780 4500 5040 6 3195 4050 4500 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3195 4050 4500 4050 4500 4320 3195 4320 3195 4050 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3195 4320 4500 4320 4500 4590 3195 4590 3195 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3195 4590 4500 4590 4500 5040 3195 5040 3195 4590 4 0 0 50 0 16 10 0.0000 4 120 570 3285 4770 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 930 3285 4950 wxWidget lib.\001 4 0 0 50 0 16 10 0.0000 4 120 900 3420 4230 wxStatusBar\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3870 3780 3870 4050 -6 6 1710 3780 3015 5040 6 1710 4050 3015 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1710 4050 3015 4050 3015 4320 1710 4320 1710 4050 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1710 4320 3015 4320 3015 4590 1710 4590 1710 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 1710 4590 3015 4590 3015 5040 1710 5040 1710 4590 4 0 0 50 0 16 10 0.0000 4 120 570 1800 4770 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 930 1800 4950 wxWidget lib.\001 4 0 0 50 0 16 10 0.0000 4 120 735 2025 4230 wxToolBar\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2385 3780 2385 4050 -6 6 225 3780 1530 5040 6 225 4050 1530 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 225 4050 1530 4050 1530 4320 225 4320 225 4050 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 225 4320 1530 4320 1530 4590 225 4590 225 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 225 4590 1530 4590 1530 5040 225 5040 225 4590 4 0 0 50 0 16 10 0.0000 4 120 570 315 4770 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 930 315 4950 wxWidget lib.\001 4 0 0 50 0 16 10 0.0000 4 120 825 495 4230 wxMenuBar\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 3780 900 4050 -6 6 7650 2340 10485 6750 6 7650 4050 9000 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9000 4050 7695 4050 7695 4320 9000 4320 9000 4050 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9000 4320 7695 4320 7695 4590 9000 4590 9000 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9000 4590 7695 4590 7695 5040 9000 5040 9000 4590 4 2 0 50 0 16 10 6.2832 4 120 570 8280 4770 Refer to\001 4 2 0 50 0 16 10 6.2832 4 150 1005 8685 4950 wxWidgets lib.\001 4 2 0 50 0 16 10 6.2832 4 120 795 8730 4230 NbkTxtCtls\001 -6 6 9135 4050 10485 5040 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 10485 4050 9180 4050 9180 4320 10485 4320 10485 4050 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 10485 4320 9180 4320 9180 4590 10485 4590 10485 4320 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 10485 4590 9180 4590 9180 5040 10485 5040 10485 4590 4 2 0 50 0 16 10 6.2832 4 120 780 10170 4230 wxTextCtrl\001 4 2 0 50 0 16 10 6.2832 4 120 570 9765 4770 Refer to\001 4 2 0 50 0 16 10 6.2832 4 150 1005 10170 4950 wxWidgets lib.\001 -6 6 9720 5040 9990 5490 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 9855 5490 9855 5265 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 9855 5040 9720 5265 9990 5265 9855 5040 -6 6 9180 2340 10485 3330 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9180 2340 10485 2340 10485 2610 9180 2610 9180 2340 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9180 2610 10485 2610 10485 2880 9180 2880 9180 2610 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9180 2880 10485 2880 10485 3330 9180 3330 9180 2880 4 0 0 50 0 16 10 0.0000 4 120 570 9270 3060 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 930 9270 3240 wxWidget lib.\001 4 0 0 50 0 16 10 0.0000 4 120 900 9360 2520 wxNotebook\001 -6 6 9720 3330 9990 3780 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 9855 3780 9855 3555 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 9855 3330 9720 3555 9990 3555 9855 3330 -6 6 7920 5490 9270 6750 6 7920 5760 9270 6750 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9270 5760 7965 5760 7965 6030 9270 6030 9270 5760 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9270 6030 7965 6030 7965 6300 9270 6300 9270 6030 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9270 6300 7965 6300 7965 6750 9270 6750 9270 6300 4 2 0 50 0 16 10 6.2832 4 120 570 8865 5940 TextCtrl\001 4 2 0 50 0 16 10 6.2832 4 120 570 8550 6480 Refer to\001 4 2 0 50 0 16 10 6.2832 4 150 885 8820 6660 TextCtrl.hpp\001 -6 6 8055 5490 8415 5760 1 4 0 1 0 0 50 -1 20 0.000 0 -0.0000 8326 5684 76 76 8402 5680 8250 5689 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8325 5490 8325 5670 4 2 0 50 -1 16 12 6.2832 4 135 105 8173 5719 4\001 -6 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8325 5490 8325 5040 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 9855 5490 8955 5490 8955 5760 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 9855 3780 8640 3780 8640 4050 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8055 3780 8055 4050 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 3780 8055 3780 -6 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 0 0 10755 0 10755 6975 0 6975 0 0 4 0 0 50 0 16 20 0.0000 4 270 5355 2430 540 Main Frame Class Hierarchy Object Model\001 gspiceui-1.0.00+dfsg/fig/OM-gSpiceUI.fig0000644000000000000000000001605511412210414016227 0ustar rootroot#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A 100.00 Single -2 1200 2 6 450 1125 2115 5265 6 450 1125 1755 4005 6 450 1125 1755 2115 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 1125 1755 1125 1755 1395 450 1395 450 1125 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 1395 1755 1395 1755 1665 450 1665 450 1395 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 1665 1755 1665 1755 2115 450 2115 450 1665 4 0 0 50 0 16 10 0.0000 4 120 570 540 1845 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 540 2025 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 150 1020 585 1305 wxArrayString\001 -6 6 990 2115 1260 2565 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 1125 2565 1125 2340 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 1125 2115 1260 2340 990 2340 1125 2115 -6 6 450 2565 1755 3555 6 450 2565 1755 3555 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 2565 1755 2565 1755 2835 450 2835 450 2565 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 2835 1755 2835 1755 3105 450 3105 450 2835 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 450 3105 1755 3105 1755 3555 450 3555 450 3105 -6 4 0 0 50 0 16 10 0.0000 4 150 825 540 3465 NetList.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 570 540 3285 Refer to\001 4 0 0 50 0 16 10 0.0000 4 120 510 810 2745 NetList\001 -6 6 990 3555 1260 4005 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 1125 4005 1125 3780 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 1125 3555 1260 3780 990 3780 1125 3555 -6 -6 6 810 4005 2115 5265 6 810 4275 2115 5265 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 810 4275 2115 4275 2115 4545 810 4545 810 4275 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 810 4545 2115 4545 2115 4815 810 4815 810 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 810 4815 2115 4815 2115 5265 810 5265 810 4815 4 0 0 50 0 16 10 0.0000 4 120 570 900 4995 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1020 900 5175 Simulation.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 705 1080 4455 Simulation\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1800 4005 1800 4275 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1125 4005 1125 4275 -6 -6 6 3960 4005 5400 5265 6 3960 4275 5400 5265 6 3960 4275 5400 5265 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3960 4815 5400 4815 5400 5265 3960 5265 3960 4815 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3960 4545 5400 4545 5400 4815 3960 4815 3960 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 3960 4275 5400 4275 5400 4545 3960 4545 3960 4275 -6 4 0 0 50 0 16 10 0.0000 4 120 570 4050 4995 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1185 4050 5175 PrcGNetList.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 870 4185 4455 PrcGNetList\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4725 4005 4725 4275 -6 6 7380 4005 8775 5265 6 7380 4275 8775 5265 6 7380 4275 8775 5265 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 7380 4275 8775 4275 8775 4545 7380 4545 7380 4275 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 7380 4545 8775 4545 8775 4815 7380 4815 7380 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 7380 4815 8775 4815 8775 5265 7380 5265 7380 4815 -6 4 0 0 50 0 16 10 0.0000 4 120 570 7470 4995 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1125 7470 5175 PrcGnuCap.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 810 7650 4455 PrcGnuCap\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8055 4005 8055 4275 -6 6 9045 4005 10305 5265 6 9045 4275 10305 5265 6 9045 4275 10305 5265 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9045 4815 10305 4815 10305 5265 9045 5265 9045 4815 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9045 4545 10305 4545 10305 4815 9045 4815 9045 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 9045 4275 10305 4275 10305 4545 9045 4545 9045 4275 -6 4 0 0 50 0 16 10 0.0000 4 120 570 9135 4995 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1035 9135 5175 PrcPlotter.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 720 9270 4455 PrcPlotter\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 9675 4005 9675 4275 -6 6 2385 4005 3690 5265 6 2385 4275 3690 5265 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2385 4275 3690 4275 3690 4545 2385 4545 2385 4275 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2385 4545 3690 4545 3690 4815 2385 4815 2385 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 2385 4815 3690 4815 3690 5265 2385 5265 2385 4815 4 0 0 50 0 16 10 0.0000 4 120 570 2475 4995 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 915 2475 5175 FrmMain.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 600 2700 4455 FrmMain\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3060 4005 3060 4275 -6 6 5670 4005 7110 5265 6 5670 4275 7110 5265 6 5670 4275 7110 5265 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5670 4275 7110 4275 7110 4545 5670 4545 5670 4275 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5670 4545 7110 4545 7110 4815 5670 4815 5670 4545 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 5670 4815 7110 4815 7110 5265 5670 5265 5670 4815 -6 4 0 0 50 0 16 10 0.0000 4 120 570 5764 4995 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1140 5764 5175 PrcNgSpice.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 825 5951 4455 PrcNgSpice\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6390 4005 6390 4275 -6 6 4770 1125 6300 4005 6 4770 2565 6300 3555 6 4770 2565 6300 3555 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 3105 6300 3105 6300 3555 4770 3555 4770 3105 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 2835 6300 2835 6300 3105 4770 3105 4770 2835 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4770 2565 6300 2565 6300 2835 4770 2835 4770 2565 -6 4 0 0 50 0 16 10 0.0000 4 150 1260 4860 3465 AppGSpiceUI.hpp\001 4 0 0 50 0 16 10 0.0000 4 150 945 4905 2745 AppGSpiceUI\001 4 0 0 50 0 16 10 0.0000 4 120 570 4860 3285 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 480 4860 3015 main( )\001 -6 6 4860 1125 6165 2115 6 4860 1125 6165 2115 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4860 1665 6165 1665 6165 2115 4860 2115 4860 1665 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4860 1395 6165 1395 6165 1665 4860 1665 4860 1395 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 4860 1125 6165 1125 6165 1395 4860 1395 4860 1125 -6 4 0 0 50 0 16 10 0.0000 4 120 570 4950 1845 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1005 4950 2025 wxWidgets lib.\001 4 0 0 50 0 16 10 0.0000 4 150 495 5265 1305 wxApp\001 -6 6 5400 2115 5670 2565 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 5535 2565 5535 2340 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 4 5535 2115 5670 2340 5400 2340 5535 2115 -6 6 5400 3555 5670 4005 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 5535 3825 5535 4005 2 3 0 1 0 7 50 0 -1 0.000 0 0 0 0 0 5 5670 3690 5535 3555 5400 3690 5535 3825 5670 3690 -6 -6 6 7695 2565 9045 3555 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 7695 2565 9045 2565 9045 2835 7695 2835 7695 2565 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 7695 2835 9045 2835 9045 3105 7695 3105 7695 2835 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 7695 3105 9045 3105 9045 3555 7695 3555 7695 3105 4 0 0 50 0 16 10 0.0000 4 120 570 7785 3285 Refer to\001 4 0 0 50 0 16 10 0.0000 4 150 1170 7785 3465 CmdLinePrc.hpp\001 4 0 0 50 0 16 10 0.0000 4 120 855 7920 2745 CmdLinePrc\001 -6 2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 0 0 10800 0 10800 5715 0 5715 0 0 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1800 4005 9675 4005 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2 1 1 1.00 90.00 120.00 1 1 1.00 90.00 120.00 6300 2970 7695 2970 4 0 0 50 0 16 20 0.0000 4 315 6030 2520 675 GNU Spice GUI Application Object Model\001 gspiceui-1.0.00+dfsg/ChangeLog0000644000000000000000000010102411640711621014564 0ustar rootroot ChangeLog ----------- Start Date : 12/08/2004 Last Update : 29/09/2011 ------------------------------------------------------------------------------- gSpiceUI - A Graphical User Interface (GUI) to various freely available Spice electronic circuit simulators. Author : Mike Waters Email : m.waters@bom.gov.au ------------------------------------------------------------------------------- 2011-09-27 : M.Waters * Released version 1.0.00. * When gSpiceUI is installed example schematic files and library files are now included (this was always intended but overlooked). * gSpiceUI has been successfully compiled against the wxWidgets library version 2.9.2 (with wxWidgets 2.8 compatibility enabled). This was requested by a Mac OSX user Jerry J. since "it works better with the Cocoa framework". * BugFix : The temporary file management scheme was incomplete. If more than one circuit descriptions were loaded in a single session temporary files could be created but not deleted. * Modifications to the functions in utility/StrUtils.cpp. Signal source names are now sorted so that the most used component types appear at the top of the list. * Modifications to the functions in utility/StrUtils.cpp. The more interesting node and component names now tend to be placed at the top of the test probe list boxes and the remaining names are sorted more sensibly. * In the classes NetList, SimnBase, SimnGunCap and SimnNgSpice change all Extract*( ) function names to Load*( ). * BugFix : In version v0.9.99 a reload operation would close gschem and gwave or gaw. (This was unintended behaviour.) * In class SpinCtrl hard-coded a spin button repeat period of 80 msec. This will be user configurable in the future. * Increased the maximum number of lines which can be displayed in any text control to 1,000,000 lines and the default to 10,000. (I don't know if wxTextCtrl can cope with this but someone will try it sooner or later and we'll find out). * Objects inheriting from PrcBase (which itself inherits from wxProcess) created input and output streams but didn't deleted them. Eventually all available file descriptors were used up and gSpiceUI could no longer launch new processes. This long standing bug has been resolved (I think?) thanks to a contribution made by Jarno H. * Added a LM555 model file and demo. schematic. * In the classes PrcGWave and PrcGaw removed the functions bFormatLine( ) and bFormatField( ) because these operations are already performed by PrcGnuCap and PrcNgSpice. * Over-haul of the ChoUnits class. * In the PnlValue::bSetValue( ) methods remove unnecessary complexity by eliminating the bNoUnits argument; it's already implemented by the PnlValue::m_bUseUnits attribute. * BugFix : If a node label didn't start with a digit CmdGnuCapPR::Parse( ) categorized it as a component label. * BugFix : The src/Makefile target "deps" was not correctly defined. Most of the source files where being overlooked. * In HelpTasks class removed the status bar from the HTML window, it wasn't used. * Disable the Stop tool and Stop menu option when no simulation is actually running. * In the HelpTasks class added a tool to the tool bar for moving forward in the history database. * In the HelpTasks class implemented wxFrame close tool for HTML window. * Implemented a new command-line option -d which enables debug mode. This causes console spew to be generated on standard error. * At startup error messages are held over until the the main frame of the GUI has been fully displayed. * In src/Makefile added a new variable $DESTDIR which may be used to specify the install location at the request of Declan. * BugFix : The src/Makefile install mechanism failed if the target bin/ directory didn't already exist. * In the classes PnlValue, SpinCtrl and ChoUnits the method bClear( ) is used to set defaults. Added a function bSetDefaults( ) to set default values and changed the bClear( ) methods to just clear the object attributes. * Replace all references to wxWindows with wxWidgets. * Minor updates to Install documentation. * BugFix : The files utility/iStrCmp.h and utility/iStrCmp.c actually contain C++ code so they have been renamed to utility/iStrCmp.hpp and utility/iStrCmp.cpp respectively. Also removed instructions for compiling C code from Makefile. * In the class ConvertType all function for processing double float's take only double's of long's as arguments. (This is to do with compile time problems under OSX.) * BugFix : If gSpiceUI has gschem open and a reload operation is executed, the gSchem process is no longer closed. * Added a mechanism to sch/Makefile to convert all example schematic files included with gSpiceUI to netlist files using gnetlist. This provides some level of validation of schematic files, although it doesn't guarantee that they will work. * Updates to the HTML documentation. * Minor updates to man page. * Various minor modifications and bug fixes. 2010-04-19 : M.Waters * Released version 0.9.99 Alpha. * BugFix : The Component class wasn't recognizing sub-circuits, transmission-lines or logic devices correctly. * Minor mods. so that all test utilities compile. * Have defined the following types in TypeDefs.hpp : ulong, uint and uchar. * It has been reported that "gSpiceUI opens new FIFOs every time gWave, etc. are started but never closes them. In a long session the user eventually runs out of file handles". In PrcBase::bLogOutput( ) instead of repeatedly getting the input and error streams, get input stream pointers once. I've not personally encountered this bug but this might fix it. * The sweep sources can now be synchronized. If a sweep source is selected in one analysis page, where possible the same source will appear in other analysis pages. This feature may be enabled or disabled via the Preferences dialogue. * In the class ConvertType replaced all calls to pow10f( ) with calls to pow( ) owing to problems compiling the code on OSX. * Simplified FrmMain::OnOpen( ), FrmMain::OnImport( ) and FrmMain::OnReload( ) so that most of the work is done by the class FileTasks. * Simplified FileTasks::bReload( ) so that it calls FileTasks::bOpen( ) and FileTasks::bImport( ) instead of duplicating code. * In the class PrcGNetList remove the functions that aren't really required : bSetGNetList( ), rofnGetGNetList( ), szGetGuileProcCnt( ) and szGetSchemFileCnt( ). * BugFix : Sort out bugs in the mechanism for loading schematic file/s via the command line. * BugFix : Sort out bugs in the mechanism for loading a netlist file via the command line. * Added m_iExitCode attribute to PrcBase class to contain the exit code returned when the process was last run. * Re-organise contents of lib/ directory. * Implement function CmdLinePcr::bCheckFiles( ) for basic file name testing. * Implement function CmdLinePcr::Print( ) for debugging. * BugFix : If errors are encountered by gnetlist the Console tab is displayed instead of the NetList tab. * BugFix : In dialogs pressing the Clear or Defaults buttons can now reversed by pressing the Cancel button. * The function PnlValue::bSetValue( wxString, bool ) can now set the units with a value of 0.0 eg. "0.0msec". * BugFix : In FileTasks::InitNetLstFile( ) simulation data was transferred from FrmMain::m_oSimnGcp to FrmMain::m_oSimnNgs when it had already been transferred from FrmMain::m_oSimnNgs to FrmMain::m_oSimnGcp. * BugFix : In CpntNgIndSrc::bParseValue( ) and CpntNgIndSrc::bFormatValue( ) the pulse source function was incorrectly formatted; the pulse width appeared ahead of the fall time. * Super-conductor junction components are now recognized. * The class name AppGSpiceUI has been changed to App_gSpiceUI. * BugFix : LC_NUMERIC locale problem reported by Werner H. and Viktor N. Have applied a patch provide by Werner : moved the locale call from the AppGSpiceUI constructor to AppGSpiceUI::OnInit( ). * Documentation updates. * Various minor modifications and bug fixes. 2009-09-14 : M.Waters * Released version 0.9.98 Alpha. * BugFix : In the /Makefile the "install" target had the files ReadMe and Install in upper-case which caused the install to fail. Bug found by Werner H. * BugFix : For NG-Spice simulations columns of results where lost if more than three parameters where derived. Class CmdNgSpiceOPT can now set an appropriate page width for the number of derived parameters. * Updates to the text files : Authors, ChangeLog, Install, ReadMe and ToDo. * Add a new command line option "-c" to partially rebuild/clean the configuration file ie. ~/.gspiceui.conf. * BugFix : The command line processor was not functioning properly when the option "-g" was specified without an argument. * Some updates to the installation instructions (ie. Install). * BugFix : Gaw was used regardless of the setting in the Preferences dialog. * In /src/Makefile the debug flag was set by default. This meant that the resulting binary was much larger than necessary. The debug flag is now clear by default. * There is a new parameter in the preferences dialog which allows the results precision to be specified; a lower value means the raw data is easier to read but a higher value provides for greater resolution. * Brought back the component names in the NG-Spice results column labels. * Much of the implementation of the method bMakeArgLst( ) in classes PrcGnuCap and PrcNgSpice has been moved to the base class PrcSimrBase. * The gSchem ".sym" files in the /lib/ directory where mistakenly omitted from the last release. * Bug fixes. 2009-09-11 : M.Waters * Released version 0.9.97 Alpha. * Data is now transferred from a NG-Spice simulation object to a GNU-Cap object (and visa-versa) by design rather than happenstance. * DlgPrefs is no longer an attribute of FrmMain but is created when needed. * Tidy up PrcGNetList class source files. * Some changes to the installation instructions for wxWidgets (ie. Install). * Remove the restriction that the transient analyse must have a signal source. * Modified the class DlgGcpCfgGEN so that it is derived from wxDialog only and not CmdGnuCapGEN as well. * Modified the class DlgGcpCfgOPT so that it is derived from wxDialog only and not CmdGnuCapOPT as well. * Modified the class DlgNgsCfgSrc so that it is derived from wxDialog only and not CpntNgsIndSrc as well. * Modified the class DlgNgsCfgOPT so that it is derived from wxDialog only and not CmdNgSpiceOPT as well. * BugFix : The temporary file management strategy indicator wasn't being stored in the configuration file. Changes to FileTasks class and DlgPrefs class. * Modified the Component class to handle TABs as field separators in component definitions. * Updates to the About dialog. * Updates to the command line usage message. * Update the "tar" target in the project root Makefile. * Modified DlgNgsCfgOPT so that it inherits CmdNgSpiceOPT instead of having an instance as an attribute. * Modified DlgNgsCfgSrc so that it inherits CpntNgsIndSrc instead of having an instance as an attribute. * Updates to the class ConvertType. Can now specify a resolution for conversions from floats to strings. * Updates to the About dialogue contents particularly the licence details. * Major re-think and overhaul of the Simulation class to make it easier to understand and maintain. It's been replaced with the structures SimnBase, SimnNgSpice and SimnGnuCap. * Many classes have been re-defined as structures so that most of they're attributes have public access. This increases they're easy of use since attributes can be accessed directly rather than via inline function calls. (It would be nice if C++ had a mechanism for defining attributes as read-only to the outside world.) * Created a new simulation structure SimnBase from which the new structures SimnNgSpice and SimnGnuCap inherit. These structure replace the single Simulation class which had become far too complicated. * Simplify NetList class. * Updated Component class, changed type to structure, it now permits public access to most attributes. * Added units of pico-seconds (psec) to the units of time in class ChoUnits. * Transient analyses may now be run without having to specify a sweep source. * Integrated the command classes into the simulation engine process classes. * Created new command classes CmdGnuCapOP, CmdGnuCapTR and CmdGnuCapFO for parsing and formatting GNU-Cap OP, Transient and Fourier commands. * Created new command classes CmdGnuCapPR and CmdGnuCapGEN for parsing and formatting GNU-Cap Print and Generator commands. * Created new command classes CmdNgSpicePR for parsing and formatting NG-Spice Print commands. * Created a new structure CpntNgsIndSrc which inherits from the Component structure. It processes NG-Spice independent voltage or current source definition commands. * And others things that I've forgotten. 2008-02-29 : M.Waters * Released version 0.9.65 Alpha. * A schematic editor (ie. gSchem) can now be envoked from within gSpiceUI via the menuing system or the tool bar. * Implemented test utilities in all command classes to facilitate debugging. * Create new command classes CmdGnuCapDC and CmdGnuCapAC for parsing and formatting GNU-Cap DC and AC commands. * Created new command classes CmdNgSpiceAC and CmdNgSpiceTR for parsing and formatting NG-Spice AC and Transient analysis commands. * Modify class PrcNgSpice to use the command classes ie. CmdNgSpiceDC, etc. * Created a new class PrcGaw to interface to the waveform viewer Gaw (which is a rewrite of gWave). * One of two waveform viewers may now be specified by the user via the command line or the preferences dialog ie. gWave or Gaw. This preference is also stored in the configuration file and so need only be specified once. * Bug fixes. 2007-10-25 : M.Waters * Released version 0.9.55 Alpha. * Various improvements to src/Makefile. * Changed the name of the Options menu to Settings to prevent confusion with the SPICE OPTIONS command. * Fixed a bug in the "make deps" process. * Fixed a bug where a reload operation was clearing the units of the stop value in the NG-Spice DC analysis. Also fixed many other bugs associated the reload operation in all other analysis panels. * Minor overhaul of the class PnlNgSpiceDC. Will do the same to all other analysis panel classes in the fullness of time. * Fixed bug 1759886 "make install: error if ../share/man/man1 is missing" submitted by Werner H. * Added the file TypeDefs.hpp to contain mainly the enumerated type definitions used throughout gSpiceUI. * First cut at controlling the fonts used by gSpiceUI. * Added a Clear button to the GNU-Cap Generator Setup dialog and the NG-Spice Signal Source Setup dialog. * A new class CmdNgSpiceDC has been introduced for parsing and formatting NG-Spice DC analysis commands. Ultimately all analysis commands will be processed using this mechanism. * The recommended version of the wxWidgets library is still v2.8.x but work has been done to improve support for v2.6.x. It seems that wxWidgets v2.8.x has not yet been sufficiently widely adopted to make it a requirement. * The src/Makefile has been modified so that the version of the wxWidgets library to compile against may be specified via the make command line or within the Makefile itself. * An upper limit of 9 characters has now been imposed on the number of characters which may be entered into a SpinCtrl object. * Fixed several bugs associated with the SpinCtrl class. * Bug fixes. 2007-07-05 : M.Waters * Released version 0.9.33 Alpha. * Added a sinusoid function to the NG-Spice signal source configuration dialog. * Tidy up of the Makefiles. * The title line/s in user generated circuit description files are now preserved in the simulation file generated by gSpiceUI. Requested by Andres M. * Fixed a bugs in the GNU-Cap DC and AC command parsers causing them to break when the start and stop sweep values where equal. * Adjustments to the size and position of display components. * For GNU-Cap the option BASIC has been appended to all analysis lines to suppress the use of alpha abbreviations instead of an exponent eg. 3.1u now becomes 3.1E-6. Requested by Andres M. * Introduced an .OPTIONS button on each analysis panel and removed the .OPTIONS option in the Options menu. * Added tooltips to the NG-Spice source component setup dialog and the GNU-Cap generator component dialog. * Improvements to src/Makefile. * NG-Spice negative node values in .PRINT statements were not processed correctly. Eg. PRINT TRAN V(0,1) V(0,2) (2 parameters) is interpreted as PRINT TRAN (-V(1)-V(2)) (1 parameter); I've found through experiment that PRINT TRAN 0-V(1) 0-V(2) results in the correct intepretation. Fixed. * Fixed warnings generated by GCC v4.1.1. * Added tool tips to the OPTIONS line setup dialogs. * gSpiceUI can now be compiled against wxWidgets v2.8.4. * Addition of a man page. Minor updates to the documentation. * The SpinCtrl control is now right justified. * Implement the application preferences dialog. * Some modifications to the PnlValue class. * The main frame's system close button now works. * Automated the creation of dependencies. Added target "deps" to the Makefile in the C++ sources Makefile. This target creates the file Makefile.deps which contains a list of dependencies which are included in the Makefile. * Many bug fixes. 2006-10-26 : M.Waters * Released version 0.8.90 Alpha. * Some modifications to the PnlValue class. * Fixed some subtle bugs in the SpinCtrl class. * The SpinCtrl class can now display positive floats with an exponent. * Added NG-Spice OPTIONS line setup dialog. * Added GNU-Cap OPTIONS command setup dialog. * Added selection to Options menu to access OPTIONS setup dialog. * All include file paths are now from the source directory. Allows reuse of file names. * Added TeraHz, kV and kA to the class ChoUnits. * If during installation $(INSTALLDIR)/bin doesn't exist it is created. * Bug fixes. 2006-05-16 : M.Waters * Released version 0.8.55 Alpha. * Fixed fault where source component requested for NG-Spice temperature sweep. * Fixed some faults in the parsing of floating point numbers into mantissa and exponent (ConvertType.cpp). * The last line of the console output was missing if it didn't end in a new line character. * The output from gNetList is now searched for errors and the user notified if any are found. * The application initialization process has been overhauled. It's still not perfect but is an improvement. * A progress dialog is displayed while the simulation engine is being changed. * The source and generator dialogs now do some validity checks before accepting the user settings. * Bit rot in PrcBase::Print( ) meant that the text controls weren't always being loaded properly. * The Simulation text control wasn't being updated when a simulation was run. * Bug fixes. 2006-02-17 : M.Waters * Released version 0.8.36 Alpha. * The rogue log file going by the name prcbase.log which some times appeared has been tracked down to the class PrcGNetList. The log file name wasn't being set properly and sometimes wasn't deleted when no longer needed. Both of these problems have been rectified. * The technique used to clear the save file in the function PrcSimrBase::bSaveOutput( ) has been much improved. Large simulations should now run noticably faster. * The function bExec( ) has been moved from the classes PrcGnuCap and PrcNgSpice to the class PrcSimrBase. * Cleaned up the code that formats NG-Spice results (PrcNgSpice.cpp). * Cleaned up the code that formats GNU-Cap results (PrcGnuCap.cpp). * A new panel has been added to the GNU-Cap notebook for Fourier analysis. * Options for displaying the GNU-Cap and NG-Spice manuals have been dropped from the Help menu. * An alternative installation directory may now be specified via the base Makefile. Refer to text file INSTALL for a complete description. * Include file wx/image.h added to HelpTasks.hpp for MAC platforms as a result of feedback provided by Anthony W. * Crash caused by an attempt to access the first character in an empty string fixed as a result of feedback from Anthony W. - functions modified were: PnlNgSpiceDC::InitSwpUnts( ) and PnlGnuCapDC::InitSwpUnts( ). * Crash caused by attempt to set the value of a non-existent display object fixed as a result of feedback from Anthony W. - function modified was: PnlGnuCapFO::CreateOutputs( ). * The tool bar help icon was found to be malformed and has been fixed as a result of feedback from Anthony W. - file modified was: icons/help.xpm * Additions to the documentation. * Bug fixes. 2005-11-29 : M.Waters * Released version 0.8.08 Alpha. * Documentation is now included in the install process. * Added a tool to the tool bar linking with the gSpiceUI manual. * The gSpiceUI manual can now be accessed from the Help menu. * The application main frame close box has been disabled because when used configuration data isn't recorded. I will fix this at some later date. * Cleaned up the code run when the simulation engine selection changes. * Built using the infamous gcc version 4.0.1 compiler. One warning produced which has been fixed. * Bug fixes. 2005-11-16 : M.Waters * Released version 0.7.93 Alpha. * If a net list or schematic is open on exit that same file will be opened next time gspiceui is started. * The open net list and import schematic dialogs now remember the last directory accessed (these values are stored in the configuration file). * Added two minor mods. for clean compilation under Sun Solaris. * A alternative configuration file may now be specified via the command line using the -r option. * The relationship between the class AppGSpiceUI, FrmMain and CmdLinePcr has been simplified. Should prevent compiler errors associated with circular includes. * Continued implementation of the configuration file mechanism. * The development status has reverted to Alpha since fundamental structural changes are still being made and are still required. * The command line option "-t" which sets the temporary file management strategy hadn't been implemented, it has now. * The command line option "-d" which sets the number of lines to display in text controls has been dropped. * The main frame is now resizable. * Changed the layout of the main frame to make better use of the available space. 2005-09-03 : M.Waters * Released version 0.7.80 Alpha. * Rectified some bugs associated with the status bar. It now works correctly. * Commenced implementation of a configuration file mechanism. The configuration file name is ".gspiceui.conf" and is placed in the user's home directory. * The position of the main application frame is now recorded in the configuration file. At startup gSpiceUI attempts to position itself where it was last placed. * In class FrmMain the function OnRun( ) has been tidied up. * If required a .WIDTH card is now added to NG-Spice decks so that more than 5 columns of data may be output in the results files. * Net list files generated by gSpiceUI no longer have "gspiceui" appended to the file name eg. for a schematic "circuit.sch" the net list file name will be "circuit.ckt" and no longer "circuit.gspiceui.ckt". * The text control notebook page "Results" has been replaced with two pages "GNU-Cap" and "NG-Spice" which display GNU-Cap and NG-Spice simulation results respectively. * Added a reference to the source schematic/s in net list files created by gSpiceUI. A reload operation now re-imports the schematics if this reference exists in the currently open net list. * Added GHz to frequency units. * Additions to the documentation. * Bug fixes. 2005-07-21 : M.Waters * Released version 0.7.56 Alpha. * Commenced the use of layout managers to place and size display objects. This has been completed in the classes DlgSrcCfg, DlgGenCfg and PnlValue. * Development of gSpiceUI is now based on the wxWidgets library v2.6.x. wxWidgets library v2.4.x is no longer supported as it does not contain the class wxSizerFlags which is required for use of layout managers. * Changed references to make in all Makefiles to $(MAKE) so that gmake works on FreeBSD. * Implemented the tool bar and removed the simulation control buttons in the main frame. * Implemented the schematic/netlist reload function in the File menu and tool bar. * Created a new class NbkTxtCtls to contain all of the code associated with the text controls used by the FrmMain class. * Created a new class HelpTasks to contain most of the help operations required by the FrmMain class. * Created a new class FileTasks to contain most of the file operations required by the FrmMain class. * Discovered the wonders of compiling NG-Spice with XSpice extensions. Enables NG-Spice to handle POLY( ) statements eg. found in opamp models. * Added "*.cir" to the netlist file filters in the open dialog. * Added modifications suggested by Ezra to remove errors when compiling under Mac OSX. * Added Unicode support. * Bug fixes. 2005-05-18 : M.Waters * Released version 0.7.18 Alpha. * Added modifications suggested by Shahab Sanjari to remove errors when compiling under FreeBSD. * Dialogue added to NG-Spice Transient analysis to allow pulse source to be configured by the user. * Spin control precision changed from one decimal place to two. * Fixed some minor bugs associated with the PnlValue class. * In the AC analysis the default step scale has been set to "Dec" and the default source level to 1.0V (ie. 0dBV). * The AC analysis complex parts radio for magnitude in dB has been changed to "Mag. in dBV" to highlight the units used. * The correct Options menu simulator item is now checked when a new simulation is opened. * The class PrcPlotter has been rename to PrcGWave. * Added two new operational amplifier models to the lib/opamp directory ie. LM324 (national) and LMX358 (maxim). * Al Davis reported that the GNU-Cap AC analysis generated by gSpiceUI was missing an .OP command prior to the .AC command. The operational amplifier models in the lib/opamp directory can now be AC analysed correctly using GNU-Cap. * Additions to the documentation. * Bug fixes. 2005-04-19 : M.Waters * Released version 0.7.01 Alpha. * More than one schematic files can now be imported via the command line. * gSpiceUI can now be compiled using the wxWidgets library v2.5.4 but at this stage the GUI looks better using wxWidgets v2.5.2 or earlier. * Command line option added to specify temporary file management strategy ie. "-t ", delete the files automatically, prompt the user or keep them. * Command line options which have not yet been implemented are no longer displayed in the application usage message which has also been tidied up. * The application frame now cannot be resized using the mouse but the text control display area can be resized with a new command line option "-d n". * The spin controls have been modified so that the units automatically change to the next logical value when appropriate eg. 1000.0mV rolls up to 1.0V and 1.0mV rolls down to 1000.0uV. * I have derived an opamp model on which NG-Spice can perform an AC analysis. The model is based on the Maxim LMX358 model. I haven't been able to find an opamp model on which GNU-Cap can successfully perform an AC analysis. So far I've tried models from National and Maxim. * Additions to the documentation. * Bug fixes. 2005-03-22 : M.Waters * Released version 0.6.91 Alpha. * Added sweep step size checks when creating simulation. * Work has been completed on parsing basic GNU-Cap commands contained in circuit description files. * Work has been completed on parsing basic NG-Spice commands contained in circuit description files. * The command line processing code has been moved from class AppGSpiceUI to it's own class CmdLinePcr. * Fixed a bug that caused net list files to be loaded twice. Load operation should now be faster. * Fixed a bug in the spin control which caused incorrect incrementing of negative numbers. * Bug fixes. 2005-02-22 : M.Waters * Released version 0.6.81 Alpha. * The log file created by gnetlist is now removed on Close or Exit. * Temporary files created by gSpiceUI to hold analysis results are now removed on Close or Exit. * The development status has been changed from Alpha to Beta. * The naming convention for the simulation file has changed from ".sim" to ".gspiceui.ckt". * Work has commenced on parsing SPICE commands contained in circuit description files. The GNU-Cap Quiescent analysis and the NG-Spice AC analysis are complete. * The circuit description files generated by gSpiceUI will now have the extension ".gspiceui.ckt" instead of ".sim". * The GNU-Cap Fourier analysis panel has been temporarily disabled. It is broken and as yet does nothing useful. It will be enabled again when it is fixed. * The spin controls have been modified so that the step increment is now dependent on the value shown. In most cases the control will be incremented or decremented by between 10% and 100% of the displayed value. * Sort out some bugs which have crept into the NG-Spice simulation mechanism. * Simulation class now inherits from NetList class. Streamlines application architecture. * Additions to the documentation eg. object model diagrams. * Bug fixes. 2005-01-12 : M.Waters * Released version 0.6.58 Alpha. * Allow standard power supply rail labels (ie. Vcc, Vee, Vss and Vdd) to be used as sweep sources. * Move source attributes and code from analysis panel classes into base class PnlAnaBase to facilitate reuse and maintainability. * Move complex parts attributes and code into class PnlAnaBase to facilitate reuse and maintainability. * Bug fixes. 2004-12-08 : M.Waters * Released version 0.6.53 Alpha. * Clean-up and re-arrange analysis notebook display objects to accommodate a new analysis temperature display control. * Implement new anaylsis temperature control. * Add units of radians and grad to phase values. * Move analysis temperature attribute and code into class PnlAnaBase to facilitate reuse and maintainability. * Improve the management of the i/o notebook text controls. * Additions to the documentation. * Bug fixes. 2004-11-10 : M.Waters * Released version 0.6.47 Alpha. * Allow ".include" directives to be specified in net list files. * Replaced NG-Spice field identifiers in result file with component labels. 2004-11-08 : M.Waters * Released version 0.6.45 Alpha. * gSpiceUI now behaves properly when sub-circuit appear in the net list. * As a result of the change to wxWidgets v2.5.2 the GWave process was broken. It now works again. * Multiple schematic files may now be selected and imported via the GUI but not yet from the command line. * Status line enhancements. Simulation engine is now displayed. * Improvements to the application architecture. * Plot process mechanism over-hauled. * New class introduced to display floating point or integer variables. It now behaves correctly near zero. * New choice control class introduced to display and process units. * Debug messages mechanism has been removed. * For the time being only one plotter process can be intiated at a time. * Additions to the documentation. * Bug fixes 2004-09-16 : M.Waters * Released version 0.5.76 Alpha. * PrcGNetList.cpp : Multiple schematic files can now be imported via gnetlist into one netlist file. * gSpiceUI is now based on the wxWidgets v2.5.2 library (it may not be backwards compatible with v2.4.2). * Added Transient analysis panel for NG-Spice. * Added AC analysis panel for NG-Spice. * Makefile : "make config" is now part of "make all" because it got left out by some users and appeared to be a fault. 2004-08-12 : M.Waters * Released version 0.5.63 Alpha. * Verbose mode option (-v) added to argument list to gnetlist. * Default argument in FrmMain::bImportSchem( ) was removed. Caused some compilers to barf. * Some additions to the documentation. 2004-08-05 : M.Waters * The initial release of gSpiceUI, version 0.5.54 Alpha. 2003-08-15 : M.Waters * Started development of gSpiceUI.