R2_2_5/0000755000175000017500000000000012220571367011265 5ustar danieldanielR2_2_5/docs/0000755000175000017500000000000011667203026012213 5ustar danieldanielR2_2_5/docs/releasenotes/0000755000175000017500000000000011667203026014704 5ustar danieldanielR2_2_5/docs/releasenotes/Updater-ReleaseNotes-2.2.5.txt0000644000175000017500000000137211667203026022105 0ustar danieldaniel================================== Release Notes xTuple Updater Version 2.2.5 December 7, 2011 ================================== This is the xTuple Updater 2.2.5 patch release. This version of the Updater can be used with any release of xTuple ERP. The following features and bug fixes have been added since the release of the xTuple Updater 2.2.4. Additional detail for each item listed below may be found on our community website, www.xtuple.org. New Features: * Updater F/R to report elapsed time [8711] Bug Fixes: * updater silently corrupts some application scripts when postgres is configured with standard_conforming_strings set to true * Update progress bar shows incorrect information with some packages * Mac tar files cause errors in updater R2_2_5/LICENSE.txt0000644000175000017500000006724412220571364013122 0ustar danieldanielCommon Public Attribution License Version 1.0 (CPAL) 1. Definitions 1.0.1 "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1 "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2 "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3 "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4 "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5 "Executable" means Covered Code in any form other than Source Code. 1.6 "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8 "License" means this document. 1.8.1 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9 "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10 "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11 "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12 "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1 The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2 Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1 Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2 Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3 Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4 Intellectual Property Matters (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5 Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6 Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. 3.7 Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1 New Versions. Socialtext, Inc. ("Socialtext") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2 Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. 6.3 Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Socialtext", "CPAL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3 If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by Virginia law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of Virginia, with venue lying in Norfolk, Virginia, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. 14. ADDITIONAL TERM: ATTRIBUTION (a) As a modest attribution to the organizer of the development of the Original Code ("Original Developer"), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B ("Attribution Information") a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer's Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an "about" display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL ("Attribution Information") and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the "Attribution Limits"). (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. 15. ADDITIONAL TERM: NETWORK USE. The term "External Deployment" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. EXHIBIT A. Common Public Attribution License Version 1.0. The contents of this file are subject to the Common Public Attribution License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.xTuple.com/CPAL. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is xTuple ERP: PostBooks Edition The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. The Initial Developer of the Original Code is OpenMFG, LLC, d/b/a xTuple. All portions of the code written by xTuple are Copyright (c) 1999-2012 OpenMFG, LLC, d/b/a xTuple. All Rights Reserved. Contributor(s): ______________________. Alternatively, the contents of this file may be used under the terms of the xTuple End-User License Agreeement (the xTuple License), in which case the provisions of the xTuple License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the xTuple License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the xTuple License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the xTuple License. [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] EXHIBIT B. Attribution Information Attribution Copyright Notice: Copyright (c) 1999-2012 by OpenMFG, LLC, d/b/a xTuple Attribution Phrase (not exceeding 10 words): Powered by xTuple ERP: PostBooks Edition Attribution URL: www.xtuple.org (to be included in the "Community" menu of the application if possible) Graphic Image as provided in the Covered Code, if any. (online at www.xtuple.com/poweredby) Display of Attribution Information is required in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. R2_2_5/updater.pro0000644000175000017500000000234711667203027013460 0ustar danieldaniel# # This file is part of the xTuple ERP: PostBooks Edition, a free and # open source Enterprise Resource Planning software suite, # Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. # It is licensed to you under the Common Public Attribution License # version 1.0, the full text of which (including xTuple-specific Exhibits) # is available at www.xtuple.com/CPAL. By using this software, you agree # to be bound by its terms. # exists(../../openrpt) { OPENRPT_DIR = ../../openrpt } exists(../openrpt) { OPENRPT_DIR = ../openrpt } ! exists($${OPENRPT_DIR}) { error("Could not set the OPENRPT_DIR qmake variable.") } OPENRPT_BLD=$${OPENRPT_DIR} exists($${OPENRPT_DIR}-desktop-build) { OPENRPT_BLD=$${OPENRPT_DIR}-desktop-build } exists(../xtuple) { XTUPLE_DIR = ../xtuple } exists(../xtuple/trunk) { XTUPLE_DIR = ../xtuple/trunk } exists(../../xtuple) { XTUPLE_DIR = ../../xtuple } exists(../../xtuple/trunk) { XTUPLE_DIR = ../../xtuple/trunk } ! exists($${XTUPLE_DIR}) { error("Could not set the XTUPLE_DIR qmake variable.") } XTUPLE_BLD=$${XTUPLE_DIR} exists($${XTUPLE_DIR}-desktop-build) { XTUPLE_BLD=$${XTUPLE_DIR}-desktop-build } TEMPLATE = subdirs SUBDIRS = common \ builder \ loader CONFIG += ordered R2_2_5/bundle.sh0000755000175000017500000001046411667203027013101 0ustar danieldaniel# # This file is part of the xTuple ERP: PostBooks Edition, a free and # open source Enterprise Resource Planning software suite, # Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. # It is licensed to you under the Common Public Attribution License # version 1.0, the full text of which (including xTuple-specific Exhibits) # is available at www.xtuple.com/CPAL. By using this software, you agree # to be bound by its terms. # PROG=`basename $0` ARCH= VERFILE=common/data.cpp BUILD=false DEMO=false BASEDIR=`pwd` if [ "$BASEDIR" = . ] ; then BASEDIR=`pwd` fi OS=`uname -s` if [ "$OS" = Darwin ] ; then ARCH=`uname -p` OSVER=MAC${ARCH} fi usage() { echo "$PROG -h" echo "$PROG -b -d [ -x ]" echo fmt < build and bundle a demo release, including the help file named " echo "-x turn on shell debugging output" } bundle() { if [ "$#" -ne 2 ] ; then echo "Illegal call to bundle: bad arg count" echo "usage: bundle app dir_to_put_it_in" return 1 fi STARTDIR=`pwd` APPNAME="$1" if expr "$APPNAME" : ".*\.app" ; then BINARY="$APPNAME" APPNAME=`basename "$APPNAME" .app` else BINARY="${APPNAME}.app" fi if $DEMO ; then BUNDLENAME="${APPNAME}-${VERSION}Demo-${OSVER}" else BUNDLENAME="${APPNAME}-${VERSION}-${OSVER}" fi BUNDLEDIR="${2}/${BUNDLENAME}" if [ -d "$BUNDLEDIR" ] ; then if ! rm -rf "$BUNDLEDIR" ; then return 3 fi fi if ! mkdir "$BUNDLEDIR" ; then return 3 fi if $DEMO ; then BINARY="${APPNAME}_Demo.app" else BINARY="${APPNAME}.app" fi if [ "$OSVER" = MacUniversal ] ; then cp -R "$BASEDIR/bin/${APPNAME}.app" "$BUNDLEDIR" || return 4 else ditto --rsrc -arch $ARCH "$BASEDIR/bin/${APPNAME}.app" "$BUNDLEDIR/$BINARY" || return 4 fi if $DEMO ; then if [ -d "$HELPFILE" ] ; then if ! cp -R -L "$HELPFILE" \ "$BUNDLEDIR"/"${BINARY}"/Contents/Resources/helpOpenMFGGUIClient ; then return 5 fi elif [ -f "$HELPFILE" ] ; then CURRDIR=`pwd` if ! cd "$BUNDLEDIR"/"${BINARY}"/Contents/Resources ; then return 5 fi if ! jar xf "$HELPFILE" ; then return 5 fi if [ ! -d helpOpenMFGGUIClient ] ; then echo "$PROG: help file $HELPFILE was not installed properly in demo client" return 5 fi cd "$CURRDIR" fi fi cd "$BUNDLEDIR"/.. if [ -f "$BUNDLENAME".dmg ] && ! rm "$BUNDLENAME".dmg ; then return 5 fi if ! hdiutil create -fs HFS+ -volname "$BUNDLENAME" -srcfolder "$BUNDLENAME" "$BUNDLENAME".dmg ; then return 5 fi cd $STARTDIR } ARGS=`getopt hbd:x $*` if [ $? != 0 ] ; then usage exit 1 fi set -- $ARGS while [ "$1" != -- ] ; do case "$1" in -h) usage exit 0 ;; -b) BUILD=true ;; -d) DEMO=true HELPFILE=$2 if ! expr ${HELPFILE} : "\/" ; then HELPFILE=`pwd`/"$HELPFILE" fi shift ;; -x) set -x ;; *) usage exit 1 ;; esac shift done shift # past the -- if [ "$#" -gt 0 ] ; then echo "$PROG: ignoring extra arguments $*" fi if [ `uname -s` != Darwin ] ; then echo "$PROG: only supports Macintosh OS X (Darwin) at this time" usage exit 2 fi ARCH=`uname -p` OSVER=MAC${ARCH} if [ -z "$QTDIR" ] ; then echo "$PROG: Cannot run properly without the QTDIR environment variable set" exit 2 fi if [ -z "$PGDIR" ] ; then echo "$PROG: Cannot run properly without the PGDIR environment variable set" exit 2 fi if [ ! -e "$BASEDIR"/bin/updater.app ] ; then if ! $BUILD ; then echo "Building even though not explicitly told to do so" fi BUILD=true fi if [ ! -f "$VERFILE" ] ; then echo "Could not find $VERFILE" exit 2 fi VERSION=`cpp $VERFILE | sed -n '/_version/s/.*"\([^"]*\)".*/\1/p'` if $BUILD ; then cd "$BASEDIR" qmake make fi cd "$BASEDIR"/loader ./fixPackage -pID ../bin/updater.app cd "$BASEDIR"/bin for FILE in updater ; do if ! bundle ${FILE} "${BASEDIR}/.." ; then exit $? fi done echo "DONE!" R2_2_5/global.pri0000644000175000017500000000362511667203027013246 0ustar danieldaniel# # This file is part of the xTuple ERP: PostBooks Edition, a free and # open source Enterprise Resource Planning software suite, # Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. # It is licensed to you under the Common Public Attribution License # version 1.0, the full text of which (including xTuple-specific Exhibits) # is available at www.xtuple.com/CPAL. By using this software, you agree # to be bound by its terms. # exists(../../../openrpt) { OPENRPT_DIR = ../../../openrpt } exists(../../openrpt) { OPENRPT_DIR = ../../openrpt } exists(../openrpt) { OPENRPT_DIR = ../openrpt } ! exists($${OPENRPT_DIR}) { error("Could not set the OPENRPT_DIR qmake variable.") } OPENRPT_BLD=$${OPENRPT_DIR} exists($${OPENRPT_DIR}-build-desktop) { OPENRPT_BLD=$${OPENRPT_DIR}-build-desktop } exists(../../../xtuple) { XTUPLE_DIR = ../../xtuple } exists(../../../xtuple/trunk) { XTUPLE_DIR = ../../xtuple/trunk } exists(../../xtuple) { XTUPLE_DIR = ../../xtuple } exists(../../xtuple/trunk) { XTUPLE_DIR = ../../xtuple/trunk } exists(../xtuple) { XTUPLE_DIR = ../xtuple } exists(../xtuple/trunk) { XTUPLE_DIR = ../xtuple/trunk } XTUPLE_BLD=$${XTUPLE_DIR} exists($${XTUPLE_DIR}-build-desktop) { XTUPLE_BLD=$${XTUPLE_DIR}-build-desktop } UPDATER_BLD=. exists(../updater-desktop-build) { UPDATER_BLD=../updater-desktop-build } message("Looking for OpenRPT code in $${OPENRPT_DIR}.") message("Looking for xTuple code in $${XTUPLE_DIR}.") INCLUDEPATH += ../common \ ../$${OPENRPT_DIR}/common \ ../$${OPENRPT_DIR}/MetaSQL \ ../$${XTUPLE_DIR}/common ../$${XTUPLE_BLD}/common DEPENDPATH += ../$${UPDATER_BLD}/common ../$${OPENRPT_BLD}/common ../$${OPENRPT_BLD}/MetaSQL INCLUDEPATH = $$unique(INCLUDEPATH) CONFIG += release macx:exists(macx.pri) { include(macx.pri) } win32:exists(win32.pri) { include(win32.pri) } unix:exists(unix.pri) { include(unix.pri) } R2_2_5/common/0000755000175000017500000000000011667203026012553 5ustar danieldanielR2_2_5/common/initscript.cpp0000644000175000017500000000266711667203026015462 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "initscript.h" #include #include #define DEBUG false InitScript::InitScript(const QString & name, OnError onError, const QString & comment) : Script(name, onError, comment) { _nodename = "initscript"; } InitScript::InitScript(const QDomElement & elem, QStringList &msg, QList &fatal) { _nodename = "initscript"; _name = elem.attribute("name"); if (elem.hasAttribute("file")) _name = elem.attribute("file"); _onError = nameToOnError(elem.attribute("onerror")); _comment = elem.text(); if (_name.isEmpty()) { msg.append(TR("This initscript does not have a file or name attribute.")); fatal.append(true); } } InitScript::~InitScript() { } QDomElement InitScript::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement(_nodename); elem.setAttribute("file", _name); elem.setAttribute("onerror", onErrorToName(_onError)); if(!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); return elem; } R2_2_5/common/createfunction.h0000644000175000017500000000174411667203026015743 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __CREATEFUNCTION_H__ #define __CREATEFUNCTION_H__ #include "createdbobj.h" class CreateFunction : public CreateDBObj { public: CreateFunction(const QString &filename, const QString &name, const QString &comment = QString::null, const QString &schema = QString::null, const OnError onError = Default); CreateFunction(const QDomElement &, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: }; #endif R2_2_5/common/createtable.cpp0000644000175000017500000000430311667203026015532 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "createtable.h" #include #include #include #include // used by XSqlQuery::bindValue() #include "metasql.h" #include "xsqlquery.h" #define DEBUG false CreateTable::CreateTable(const QString &filename, const QString &name, const QString &comment, const QString &schema, const OnError onError) : CreateDBObj("createtable", filename, name, comment, schema, onError) { _pkgitemtype = "T"; _relkind = "r"; // pg_class.relkind 'r' => relation (ordinary table) } CreateTable::CreateTable(const QDomElement &elem, QStringList &msg, QList &fatal) : CreateDBObj(elem, msg, fatal) { _pkgitemtype = "T"; _relkind = "r"; // pg_class.relkind 'r' => relation (ordinary table) if (elem.nodeName() != "createtable") { msg.append(TR("Creating a CreateTable element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } } int CreateTable::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (DEBUG) qDebug("CreateTable::writeToDb(%s, %s, &errMsg)", pdata.data(), qPrintable(pkgname)); _oidMql = new MetaSQLQuery("SELECT pg_class.oid AS oid " "FROM pg_class, pg_namespace " "WHERE ((relname=)" " AND (relkind=)" " AND (relnamespace=pg_namespace.oid)" " AND (nspname=));"); ParameterList params; params.append("relkind", _relkind); int returnVal = CreateDBObj::writeToDB(pdata, pkgname, params, errMsg); delete _oidMql; _oidMql = 0; return returnVal; } R2_2_5/common/createdbobj.cpp0000644000175000017500000000653611667203026015535 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "createdbobj.h" #include #include #include #include #include #include "metasql.h" #include "xsqlquery.h" #define DEBUG false CreateDBObj::CreateDBObj() { } CreateDBObj::CreateDBObj(const QString &nodename, const QString &filename, const QString &name, const QString &comment, const QString &schema, OnError onError) { _comment = comment; _filename = filename; _name = name; _nodename = nodename; _oidMql = 0; _schema = schema; _onError = onError; } CreateDBObj::CreateDBObj(const QDomElement & elem, QStringList &msg, QList &fatal) { _nodename = elem.nodeName(); if (elem.hasAttribute("name")) _name = elem.attribute("name"); else { msg.append(TR("The contents.xml must name the object for %1.") .arg(_nodename)); fatal.append("false"); } if (elem.hasAttribute("file")) _filename = elem.attribute("file"); else { msg.append(TR("The contents.xml must name the file for %1.") .arg(_nodename)); fatal.append(true); } if (elem.hasAttribute("schema")) _schema = elem.attribute("schema"); if (elem.hasAttribute("onerror")) _onError = nameToOnError(elem.attribute("onerror")); _comment = elem.text().trimmed(); } CreateDBObj::~CreateDBObj() { } QDomElement CreateDBObj::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement(_nodename); elem.setAttribute("file", _filename); if (! _name.isEmpty()) elem.setAttribute("name", _name); if (! _schema.isEmpty()) elem.setAttribute("schema", _schema); if (!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); return elem; } int CreateDBObj::writeToDB(const QByteArray &pdata, const QString pkgname, ParameterList ¶ms, QString &errMsg) { if (DEBUG) qDebug("CreateDBObj::writeToDB(%s, %s, &errMsg)", pdata.data(), qPrintable(pkgname)); QString destschema; if (! _schema.isEmpty()) destschema = _schema; else if (pkgname.isEmpty()) destschema = "public"; else if (! pkgname.isEmpty()) destschema = pkgname; int returnVal = Script::writeToDB(pdata, pkgname, errMsg); if (returnVal < 0) return returnVal; params.append("name", _name); params.append("schema", destschema); XSqlQuery oidq = _oidMql->toQuery(params); if (oidq.first()) ; // passed error check else if (oidq.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_filename) .arg(oidq.lastError().databaseText()) .arg(oidq.lastError().driverText()); return -7; } else // not found { errMsg = TR("Could not find %1 in the database. The " "script %2 does not match the package.xml description.") .arg(_name).arg(_filename); return -8; } return returnVal; } R2_2_5/common/licensewindow.ui0000644000175000017500000000544511667203026015774 0ustar danieldaniel This file is part of the xTuple ERP: PostBooks Edition, a free and open source Enterprise Resource Planning software suite, Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. It is licensed to you under the Common Public Attribution License version 1.0, the full text of which (including xTuple-specific Exhibits) is available at www.xtuple.com/CPAL. By using this software, you agree to be bound by its terms. LicenseWindow 0 0 400 300 Dialog Package Software License: true Qt::Horizontal 40 20 I Accept I Do Not Accept Qt::Horizontal 40 20 _accept clicked() LicenseWindow accept() 97 263 40 270 _reject clicked() LicenseWindow reject() 275 260 353 266 R2_2_5/common/loadcmd.h0000644000175000017500000000305511667203026014332 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADCMD_H__ #define __LOADCMD_H__ #include #include "loadable.h" class LoadCmd : public Loadable { public: LoadCmd(const QString &nodename, const QString &name, const QString &module, const QString &title, const QString &privname, const QString &executable, const QStringList &args = QStringList(), const QString &descrip = QString::null); LoadCmd(const QDomElement &, const bool system, QStringList &, QList &); virtual QDomElement createElement(QDomDocument &doc); virtual bool isValid() const { return !_name.isEmpty() && !_title.isEmpty() && !_executable.isEmpty(); } virtual int writeToDB(const QByteArray &, const QString pkgname, QString &errMsg) { return writeToDB(pkgname, errMsg); } virtual int writeToDB(const QString pkgname, QString &errMsg); protected: QStringList _args; QString _executable; QString _module; QString _privname; QString _title; }; #endif R2_2_5/common/createview.cpp0000644000175000017500000000410711667203026015417 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "createview.h" #include #include #include #include // used by XSqlQuery::bindValue() #include "metasql.h" #include "xsqlquery.h" #define DEBUG false CreateView::CreateView(const QString &filename, const QString &name, const QString &comment, const QString &schema, const OnError onError) : CreateDBObj("createview", filename, name, comment, schema, onError) { _pkgitemtype = "V"; _relkind = "v"; } CreateView::CreateView(const QDomElement &elem, QStringList &msg, QList &fatal) : CreateDBObj(elem, msg, fatal) { _pkgitemtype = "V"; _relkind = "v"; if (elem.nodeName() != "createview") { msg.append(TR("Creating a CreateView element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } } int CreateView::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (DEBUG) qDebug("CreateView::writeToDb(%s, %s, &errMsg)", pdata.data(), qPrintable(pkgname)); _oidMql = new MetaSQLQuery("SELECT pg_class.oid AS oid " "FROM pg_class, pg_namespace " "WHERE ((relname=)" " AND (relkind=)" " AND (relnamespace=pg_namespace.oid)" " AND (nspname=));"); ParameterList params; params.append("relkind", _relkind); int returnVal = CreateDBObj::writeToDB(pdata, pkgname, params, errMsg); delete _oidMql; _oidMql = 0; return returnVal; } R2_2_5/common/loadpriv.cpp0000644000175000017500000000641711667203026015107 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadpriv.h" #include #include #include // used by XSqlQuery::bindValue() #include "xsqlquery.h" #include "loadable.h" LoadPriv::LoadPriv(const QString &nodename, const QString &name, const QString &module, const bool system, const QString &comment) : Loadable(nodename, name, 0, system, comment) { _module = module; if (_module == "Custom" && ! _name.startsWith("Custom")) _name = "Custom" + _name; _pkgitemtype = "P"; } LoadPriv::LoadPriv(const QDomElement &elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { _pkgitemtype = "P"; if (_name.isEmpty()) { msg.append(TR("A Privilege %1 does not have a name.")); fatal.append(true); } if (elem.hasAttribute("module")) _module = elem.attribute("module"); else { _module = "Custom"; msg.append(TR("The Privilege %1 has not been assigned to a " "module. It will default to '%2'.") .arg(_name).arg(_module)); fatal.append(false); } } QDomElement LoadPriv::createElement(QDomDocument &doc) { QDomElement elem = doc.createElement("loadpriv"); elem.setAttribute("name", _name); elem.setAttribute("module", _module); if(!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); return elem; } int LoadPriv::writeToDB(const QString pkgname, QString &errMsg) { if (_name.isEmpty()) { errMsg = TR("The Privilege does not have a name.") .arg(_name); return -1; } if (_module.isEmpty()) { errMsg = TR("The Privilege %1 has not been " "assigned to a module and so may not be assignable.") .arg(_name); } _selectMql = new MetaSQLQuery("SELECT priv_id AS id, -1, -1" " FROM " " WHERE (priv_name=);"); _updateMql = new MetaSQLQuery("UPDATE " " SET priv_module=, " " priv_descrip= " " WHERE (priv_id=) " "RETURNING priv_id AS id;"); _insertMql = new MetaSQLQuery("INSERT INTO (" " priv_id, priv_module, priv_name, priv_descrip " ") VALUES (" " DEFAULT, ," " , ) " "RETURNING priv_id AS id;"); ParameterList params; params.append("tablename", "priv"); params.append("module", _module); return Loadable::writeToDB(QByteArray(), pkgname, errMsg, params); } R2_2_5/common/loadable.cpp0000644000175000017500000001455411667203026015033 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadable.h" #include #include #include #include // used by XSqlQuery::value() #include #include "xsqlquery.h" QRegExp Loadable::trueRegExp("^t(rue)?$", Qt::CaseInsensitive); QRegExp Loadable::falseRegExp("^f(alse)?$", Qt::CaseInsensitive); QString Loadable::_sqlerrtxt = TR("The following error was " "encountered while trying to import %1 into " "the database:
%2
%3
"); Loadable::Loadable(const QString &nodename, const QString &name, const int grade, const bool system, const QString &schema, const QString &comment, const QString &filename) { _nodename = nodename; _name = name; _grade = grade; _system = system; _schema = schema; _comment = comment; _filename = (filename.isEmpty() ? name : filename); _minMql = 0; _maxMql = 0; _selectMql = 0; _insertMql = 0; _updateMql = 0; } Loadable::Loadable(const QDomElement & elem, const bool system, QStringList &/*msg*/, QList &/*fatal*/) { _system = system; _nodename = elem.nodeName(); _grade = 0; if (elem.hasAttribute("name")) _name = elem.attribute("name"); if (elem.hasAttribute("grade")) { if (elem.attribute("grade").contains("highest", Qt::CaseInsensitive)) _grade = INT_MAX; else if (elem.attribute("grade").contains("lowest", Qt::CaseInsensitive)) _grade = INT_MIN; else _grade = elem.attribute("grade").toInt(); } else if (elem.hasAttribute("order")) { if (elem.attribute("order").contains("highest", Qt::CaseInsensitive)) _grade = INT_MAX; else if (elem.attribute("order").contains("lowest", Qt::CaseInsensitive)) _grade = INT_MIN; else _grade = elem.attribute("order").toInt(); } if (elem.hasAttribute("file")) _filename = elem.attribute("file"); else _filename = _name; if (elem.hasAttribute("schema")) _schema = elem.attribute("schema"); if (elem.hasAttribute("onerror")) _onError = Script::nameToOnError(elem.attribute("onerror")); else _onError = Script::nameToOnError("Stop"); _comment = elem.text().trimmed(); _minMql = 0; _maxMql = 0; _selectMql = 0; _insertMql = 0; _updateMql = 0; } Loadable::~Loadable() { if (_minMql) delete _minMql; if (_maxMql) delete _maxMql; if (_selectMql) delete _selectMql; if (_insertMql) delete _insertMql; if (_updateMql) delete _updateMql; } QString Loadable::schema() const { return _schema; } QDomElement Loadable::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement(_nodename); elem.setAttribute("name", _name); elem.setAttribute("grade", _grade); elem.setAttribute("file", _filename); if (! _schema.isEmpty()) elem.setAttribute("schema", _schema); if(!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); return elem; } int Loadable::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg, ParameterList ¶ms) { params.append("name", _name); params.append("type", _pkgitemtype); params.append("source", QString(pdata)); params.append("notes", _comment); // alter the name of the loadable's table if necessary QString destschema = "public"; QString prefix; if (_schema.isEmpty() && pkgname.isEmpty()) ; // leave it alone else if (_schema.isEmpty() && ! pkgname.isEmpty()) { prefix = "pkg"; destschema = pkgname; } else if ("public" == _schema && pkgname.isEmpty()) ; // leave it alone else if ("public" == _schema && ! pkgname.isEmpty()) prefix = "public."; else if (! _schema.isEmpty()) { prefix = _schema + ".pkg"; destschema = _schema; } if (! prefix.isEmpty()) { params.append("pkgname", destschema); // yuck - no Parameter::operator==(Parameter&) and no replace() QString tablename = params.value("tablename").toString(); for (int i = 0; i < params.size(); i++) { if (params.at(i).name() == "tablename") { params.takeAt(i); params.append("tablename", prefix + tablename); break; } } } if (_minMql && _minMql->isValid() && _grade == INT_MIN) { XSqlQuery minOrder = _minMql->toQuery(params); if (minOrder.first()) _grade = minOrder.value(0).toInt(); else if (minOrder.lastError().type() != QSqlError::NoError) { QSqlError err = minOrder.lastError(); errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText()); return -3; } else _grade = 0; } else if (_maxMql && _maxMql->isValid() && _grade == INT_MAX) { XSqlQuery maxOrder = _maxMql->toQuery(params); if (maxOrder.first()) _grade = maxOrder.value(0).toInt(); else if (maxOrder.lastError().type() != QSqlError::NoError) { QSqlError err = maxOrder.lastError(); errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText()); return -4; } else _grade = 0; } params.append("grade", _grade); XSqlQuery select; int itemid = -1; select = _selectMql->toQuery(params); if (select.first()) itemid = select.value(0).toInt(); else if (select.lastError().type() != QSqlError::NoError) { QSqlError err = select.lastError(); errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText()); return -5; } params.append("id", itemid); XSqlQuery upsert; if (itemid >= 0) upsert = _updateMql->toQuery(params); else upsert = _insertMql->toQuery(params); if (upsert.first()) itemid = upsert.value("id").toInt(); else if (upsert.lastError().type() != QSqlError::NoError) { QSqlError err = upsert.lastError(); errMsg = _sqlerrtxt.arg(_filename) .arg(err.driverText()) .arg(err.databaseText()); return -7; } return itemid; } R2_2_5/common/prerequisite.cpp0000644000175000017500000003304211667203026016002 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "prerequisite.h" #include #include #include #include "licensewindow.h" #include "xsqlquery.h" #define TR(a) QObject::tr(a) #define DEBUG false QString Prerequisite::_sqlerrtxt = TR("The following error was " "encountered while trying to " "check the prerequisite %1:" "
%2
%3"); PrerequisiteProvider::PrerequisiteProvider(const QString & package, const QString & info) : _package(package), _info(info) { } PrerequisiteProvider::PrerequisiteProvider(const QDomElement & elem) { _package = elem.attribute("name"); _info = elem.text(); } PrerequisiteProvider::~PrerequisiteProvider() { } QDomElement PrerequisiteProvider::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement("providedby"); elem.setAttribute("name", _package); elem.appendChild(doc.createTextNode(_info)); return elem; } Prerequisite::Prerequisite() { _dependency = 0; _message = QString::null; _name = QString::null; _query = QString::null; _type = None; } Prerequisite::Prerequisite(const Prerequisite &p) { if (p._dependency) _dependency = new DependsOn(p._dependency->name(), p._dependency->version(), p._dependency->developer()); else _dependency = 0; _message = p._message; _name = p._name; _query = p._query; _type = p._type; } Prerequisite::Prerequisite(const QDomElement & elem) { _dependency = 0; _message = QString::null; _name = elem.attribute("name"); _query = QString::null; _type = nameToType(elem.attribute("type")); QDomNodeList nList = elem.childNodes(); for(int n = 0; n < nList.count(); ++n) { QDomElement elemThis = nList.item(n).toElement(); if(elemThis.tagName() == "query") _query = elemThis.text(); else if(elemThis.tagName() == "message") _message = elemThis.text(); else if(elemThis.tagName() == "providedby") { PrerequisiteProvider provider(elemThis); if(provider.isValid()) _providers.append(provider); } else if (elemThis.tagName() == "dependson") _dependency = new DependsOn(elemThis.attribute("name"), elemThis.attribute("version"), elemThis.attribute("developer")); else { // ERROR? } } if (DEBUG) qDebug("Prerequisite(QDomElement&): name %s, type %d (%s), message %s, " "dependency %p (%s %s %s), query %s", qPrintable(_name), _type, qPrintable(typeToName(_type)), qPrintable(_message), _dependency, qPrintable(_dependency ? _dependency->name() : QString()), qPrintable(_dependency ? _dependency->version() : QString()), qPrintable(_dependency ? _dependency->developer(): QString()), qPrintable(_query)); } Prerequisite::~Prerequisite() { if (DEBUG) qDebug("Prerequisite::~Prerequisite(): name %s, type %d (%s), message %s", qPrintable(_name), _type, qPrintable(typeToName(_type)), qPrintable(_message)); if (_dependency) { delete _dependency; _dependency = 0; } } QDomElement Prerequisite::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement("prerequisite"); QDomElement elemThis; elem.setAttribute("name", _name); elem.setAttribute("type", typeToName(_type)); switch (_type) { case Query: elemThis = doc.createElement("query"); elemThis.appendChild(doc.createTextNode(_query)); elem.appendChild(elemThis); break; case License: break; case Dependency: elemThis = doc.createElement("dependson"); elemThis.setAttribute("name", _dependency->name()); if (! _dependency->developer().isEmpty()) elemThis.setAttribute("developer", _dependency->developer()); if (! _dependency->version().isEmpty()) elemThis.setAttribute("version", _dependency->version()); break; default: break; } if (! _message.isEmpty()) { elemThis = doc.createElement("message"); elemThis.appendChild(doc.createTextNode(_message)); elem.appendChild(elemThis); } QList::iterator it = _providers.begin(); for(; it != _providers.end(); ++it) { if((*it).isValid()) elem.appendChild((*it).createElement(doc)); } return elem; } void Prerequisite::setProvider(const PrerequisiteProvider & p) { for(int i = 0; i < _providers.count(); ++i) { if(_providers[i].package() == p.package()) { _providers[i] = p; return; } } _providers.append(p); } bool Prerequisite::removeProvider(const QString & package) { QList::iterator it = _providers.begin(); for(; it != _providers.end(); ++it) { if((*it).package() == package) { it = _providers.erase(it); return TRUE; } } return FALSE; } PrerequisiteProvider Prerequisite::provider(const QString & package) const { QList::const_iterator it = _providers.begin(); for(; it != _providers.end(); ++it) { if((*it).package() == package) return *it; } return PrerequisiteProvider(); } QStringList Prerequisite::providerList() const { QStringList list; QList::const_iterator it = _providers.begin(); for(; it != _providers.end(); ++it) list.append((*it).package()); return list; } QString Prerequisite::typeToName(Type type) { QString str = "None"; switch (type) { case Query: str = "Query"; break; case License: str = "License"; break; case Dependency: str = "Dependency"; break; case None: break; default: break; } return str; } Prerequisite::Type Prerequisite::nameToType(const QString & name) { if ("query" == name.toLower()) return Query; else if ("license" == name.toLower()) return License; else if ("dependency" == name.toLower()) return Dependency; return None; } QStringList Prerequisite::typeList(bool includeNone) { QStringList list; if(includeNone) list << "None"; list << "Query"; list << "License"; list << "Dependency"; return list; } bool Prerequisite::met(QString &errMsg) { if (DEBUG) qDebug("Prerequisite::met() name %s, type %d (%s), message %s, " "dependency %p (%s %s %s), query %s", qPrintable(_name), _type, qPrintable(typeToName(_type)), qPrintable(_message), _dependency, qPrintable(/*_dependency ? _dependency->name() :*/ QString()), qPrintable(/*_dependency ? _dependency->version() :*/ QString()), qPrintable(/*_dependency ? _dependency->developer():*/ QString()), qPrintable(_query)); bool returnVal = false; switch (_type) { case Query: { XSqlQuery query; query.exec(_query); if (query.first()) { returnVal = query.value(0).toBool(); errMsg = _message; } else if (query.lastError().type() != QSqlError::NoError) errMsg = _sqlerrtxt.arg(_name).arg(query.lastError().databaseText()) .arg(query.lastError().driverText()); else { returnVal = false; errMsg = _message; } break; } case License: { LicenseWindow newdlg(_message); returnVal = (newdlg.exec() == QDialog::Accepted); if (! returnVal) errMsg = TR("The user declined to accept the usage license."); break; } case Dependency: { QString sql = "SELECT * FROM pkghead WHERE ((pkghead_name=:name) "; if (! _dependency->version().isEmpty()) sql += "AND (pkghead_version=:version) "; if (! _dependency->developer().isEmpty()) sql += "AND (pkghead_developer=:developer) "; sql += ");"; XSqlQuery query; query.prepare(sql); query.bindValue(":name", _dependency->name()); query.bindValue(":version", _dependency->version()); query.bindValue(":developer", _dependency->developer()); query.exec(); if (query.first()) returnVal = true; else if (query.lastError().type() != QSqlError::NoError) errMsg = _sqlerrtxt.arg(_name).arg(query.lastError().databaseText()) .arg(query.lastError().driverText()); else errMsg = TR("%1
The prerequisite %2 has not been met. It " "requires that the package %3 (version %4, " "developer %5) be installed first.") .arg(_message).arg(_name).arg(_dependency->name()) .arg(_dependency->version().isEmpty() ? TR("Unspecified") : _dependency->version()) .arg(_dependency->developer().isEmpty() ? TR("Unspecified") : _dependency->developer()); break; } default: errMsg = TR("Encountered an unknown Prerequisite type. " "Prerequisite '%1' has not been validated.") .arg(_name); break; } return returnVal; } int Prerequisite::writeToDB(const QString pkgname, QString &errMsg) { if (DEBUG) qDebug("Prerequisite::writeToDB(%s, &errMsg)", qPrintable(pkgname)); if (! pkgname.isEmpty() && _dependency) { XSqlQuery select; int pkgheadid = -1; select.prepare("SELECT pkghead_id FROM pkghead WHERE (pkghead_name=:name);"); select.bindValue(":name", pkgname); select.exec(); if (select.first()) pkgheadid = select.value(0).toInt(); else if (select.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_name) .arg(select.lastError().databaseText()) .arg(select.lastError().driverText()); return -1; } int parentid = -1; QString sql = "SELECT * FROM pkghead WHERE ((pkghead_name=:name) "; if (! _dependency->version().isEmpty()) sql += "AND (pkghead_version=:version) "; if (! _dependency->developer().isEmpty()) sql += "AND (pkghead_developer=:developer) "; sql += ") ORDER BY pkghead_version DESC LIMIT 1;"; select.prepare(sql); select.bindValue(":name", _dependency->name()); select.bindValue(":version", _dependency->version()); select.bindValue(":developer", _dependency->developer()); select.exec(); if (select.first()) parentid = select.value(0).toInt(); else if (select.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_name) .arg(select.lastError().databaseText()) .arg(select.lastError().driverText()); return -2; } else { errMsg = TR("Could not record the dependency %1 of package %2 " "on package %3 (version %4, developer %5) because " "the record for %6 was not found.") .arg(_name).arg(pkgname).arg(_dependency->name()) .arg(_dependency->version().isEmpty() ? TR("Unspecified") : _dependency->version()) .arg(_dependency->developer().isEmpty() ? TR("Unspecified") : _dependency->developer()) .arg(_dependency->name()); return -3; } int pkgdepid = -1; select.prepare("SELECT * FROM pkgdep " "WHERE ((pkgdep_pkghead_id=:pkgheadid)" " AND (pkgdep_parent_pkghead_id=:parentid));"); select.bindValue(":pkgheadid", pkgheadid); select.bindValue(":parentid", parentid); select.exec(); if (select.first()) pkgdepid=select.value(0).toInt(); else if (select.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_name) .arg(select.lastError().databaseText()) .arg(select.lastError().driverText()); return -4; } XSqlQuery upsert; if (pkgdepid > 0) upsert.prepare("UPDATE pkgdep " "SET pkgdep_pkghead_id=:pkgheadid," " pkgdep_parent_pkghead_id=:parentid " "WHERE (pkgdep_id=:pkgdepid);"); else { upsert.exec("SELECT NEXTVAL('pkgdep_pkgdep_id_seq');"); if (upsert.first()) pkgdepid = upsert.value(0).toInt(); else if (upsert.lastError().type() != QSqlError::NoError) { QSqlError err = upsert.lastError(); errMsg = _sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -5; } upsert.prepare("INSERT INTO pkgdep (" " pkgdep_id, pkgdep_pkghead_id, pkgdep_parent_pkghead_id" ") VALUES (" " :pkgdepid, :pkgheadid, :parentid);"); } upsert.bindValue(":pkgdepid", pkgdepid); upsert.bindValue(":pkgheadid", pkgheadid); upsert.bindValue(":parentid", parentid); if (! upsert.exec()) { QSqlError err = upsert.lastError(); errMsg = _sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -6; } return pkgdepid; } return 0; } R2_2_5/common/xversion.h0000644000175000017500000000262611667203026014607 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __XVERSION_H__ #define __XVERSION_H__ #include class XVersion { public: enum ReleaseStage { WIP, ALPHA, BETA, RC, FINAL, UNKNOWN }; XVersion(); XVersion(const QString &); XVersion(const XVersion &); ~XVersion(); bool isValid() const; int majorNumber(bool &ok) const; int minorNumber(bool &ok) const; int pointNumber(bool &ok) const; void setVersion(const QString &); ReleaseStage stage(bool &ok) const; int substageNumber(bool &ok) const; QString toString() const; bool operator==(XVersion); bool operator> (XVersion); bool operator>=(XVersion); bool operator< (XVersion); bool operator<=(XVersion); bool operator!=(XVersion); protected: int _major; int _minor; int _point; ReleaseStage _stage; int _substage; }; #endif R2_2_5/common/package.h0000644000175000017500000000567311667203026014332 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __PACKAGE_H__ #define __PACKAGE_H__ #include #include #include "xversion.h" class QDomDocument; class QDomElement; class CreateFunction; class CreateTable; class CreateTrigger; class CreateView; class LoadAppScript; class LoadAppUI; class LoadCmd; class LoadImage; class LoadMetasql; class LoadPriv; class LoadReport; class Prerequisite; class Script; class FinalScript; class InitScript; class Package { public: Package(const QString & id = QString::null); Package(const QDomElement &, QStringList &, QList &); virtual ~Package(); QDomElement createElement(QDomDocument &); int writeToDB(QString &errMsg); QString id() const { return _id; } void setId(const QString & id) { _id = id; } QString developer() const { return _developer; } QString name() const { return _name; } bool system() const; XVersion version() const { return _pkgversion; } QList _functions; QList _tables; QList _triggers; QList _views; QList _appscripts; QList _appuis; QList _cmds; QList _images; QList _metasqls; QList _privs; QList _prerequisites; QList _scripts; QList _finalscripts; QList _initscripts; QList _reports; bool containsAppScript(const QString &name) const; bool containsAppUI(const QString &name) const; bool containsCmd(const QString &name) const; bool containsFunction(const QString &name) const; bool containsImage(const QString &name) const; bool containsPrerequisite(const QString &name) const; bool containsMetasql(const QString &name) const; bool containsPriv(const QString &name) const; bool containsReport(const QString &name) const; bool containsScript(const QString &name) const; bool containsFinalScript(const QString &name) const; bool containsInitScript(const QString &name) const; bool containsTable(const QString &name) const; bool containsTrigger(const QString &name) const; bool containsView(const QString &name) const; protected: QString _developer; QString _descrip; QString _id; XVersion _pkgversion; QString _name; QString _notes; }; #endif R2_2_5/common/loadmetasql.cpp0000644000175000017500000001320611667203026015567 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadmetasql.h" #include #include #include // used by XSqlQuery::bindValue() #include "metasql.h" #include "xsqlquery.h" #define DEBUG false LoadMetasql::LoadMetasql(const QString &name, const QString &group, const bool system, const QString &comment, const QString &filename) : Loadable("loadmetasql", name, 0, system, comment, filename) { _pkgitemtype = "M"; _group = group; } LoadMetasql::LoadMetasql(const QDomElement &elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { if (DEBUG) qDebug("LoadMetasql::LoadMetasql(QDomElement) entered"); _pkgitemtype = "M"; if (elem.nodeName() != "loadmetasql") { msg.append(TR("Creating a LoadMetasql element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } if (elem.hasAttribute("group")) _group = elem.attribute("group"); if (elem.hasAttribute("enabled")) { msg.append(TR("Node %1 '%2' has an 'enabled' " "attribute which is ignored for MetaSQL statements.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } } int LoadMetasql::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (pdata.isEmpty()) { errMsg = TR("The MetaSQL statement %1 is empty.") .arg(_name); return -2; } QString metasqlStr = QString(pdata); QStringList lines = metasqlStr.split("\n"); QRegExp groupRE = QRegExp("(^\\s*--\\s*GROUP:\\s*)(.*)",Qt::CaseInsensitive); QRegExp nameRE = QRegExp("(^\\s*--\\s*NAME:\\s*)(.*)", Qt::CaseInsensitive); QRegExp notesRE = QRegExp("(^\\s*--\\s*NOTES:\\s*)(.*)",Qt::CaseInsensitive); QRegExp dashdashRE = QRegExp("(^\\s*--\\s*)(.*)"); for (int i = 0; i < lines.size(); i++) { if (DEBUG) qDebug("LoadMetasql::writeToDB looking at %s", qPrintable(lines.at(i))); if (groupRE.indexIn(lines.at(i)) >= 0) { _group = groupRE.cap(2).trimmed(); if (DEBUG) qDebug("LoadMetasql::writeToDB() found group %s", qPrintable(_group)); } else if (nameRE.indexIn(lines.at(i)) >= 0) { _name = nameRE.cap(2).trimmed(); if (DEBUG) qDebug("LoadMetasql::writeToDB() found name %s", qPrintable(_name)); } else if (notesRE.indexIn(lines.at(i)) >= 0) { _comment = notesRE.cap(2).trimmed(); while (dashdashRE.indexIn(lines.at(++i)) >= 0) _comment += " " + dashdashRE.cap(2).trimmed(); if (DEBUG) qDebug("LoadMetasql::writeToDB() found notes %s", qPrintable(_comment)); } } if (DEBUG) qDebug("LoadMetasql::writeToDB(): name %s group %s notes %s\n%s", qPrintable(_name), qPrintable(_group), qPrintable(_comment), qPrintable(metasqlStr)); QString destschema = "public"; if (_schema.isEmpty() && pkgname.isEmpty()) ; // leave it alone else if (_schema.isEmpty() && ! pkgname.isEmpty()) destschema = pkgname; else if ("public" == _schema) ; // leave it alone else if (! _schema.isEmpty()) destschema = _schema; XSqlQuery gradedsavepoint("SAVEPOINT savemetasql_graded;"); MetaSQLQuery upsertm("SELECT saveMetasql(," " , ," " E," " CAST( AS BOOLEAN)," " " "" " , " "" ") AS result;"); ParameterList upsertp; upsertp.append("group", _group); upsertp.append("name", _name); upsertp.append("notes", _comment); upsertp.append("query", metasqlStr); upsertp.append("system",_system); upsertp.append("schema",destschema); upsertp.append("grade", _grade); int metasqlid = -1; XSqlQuery upsert = upsertm.toQuery(upsertp); if (upsert.first()) metasqlid = upsert.value(0).toInt(); else if (upsert.lastError().type() != QSqlError::NoError) { XSqlQuery gradedrollback("ROLLBACK TO SAVEPOINT savemetasql_graded;"); upsertp.append("skipgrade"); upsert = upsertm.toQuery(upsertp); if (upsert.first()) metasqlid = upsert.value(0).toInt(); if (upsert.lastError().type() != QSqlError::NoError) { QSqlError err = upsert.lastError(); errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText()); return -6; } } else { errMsg = TR("Saving the MetaSQL statement returned 0 rows. This should " "not be possible."); return -6; } if (metasqlid < 0) { errMsg = TR("The %1 stored procedure failed, returning %2.") .arg("saveMetasql").arg(metasqlid); return -5; } else XSqlQuery gradedrelease("RELEASE SAVEPOINT savemetasql_graded;"); if (DEBUG) qDebug("LoadMetasql::writeToDB() executed %s and got %d in return", qPrintable(upsert.executedQuery()), metasqlid); return metasqlid; } R2_2_5/common/createdbobj.h0000644000175000017500000000330211667203026015166 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __CREATEDBOBJ_H__ #define __CREATEDBOBJ_H__ #include #include "script.h" #include class QDomDocument; class QDomElement; class MetaSQLQuery; #define TR(a) QObject::tr(a) class CreateDBObj : public Script { public: CreateDBObj(const QString &nodename, const QString &filename, const QString &name = QString::null, const QString &comment = QString::null, const QString &schema = QString::null, const OnError onError = Default); CreateDBObj(const QDomElement &, QStringList &, QList &); virtual ~CreateDBObj(); virtual QDomElement createElement(QDomDocument &doc); virtual QString filename() const { return _filename; } virtual bool isValid() const { return !_nodename.isEmpty() && !_name.isEmpty() && !_filename.isEmpty(); } protected: QString _filename; QString _nodename; MetaSQLQuery *_oidMql; QString _pkgitemtype; QString _schema; CreateDBObj(); virtual int writeToDB(const QByteArray &pdata, const QString pkgname, ParameterList ¶ms, QString &errMsg); }; #endif R2_2_5/common/loadimage.h0000644000175000017500000000175211667203026014653 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADIMAGE_H__ #define __LOADIMAGE_H__ #include "loadable.h" class LoadImage : public Loadable { public: LoadImage(const QString & name, const int order = 0, const bool system = false, const bool enabled = true, const QString & comment = QString::null, const QString &filename = QString::null); LoadImage(const QDomElement &, const bool system, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); }; #endif R2_2_5/common/licensewindow.h0000644000175000017500000000125211667203026015576 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include #include "ui_licensewindow.h" class LicenseWindow : public QDialog, public Ui::LicenseWindow { public: LicenseWindow(QString text) : QDialog() { setupUi(this); _license->setText(text); }; }; R2_2_5/common/finalscript.cpp0000644000175000017500000000270211667203026015576 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "finalscript.h" #include #include #define DEBUG false FinalScript::FinalScript(const QString & name, OnError onError, const QString & comment) : Script(name, onError, comment) { _nodename = "finalscript"; } FinalScript::FinalScript(const QDomElement & elem, QStringList &msg, QList &fatal) { _nodename = "finalscript"; _name = elem.attribute("name"); if (elem.hasAttribute("file")) _name = elem.attribute("file"); _onError = nameToOnError(elem.attribute("onerror")); _comment = elem.text(); if (_name.isEmpty()) { msg.append(TR("This finalscript does not have a file or name attribute.")); fatal.append(true); } } FinalScript::~FinalScript() { } QDomElement FinalScript::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement(_nodename); elem.setAttribute("file", _name); elem.setAttribute("onerror", onErrorToName(_onError)); if(!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); return elem; } R2_2_5/common/createview.h0000644000175000017500000000173311667203026015066 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __CREATEVIEW_H__ #define __CREATEVIEW_H__ #include "createdbobj.h" class CreateView : public CreateDBObj { public: CreateView(const QString &filename, const QString &name, const QString &comment = QString::null, const QString &schema = QString::null, const OnError onError = Default); CreateView(const QDomElement &, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: QString _relkind; }; #endif R2_2_5/common/loadreport.h0000644000175000017500000000171211667203026015100 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADREPORT_H__ #define __LOADREPORT_H__ #include "loadable.h" class LoadReport : public Loadable { public: LoadReport(const QString &name, const int grade = 0, const bool system = false, const QString &comment = QString::null, const QString &filename = QString::null); LoadReport(const QDomElement &, const bool system, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); }; #endif R2_2_5/common/prerequisite.h0000644000175000017500000000576611667203026015463 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __PREREQUISITE_H__ #define __PREREQUISITE_H__ #include #include #include class QDomDocument; class QDomElement; class PrerequisiteProvider { public: PrerequisiteProvider(const QString & package = QString::null, const QString & info = QString::null); PrerequisiteProvider(const QDomElement &); virtual ~PrerequisiteProvider(); QDomElement createElement(QDomDocument &); bool isValid() const { return !_package.isEmpty(); } QString package() const { return _package; } void setPackage(const QString & package) { _package = package; } QString info() const { return _info; } void setInfo(const QString & info) { _info = info; } protected: QString _package; QString _info; }; class DependsOn { public: DependsOn(const QString &name, const QString &version = QString(), const QString &developer = QString()) { _name = name; _version = version; _developer = developer; }; QString developer() { return _developer; }; QString name() { return _name; }; QString version() { return _version; }; private: QString _developer; QString _name; QString _version; }; class Prerequisite { public: Prerequisite(); Prerequisite(const Prerequisite &); Prerequisite(const QDomElement &); virtual ~Prerequisite(); QDomElement createElement(QDomDocument &); enum Type { None = 0, Query, License, Dependency }; virtual bool met(QString &); virtual int writeToDB(const QString, QString &); QString name() const { return _name; } void setName(const QString & name) { _name = name; } Type type() const { return _type; } void setType(Type type) { _type = type; } QString message() const { return _message; } void setMessage(const QString & message) { _message = message; } QString query() const { return _query; } void setQuery(const QString & query) { _query = query; } void setProvider(const PrerequisiteProvider &); bool removeProvider(const QString &); PrerequisiteProvider provider(const QString &) const; QStringList providerList() const; static QString typeToName(Type); static Type nameToType(const QString &); static QStringList typeList(bool includeNone = TRUE); protected: DependsOn *_dependency; QString _message; QString _name; QString _query; Type _type; QList _providers; static QString _sqlerrtxt; }; #endif R2_2_5/common/createtrigger.cpp0000644000175000017500000000404111667203026016105 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "createtrigger.h" #include #include #include #include // used by XSqlQuery::bindValue() #include "metasql.h" #include "xsqlquery.h" #define DEBUG false CreateTrigger::CreateTrigger(const QString &filename, const QString &name, const QString &comment, const QString &schema, const OnError onError) : CreateDBObj("createtrigger", filename, name, comment, schema, onError) { _pkgitemtype = "G"; } CreateTrigger::CreateTrigger(const QDomElement &elem, QStringList &msg, QList &fatal) : CreateDBObj(elem, msg, fatal) { _pkgitemtype = "G"; if (elem.nodeName() != "createtrigger") { msg.append(TR("Creating a CreateTrigger element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } } int CreateTrigger::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (DEBUG) qDebug("CreateTrigger::writeToDb(%s, %s, &errMsg)", pdata.data(), qPrintable(pkgname)); _oidMql = new MetaSQLQuery("SELECT pg_trigger.oid AS oid " "FROM pg_trigger, pg_class, pg_namespace " "WHERE ((tgname=)" " AND (tgrelid=pg_class.oid)" " AND (relnamespace=pg_namespace.oid)" " AND (nspname=));"); ParameterList params; int returnVal = CreateDBObj::writeToDB(pdata, pkgname, params, errMsg); delete _oidMql; _oidMql = 0; return returnVal; } R2_2_5/common/pkgschema.h0000644000175000017500000000163611667203026014674 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __PKGSCHEMA_H__ #define __PKGSCHEMA_H__ #include class PkgSchema { public: PkgSchema(const QString &name, const QString &comment = QString::null); virtual ~PkgSchema(); virtual int create(QString &errMsg); virtual int clearPath(QString &errMsg); virtual int getPath(QString &path, QString &errMsg); virtual int setPath(QString &errMsg); protected: QString _name; QString _comment; static QString _sqlerrtxt; }; #endif R2_2_5/common/loadappui.cpp0000644000175000017500000001223411667203026015237 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadappui.h" #include #include #include // used by XSqlQuery::bindValue() #include #include "xsqlquery.h" #define DEBUG false LoadAppUI::LoadAppUI(const QString &name, const int order, const bool system, const bool enabled, const QString & comment, const QString &filename) : Loadable("loadappui", name, order, system, comment, filename) { _enabled = enabled; _pkgitemtype = "U"; } LoadAppUI::LoadAppUI(const QDomElement &elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { _pkgitemtype = "U"; if (elem.nodeName() != "loadappui") { msg.append(TR("Creating a LoadAppUI element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } if (elem.hasAttribute("grade")) { msg.append(TR("Node %1 '%2' has a 'grade' attribute but " "should use 'order' instead.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } if (elem.hasAttribute("order")) { if (elem.attribute("order").contains("highest", Qt::CaseInsensitive)) _grade = INT_MAX; else if (elem.attribute("order").contains("lowest", Qt::CaseInsensitive)) _grade = INT_MIN; else _grade = elem.attribute("order").toInt(); } _enabled = true; if (elem.hasAttribute("enabled")) { if (elem.attribute("enabled").contains(trueRegExp)) _enabled = true; else if (elem.attribute("enabled").contains(falseRegExp)) _enabled = false; else { msg.append(TR("Node %1 '%2' has an 'enabled' attribute that is " "neither 'true' nor 'false'. Using '%3'.") .arg(elem.nodeName()).arg(elem.attribute("name")) .arg(_enabled ? "true" : "false")); fatal.append(false); } } } int LoadAppUI::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { int errLine = 0; int errCol = 0; QDomDocument doc; if (! doc.setContent(pdata, &errMsg, &errLine, &errCol)) { errMsg = TR("Error parsing file %1: %2 on line %3 column %4") .arg(_filename).arg(errMsg).arg(errLine).arg(errCol); return -1; } QDomElement root = doc.documentElement(); if (root.tagName() != "ui") { errMsg = TR("XML Document %1 does not have root node of 'ui'") .arg(_filename); return -2; } if (DEBUG) qDebug("LoadAppUI::writeToDB() name before looking for class node: %s", qPrintable(_name)); QDomElement n = root.firstChildElement("class"); if (n.isNull()) { errMsg = TR("XML Document %1 does not name its class and is not a valid " "UI Form.") .arg(_filename); return -3; } _name = n.text(); if (DEBUG) qDebug("LoadAppUI::writeToDB() name after looking for class node: %s", qPrintable(_name)); _minMql = new MetaSQLQuery("SELECT MIN(uiform_order) AS min " "FROM uiform " "WHERE (uiform_name=);"); _maxMql = new MetaSQLQuery("SELECT MAX(uiform_order) AS max " "FROM uiform " "WHERE (uiform_name=);"); _selectMql = new MetaSQLQuery("SELECT uiform_id, -1, -1" " FROM " " WHERE ((uiform_name=)" " AND (uiform_order=));"); _updateMql = new MetaSQLQuery("UPDATE " " SET uiform_order=, " " uiform_enabled=," " uiform_source=E," " uiform_notes= " " WHERE (uiform_id=) " "RETURNING uiform_id AS id;"); _insertMql = new MetaSQLQuery("INSERT INTO (" " uiform_id, uiform_name," " uiform_order, uiform_enabled, " " uiform_source, uiform_notes" ") VALUES (" " DEFAULT, ," " , ," " E," " ) " "RETURNING uiform_id AS id;"); ParameterList params; params.append("enabled", QVariant(_enabled)); params.append("tablename", "uiform"); return Loadable::writeToDB(pdata, pkgname, errMsg, params); } R2_2_5/common/script.cpp0000644000175000017500000000574211667203026014573 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "script.h" #include #include #include "xsqlquery.h" #define DEBUG false QString Script::_sqlerrtxt = TR("The following error was encountered " "while trying to import %1 into the " "database:
%2
%3
"); Script::Script(const QString & name, OnError onError, const QString & comment) : _name(name), _comment(comment), _onError(onError) { } Script::Script(const QDomElement & elem, QStringList &msg, QList &fatal) { _name = elem.attribute("name"); if (elem.hasAttribute("file")) _name = elem.attribute("file"); _onError = nameToOnError(elem.attribute("onerror")); _comment = elem.text(); if (_name.isEmpty()) { msg.append(TR("This script does not have a name.")); fatal.append(true); } } Script::~Script() { } QString Script::filename() const { return _name; // _name and _filename are interchangable } QDomElement Script::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement("script"); elem.setAttribute("name", _name); elem.setAttribute("file", _name); elem.setAttribute("onerror", onErrorToName(_onError)); if(!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); return elem; } QString Script::onErrorToName(OnError onError) { QString str = "Default"; if(Stop == onError) str = "Stop"; else if(Prompt == onError) str = "Prompt"; else if(Ignore == onError) str = "Ignore"; return str; } Script::OnError Script::nameToOnError(const QString & name) { if("Stop" == name) return Stop; else if("Prompt" == name) return Prompt; else if("Ignore" == name) return Ignore; return Default; } QStringList Script::onErrorList(bool includeDefault) { QStringList list; if(includeDefault) list << "Default"; list << "Stop"; list << "Prompt"; list << "Ignore"; return list; } int Script::writeToDB(const QByteArray &pdata, const QString annotation, QString &errMsg) { if (DEBUG) qDebug("Script::writeToDb(%s, %s, &errMsg) with onError %d", pdata.data(), qPrintable(annotation), _onError); if (pdata.isEmpty()) { errMsg = TR("The file %1 is empty.").arg(filename()); return -1; } XSqlQuery create; create.exec(QString(pdata)); if (create.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(filename()) .arg(create.lastError().databaseText()) .arg(create.lastError().driverText()); return -3; } return 0; } R2_2_5/common/loadcmd.cpp0000644000175000017500000001616011667203026014666 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadcmd.h" #include #include #include #include // used by XSqlQuery::bindValue() #include "loadable.h" #include "xsqlquery.h" #define DEBUG false LoadCmd::LoadCmd(const QString &nodename, const QString &name, const QString &module, const QString &title, const QString &privname, const QString &executable, const QStringList &args, const QString &comment) : Loadable(nodename, name, 0, false, comment) { _args = args; _executable = executable; _module = module; _privname = privname; _title = title; _pkgitemtype= "D"; } LoadCmd::LoadCmd(const QDomElement &elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { _pkgitemtype= "D"; // name isn't required, at least according to the db and guiclient if (elem.hasAttribute("title")) _title = elem.attribute("title"); else { msg.append(TR("Node %1 '%2' does not have a title. Its menu item " "will be blank.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(true); } if (elem.hasAttribute("module")) _module = elem.attribute("module"); else { msg.append(TR("Node %1 '%2' does not name a module. The Custom " "Command will not have a corresponding menu item.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(true); } if (elem.hasAttribute("executable")) _executable = elem.attribute("executable"); else { msg.append(TR("Node %1 '%2' does not name an executable. Nothing " "will be done when the user selects the menu item.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(true); } if (elem.hasAttribute("privname")) _privname = elem.attribute("privname"); if (elem.hasAttribute("grade")) { msg.append(TR("Node %1 '%2' has a 'grade' attribute but Custom " "Commands are not graded. This will be ignored.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } for (QDomElement childElem = elem.firstChildElement("arg"); ! childElem.isNull(); childElem = childElem.nextSiblingElement("arg")) { if (childElem.hasAttribute("value")) _args.append(childElem.attribute("value").trimmed()); else { msg.append(TR("Node %1 '%2' has an 'arg' with no 'value' attribute.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } } if (DEBUG) qDebug("LoadCmd(QDomElement): %s %s, comment %s", qPrintable(_executable), qPrintable(_args.join(" ")), qPrintable(_comment)); } QDomElement LoadCmd::createElement(QDomDocument &doc) { QDomElement elem = doc.createElement("loadcmd"); elem.setAttribute("name", _name); elem.setAttribute("title", _title); elem.setAttribute("executable", _executable); elem.setAttribute("privname", _privname); elem.setAttribute("module", _module); if(!_comment.isEmpty()) elem.appendChild(doc.createTextNode(_comment)); if (! _args.isEmpty()) { for (int i = 0; i < _args.size(); i++) { QDomElement argElem = doc.createElement("arg"); elem.setAttribute("value", _args.at(i)); elem.appendChild(argElem); } } return elem; } int LoadCmd::writeToDB(const QString pkgname, QString &errMsg) { _selectMql = new MetaSQLQuery("SELECT cmd_id, -1, -1" " FROM " " WHERE (cmd_name=);"); _updateMql = new MetaSQLQuery("UPDATE " " SET cmd_module=, " " cmd_title=, " " cmd_privname=, " " cmd_executable=, " " cmd_descrip= " " WHERE (cmd_id=) " "RETURNING cmd_id AS id;"); _insertMql = new MetaSQLQuery("INSERT INTO (" " cmd_id, cmd_module," " cmd_title, cmd_descrip, " " cmd_privname," " cmd_executable, cmd_name" ") VALUES (" " DEFAULT, ," " , ," " ," " , )" " RETURNING cmd_id AS id;"); ParameterList params; params.append("tablename", "cmd"); params.append("module", _module); params.append("title", _title); params.append("privname", _privname); params.append("executable",_executable); int cmdid = Loadable::writeToDB(QByteArray(), pkgname, errMsg, params); if (cmdid < 0) return cmdid; // alter the name of the loadable's table if necessary QString prefix; if (_schema.isEmpty() && pkgname.isEmpty()) ; // leave it alone else if (_schema.isEmpty() && ! pkgname.isEmpty()) prefix = "pkg"; else if ("public" == _schema && pkgname.isEmpty()) ; // leave it alone else if ("public" == _schema && ! pkgname.isEmpty()) prefix = "public."; else if (! _schema.isEmpty() && pkgname.isEmpty()) prefix = _schema + ".pkg"; else if (! _schema.isEmpty() && ! pkgname.isEmpty()) prefix = _schema + ".pkg"; XSqlQuery delargs; delargs.prepare(QString("DELETE FROM %1cmdarg WHERE (cmdarg_cmd_id=:cmd_id);") .arg(prefix)); delargs.bindValue(":cmd_id", cmdid); if (! delargs.exec()) { QSqlError err = delargs.lastError(); errMsg = _sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -8; } if (_args.size() > 0) { XSqlQuery insargs; insargs.prepare(QString("INSERT INTO %1cmdarg (cmdarg_cmd_id, cmdarg_order, " "cmdarg_arg) VALUES (:cmd_id, :order, :arg);") .arg(prefix)); for (int i = 0; i < _args.size(); i++) { insargs.bindValue(":cmd_id", cmdid); insargs.bindValue(":order", i); insargs.bindValue(":arg", _args.at(i)); if (! insargs.exec()) { QSqlError err = insargs.lastError(); errMsg = _sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -9; } } } return cmdid; } R2_2_5/common/loadmetasql.h0000644000175000017500000000250511667203026015234 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADMETASQL_H__ #define __LOADMETASQL_H__ #include "loadable.h" class LoadMetasql : public Loadable { public: LoadMetasql(const QString & name, const QString &group, const bool system = false, const QString & comment = QString::null, const QString &filename = QString::null); LoadMetasql(const QDomElement &, const bool system, QStringList &, QList &); virtual QString group() const { return _group; } virtual bool isValid() const { return !_nodename.isEmpty() && !_name.isEmpty() && !_group.isEmpty(); } virtual void setGroup(const QString &group) { _group = group; } virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: QString _group; }; #endif R2_2_5/common/createtrigger.h0000644000175000017500000000173511667203026015561 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __CREATETRIGGER_H__ #define __CREATETRIGGER_H__ #include "createdbobj.h" class CreateTrigger : public CreateDBObj { public: CreateTrigger(const QString &filename, const QString &name, const QString &comment = QString::null, const QString &schema = QString::null, const OnError onError = Default); CreateTrigger(const QDomElement &, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: }; #endif R2_2_5/common/createfunction.cpp0000644000175000017500000000710611667203026016274 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "createfunction.h" #include #include #include #include // used by XSqlQuery::bindValue() #include "xsqlquery.h" #define DEBUG false CreateFunction::CreateFunction(const QString &filename, const QString &name, const QString &comment, const QString &schema, const OnError onError) : CreateDBObj("createfunction", filename, name, comment, schema, onError) { _pkgitemtype = "F"; } CreateFunction::CreateFunction(const QDomElement &elem, QStringList &msg, QList &fatal) : CreateDBObj(elem, msg, fatal) { _pkgitemtype = "F"; if (elem.nodeName() != "createfunction") { msg.append(TR("Creating a CreateFunction element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } } int CreateFunction::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (DEBUG) qDebug("CreateFunction::writeToDb(%s, %s, &errMsg)", pdata.data(), qPrintable(pkgname)); QString destschema; if (! _schema.isEmpty()) destschema = _schema; else if (pkgname.isEmpty()) destschema = "public"; else if (! pkgname.isEmpty()) destschema = pkgname; XSqlQuery oidq; QMap oldoids; oidq.prepare("SELECT pg_proc.oid, oidvectortypes(proargtypes) " "FROM pg_proc, pg_namespace " "WHERE ((pg_namespace.oid=pronamespace)" " AND (proname=:name)" " AND (nspname=:schema));"); oidq.bindValue(":name", _name); oidq.bindValue(":schema", destschema); oidq.exec(); while (oidq.next()) oldoids.insert(oidq.value(1).toString(), oidq.value(0).toInt()); if (oidq.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_filename) .arg(oidq.lastError().databaseText()) .arg(oidq.lastError().driverText()); return -1; } if (DEBUG) { QMap::const_iterator i = oldoids.constBegin(); while (i != oldoids.constEnd()) { qDebug("CreateFunction::writeToDB() %s(%s) -> %d", qPrintable(_name), qPrintable(i.key()), i.value()); i++; } } int returnVal = Script::writeToDB(pdata, pkgname, errMsg); if (returnVal < 0) return returnVal; oidq.exec(); // reuse the query int count = 0; while (oidq.next()) { // error checking - if none found then there's a bug somewhere if (DEBUG) qDebug("CreateFunction::writeToDB() oid = %d, argtypes = %s", oidq.value(0).toInt(), qPrintable(oidq.value(1).toString())); count++; } if (oidq.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_filename) .arg(oidq.lastError().databaseText()) .arg(oidq.lastError().driverText()); return -5; } if (count == 0) { errMsg = TR("Could not find function %1 in the database for package %2. " "The script %3 does not match the package.xml description.") .arg(_name).arg(pkgname).arg(_filename); return -6; } return 0; } R2_2_5/common/xversion.cpp0000644000175000017500000001253311667203026015140 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "xversion.h" #include #include #include #define DEBUG false XVersion::XVersion() : _major(-1), _minor(-1), _point(-1), _stage(UNKNOWN), _substage(-1) { } XVersion::XVersion(const QString &pString) : _major(-1), _minor(-1), _point(-1), _stage(UNKNOWN), _substage(-1) { setVersion(pString); } XVersion::XVersion(const XVersion &pVersion) { _major = pVersion._major; _minor = pVersion._minor; _point = pVersion._point; _stage = pVersion._stage; _substage = pVersion._substage; } XVersion::~XVersion() { } bool XVersion::isValid() const { if (_major == -1 || _stage == UNKNOWN) return false; else return true; } void XVersion::setVersion(const QString &pString) { QStringList suffixes; suffixes << "wip" << "alpha" << "beta" << "rc"; QRegExp relregex("^(\\d+)\\.(\\d+)(\\.\\d+)?(?:(" + suffixes.join("|") + ")(\\d*)?)?$"); if (relregex.indexIn(pString.toLower()) == -1) return; if (relregex.cap(1).isEmpty()) return; _major = relregex.cap(1).toInt(); if (relregex.cap(2).isEmpty()) return; _minor = relregex.cap(2).toInt(); if (! relregex.cap(3).isEmpty()) _point = relregex.cap(3).mid(1).toInt(); if (relregex.cap(4).isEmpty()) { _stage = FINAL; _substage = 0; } else switch (suffixes.indexOf(relregex.cap(4))) { case 0: _stage = WIP; _substage = 0; break; case 1: _stage = ALPHA; _substage = 0; break; case 2: _stage = BETA; _substage = 0; break; case 3: _stage = RC; _substage = 0; break; default: _stage = UNKNOWN; break; } if (! relregex.cap(5).isEmpty()) _substage = relregex.cap(5).toInt(); } int XVersion::majorNumber(bool &ok) const { ok = (_major >= 0); return _major; } int XVersion::minorNumber(bool &ok) const { ok = (_minor >= 0); return _minor; } int XVersion::pointNumber(bool &ok) const { if (_point >= 0) { ok = true; return _point; } else { ok = false; return 0; } } XVersion::ReleaseStage XVersion::stage(bool &ok) const { ok = (_stage != UNKNOWN); return _stage; } int XVersion::substageNumber(bool &ok) const { ok = (_substage >= 0); return _substage; } QString XVersion::toString() const { QString result = QObject::tr("invalid"); if (_major >= 0) { result = QString::number(_major); if (_minor >= 0) { result += "." + QString::number(_minor); if (_point >= 0) { result += "." + QString::number(_point); } } switch (_stage) { case WIP: result += "wip"; break; case ALPHA: result += "alpha"; break; case BETA: result += "beta"; break; case RC: result += "rc"; break; case FINAL: break; case UNKNOWN: default: result = QObject::tr("invalid"); } if (_substage > 0 && (_stage == WIP || _stage == ALPHA || _stage == BETA || _stage == RC)) result += QString::number(_substage); } return result; } // NOTE: // all of the comparisons return false if either version is obviously invalid bool XVersion::operator==(XVersion other) { bool ok; if (! isValid() || ! other.isValid()) return false; else return (_major == other._major && _minor == other._minor && pointNumber(ok) == other.pointNumber(ok) && // treat uninit as 0 _stage == other._stage && _substage == other._substage); } /* can't simple say if (major > other.major && minor > other.minor ... because v2.3 > v1.4 but 3 < 4 and so would fail here: ^^^^^^^^^^^^^^^^^^ */ bool XVersion::operator>(XVersion other) { if (! isValid() || !other.isValid()) return false; else if (_major > other._major) return true; else if (_major < other._major) return false; else if (_minor > other._minor) return true; else if (_minor < other._minor) return false; else if (_point > other._point) return true; else if (_point < other._point) return false; else if (_stage > other._stage) return true; else if (_stage < other._stage) return false; else return (_substage > other._substage); } bool XVersion::operator>=(XVersion other) { if (! isValid() || ! other.isValid()) return false; else return (*this == other || *this > other); } bool XVersion::operator< (XVersion other) { if (! isValid() || ! other.isValid()) return false; else return !(*this == other || *this > other); } bool XVersion::operator<=(XVersion other) { if (! isValid() || ! other.isValid()) return false; else return (*this == other || *this < other); } bool XVersion::operator!=(XVersion other) { if (! isValid() || ! other.isValid()) return false; else return ! (*this == other); } R2_2_5/common/loadappscript.cpp0000644000175000017500000001041211667203026016122 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadappscript.h" #include #include #include // used by XSqlQuery::bindValue() #include #include "xsqlquery.h" LoadAppScript::LoadAppScript(const QString &name, const int order, const bool system, const bool enabled, const QString &comment, const QString &filename) : Loadable("loadappscript", name, order, system, comment, filename) { _enabled = enabled; _pkgitemtype = "C"; } LoadAppScript::LoadAppScript(const QDomElement &elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { _pkgitemtype = "C"; if (_name.isEmpty()) { msg.append(TR("The script in %1 does not have a name.") .arg(_filename)); fatal.append(true); } if (elem.nodeName() != "loadappscript") { msg.append(TR("Creating a LoadAppScript element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } if (elem.hasAttribute("grade")) { msg.append(TR("Node %1 '%2' has a 'grade' attribute but should use " "'order' instead.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } _enabled = true; if (elem.hasAttribute("enabled")) { if (elem.attribute("enabled").contains(trueRegExp)) _enabled = true; else if (elem.attribute("enabled").contains(falseRegExp)) _enabled = false; else { msg.append(TR("Node %1 '%2' has an 'enabled' attribute that is " "neither 'true' nor 'false'. Using '%3'.") .arg(elem.nodeName()).arg(elem.attribute("name")) .arg(_enabled ? "true" : "false")); fatal.append(false); } } } int LoadAppScript::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (_name.isEmpty()) { errMsg = TR("The script does not have a name."); return -1; } if (pdata.isEmpty()) { errMsg = TR("The script %1 is empty.").arg(_filename); return -2; } _minMql = new MetaSQLQuery("SELECT MIN(script_order) AS min " "FROM script " "WHERE (script_name=);"); _maxMql = new MetaSQLQuery("SELECT MAX(script_order) AS max " "FROM script " "WHERE (script_name=);"); _selectMql = new MetaSQLQuery("SELECT script_id, -1, -1" " FROM " " WHERE ((script_name=)" " AND (script_order=));"); _updateMql = new MetaSQLQuery("UPDATE " " SET script_order=, " " script_enabled=," " script_source=E," " script_notes= " " WHERE (script_id=) " "RETURNING script_id AS id; "); _insertMql = new MetaSQLQuery("INSERT INTO (" " script_id, script_name," " script_order, script_enabled," " script_source, script_notes" ") VALUES (DEFAULT, , " " , ," " E," " ) " "RETURNING script_id AS id;"); ParameterList params; params.append("enabled", QVariant(_enabled)); params.append("tablename", "script"); return Loadable::writeToDB(pdata, pkgname, errMsg, params); } R2_2_5/common/loadappui.h0000644000175000017500000000177711667203026014716 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADAPPUI_H__ #define __LOADAPPUI_H__ #include "loadable.h" class LoadAppUI : public Loadable { public: LoadAppUI(const QString & name, const int order = 0, const bool system = false, const bool enabled = true, const QString & comment = QString::null, const QString &filename = QString::null); LoadAppUI(const QDomElement &, const bool system, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: bool _enabled; }; #endif R2_2_5/common/loadreport.cpp0000644000175000017500000001321111667203026015430 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadreport.h" #include #include #include #include // used by XSqlQuery::bindValue() #include #include "xsqlquery.h" LoadReport::LoadReport(const QString &name, const int grade, const bool system, const QString &comment, const QString &filename) : Loadable("loadreport", name, grade, system, comment, filename) { _pkgitemtype = "R"; } LoadReport::LoadReport(const QDomElement & elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { _pkgitemtype = "R"; if (elem.nodeName() != "loadreport") { msg.append(TR("Creating a LoadAppReport element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } } int LoadReport::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { int errLine = 0; int errCol = 0; QDomDocument doc; if (! doc.setContent(pdata, &errMsg, &errLine, &errCol)) { errMsg = (TR("Error parsing file %1: %2 on " "line %3 column %4") .arg(_filename).arg(errMsg).arg(errLine).arg(errCol)); return -1; } QDomElement root = doc.documentElement(); if(root.tagName() != "report") { errMsg = TR("XML Document %1 does not have root" " node of report") .arg(_filename); return -2; } for(QDomNode n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { if(n.nodeName() == "name") _name = n.firstChild().nodeValue(); else if(n.nodeName() == "description") _comment = n.firstChild().nodeValue(); } QString report_src = doc.toString(); if(_filename.isEmpty()) { errMsg = TR("The document %1 does not have" " a report name defined") .arg(_filename); return -3; } /* the following block avoids ERROR: duplicate key violates unique constraint "report_name_grade_idx" */ if (! pkgname.isEmpty()) { // if there's a version of the report that's not part of this pkg XSqlQuery select; select.prepare("SELECT report_id " "FROM report r JOIN pg_class c ON (r.tableoid=c.oid)" " JOIN pg_namespace n ON (relnamespace=n.oid) " "WHERE ((report_name=:name)" " AND (report_grade=:grade)" " AND (nspname<>:pkgname));"); select.bindValue(":name", _name); select.bindValue(":grade", _grade); select.bindValue(":pkgname", pkgname); select.exec(); if(select.first()) { // then find the next open higher grade XSqlQuery next; next.prepare("SELECT MIN(sequence_value) AS next " "FROM sequence " "WHERE ((sequence_value NOT IN (" " SELECT report_grade" " FROM report" " WHERE (report_name=:name)))" " AND (sequence_value>=:grade));"); next.bindValue(":name", _name); next.bindValue(":grade", _grade); next.exec(); if (next.first()) _grade = next.value(0).toInt(); else if (next.lastError().type() != QSqlError::NoError) { QSqlError err = next.lastError(); errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText()); return -8; } } else if (select.lastError().type() != QSqlError::NoError) { QSqlError err = select.lastError(); errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText()); return -9; } } _minMql = new MetaSQLQuery("SELECT MIN(report_grade) AS min " "FROM report " "WHERE (report_name=);"); _maxMql = new MetaSQLQuery("SELECT MAX(report_grade) AS max " "FROM report " "WHERE (report_name=);"); _selectMql = new MetaSQLQuery("SELECT report_id, -1, -1" " FROM report " " WHERE ((report_name=) " " AND (report_grade=) );"); _updateMql = new MetaSQLQuery("UPDATE " " SET report_descrip=, " " report_source=E " " WHERE (report_id=) " "RETURNING report_id AS id;"); _insertMql = new MetaSQLQuery("INSERT INTO (" " report_id, report_name," " report_grade, report_source, report_descrip" ") VALUES (" " DEFAULT, ," " , E," " ) " "RETURNING report_id AS id;"); ParameterList params; params.append("tablename", "report"); return Loadable::writeToDB(pdata, pkgname, errMsg, params); } R2_2_5/common/pkgschema.cpp0000644000175000017500000000762711667203026015235 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "pkgschema.h" #include #include #include // used by XSqlQuery::bindValue() #include #define TR(a) QObject::tr(a) #define DEBUG false QString PkgSchema::_sqlerrtxt = TR("The following error was " "encountered while trying to import %1 into " "the database:
%2
%3
"); PkgSchema::PkgSchema(const QString &name, const QString &comment) { _name = name; _comment = comment; } PkgSchema::~PkgSchema() { } int PkgSchema::create(QString &errMsg) { if (DEBUG) qDebug("PkgSchema::create(&errMsg)"); if (_name.isEmpty()) { errMsg = QString("Cannot create a schema for this package without a name."); return -1; } int namespaceoid; XSqlQuery create; // Issue 8835: This SQL looks for an existing schema first. Would be best if the createPkgSchema // function did this correctly so it could be smart enough to add new tables if necessary, // but we can't work that out until it becomes required in a subsequent xTuple ERP release. create.prepare("SELECT COALESCE( " " (SELECT oid " " FROM pg_namespace " " WHERE (LOWER(nspname)=LOWER(:name))), " " createPkgSchema(:name, :descrip)) AS result;"); create.bindValue(":name", _name); create.bindValue(":descrip", _comment); create.exec(); if (create.first()) namespaceoid = create.value(0).toInt(); else if (create.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_name) .arg(create.lastError().databaseText()) .arg(create.lastError().driverText()); return -2; } int patherr = setPath(errMsg); if (patherr < 0) return patherr; return 0; } int PkgSchema::getPath(QString &path, QString &errMsg) { XSqlQuery pathq; pathq.exec("SELECT CURRENT_SCHEMAS(false);"); if (pathq.first()) path = pathq.value(0).toString(); else { errMsg = _sqlerrtxt.arg(_name) .arg(pathq.lastError().databaseText()) .arg(pathq.lastError().driverText()); return -8; } if (DEBUG) qDebug("PkgSchema::getPath() selected %s", qPrintable(path)); path.remove(0, path.indexOf("{") + 1); path.remove(path.indexOf("}"), path.size()); if (DEBUG) qDebug("PkgSchema::getPath() extracted %s", qPrintable(path)); return 0; } int PkgSchema::setPath(QString &errMsg) { QString path; int result = getPath(path, errMsg); if (result < 0) return result; XSqlQuery schemaq; schemaq.exec(QString("SET SEARCH_PATH TO %1,%2;") .arg(_name.toLower()).arg(path)); if (schemaq.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_name) .arg(schemaq.lastError().databaseText()) .arg(schemaq.lastError().driverText()); return -8; } return 0; } int PkgSchema::clearPath(QString &errMsg) { QString path; int result = getPath(path, errMsg); if (result < 0) return result; path.remove(QRegExp("\\s*" + _name + ",", Qt::CaseInsensitive)); XSqlQuery schemaq; schemaq.exec(QString("SET SEARCH_PATH TO %1;").arg(path)); if (schemaq.lastError().type() != QSqlError::NoError) { errMsg = _sqlerrtxt.arg(_name) .arg(schemaq.lastError().databaseText()) .arg(schemaq.lastError().driverText()); return -9; } return 0; } R2_2_5/common/loadpriv.h0000644000175000017500000000231311667203026014543 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADPRIV_H__ #define __LOADPRIV_H__ #include "loadable.h" class LoadPriv : public Loadable { public: LoadPriv(const QString &nodename, const QString &name, const QString &module = "Custom", const bool system = false, const QString &descrip = QString::null); LoadPriv(const QDomElement &, const bool system, QStringList &, QList &); virtual QDomElement createElement(QDomDocument &doc); virtual bool isValid() const { return !_name.isEmpty() && !_module.isEmpty(); } virtual int writeToDB(const QByteArray &, const QString pkgname, QString &errMsg) { return writeToDB(pkgname, errMsg); } virtual int writeToDB(const QString pkgname, QString &errMsg); protected: QString _module; }; #endif R2_2_5/common/createtable.h0000644000175000017500000000174311667203026015204 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __CREATETABLE_H__ #define __CREATETABLE_H__ #include "createdbobj.h" class CreateTable : public CreateDBObj { public: CreateTable(const QString &filename, const QString &name, const QString &comment = QString::null, const QString &schema = QString::null, const OnError onError = Default); CreateTable(const QDomElement &, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: QString _relkind; }; #endif R2_2_5/common/loadimage.cpp0000644000175000017500000001102411667203026015177 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loadimage.h" #include #include #include #include #include #include // used by XSqlQuery::bindValue() #include #include "xsqlquery.h" #define DEBUG false LoadImage::LoadImage(const QString &name, const int order, const bool system, const bool /*enabled*/, const QString &comment, const QString &filename) : Loadable("loadimage", name, order, system, comment, filename) { _pkgitemtype = "I"; } LoadImage::LoadImage(const QDomElement &elem, const bool system, QStringList &msg, QList &fatal) : Loadable(elem, system, msg, fatal) { _pkgitemtype = "I"; if (_name.isEmpty()) { msg.append(TR("The image in %1 does not have a name.") .arg(_filename)); fatal.append(true); } if (elem.nodeName() != "loadimage") { msg.append(TR("Creating a LoadImage element from a %1 node.") .arg(elem.nodeName())); fatal.append(false); } if (elem.hasAttribute("grade") || elem.hasAttribute("order")) { msg.append(TR("Node %1 '%2' has a 'grade' or 'order' attribute " "but these are ignored for images.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } if (elem.hasAttribute("enabled")) { msg.append(TR("Node %1 '%2' has an 'enabled' " "attribute which is ignored for images.") .arg(elem.nodeName()).arg(elem.attribute("name"))); fatal.append(false); } } int LoadImage::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) { if (pdata.isEmpty()) { errMsg = TR("The image %1 is empty.") .arg(_name); return -2; } QByteArray encodeddata; if (DEBUG) qDebug("LoadImage::writeToDB(): image starts with %s", pdata.left(10).data()); if (QString(pdata.left(pdata.indexOf("\n"))).contains(QRegExp("^\\s*begin \\d+ \\S+"))) { if (DEBUG) qDebug("LoadImage::writeToDB() image is already uuencoded"); encodeddata = pdata; } else { // there's just GOT to be a better way to do this QImageWriter imageIo; QBuffer imageBuffer; imageBuffer.open(QIODevice::ReadWrite); imageIo.setDevice(&imageBuffer); imageIo.setFormat(_filename.right(_filename.size() - _filename.lastIndexOf(".") - 1).toAscii()); if (DEBUG) qDebug("LoadImage::writeToDB() image has format %s", imageIo.format().data()); QImage image; image.loadFromData(pdata); if (!imageIo.write(image)) { errMsg = TR("Error processing image %1: " "
%2
") .arg(_name).arg(imageIo.errorString()); return -3; } imageBuffer.close(); encodeddata = QUUEncode(imageBuffer).toAscii(); if (DEBUG) qDebug("LoadImage::writeToDB() image was uuencoded: %s", encodeddata.left(160).data()); } _selectMql = new MetaSQLQuery("SELECT image_id, -1, -1" " FROM " " WHERE (image_name=);"); _updateMql = new MetaSQLQuery("UPDATE " " SET image_data=E," " image_descrip=" " WHERE (image_id=)" " RETURNING image_id AS id;"); _insertMql = new MetaSQLQuery("INSERT INTO (" " image_id, image_name, image_data, image_descrip" ") VALUES (" " DEFAULT, ," " E," " " ") RETURNING image_id AS id;"); ParameterList params; params.append("tablename", "image"); return Loadable::writeToDB(encodeddata, pkgname, errMsg, params); } R2_2_5/common/script.h0000644000175000017500000000346511667203026014240 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __SCRIPT_H__ #define __SCRIPT_H__ #include #include class QDomDocument; class QDomElement; #define TR(a) QObject::tr(a) class Script { public: enum OnError { Default = 0, Stop, Prompt, Ignore }; Script(const QString & name = QString::null, OnError onError = Default, const QString & comment = QString::null); Script(const QDomElement &, QStringList &msg, QList &fatal); virtual ~Script(); virtual QDomElement createElement(QDomDocument &); virtual bool isValid() const { return !_name.isEmpty(); } virtual QString filename() const; virtual QString name() const { return _name; } virtual void setName(const QString & name) { _name = name; } virtual OnError onError() const { return _onError; } virtual void setOnError(OnError onError) { _onError = onError; } virtual QString comment() const { return _comment; } virtual void setComment(const QString & comment) { _comment = comment; } virtual int writeToDB(const QByteArray &data, const QString annotation, QString &errMsg); static QString onErrorToName(OnError); static OnError nameToOnError(const QString &); static QStringList onErrorList(bool includeDefault = TRUE); protected: QString _name; QString _comment; OnError _onError; static QString _sqlerrtxt; }; #endif R2_2_5/common/loadappscript.h0000644000175000017500000000204311667203026015570 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADAPPSCRIPT_H__ #define __LOADAPPSCRIPT_H__ #include "loadable.h" class LoadAppScript : public Loadable { public: LoadAppScript(const QString & name, const int order = 0, const bool system = false, const bool enabled = true, const QString & comment = QString::null, const QString &filename = QString::null); LoadAppScript(const QDomElement &, const bool system, QStringList &, QList &); virtual int writeToDB(const QByteArray &, const QString pkgname, QString &); protected: bool _enabled; }; #endif R2_2_5/common/package.cpp0000644000175000017500000003362611667203026014664 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "package.h" #include #include #include #include #include #include "createfunction.h" #include "createtable.h" #include "createtrigger.h" #include "createview.h" #include "data.h" #include "loadcmd.h" #include "loadappscript.h" #include "loadappui.h" #include "loadimage.h" #include "loadmetasql.h" #include "loadpriv.h" #include "loadreport.h" #include "prerequisite.h" #include "script.h" #include "finalscript.h" #include "initscript.h" #include "xsqlquery.h" #include "xversion.h" #define DEBUG false Package::Package(const QString & id) : _id(id) { } Package::Package(const QDomElement & elem, QStringList &msgList, QList &fatalList) { if (elem.tagName() != "package") { msgList << TR("The root tag must be 'package' but this package has a root " "tag named '%1'").arg(elem.tagName()); fatalList << true; } if (elem.hasAttribute("updater")) { // _version = updater/builder application global XVersion updaterversion(_version); if (! updaterversion.isValid()) { msgList << TR("Could not parse the application's version string %1") .arg(_version); fatalList << true; return; } XVersion requiredversion(elem.attribute("updater")); if (! requiredversion.isValid()) { msgList << TR("Could not parse the updater version string %1 required " "by the package") .arg(elem.attribute("updater")); fatalList << true; return; } if (updaterversion < requiredversion) { msgList << TR("This package requires a newer version of the updater " "(%1) than you are currently running (%2). Please get " "a newer updater.") .arg(elem.attribute("updater")).arg(_version); fatalList << true; return; } } _id = elem.attribute("id"); _name = elem.attribute("name"); _developer = elem.attribute("developer"); _descrip = elem.attribute("descrip"); if (DEBUG) qDebug("Package::Package() - _name '%s', _developer '%s' => system %d", qPrintable(_name), qPrintable(_developer), system()); if (elem.hasAttribute("version")) { _pkgversion.setVersion(elem.attribute("version")); if (! _pkgversion.isValid()) { msgList << TR("Could not parse the package version string %1.") .arg(elem.attribute("version")); fatalList << true; return; } } else if (! system()) { msgList << TR("Add-on packages must have version numbers but the package " "element has no version attribute."); fatalList << true; return; } QStringList reportedErrorTags; QDomNodeList nList = elem.childNodes(); for(int n = 0; n < nList.count(); ++n) { QDomElement elemThis = nList.item(n).toElement(); if (elemThis.tagName() == "createfunction") _functions.append(new CreateFunction(elemThis, msgList, fatalList)); else if (elemThis.tagName() == "createtable") _tables.append(new CreateTable(elemThis, msgList, fatalList)); else if (elemThis.tagName() == "createtrigger") _triggers.append(new CreateTrigger(elemThis, msgList, fatalList)); else if (elemThis.tagName() == "createview") _views.append(new CreateView(elemThis, msgList, fatalList)); else if(elemThis.tagName() == "loadmetasql") _metasqls.append(new LoadMetasql(elemThis, system(), msgList, fatalList)); else if(elemThis.tagName() == "loadpriv") _privs.append(new LoadPriv(elemThis, system(), msgList, fatalList)); else if(elemThis.tagName() == "loadreport") _reports.append(new LoadReport(elemThis, system(), msgList, fatalList)); else if(elemThis.tagName() == "loadappui") _appuis.append(new LoadAppUI(elemThis, system(), msgList, fatalList)); else if(elemThis.tagName() == "loadappscript") _appscripts.append(new LoadAppScript(elemThis, system(), msgList, fatalList)); else if(elemThis.tagName() == "loadcmd") _cmds.append(new LoadCmd(elemThis, system(), msgList, fatalList)); else if(elemThis.tagName() == "loadimage") _images.append(new LoadImage(elemThis, system(), msgList, fatalList)); else if (elemThis.tagName() == "pkgnotes") _notes += elemThis.text(); else if(elemThis.tagName() == "prerequisite") _prerequisites.append(new Prerequisite(elemThis)); else if(elemThis.tagName() == "script") _scripts.append(new Script(elemThis, msgList, fatalList)); else if(elemThis.tagName() == "finalscript") _finalscripts.append(new FinalScript(elemThis, msgList, fatalList)); else if(elemThis.tagName() == "initscript") _initscripts.append(new InitScript(elemThis, msgList, fatalList)); else if (! reportedErrorTags.contains(elemThis.tagName())) { QMessageBox::warning(0, TR("Unknown Package Element"), TR("This package contains an element '%1'. " "The application does not know how to " "process it and so it will be ignored.") .arg(elemThis.tagName())); reportedErrorTags << elemThis.tagName(); } } if (DEBUG) { qDebug("Package::Package(QDomElement) msgList & fatalList at %d and %d", msgList.size(), fatalList.size()); qDebug("_functions: %d", _functions.size()); qDebug("_tables: %d", _tables.size()); qDebug("_triggers: %d", _triggers.size()); qDebug("_views: %d", _views.size()); qDebug("_metasqls: %d", _metasqls.size()); qDebug("_privs: %d", _privs.size()); qDebug("_reports: %d", _reports.size()); qDebug("_appuis: %d", _appuis.size()); qDebug("_appscripts: %d", _appscripts.size()); qDebug("_cmds: %d", _cmds.size()); qDebug("_images: %d", _images.size()); qDebug("_prerequisites: %d", _prerequisites.size()); qDebug("_scripts: %d", _scripts.size()); } } Package::~Package() { } bool Package::system() const { return _name.isEmpty() && (_developer == "xTuple" || _developer.isEmpty()); } QDomElement Package::createElement(QDomDocument & doc) { QDomElement elem = doc.createElement("package"); elem.setAttribute("id", _id); elem.setAttribute("version", _pkgversion.toString()); for(QList::iterator i = _prerequisites.begin(); i != _prerequisites.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _privs.begin(); i != _privs.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _metasqls.begin(); i != _metasqls.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _scripts.begin(); i != _scripts.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _reports.begin(); i != _reports.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _appuis.begin(); i != _appuis.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _appscripts.begin(); i != _appscripts.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _cmds.begin(); i != _cmds.end(); ++i) elem.appendChild((*i)->createElement(doc)); for (QList::iterator i = _images.begin(); i != _images.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _finalscripts.begin(); i != _finalscripts.end(); ++i) elem.appendChild((*i)->createElement(doc)); for(QList::iterator i = _initscripts.begin(); i != _initscripts.end(); ++i) elem.appendChild((*i)->createElement(doc)); return elem; } bool Package::containsReport(const QString & reportname) const { QList::const_iterator it = _reports.begin(); for(; it != _reports.end(); ++it) { if((*it)->name() == reportname) return true; } return false; } bool Package::containsScript(const QString & scriptname) const { QList::const_iterator it = _scripts.begin(); for(; it != _scripts.end(); ++it) { if((*it)->name() == scriptname) return true; } return false; } bool Package::containsFinalScript(const QString & scriptname) const { QList::const_iterator it = _finalscripts.begin(); for(; it != _finalscripts.end(); ++it) { if((*it)->name() == scriptname) return true; } return false; } bool Package::containsInitScript(const QString & scriptname) const { QList::const_iterator it = _initscripts.begin(); for(; it != _initscripts.end(); ++it) { if((*it)->name() == scriptname) return true; } return false; } bool Package::containsPrerequisite(const QString & prereqname) const { QList::const_iterator it = _prerequisites.begin(); for(; it != _prerequisites.end(); ++it) { if((*it)->name() == prereqname) return true; } return false; } bool Package::containsAppScript(const QString &pname) const { QList::const_iterator it = _appscripts.begin(); for(; it != _appscripts.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsAppUI(const QString &pname) const { QList::const_iterator it = _appuis.begin(); for(; it != _appuis.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsImage(const QString &pname) const { QList::const_iterator it = _images.begin(); for(; it != _images.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsCmd(const QString &pname) const { QList::const_iterator it = _cmds.begin(); for(; it != _cmds.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsFunction(const QString &pname) const { QList::const_iterator it = _functions.begin(); for(; it != _functions.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsMetasql(const QString &pname) const { QList::const_iterator it = _metasqls.begin(); for(; it != _metasqls.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsPriv(const QString &pname) const { QList::const_iterator it = _privs.begin(); for(; it != _privs.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsTable(const QString &pname) const { QList::const_iterator it = _tables.begin(); for(; it != _tables.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsTrigger(const QString &pname) const { QList::const_iterator it = _triggers.begin(); for(; it != _triggers.end(); ++it) { if((*it)->name() == pname) return true; } return false; } bool Package::containsView(const QString &pname) const { QList::const_iterator it = _views.begin(); for(; it != _views.end(); ++it) { if((*it)->name() == pname) return true; } return false; } int Package::writeToDB(QString &errMsg) { XSqlQuery select; XSqlQuery upsert; QString sqlerrtxt = TR("The following error was " "encountered while trying to import %1 into " "the database:
%2
%3
"); if (_name.isEmpty()) return 0; // if there's no name then there's no package to create int pkgheadid = -1; select.prepare("SELECT pkghead_id FROM pkghead WHERE (pkghead_name=:name);"); select.bindValue(":name", _name); select.exec(); if (select.first()) { pkgheadid = select.value(0).toInt(); upsert.prepare("UPDATE pkghead " " SET pkghead_name=:name," " pkghead_descrip=:descrip," " pkghead_version=:version," " pkghead_developer=:developer," " pkghead_notes=:notes " "WHERE (pkghead_id=:id);"); } else if (select.lastError().type() != QSqlError::NoError) { QSqlError err = select.lastError(); errMsg = sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -1; } else { upsert.exec("SELECT NEXTVAL('pkghead_pkghead_id_seq');"); if (upsert.first()) pkgheadid = upsert.value(0).toInt(); else if (upsert.lastError().type() != QSqlError::NoError) { QSqlError err = upsert.lastError(); errMsg = sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -2; } upsert.prepare("INSERT INTO pkghead (" " pkghead_id, pkghead_name, pkghead_descrip," " pkghead_version, pkghead_developer, pkghead_notes" ") VALUES (" " :id, :name, :descrip, :version, :developer, :notes);"); } upsert.bindValue(":id", pkgheadid); upsert.bindValue(":name", _name); upsert.bindValue(":descrip", _descrip); upsert.bindValue(":version", _pkgversion.toString()); upsert.bindValue(":developer", _developer); upsert.bindValue(":notes", _notes); if (!upsert.exec()) { QSqlError err = upsert.lastError(); errMsg = sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText()); return -3; } return pkgheadid; } R2_2_5/common/data.h0000644000175000017500000000126711667203026013643 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADER_DATA_H__ #define __LOADER_DATA_H__ #include extern QString _name; extern QString _copyright; extern QString _version; extern QString _user; extern int _usrid; extern bool _evaluation; extern bool _loggedIn; #endif R2_2_5/common/loadable.h0000644000175000017500000000564411667203026014500 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __LOADABLE_H__ #define __LOADABLE_H__ #include #include #include "script.h" #include class QDomDocument; class QDomElement; #define TR(a) QObject::tr(a) class Loadable { public: Loadable(const QString &nodename, const QString &name, const int grade = 0, const bool system = false, const QString &schema = QString::null, const QString &comment = QString::null, const QString &filename = QString::null); Loadable(const QDomElement &, const bool system, QStringList &, QList &); virtual ~Loadable(); virtual QDomElement createElement(QDomDocument &doc); virtual QString comment() const { return _comment; } virtual QString filename() const { return _filename; } virtual int grade() const { return _grade; } virtual bool isValid() const { return !_nodename.isEmpty() && !_name.isEmpty();} virtual QString name() const { return _name; } virtual QString nodename() const { return _nodename; } virtual Script::OnError onError() const { return _onError; } virtual QString schema() const; virtual void setComment(const QString & comment) { _comment = comment; } virtual void setFilename(const QString &filename){ _filename = filename;} virtual void setGrade(int grade) { _grade = grade; } virtual void setName(const QString & name) { _name = name; } virtual void setOnError(Script::OnError onError) { _onError = onError; } virtual void setSystem(const bool p) { _system = p; } virtual bool system() const { return _system; } virtual int writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg) = 0; static QRegExp trueRegExp; static QRegExp falseRegExp; protected: QString _comment; QString _filename; int _grade; bool _inpackage; MetaSQLQuery *_insertMql; MetaSQLQuery *_selectMql; MetaSQLQuery *_maxMql; MetaSQLQuery *_minMql; QString _name; QString _nodename; Script::OnError _onError; QString _pkgitemtype; QString _schema; bool _system; MetaSQLQuery *_updateMql; virtual int writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg, ParameterList ¶ms); static QString _sqlerrtxt; }; #endif R2_2_5/common/initscript.h0000644000175000017500000000160611667203026015117 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __INITSCRIPT_H__ #define __INITSCRIPT_H__ #include "script.h" class InitScript : public Script { public: InitScript(const QString & name = QString::null, OnError onError = Default, const QString & comment = QString::null); InitScript(const QDomElement &, QStringList &msg, QList &fatal); virtual ~InitScript(); virtual QDomElement createElement(QDomDocument &); protected: QString _nodename; }; #endif R2_2_5/common/finalscript.h0000644000175000017500000000161411667203026015244 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef __FINALSCRIPT_H__ #define __FINALSCRIPT_H__ #include "script.h" class FinalScript : public Script { public: FinalScript(const QString & name = QString::null, OnError onError = Default, const QString & comment = QString::null); FinalScript(const QDomElement &, QStringList &msg, QList &fatal); virtual ~FinalScript(); virtual QDomElement createElement(QDomDocument &); protected: QString _nodename; }; #endif R2_2_5/common/data.cpp0000644000175000017500000000174511667203026014177 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "data.h" #include #if defined Q_WS_WIN QString _name = QObject::tr("Update Manager for Windows"); #elif defined Q_WS_X11 QString _name = QObject::tr("Update Manager for Linux"); #elif defined Q_WS_MAC QString _name = QObject::tr("Update Manager for Mac"); #else QString _name = QObject::tr("Update Manager"); #endif QString _copyright = QObject::tr("Copyright (c) 2004-2011 OpenMFG, LLC., d/b/a xTuple."); QString _version = QObject::tr("2.2.5"); QString _user; int _usrid; bool _evaluation = FALSE; bool _loggedIn = FALSE; R2_2_5/common/common.pro0000644000175000017500000000332611667203026014571 0ustar danieldaniel# # This file is part of the xTuple ERP: PostBooks Edition, a free and # open source Enterprise Resource Planning software suite, # Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. # It is licensed to you under the Common Public Attribution License # version 1.0, the full text of which (including xTuple-specific Exhibits) # is available at www.xtuple.com/CPAL. By using this software, you agree # to be bound by its terms. # include( ../global.pri ) TEMPLATE = lib CONFIG += qt warn_on thread staticlib TARGET = updatercommon DESTDIR = ../lib OBJECTS_DIR = tmp MOC_DIR = tmp UI_SOURCES_DIR = tmp FORMS = licensewindow.ui HEADERS = data.h \ package.h \ createdbobj.h \ createfunction.h \ createtable.h \ createtrigger.h \ createview.h \ finalscript.h \ initscript.h \ script.h \ licensewindow.h \ loadable.h \ loadappscript.h \ loadappui.h \ loadcmd.h \ loadimage.h \ loadmetasql.h \ loadpriv.h \ loadreport.h \ pkgschema.h \ prerequisite.h \ xversion.h SOURCES = data.cpp \ package.cpp \ createdbobj.cpp \ createfunction.cpp \ createtable.cpp \ createtrigger.cpp \ createview.cpp \ finalscript.cpp \ initscript.cpp \ script.cpp \ loadable.cpp \ loadappscript.cpp \ loadappui.cpp \ loadcmd.cpp \ loadimage.cpp \ loadmetasql.cpp \ loadpriv.cpp \ loadreport.cpp \ pkgschema.cpp \ prerequisite.cpp \ xversion.cpp QT += xml sql R2_2_5/images/0000755000175000017500000000000012220571335012525 5ustar danieldanielR2_2_5/images/updater-128x128.png0000644000175000017500000005670011667203025015644 0ustar danieldaniel‰PNG  IHDR€€Ã>aËtEXtSoftwareAdobe ImageReadyqÉe<]bIDATxÚ콜\gy.þœ2}f{_iÕ›-WlƒmÜé †PB¹@¸¡'pIò#ùrsS K ¡Ùt‚6¶)¶qïV[i%íJÛwvz=íû¿ï÷33»ZI+[¶áw3öÑÔ9ç{ÛóÖO=8ƒ§ã¦ë:*Õ*>þ©}ñÆõÃï»è‚sβmÇ><1953;?—Éä&²¹Â¾l.?éºÎ¤˜Ð4dè/=MˆD"‡C¨Vkp¡P}¨^· ‡!èq¥^GŒ>g誵:}>LŸ3åç5ú2þ¾ñs>øœ Ã@­V£÷ù±.¿_7MC>æ÷ù±ã¸ò}Ã0é³€à/¢ßŒÅbò»,Ë’çcè\×¥C£ëzò}>wÏp=!3¤¾ƒ>¯~Ëä/“Ÿõ<^ÓäùðwòïóoéüOðvãÿ &ž¦~²X,ýÓó®¾ô¯zå‹u^<¾Xº »´0¥RÅR ù\³óéÊÌÜüÂÜ|z~q1{h~aq_©\9DD˜°,{ܶ­Z¼ŠçÓ3MIàÿ¾üöô1€®¿´P(¾{Ó¦Éù,ÉÌvH%chK%0<ØÛ6ÇéužðÖ‘$_ÈÒ\*”0»°è.¤ ó‹éùtzlvnáiÉZ­~˜ë1Ç¢¡i $-5z,¥‡5Àß~ €nÝL»n+“IJJ5éÈçË(–«R…Æ¢$âQI8–i~EÑÕцuë† z'©ÒN˶¶X¶ýÂR©Œôb‹™l9ΧgçÆçæŽd²¹IÒ*£¥ryŒ˜a¾lŠ~4Ú‚KjŸÿµÆÓÇBL"jÝ®K{f’Ô×ÉÆýç/îÅ#»>¨I;F‘ôµAWGJí)ùZ2AïÅcÄ4t:˜1˜Yúûz˜˜ 2% 2 dKŸU.—AÚ¹|dFJ³só³dJf2Ùüx6›ÛK¯°çÃiybN›m1Ûz6ÉBÿͧ•þ@Ý$U®–$È1I–¿}ïñó_Ý' Éf€O™4Á|:+Í„PM¾†IðE{[’1’h'FIµÅÑA÷ñX„ˆ"eÒûít´Ñïj,íIú¾Ít¿¹R©]V,Wèw*H§Â dVè–=¼ÎìÉd³õº}Ô²ê‰1‰)ržgZ Ðb<y¿Ëšãéc!,Vë¶mKÂVÈ®?²ëBÄ©dͱAÈþÓ¥ê:ãD‚|^# Q%/(àè´ Â–„ÍJ„v8lJhO¥$ƒ´1“ƒtÐ}Š˜# I$ÎL'­ÞnlÚ0bÒ¹ Ò÷ Öêõ¤…~¯Z©!É‚¸"¿˜ÉåæÒ“Ä(‡ÈÌe¬AØeÝ“IÑÒt^yf8=›ñß pÂ[•‰Å®/?Ö„ Û"“r•’°’]0Éu \;»†0°j6¹X.y ô‡ÂR¥$s€þÖ&SB‹R±ŒÙ¹ŒÄüÓwÛBäÆ%1 4“tßž"ÍÑž æHJ“‹1SÄ —.c ¿ú™ÛÚé{Úë–½ŽpË¥UrÉ|YÉ Â………Åi:Žæ Å#…bq/ÜÑZÝš´<{Ž˜|Ax®+ñ†§¼!Äÿó P#UîÒ‚¼(L”©¡^-#ëÆ ^|Û ÚCâ!6½†¤SEØ­!îTÐ^Ë!\+B#"Ⱦ;•2êd.ìš—ì6Ûnf¶Ü†ÆZCgn¡÷ø}Ž Ô°@`Qr™ ?C ‡È¬æˆ“fH&âR{´c0a|ÁL—Lźd›6®c…ÔNX£üý졊%0Ídr3y(S¹\~.—Ïï&¦9X«V§ˆ ÆëukŽh‰]~ÀÒÀ=Åæäé4eoIUÌ#{jè$™!ÂT±’°D12³pÑN‹’ “4&D HB¹´NÝGéy b¨söpjЋyØD„2¡š/Á*Q-Uˆ9jðÈtXƒØ.\!q&+ M™˜ºWC>—~pGS€… Ã&# “ù+ÍÁ¦…11 ƒRföR:ÚÚÐÛÓ-›7˜Äs#¤ãF¬º…R¥òòJ¥Š,i…32dIr³¹lnŒ°Æ8™’#¤-öÑý¤¦‰<ñf™íš 8iOŠÖxzM€I à‰˜ã:*²grä[€8üƇ/ƸTÙR¤:¢IÓC˜Äº#Bb=×!âEÌ’"Hœ¢sH¾¿†˜#ʰÁ³Qµbˆ*Š9fŒ’4V>‡yUb:1‹A¿ÍØ¢f¹MiÔè4ÉÄX–盈†ç÷h²cI&ãÄ1ßÌÄÑ–PÌ˦¥˜£¯·;¶oí¦¯î&Ïc[½V¿‚5R._$÷5C§•/‘;E@t<—Ë®T«k ­Á 2M¦.¯›æï<T ݨ³=äèKN(D P«¢Lº÷+hëý Š½Û‰ Kb&G-’B%”€FŒaÐçubRˆÑ•¤ˆ!†ò1â†@/1Ìš¸ŽþX}ÉF:cì’¤L4.¤(ØФ ŠÄWêEtÔKDˆ2y¤ÉÆJ(*(‘ya Z¯;*^¥É¤§Ân(™x´X´†¼Y‚£¨FD‚N6/’9RqÉ( F™1Ö® kºÖEæ«‹LÙYuÒVb v_ WXÓ3³£<ô𿑉ùÿîï:T `;ò^œJ¹Hjž¤Tq´t7bãw£ŸÌƒ‰Â Eá˜1Ô b€xZ,EŒÑŽ|¤õp n4NÌ’D%ÒŽJ8AR"èo=T=î%u°¶ØÚ lëF¤A"Š@¡÷8¹‰g…uX9J™'"”È#à5»¥‹™6kÁ >Vº¹tîerG«Õºd–ÙKl 2/™l‘îù(5’MÁ¹ûàB~G©H’î+á¦,cw™5ÄÛ6`ÛÖuؼy#ÎØ±ý­÷Þ÷À¿“ɱžTà“e¢ÿúö;±}Ûf ôK5w:4Ù2‹/RøÖôÒg]€?~Ëëð™/|EfðT¶N—‹¥\¼€ð-‡ Ñ=ùÞ@ 5õò5‘‘ë‹$ÃôÀÕ$FñØžk&IfÓ¤5“)$Iúô¤0ÕÛ&ÃÌÝÝèêì”Éî`"©¤’UyëÍ FmK¥äÑßò F–¼ïÐ _Üsß#øÞ ·“ ±¥V`í Ãþ5ñ‰j¾FP÷ü:›GZ9PuûKf8sû&¬Y3´ùÞûxR€¹–%ÿû?ºAÚ­×¾êZâ¾­ôšóD€Cis8»kòºçÛÞ„´ˆßúö÷°otŒ$«¬Ò¦œõQ0’ÏKR½ªÕ ÿÞOªYMo‚9‚ä 7Ÿòë:i”Ò¨§‰mè7æèûÔÔ÷é~Ì€ÓÉ ĵ±Z&ÔÏ¡hŽ,ötuHFáØ¿Ï¦¶TRA>¹À¤Þ;;;ð‚ç=>²÷?vHbÔl^Óµ«Ǯ¦µh Ña÷ރرuá…îöp$²™è0ñD\ÇU›Ž¨8ˆ/|ù?ð÷ÿûÍr~ú 2@…ÃÁµºúI`zõϽW_qÇääÇîI­æÉÓAˆ½D.^¡È #õ˜%Œ’¥ÍuHj8'séBJ¬aŠ ºO\~} ±v Es^^êaú‡ü0’¾R©€ÙYå† I#]æ/4;ÐØ6˸@\1Å$mIÉ(=Ý]~Ú“Eϵ`Õ½¥-ÐúRfP„Õ|>Ñe)_ÈËF__¯‹FÏÍfs·r}“Î,{lób>ü±ÏàïÚè"9Íú8oìÊWxñkõºÒ6šZd—tF;¶m‘DZø¨Óï²KV“ȼÞjù"¡å|A‚³R©$k =ËàL}±H®^–ÃQG›§»LͱUž¡¡Q´%LB.«ÿØ&F1€P’Iî£eñïû¾ºâeÚ„2_ü·AAŠe9Šy|‰oÕRiS¯·h™µÄðEº¦ º»Ú9Ö°ƒéaO4À ©Äƒ‡ã#Ÿø,þü}ï$&xBš Ä® ùÁK0¤¼0‹x ö“aß pMº^f_#F.`íðá±¾s÷Žî“†³ž2àÓŸÀÇ?ý¼ï=o—àÈy<Þ¦•í×jÐBÏ?Où×@HíbúŒc(ó$M‹ÒòÞ75|Ï °\.'½¤ÁaÂ(}áph2¸Æ§,À¶îÐá#øÜ¿ŠüÙŸÀj”t’0Z0ßX›pÔNŸ¿‘…QD.x5eç <¨€ 8Æ¿„ø²ÀÎUÙC4F …cþÖÿ;ßiZãïØô1Óû°O5þ>ø;º1©Õ•YbóX—IãðúfM#5ÌDìQU¤Y“ù^j*Â3Òz>Cú¦%‰’úvx¨€àvZ³ÉÇxB >㿺ƒPîUòN1^]6LF·µ@ôå‚G¦@¾üÝSúúó±ã•W@ïë‡ÐIjɧ×"äÔER@ˆ¼PJ"Ä~zL’Ñ­áä*|"¤=ˆ _cøÌàûÜŠ˜!EcÁÕg„òT˜É±”ÙÌã‰Æµ‡¤ïjȤ\»àÿ޵ {X61<‡Ãù1›*^Çr¥**•²&D2 1K¹JÒlÙ´AFOú{tÄíÕJí˜ÚSÏš,ã2ðµo\/íÕs¯¹’N¶²j& ..³`9Íua›ÞÛÛKÈ ›/ÂÜlõ¿þ(λ†ÞLÐß8D2 0cÐB$•Qz1FŒ æˆwAK‘3¾¦è~Dl3­²-n ºa5ÿUü²&ÙC›TqD’@¾xËÄ‘Ráá• ` f³”jÓ¨÷e™™Ÿ®V <‡E#—À ‹+ƒ™iø78¦ÀOøLÓÔ8 qä4D¦‚½Œîî®óÓ™Œ4OK(X&Bˆãÿã›ß•þœ«.“*m5L@¾}Qšš¦ƒ]š(Ù³ó—?»lƯ¿‚³ŸCŸ ›ðl.)A¤£à©U ˆÉ7tÁ¸4 ¯ÿÏà%ÖAc Á’+ÿ ˜@‰¦æ/*{åôî4RÐ{ð ]À¡÷˜7Mú|‚˜I”‰N¿§5-:ǃy’DÝ¥… ÍàÉÏøŒà3†!4Y࢞+Òí`¡\á@[Á¯•~`K÷1C$¬2§!3Œžžî³÷îÛOˆX¸O LÀ&è×}_^ÈÕW<{µLP‘dÛÇh–þþ~ûöbášãQ^€›¿‚W i„#–GlW¤ÌÑw|ú³hñÿ‚´ÃZÉ,óz`ß} Á ‹Õnvò(îLño[†15*P;ä"f(©c/+ÑÐIV¦#ª£‹ÞèI蘻k ;{ÞtQ7©po (ž$©×›…+*?àùx‰?ãk!=0G²ëÁ7^#. רPÞ…*jñûHu ¬‹D"ÑHøÈÓš Rˆøöw~(/æÊË/–È'.Œ*±ú³wóB¹ýr´Ñý˜»òxD#—ê–ÏãÌç’$³ºd&hHsKx‰L„8°@'õ}èÇáõý 1Á0½ç6€`pÎüýÙ…9ŒÍÌã{#ga&„©{ ”:¾ÏÙп­¾pxø(^bíÅÇþáYÒ‹Ð%1Ù£PÒÏ„'[ÕÔ²ò˜í¾—¬ „î©çö¥oJú56F~L@— O?F៪R­cx˜€€®m"!:òx"‚§5(5Äußý¡ô·/¿ôb© ŽûyM«òâ²P0K‘,»ECƒƒò;½½£d®ÁCä··~ÛŸgÊlŸ×Ð R™&áƒýiè‘ë¡=#Dy/a‚åRq4ßê²9˜À÷z7âŽRÒwW}&Ò–9¿>3påN¦‚Í“â“ÿ|A8ªu[¹i@ÃóÐuÑðØø° `­à2… àk o8 \ @ÄøJAé<1@&[’X »³“1ùÙ\þ—AUÑÓšV˜ „ï|ÿ'Ò¶_véEªéc% @&€/”Ý%w¾14¤ Ò/þ}ÜOXÜtv¼( =JŒ`*@,Õ8zbï¤) ÐjZdf‡Ž~k¿¸yÃ6mD©bùÁNú’¬JÐ2Ñý{~É@ |¯B4Á¦ð™-puÄךáa6Uv+«5©%9$ßÕÕyA6—ÃãqŸ”z€~ï‡7HɾìÒg’ SYɨòõZ–£qìþxgÃß744¨Ôäèb‚kñ—dßøMl{E/iºpÛ7¯öÔ*z`tp໤IÞMžBê´€ d÷ï6Âøvj+¦o³ =H7 "– ¿¡îõ2'Gâ ðÒ= Õš-Õ³MNL°F<"oû¸¾kÉZSC¬Œ—TŒjIæ“…Š¥_þ—©EÂ\´ºetÿX„Ö©þ[S0Á~üS”‹y\}Õ22¶ÒU8Ä$!n’<ÑFÃÃÃRÚöî'Mð’—áÖúɰñ÷‡áqÇö–ªl‘ôý‹Ðã·Ð“0}ìm˜ÏU°ëà<>]ØŽýÜ2Q‡%¤OÒÎzÜhÊeIÒUjÉ@>’Ǻ]ãŸ>|µ,W—*ÁGè>to¦tµ¥”Ô4Ñd’ƹùÌ ýf‰@Sûøfø`5)€Lšé†íY;¼Éqݵ†gŒj-ú“Z$@>÷ùÏJî½äâg.ÏThñXÙ†8‹w²Ç†‡‡¤§±gt‹×¾w½í? ¯Ù,Màz>¹‚š1aß'`¨ÇCoÅ0»p>¡è"6Ýr Ë\¸,Fƒ[ œµÕÄù) ]¦2ùÌškB:>øÞ[ð7o݉ž.’~«é££,6#?Kmë Z#öÄ&š¡M±Ü­a€©k2±˜-Àb—د¡ÜžÞÎx,ºŽ´Èةƞô’0f.ìøÎ~ŒŽŽlß¶EƳ}ÄZ• ày>c$Võ}CCCì;p‹¯}3,ëu·aã›ÏV'dÔ*4“Ê<«‰CYDÎx›ô2æÙxí M”®û%nyˆå›±8kánùóÝ:úbJo á¦/=ˆË7…pùeÛQcÐ×Sq¬ÞÖVÔæÇ¼.ž´ƒŸÐ<†²ûeBû¹\ ¶«ZÅ›Á…%úz»µT2yÞÜüü­Æ)‹>%5AUíM7ßÂ'+ãê¾ï_¡÷ØœRZ™!k×®• ´ïÀÒ¯}îü:ýÎõ`ý›/‚V#°œÉòÔ‚±V`w4ÞÍ\è<„HúÿèÕ=°¿u#~}ÏóP¾h &¹Š¸,p4®!ÑÆþŸÍ öÀ>|ú__&m°doiK´õÒ¬&Žõ$šI@4È'h`—‡i~Ö•³9N8•kªëIvGù0‘ã„Ò³2±ÕÝÝyÆÜ‚üÌoeQh(Âáñ |éß¾Š7¿ñ ˆ“ûdÕ­ ©u‡9,ûÔê &àiì ßøfÜù¥:ôïìÁÈ[®€(V8Àà'†Z°«Ù"q¾ŽÞ‘N<Ã~÷ëÏ›¯í†}ýÏpçý:Šçl„“¯#ßNPmª†èw›>z)É1®¤ƒ|?}©í_9:Õò™†„{ ó CZŸÅØØ ˜Ã‘(6lÚ&{YêE€k5$ˆfH™›YÖ®>k÷žý¨¬’pžÊ‡9A@®³^·¶ã„I k,½«muâÂÒC‡ãÿñÿÈX?×Ú-©{ê `f‚­›6¢+‘€÷–·â®ô0&¿v´¡ ä# ±n Þ«îåãõ‚ÞžN¼ãûpaùgpöM¢2Ba>Œùë¿{íl?s½ŒöI¿QUøèÍtmãé]M† ájz3°£\ÇÀÏ×%CóyúÞÌpT¦ÛõË[eΪ–PëÖ­“>÷~‹ÿóøÍÿ/1ÁÏ1ôÞ7Cd2ÄV³ˆÀ·¡Ò—ΩÞ5›8Úx'í{6þäÕÀ'~ühäVþó×ßi¬—«Ì'ØÂ§ù5ÏgPÉáðP(¢fø-çÝÝ]ÈdÒATH™dáJàH e‚8ˆÖßßk$âñ ™ÌÍæ)ø‚«`´W*•­êä&In~”õø±"шr¯èy/;…aó\7Æ%FXG r.k€£G&05y¥b;ÏØaŠE‡¼0 sН“5l®‚c«dSê,ùl[8uÓ­w`ÿØ„ßå²Ô*É>|"„á7KÊâMYµêÙ(ÉölŽgs3%ƒ¤I‰fë§Z5A|g§˜ÅŽBë#â†IÑÄE30ÃRÒÙæ÷ÜqóO ‘½­ì¹3ë.Âæ—¼V8tZ@ƒr:ƒBÎ’sÉ—î©v„„‰Sr+ò$yú 3Äb:¾¾~YŸ(}ÑeMSÞÊá¡þu´®#¦i>n pHýجÆ9 595‹c‡}ŸT‡ãé-¡NŪĺ”\Êš6Û®¡Z)«ªLºRdÜPÑÓÝ)[«N×wûž³x+ú_KýÌWùœ*%Ó¤h"ðnüÄ7? sxµ©á“k^`š²O]9pöŠOFǺ®,Öwg ÓIx T>B¨;aÔèÞv Ô]¾`å 1A8ÞÏÁó…pЃ‡A±«sšÚÍd¾aìð:öüë×’ýÞùF!`(ªÑêxi‡Û ññ«ÿò‹i!ÃÆŽZøK ^y%Ægó¸·–ÝÅ—ô[ÀæòèÔ4欟²@U+a‚K ó&Iþfg¦ñðƒ¨ÚF¡þ†«°¹/bddÖp<„^ëííÒ’É䙋‹ÙWÛ+° .©ð×¹ó)qö‰ g;:ž»c¶’º2úa„Ycê2ÍÊ0Åöxê—ŽªCÍ #“Oàè,ùÕÙy6½æÈÒéxˆ.¤®á‰ÞXBϦa=øSì4§€Ëÿ…kÉ&ác$ý¹Eˆ¯ý ¼/˜š#›o²>–R™©cúâkpÆÛßC=„O޶á¼óÛ0½è WxÑÈoÅ.U*’È*”í© ¢ž:¸®!ÿJ H*‰1žH`dýF9:Çk­~&)äóxðþ{dÒmph˜€`ý½=Ϙ›Oãt2€…J<ƒ˜ŸpmRÙ.‹¤ú3²¢UsòEºHu¦¤)Ñ}<•B'в1£;B2d£7I¶Ù#ïÁh£‹5‘©Æ1[¨·fàTðõ Ï|øœ- ôò¿"`7¨Þ9t¸ùxßú éøÝÜRLïET™k¢¢…}É~lüÈ'P-åð£G²ð†·â×i°Ü¾3íáÞ´ÀE=OÌ`{ ‡Á]‰,ÁŒ§8 êzN“!dK›«ú,8øã tb"7ˆ/¥^ùÖ84vCÃÃDôm{t×ÞWÚ.`4_bîbÛÍŒà¹ÜƒWÅ÷îY‡ý3&†;òhL!¤MH¤oèBNû`68{åJm0O <[$Õ'¤1â´ &ªá éLÏ{ p1WÄÄ®G±yòf´uA<0qß7€î‡÷È}@:Û$¼_"£‰Ä{³É}‰ ëqû¯ïÅÝb þtg%pêj¸ ]Ç÷éz]ø˜€{GÍ$BÐÕ̶ÚÑüj4M>fp¹ŒUÈbt)HÛùÜ‘-kõš%M€FR?²nÍzÒ gŒ®¬ŠèGJnäæKæ2OÇZdÝn}t ©›µ’Èì%ð$ÖIÖËðÖ¹|Ù¡{BÚ„l¹È—@ˆ^3EíýyD{mÙrå§*h5ªuìàa ¼³Gà|”_¬7 „bô푦/\<­ÏüŒÌË_3^ÿFÞý~:Û…u[ñо:拞/Køâ^ íç[ÛpX˜WÜv¸É‘ÏÚ“žlnå†Ïmt?7L›Ã#µvŠ{°¦H$âØ¸qc#µfx +¯'|qzÀwîÊ `jõz{z°sÇvüìÆ› ­À'êùC–TcGàgkPUöŒbtaI²cUb¢º ¾ðûAܨµãŒ®ºD¾¼¬&OåÆˆzlüâÝŒ é}p¿P&í‹,-ª°—g(É¿%&Ù¿a¶þÓ¿ ”™Ãë8šØÈ¾*v¥ÕÃ'÷ÜJ× áïë&þæ`Süñ3ðKÎPòW4Áî±Ì!„LŠ5UŽÄfbanAÆ8R„ \úHЗÁ‡’MÚª·«“;’Ïžž»i5#dV— Ô´[9Í‹ÄæU¯~ý …»îºåRѯ*Ö@‡58øš„#=™ôQ™1A `ÕË2°ÄÀ:E ozõ‡oÇù ÿy/ÄL¡aßOÝ„NžÉnËD÷ÿþ?0ûúp×mâ^};æÆ<Ì>œó»‚49RNVãÊ9:FwÇð7vw°!úxV:’ L=S{R‡Íý30ybj‰Üè2‡ä¨™ xDU+ÍÉÞ×\[}ÖäÔ V3HÊ\üïßg©á¦„®Îv¼óoÃUW^]»v!½¸(¥—Û—¸Í‰]U ¬æ÷óÉr 5¿_×ÕÔ aðäT0uÊž¸SÉ }ÌïzçLÝ…Ðí»àì™R’ï'ëkDƒåb¾?y7¶¾ìZŒí~7Þ:G TM§`åK~MgZdäF-•”:ßÛ€Sêŧ^®sèi¿qöPž" Á§áò`ËdºÞ [ HýJC­Q˜(£¯#k†¶>¶k_”´DM{¢ à s}SVT<þ¬DꉵÁyçƒsÏ=[–'»Bµ`37r?G­Øma² ãá³s3H§$7³£6V°QȑԕSš:’-–0±g6ï¾ííƒýëݲ/¯Õ Âþ|-cÏe-¸ðB\BÒÏ › ÏX—CüúO“gó{л6B~0&`øŒà™¨“©øþ?3†Â?¿DÇšøég€° Ûj6éöövLOMÑZÚ¾ÙU)!MªŽ5T®Žu#k¶9®7H_pX;Ic•!¢ÎÓ/4ÇÆ ¡Ì'rDË ©à\9OüfFP `(·Qz "ÜL!\é%TÛ”GÁ îÃ_\X„S®4†Eô•Ë806†¾û~†¡ÑÇP¿é!IÑR.ZªºEKìœÔ½‘6~øÃHr TBWw/6n°ñþ??ýä1Yy%Œè}¸D_j2‚ËÍ&y0ds'«¸îŸx`ÕþþÅÀ`âô1€Õ`Ìà5ãòï#ã2/ÐÙÙå÷ø³”µæ…³` õ··¥›i=ëšþÄ€w_Ià ‡Tc˜Ç°†È×÷çÞMœ–A_½§‚Ìžìï÷ÈoUÛ¼¸.»‚>ˆaïB±* ÀYƃdßÌÛ~Šõ‡FõÖGáUêª[Ç;–ZW5L/ÞCÈ^ÿ«÷`ó•W©„ ]×–Í›å9²­ÏÛ|ü³×#}+œ ©a+O´+ V÷™€˜}â¾÷i ±ÐZüõ5ÀÀJÞà±÷EzÐ{ʉ-èW@/‰Êƒ³ƒÝœyuý”VЇ )ØÍAºþþ>­£½íÜ™¹ù›O6>Æ\MO?¹,Ež”Å^ûêK•!’]³ì¥z*Í©Š-TTÐBͶŒO¹G‘'sCÍðá‡+÷ëá±­îIÃÁ úŽÌ/ pç/qÎþû`ß¶ Ö ù÷ñ0x’܉В¸×ã`ÁÆá+®ÀËÿò¯–¼'‹U·oÇèè(ÎÚ ü¯wØøô¿ÿ;ª}oCñ(i4;C 0b9Ü!¬¡ððnüü›&bÆ þ”¼ƒ5=ìÒÒÉ–é£ôÄ`JMÒ‹ôëWÏ~/`PƒÈf€g2” …%ågºŸ× f²Ùå´}_oÏNŽòßðwV3÷ÏvtÙ*1qdFNÅà¡É²£WˆFPèÍ“Z&ȦHÏô7ˆÈˆ¬\¿ÂÕŽ¨ñê¡rVí'RCó¹¦y›î¾úƒ{P’q|ø5A¥Î²þ )·Åšƒ_“ ûœOŠU꘯gËL°opö¹çà¯wð¥ë¾„ÐÈ[>œ'ëE o„Ô·É N¥ô¨†±›~›ŒK`Fð7ÏÝ.|†Îiˆ¾”LŒœ[@LŠ_Ññf:Ö¬Ò]Ôe6•7°bÍÌ#q º…¸Bˆ—YZÐÅ®4gDG†Îzd×^Þê„ÈÚtœ“3©—"pBöÆÜB½ÝrÄiÀM°ØŒ$|æ†Ú äÒ|ðÁÜ-s>g YcñP„ãžCŽlõ¡½{ÑûÓï µw…GÊ.á è·Á'ÚR(#pÄ ·Úë>ôAl8ûœãþW×nݺ•4À^@ŒïáKßþ"Úú^…ýj?Ûp>¹ª~äë|”ޝÑñ?WUcÄ8 ««K6×°†âØ?×Y°W% Lô¯§‚1Øðð`÷³IÃ9QtÕ\åè×*ÏJðOMÄ 'SÓi tË‘éŽÔÝ ´Ô=ú&AkT²êºên•Á!ÏSùqŽVi*Ô¹’ `Œ0Nv¿øóÿºÛnA~ïXÜv.¥ÿX}ßú”C½s¤úïÂ[?þ Y™´škf‚ÑÑ}xÖÅ—Ðõ üóG¿ »v–ßcàøQº:Á)i Þ÷ê¼èFçéGûHêQYÑD¦ž¹9ÍIªß;yô…Õ;s2•TC«/‘Û,Ì ðsØ–C­<Ùˆ3<Ðσ+ÏHgr7˜'Ò«iÈ0tÏ""Úšß¶ÂáLþ±©Ù´f<±1aYs“h™·¯æÞ¡eJ¦?õ“kk–×¶ÄìÓoLçò˜½íWè»ùXcGQOçdT®Q•+š ÈmÌúQ9ö Ñézz͇ÿk·n;%žJ¥Èl#M°—\z Þ[uñoþ ‘o;§ë¯#ŸŸG•¤ñÒu&>t-1ÃdDŘwÆüس×dI¡:“`q#iÔ:ºø³›@[NCU©aüq‚t±§"’œ;`oÉS*O6˜ðçšdšd󍧯×qÖqp ïìéiîŽ>~tÕ\MôÍÕ]‹«Á$¢ôÉfŽÆÍ/Ê.ã~Íkírla»6š=ï P#‚œÚ\’á#Û7~ÿ}}ýËH?úr³9¹¬œC°üü'‘­–{Kž/[8‚,ÕsÞðz\óº×=.œ5Áöí;099‰7¼ñµxÕ«_&_x²{&&‘ Œó®µ!QKyR÷ÏâÞŽX œºþÁ«Ì|µPøáA:ô?7¡É «Àއ¢¦ÄN̬⑺ííÝ’‘d1H½®EN'‡*ª)VH[¤¤é`w{ÍðàÎ{ï$ªiÇoY0ÏÁœ¿Ýik‰2£át&/«zúº”ŸïkÔGý&Š–B•ùÒd,€wênyºè1}>ÿ9L=¼G£„Ü·öÂ$`dïá¸D"‰]pˆÜ#.áâý}"ô~Œ^ëÄ–mÛ°…T¹v‚LgpËoÜÆÆÙ6á^rŒþö;n—[ÐÅíx¹ùzŠäæeˆxëaÁ¼Õ$¼d¨º/fn‚uHj´ªŸ6ýÔ”û%±}gàA•ª0D¹‚ÌlLôu##°x‹[zh,0 ª3ÙŒìbpxÆ;1¼füÌú‘5Ã!Ó\Cfbìx@ÐtìUÕãÛ §Õeÿ˜?ËS†!9BX*WpdÊF_O§ÜFe¹I†,9™j6%dNæ-^”:ôäðVm›Þþvlú³?'ÉK¨Ñéþ4-VqjÁÔžf0@ÚOHqîûë$c±´,#rë}ë9:Á}ÐÜ|†;›8^P×#¸@Ç9ÅG¡Ùäoo'ÂÒEs‡²ÐÐo0_jV_¤–K·£Zù8Fñû(³2ÌËáõù¹y=zTJ3»¦Ñx íRóä ¼ïa‘hL6Äðkƒý¨Ôªr] Å:é5µÇQŒã“ Ï8 0WÙ’E–K+1gÌÀ Ë©G@([Α¼©™¹×_Ow‡ g6ÛÆDcÚ…ŠÉCb F¶%Ÿx±; '“;%‘ƒaŽ˜DKòã8n«L“Õüñ4zKñÅò#@È«ÉÏÍÍáÞ{ïEºPF¿¨àÊùÛ‰¤µ——“ÏßFçšµ£å$x-š€Àõ½BùØ@¤ð#ô ¢>¥Â”<†Þž^´òçóÚN𬣣S›ë 9zÉ“I·spå°Üt‹CdžÚÔšµúb&‡;î¼ïÒºû¹Šë pUÀ¢«¨A†¶LV¨¢ÖL#hÈæI=‘ÿÚÝÙ&Jó‰©q¯z#=܈d±g`Ò†1xþì½`tô–°•ÀOæÿî»ïÆäôŒ ,=wú¤J Šøëôm&aËùÃ¥ $à3Z̯|­ ÓçŽ|±³7CÛúl¹#Ù¶­[–L˜à1ýê>†ÞÞ Ã0î*—k829Ë»“Õ²Ù\%“Íçèñt&_˜š™™Û?3»ðUb†WM{umÙ’d‹oƒšQ·¥¹7Í·ë¬ fæåüÜNb.%3 s á‚[دwã`s0?¶vÿm¸ñu?øàƒRõW‰üW.<ŒÍó{å0Ó9Ÿ¤ßb wZ"Q¢I|O,e·E3¸dç­,ºF¿Œ|U›¼—RT½šn^,U¼òå2¹\¶/fsùâá£Él¶0‘ÏÒ¶ãÌòFRì™Óçhýê„\Æ?8i¬a•À%(ÁS£Üá#y­ü>yŸ+Ø$(Õ*¨ÔQ©.ÈbR jè³w”8C•Có_‹%É8áß²¾™ðämËs¸lü7> #]~~ÐI*¶h7Uÿ’ûV-à-Õ æ ByÙý¹{“xÁ ™’µ·R*M®_7<ÓßÛ½ØÙ‘š·lkþ‹_½¾D®`=AÀTn¦ ¢ƒí?k6ÑœU]mmÅj€‰VÖü‰HZk<šcÍDË „ J¥ûy#.ûæTæâbFniÊ)Ùº¿pDš9Žó[Eüééi©úÓùÈûÇ ü î3$äŽRýÛÉ;)8ª4gɼÂe&@,ÓÁ{n“ :&~©¿bg÷c…ËßñÁîcsý}Ýøàß}JuUIóè—‘‹ãƒ¼“2Àjœ$¶Ôšk~,@@4æû·ãEƒ ‚Ñ'¾­÷Á^¾ vø`.îlwý~{Mú¶öopãÅ#?„¹ù9R®û †È}ãÌ ¥º ËßøÆY:¥.@ÿAp9ðÄR³à–|-´ë¿þº{`çô¼ü?`ÆôÖº–«.{&.¿ôüúŽûìY°äº§AÔWË%F–üù Mk©h°¤@ø[(iAÁ¢ì¡ã?š*)㮣½øùøùÏoÅ>ÿ%´µ¥ðâ\%“L<9£äï¬Á;ld2y2YS$·ná÷\òf ªwÎkŒŸ—A&S÷’'³¼h).há†mö[¨2v.€å.]-–Äå“bçÔnØ\f{0Îí€ÞE+­Òc¥²PÁ®Œ-F®d_wI˱Aðœ'Ü6-§‘俉!ªÀ“Ö~¼ Pt}7m­ÜùR¨®ÝÏ’´t ¢h0‚Ã5¼ #—‚yþ¼\YNî-) iA™-Q¦æþ9­ÝA1ªî㊦Q ô‘j¹æÊY'¯‹HÕ|¦eÕŽD$DèÚ²©|õY¯Çó»ϲöAÛÖ‡‚ÞŽ\¢ èÀ”ÛE½û÷þ>v™¢£]»1 ¤Ð`€•€ßó@ÒÎ-b¡ØaÔËJƒÈ™ò‰Ó„ñWN”ñðIÏ–«göx ”d¸VmÀß¡ˆ¯Ëz}Ëñç6vÐ眱â²ò|.'S–ŒÊÕö®žœ*7Lâ74ç i~%‘RðÍ{£,ZkJ”hÑ@¢E‚”ÙâFLå~ê*ÃÆ1åPk"~,!‡YrOôPÂ)üüÂßÇ}V²‹NeϤo4äXøyn¹†nòÝ£á†y×ka€ãhj­ül,^„9¬F~€:î׊kÅ <÷Ží&=Ô¬:ðRçÏ2êf,ÀÅœ®ì …<ŽLLøñg­1FCÓMr4š%çÝd2¹)´ëçý :ÛÏ8CùcLà WßRNÖ²¾<- /ˆÅ9Ê» ¼(„ vÿnÄ% I|®7à!–¡PXy*†_½D÷3ú°Ü$*L§7‚ M„Øì‡5´Çé11FgDSû8âØ¼@k¬<`›˜2Þ9‰xÇá%Z­¥^âús ÿŒ+ŽÃÇÞ Â;öÇîÁáý¢XÈ´DW?˜Áá±®•J%Ä6M%]$Y,Íœ»f5º$7¨µ>P]=ÜÝÂLS.Ge­;ƒ®ù¹9YiÃÙ«%¥c˜ ˆ/؉(¨Bk-BÕˆÁ ;´n19·± §• ‡£²ÍK°#ôØð /7lâr0´¾l¡¹‚>çYH:¢ä9ÀÄ@ÔP ÐäÁ2fh̘É ‹pVDk¥M$4\2Ç«ÏîÆOF³ˆšÍ49ïˆ*üžáocËÑÛ‰ƒ»qˆ_*dw:˜o< ¶F b”´ óÃT‹Û,±j!VãÂC2ó'3YšpÈfEÎl´05MzYj Ù|¬7¤Ø ¶÷çïAÍßeÆâÔrÃ{Ñü¿L|’ö8!~náŃ?\Íû`ÓI)m~C¦4kÚŒj1QAG,D€1„îÖÌøy- »ø5Ò§ž +·Ü#GÖ‚cÇšèýÏÙˆ ×ðÁ 6eÞâÀÞ‡T—•§ Jù÷&í^‘ð-AÖ©0@½^«¥dY /–§rÿ¬ ê¬þ §Mï]yøƒäHx"Ÿ¨ðÛÇäÐ)ZøîõÝ|~¾;×2ŒYó‰ëïÞmú3«çfËŽZFãu©a‰¹+¥²d€ \¯XLõ(Då–° b„H74v XFÆ æó©×ÔëµRš%[Óøü:¤žÇ†–¸þ?L x›D×írªÆj·Ý2ÂÅEØõ胸ïW·ÈëçM­Z>u/àZ²-fVã¢Tv•cùåtÕ/Ájr²´±†!‚Íw¶psCWW·lçJ`øµÂßÅvÝ–*Úô÷ËkWNéfbkÁôm5`Y×DSCÐ+\9Ì5Æ\G!w­¥ô«˜ábѸ|_ÎßuUC«çK¸'£ÿšåæaÉþ<¸É!æ2‰b&ô<É¥>îrä¿‚ b€öþQ„cË`Ðj¡]‚\Ïù^÷·ßÆÏÚ÷ÄÝÀS5› ¨M®'FRÔÝ­öýUÍ£!Ÿ`FsÛ_ý2f`MJµÉ*`×çü`×lÝ ˆ««­Q‚2r£±×wË^¼MS*ÂoLåf î@ö;h 9lAø£iÐ2½Ôƒ-º¹ƒg€Yäùò¹Ž­XRåÏŒ!9Ÿ¡ó¢ßˆ…1Àƒ±,o™ß²zÞ2³ Ü¿ñFú‚*wu~X$„»>€wñûxp|æôÄNa*GÍuì*çìôõtvÀiÙÕˆ+ŠÖ2ë–ÅòB†Èf¥Œñ„Š)hZKIknÄ´DxšÉ†Æþ»þØwÍ—ÒÀö1cñ8fHY7ï£ifHÞn•UˆÌ‚¡ðûQK¯Q\á1ƒM¤}S ûóù<Öp¢>GßÃÓÐBèewÚñ–äDZ5À’ÕÜàK¹zÇàa\ýËQ/ñ>õÝ[ðÞ¯ýäô‚N¡ǢŬsú¸P(«ˆZwßnÙó¶å^`iPGajÒ ¦·â0Ãæ®Þ¢QQ,üA«éþ¯ù{¶hþölž§@#aY×RýkÊÖå­Ÿ÷¥_óÔŒõ]¢±Íl¿FËè~°‹c º‡öú,tBþ8êàü€ë€k0½¯‚]Á<‹8Â&Úš‘»MÞ'±€ÐV4öÒ…‹E19³€wõÇøñý»O$ð0€íyN•»x+2_Þ, EkXknfІ|y~¤ÎW‡žhŽIU‹äÛ\Ñ $5’ ÂÈ!9æE) EÅ ®çÚ®?yDÕÈñ¨UMø»mr’·t÷ËÀƒíW‚Ý>¹)‡w÷”Uɺ í U#ŸÑ5²,*°âlg.ˆ"qžÕç¶ŽÓmÐdižHB›¾áÙW#0éÉk´—×H¶ì·«#ºfëçéõEoY>J {%Ÿú¯Ûñ¹[ïÁþÙô“Ÿ :•É\t5e‹'UXjz|8¤™ª‡­1@kEë- 0DÚ˜ föú¡ÐÖâ’ [™ %Ḛ²ÉáFÙ™4 þTÍ|±„ôB†w;ñÒéÚÔÔl–¤û‘\¾.J“¤Úï#åè ¦ˆHÃ!ÓcÆQÕ·~ï"c‘èõ±—õã²­±n{tì9¬¢ºƒZº¢†=C[ÍGBSê}FpiÝÌ¡uû‘êúw{q±e¸‡“£xøÐ<>úËûñÍû÷>uÙÀSü|‘“ jè“ÚœZsÜ ß.ÈÑhK$ׯ#A=q ¡õf¶Ëßka$CÚc½Qe,ýwÞF½R%¿_C‰lôÌÌJÙ¬] Û‘ÉéÅR±òX¹R9\,•æ*ÕÚýôgS¤Êµš5CÚBÄb ¥æ·²‰fÊÚç²|ÕÃÆžÞûŒ$.Y†—ϽÕüZvëGó¨,_ú}Iš»ƒóÄ46 ìè!DF¶ü­g;Yáçýc!Câ”Ïá?ò«p$WzjëNñó%ÙÀÁ™<ß’ŽÚ goIÅâÒòEÍ·“A¤^4B’ ]LÃÒ¸>7ŽpYï0653‹ù…t©R©MNMÏòcìÔææG]#üé¹¾­£F(<ª;VÜܲéOÛ¦“„e—3Ž!ô2¯[&\j¶À‹w&ñ?.La¤Ÿþ®®én~îšñ®¡<žWê_Wír^cˆ¦ý—.*IbÛ¶ïè©Îë8öbÐoFéž\ÀîÙ…¯?8ú´TCŸ2p°&Ÿç Œ]¿¨b¹mêÅ’¬P‹³à— (ß_Î ¢ï”ŽŸáâÁÅ™¬$4OºšœœÎ–Ê•} él&“ÉN’Dßí8^Ž–vÂv¼±°îZÉÉû?‘šã@G:Ê™»ìþ,´ ƒ'ùñ¤Í¼f!Ë ‚-CºÜÍkm§‰—œ™Àµç©¿Ës7íêÅÈÏ\¡‘äVÆr(/Teܳýq‹Ú‚ îî ¯ÿ3aY^‚5i„÷ßt¾öÀ(ÇØñtÝN•*¼€Üý+<¯Q¨µú-“ºtMmž¨v¿6äÂÊPlF5nff^j”l¶P?2™#›¼¿P,NdsùÙr¥z'-æ¤Æ÷¶5¡k†Å]D‹`BqížA„IGílÿtÔðÞdϿӟ»¶-{ð6=žB69€¹Ž!Ì´£&#‹š¬³³uᬠ©äTÉ“£’§× âCWaýp nÅ "2™É÷kN-Â)”ÌÞ ]‹ªúõ|à·äž‰OשGbµž­;ÞÑ‹ÍÓ5yï8>{ïÈðtßN4mœ‰93;+‰Ï¼ºíHBËù;–ìJY©ÔQ&WŠ£¼×ÐB:ãKå¹£“Ó%z|°Z­í!Ûœ#Iˆdy$äex³š¡‹ˆl WÝD¬²ä±dA>^ŽI3vsèÔóÑØ¾hLÿ\¸n½ßÊYßr ý5q«rÇ–Ü!œ“C.Þ)Y4iÃh×&¸uµ gñö勨}`·ÔfåR^žûåCÏD[¸¨G›¬Vx¡ÈN¾Œ#séçPHWeN€`Cõû÷r¾?ïô ‰¡í;Þ§Gc7~åÁ}øÌ=Lø<~[nf0±k5[¿ÒígäNݰçÑÇ^òƒß„—¾èjp£"KòÂbFzS$Ñ“Ó3V±X98;¿PœKOݾ¯V¯g,Ë'·jO4©…ÍP–㆟–å†Pî ’nic8ÃÉ3díFɈ —˜!Ž}¸m£ûJk÷ô:Û?ôBÆÛ]ûA³£^v·³–Ãúì¸ Ú1ÃNÛîœsPnÑÂ3žôqXꥩs­>oþÐ' ÍÖ³GʘݽèOêv3 „×4¼¹C*Flý†¿üùBñ ¹ñ!ÈñÛv3Ëå"‘©Ôð’ Íñ¼"Ø++åâ•ÿú…/oxø±½ÏïïëéË“Ÿ5;·p”Tö=Äõ®çf«•Ú>’Ür,õ¸ŒýðXT!n–h5 {5v¹yã®:\µ5Iïæ¤…˜HÁ²b!’ìÿËŽíõo÷¦{Ä]Gàì_ˆŽÿH R‘H]v&+I•ÕÈŒúM¿Ówi ¶ uCsŸ1ªémÕ‚ƒC·M¡Vue=§ëGü”Ú÷A }W2·ÇÛ»ß÷õ]ÓŸý鑹cÑð“Pî÷xªÆÌéÉý…£èèèC,–D$šh„a£êD´›xÖÿ‘#Ó_8xhÂO×êÒÞ>¡á,4ýѲ'ZÜ(_2ü1¬»÷[ÎÙÝ”»¼¦gÕÆ•dR¦Æ÷Ê â¶3»qþ†nÙ,Yå‚UD¾Ý¾~í5)Íû£ÅÝ™PÍñþ¿pX¿‚¾é¯éøõ)š<é*ˆùßг‡ÿÀ®yØsóäkr,Žtñ‚úOÍç ñþÈ©äìZô¾ÿà]× ù¦VÃ)nÖ}Š7±Âc±ìð–¿&1€mÕ°0DþE2ÙŽ®¹-JÅË2lRC7JÍ¢9±8«ž;Ã/à0ý¦QMŽ7µË%äsi¹VLôɉ(æ3jl ;=?yÌ÷]G¯Ý¹»ÃÝ)¼âÒíHÆx÷íÄûºÏÔ7wDŒ+&I£TwŸ°~cDÇuô'_ ãžÖ¾‘X×™õëÂÂÁ‹co*ç-ðÒo}Ë’rË;&³(”lTjŽÜû^¥¢Ú:c^ßP›§Ç Ó^(b|_c÷§‘™)Ëj$YšÆCntÍ«fzúc÷Ö;¨Ø÷ÏT­Gu¡ºùŽÉ¡-#®·áÝˉí­pˆìÏî·Ö^hseýÎ`½¡Gܧ/šH™ÆŽðçºKIäûú¦¡®Á?¸`Í ^vNïÕgk_ØëGt&šæ3Ôò–QHWô¹#%oöHÑË.Ök»ò¦^-AcnnÌòÆçQNå$Ûö–ùÔÁa¯@tùùd4„«ÎÜ,.6õ«ÖÅÚ‡ÛÌ~ݵחÊõÎlÉÊÏÛÚ¾©*rûëv¦è˜ŽçEâa=9ØîíK„†Úb^7"õxH«fjš]²4ÎÿÊF"2·00pS41†0MÍ#7Q0ƒ„ f~Í3Ö…ôö³ûñ#Åj.[±œ"w'òíW“F~ÜZÀ\ÆQÚ !L§Å¶ëÇQå'²×b™Ûµü±8  [É^:+$=ß“ŒêxÝUÝx÷eÏÄεý†—™í®W ›rÙòºù…J$³X[È”{ÊîÌÏgêõ=‹5Ýr\“À¼„Â;ÚÏÚÐ>0ÔÙÓÃCN»«ÆM­¼PÑ­¢%wÂÓ”ŽÔ$ñÕdÖXô¤& #dê¢=$ÂçtÅRû²IÜWÉÔOÒõNbNk0ÈѼ™™™’}GÚ ®‰A¤–¯Øz©bzÚ¢™sÖµçG’¨êv} – …«dʳeÝ®ºº§ MøeËþ&˜,ù¬ Ï&@S&Á0á…ãzä‚6}ßBÑ*ÖÍ˯M¬"òwZDæ ˆÐªÎŸÊˆáãâðÎ oyA?>øŠs‘¬—!ÆÛŒZµÐ_XÌnÏNNäìbmºn¹ru;}~¹ît©±bé {¸e"Ð=c™úµŒ8ýô*ðêµöZÜÔ+¤ëë‹Ý#[Î~¸ºlNÖd3ŒŽ&34&¤©Œ‹S¡;gRö#S{•„~Ò#‚æ lðÓ’Â;Õ×¢^z~/¸*‚ †º09߮¢3ÜžR.³éèþtßÑÃY«X°§\Ç3ÂV¦fx\”¬ÐÛql©ªÃë´Ë=ýS(!©™Ðˆ²á‘ŸHò_s4©¢4µ‘7ž?£BR-h^õM„N¾áY©Hèâu=Þ£3YKxâxD~J£ƒ&~‡o¤åÿ×›Û±n8„ºë CH}K”ÉSmO/ÖÍLwOÊ[Õ‚5Mä;˜¬YY‡<7M;ù”åÍÝ)\Ð×&¢¡HÑ‹Ææ<Ïng\ åh‡³¨”1ù@D“E¡Šè›©vIˆm)ÓxáÖü|߬}(Sh0›©ëžA„„Uçþ7¼þ¼æùm0P­ B…l-‚Zn>V®äeºgÇóN½hÏk†s(îÖ3ñº¹Øê¬Ùëvt`Ϫ¤miÏyV)oÛ0mNEBˆ˜7¹÷°1¡LI»×2/ØYC(¿JèaO»zS—þægoöþæ¿g¬mÇg ‰·_q zÖõ‰‰[Æ×ïÝ‹'Žà`þä=Åý=…‹…Õõh~“ìï,¼þê~üíK×KÂ[9‘`EÅŽ˜¹b¡§4™ížŸÈyvÑJ›š;^E=cØKE+ÄÜX9qþºÞô¼NZ©EòûSÂÕ;Ê5ÏÈÕ$jŽgÊÁ’\ìêÏ(ÔšÄVè¸ñ¼1êÌTái¡ˆ0?ðªgã —Ÿ)ºûL$»c@µMCÌÄÀРxæU½ÈUJ8T,ãU7Ü„ƒ¥c{׬݄g\ôbôvÆOÖQȈu9Ç"«*Û㊭‡ï{ðwúºCxÃïõaÍ@×i«²ô_ "å:©ê\®gñHÁ¨¬Åp4lX™´p#†Xt€Ü]í–l@‰#ttu®ªúŠ×áê=ÿw‹zSþø²ô’­NTÔ¸_¨:üö8‘·C ç Å©B¸’«I8§LÇYÜPtÝ¿_5F_ªGpçÖ«q×Ú-´ˆ]èöòðl í’jH¶™¸cù{£øƒ‘ilhã-aÊÞ‚kTÊÊùš§sQèÿOݵõFváêîséÓç:Ûë¬g½—y!›ä(€Dò/ˆwžù!<ñ'xå EŠ”R$ˆˆ)d"kÖ»Ú›=Ïå\§Ïiª{ÎŒ'› ÙH‰´~iÆŸ©úªºªºê«•뜫‘V¯Í =:F Ué@]Z08 AVM·Bwt;•nµÊgðÜn~óË_À¯ÞÃÚùm if¨ë§ƒ³ðB_<Èv¡tÓ®ô{Òö»E×™ÀÏ_ðÆó<§J³jØ«e2<§.Aõpâgƒ¼$R¡–ò¸”zi¦^í§½ýþ9øý ¯Â<%iF|Õ«‰œoè®Á°o¾;ìÂÇhœQÃn0P¯¯eÕ¸j²Q%íª”$d 6SôYqù«•’,Ö¨Q=€Xz0}ˆh›r˜åBÇ‹@Ø„UÁ¥—ñ·õÍÝ¢æÔJßol°ùdžÐÖ“S:˜ø ŧ/núð£ëó ÛyÝÖ W‘ŒžÌ©S¿8Ê”ÊåSyÔ¤e¥s3ÍÞ:vøíË߃ۗ¾‰Ap£©>ÿïÿõXÓTÁAæÀý¢O"rÒÄå´ÊЦ,ÊšÆQ%'ijZ¯:W61ÄCd´{7Aë,G”ÊÑGyß#ðÃtvjÐ5õ¼6ôÏÀ¯ßù´Û±é×W†yjà£+üán?¹˜Àƒ}õؤØ6º„Ì tÉ0µä¸LIÝ ,% ‹QôrÙØ‚w¾õ­{°ŽoÚõ òÇ4F¨Üœ¤ÊT÷÷èN0Ïõì›Ö†·U+"gã*Í$ SyÀHb–E´T´¥/4ìSäÓžÁÔSõ÷V‹b:³SðGpîbkWNŽ`<Á›Ü‚?üã60ÛÅØÁ£tÎËQ´f¾"gÎlª>—ëàÌÀCá½~¹»ë>¼R~~$ƒÂß²\‹N GŽ I¥œØP¥Ã:vÆáÖÞU¸u~FnálŒñÿŒ Í›ž3´(ñ„GÝÀaA ˜ãp[n%qlA` ½ý½Ü߯Žó‘¨ãL™ŸSB«]éÒâõŒœl £—§?“ÁÅ—ˆz ù—~÷Þ¼{ã.nƒ|¤kßÐå)³×ˆˆHÒ( 1%Ê£qF]å—®#Ó`o˃k[ P׆ióÅHæ(ÝzR0Ȫ™-ë‚ãë`ý]ÿLœ.XE õlfz2k,Ï# fÚÚ{݈qΙð}Ç!ø™ëºÔå®b”jaÖK~?©‹Mø\’¦•$ÁO$%Xõ*Èi ¸¼;]¼¯­_TÐÛ­`ûEã†ÞþãŸáOû"á­ÐêQ=6Oέ¯³N³µ^‡õ{±G £€ÆaHõßYè½ȬØn™ØÎ ¾ÿl ß9ïC!k˜M‹/¾}BÁffÚÅh¾˜•4Ï«ìÙkppåѰ¬D!Râ`^ß9‹VÐn'A«æT 0‰#T8'z0¦åJ¨Û˜@5uCæÔÿDw‡™Æè%.\èÛ˜!Xº\µJ7"ó|ŒöÕ(]ÍswìÔvJØy©>T üõ­·àÆÍûóÙÉ¢"ÂB 6íÄ évbÖïv˜~î0ô‰ëئcMÇ¿ÜujݵæØLÛVÓÂ6ßq¦ÐÁ`ïêFzÓÔLP/ë.˜Æ¡¢%É¥,¿ñÝF]ÿ14EJ ¶ü„XÔ&Q ¥w‰Qzà“0 PéfgA£ÇÚUK^¹¤w[l!Óí€fö}/Æ”^9„gÈ „›6ĽvC›^›•¬žñK+o]=k-ߢ‹2º.!aãŠü/{AýýƸy­$žÃ‰ï{ôùÝÔ]>>+âPOO7z³êðx`Ö÷¢ß +zž—š²©énx-}ß@?ôáµ ë†*m¢‰øž`z~±YCÂ*MUÔöÞžr®½J’HP׉I7Qñ1pÇ!a?`[vc²JÚòùÍ9ˆÕ’ØQ}Š^“Xj–6eÃ=[£­7hÁ`†ÖUŠÍú£ü²úèä¬ ²wIàÝ<éucDZ-KMNFêødØÔz¾ŸQoAÕ,,šìšsÏ”t'iiVÔEZ*Y}ù-âÿ`´2¥Z ö)IEND®B`‚R2_2_5/images/updater-48x48.png0000644000175000017500000001266611667203025015511 0ustar danieldaniel‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe<XIDATxÚ¤Z ”]u}þîúöyË̛ɬ™ÉJ'$f!%jmË¡U9 [«µÅ¬zôxª—zLP8%ˆH,"¥(J$†$‚&&Ì8‘l³/oæíû»Û»ïÞþþ÷½™L2£½ðç-s—ßú}ßïÿG&’¸’ƒã8TjëÈØèCëÖô^›ËÓ“S±™x25œË†GǧGgšæx¾Pœ$'Òª¦)2cÁFµZ…mÛõ…?î-˺bè?*{9øÒ1ìûïŸÃÃÅYp‘9rÀëõ¸‚Á¦ŽH8؇¶íØÞ ·[ÂMoP«™ÅR¹<—J¥cù|a8žHfs¹ažç'AˆÕL3]%c4M#ÇL:¿æ8ö{¸’“œƒÎ#ÛU¼eV |*Üåæ»Ñë2µ‹«EZz%‹ÙBãÉ”²]3ÀÓ#$Y¦Êñ6…‚MkC¡èWwöÂã’èž¶y“ifUU™Ées“ñDjDQÕ‘x"1FA›ÐT-I™+ò‚py.ØgS òN¤/—æ&Çse˶ ˆ¼»2x¶%`$ÒѦ¤PRS'üÍkîu¡Í/¡ÃgÂÇ´ ¶Y¤S9$i¥2ŒOBQt˜µš(b«Çínmioîî]—KÄQ û[Šaè ¥R;xèÈ}Ô'„KáÎÅ7¬§IxP”@µº$…ô©KW+¯®¦º÷S={ÖùÞâ覢 [òÀvùay°¼äP0‚¶e¬]ÞŠ›z#èh‰ j‚ÏëD}@§¾1©aUŒOŰÿG¡WkD¢(AvÉ`ý²cÛ&LŽ ?ù“Ÿ¸Ãív]œQ¬{Än8=3‹ÿzl?®»vÞ~ãn§q‘œaT«zOÏJ|w߃:T*…R©Œ|>B¾€"•û¬”˨“¨ÄU ýÊÀ±ªÊ(Úa|>/!O‘H-ÍB&JÅ 9Ä™aà¬Nœ°°a]ïU’DÆr\í²%Ä–žx"‰‡y Ý]زyEG¹ÈBÕµ‹7±kÛjJÝ–%åfÖl‚Í*t]‡¢jNf© P,±UB¡X¦E¯…’óš#Çgbqø½õ È “52!•iB@»wmîóxÜíºn̰R¿¬õLˆ`izøÑ'(R2áøZÇÇ|Uje•uóäl3Ï<„Á!¸ºZaËQÀ…µl5¬îÛœ GÈä±P¥gº(€¼ƒh6tä\•Õ9¡NÍTœ¦š‡ªê æE…ž[*W{zº:C‘pdm<ž˜YÜâå:›Àˆä«ßxÿpϱvõJhºÁúİLScíëíCj÷8ü諸að»Ã@­JÆèú[¿ký½” @¶- ÌÆp_¦JšƒO²‘8lÖSøàÖ€ÓXôL.™jŸ^Ý.7ì`°n‹HŸ ¢Y!‡#¡Ó3±ƒ‹‰=ÔdÍ£( ö>øˆÃž&1)‘”IŽPŸ™ žÇö­›Ðt×^¶ß‰ªî‚@hÝîÇŸ0ü-ªe±|ÿ:îÁ#~9`à…Aû_Šc[ÈB“Ÿ [†×#S ¹œÅÞ{=’³üôÞMpkR–º;Û73”\¼Ä7‚~I’Q¦øŸçžÇ{nýSÖè¶J‡eÖa–qøökÖáWw~‡÷Y¸¡ibk ,E˜² zðäÉ~ü|`5Ööóxër±X7{TìÞÚE³P¯gjnç~‚iÛ¢B]€ô2¹²ƒN]ýôY¬YAûu2@´ï4 C ZÍ¢LÈ8sö<Ù÷8²¹,Ó4eÆ” mMkÇÖ7ÁóÞÇáäÔävð=o‚-ô?ý4Þún-ÆÔ„Š“e`+fq÷ ]¨ÖxGçˆ"ïôË…%8:©T*"—Ë!WPÈQ2ΑËz=o{œa\ÅÖE „ ôtwÝÕ×+«†1](—dðŒ]33ƒƒ¿-MOŒæßÿþ;‹ , ;·_WÌûpäÙoâú·´Bl#NЬn1ñµÛfP~æŸjÇßÜßÑçaÏ"&^ˆÂ<[Ò¡S€&&§195 6ÂK[£ó››#Áp(¸6‘LMÏ7ò&fÞˆÂGÞyËž/Pà1—È¡ž]Ë6t-?1Þ[=Ÿï1ÍKÊzí®7ãeûïpü…ïãÚÛèœ67!S+¢U<°û Œ5ýXÑ] Î%lO_±ä„uMÁ0©Ñ<õ]š7ìT…ì÷¡³sÙÆØ\üE¡Á_ ZÈ® 6/ÃæŸþü0ìjRé#–õp¼à  ™pIå–§Ò¤w‘.w0'Ö¬^µ¸X½ ¥Ú~æ ˜ß{-×ßù¶åo(·T‚Îé'@™²!±¨Œ˜-Ñ(zº;·¼:xÊQ¿ 5ZwÀ¢«$Qʦš2…^÷[¢ýv˜\3t+€ó Æb L¾ ¥ŠvYÊŒ¼ÎBïÕ7Àþõì¾îÐVõaèæ»›6±©EÄ*Ïå´¢MóÝÑ1 ,„œ9 —ͬ—‰©óßÝë©?E]cLÂ]¬¦h )‡ƒ$³&>÷„Ñ`š08 ¿‹Ýœ±£w¸ê "—,'é—ŸCÇÞ/ڪІ@F”‰„RŸü ^Pº!ž²p5ܾMÀΖ¥ré$—Ûí'×5"Æ!2ŽðV’ 鬙µI†T"Ï šØÀRašäž݉çú ‚P͉jV«¢HiÌeSˆí•rq‰R=3ˆè×>ñ¥!X¤·8B/=o pßÇp}øÖçgP«0B’ðìÊ&<ùåì쾤©¼4?x\¬5ŸEä ‰˜°ëèèdöQ™©p0´zj&6鈾ùÖ·m“µ&¿o¾æ-¸~×'Òºa:4?:2‚ѱaŒ O€Ë\ôà¹ø,|_¸ò¡!$?Øù¬©;Ñqï§±öå—ÑSÄ™ñ­LO`ò¼Œ÷$Kxî±>lîZš‰ù)Ñ%Ëøß™JZôÙG:­}i¶™Äç²1TTú,Iéx•”Ô˜ Höj%d9$æ„Ïù…æ4Ú—? ïS?CAU¦HP2M’:¼÷øý~ìyûØ+ø—ÏŸÄÀ`xºÿìËãxÏe¼ø`+zH–»XcÜJ«é‚ –¦„2ÃHʜ޳æí]ÞuÍÑWŽ;d'2Í3ê¥T*‹­Ö–0«+’Àu¶ôzÜå3EK£àBÝÇ¿ùux¾ù0²U60ù]C‚õÔ>‹þ«¯®—† ámo»_åE|øã?ÁùßÑ•‚‚ÀÔ³hJÓóWùé,¦’Ùlr¯ƒgvCâÓh Sò²ymaywg¿×ã]nÙ‹…â§AiTWv¾PfÂËÚZH\ uª§WÖ'L\膯>õ c/ìp+HÜÔ©ø© ›wíŸ|ôc {eƒÒîÝoÃþG£zm Ç^9„wýšfº¶Æ†UÊtéÊDÌÈûQ#íųLŒÌTc&Ï}>V­Z¾†x¤›ì …üB#”ª:õ"¸ºš¡a‰Q/M_l\b ÀksÏ}¢,ÞôÅ»øõ;“ß~üT¨R4-²M±P8¸U1›Í]È@­fz¼,¯¶£Á¶ŸìºH`ÚC£ ð,ñDŠz$ꔞ·ô·rYqFÄ2Ñ¿3&ÎÌ8eóržædÕâñ÷§†HîÓ»ŒzV«Gž¿xY²í±+žáç?`yÄ/½{?¬ CM}鮄˜#‰¼È5ò|ݲ2qСlº˜ŒgCøöí[ðø÷HpÖMÃYV$3Î`Ê‘ÉáÄ\ÌiDÖÀl‡âöâ(vVFÝ@‘J§FµNeÊ™Ìè†ñt=ºú¿ƒ•oþ Õtž?÷2Þ¹ÁƒÁ #ÓK÷°Äö,æòå¥= 6¤D#L:”™‘¢p/±ÞüìÉJ…ä6É]—S׎Q$3è_gÇYa1ƤÞðÓu¾h+É›úèX¥€°½ý2=+“/å³Å©‰wè#½+d>dŒ:øP¿™&EtåcÛ£å îÿöÓxøà1:çò›Ð Zh^í¦©°#˜:­9LÊ-H]›cûœ3z1!UY\£„-THvódˆZ.ëéX<•I§gR™Üh"‘S5íl&Wš(–Kÿ¶'T[/LŸÔ3f¨X¬:HZ¥èsí}#’ïDÒýùÓcøèþMe¯|{½¯UÍ$(s“,†0¼SŒX4MŠ2Ã}g[°P,d2ùX<™ššKgÏ+§Žn5 Ê#•–Þ#ñŠžË)Z6Hó…Fà#Õð©=ÍØ³J¯òRª3=]!Þ"¥K’ŸÚµ²ÿ£S³ÖÞ#'ñЯN]Ù âX´¼'+IıŸ†6n\ƒÈ‰„‘ÎäHE§æ²ÙüH"™M¦²çt]O¤³Ó^·;¡·«$«{ÕS·tþíFÉ»ß 5«ÃÞv ˆ£p“8‹ãÓwlÀæµ!Ÿyêèý3'I¢ä«Ni0¨¨tw|äÃC<¼ª_ù/4¹\œ^ˆÇå4¡À›ßxtßCS±äòóÃãÓñdf”„\<_(æB$Ú˜þ¨PmF"Ag'CUJV 1ô®i}¾·Çÿ>ûØÙ¡`vî¥øÑ¬FòZç¡óz¥«€ÔèÞ‘gÖÍŒ• QÀªœP|JçþqÿÈkõªŒ‹7Zð:Ÿ¶g•+¦“ÓÈp1øaÒmDD.•Rú|±¬’öÉ8ŒPĮ̀dœk§'†’b3r©­ßž¼/ÎEpó¶•w¾õ†uOûFgä’•ç8Ë|Ò/Šý«šÛÂÉóŸ<óƒÓ{F^MC…ê°…Wžªè_(ë'èýL.6®±ìE‹}fÉRăÆ]:Îy}Ar&H݉Ñó4`Wû ã÷ 8®±Ï$´5û=wl^vÏu­òíaÑn#s²¶jzΠʼn„KŠüÔïªÖÀf5‹ÃƱê"ÃØ«Ú˜™ª £ç_ç—ÕØJúƒ¡±Xº]‡{iùh±-åPã3å|~·è²ˆÛ¥ZoWTâ=AººY丠$¨Š(Ž-W‡ÆK4³Ö¬.2к°_÷úQ»ô3ר£bKj,f¨»±¼ £ÝïåFäùÆwþÆßE§FéµÏ#6w‰ù,›¼Ñ$qzH浈ě˼¢žvy¿x>÷JZerw¡t—Ï:À-2T^d¬g‘Ñ®ÆßÅEÎaQ­Î§ž¥]óÈ’±*ê¶wx×v¤¤è^vÐ(kÁÂ\Åæ z\2oyH÷ùDÞŠx%ó@¿üñdîì¢×edÞ¡%™w@¸$¢óÆr‹–½ìƃŒÆÒ¯æõ«[ìÿøë-B»QÜ‘Nz0¥ ~o¤¨E®È=»Úw5e}â\Ž#ã%‘³Ý2_£lpEÙ»ÿDêÅdÙ™–.W÷ó%µägÖyc%+K÷Š/ÿ«ñ¥—H·|åökq÷uíRnlâÚW^æ*EíðyÆlFÅl¦RÂM+“ïÞÞ¦&ƒb‹6W†!p¼Å9ãð»Œc¥ÖêwNN¥!ÑïíñŒºÒceÔ‹¯ýE?¶®ãÌÐØUgŸ«Öò¥ã¼G2%3‰:]A ·÷‡UÁ-žó¶ù¸.»þ+ Û°H“H2Çýó[V /ËÆ]7mÇDZÄÓGƒN&)ÞŒ¾kI…òD|úE­ûÇ ÐEÇž7…ñWÛ¢ˆ6¹`)\$<Ö#e2§M·ÛxmÅõˆu_ C1‰ u¼om=B:Xš‹÷¯Ó5>ȳß]ÙŽ•£¯xtôÍÀï)ÂåµÑº5­d5|èÐ4šš—!à’²Hy.ú>„ÿñ¹©ïÚ…¡ÚÈk|n,ÛbΤbj(ªž¸æ¤–õƒcÿÏC5ˆÍ/´ˆE]jzLlá«Zs@R‰Ž5¸x.Q­ŠÐs^[Ri®žÊµÀô¶AW5’5†ó±^U‘i6–øÇî9ìYÓ‚¾fÎ&tgLS–¦Ò9{õ¶òDßõÐ’Õ¦ÆûMB¸',G[›iµÊ²(ˆG÷È÷¢„5>w£HëŠ<» ÐÖSηnQö½æBRãImšüòžNqEO·[Që̹se¶K=üŸ²é@Ü+²þ7IEND®B`‚R2_2_5/images/updater-16x16.png0000644000175000017500000000177411667203025015475 0ustar danieldaniel‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<žIDATxÚ<“[LUÇÿsÛe¯³ ,» ;Ê6 H,…lHŒÔ>x‹O}×5ÆKRM|°>ø¤¦iLHšhŒ&R1šXÓ`¨%K¡5‘(…. Ë20»°,,{æ>;ã4žä÷tÎÿœ“ß÷}Dv½€ÿAŽu1_Ø¿T:¨„®nZáßÜöF¨5"jªV\^y´ÛêV¼Þ(Š šbh$ Ò ›–Ê7>³È¯|ºÃ?Q>ÕŽ´Lw_z†”¥c5|þà:½·W‚XØE8Ffh†A^|yËÙ,j¤ Iµá©i Z¦iœãPÜnA|j¿RG"­( ªµ&oÏ •kÓ|BîI§Ñ³ù-8ï6pás¬‘CøfECÆsŒ‘¨ê9ò±ÆÃœüœÃ0AÐÌoba~¾ÁF£P†Þ¸$w>ÄøôŒ/šHq-èâèïíÆéþSèK§@Ò4Ë~œJrs„­Þ¸;·ð†®¨HžBóÍIÔ“¯ás¿žÍc¸;xbŽã X*cc3º½Ý}M5zÄ?†=P†kZ+’¿ß‡¨˜…ÿú-lÉ6î¾õ6b’+4˜¦¿Ï·* -ËßÕqôú{WP*•0?7‡†¦!|Æó¯ÀôGИ¸‰Ï>ZÀ˜·³¿´‚Åìì€m7A—Ë`hJxº™3}¨í£´#@ýiòs/€ÿ] ŽàÎwÆ>¹"¿x3P½—Ax A@(”£Ñ64Ǩ×0ã&¾¼†&E£iÛ8¨Ö@)\É,"r¨·¦à„ÌÒûÒ§ôÊÃeÄqõlæ dUuV7rh¸"«îe…BkÛEŒÖshã+ þ&Áª&üÉÂXƳp^_[‡®i’®«e,r›É@¥RsëìA0ƹáNDã0µù'Fÿº ÖÔ1Ðÿ/èÜ&šŽm„‚D£íˆÇã°štÝp굺æçb;¦M–j+/"Ÿáëʳ`{¦§–Dáêä=ÐRCÂaù0'ˆ{’)W*G›®— o0$ÿþTZÜZUøÔÌ`&ÑÖ#Ü¿7›5w~ÄË_=š?™† \Q\['FΟ÷X6 Ë40;ýh†mÊ]¯&½—Ú}¤ øÒÛkU~Bj~‘3¬ÜŽ¢\4w~Aºx~LÀÅCR$žèr ÒŒÈz, RbÙ–ü×ù¶Ú´Ý3ú #?´(¼ÎÛ¶IEND®B`‚R2_2_5/images/down.xpm0000644000175000017500000000141011667203025014220 0ustar danieldaniel/* XPM */ static char * down_xpm[] = { "16 16 27 1", " c None", ". c #000000", "+ c #E5E5E5", "@ c #CACACA", "# c #AAAAAA", "$ c #D6D6D6", "% c #ACACAC", "& c #DBDBDB", "* c #DADADA", "= c #BFBFBF", "- c #EBEBEB", "; c #9A9A9A", "> c #ECECEC", ", c #A8A8A8", "' c #9E9E9E", ") c #BEBEBE", "! c #E8E8E8", "~ c #9B9B9B", "{ c #C7C7C7", "] c #C5C5C5", "^ c #E7E7E7", "/ c #9C9C9C", "( c #A6A6A6", "_ c #EAEAEA", ": c #9D9D9D", "< c #A5A5A5", "[ c #ABABAB", " ", " ", " ", " .+ .+ ", "...@ ...@ ", "...#$ ...%&", "*...=- ...;#*", ">...,$ ...'=-", " $...)! ...~#$ ", " {...]^.../({ ", " _]......:(]_ ", " _]..../<]_ ", " _]..;<]_ ", " _{[[{_ ", " && ", " "}; R2_2_5/images/updater.icns0000644000175000017500000034522611667203025015065 0ustar danieldanielicnsÊ–is32ô‚Ö´œ¨‚‡ZzwÙÛÝØÛY0Td¡œ”‡}€À£±ãÝÈ›‹~‡¢™“mVo¶’XÂáííÿÿ×u§äÓÈÍ·—Yh§üãâÿ|Èÿüôô»§ziiõÿßðìËÿÿûÙÏϱhn^çÿôþÝâÿöãÑËÎɱvÙõîïÏ"âÿÿᵺçû 'ÁÐÅâÿÏdãÿöâ•¢ÏÙ‘¼ýú÷êÒïÿÿõÍiÕÎŽ“®Yåð€ÿ BbÎ×› —²á€ÿ,?ÛãÛ×ÐÁª¥„Íþÿ·D+»¼©‰u™³ò¾jRNJ p„›|$‡ 9I^m €ÙÚÙ½¨¡©…–a‚‰ÞàáÝÛ{|’˜¦¨¤œ†‰Å©·çáÆœž•–žš™tay»™bÉæê£ªñóÇÍâ×ËѼžcr«ÿÓ{¬¯”ßÿýôõÀ­pnõÿßȪÇÿÿüÜÒÔ·bbZèÿÂZO´òÿ÷åÓÐÒ͵xàÆ »29èÿÿ㺾éiû£ÂmH´ÿÓPÆïö隦ÓÛ“»üÿýîÉ‚²¢¯¾l…ØÒ‘–±¡…fWtx”µDdÑÆ šž¤’µ’^h¥¶ CÝæÞÛÔĶ´’Omv+-À¯›U8U‡g%/VTO  '0;‡€äåáÊ·®³”¤œq‘™Žèêëçá—­··»·³¬£˜šÐ¶ÄñêÆœ«©¡ ¡¤†wŽÆ¦t×ðêfGÏÿ÷ëåÞÔÙÇ«x‡µÿÏ*@Çòóþþöú˺Š~{öÿߟ‡ÐÿÿýàØàÅKARìÿµRPîÿÿüéØÚÛÖ¾ä´ÈÙðÿæÅÈîiý§ÄjJ´ÿßpAsïñ¥±Û♿ûÿýïÌ=5+n¸xßÙ˜›¶¨ŒqM*,&R~QpÖË¥Ÿ¦¬š¦Ä&{….OáêãâÜÍÃÄ´k?^"!;ÈÍ»›¨L+Le, "^^X ‡  s8mkoâ¡\?$ ÿÿÿÿÿúí×µ”mmÿÿÿÿÿÿÿÿÿÿÿbÿÿÿÿÿÿÿÿÿÿÿTÿÿÿÿÿÿÿÿÿÿÿ~Ȧ·ÿÿÿÿÿÿÿÿÿÿÿ¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿçhtÿÿÿÿÿÿÿÿÿÿÿÿ|gÿÿÿÿÿÿÿÿÿÿÿø#aÿÿÿÿþöؽ‘Ãÿ´=DZŽiIkB×á0Ž¥ÂK ,7==O~•ˆf il32 •„×ÖÍݹª–‚©™zPU€jL`ŒlWisMRR„ÕÖÝšuŸ¨¨§§š”ƒqTe‹iRfsMRR€ØÖcØ×b%EXguƒ—‘“’s|oMSSÉÈÌÜØ×ר܆%&%'.YQ)_w{lr_sw~Š¥††¯©£¦„åäØäÄ·¦•¶§Žin®•€fz¡„p‹imm„äåäµ¥±µ¸¶µµ­©¯˜†l}Ÿk~‹imm€çåçÜËäÛÔÌż¶²­¯¯««¨™‹“‡jnnÙØÜêçææçæ‘Pfu‡˜©¶ÀÆÈÇÅĬ’¤¯¡c`aÐÔµ®ñêéèã÷ξ®Œxutv{ƒŽƒaeho¥iXZÑÖ¸q·öîìâô®—´ÊÿÿüõîæÜι´ªŸ”À~mpÑÖ¹yp©îLèÛýÂ) nûüìþÿñúúøôðíïô’wzÑÖ¹zwd…´ÙûÿÍ0 ~àõýêèú÷÷öõøöò¢OUÑÖ·utfFrÍùÿÿÊIDA}Éïäüýöâéì¾\bÒÕÄ¢œ”ƒXŸù€ÿÇx—¦¢Åù‚ÿô½ÖóÓy€Õ×Ò–nƒ‰eˆõ€ÿû½Ý…JÞÿýñêÕÍÞÝ~\ÞàÛr!6@/hò€ÿ¨xD‚ÿýñæã×ÌÖRàâܵykb@\èÿÿÆ]ÐÙåúÿqüó×åø©náâÙëùðæ¯~×ÿâ/+æÃ˜±ÅðØãÿÿüÛãþÆvØÚÍÖ÷øò¿~Îï? ·ÿý½xne[hÚÿþìîößhÆÇÁÍàòöÅ{ûYt~®ÿüþÿÜq,NB_ãøæÛÜät³³®ÌÜÛçÆzµû…ÿ¼76C>-ißÖ£‘‹gœœšÊáÚØ´q¨€ÿúòçØÌµ?9430v´˜vpcƒ‚Âåßß¶ŠÂ¹¬¡™|_aL (0,,&Ox}ueihg»âÒÓ«‹”‹ŠŠˆnfwdn"&&"nˆ‚Œ†~c^^W°ÛÁÅ©ˆ£¦¬²©–¥½ÅÒ¤$ )|„†€1%OOD£êÛÜÙÑÒÕרÕÃÅÖ×ÐÒ ?}…H€99/•íãâã€æáÜÔÊŶ ‰Ye}B‚//$Œ÷ëâÔʼ©¦–@G^kYnv4(Qƒ,.*[µ““¬€hRJ YX  …!.^AP~  (!3”€–  ’ 2% ‘ 0@ 39% €(‡'-Pa_;%"".SUA^­½§†)% lŒŽ„] &(,6Un™º³­°l8mk·åƤ_?*!ðÿÿÿÿÿûçй—vU3åÿÿÿÿÿÿÿÿÿÿÿÿøéË«ˆfF Ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿo·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊeɹ¤ŠkÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå"¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì!hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÄ¢‰oQ Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡4=üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH5÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô".ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿµ)éÿÿÿÿÿÿÿÿÿýôßÁž}M¸ÿÿÿS#êÿÿÿöâδzž, Úÿÿ¥mY=&^šÿÿ´‚ЈZ¬õÞŒ/,2-&"   .8y¦¤¤“vR4$  !+6@IPR[b]nˆ“Ž‹ˆ`  (/57860';?>lŽŒŠŒQ 2' TdciN $&HDG=-,,,& it32}›ÙOÛÑ_·²‘xfUDA@AABIOFBGE>FE;DG>DIEFMMIEGJBCF?AE>AEADGHGGPLFDGDAFC?EC@EFEGKKHFHICFEŽGÿ›ÙOÜÄ¥ûûùùöêÝζ†s]QM@;A?:DE;DG>DIEFMMIEGJBCF?AE>AEADGHGGPLFDGDAFC?EC@EFEGKKHFHICFEŽGÿ›ÙݶÈú€ñHó÷øø÷öôëâÖ¾©”~fUM@5>@8AIEFMMIEGJBCF?AE>AEADGHGGPLFDGDAFC?EC@EFEGKKHFHICFEŽGÿ›ÙOݹÃúñôøéÜÚãîóôôõôõöôîèÜȵ¡‡p^RF??FGECFJBCF?AE>AEADGHGGPLFDGDAFC?EC@EFEGKKHFHICFEŽGÿ›ÙOݽ¼üõî¦wmmwƒ‘£µÅÑÝéíïòóóôñíêßξ«“}kZJEC:=A;?D>AEADGHGGPLFDGDAFC?EC@EFEGKKHFHICFEŽGÿ›ÙOÜÁ¶þùœV`bcba`aackt}Œ­¼ÉÙãçìððïíìêàÓÈ´ˆu`NGA6:?LX^hu{|{wpkhd€cddccb€a+cdjs}‰˜§µÀÍ×ÜàääàÝÔÆº¨“}m]KCB;9@CCFKKHFHICFEŽGÿ›Ù$ÚÏ«úúxGV..DS_kqrru}‰’˜šœ—Œƒ}tomigdeed€cb€a#bhowƒ’ ­¹ÆÏÖÛßÞÝ×ËÁ°›ˆueSKFCDBBEHBFEŽGÿ›ÙOÚÒ©öý~@O-  0CDEHFB:;<5&4ZŸ¨Ÿ‹Ì‚ÿ&öçÛϹ¦–†wkc_][\_addbaacchpx𦰻ÈÏΧLEŒGÿ‡ÙáÜÙ$Ü¢éÿÄ/599:;;<>ABCDEHIHD@BA8)$/\ƒŠµ‰ÿ üñèÜǶ¦”‚p^`cc€dedbcbbdhmv ÇËv@ŒGÿ…ÙÚ×¢ÊãÙ,ݤèÿÿ•),334556789:;<=>@AABDGJKIC@BIUlš¬¿ÑÚåðý‰ÿ ûî·c\_`_abbceddbc¥Ð’@ŒHÿ…ÙÜÕO[´ÞŽÙݨçÿýÿ·]5,*'%%(*,.1245799;<<>>?A€BA>:=?BKVbp|Œ±ÄÐÜé÷þ‚ÿ…QZ€[\]^^_``abb]zΨFC‹Dÿ…ÙÜÕ^7LÐßÙQݬßÿûýÿùÖº§–‡xl^QE830-)'%'*,/13579;>?@??@@?>=<=?@AHQ[eq‘¥¶µqOTUUVWXXYZ[\\]^[kžO>‹Bÿ…ÙÜÕ]@=YÑߌÙÞ®×ÿýüüþƒÿ!þ÷ñéâÙÊ»­‘„vhZLD>94/**,/02469;=?A‚B€A@@ACINNOPPRSSTUUWWXYW_¸Ëd@‹Eÿ…ÙÜÕ]@E6\Ñß‹ÙÞ²Ðÿ€ýüúùúú€ûüüþÿþúöñîçÚζªŽ€seXRKD>62€4557:<>@BCFGHIJJLMMNOOQRRSSPªÕ};‹Cÿ…Ù ÜÕ]@D@:_ÐÝŠÙÞ¶Èÿþþ€ÿýý€û úúùøø÷öõôôó€ô!óôóõö÷÷øöôòðíëâØÏƽ²¤—‰}oe]TLD<;:8€7:=?BDFGIJLMOFšÙ•D‹Jÿ…Ù ÜÕ]@D@D=fÞÛ‰Ù Þ¹Àÿþøïñøÿÿýý€üûúúùø€÷ ööõôôóòñððïîí€ìëêë€ì$ííììëêêåÝÖÐɵ©‘…zpf]SJECB?=;;C­Ø²JDŠFÿ…Ù ÜÕ]@D@DFCœäÚˆÙ Þ¼ºÿþñÑ¿»Õþÿþþ‚ÿþþýú€ø÷ööõõôóòòññððîîíìëëéèçæåäãâããâ‚ãáÜ×ÓÎÊÀµ«¡—ƒ¥ÒÔÊTAŠDÿ…Ù ÜÕ]@D@DGF=žãÙ‡Ø ÝÀºÿÿû澦¤Îÿþ€ýþÿÿýú€ùø÷€öõ€ôóöñõ€óðïíìëëíèæääãáàßßÝÛÚÙÙ‚Ø ×ØÙØØÙÙØØÔÙÚg@ŠEÿ…Ù ÜÕ]@D@DGHB@á׆ÖÚÁ·€ÿþç½§¢Ñÿþü†ýûùúúù€÷€ö"ï䪬ßÛ×Ûæîõ÷ùóÐèêéèæåäâààßÝÛÚÚÙØ××Õ€Ô ÓÒÓÕØÛàå{>ŠEÿ…ÙÜÕ]@D@DGHDDAœÞÔ…ÓÖòÿþä¼§£Óÿý„üýþýú5ùùø÷øôÞ¤A&'&)6GWi}f’òîíìêééçåäâàßÝÜÛÚÙØ××ÖÖ××ÙÜàãçà•EŠLÿ…ÙÜÕ]@D@DGHDFEC›Û…ÑÓÄ­‚ÿü㽦¤Ôÿýƒü€ýüúùøùøãºP‡#LóóðïïîììëêèæäãáàÞÝÜÛÚÚÛÛÜÞáãæêéÖ°GG‰Hÿ…ÙÜÕ]@D@DGHDFGGC˜Ö„ÌÎĨý‚ÿý廥£×ÿþƒüýýþýû‚úëÆf‡$Üûòñòññðïïííìééçæäâáá€à âãåçéìðÞÒÃUD‰Gÿ…ÙÜÕ]@D@DGHDFGIHB•Ò„ÉÄ¢úƒÿý⺦£Öÿþ…ý þýûúúûðÓ„†¯ÿ‚ó€òññððïîììêèèççæçèêìíîòéÑÒÒgD‰Iÿ…ÙÜÕ]@D@DGHDFGIJGA“ЃÆÄœø„ÿüá¹¥£Øÿ…ý þþýûüõÛ›+…dýöõ€ô óôóóôóóòòññððîƒí ïðñòï×ÑÒØ@‰Fÿ…ÙÜÕ]@D@DGHDFGIJIFAˆÊƒÂšõ…ÿüâ¹¥¥Ýÿ…ýþÿýøß¯- 8JC>3*:ëüö†õô€õ€ôóóòññ‚òõñÛÓÔÔÚ›<‰Cÿ…ÙÜÕ]@D@DGHDFGIJIHG‰Ã½¾™ò†ÿýá·¤¥Þÿþ„ýþÿøÇ¨P"e—©¬©ÅBÁÿöõ‚ô öïÜÕÖÕÔÚ³FEˆFÿ…ÙÜÕ]@D@DGHDFGIJIHI%3™Á¸¹¹º˜ì‡ÿûÞ¶£¥Ýÿÿƒýþþÿ굩D-OegŽb€ÿŠ÷‚ø÷ö÷öõö÷ìÜ€×ÖÕØÉS<ˆ?ÿ…ÙÜÕ]@D@DGHDFGIJIHI'7R¯¹´´¶–æˆÿûß·££ßÿ…þÿÿê·§?$2=AJôüøùùøøù€ø‡ù øø÷øõöýöçÚÙÚÙØ×f<ˆBÿ…ÙÜÕ]@D@DGHDFGIJIHI'<1J«µ¯²“à‰ÿüÞ·¤¥áÿ…þ ÿÿê¶ : ×ÿƒú†ûüüû€úùúâ¾´ºÛßÜÛÚÚÙØ××݃;ˆAÿ…ÙÜÕ]<<9?DFBEGIJIHI'<9(1¢°­ÚŠÿûݶ£¨ãÿ„þ€ÿ äµ£5¡ÿûûƒüýþ€ýûùÕÀ¸˜›ÜßÜÜÛÚÙØ×áž=ˆCÿ…ÙÜÖZVxtcVOKGCBCDDF":819¤­‹Ò‹ÿûÛ¶£¦ãÿ…þÿÿã´ž.cÿþþýþþŒÿþþýûóÒ¿Á½“½ãÞÝÜÛÚÚÙß·HC‡Eÿ…ÙÝÌu°¾»´®ª¥”‡|j]XCB8/J¢ŠÌŒÿúÝ·¤¨åÿ„þ€ÿ᳜+,ëÿþþÿ ýöîé×ÃŦ«ã€ÞÜÛÚÚÜÎS>‡Bÿ…ÙÞ‘¿¶·¼»€º»»¹³®ª¥ˆma[MD‹ŠÅÿûÝ´¢¨åÿƒþÿßÇÅÅ‘ÿþüöðíìëàÇÆÆ²žßáÞÞÝÝÛÚÛÛjA‡Gÿ…ÙÞň¼º´wry‚‹’˜Ÿ¥ªªž‹}{x…½ŽÿúÚ´ž¿þÿ€þ„ÿñü‘ÿýú÷ôòñîîéÎÉɾšÒäßßÞÞÝÛÛã…>‡Eÿ…ÙÝǾ¸mGJKJKKLPSX\``YVZ_c…„¶ÿøÌ°èÿÿþþÿþýþôØü‘ÿþüüúùöóñîØÌÌÇ¡¿èââààÞÝÜä C‡Iÿ…Ù ÝÊz¢HJIFF‚G HIGB94233oƒ­ÿòÅß„ÿýüüýþÌß”ÿøõôóðîíßÐÐ̰¯äßÞÝÛàâÝâ¼JI†Jÿ…ÙÜÍzÁ¢FEd„ˆvogb[TI=632/e€£Žÿ÷ÎÕƒÿþý€üÿÛËøß©ÅÿúÝÌÇÅÄÂÁÆÕÔÓÏÆ®´³²±­§ÅááÑVC†Fÿ…ÙÛÑ|À¨C>©ÑÑÔÖ×ÖÑÊÁ¹§ŠtjbYoz™ÿüÖÈú‚ÿþüÿîÁëÖf—µŽÿîâæãàÝÚØ×Ø×ÕÒÐÌÇÅÄô“ÊãÞm?†Fÿ…ÙÚׄ¿¯B5–ÎÊËÐÓÓÖÛÛ×̳Ÿ›š›‰qÿãÃñ€ÿþþ‚ü ýüÆãâ†dñë•ÉÿõóõñíêçäáÞÜØÕÔÒÑÐÏÎÎË©¨äç†?†Gÿ†ÙÝ‘½·@2Bp‹šŸ¢¥«¯µ¸±›Šˆ‹€l‰ŒÿìÄçÿþýý„û ÿÖÒî±N½À¹ÉvÊŒÿüøøõòîêçäàßÜÙÖÕÓÏÌËËǬ¥ãè¤=@…Aÿ…ÙØà•¹À>/1-035:?CINTSNKLQUdlƒýŠÿóÈÝÿ‡û ÿéÄîÍgmŒvy~€dÙŒÿü÷óïêæáÝÚÝÞÜÙÖÌÉÆÅÅ÷ÎãèÀCA…Bÿ…ÙØá±Îj!,..//../..-*%!!"?i{ø‰ÿøÏÒþü†ûýöÃéâ‘JQABCCEE]ÜŒÿûóîìêæåçêàÞÜÖ·ÔáÞßàãæâæÕW=…Aÿ…ÙØá¯ÑÀf-#€$€% &'('# 9cròˆÿü×Èúþ†ûüÿËÖí°[3[Þ“ÿ øäßÞÙ¬Ëíèèçå€äåk;…Cÿ…ÙØá‘±ØÒЧ{gbXSNDD==7-&""2_iíˆÿãÁðÿ‡ûÿÞÅñÍhƒWè’ÿ ûèâáÛ·¹ìèççæ€äë‰>D„Eÿ†ÙᕳåÙר×ÓÐÌÊÇÅú·¨|qplfX_è‡ÿîÄåÿúùùúúùùøøùýï¹ó縒„[ã‘ÿþîãä߯¬éêèççæåäî¨:>„?ÿ†Ù៴îäâÞÛÚÖÔÑÎÌËÊȾ¨“Šˆ‹~STã†ÿóÉÚÿøø€÷öö÷ööøú¹ÛÿóÊ´…bæ‘ÿóååâÕ¨ÜíéèççæåíÃHC„Eÿ†ÙૺóêéçåãâßÞÛÙØÕÓɱ™ŽOMÞ…ÿùÐÍúö‚ô‚óüÅ»€ÿïȶ‰ƒkçÿ÷€åܯÈïêêè€çêÚX?„Cÿ†×Þ¶²ö€îëêéççæäãâà×¾¤™—™ŒKHÔ„ÿüÛÂñõïïð„ïôÙ¤ôÿðɶ‰ƒ%tãÿûèåæà¹¼ð€êèççèénA„Gÿ†ÔÙµ“èóððïïîííìëëêèàȬ¡ž ”IBÈ„ÿæÀãóëììë€êíçšÞƒÿñÉ·„‚-níŽÿþíàâÜ´ÃñìëêêéèèïŒ?„Gÿ†ÐÕµ‰Ñæôñðïïîïîìåͱ¥¢£˜H;½ƒÿïÄÕðåææ€åää€ãꤹ…ÿïȸ‚FïŽÿþ÷äÖɽæïíìëêêéèò©@EƒFÿ†ÍÒµ„ÏÌçô‚ñð ïèÑ´§¤¦œH5²‚ÿöËÇéáÝÝÞÞÝÝÜÜÛÛá¶“ú†ÿñɹ„µÿþûöêåîñ€îíì€ëïÄJGƒIÿ†ÊÍ´‚ÑÊÌæõƒñ€ð éÓ·¨¥§ŸH.¦ÿüÖ¾ÝÚ„ÔÓÒÒÖÄ~âˆÿò˼€„v‘ÿûøöôñíìêéæåâàÞåßWCƒGÿ†Ä ǵƒÑÍËËãôò‚ñ ððêÕ·©¥§¢J'š€ÿþâ¾Ô×ÐÓÓÔÑÐÐÎÈx»Šÿ ñɺx#31"TôŒÿýú÷öóðíìéæääææçèéêçéêp=ƒDÿ†¿ Á·‡ÑÎÍÌÊÝòó‚ñ ðëÖ¹ª§§¥K €ÿëÂÃÀ°«¦ œ”ކ€zwve”þ‹ÿ ñÕÕÎÙΗu€ëŽÿüúùûùöêíøøôîíêèæÜèíóŒ:ƒEÿ†º»¹ŒÏ€ÎÌÉÖîô‚ñì×»«€¨MˆÿÿðÇ‚eeilsy~ƒ†Œ“œ±Öûƒÿþþýüƒû÷öþø»†~Ðÿûüÿÿñòñô³¯ÎÈʽ²·¥«©Óîõ¬?B‚Cÿˆ¶…ÉÏ€ÎÍÊÐæôò€ñ&íÙ¼«¨¨«O}ÿýåÉÀÀËÏÔÙÞáäæêìîïöþúø÷öõõôôó€ô õ÷øúüþÿÿÖ”²ÿöÏÄÁòÛ¾Êò»Ìô¡¨Æ»¾´¹Åäü·?@‚Aÿ‡°±|ÃÑÏ€ÎÍËËÛïôòñíÛ¾«¨¨¯Rqÿþöñôôóô†õö€øùúûüþþ†ÿè €–òÿýäŵôØÓáóãóè×À´íöôùû÷òé{@ƒGÿ‡ª¬w¿ÔÏ‚ÎÍÊÐãñóíÜ¿¬¨¨±Ueýÿøöö÷øøùúûüüþ•ÿô°„ƒÛÿüíîþ„ÿ ýïéâϽ¬šˆv]D„Iÿ‡¥§t»ÖÐÏ‚ÎÍËÊÕæîàÀ­¨¨±[Xù¡ÿü‰{»“ÿöìÝÏ­›}n]NIDCKGCAG„Iÿ‡Ÿ¡t¸ÖÑÑÏÏÎÍÍÊËÒÓÁ°©¨°`Kô¡ÿÕ‘zœø’ÿî§•‹«Â¾§52=BCEEIUOJEG„Iÿ‡™œu¸×ÑÑÐÐÏÎ ÍÌÌÈ»¨¡¥¨²h?ð ÿå}„å“ÿþúì‚ÿ ¾;BFFGFJUOJEG„Iÿˆ•x¸ØÒ€ÑÐÏπΠÍÍʾ¥’’£j9ëŸÿù¶†zÇÿ y:FFGFJUOJEG„Iÿ‡v¯ÚÓÒÑÐÏÎ Ë¿¨•Ž‹b4åšÿ ûîßÒÔaIŠþÿ º4FFGFJUOJEG„Iÿ‡†ˆp¡ÜÔÓÒÒ€ÑÐÏÏÎÎÍÁ©•’k+בÿûôçÙÈ·£ŽzmaTKMOSoêžÿ °/GFGFJUOJEG„Iÿ‡€‚l—ÜÔÔÓÓÒ€ÑÐÏÎÎÍë—Ž…-“ˆÿûñéßν­¡’‚wl\NJJKMMOQU^gnÓŸÿ íj@FGFJUOJEG„Iÿ‡y{gÝÓ€ÔÓÒÒ€Ñ%ÐÏÍÄ­˜ŽŽ’w1+¡ìýøìâ×Ų¢™€vtspptwxvlb[€X€VW[eh¬ÿúúýÿ Ã9FGFJUOJEG„Iÿ‡sucŠß‚ÔÓÓÒ€ÑÐÏÅ®™‘Ž’ŒunŽ‹xvwxz|~€„ …„‚€~wka\YYX[cfñøô÷žÿ ½:FGFJUOJEG„Iÿ‡mn_‡àÕÕÔÓÓÒ€ÑÐÆ°š‘Ž’‘‹‡ˆŠŒŒ‹‰€ˆ†……„ƒƒ‚€}ui_]\[€Z\ci~áüõöýžÿ ½:FGFJUOJEG„Iÿ‡gh[†áÖÖÕ‚ÔÓÒ€ÑȲ›’€ŽŒ‹Š‰ˆ€‡ ……„„ƒ}rg`€^ ]]^ajo‡Þüöûÿþê»­–ÿ ½:FGFJUOJEG„Iÿ‡abX€ß××ÕÖ××ÖÕÕÔ̶Ÿ”’’‘€Ž‚Œ‹Š‰ˆ€‡†……„‚|pfb``__`ciqxv}Äüýñá̱žxF4†–ÿ ½:FGFJUOJEGIJNLÿ‡[\StÚØ€×ÑËÉÈÇÇÅĺ§‘†„‚Œ‘€ŽŒ‹Š‰ˆ€‡……„yof€cbbfls{}~|~¦ ‚~…uYN¡–ÿ¼:FGFJUOJEGIIJNI.ÿˆW OhÖÚ×ØÊ¬§§¦¥€¦¥Ÿ}tqfi‘€€Ž€Œ ‹ŠŠ‰ˆ‡ˆ††xoiklr}†‹Ž‘“—™šŸƒh^²–ÿ¿5EGFJUOJEGJMI. ÿˆO J^ÓÜÙÖ¿º½¾¾‚½·¦…xb‹‘€Ž€ŒŒ‹‹ŒŒ†}wuwxz}ƒŽ˜Ÿ¢¤¤¥¦§¨§©xpÊ–ÿ ùŒ?GFKZTOIKI. ÿˆJ FVÒÝÙÕÂÂÄÄÀÁ½«•†€sh‘€‘€’%““•˜˜š›ž—Š‹ŒŽ– «°°±²²±°¯®¯®¬«®˜ˆ…ݘÿ Á>HE51.++ ƒÿˆDH@OÐÞÚØÈÁÄÃÂÀ¾¼»¹³¥”…y†—•––—™›Ÿ ¢¦¨©«®°³µ¶µ°¦žœœ¡©³¹¸¸·¶¶µ´²°®­«¨­¥˜ší˜ÿ• ‰ÿˆ?;IÏÞÚÛѽ¹»¼º€¼·¨¡¡£¢¥¨ª¬¯±´·¹»½ÀÁÂÁÀÄ¿µª€¥¤¦­¶º»¹·µ³±°®¬ª¨¨©¨²´§²ù–ÿëFÿˆ;7DÍÞ€ÚÐÉÌÐÓÕÖÕÖ×ÔÎĽºº¼¾ÀÃÄÇÆÇÉÊËÊ€ËÉÊÉÈÆ¾³«¨€¦ª±¶µ´³‚² ³³´²±°®¾ÀµÍ–ÿÆ2Žÿˆ63>Âá€ÚÛÜÛÚÙ€Ø×ÖÕÓÑÏÍÎ΀πÐÏÎÍÍÌÊÈÅ»²«¨¦¦¨­µº€½¼½¼ºº¸¶¶µ´³±¯ÉÎÄâ„ÿþþýýû‡ýÿÿÿˆ2/7´ãÛƒÚÙØ€×ÖÖÕƒÔ&ÓÒÑÏÎÍÊÈÈÆÅÅÄÄÅÄÀ¸²±±²´¸¾ÁÂÁ¿¾¾¼¼»º¹¸¶µ€·ºØÚÕòÿþýüûúø÷ø…ûüÿãO‘ÿˆ-+0ªåÜ€Û‚ÚÙ€Ø ×ÖÕÓÑÐÏÎÌʀɀÊ2ËÌÍÎÎÍÌÉ»·¶·º¾ÂÃÃÂÂÁÀ¿¿½¾¿¾ÀÁ½µ³ ›èååüþýýûúù÷öõóò÷ƒùøþÿÊ(’ÿˆ+)*¢åÜÝÜÛÚÚÙ×ÖÔÒÐÐÏÎ΀ÍÎÏÑÑ‚ÒÑÑÐÏÎÎÍÉÄ¿¼»»½ÂÆÇÆ€ÅÈÈÇÇÄ·±§Žu^MJ»õîñûúù÷öõôòñïíïõöõöÿð‚”ÿˆ(&$›çÙÖÕÔÓ€ÒÓÔÕÕ€Ö€×ÖÕÔÓÒÒ€Ñ1ÐÏÏÍËÈÆÃÁÂÅÇËÏÑÏÍË»®§yo[NLD@BBC—ÿù÷÷öõóòðïîìëéçïôóûÿ&•ÿ‰#–éÙ××ÚÛÛÚÛÚÛÛÚÙÙØØ××ÖÖÕÔÓÓÒÑÑ€ÐÏÎÎÏÑÒÑÎ;ª¡ŒqgWIA@@>DFKHFB5Âÿ€ú òðïíëêéçåäáåïðÿÏ[—ÿ‰#”êÞÞÝÝ€ÜÛÛÚÙÙØ×ÖÕÔ:ÓÓÕÖÖØÙ×Íȼ£—‰k_TG=?B:>GBBGEGHLH7Y²üýúûôëêèçåãâàÞÜÚèíììõö“˜ÿ‰#‡èßÞÝÝ€ÜÛÛ‚ÚÙÙØ×=Ö×ÚÛÜÝÜÏļ¡‹fWXU>AC>BG@BH@BHCCGEGIG?‚áÿýúûùéäãáßÞÛÚØÖÓÞêéìôÅ]šÿ‰#xäàßÞÞÝÝ€ÜÛÛ€Ú€Û@ßàÞÝÜнµž‚vaOD@?:@LYme`KA?GACH@BHCCGIKDa­ÿÿüüúüïÞÞÜÚØÖÔÒÐÌÒåéôíg›ÿ‰#<mãàßßÞÞÝÜÛÝßßâäãÜÚзª™yk]LA?@:DHFGHMHEEICCHCDJBFJ{„€†Ž›£§©§£  ˆ&€nëÿüûýôÊÂÁ¾½»¹·¶Â§J£ÿ%$$ƒ#4!)C>AD@CH?BI@BF>DHFGHMIHHLGGMF482XЇ…›ˆ“¡¨ª§£  ˆ&€nëÿûýøÊº»¹·µ³°µ¾z¤ÿ !&$#!*HFGGBDH?BI@BF@FJKLMSH99>"ƒ9Œ˜¡´«•¡¨§£  ˆ&géÿþ󯳴²°®¬¬µ¤C¦ÿƒ$$##!*HFGGBDH@DKDGI5;=Œ)y¯ÆÒÉŸ’›Ÿ Ÿ ‡€ ùÿë»­®¬©¨©±«k§ÿ† %%"+JHHJGIM;;C$–(U·ÐðÊ¥–’‘’‹fC:‰ÝÿùÔ®§¨¦¥ª® n'©ÿˆ &B@C2 ›òÿêÜÒÉÌÙçýÿúÚ¶¤¦¨«¨ž‚L«ÿŠ€¥#xÇßõÿÿüôæÏ·¦ ›‚^G! ©ÿ¹ 4LME@?<=3* +373.# §ÿÃ#3?HMRW[_aaZJ+ ¥ÿÀ +:DJQV\bjqy€‡“‰a&¤ÿ¾*7?FJPW\dlt}…”œ¥®ªƒ,¢ÿ½ (7@DHLPV[`ekqw}‚Š—Ÿ£™_¢ÿ»1DOTXYXWWZ^`cfilpty~ƒ‰Žr.¡ÿ¹%Hervwwutoic`_acehknrty}†ŒP¡ÿ·!QŸ¨¤›‹€z{}|tlggjlnruwz~‚†‹u/ ÿ´$ M‚ÃÞàÔí‰aOKUn„Šƒzuuwy|‚…‰Ž•™”] ÿ²& gÓÿýöæÐ¾¬‚< @xž§£š‰‰ŠŠ“—›Ÿ£§¬¬Œ5 ÿ± kÔÿÿùðÚ¿©¢©i‚ T§ÅÇ¿¶«¦¤££¤¥§ª®³¶º½²i Ÿÿ¯ sðüþöèͱ ™‰»{ƒ¦àäâÚÐÉÇÄÁ¿¾¿ÀÁÃÅÈÌÊŸ/Ÿÿ­>†ºÔæïãÆ©œ™œ·zƒ¤ôôõñìèçäâßÜÚÚØ×ØØÛÝÌhžÿ¬ƒ¢›¨ßäÛ§žœ¥¡‚·zƒ>Øüúøõñôøùøõòñïí€ëììë±"€˜ÿ«\´ÏÆÂ½×Ô¿§ Ÿ¦° ‚·zƒ™ÿüùöðëðûÿþýüüúú€ù øøúóƒ,kÓçÈk#† ‡ÿª\ÝÔÎÍâØÈ¼¦¡¤›¢° ‚¼|‚ 2ùÿÿùîæÞâö‚ÿ„þÿÿûàó‚ÿïÍ#‚Odn`io†nrBÿ¨$s…„„€´Á¸¥ž£ª•¡¯¡†˜pF8E?C‰ùýöðåÛÐÑìþ”ÿ ß% (VW^gs‚jsƒ†€„ÿ§|€‡…´±¤š›¢ËÈÉÒÆgMVYDTNZM‡ÜýöÛÐÁ¿Ýû•ÿ ÎYnoh\cp~hqˆ}ÿ¦_¤­§¨¥¦ –—™žÑØÛ¿|KTYVBQKWUI]nÔ²¬Ìö”ÿ ëš^fke[cp~hqˆ}ÿ¥2¨¨‚¤¡œ™‘˜—ŸÙË{^[RTYVBQKWURQ?Vž­£›»ï“ÿ Ôtjcfke[cp~hqˆ}ÿ£ N›‘‚ ‘‘Œ‰Š””¡¡]I_`RTYVAPJUSRT^g|˜”‰§æ‘ÿñ¦dgpcfkeZan}gq€ˆ~ÿ¢ Oq…g ƒ…ƒˆƒuVGT``RTXVDSS\hnxˆ”ž ‰w“Üþÿý¤fnjpcfjb[k|‚orzˆyÿ¡hr„p"os{yz€ŒŠfYVLS`_QS^aery„–Ÿ§°´¶¥~eÓþÿÔ†pniobdry†°±—vgˆhÿ .]j†f!nppu‚yeX\VJR_cbk~†Ÿ©°·º»º¹·¡rVuÏþŽÿºnliuz‹ ´ÃÐßݵ‚qˆrÿŸ?phe†f dgjrxZVYZ\^hu‡­´º½¿¾½¼º¸·´ ui–àÿ곊‚x¢¶ÈÕÜÛÛç仃eˆgÿ<`[†Z"[[\_`cbXbmq’›¨µ¼ÁÄÃÂÀ¾½»º·¶·½º­¼ÞùŒÿß­‹ŒŠ•©»ÇÎÜâÙËÂÑæß²wˆyÿœQZ‡S"TSQTY^fv}¥²½ÂÆÇÆÄÃÂÁ¾¼º¸·¹ÂÐáìðøþ‹ÿøÌ ™ ¬½Ðßä×ÅË˼·¿ÙêÙ§ysˆtÿ›ÝOßÖg‡»¶—m]MJIJJKRXOKPOHNMFMOGMRNOVVRNPSKLOHJNGJNJMPQQPYUONPMJOLHNLJNONPTTQOQRLOOŽPÿ›ÝOßÉ©ýüúúøìàк£zeZVIDJJDLMFMOGMRNOVVRNPSKLOHJNGJNJMPQQPYUONPMJOLHNLJNONPTTQOQRLOOŽPÿ›ÝOá»Ìüóòòôøùù÷÷öîæØÃ¯™…n^VI@GHAJRNOVVRNPSKLOHJNGJNJMPQQPYUONPMJOLHNLJNONPTTQOQRLOOŽPÿ›ÝOá¾ÅûôöùêßÞæðõõö÷ö÷÷õðëß̺¦ŽwfZOHIOPOLOSKLOHJNGJNJMPQQPYUONPMJOLHNLJNONPTTQOQRLOOŽPÿ›ÝOàÃÀüöð®‚yz‚Ž›«»ÊÖáëîñôõõöôðíâÒð™„sbSOMCFJDHMGJNJMPQQPYUONPMJOLHNLJNONPTTQOQRLOOŽPÿ›ÝàÆºþù¤dmoponmnnpx€ˆ–¦µÂÐÝæêî€ò0ðïíãØÍ¹£|hWPJ?CHEJOQQPYUONPMJOLHNLJNONPTTQOQRLOOŽPÿ›Ýß˵ÿñxglkmmop€o?@BCCDDEFE€FILNORZfvŠŸ¯ÂÓÜåñý‰ÿúî¹mhjkllmnnoopqqpoo®ÖšIŒQÿ…ÝàÙXc¹âŽÝ6á®èÿýÿºa:1/,++.02578;<>@ABCDEEFGGFFDCDFILS^jvƒ’¢´ÇÑÝê÷þ‚ÿŠ]eefggiijkklmnni…Ô¯PL‹Mÿ…ÝàÙe@UÕãÝ%á±áÿüýÿùؼ©™Š|obWJ>9620-+-0257:<>@CFFG€H(GGFEFGHIKQZcly‡–©¹¹xZ^``aabddffgghigwÌÅXG‹Kÿ…ÝàÙeIFbÕãŒÝá´ÚÿýüüþƒÿCþøòêãÚ˾¯ ”ˆzm_RIE?;5114679;=ACEGIJKJKKJIJJIKMSXXYYZ[\]^_`abbcbjÀÒlI‹Nÿ…ÝàÙeIM@dÕã‹Ýá·Òÿ€ýþ€üû€úûüüýþþ‚ÿû÷óðéÜÐŹ® ’…wj_XQKD=:€<==?ADFIKLNOQRSTUVWXYY[\\]^[²Û„E‹Lÿ…Ý àÙeIMJDgÔàŠÝ â»Êÿþþÿýÿÿ€üû€úùùø÷öõõô€õôõö€÷/ùúùöôòðíåÛÒÉÁ¶¨›Ž‚ulc[SJCCBA@?@BFHJMNPRTUWXO¢ßL‹Rÿ…Ý àÙeIMJMFnâß‰Ý â¾ÃÿþøòÜÇû‚ÿþýüûúùøùø÷÷öõôôóóòñ€ðïîîíìîï#ðïîîííèáÚÔÍÆ»®£—‹€vmdZQMKJHFEDK´Þ¸SMŠOÿ…Ý àÙeIMJMOL¢èÞˆÝâ¾ÿÿñÑËj¾ÔÖÞåìñöû€ÿ÷úø÷ööõ€ôóòññðïîîíììëêéèèæååæçèèæáÛØÓÏÅ»±§”‰«×ÚÏ\IŠMÿ…Ý àÙeIMJMPOF¤ç݇Üážÿÿû澯s:}ˆ„‡‹˜¡¬¶Ãßòû€ùøø÷öõóòôõóòñðïîíìëìêéèçæåäââáàÞÞ€ÝÜÜÝÜÜÝÞÝÞÙÝÞoJŠOÿ…Ý àÙeIMJMPQKI£äÛ†ÚÞÆ»€ÿþç½±n>‚ˆ€ƒ‚€ Ûòýúú€ù3ø÷ö÷ñÝàùûúúûýýüûùúëììëêéèçåäããáàßÞÞÜÛÛÚÚÙ×רÙÚÜßäèƒGŠNÿ…ÝàÙeIMJMPQMMK¢áØ…×ÚǶÿþä¼±o=~„€ ƒ}¡Ùòýûú€ù$øùõÕÁæÒ°³²µ¼ÅÍÖᨽóðïîíëêéèæåäãáßßÞÝ݃ÛÞàãæêäœNŠUÿ…ÝàÙeIMJMPQMOOL¡ß…Õ×Ȳ‚ÿ ý佯p:„€€€€|£Üòýûúùùúúà¼ÚÔœ˜™šš€™%¡qkðõñðñðïîíìëéçæäãááààßÞÞßàáãæéíëÛ·PP‰Qÿ…ÝàÙeIMJMPQMOQPLžÙ„ÐÑÈ­ý‚ÿýå¼®e<‚„€€€€}ªÝôýúûùúéÁÑΖ”—˜€™'šUÝûôóóòñòñððïíìëéèçæååäãäåæèêëîòáÖÈ]M‰Pÿ…ÝàÙeIMJMPQMOQRQK›Ö„Íɧûƒÿýâ»°a;…ˆƒƒ ‚±ÝòýûüðÈÈÔ˜Ž€“€”§[²ÿõ€ô óóòòññðïîíë‚ê ëíîððóìØ×ÖoM‰Rÿ…ÝàÙeIMJMPQMOQRSPJ™ÔƒÉÈ¡ø„ÿüẬa=Œ‡€ˆ‡ˆ†Š·ÚòÿöÔËØš…ˆ€„ƒ†…£Švü÷ö€õöõôôõ€ô€óòñð‚ï ððñòôñÛÖ×݆I‰Oÿ…ÝàÙeIMJMPQMOQRSROJŒÍƒÅŸö…ÿüâ¼­\C”’‚Œ‹‘ÁÙðà±£§{ƒŠ¥¤ ¬£—ª^çü€÷„öõ‚öõõ€óòóóôóôöòßÙÙØß£FMˆLÿ…ÝàÙeIMJMPQMOQRSRQP#ŽÇÁŸò†ÿ!ýẮQFž™“””““’œË׫_O„´ÚçëííòbÂÿ„÷öˆ÷öö‚õöøñà€ÚÙÞ¹ONˆOÿ…ÝàÙeIMJMPQMOQRSRQR*<žÅ¼½½¾ì‡ÿûÞ¹ªSF§ ››šš™š˜©Óį¨PS‡œ¹ÌÕÔò…ÿ‹øù„÷ ö÷÷ïßÜÜÛÚÚÝÎ[EˆIÿ…ÝàÙeIMJMPQMOQRSRQR,>Y³½¸¸º›æˆÿûߺ¬OP±©£¤¤£¢¢¡¶ÚÀ°§MP†š®¸É©Zóü€úƒù‡úùøùúööý÷éÞÝÞÝÜÜÛÛÜnFˆKÿ…ÝàÙeIMJMPQMOQRSRQR,D9P®¹²µ—á‰ÿ üÞº­H[½°«¬€«ª©ÄÞ»²ŸHR‹šHÔÿ€úûˆü€û úûã¿´»Þâàà€ÞÝÜÛá‹DˆJÿ…ÝàÙeEECIMOKNQRSRQR,DA/4¦´±”ÜŠÿ ûݸªG^ʺµµ€´ ³´ÐÞº³¢GYt„F¡ÿ€ü…ý€þÿþþýýüúÔº›ßâáàßÞÞÝÛå£FˆLÿ…ÝàÙb_|k^XTPMLMMNO'B@8=§°Õ‹ÿúÛ¹§EgÒ¾ ½¿Ûݵ³žCr_jþÿþþŒÿþþüõÔÂÄÀ•ÀæááàßßÞÝã¼QL‡Nÿ…ÝáÑ|·ÄÁ¹³°­œˆ„se`JJ@6Q¥ŽÏŒÿúÜ»ªDoßÍÈÈÇÇÈÆÉ䨝´šKFé“ÿý÷ðìÙÅÇŨ®çâááààÞÞáÓ[I‡Lÿ…Ý âǗ޾ÂÁ¿À€Â ¿¹µ²­sf`SJŽÈÿûܸ¤;ußÓÑÐÐÏÏÎÓîØ²ÍÃÉ’ÿýøóðïïãÊÉÈ´¡âäââááà€ßsK‡Pÿ…ÝáÊÂÀº—|‚‹”›¡¦¬±°¤„‚}“‰ÁŽÿúÙ¹¢-¤èØÙßïúû´®ý’ÿüùööôòòìÑÌÌÁœÕèäã€áàßçŒH‡Nÿ…Ýá̇ľwSVWX\`dgjjb^aehˆˆºÿøÐ¬vºîââãçøñºuV,Kú’ÿþÿýûù÷õñÙÎÏÉ£Áëååäãááàè¦L‡Rÿ…Ý á΂ȩSUUTTUU‚T RMC<:<<;7k„§Žÿ÷Òš¶ûöð÷ÿÛ` ),‡ÿçßéÿúßÎÉÇÅÄÂÈ××ÕÒȯµ¶µ³°ªÈåäÖ_L†Oÿ…ÝßՄƯMI‹¤§­²µµ³­«¥–~me_Wp}žÿüß žô€ÿï˜4&(*HïÒ«ÝÖáŽÿðåèåâàÞÚÙÚÚØÕÓÏÉÈÇÆÄµ”ÍçâtI†Oÿ…ÝÞڋŵJ@~¢¡£ª¯¯´ºº¶¯›Šˆ‹Œƒu•ÿ鯟îÿÿݘ>$$%Ó㣾üùßëÿ÷ööóïëéæãàÞÛÙÖÖÔÓÒÒÐΫ©èëŒH†Pÿ†Ýà—üG € ‚  ’…ÿïȸ&)XÏÝãýŒÿùå×ËÀèñ€îíìëêô®JOƒPÿ†ÑÕºŒÔÐêõƒò€ñ ðêÒµ¨¥§J8µ‚ÿ÷Ó~A  … Kü†ÿñɹƒ  ‹ß×ôÿý÷ëæðôðð€ïîîíòÉSPƒRÿ†ÎѹˆÕÏÐèöóƒò ññêÔ¸ª¦§ K2ªÿûá@ „ Ùˆÿò˼€ WÓÉߎÿüúøöòîîíëèæåãàçá`NƒQÿ†È ʺŠÔÑÏÐåõôƒò ñëÕ¹ª§¨£K*ž€ÿýë£H€ ¤ŠÿñÉ»w%31"=©·¹õÿþúôïü€ÿýúøøôñïîëçååèèêéêìêìíxFƒMÿ†Ã Å»ÕÑÑÐÏàóôó‚ò ìÖº«¨©¦M#”€ÿï·F‡kŒÿñÕÕÎÙΗx{˜¡šÒÿüú÷ôïëæÞáý€ÿüúùüú÷êïúùöïïìêçÝêðö“DƒNÿ‡¾¼“ÓÒ€ÑÎÙïõóòíØ¼«¨©©OŒÿÿòÆN&1=ITajoy„‘ªÑúƒÿþþýüƒû0÷öþ÷»‡ƒ‡‹†¦îðíêèåâÞÚÖÎÜÿüûÿÿòóóõ³°ÎÊ˽³¸§¬ªÔð÷±HK‚Lÿˆ¹ ‹ÎÓÒÒÑÑÎÔèõô€ò&îÚ½«¨¨¬Q€ÿýæÇ¶ÂÍÒÖÛáåèëîðñòøÿûø÷öõõôôó€ô5õ÷øúüþÿÿÖ”‰…zwÎæàßÝÜÙÖÒÍÉÅÂÒÒÅÁòÛ¾Ëó½Ìõ¢ªÇ¼¾¶»Çåý»HI‚Jÿˆ´ƒÈÕ€ÒÑÑÏÏÝðõóòîܾ­¨¨¯Stÿþöòöõôõõö„õö€øùúûüþþ†ÿ-è †…okg¥ÜÕÔÓÑÏÌÊÆÃÀ¼¹´ÌË·ôØÒáôäôéØÁµï÷õúýùôëJƒPÿ‡®°~ÄØÓÓ€ÒÑÑÎÔåóõïÝÀ­©©±Whþÿøöö÷øøùúûüüþ•ÿô°††k_[zÉÌÈÇÇÆÄ¿½º¶³°¬®Üñþþƒÿ þðëäÓÁ°Ÿ~eM„Rÿ‡¨ª{ÀÙÔÓ€Ò€ÑÏÎØéðàÁ®©©±\\ú¡ÿ.ü‰†qUT[¬Ã¿¾¾½»¹·µ³°­«¨¥ŸµúùíßÑű¡’ƒveVRMLSOLJP„Rÿ‡¢¤y½ÚÕÔÓÓ€Ò€Ñ ÎÏÕÕ°ª©±bOõ¡ÿ.Õ„yQMI†½¶µ´³²±°®¬©§¤¢ žœ—ª©‘°ÅÁ¬@>9r¦Ÿžœœš™˜••“’ŽŒ‹Šˆ‡‚ˆÓ‚ÿ ½>OOPOS]WSNP„Rÿ‡‰‹u¦Þ×ÖÖ€ÕÔÔÓ€Ò ÐÄ­™’–m/Ù‘ÿ.üôéÛ˺¦’~reYPRT_c>86R™š˜˜—•””’‘ŽŒ‹Šˆ‡†„ƒ‚v“Øÿ ·;OOPOS]WSNP„Rÿ‡ƒ…pà××ÖÖÕÔÓÒÒÑÆ­™’‘“‰/—ˆÿ8ûòêáÑÀ±¥—‡|paSNNOQRSUZbnxN459„™”“‘ŽŒŒ‹ˆ‡†……„‚‚~{y‰°Ê€É ¹aLOPOS]WSNP„Rÿ‡|~k–á‚×Ö€ÕPÔÓÓÑÈ°š’’‘•z4.¥íýùîäÙǶ¥’…zyxuux|}{pd]\\[ZYY[`jw\350e–Œ‹Š‰ˆ††„ƒƒ€~}z‡£Á²«´¹· À—HOPOS]WSNP„Rÿ‡vxgáר€×ÖÖ€ÕÔÔÒɱ›“’’‘•wr†“†}{|}~ƒ†ˆ‡€ˆ‡†‚{od^€\&[[\_gvk831HŠŒŠ‰ˆ‡†…„ƒ‚~~|{{zyuš»Ýº¨±¹º À“HOPOS]WSNP„Rÿ‡pqcâרØ×Ö€ÕÔÔ˳œ”€’‘’•”Ž‰ŠŽŒŒ‹ŠŠ‰€‡0†„‚zmd`^]]^^`fqq@237w‹…„ƒ‚…†ƒ~||{zyyxxwvrœµÄ¸¨±¹º À“HOPOS]WSNP„Rÿ‡jk^ŒãØÙ€Ø€×ÖÕ̵€“€’€‘ŽŒ‹€Š ‰ˆ‡‡…€vkeba€`%bfnysC0/]‡‚„„ƒp^d}zyyxwvuttsrq¢·´±©±¹º À“HOPOS]WSNP„Rÿ‡deZ†âÚÙÙØÙ‚Ú ÙØØÏº¡—•–”€’€‘ŽŒŒ‹€Š‰ˆ‡…€tif€d'ccfmv{€{NH„‰ŒŒ‰‹b5(J|wvutssrqpomq§°®®¬±¹º À“HOPOS]WSNPRSWVÿˆ^VyÝÜÚÙÙÓÏÍËÊÊÈÆÄ½ª”‰†„”’‘‘ŽŒ‹€Š‰ˆ…}rjg fhnwƒ„†ƒ…‘€‹W0.Sytsrqponmnlivª®€­±¹ºÀ“HOPOS]WSNPRRSWR3"ÿˆYQnÙÝÛÛÍ®€©¨¨§¨¦¡‘vthk•”“€’‘‘ŽŒŒ€‹+Š…{rmllmnpvŠ’•–™›™›ž ¢¥]:8Ztponmllkkjid€´µ´¸º¿”EOPOS]WSNPSWQ4ÿˆRMdÖÝÛÙ½ÀÁ€À º¨’‡„zcŽ”““€’€‘Ž€€Šzyz|~‡“ž¤§¨ª¬ƒ®°®`BBbomlkkjihhggbŒ²‡®¯®sLPOTc\XSUR4ÿˆL H]ÕÞÜ×ÅÆÇÇÆ€Å ÄÄ¿®—ˆ‚vi’”ƒ“””•––—˜™›žŸ¢¢¡š‘Ž’•𤰶¸¸··¶€· µµ³µ¬_KNglj€hggfddcb›¶ˆ² ´·“KQN:6410ƒÿˆG/CUÔàÜÚÉÄÇÆÄÂÀ¿¾¼µ¨—‡‚|‰š˜™™šœžŸ¢¤¦©«­¯±´·¹»»µ©¡ €¡¥®¸½€¾¼¼º¹¸¸¶´²²¤`UXghgfeddccbb_i¦¯‡­¬°ºe ‰ÿˆB>OÓáÝÝÓ¿»2¼¿¼¿À¿º«¤£¥¦¨«­¯²µ·º¼¿ÂÃÅÆÆÇÇÈÈÅ»®ª©¨©«³»ÀÁ¾¼¼º·µ³±€°¯² d^agedccbbaa`_[x¬ˆ«¶ 1ÿˆ=8IÑá€ÝÒËÏÓÖ€ØÙÚØÑÇ¿½½ÀÁÅÆÈÉÊˀ΂ÏÎÍÌÉ·°­«ªª®¶»º¹¹¸··¸€¹¸¼œggiccba€`^Y®‡ª±† Žÿˆ84BÆâ€Ý€Þ ÝÜÜÛÚÙØ××ÔÑÐÑ€ÒÓÔÔ‚Ó€Ñ0ÐÎÌÊÇ¿µ®«ª«¬°¹ÀÂÃÂÂÃÂÀ¿¿¾¼»º¸¸¼•nqk_`_^^]]\[ZV_Ÿ¨…¦ª´_ÿˆ41;¸ä‚ÝÜÜ€ÛÚÚـ؂×ÖÕÕÓÒÐÎÌË€É0ÈÈÉÈŽ¶´µ¶¸½ÃÆÇÆÅÅÃÂÂÁ¿¾¾½¼½¼½¿Žvxg\^]\[ZXXVUOr§¥ƒ¤¥®•4‘ÿˆ/-5¯æÞƒÝ‚Ü ÚÚØØÖÕÓÑÑÏ΀̀ÎÏÐÑÒ€ÑÌÆ¿»»º½ÂÇÉÉÇÇÆÅÅÄÀÄÆÇü¹«˜Š|_YZYWVUSRQNNŠ¢ƒŸ¢¥ƒ’ÿˆ-*/§èßÞÝÜÚØÖÕÓÓÒƒÑ ÓÔÕÕÖÕÖÖÕÔÓ€Ò ÐÍÈÃÀ¿ÀÂÆÉ€ËÊËÌɽ¶­•ˆ|fXV‡‰ˆwUVUSRPONMKE^›‚œ¦šS”ÿˆ*'(¡éÛÙÖÕÔ€ÕÖÖרÚÚ„ÙØ××ÖÖÕ1ÔÓÓÑÏÌÉÇÅÅÉÌÐÓÔÒÑд­•wdWUMJKML}¨ˆŒgOPONLKJIGEBzš—œ¡[•ÿˆ%$!›êÛÙÚ€ÜÝÝÞÞÝÜÛÚÚØÙ€Ø€×Ö€Õ€ÔÒ0ÓÕÕÒÑį§“xo`RKIJHMPTQOMG–¼•‹…SKKJHFECBA;U‡‡††‡‘u4—ÿˆ% $˜ëàáàßÞÞƒÝÜÛÚÚÙØ€×9ÖØÙÚÜÝÛÑÎÇ®sf\PGHKCGPLKPNPQUQFZ¶­ŒnEFECCA@=<9;s‚€€……P˜ÿˆ%$é€àßßÞÞ‚ÝÜÜÛÚÚÙØÚÞÞ€ß6ÒÇÀ§’ˆnJ36LQMHKPIKQIKQMLPNPQRLr§¾·žŠˆN?A?><:9860W€}~‚i2šÿˆ%$~çáàßßÞÞ„ÝAÞáââßßÓÁº¤ˆ}iWMIIEG+ +BPMQQJLQIKQMLPRUO`‹¼¹¶±k9<:986532-@rz~{7›ÿˆ%$såâ‚àIßÞßàáãæåàÜÓº¯ž€reUKIIDEMFJQNA<.$0@OKMTKMTPNP32L¢½³³µŸ‹…B465320/.*1f{qHÿ‰%P[ææáâåæèêêà×Ò·£—{g^RKMJHKOJKQLJPHKRKCDE' **1C<>A2 L¨¶³³­ŽY.10/-,**%*YnIŸÿ'&‡%5"-—áëáÒ̳™Œv_TMG?HLKNPUQNOQLLQLJPHKRNJKQI"##$"  €O¨¸·´—q.,,+*('%!(JD¡ÿ#'&†%4"/j€qZPKI?ENFIOHNQOPQUQNOQLLQLMSKOU^]\\]F!#$%$#"#€O¨¸¹ Ž€3%(&%#"!(7£ÿ'&&ƒ%4#,LHJMILQHKRJKOHNQOPQURQRTPQVPCD ŒV}Œ†d/!""#€nœ’t,!§ÿ† ''$/SQRTPSWCCK*–=€†‡X0  [š†U ©ÿˆ !*JHL8!"$›a•’vjbY\du™„\( «ÿŠ¥ N}„Š‘‘‰zfH*€ ©ÿ¹*)    §ÿà ¥ÿÀ  %*"£ÿ¾ #&.62¢ÿ½ #%)/5'¢ÿ» "$)-+¡ÿ¹ -49;<<92)!#%'+/"¡ÿ·!,ESUWVQKHGHGA6'!!#%'(+.20 ÿ´$3Nm{xma\S>1/5CNPK@." !#%&'+,.126;-  ÿ²&I†£‘ˆwbOD9 )J]_ZJ5(')*+-/13579=B? ÿ± M ¾™•„kM7,-‚7iupgS;2345579;=@ACGL4Ÿÿ¯ X«¤ž}]>+%ƒkŠ„}qVCA@BABDDFGIKNUMŸÿ­5v•‡ŠzT3%!'!ƒ |›ˆ„qWOO€P OPPQRSU[b:žÿ¬tŒ…ˆuR0"$!"ƒ +’ —ˆ~gZY€[ YZZ[[\]ao`€˜ÿ«5|”Œ†}sQ1#%"""ƒ T‘–‘ˆna^__`€abcdehuƒN J‰¨d.† ‡ÿªB‰„„†pT2$$%"" ‚"š›œŸ„{pebbcdeefghjjkvФŒ¢µ¬µ~oeX ‚Sdpas|†z~Iÿ¨`xs€rAtqY6$$'!! LS?C@Iq£ ™Œ~tmgdeffghiklmmox‰ š –›¤¥¦¨®š.Z`cks„k‘‡“ÿ§I P_YXXWaq\>&#@]ecNRO]\m‹™˜‰xlgffghhjjkmnpqqy‰š—‰¼ÄÃÂÐdttafp€i|ˆ‹ÿ¦6]c‚^Bg\F+" #LW\a`KOLZ^\[eq†rf_bhjklmnoqrttu{‰ŽˆƒƒŠ§àåäêÜ›lvpp`fp€i|ˆ‹ÿ¥ii‚fCh`J2"$ GkaR[a`KOLZ^_TQ]rk^W]jnnoqrstuwxy|‚‚‚ˆ•¸èåäÄ€unvpp`fp€i|ˆ‹ÿ£*MƒHDGNN9$!!Mck^R[a`JNJX]]\ipvoYMViqrrtuvxyz{}ƒ…ˆ’­ÍØÓ¢rwynvpp_dng|ŽˆŒÿ¢-Cƒ=E* 4OV^j^R[`_NRXdpv€›Ÿ†WDNhuuvxyz{|€‚…†‡Š‘¡ÐÞÜŸvzyynvnmar€‡u}†ˆ…ÿ¡ '*„)E'3A/":f]Q^j\RZegnx¥­µ»¹“T;Ghxyz{|~€„†ˆ‰‹‘œ½ûÿ׎}zyxlty¢¶¶zgˆhÿ 8?‡=C4%'Z`^XQ]iehr„Œ—¦¯¶¾ÀÁÀ¿»“P5Dj{|}€ƒ…‡ˆ‹‘“š¯Úû¾‰“|xx}‚’¥¸ÆÔáߺ‡rˆtÿŸ95†3E42)2Xh^\ags}Ž–¤³º¿ÃÅÄÿ¾¾¹•XEYt€‚„†ˆ‹Œ‘“•˜›¨ÎÙ³‘‹‹€ˆ—¨ºËØÞÝÝèæ¿Œjˆlÿ2ˆ.E/+EGGIJKLMNPQR€S‚TW[^bis€Ž›©·ÇØßèñü‰ÿúïÀƒ€‚„„…†‡ˆˆ‰ŠŠ‹ŠŠ‹¿â©[Œcÿ…çêãisÅëŽçë¹êÿþÿ½iE<;988;=?BDFHJLNOQRS€UWVUVUTWY[_foz…¬¼ÌÕàë÷ýÿü—u||}~€‚ƒ„…††ˆƒœà¼b_‹`ÿ…çêãvSgßíçQë½äÿýþÿúÚ¿®Ÿƒwl_SHDA?<:9<>@DFHKMORUVWXXZYXYXXZ[]^dlt}ˆ”¡³Á¿†osuvwxyz{|}~ØÑjZ‹]ÿ…çêãv\YsàìŒçëÀÝÿþýý…ÿ!úóìåÝд§›‚vj]TQLHD?@CEFIKMPRUXYZ€\]\]^]]_agkkmnoqrstuvwxyzy€ÎÝ}\‹`ÿ…çêãv\`Rußí‹ç ëÃÖÿþþýÿýýü€ýþþ„ÿ7ýúöòìáÖÊÀµ©œ‚vkd_YRLIKLLMNPRVX[]^`acefgiijlmnopqrsqÀæ“W‹^ÿ…ç êãv\`\VwßêŠç ìÇÐÿþþÿ÷ÿÿüý‚üûúúù€ø÷÷ø4ùúûüüýüûø÷õòéáÙÑȾ²¥™‚yqibZSSRRQQRTXZ]_acegijlc°ê«^cŠdÿ…ç êãv\`\_Y~ìé‰ç ìËÊÿþøô¾—î…ÿýüûûü€ùøø÷÷€öõôóóòòó€òóóõ!ôôóóïèáÜÕÏŸ­¢—„{sjb^\[ZWVW_ÀèÅe_Šaÿ…ç êãv\`\_a^°ñèˆçìÍÅÿÿñÑÅ|5t‹™¨·ÄÐÝêóüûïÿúùùø€÷€öõô€ó òòññðïïîíìëëìíîïîéåáÜÙÐǼ³ª —¸áäÙn]Š`ÿ…ç êãv\`\_baY±ñç‡æ êÑÅÿÿüæ¾²k€  '3ASi€Ûÿû€ú€ù€ø÷öõ÷öõõôôóòññððïîíììëëêé€çæåææåææç€èççãææ€\Šaÿ…ç êãv\`\_bc]\±îå†äèÒÀÿ þè¾²h€làÿüúûû€ú&ùùóÞëÿþýýüýûúø÷ùõòñðïîííìëêéèççæååääããâ€áâãåçêð“ZŠ`ÿ…çêãv\`\_bc__^¯ëâ…áäÓ¾‚ÿå¼³i „ lâÿüû"úûøÖÉùþûûúúûûüýÿäãöôóòññïîîíìêéèèçæå ããääæèêìïì«aŠgÿ…çêãv\`\_bc_aa^¯èà„ßáÓ»‚ÿüä¾±l ƒ väÿü€ûüûáÀíþø€÷øýâ¹ñöõõôóòòññïïíìëééè€ç ææçèèéìîñðåÂbb‰cÿ…çêãv\`\_bc_acb^«ä„ÛÜÔ¶ý‚ÿ ý徯` ‚ {ëÿüûûüëÂâÿööƒ÷ùó´åû‚ö õõôóòòñðïîíììë€ê ìíîïðòõéáÓo`‰bÿ…çêãv\`\_bc_acdc^©ß„×Ô±ûƒÿ ýâ¼±\€  &~éÿüýñÈÔýöõ„öþÂÎþøø÷÷öö÷÷ööõõôôóòñ€ð€ïðñòóôöð€á€_‰dÿ…çêãv\`\_bc_acdeb]§Þ‚ÔÓÓ­ù„ÿûá¼®_€€ ,ëÿ÷ÔÎú÷…ôþÛ´úù‚øƒ÷öö€õôô„ó ôõ÷õäàáç•\‰aÿ…çêãv\`\_bc_acdeda]˜×‚ÐÑ«ö…ÿ)üã½®W"#!! ;…ìâ¾æþóôõ÷öö÷öùï«íüøøùùøùøùø÷ø÷†öøõçââáè°Y‰_ÿ…çêãv\`\_bc_acdedcc-šÑËÌ«ô†ÿ ýắJ /.+,*€) (&JŽÀ±¢Óûôøüýÿµ×ÿ‘ùø€÷€ø ùôæãäãâçÅa`ˆaÿ…çêãv\`\_bc_acdedce4KªÏÆÇÇÈ©î‡ÿûÞ¹«M><88776549]~¬¦’×ûõøúûúÿͺÿ€úùŠú‚ùøùúóçäãæØmWˆ[ÿ…çêãv\`\_bc_acdedce6Nf½ÇÂÂħéˆÿûß»­MPLHHGEFDCNp{¬¦Õúõ÷øþæ¥ôý†ûüûûüü‚ûüøøÿùîæåääåæ~Xˆ]ÿ…çêãv\`\_bc_acdedce6SG\¹Ã½À¤ä‰ÿüÞ»®F&e[WXVVUTRiy±¢Œ×ùòõö¤ßÿ€üýýü‚ý€þý€þ€üûýåÀ¶¾åê€çææåääë™Xˆ]ÿ…çêãvXYV[_a]`cdedce6SO;;°¿»¡ßŠÿûݹªA0|pkkihhgg†Œ‚³¢ŽÝ÷û´Àÿýýƒþ‡ÿ€þ ýýûÖžŸ¢æé€çææåäí±Y^‡_ÿ…çêäsqŒ|pjeb_^__`b1QOE F³ºÙ‹ÿúÛ¹§A>–‰‚€~¢“}³ çΠü”ÿ þøØÇÊÅšÆîéè€çæåëÈc^‡`ÿ…çëÜŒÅÑÎÇÁ¿»«ž˜”ƒwrXYMC)^°›ÓŒÿúܼ«>P±Ÿ™˜—–•”˜¼”yµ ‘ì“ÿ þúõòßÊÍˬ²îêèè€çæéÝm[‡]ÿ…çëÒ¦ÑÊÊÎÎÍÍÎÐÐÍÇÃÁ¼€rl_Vš›Îÿûܸ¤7_½±®­¬««©®Óš‚ÎÌØ’ÿþüøöôõéÏÏκ¥èëêéè€çèç‚]‡bÿ…çëÕÎÍȨ•’—Ÿ§­²·¼¿¿²œ‹‰ž–ÇŽÿúÙ¹£(‹Ð¿¿À¾¾ÇØéôr’”ÿþýûù÷÷ñÕÑÑÅ Ûîêêéèèççî›[‡aÿ…çëÖ–ÏËŒmpqrvz}€ƒsmosw•”ÀÿøÒ¨Aœß€ÏÔêå§Z:<ú–ÿ þüûöÝÓÔͦÇòëéèçð²_‡dÿ…çêÙ‘Ò·kmrtutsrqoppmeXOMNO‚“¹ÿ õÇe˜ðàÞÞëò¢7€ ¿”ÿùø€÷ööåÖØÔ¶¶íèèææëíèíËdd†eÿ…çêÝÒ¶fh\KMXchnsvvsjZQNNKz°ŽÿøÖwxöðèðÿÖK†ÿðûýÿüâÑÌËÉÈÇÌÜÛÚØÎ´º»º¸µ®ÏìëÝp_†bÿ…çéà”Ѽbd0&=MZdipu~„~phc_Ww‹¨ÿüäŒ\æÿþÿì‰CïÎÜþúüŽÿòçëéæãàßÞßßÝÚÙÖÏÍÌËÊ»˜Óîé„\†bÿ…çèåšÐÁ]Z/".@MLYfhfkf_fqu„ Œÿ þë¨gÖÿÿÙ+€ Òß½ôÿÿýþÿøøú÷ôñíëèæãàÝÜÛÚÙØØ×Ô±®îñš[†bÿ†çê¦ÎÇXON3$   S„™Œÿ ñ½c}·zF •ò¼áÿþÿÿþþŒÿþýþüøõòîëèæãàÞÜÚ×ÕÔÓÏ´«ìñ¶Y\…]ÿ…çæí¨ÉÏTELOPMNNMKGC>4-($D’ýŠÿõÐyE€ƒ SóÆÎúøöùûþŽÿþýøõñìèäáäåãàÝÓÎÌÌÍʾÖíðÎ_^…_ÿ…çæî¥ÁÝ|5ACCEFFGHJKLJA:895Sx‹ù‰ÿù׋Q† #ÝÜ¿ïñíïðóöûŽÿý÷òñîëêìðçäãݾÜçæèéìïëîßqZ…]ÿ…çæï¤¿ÞÏv>46567889;;:4/./+HsƒõˆÿüâšX†¥óÁçíßàáâåéëô•ÿýêååß²Ñöð€ï€íï‚X…^ÿ†ç勵âÞݵ‰vrhd_VUONF<4//)@m{ð‡ÿþê±a,†l÷Ç§ËØÌÌÎÐÓ×ÙÝèý“ÿþíçç⽿õðïïîîííôœZ…`ÿ†ç謹ëâàäãßÝÚØ×ÔÒÊǸŸŠ~}ytfqì‡ÿòÀl9†5îê¶—]ªÌÅÇÉËÍÐÔÖãý“ÿ óèéæÌ±ðòððîö¸X[„\ÿ†çî²ÁòêèæåãáßÝÜÚÙØÖ̵ž–”—Šagè†ÿôÎw?† ¾ÿó˱Y­Å»ÀÂÄÇËÎÍá“ÿ÷êëèÚ¬ãõñððïîîõÏc_„aÿ†çî¾Æ÷ïîíëêéçæäãâàÝÔ¼£™˜™Œ]`ä…ÿùÛ„G†x€ÿïÈ´‹Vº½±·¹¼¾ÂÄÃâ„ÿ÷ê‰ÿûëìëâ´Îöññðïïîñåq[„^ÿ†åêÇ¿úò€ñïïîíëëêêç߯« ž •ZZÛ„ÿüäšO‡?òÿðÉ´†ZÁ¯¥«­¯³´µ·æ€ÿØÍáÞÂ߈ÿýíëìæ½À÷€ñð€ïñ…]„bÿ†âçǦîöôóó€òññððïîçͱ¦¤¥šWTЃÿþì³R%‡Ѓÿñɵ‚\¾ —œŸ ¢¥¦§áÿÔh‚“œ‹‚ãˆÿðåèâ¸Èøò€ñ€ðöŸ\„cÿ†ßãÆÜí÷õôóóôóóòòññêÒ¶¨¦§žVNǃÿòÃ]+†‘…ÿïȶ€X®‰‘ŒŒ™ÊhGUink_‚ø‡ÿûèÚÎÂìõóò€ñððø¸]aƒbÿ†ÛßÅ™ÛØí÷õõƒô óòìÕ¸ª§ª VF½‚ÿ÷Ôv.‡Iü†ÿñÉ·€P”~}€‚{_d~XBHYgecaT™þ‡ÿúîéó÷ôô€ó€òöÑebƒdÿ†Ø ÛÅ—Ü×Ùì÷õõ„ô ìÖº¬¨ª£U?²ÿûâ‰2‡؈ÿòʺ9fd`_J/2KDCMa`^][XN²‡ÿýúùõòñðîìëéçåìèp`ƒcÿ†Ó ÖÆ—ܨרé÷öõƒô í׺¬©ª¦V9¨€ÿýì¢=ƒ€¤Šÿñȹ|3?IB,)-6=?V\ZYXWVOSÑ€ÿþûøøöóñòîêèéëëîîïñîðò†Zƒ`ÿ†Î ÐÆ›ÜÙÙØÖåööõõô ïÚ¼­ªª¨X1ž€ÿï·>‡kŒÿñÕÕÍ×Ì•yxG34GXVUTSQPOE\ç€ÿýúúüüùìðýüùòòïïëáîôùŸWƒ`ÿ‡É Ç ÛÚÙÙØÖàò÷õõ€ôïÛ¾­ª««Y-–ÿÿòÆM%0>=<7@Åôýþ„ÿ óïéÙɹªšŒu`„dÿ‡³µ‰ÈßÛÚ€Ù×ÖÞìòã着²d"iû¡ÿ.ü‰ŠZ;C@AA@??>==<;:99/]òüïã×Í»«ž‘„vhd__eb_\b„dÿ‡­¯ˆÇáÜ‚ÛÚÚÙØ××ÜÙı«ª±i"]÷¡ÿ Õ†o.@>>==€<;;9987765+g¯©¸ËȵTPZ^_``enie`b„dÿ‡§©‰ÆâÜÜÛÚÚÙÙØØÔDz¦¨ª³p$Ró ÿ å‚€/!;<:9988776554431&zã‚ÿ ÈY^babaenie`b„dÿ‡£¤ŒÆâÝÜÜ‚ÛÚ€Ù Õȯ›—›§r%KïŸÿ ø´†…G3;87€6 5544321100-/¦ö‚ÿ Xbabaenie`b„dÿ‡›žˆ¾äÞÝÝÜÜÛ ÚÚÙ×˲ž–•šm'GêšÿüñäØËhdJ€&8656554€322€10€/..(2³‚ÿ ÄRbabaenie`b„dÿ‡• —ƒ±åÞÞÝÝÜÜÛ ÚÚØÌ³——›v(=Ý‘ÿüöìßÐÀ­šˆ{ocZ]_lj4544332211€0€/€.--,(M¾ÿ ÁQbabaenie`b„dÿ‡‘~¨å€ÞÝÝ€Ü€Û ÚÙÍ´Ÿ——™;#¡ˆÿ üôíäÖǹ¯¡’‡|k]W ZZ]ajy„8 ,3211€0//. -,,(%$4@G€ª€¨ ™gaabaenie`b„dÿ‡ˆŠy¡æ‚ÞÝÝÜÜ€Û4ÚÏ· ˜——›‚?<®ïýúðçÝν¯¦œ†„‚€€ƒ…†„xkecbba`achr…S "20‚/..-,,€+*'>j›ƒv†’ “‚_abaenie`b„dÿ‡‚tœçÝ‚Þ ÝÝÜÜÛÛÚѹ¢˜€—›•|œ™‡…†‡‡‰‹Ž‹„wkeccdccbgp‚l€/..€-,€+€*))#^‘Çq‚‚’ •€_abaenie`b„dÿ‡|}q™è„ÞÝÝ€ÜÛÒº£š—˜›™”‘’‚”“’‘€ŽŽ‹ujg‚egn|x$ (/-,++,/-€+€*)((#e¢Œq‚‚’ •€_abaenie`b„dÿ‡vwl˜éÞß„ÞÝ€ÜÓ»¤š˜˜ƒ—––••””€“€’ ‘‘‰~rjihiow„w( )'(,38.*(*€)€('&&s’Œƒr‚‚’ •€_abaenie`b„dÿ‡p qh“çàßßÞßàà€á ààßÖÀ§œ››™ƒ—––€•”“ ’’‘އ{qlkjnv†‹„?3BUeu†D*(('&#+|‡……}‚’ •€_abaenie`bdejhÿˆjc‡âáàßàÚÕÓÒÑÐÎÍÌİ™ŽŒŠ”™ƒ—€–••”€“’’€‘Œ„xpnmov‰‘z‹•™œž< (€'€&%!5ƒ‰‡ˆ‡‰‘’•€_abaenie`bddejd?)ÿˆe ^}ßáàáÒ³®¯€® ¯®­§–„ywkpš™˜‚—€–••”“’“’‘„x€stuxД𠢥«ªª¬®²²=!'&&%%$%$F““’‘’”€^abaenie`bejc@ÿˆ^YsÜãàÞÇÂƒÆ ÇÇÁ¯˜Œˆ~g”š˜˜ƒ—–•–—˜˜’‰€‚ƒ†‰‘¨°³µ¶¹º¼½Àº;$&€%$€#Y‚‹‚Š‹Šq`bafuokfhd?ÿˆYUlÚäáÜÉÊÌÌËËÊËËÊÆ´œ‡yl—š™˜™™š››žŸ¡£¥¦©«©£™–—™š£¯¼ÃÄÄÅÄÄ€ÅÃÃÁƱ1!%$ƒ#!!q•‰‘ “…`d_DA?<<ƒÿˆS-OdÚåâßÍÈËËÈÇÆÄÃÁ»­›‹†€ŒŸžŸ¡¢£¥§©¬°²´¸¹¼¿ÁÃþ³ª¬¯¸ÃÊËËÊÉÉÈÇÆÆÄÿã+"$%#‚"!,ƒŽˆŒ–S ‰ÿˆOK^ÚåââÖÄ¿€À!ÁÄÀÄÅÅÀ±©©««­±³¶º¼¿ÂÄÆÉËÌÎÐÏÐÑÐÌ÷€² ³µ½ÇËÌÊÉÉÇÄÂÁ¿½Ř(&($‚"‚!CŒŠ‡‰‘(ÿˆJ EXØæââá×ÐÓØÛ€ÞßáÞØÎÆÄÄÆÈËÍÏÑÓÔÕ€Öר×ÕÓËÀ¸µ´²³¸ÀÅÅÄ€ÃĀłÆφ%+*€"! e†‰ŠlŽÿˆE@QÍèãââ€ãâ€á àßßÞÜÛÙרÙÙÚÚÛ(ÜÛÚÚÙØ×ÖÕÓÐȽ¶³²²µ»ÄËÍÎÏÍÎÍÍÌËÊÉÈÇÆÇÍo'0*ƒ (~ˆ…†Š‘MÿˆA=KÂéãã€âáá‚à€ßÝ‚Þ1ÝÝÜÚÙ×ÖÕÓÑÐÐÏÏÐÐÍÆ¿¼½¾ÀÅÌÐÑÑÐÏÏÎÍÌÌËËÊÉÉÊÌËW*2' €FŠƒ‡†‡z+‘ÿˆ=9E¹êã€âƒáàßÝÜÛÚÙ×ÖÕÔÓÓÔÕÖØÙÙÚÙÙØÕÎÇÄÃÄÆËЀÒÑÐÏÒÓÐÈÆ¼ŸB23!€iˆƒƒ†ˆm’ÿˆ96>±ì€äããâáßÝÛÚØÙØÖÖ××ÖØÙÛÜ‚ÝÜÜÛÛÚÚ×ÕÏÊÇÇÈËÏÓ€Ô!ÓÔÖÖ××ÔÊú£˜Œxljb88/4‚€ˆD”ÿˆ647«íáÝÜÛÚÛÚÚÛÛÜÝÞßà€ßÞÝ݀܀Û$Ú×ÔÐÎÌÍÑÔÙÜÝÛÚØË¿¸¢‡uig`\]`^m]6;'€Z~{ƒK•ÿˆ2 10¦îßÞßááâãâáá‚àßß„ÞÝÜÜÛÚÙÚÛÜÛÙÙÍ»´ ˆqe]\\[_bfc€au~I77€€ 0lkjjks])—ÿˆ21*£îäååä‚ã€âáá‚àß߃Þ9ÝßááâãâÙÚÒ»ªœ‚xnbZZ]W[b^^babcgc_dp{n::+Uheehi? ˜ÿˆ21*˜í‚ä‚ãââ€á‚à>ßßàãäåææÚÐʲž–}J4:`f`[]a\^c]^c__babcfbkx}~W78 9fcdgS'šÿˆ21,Šêåƒä‚ãâ5ãåçæååÚÉï•‹zi_][YV(Fabec]^c]^c__cfhdjq~}~u>:*€ "Y`ca+›ÿˆ21,èæå‚äHãåææéëêäáÙøªŽ‚uf]\\VY`Y]cb;%*D__`hbchdab??Xr{xx|Y66 KaX8ÿ‰2P,iééåæééëííæÝØÀ®£‰woc]`][]a^^c^]b[^fV,.' &IBCH;7mzxxn=:# >T9Ÿÿ43‡20/<¢äîå×Ò¼£™„pf_ZSZ_]`cgc`ac__c^]b[^fO037$ € 5n~yL8-€ 11 ¡ÿ&/54†2*/>y€kb_\TYaY\a[`cabcgc`ac__c^af_ckI=?@; €  €6n‚Z84€ €  %£ÿ*543ƒ240:_Z]_\_c\^d\^a[`cabcgddegdejcKNI /BFAB: € 6oa96  ¤ÿ(/6320A4#  «ÿŠ€¥.C?=??;5+  «ÿ¹ §ÿÄ€ ¥ÿÁ€   ¤ÿ¾  ¢ÿ½€€ ¢ÿ»  ¡ÿ¹  €  ¡ÿ· "€% '%#!!  € €  ÿ´)-6:5.()) "%# ‚  ÿ²LcK=2(   ',)%‚ # ÿ± #6WK=-‚  66/* €% Ÿÿ¯H=KI8' ‚>E;3.!€%-Ÿÿ®*_LI7# ‚9UE;6,†$4&žÿ­%[C5! ‚G\N@93&‚€ %8>€˜ÿ«&)(&-E4" ‚$EHWB94+"€ ‚!€" %6P2,o…U,† ‡ÿª8765=D7# „ 52?XE92-%€!"#€$ &4On]aj}‰nj^S ‚#nxqtpw†uyGÿ¨ !59' ‚X_I^W\UB?>NG70,&€"#$%1Je]_X\o”››¡1cmvŽ‹…‚{Œ‡ŠŽÿ§€6+ In€qYskoq]C>CF7.*'€#$%&0I^VF@I_Ž˜––Ÿ|n‹ƒsˆ‡xˆˆ†ÿ¦ (. SplzmVogklodaND5*&%€$%&''('.BH<34CcÃ×ÔÙΤz€|rˆ‡xˆˆ†ÿ¥ …#+# €DnsgkzmVogklmcgbR8(#$€%&&€'(€),32--7P‚ÊÕÒ»Œ†{€|rˆ‡xˆˆ†ÿ£$„#!$$ ajlngkzmUnfjjmlxyQ*"%&&€'())€*+€-3Bs¨¶»œ†‰{€|qˆ…~w‰ˆ‡ÿ¢ „#% 3aqckngkymYpou‡žªªv0%'((€)*++,,--.0;\§»´‚„‡‰{€z}s„‘‘ƒ|‚ˆÿ¡…#! E‚ukcklgkww~ˆ›ª³ºÁÈĈ2$))€*++,€.//16HŒûÿÛ˜…„‡ˆz€„Ž˜«½Á¨‡jˆkÿ  †  $dvwpicku{„’𥲻ÂÉË€ÌÇ4%**€+,-.€/013@j¾úÅ”„‚†‹Ÿ°¿ÍÙæäÕ‡ˆˆÿŸ†E /ezsuux‹›£¯½ÅÊÎÐÏÎÍËËÌÆŽ:")++,.-./012124:QžÎ²š•—’¢±ÂÒÝâààìëÆšŒˆÿ‰ :„yyƒˆ”¦®¹ÅÊÎÑÒÑÑÐÎÍÌËÉÁ°~?+€,"--//00223448DwÇ·œœ¦¶ÆÐÕâçÝÏÇÕì翚•ˆ–ÿœ !$‰"FŽ“ ¯µÁËÐÓÕÔÓÑÑÐÏÎÌÊǾ¬mL4-!//011245577>]œ°¨®ºÉØäèÙÈÏÎÀ»ÄÞðã·“‰’ÿt8mk@K¼éäɲ“kO3 “ýÿÿÿÿÿÿÿÿõàʨ€^? ZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüîÚ¶‘uR0mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôçÇ©fB-_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÛ¢yT6XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûæÓ²ˆiL)RÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðàÄ¢…b8#IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþðÖ¹›rK/AüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûáÆ¯„aF&6öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìØÀœ|^6 -ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùíÒ²‘lG)#éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÒoâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýCÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿl„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥EþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊ;úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí$1öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþC(òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì?¸ÚÑȺ•rjX6 ÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüERîÿÿÿÿÿÿÿÿÿöçàϰ‹€pQ*ÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùõæõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ Þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï!ÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþHÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿͪÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí'žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿu‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï!nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþEdÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎ@üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ4÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL+óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿv%îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë$àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö/Ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà Êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷íÝè‚!ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýíÜ˶š{gO5 ´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü°‡kR?)©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþƒ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî3‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÙ"‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûæÖ^{ÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë“k? nÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿpHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿO;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò.4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ 0úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­(òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿv ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú9äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ Óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü:ÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÞÊ•k§þÿÿÿÿÿÿÿÿÿÿÿÿÿÚ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüëÊ»`P+žÿÿÿÿÿÿÿÿÿÿÿÿÿÿq¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýõ䵡…P@%âÿÿÿÿÿÿÿÿÿÿÿÿÿÙ˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúìÙ¬‹t@%[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿZŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó×ÉõÎ`9 ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿ©€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÆ´˜`P1 –ôB;øÿÿÿÿÿÿÿÿÿÿÿÿßvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷çÁ¢ŠP4%(öì>®ÿÿÿÿÿÿÿÿÿÿÿÿ÷HVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüåÙ¶Œ|K#Œÿä<Iýÿÿÿÿÿÿÿÿÿÿÿþh ³ÿÿÿÿÿÿÿÿùÖɪucCàÿëRØÿÿÿÿÿÿÿÿÿÿÿÿwGh¯Å¹œeF5 Yÿÿú„ ªÿÿÿÿÿÿÿÿÿÿÿúkœÿÿÿÃ?ÿÿÿÿÿÿÿÿÿÿÿçQ  Àÿÿÿ÷Ÿ7Ÿÿÿÿÿÿÿÿÿÿÿÿ¸. Åÿÿÿÿö¯XRÓÿÿÿÿÿÿÿÿÿÿâz&')+,---..-,,+)'&&&&&&&&&&%$#  ¥ÿÿÿÿÿÿß±xC????>=<;86530/,,,,+*('%#" eÓÿÿÿÿÿÿÿýûÿÿÿÿÿÿÿÿýé¼€LCIQW]bgilnprtuutspmmoxŠ““ŽŠˆ…~wn^B#  "&+.26:>AEHKMPRV[`fkosvz{~€~{yvxŒ–››š–’Ž‹‡„€}{xuqcC  #&*/37:>ADFILNOPQQQQRTY^chnruvxxwwtru}Š–žŸš˜”’‹‡…ƒ‚}|xkJ$   #',/36:=ACFHKMNPPQQQQQQQQQQRSTTVWYZ[]^_^bl}—šš˜—–””’’‘ŽŒ‹Š‡†…‚sM-!  !$',/37:=@BEGIKLMNOOOOOOOOOONLJGDA?:86554567;E[u†’““”””””“’’‘ŽŒŠ‰…oH0)'$!  "%)-0258:<>ABCEEFFFFFFFFFFFEDC@=841,)%!/Mgpliiox„‘’’’’’‘‘ŽŽŒ‹‰ˆ‡_;,*(&#   !$&(,/0246889:::::999999987631.,*%! 0PaX?/*.5AVp„‹ŒŽŽŽŒ‹Šˆ‡†…„‚nE+&%"   !##$$$$$$#$$#$$#$####! 9X_L' ":]w€ƒ„……†……„‚‚€~}tR+   @[[C +TlrsuwxyzzyyyxwvurY- @YW= .Tcefhiklmmnnmmmlk\2 =VS8:V[\]^^_`abbbbcbbZ7 6PP6#IUUUUVVVWWWXYYXXV: +IL6:MOOOOOOPOPPPPQQP;>G5*EIIIIIIIIIIIJJJJ<2A4;CCCCCCCCCCCCCCC: !840===============7 $ ,1 &5666666666666663&&0.+  .0/00//0////0///,,//!  !()())(())(((((())))# !"!!""""!"!!"""""""!             ic08úÆ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ùÙÿ“ÏÁ ±ÎïÙp_ßÕôßÃ=ÓÔ[žn‰¥˜à˜7>”]œòäPìS´D³d@ :S]¹¾žíØ9:ËÍè3Qâufr“iÇÚn"ð« µÞþk?G—¹ù9Ç„À.…$¤yšÇƒäU [ ¿EüBéѯ“hE)<§ì.à‡rÿ\m‘ÏÀÔW7¬2®µ-_7׸Ž){7ÝŽ,.Õ|ç½’`WÔ?^S>Z³t0Ë%ý5@ ßÓÏÁ$MÜ ¿0ìµ™y§ºŒ|¡ÀìW#?rE®h¨W×ÿ)˜'?* ôÉ´m8óW0|Ç7!uC èà~m:¸ºUàT7p[œQ×0Çà‡‚Œùæ3öU±lúÔÚP-}€¤IÌìSïn•®öê/žÛ1¿_ãë 9˜9]w·ÂÅzXÄl${UKKi‚Rj†W"Üw{©¹Û£bVÏ#¬‹á>>zܤvÕܦáÁo™KAOÛâÈ«=¸ Ø¥’±÷ŸöôØ*£p+ãÊžñÈ6úkhµ¹Ë-‰P{Ð2Jt){$¶„Mê*÷BûTûž¢e)‰j4R¾”›E?«¯Þê*2© w–xµÇài´Ú¸)?ºƒþŸN*l-º½Áí•d§#àѮҕ ý‹ØºFCøô·¤ÂÒl ’3xß› 8"«š™‰ré`kì'*œÖ7ô`5"õî$ÎW·‹ƒÊ–æªéÊ6³,@›×ÝÒ(£ Þ'­æÕƒÊfà×Χ5ŸŒXb©¨=xà(ÀSJA.¶9ßQ2tÒ•—ÏÁ–LÈ~>º›Çài¬~g $"½ELº„ˆoÅ$û·sá£E£¡À"Y!ØEùvu–kD,Ïçýü0ºä‡¨çCyDÔ´$!w ½u?µY.KoR=ü`g+æ‹ì£HhaÔj— 6B>CÏq‰EÖÎÏ‘¯FtîâK"ò±ƒìÄ(U¬·4u˜È¿ªúH{ÜÂÄ!+ŒXA<Êšôó”hWK±WÍ‚nÈÏ"[JY:­áÀ̼#ÏÌö~gÑù€9Rˆ@08¶Ùçî/D(£fw™³©J\]µô5†ËaGÄc›š9‰Aš $tüÇЦ/XaZSöÖ“Nn"ÉÛDK±\ÓX>Ýø}®`@Ñ€ùÖºtOJ½v=¤™†òÈ,^ÄÒÕm$½pŠ “¯Sw–šVXX:Nea1¯ï=ºö’«„r!F$pBÕÌöœgì)àƒèvëè[Fèýý†Ý.v1àJݬêÂÇárÇáwCð¹@NX@&c|º¦>ð–¹­·q!ò7:ïœó ”(G¦ËWжÖZâˆ`Çs´—“Óèû äÑ©ýµ1„·³²¼g}FwLë»\£°žÊn‡öi5’²ÏüÝ!*lx&4¡€˜ïòòO- HÈ©06«ƒj1FÜí©v7æ6sýf¹­n•™•‡ ¤ùóthä ¼8ÛA¯Q®ýDíe†Õjl@)_À¸öÙ³U]EDè–ÏP\Ü@+¢^xÝø¶¬ss z‘Øfÿ8Lw¶[°œh¦ncMÑÝ[ ©©öa«0Û¡-ÈŸ%åΜÙ@˜'R…_K Ð,‰ÿT‚«;JãÎq™A¯ïèL0Y¦+>7$žÔ!xOÔì.ª‰­eî‡)Rc–£Ì®ý¬É•O€@õ¿T5Tá̺%°&_my\gîÓ‚÷Œ ûN“t 2âüÆÝÑÖáYOvfU¬¥éËÍŸÈ}ÃMíÌc :‰mbZòã܆›Éc@„>ŠlyØêçŒÆ£q嬲É@ÿrO°>„2. |Ÿ¥I‰(Äø§âBEøçyçÅ_`|¹Ö0ÎCÎË€TFo Š%{±îîÌ׆àߟ´˜¸² -ÐåË8³°¹+WÝ+0Ç;È,|+œ.1r¤á-²¹˜ôËÇ8±Áð|…7q˜?5§hcBo/^Z8æJa™½T×Pè˜èúKP’!9™ª\7Èü"»AJ|ø²³(gÚËLäÈ ÷ìu]p,ÈŠû[î)¢á6„EK£ñ2]üäˆvÙdy©3‡¤¸(q ÷fË¥€``XÈÑÊ®9@ ò4?ês…ÕW‹ ¤4p݉™íÍ?íè|’Ö5À˜žÌx5L›Û±ÀqR;Ây“;Ãí©cð«áøU€‚Äð=l¸mÄ}‹#Â,2ïV ¯N€úD|Ud‚é'T[ÞæKÎ羃@ÕË6¢Åš/ûÌ › ^ÂÑ>Æþêc¹W­F)O18ª•ƒÛ^<4%é7¨»K •ñŽF˜oÖ#€ãAí\©Q“ðËó×££'‚ê׿U)uV8G{k=R›BŒ0m)[Œcƒ'KF˜`v7hñúrWyê]:¹pk’ÂÙ‚Õ±Øq/äXz„KÁ>…ƒ×ë¾m1å7H&Ù{whNIØZcDÎÍ“F­©Þ½?«mˆ !1[ŒGóÕyÒõE>¨:àŠ?¨°dz7êÊØ U½ôëÇd ö#dêÞ®¥§$Ïe¬ÌèsÇÿo·7vy2 ¹uO‹¿Áí*ù™~MñŠÝô°Ï[€n/Š— Þè²3¬s¥äGŽ~8¬ºöH_ÏŠRPRó5j^“$"Eúà Ÿe¯_š½V”´±\äA&þÈ~qƒDÈ8ÎLMtì»Yˆ5«› ~Z‰hô+ÇIÀ‘`¡6-5[ahì‡H lƒ÷°’(eI‰¹Ô×çT“˜…¯ÅÚõÙEnÊþѺQúó«–=Þ#/–b*‚ö]›¬JFè?°\µxàú܉^³Rš:ZrÇáOGáXÃð©Àƒ>%Àãþ€–~Vào .ˆ±ýhéaØ)¨gË úfßœÜk7Ù¹«¾Ão¥Ô>(Ñíà-þJñ¨¸»³è÷a(<™‰›aH™3ª5PÛlL()e:é4˜èK"y« éÝ0ÁQl»–+a¦X+þõº«×§/`u&º‘((jùp×yŽéŠë¨~KÇIöpÊæ^tÕC˜ ž¥·Ö€ÿw´>1ð©DÆË€Ò ÌxøYüJß™ƒs^l£.èaõîð¤T¶wtÈß³+•{kV~üʼn¤ÑæÌG™ÜU¢Hx¼~­e§µÙ«ªšÑú†D’‰ü§ê\’~IîÚ~‡»oô$îâ¶)lêÅù[àdU%*Aç”ÿrWàë/«öûE‡!_d•d)ñJthÈÇ»ÃWÝ]à5­edäžUÙí‚^ê,o4½ÕŒÒœ³¤éoýüÃä\d4åiÀ+xˆ«/‹Š‚T±¾$ ¬#ÃÄ‘ð6 k¯ÿ É‚…Ømò;èÂD[á« DOS–í¦0~`^ä›qlúPÛû/±‹wI435ÚœäRxÿhºÏ˜ö„à˜Ýíãgs¸ ““l"ÿ3B-q7»å¾rÿuñb. &<•ý.ºPÉf»„Ï~zÇáHÇáKÇçGøÙÔKÜ'„3!J# °0Ï–¦”ûK!dUü7¦.˺$°œ WðNÚßœ[¬+æ‡%™ìÜÓMtMÇ}~•58œÒyŒVŽw*á·ï—ã’-×$<ÝõØc·~ˆöØÁôu©Ý‰x ¼dARßiB{¿»=RÁBu_èxÈ‚ÌÓ%â艪Ž`]/£"×÷C.×),~Öãé"!ðè 5¿NbŽ`t&b¸ìÀ’ÇÔœ6³ˆ!'ÔoÉ›[™–zÀ5Cr þXep0oŸìcÌÈøSã®æ·GéÇ ÔºÆ] TdÚMY Up¥D·Ë\@()HÅ.ãe8¬©h/}5H’üÆ|dR©·Û¦oQÖðµÕý‰Pi5jQ©»Y?Ó2›“ {¸Ù£x{ª—Ï í?½š9r­6R_ÛkÕeuö9Ìqì;x~+^Öòç0æsm… “ð$á>~ænÏBàŸ³ËÉãu÷Ýyn –ëj-´6 .Ü´Z1½Ñƒ9n®Bý ؃,‹µž2R¯ùÓ(ÆÚG•çufóŒ‚^Œãë•¥.ðüí–$·ž¶ºçÃÊÌœîÚPì \™sêíù®0BAݵģ‚²Ãœ.K|ëdY­¶×Ád;,©E©|¬ä‘:µ6ò/‚Þ%ä¬3äy;iæºÏXdC áЬs¿1Clq½ˆåë<$c½í>ûiy8VJô õClj_F›ËÒ¢87ö«ÖYv,ÂWÆêÍûzÆueûœ¹ý쾚Û2®<çAÛTfOá…~°<¬ÎÓ¡@ì¤Q÷adÚ€1qô„NOû†0ÆÝDˆ ܧä^ó8ÐÛó‘Ài$·gT‹{<­æ.—2Äý0:àžetÑGÃÊbý“òÉò¯¥×´¹¥S-jC½ÔëT²ÃßFŠÒ?+»àýjø^Z·Ñ—KûÎä¾Ð§Än¡iIÍi6 ÕñõúèQ+ÓŸ1X[æ}£„ÝRå–<·Ì(ìö‡"´dÙã ±¯ä>ZízUyYMG+úÞÖ0(øù£)4ôËkµÊ­¨š~-JöD9\@,jj¹ú$1EàgÀb˜!,8 Ijè‚osÖÙU#ä¹ÞQ\eèV×(¤2î8ßû×ú¹Gk…Á^Õ6qcÆ æ‚hlˆzÆ|#TZGÆ|u 'g£yr®¶ÚIt¨q¾eûö5I€¦“ ´éj;E‘¹ßõU¢¿A.y(­$±Žwf˜ñ™­ÏZ½-÷ûéýe‹XÔ±{' ÒóEÚíN¯Ôž Cð@)òÇx‰e¯°¥ÅE¹²6Lžûi­5ªêÉæà.—Óp!Ÿ8á×%¹°H)3¦ÊOžM\,üÿ";ÐáÙ!‹‘ä…ÜpN,væ„’ûΓú-Žl€ð,2/o [?l$Z%sk7{Wù*nöÍ=åÏ~&»ôaƒ•Ÿ¾‰ör æYj3]£,wâ×|w~âEàþ¶ÔÐ8Ø÷º¥­+N ßûÝVâ¢L˜X2L»Ão("ìà£k¹rE¸%„äïªEÌ:wÈ}ßç‡{mµjRB³Ñ׬Ûú®=Ù- ¾¤: Èi¡õ¶˜ªïÌ}ÃÛ33ßãÓê83,¼§'%K®ÀÜ!­üãN¿'›°·½Â®Ûçr! ÜA2å`®ðk?Å(üÁÃw&1©Áïf„ó2šÏQ¯Y7Ý_dí'äÀýÙ!è’íspU…û¯õ´fÖ¿/“ÿM ÏôAĺõkn¨š&> NöÏyÌŸDñºäÀï˜ÐUh3˜ÕKÏo®¾˜Äl<uï4\ÝPo¦«än­¹®R×8ÎIÐ-¹hý"B˜Ëxo»Ä6ŠžèµCJAi“Q‹[¹Öf¬IPºtU¹åƒÎ¿f^ ²Ñ§ž:~Êð’Z÷g«7ˆ+(v/¿ÿÍ-zûŽF댔¶÷>Á XÈRå=©ÿTØ^ºa7PGÜ 9þNgA´Mé—¡;´¬Ùí•6†Ú#ø¢XßÈOüIè|~·M{µUaG*Xè¤#”AfÎ$q#òùOÊo#³Õrß“÷ÇP„àWs'–£Hå š›uاµ”%?ÑJÇ1Nã¨Á£$ .<«ú<š-Sç(?p£YýÏ…¬í{¿©ÉX[z‰ S¡-l³û’èÁÄO™M‚Èê Ÿ!×µ2zàšËö>VéÞ"ÖQ[ŸU«€SØa :LÖ• °6ãÐFköÜÑL˜Ât/ ÏÁO 5„çË£ÿql‰},¼õæn ³–ó%èXµŒ‚´†Bº&8·Þã)Áâ@ðÉkÈ…bxnDïϰR3XÖ/ÁÆ9,Ë}W³÷çøKq‰W[£^£"n(ŠÓë¨ßõûæÃq')?B±PÖ8¦m<2¹C½ ìÅóH µ×s8íÑøÕÂ…ªNj¨÷%Ü¿a~žâÉ1DÎJ¥Ï§O>-1b²°í{Ñðùf61Ò*ö•UýŽœq^K¨óR1È€ /‰*¯˜« Iì·»vÌ{T9¢%§Ðunœ€.æÑ6±¶×HÝ[ƒ ßA‘W ,‰LKÊ@†šß;Êðx¹Åâö¶M6=?ÊìeE’"Y`á«%Õ,®lçãæË(þ*A nT‰û{ž/˜b°]³+ñê@éò Nnpý±mภ{Y(àüY[MMh¿¾H²d`4ùÐ9íÃ+„™¾¢´~Û#îœòm²à@ ¨ð‘ýæ?pF\U‘ƒ¼°-»WXWÂõÐL±·Ï©9Žq8£/µ+P3űÈcœKß’O‘~{ ÉtôÅ#5í›qÕ£%ñ‹B@šw*—ü¢dĹÆðcÓÑkÀ39¤¦¢Ó;=BØ(’è8ÌDtM2©µŠþ“Œ³4*Œ£ï ±%^@{Ò$°2kÌš&÷²––~á_¡dÅ÷îÕž«²ôÀB•š@•ÏÖ±Ë?£1EWÁ£¬ÓuX¾S@cûô~ÈVœ'(Ð~j9“ŸêK8>+òAÒ¯Ïx™BnˆèñÊUG5(Ç¢JÛxÎ3ç˜Pe¡ZïΩ2˜mÂCHY¼(uç'¤ªû1<ˆhUšJ­i˜”EÃW¾3'¬gVSdUZ‰¿ñ. ÏŒ8];Ž™‰³ ç)bŒwÃñnL?Ó±{  §TFñ!a 4oÖÎÌ¿D¹{Èíi𠾦k½¡!ÑèØ r­ñßã•ÙÞQsªÞIàŠåDèl=°•gå è!Æž#E'Äìu‚–)Qe¤ìQòð丶ZdlqÈöx,æ:ΩjV[{¤ˆÏ¤¶ÄÔA¿rc¼¨Ÿf zÆ2*BN1VÜêëÓôÜè [ëÂs,"‰`«µ¿yý ÜK—!7âð­yÍŒä…Ë"•‚Ì«ãe|“¤ê ¼jA1󪺭‚nà nN·@6 ¡Þ]Çá¹ñøoô? ïÑkTRÅ!Z#u±=d4œXàû#óÂ2̨éž/!|__%ž·¥‡<@{§…²OCa¥†Òu¬Œƒ%ø^õëôm)޵?­§ÛÙð?'MJ’›y¢FUÂTÿHáíÕr¯è(‹Gft™øñu­Èm·4­ôÑ>Î3ì–_ž|Z+ÎÆ{V[ø‹Lfß§I ;¥=ßl[>Ê\A*¡*Ž,ÖÁʳãÅEs›l{ô‘Nv<<ñD?H†¸¦„Za „Tj‚Aq»¾@ü·™_,ê6Cùÿ¸í¼’›1HzF÷Yµ„nΰ±åŸÍOa ×§U¿¾Í#¾ÏJ,ž^¹Áo–è‡F†ê„ zõmv¬¸#‹ÛJ0ÇIô¯5Ú3¦ûOX¼2l)Ë®ó7%¹ôš„ìY:ɹKÒ²,Èï[9Wé ‰€*8ª‹€‹™Äa¸04XDz¡Ã8K‘fˆs™¼·µö2xH%œ?EþunnŠ÷L‹´>ã òhøt ăFŠ‘6ÒöÂýE:Ôà‘f÷-çG/þãVwoîa™ ÎZô%G„u}”ò6DZœØŠå±•nqŒTðï›i©³ZÞ•gV˜=²lKm%{ù%”ÌwN²© ±CK­Ò¥ª`L“¹ŒY¨çIÝÀ~Ùnºj{2>u³ô\HûM }(Žn2Áú^­®²™*FçM*·ëªB5®‘Ò€„%U_K„ØÀ8QÕ•’— tE±Eðe` |ùfœãÉö¡ßGtåÖ7À€íëĴɵ#¦]2°ýeR áFŒ“8¶Íõ¦'$¶X—e,ÂUä Täî)"Û.¢ŽÅÑ›#þ;6¢ÌÌ®×·¶ȵ ;þ[0©.»ämWýÉ—b¼ã G5;L/$VXаp\/0ïrî!P– ¸§©¹Ú³í=¨ýHX·È(Û«Q° ¬U™fôž“Fºy‡Úö Ç•J¶÷º{¶ÍÝ ¬³1Ii5†Ç5»6MTnwQf$›Úž‘~Bƒy#.+¯¼ušhfp±¢(ôSKp~ û3†CÂ+îçxá뫎»>¨ žœ™C7ˆE7ÿAmyiˆ ºÛÑÉ/§&¹/™Ófð*¯Z2Qܺ»‘ÃŒ+|s[è»Þ<\“º„¨­S}ƒd *?­^Ó8¹3é`E)K0Ó›| ÛÅéBâ©ÞöŽ/×Kío)ʶaVvÍHó¡õøºI¹¹¾l9 ×u*­8Ô5…ßíLÖ9G,³yñÓ˜é0g-<V%%gQ÷©_èØ‡GwMí7GÚ.%´ó)Q<FÿT›ùÔ1çV{Øô6 ‘N¢OJíኊ¤Ð%›'çëÚ¨¯€j"£àucó¿¶µjF¾‡ —ü–% Âdøã™irRR#’çE¡À‘™Ëk±09äK¤Ö3ÎÝl üb 5M×T¬í¶¶»Úh¾M[”/ÁÁwÉP¿)dÐNY‰çÅG|Ñ&§BzNC»ôeûúêHŒ’Œ•…ï4Õ1oÂÂåóÖ© lܹˆe^뀬›­Ïm20v(Ñå€òÊ⟭ $ix7©TžYc  DBp‰J²¹æ%8DùÞuàÿUSzÇÙ«•#ö|þ:o£lz›çŒ!CqX¯‚ǛөžÀ=¡ DYR"±zŒÖt„—UL¤%q]T©/óÜ\ÉêFñ[™Î+=TtÇáf‘êPª@¹÷”\e8¦—œÅöX~¤¬ê³kn :šœ~õ{õz¹#`êmMñiõ!%ýCñ¯;…?8áäø (t¼I3ClÀykÖæí£:LË@…ÓLÃâÿ¢³xZÛH ’™ 9j!îŸA­“Ç*ßd]ö+«½'^CXþ/#¸m;ÞW•zE2Œ0B·s•à%ž®žì³ïûèÚlO¿ºZó̤lõ³€¶¶¸îÉõg§ä21ûí°Æô臌ÔÉÅÕ«6”vDñN'¨ïÄpDw/×Ä߸â¨Þø¾;q`ëÒì‡6ÅDDš³¼ûá+—%XË47Î \KØÅ"¢ªQ*r¬1 RZ¨ìµµøLû ™Vøâ¯³c{¡Ue 5»„à4œf׊VÅj"DüZ¨õf‡zÐõÃ~‘פ³ ·–Ò­ìŸÒ`šõ)…]^$!rÝTZ²èÞßK¹ÎËŒ€] }ÅÎgžvé—\Ù¡žc•g,ž7D0ÒwƒÚX>âO}{·âZ‡™!îf¬l×(~ÏúeqºEÔë Ĺ»Œÿ‡ö"¸þidÈSIµêÀ£È;f§qRšçõ¯kùŒ®XÚ¼bXÒ½¼M4ð{J½lU´Äy3ž÷¹8 ïäY?TÇ7w",V\Y©æXhwÝEåÓùB%LlÄ˜Ò F2 •ºy¥ÿ€<>Ma0ý,[รÄG ˆdÞSJÜXÑLkWì Çáîñ‡¿¼~Ùóp þ¸„›+°çïÄUL<›•˽¨‰ëæ/rÛPÙ[¤?Óeÿ\ÑËF£JSÄÑz¬¹á' C¼L¡i‡Ì€vÌtmØ·U 2Ú”Qz¿Fñ2œß‚øçMZ> v6…uÓOf’ Œ@õú'„“ôÄ_£5yÏý;’?ðÆÁqS ‹‹ÈG Ü F[²3(öuïOd :ØõV¶l\†8À€EK‚’–¬hq÷ó±>o@cT»~øl`-‹YÒ%ýÛ¼Q.;%Á§ÏO…튥\ÿŠNÃq•«¹®¥HXq!‰SÙMã}o_ºž¯d³¿v¿û'«ŽÝcqÍœ8|?¦> èóFËáx"%iëT“0á¥ÛšuE7qv lXóûTýÈkBÓi‚Èñ†|Tž$6ïH¥û>~˜›çV=’ƒÊûíÃ#¢‹PÜ"·aÐ Ýè9}‡¦ìŸç4(ßÒ¶ЃlEÆêá}¬¸W<Ú¿O“§] ³’v}óÖ–¸BèæYd°(ço˪áEÊMg -áKÊOš&íWÒ9bv3÷åJÏ ÕÇðéöŒ„îI­Û˜»KVzìmá]µ&|MꎽÄ*Ñ$ʜڧ…@ßÐáâçî!*Qèb–7‰Ôd¨$³NjgØöúf±€:¦ ô€Šs›$¿?+µ—V® O§¢l©Sø„ˆ¾"ŠrIîƒÝWÔÆ²9I½ =sWm"t^êrš"OovŸ´e÷Ÿ¤*©ÚpÁ•?%I²W¿¨Ø&Ü„ŠR8(df…Š]53ôÝÉÊžnð'¤¤*6Õ z扺Ψ¹X?ŒyW‚ aÁЍOï[ÑÝ ™¨æù'ï€mdn'w¶ ÿ~í’,ïk£Sk‡FïQÃê©sÄÖéqzJVž´"5‚ȇ‹Xoƒç¾ \'ñöºM‘ª¥ÁÃéÕÀ:?|,ŸH¾èx’Øüzôÿ;‰Ýíúüôâ„¥[Y„º\üØé«ÙQ×±*/ª˜kí‚vÿ}ê…Òö­„VU‹$Ÿ7îQÁa»±Ñ7S¥ÄÕ øpTO^{ôŸtC£¿&m;þôAvRù 6¸/»?méój$+Y[+…â‚û"7'ubŠ|êÓÈg؉þœo@ì›;$&eÄ.Èò  BÍ(Øo‚–Év§;צ_…õcš‡\=[hÇŽš®€n톨·Aag”àºcºÌ¡tpÑ.®Ädܦœš<^Âv(™»ËÊÚß—Ü/ýDÛ>¿xá¬)ŸsO^îDÚÝE©æõó4’tÇrSaã–#ûû ú‹íe_^$¹œŽA±H˜i"ÃÑHÕ׃llÎN/DÄ£í7ˆ´È%]tÿ[麜ÙFñ»O¨zG컢-©œ’Ž•saKJ פP}·犿¾3ÇW0nM]R6ÛAšå}¨Ö\ɦÂa“Ás“œ„$!ÃjdZZÛ©¡ŽCÄà)Ç2Ƙ¢¶Â²fQQ“x ¹ªT¡Þ´ƒÃÌK'x{n08Ö6f´…;sög\|2ÿqÙ †²j½ÓÇ/J”k-7÷|Ùk¶ZïÊÐþò¶Ô/…óãÐÍO!nL,“†¾eEG—‡JI2A4¶ž±ó[ºid5¶ÙùH'0}½üq§˜íÎLûÃèòœ‹S±3q¨MRÄ$Ào½¸Ç[tV>TYU¶S3HÇÁ~”àåf\$>ï¼ç"´¿ÒûRXŠñš²˜ÒFUüœm†i·W§0@cM>ް-¤S}üÊqÁó»i)•L†Ÿ_÷oª…D6šh9÷ÏÈÖÓ“1Y‘´ªeµ-Û¡ÇipsMa¼2ª”Á"ƒ˜£þqR\ÈŒm;ä20@Še>'t‰ÿt" QGÐc¿ŠëR¬sa½ãói0E_ÿeaŽø5oQcé2åªøƒ€þŽ.é¨õãGJº¼ËüM¢„šŸÊ´üñLw®¨riös¦é$ERT›ÚöÍÜ«Vú­Ï‘ÃP¶ák¯]Lky\÷ÿPçº CÛKuÆ0³¦“UÈ&¹}*2ö¸±Aõ 3Ï£¢£¦,¿C.`>/ø3Ð ¦d,DùË^b/d`-)ŠßP¡Íx±ÄO¼ïËÖè­™+©’Ôô€?'nºÈÙi¨ÔȬŠ{]aY·ÏlÁ ]]맘ë¹Â+˜Ò)íw‚uõa/sÚËPÌÓtÙÆÙ LY’Ðu8¾—ÈO:Wt;“²nÈlfwæu|{Ø' ¢ Ù¹›‹Í´^ ás5aNà Õä]ôwƒŸHÁm` W,1ßÁ)އK¼Wš+#CyÈû|G÷o@O†b|.OHÌû¦’©ê„Ëe#A0É °ÅÔRœ9å rŒ_›77·y—ò$kŸMÀ6¾˜F%óðüþ¬Ø3Y qUÐT&EèÉÎ(¨N‰òø&øæ2ÐxfŒf+›BðO3&À³ØŒpa[NsÇA]·ãk`ç´ÎòtòQHø[>þ…7Èü™?ó7Bà#&ånñ¶Êª$N·pÿr7ãÑg ×UQª/:O™ü°Øp–Ó”KùèW0³,ÆÌw$a|]‹è¶C<… îÆ¿mªß›R0_L‹.Ë׬ƒŸgˆ"4í] ;8•Í“dŒÜ†qt_ªñ8dªXô±%4eá¯9Lã]t‰–>o( ˆAÞ,qÛ&vg'<)Ц¯F6Ÿïww;oØ}!nz%êïœ÷Œü ŽÓ}¼RRoe„} Œ'I w³SlŒ»  ÜÅLĉ»5£â"n¶îa§¶ |ueÄÑ¿o 뽘í+¡Üáí$¢¤çãÜÏílb4äIè&dÅh>-„Ô ¤!Ï‚借K|fM_œ3Ș S¤»8èqøÀ×ô;âù ?bAŸßÆéòÙM§RÆfZ|O§,«õõ•¥NøVytF%ŽKbÆÆmË’j“ ï[o:v µbω•›Ú{DÌáVr3Nn…Ñ«p嬲¦Ä8ØÝêÝÈ ³…ƒ¨}‘qüñýÜ?¯W 6Ó--Oqšrkµ‘ Û¹û”“ÆZÛÆÕ·èÏí’T›Aðï´s·Á"¨b@à§Kçš¹í°K ãÛ SC”¹‘í—#XÂóê˜Âÿ-nAÄL}fJµ’îøê:’HR3©ÃSÇŸF+ž4yVSí$¯“"áÜÝ(˜ÇÄúŽ´ÆH)nRDµœt‘´D‚e;®\®NåÄãOåì·&!Ð6t@1³Õ,ÐuØÎi›=]ó5«÷¤:?¾»¼ð·DÒÑ ÎÎŒUÃ/gÅš@ýŠî¯H©ËrÌ$é;ŸÅÞ•#­¿H†D@83Òeæà+æI=VisÝôDªgg”H”¾-n'Ô–©ÿA,ÔwÇ/7!Y'ä{­×°œÀ‘V“·Äðϵ@¨xRÂIs“¹%hûE§pà>ÞÔDQJÐ ÀÏ·Úþ®J!#š‚* ïå“V–éiäd`¯µ6brðš(|«QHº;v‹ªþX‚kMo¦7½òŒ0ùµä'É“•¹Õ¿™ùzÝ!ýغMg™´áœ ý¯káñ™ð÷Q¸G"ió@.:iÞrjÇÁOd` u T@ƒ Vé€8蘬Û3Ôù 1êÁêè®jÊC)\².n–Λä9Rqâ{·ÖXž~I˶ú;O€#œòGð;Q"öÛ³7ÏP;Ýh˜!.cÇ ^¦|¹=©„ú$ÚŽy6ˆÝe¢ÞQ‚ÑèðïÔII›’ó%–o¶šC|PÁªŒ[Š¡ ELF<Ì:‰?/¼ûOºD ‰pÏè}<¯~Ï{.ׄr‘è™3†Gx´÷r³h‹:9Q£EI\é 5¢öC$tì¹'Q½kó^4 Å+ÎO!Ûè%uÏs™®ž=5Pü^Ýš"5È9iÆòM*ž¢0{_GEƒZaìÝŸ°oìªñìÉiµ~f»f½©ÏFûϧ´Œ\Õ#É*½‡ .a\ë²µà+Œuuï2néwQˆØ­ª’_‡G µd~Ü@ íV±,¦»ó†f÷Ì8yŒ]ñºÀ¾<ÍïÜO!0R®—•€¿âííïae„èõ()ïc"íc  ^À Xi ø¬bþnßÁeñ' bÿpnâ8H.jç5Øÿ´ ºÔk¯ˆU5"—G$ÜØöÞQµc„¡+Û¤hKJÚ[_Ø®È̓üñ®;Íõ»º“ãÔf7àæ2¿he©˜ôu¯=À¿@’ñø³œ}ÌxŒ>yŽVôòñp0Jƒ4U,§f²‹˜1“ˆtV-ÔhèFCL=+öÓÁÊuʆt-"è%V¢MPF÷f Uy¨óÈþ7"Ùõ@¥hÛváM~Ù†ÎVêÆ“ äkÍh\ºê6$cKÝ4‡Kf¶ßÛ­@Ôâ6'~Ë´¸äo¹ÆV2Rœˆí43õpB…9À±Ó{”ì°b†ºQx¼o…?Ü0¾ŽKLe_=hÍ%.Ä¿í8ßý Ö™V À P;ÇdRùDõr¢Ì„èÞÓU™å’qÔ®ÝÌûñK“ƒN£z”áϹ&û$O£œÖ&àûÕÈUd%õ”({¡cR”dó1M½Á!Ù,51x=“ƒÙ¯b!ŒÃMì¦ éøÈ¤)å7ýJÓyRß]’9¸EUwJéÖ3¨7Ö j ê<É‹¢žXË«\|›HÔ’xe+Ñ%\³Ç˜DÜÀÒ9Þ _e¯\>V$õz{”¾‰¾f6` Tö¨ƒZióY·’ø>”ÞàîHsªc¯ Ü£öU´``£¦’9†½ªÌ<>A *ë‡4X”);(üÂlS{·7 ‚ÅÂÍnÝv–2ïòƒÈ3`»*˜GˆµÍaq^ ¬EZK3¿dŸ;îËó‰mb“~á rêüS¨}ÒìPix€ZåX›óNg^–-õMâÿy á2úP¥7jrE‰·“×ϹŒkbH¡võ0È{ü(ÈäF‰sD<ï_Ž—±¢$âr/BTK›Ð¿ÉH¤¼™œ˜ZxBÿ|” 8~Ëï?ºž‹fÇÝK[Dyë¾ „›ÉÕô¸²ÊoÚõQ/OSüƒšïBò’ÖåjÞtJ!¸y@æ@²x=P€°œ“™¤ H-¡Í(XKÈ1Ö7Ö§á]S`wnñVæœü@ ͈ú&X‹ž082läÌ23µ«—xþÉ|S•…‘½(£ ”¾‡ôÑ‘eìDî!B}[Ï0ƒÐ.ÓQž °…f wÔú@l¸Ù©Eà ‚ßkäÀ±!U‚7:Šƒtix!öчçeºÄÔya&i[¬ß•èL<2œ4.±÷¢îu>ð.`œ–õ}ÞäJ¸š‡ú³Ý‘Täˆ"¦‰Ã÷“žø@™>Îì¥XwÌ3¨(Û|ªNY›HV`]¸JZÿ=W#Fc{ØËWqtKrG¼ ù·OK0Txâ…`Qnê(Éï —£¦²®žêÀüƒIÕµï,qÿ#fžÙ !›+ ‡MÒ{ÀS¿îÖt ÛœbáÏ}^“šÑèt¾.K yöL¡ŒCÃF³á< `µ÷•Ú‚·Ãß P­,¬±Å>å;š¬€ÏÚÙO…ŽÚIµúí¯û_7¸ÕûMqGýí’èÒûL<7å£HðM‘²µ¦)ªVN ÓHë³wF{v]v´G³"l˜séü.dy¨ß1¶ïïÌ´&»tê5éµù…#ð/4Jý¯´î] ¾ÔÔBJšÚíû•C²ýÆvŠ —Ù«ÕkéÔªÁ¯š .ÐiÖ;ø„%<Ø7øÚr,èæª•гÅÖì¿Xi /]ÖÞ«/äÁ>‚nŒ/¡Ú§‰Ë“ÈgSÓ[‡OBsÞþ®ƒCf-•In-Éž¹‚o‰lÇý ìNÝCâ‡\›Ò‚‹x8¥¤›±#woî¾[§Zå$>Ú¢úZÓ½‰C°è­÷¡5sçŠj)¿¹ŠúÍUŽÐ™Uïꬑ~ˆw鋿ËÍÍðA–"sLöØß]Éí(èI.Õ³°R JÏâ~<ÿaÍwtæ^µ”¸i¸ú­øˆ”‚¼¶‡`:Ç ¤ÉueWp¸":ß¡`°mP=Ê€¢Ä»µ}éF@ží¹Ðjþ¦lç:˜±>é G®áï— €jûðT:sÅ\"*fºËÈáø$Ñ׋KÃÙBIÅ'«BÆ ÌM>c>¢Kiâ?¸ªqšy´mF#ÅSÉ ‡íš‘3ŸË^T‚~ˆ“[Ð4€úw6Ê¥ g¶Ó—JJÐ=éZÁ hJѯÕ=(¿üæäÞ’BçÇUæ[>œ\}ÈD‚*¤J|“\d„G8=¿§SÔ—Æ…"Á³ŠdA+˜í(£¼Ìr¤í¦þ4Žƒî§€!W~ ¾ý]¥­!µ£þ6¦,‰„wXi%IþùÝQVàÝ&Ô B[ùL88mÒ#N¿cÔ™<Úä†\« ¥ FúÚ›0šª0VÞ¦òµ"Ï.N|zîbi7Çw¨C%Üiu½,¤¿ \¼»£¤Í7Y–üW ÞÓ­‚;Ó"IsÌí…‰ÕáYÏzC%,ÈTìõC\EIüa””j*´~.~Ôj,+DÝÖ¡éð:eŒ œ6c2 ¿µ3—cä?.ªM O‡ÕFS(â ÁY²%xØ»?i¹ôPy0)Èïš’Ø5Š×7#¸ç Jã+$ë©>‘˜õ°JÂMZwY®eìSÿˆ½"0AêjÂ]½o.‰io‹g+¬C‘g¬Tbû9ŒEº¼§p*1yfÒöYN­[ï`k#®œì ö¦6oÎt›„2õÄ~Áz—ðÔkÛ¶9Ð"ÏyÐk÷ÃíõÃÖ¢?R@îŠK‹&┿nWûUÌÁ·Í‹!ðQÔ“”:R"Ñhìy÷8Ñ„Œ´•{º=CÌ® ð”©uØŒ%&gÖ'õ•Jbœ;%àí1&98JËWÎcd*-Ý[$—ñÏéñ6*#î (êõaýsÕ.Ähže†›áûnÌrI;íwè¿<g‹—|²ß W:p¹àlq+uHmyä Ò³Rò3}³€qh%”7_Oм @±þLkžÎï1ª‘íýïÎÄ0wµuÓm)UA.íµ 8R—Þ?dB?óž:NËç;¨®*¼°×@׉°ó½~,¢ÿqƒaGÎ:ãmr¡‘X¾¾<`/UöÔÍvõ¤¡ÉÇL§Ô>µW¤æpÙwîí00qru¡c(žM+³»†ú5–P l`:þŒ’µÓX©™®{õ„ûteÙQ$[Á¼ø¬Ò€v¶þ¿?@í¾À&µ€dŽ\ « n°DË^ˆÒ ¶FaŒã—Ÿ^i„#œ¾’¯ÆÄ¶¡¥§Ò·Ýà3 Y{  s.~T’N† Ók‰Š„«ÖB¼Pö¶-……íõÎà lvé87;®ü˜dSø|•zME‡SŽ;]p°¤ÙÉä½:D‰âc2wrö%`ÕiU<iU)‰åleÉô!ÁýâÎv:æŽÐ‘Ì‹æØÞ°„i‡ZqµÀÓ Ô€‰u€!:<2lFÍ×òý¡Ú"LÛOö<Ɇ‡$É)U"ruS¢ûzÝÂâRCŠÛ–ÌÙ¾vâÀè$Ó,þ ¼üNÏ"è"HøPÔ;u}R¢s0'­%Ä$‹îäA=ÝJë€TíÈ(g¥È_iqÿ>s²bÞñöœsÜÙ½Fs’¡)ÏejpÆ| P 7¸msLJ5hZ5²ëzÌXÿgŸç?Ævæ¦?Â{¬ÊDÅYdœÆBžVì=ÁÇ[=Š›«@æ1<‡`ÿa•5è¬Û3ýÌ;ô‚‰„ì0ʯ¿ÔàgS·­²hjÉxxäo{ŒÈÎ =ôu—Ã:«uaTEéKÌÎhôŸ ö|O¾5Ϥl8%/À2œ¿w÷<«$‡”æÆWr¨`ÝúN“æ—äbè:Mu«Œ!›Yž„iß4Q+éô¾Ç`*yÊYï8TŠÉ´ :{(ÍÕ}©Ä€)[ +> .ZÊìš¼ý|öæÛsQÞ0ŠÍð•A>¢­£ L×fßÊîQßçf}} ïù,c¢x­Mïç[?Ò ճdzuµLS¨cœº€¥ÓÅ`:c¨Ý|=5㕨ù¨!­ùÁÖ cKžvÚ@PëtEhõqŠ ÊÅ«Út?4£¶_²)X.ý9ùønÎ Ó©D«U݉ J‚ž‚)oä 31—aà*”ø€?i2Ç}ivKXVuš„ÇÒo5…Áâ2÷U•O¡ qg˜Dg1UÆô&Êh}¯&VsScš¹ýÒ®*•Pêäó¹nû¤¡¹YûÆ·Oõz[øÅŸW|ž”§#“Ø4vMÓS×Å\]ûÛh~F„~æpJü™0Q­A4ÚûÅÎLë†m+%hÀì 8‹‰jMEÄ8» Á%Ô)æ¥IØÃŒ‰’,VmN”h3Æ´=˜uã&t!‰»mðõ~6‰v™&P¹ÅÉ@¼˜®Ø_Ž} 1¢ ]ŽãŸ3ßà®aZ³^N¯ *Ò­ì“Ý8ÚÕý¡nåjNÝá¾ÇnØ`0íú¬{Ç…#]BžìëÑ&§™ñ òHIWףد¬ ;Íøš "ä ”ò¸~¹Ù…#òÑ=“ãšY– vs2&Ðÿ.?òã ˆcp:ú E“yêá¥uPëòFVÒøš°¾©½§Úã9£:ümk_PñEà3ŸÓÕAjÄõræ*>Üg*ð9†1ë÷TJ î sµZe™Ü’{àãáLd¯@"kAɘõâƒ+>uåT'eܲY¦6+ÒA²âÅEÁtÔ³À +¦ú“Ö=wYS£ý3•¶êßå¿*åuWW¯ Í(EüÞpþž$|Fè2XÞeqÙ*±¿2+¼ÂÊÒÑ’¼ÅóxYqU’{Ða¿HlœÒmåv|ˆ"Ï®³ül5V™ÄcGDÖÑöv"ïÃNòëzˆ4—G3¼+^©‡©þ\ðÝZq Ñš}­—Ù 9)zþóx¼”ÓO•¸•|“JºMÐE™Èà†sóÎd¾ÂøÛÜïh{ö¾\áüä$aXAt‹et,‰ 3…>÷1 –;]˜Ñ[:MÓ‚– ¡áúáAλjM…¨2vë¢?cþï8K†asÿ[|aØp€L.²ùË“ñ8pO?Á…¥1Õñ#E€Ã¯&”&›ºTÉ~àþ]kX‘Ž¿­:pž é80æbÍ¥Ùz9´ŠÅYhgJa÷`/¡ã<}=‚Åå²ð¸úœd} GL|{+džu“ ;Ï1 U?ËOQ¯Lö< ôõ_|ö&ÒY”A½Óç¢}?D^ÅpŒa£2t•Qt2£ûÙÃbfq«êR)È=%”—`1@㢋³‡žgHHElv,é$™“{7ZKŸ½n&?Z,#£X5žÁ”l›äl$æÖ á n=üÀ ÌGÇ%„W©ƒ³ TBcO¡‘„´ÇW…,Œå ôx7¹*@•ød³áTÞïBûý›I£qt~.:#g ¸â÷ª¡G¬ì±EšÒzõ }è4îý¨ïfô°>Ôs££kºƒÈ¾ŽâvÚ…ׯIVqúEr|ÃâO0T±‘Œe!=~uò·:•ó7¸˱¾ÿvˆªŽg Ð3Ü¢ßà“ãbWçÕ2’üø¤1€îб½«äZ¡¶ch€‡.r:xÐô¼X6¢Åò’Ò|øþoóE•‰–J t«ô¬2œ’¾öÝ*Ú¡Ï õC#¤Ë©;Fõ(ÔRR‰ž¼T±š¹×±lúßíҷƺ|9ýî†2äÇçFß±ö—;§u«Ö&Æw¨“ŠXQ ì˜6„Pþ|Ã÷{ä”(+#ó‘Ž66;˜Ï £5Ï\m6›ÆyŠ‘iiµ—Ú_æ ЋºN|ÇÈÇóÐQ%O9á6ï¤d~+ŽñPÌ$ CqeÒ³77y¢ohk<»[o±;ŽIUmÒšØäZ:Ö`À——òCæ:dj 0t; }—î)rs÷ËùÝ ‹¤±Úq4Ýgd<ÀÂæ[Š}Utb’­ÖN¸`õ£¾|j㯄ØNöÐ}W;K«Ï³ q$‹Å3ÑD¥‡R18JCXÄ:Û «*K•µõËž—° £îSþ=¢8qá„Ì“‹ƒMŠ @µÄË RlW;ñ •Ì‘¥{g»p^ÔerlꃻÜÖŽò UèÀžD?Œ¢Òbþ…QÇÄæ7e2Ñsóœz‚ÉŽ§l3îÅ˪¡ì䆋´8æ}Ÿ/ª ½Äô­J6oÀ½aœªD£ÔN¯¥g¡xOêYåŸ]«¶øRè£nÏù;u òŽË”uU €ð€‰õÎä UPF[rØ,ë7ÕÙïú1UĨÔi(Ÿ Ñ#å=ÈNЄٽ#Î÷"ˆÉeGý‘6Šš„òDv‚®‘@^°\³/oª›a§sb÷`S  A\é¡ ó«»(ô(=ñQÁ³WìáB+Þm¦ˆ&vJýðîy˜sñ¤è›ùÁ¼€ g“šQñ…Gç1ÓžE‚Œ¡› 5Ä“DcøÁIqñ^RcŽ/!Ô®‘”ˆ~j 0Õ÷¸ê£e¸äžÝóç2>EhW—¾3tÇõ‚cÓÔ¥tñ™æ)ñA:ØŒ…ä·Žô„b |[VZL¬ gXÿd¿EŸÕ|\²±ìkœÑtâÊ|Ipó¬“yˆžð×í¸­NîÁ¨b\ÜÖ„:ý造3&ÂŒ7‡e–ìð¹þ3Ö0ÇÑC\¼E_ËÃäü¨Þ*%ߨ€7ˇ•°¿ÒwÇ61hÛ pYÛGëR+¡í÷³ß e_ï› TïÇe¨9Ôžù°¥ß­Ÿ}Ûí§ùc½îu14Æfmþ!³* òLÚ÷¼‘6M‹ Í¿¼µç ÈZ Ò%Íd ºïÙ^ÎB¨‹¢3ÿä{×Óx§y¹ŽtÒ‘ó[úåì—+â'EŸöbpSþðp¡ “|'h!ãð0†šr³’D‹&a«>iâ£Qðâ]ÚåD¤Zta¨4x±FV÷•Óô)ÈÉH9z·÷;xæycG‘M I;PXÕï V¢-1JU?hœÃN½úg¹ót‹Y¯RX=›b1³¨5>Dÿ#„ûó öª€{1À¨¾-f@(íÙì@å±­ { o¿Y¬\0†+Ñã|[zj£!hð`Èø¨øtnÑâ:^¨Ló>HuXò:’ aàÅ zAÛk4iƒýH~xeC2S7fŠ×LQƒ`s©TôÉZãÿRÇ„èø,ˆUK4 ï2ݬU‰ä§óR%{²Åöþ›€ùzŒþm,Öý–ùVjÇáêA‡¬Ä~¤Àø)nX dÁôsA•)›úÊwâ/t’!" N¾ Mv¼¬žML9¦Fù»^³Í"5×;5 p¸·9½~:2@Ó:3pñj³åJC3ö‹;ÿˆÃ0Rb›háorÓÓñ‡è긒XcŠÚËŠš¾¡º5Àmón‰ÉÖyS|ÈÄP$w<ñ£'½bO{\aljÞÅ]üt7Ù)ùG %(]`w9ó (‹hû×â3 ³÷^5Ng§Ømk¤öS“’´Ì’LýSØ ø–-Äo/@ÆT€æ¥OHúу\Š›ýí‚+̃jeÒÄ9Žëð}Ü·:zu¥YìíOý1”ó*U»T‚3ë[8ê,C<@2£YK! Ê8¨ÀQª`)ÔþÑ¿ÀnÅÃ'M>›×°œÛ0ã߯»^ßÅ)ˆ‹–§ü Äcºå‹Ç>° Cï/¾NѦ˜ÞW)¤vxˆ“\+ˆÁnyPmÃÅÌ··ŽéÛ·{\áD˜&Ö«tXxN­Påè½³,€¥ÇB.‚ѯñßéè{! –F½ó}‚ÈVàO<³\|_ófeOmõ¾rG½T§&™zÃIÛ_ WÝcöårI•[Çô-:‘v²1ïØ] €[5vÍ —F*¥häîóú€/ˆ/€þ,UñN~Ûwû yæP7Ÿ8O5OWÕ¼gðÉ¡h¼œ¤@D÷êĈ1ÒUå}¡zÔH^2,’4¤Ö4Qÿ!V:a òBÒ΋+öWÖVVée2uxÝRˆáC‘¤‰•'¶¼[ÿ[É4’̃v=+îrxŽšµ6<,#Ôóý JIû%ݿտÔ‚Õ“‘[ôŠpgÌtï½Ý1Ž|ÞN£‹ûY†Ø]dú‘&5«n¼Ýww\V´!*ššã͹%w3gS@Ï~ã¢N¿ó0}6­!D\Ct …Æþš‹RP'Ë"EgM¸5R­æó.Äó®øÖïx¥¼Åf',+•ÙþÞµ¹&ïyóVÑõTiʉÍ{%Øš1Lé}œD­¹=fȱãGçwÆôëÕvx«ÆÙmEjÇÂ[Ös£cq'¢!,A1x”’ðZnÁV¬¸‚{Ì»ü™."'$z²YúËœöÜzC9úßâà ûx®Ýl_`A|l‹=k”£~-£SÜÖr8Á-úŠ™)ì7Kõ±k"¤Jr€<õiVÆÔ¹XÅ5vJ%ÓT˜1…}%œÐìôÿ+¾IpPQ·3yýoäÓSöœŽWx+”¶œ-:ïÃma®!îÌÁß š½ÈuYå“éã5HO5[õ´™»\\ŠÝ,“p~ÃKN`íø½ ‚þŠ€Þv)´ )@«¼ÒjbZÝpæ”ßÞî«)"Vôþx~ʺýšì 8åÄë_¹\¯$¬«!W¨k#GmydLj*âN‹9çz~–xºóäÕNN |»6ÑdßEXÜõóå݇AçOÛaa§žg6Ÿp/±6|ÕQвÐUmÓžk¯'Q«“wÜB1Oÿ: â,ü©¼Õ·FÍ\yŒï¥šHáàÃ2r6€2e´'ëºûKonnŠ–.ˆ¹jI”}↷ЗûõÖ‡%‰v£NùŸsZ³ßs ¤CÎ#¯ Ðpæï£0s4ÚÔªùé‡ÆÖŸ,—¢]:™‰a8É-ôŠJ6ݬ)&cå+߇©‘è£Qµ¢.GŸ²J½Ëõ¶‰´~ÈäŸÚÑÐ¥A›£ÿ"ç5-¶ó¼ƒqÚ·0e9Ycëÿ$óÔ{öNZ!:Ù &‡ýžGê©’7! t÷‚ËgMXT\âƒhµI{¨0b±ÿbH ±$ÎÛÊËž9ä·*„;_^8ýB¡ƒ–^mjÓE„S½ª’®¸Î.iýÚ¥o%´Tˆv)d_þȼ„ýÚfX*Gtq Š&’Á¥bsR‡CóÎæ¾®:¡g{vGt¯áí`\dاiCu'˜œX>[~Ö7RØæEY«¶P?@€í:ê]åDînÐx?ÓÁôð!w`ù5‰[*ߨLö1A+ß(ėຎ“$àßÊ ­J†e£±‰"ŒÚ5Ç–i[J­³ø%¨IYàu‚¡ÖÈmdƒ,Éá¡.ÞΑö{£yÉ qAÑŸ ©Dó×´œ ÿ~lº]Æu+JãâH¾¬ç? £á‡Äù%³&•ܤ­¡ñ&Z@æR½,â6Ñ1 t ü€=¨Ù¹d:^¶W5$ãgr^¯VK*¿¸çĨbùÅFNeB±t–²¡Û½fg#Û^L À‰,íÞãÉÐÔÔÌ­„|}ùG<;Å–…™#\÷ÝÙßâûÃývÛp§ˆâ ‹áާË;¼b cºÊ0æ¸Úqj/ƒ²cÜtVÖ§CNÛgp*g÷S8øÄ§K^ R):{¹÷½H?Î5WŽ›¥t襈§u|¢ªÙEeVÒäMnjÛ°WŸJŽó«t"®¢Yâ­ûý”=m¾wJq`Ž$ò”kHÏ¢2sãJø×á\OC)ñ}5Ò@k¾ ew¢…Ü¥ïý ‡I{Ýî»,ߎçjìýfš=?$ÒßxZ&§èMS¥øJ¾ëÜÏC…Fó©o‹¯3,›ÉιKJçþx‘…ƒ øDW쑹[éÃf@t€Aó•V£Çsz¦HBáÍIá!=|œ“Q @ês!yMª…ovë í‰Yg-´´=§ƒÍ¿‡†éÎ'—ÖÖµºX Q‰+E±ß—(£.ó)˜Ã,TxŸ‹<˜«TIO4_òa`IRÌn \Ï—Ú £åaõ«` æ4Š G~²tÑ ‰è÷’hI"Aó4:bÞ'UPéO›§EHHéQë΋sþOþÑ2y­©Ù×W à\›eñ»´â­5N ýGü À Cƒát„¾/u‡wTÌpw{Dœ úÒáÕõú "³iHŸKžmÚ–º˜=q)É[¥ÕRÄ™ ŽQØ6Gî]î#­ï‘^J|+¥-=ò \mÌ é!šŽ Ud€UC¾4ÂA”[ò¿ƒ~•ñ%§bsO?“ÖÄâÓG3ÂiÒ™"Ë Bö˜kBX¬4XÉû_Üt8˜#ãïS2åͲŦÔÖÏåØÅ9TÜ‚sV‹¨3ö}ŸZîÙqš%¥ùÅiUêt£ï$úLÙètž(Qv¤ÊfúTkÔóÉ–H­ÑžúQhï…±ÊÏá®´Á;‘P3ö~j£ÐÝxvÒi]UµçÕ-êè³ÉùÞþÌ!dÜÖÛ<ˆwwd-9‚âaެ°]R†j#ÏØxâAÞ€ü¬&ž(©nYåÝ$7ÁË·Ž£õo&aòUUµ9át‰Ù«ä‹®Õò ƒâÓµ™¡7©9mècTT†N:˜ÅN^,`å\ŸÄ4¨=»e𠺾àZAXÿD5„Û{;Wš€õý[>p¡«šëíýÄ–=ë8½L€E¹PiP„ˆ&_2¼égAEºFbTÁƒ¹¤ÆTÍA´œõXÕGE] c´‘a¶Ô…oµÑÎrBÇ=”x–è ÝŸm¦ù/dQ±‡ªøÈXíf K³»­l¤¨(Úƒ‚&ˆŠÛo̧¾®¹!£øÄQ ˆg+¤s” …á§\­d¦„ÚÅWû«žU±@r´©Dfä''ë(KÒýÇâ- Ñr>ûàÖ Ëp0\xžFÉ4ç›IvsÜ‹]Úa´2~HbXIÿR-mÐôjC0Ý–ZwÚ¬ŸÛ¸hzãJÖ:¥™™J|Þ¬¡,›Ë­*€°ì‘§3‘Àm™27Ä„¡h2ðd]y ü± û'bÆiJ8¦y·M[sHˆ“ÑÅÇñÞ jƒOqruÊh§Ë–¾{;¨Ü‡Tˆ*.¶½vòßY·©¸|,‡µÏ5€„î[×iÅõøÎ9Ø——½ÔqJ™F˜C£¡Úá î!Oä ý4 ¶É”°Z=°›3°U¤hú…ûaE4cVä/áàÛ*ª#\¢\ÛOíHZÇáÕ\~uÇáÓ(йc!I[ë$_XJh!/Lð9QìfcI\·n[ú-ßè6±ð‹i”·<6<7—QKê‡í³íÀðïp«HX-Lí×^~ÙÜÓZõU«ÿ]ßJå¯$Gõ_‰’8ƒë)£Ô´ƒ‘ ª' ˜‰ÑܦLlJóC.D^þ.W [–­‰(ŽNœè±ìD™9pªiÊ-~*‹ÞkšÔ]”ep»4=(4/•äï¼Ss§±qö]à$Öl)Ü„#½DóíxX'©|ÅKÂÓ@F²úPånå¶Lù%Ò÷#}ÜÝõ U@ºOzÜ[z‡ºo'D§¡Ê㌰ÏÈB¾v(é!æB\Â7Èí88oZªÄV>M|Y®ÞWŠùÙW»ú0•퟽‡k-`t2zæëé>ïW%„žB§Vhk‚²ÃŠöšÔ©6ñbW`yRç=ZË y5ëÒkí/`1‹:V~AŽÓ·%à"ÀT“ü_ÞwÀÕ¾g¦ÈU³†±oÓ3H Xó‡žXÎAh†›ð²+vRU¼zËŒ Ó8­f ‡õ ÒÃúä5åî5ã l÷d0Ì­õ†c'•›Ø †P¡.°T© Ö¥ÃÎðQ$&yÓBG¾æ†íÐ#Œl‘;–C6FЪ ±°DÝöGÖsV‡ÑÜBsÁº”{‘×ð5½yÑô–€›Ö÷% Š0$HX³„0¡|ÌVAM ñD/¬G!MÚ½ ¯,qÜ›G´‘|J^¸6¦];äQU¯ Wîÿu9¹ðZgÆEkb©’4ÖéÊ;ûã›ge2}rW“•hë€J;¹£¨Ñ┹C‘àxàQïMƦ%&Æñ‹Eª®®r™¼Ñ{[e®¾+lØ¥XZmØrǯA´ _x´ò¸üæó;ÏSHx¤KËÁµËå¨íûßZ<2øÙ]>õrɇ±ïÑ·îV§4%M7&­¨"Wè´3IžET­¬YÁ©c^þ#$ܹWѶà|ÆgÅZgÉIãGåQ™D[ŽZRèQ_ÿd%ç ²Sâ°P#®pç©ácÔ ãÂ’N mï=¾ä^™Ì'dÀ™œˆý‡R®Gnhì?©Ó Ë©¤¡ Ì“lÄî­†³kñ°¶jû;*pùëˆ2©a¢–í|m;Ûlšã3|SGÃÐï¯rZ|•¢1¨··$d¥§&MeK ¿BÏ× ©Þ¥“¿;¨[¼R'TŠ)[‰¾†³›4á ·VSpm«1E^¸ŠožüTªaÒì`¸ ómþžÄ\­­ÐåCÞžmKÓ³2ÓyfxÄÈ23/N¨¼¹^5¼W¤·.ž›_!‹ÈJ+*Cò€I»!‰¤ŠFº|/4ã)¡Æ@Ã¥¡7±d )äßÊÕÏfµ¡BéµÏÍÐhpqœ–g¼eüà†³™Å åYYvJ£tÏ­K²ý»².’ÙéîÎOÀ•ر>ë«›R ®%SU@å…Π ¶ž8 /»ÙKßQøÓ7é¹½yÖÙÏ ¹J­öÐû¹ ‚Ã5RÞ¥“Ç»`ò$ZÏWŽ?疯ǭÚÔÔE2D¹gsŸWã¤:ùéŒ2ˆ,¬*7ÇB¹(¶1 ÚløʼȷjÌͶø¹cœ¿½òµ|a8!„Ô3.ìü æ©õÞ$ÇR:Xƒ3B~B¤Jð3œ~ô°ÛpšÊÃEMíÉÔ¢˜2Sƒ¶×W&gØ}-dñæùeºÓ^õrDÉŽSfçr€ó#–&\—*8 ~Êd’ëS1òôLÙ© ™àÅCðŸ ËÀ KìwÂqlÞÂßfÏøH“¡%º(ï¢`…¤©W0ãQ}喙нÀ¬Ñ³-uÖ”=­QòeõsC:tqü®˜W)Yìs¹dÕw•îÃÌä—LÓqXUìŸL/9±þq»!”Üü?ö›= àšY¬(ÀEŸÖt}q9ñ9z…þJ#ÀxWˆBb{×:(d,W-º›ª•P]_&q‘ÄíÌÇju& ø’#:O®‘lþO68 r ê ð,9þâdRê÷7J¦º·DEtͰ£3ã‹ä@¢ÛwÿfãÛz714eÍÏDv<ìù?ÍMGÕä9>óô?:Xû?P ?K†ó›ñ³÷*wïÔ,4šõajŽXœe~º¤9wTj?•v3L›M‡ý™0D8w4·¡äWGi¿<Ò!ëdÝž‹ó®ëÇJç”lýÝ|ï”…ÀåÓ ý¿PËØº‡kúäŽ7ôšbò‘°³–å|äâÈ틪Çê‚ÆX,«òœÌÄÉ Êš0¿ØÅÅž”Uú<¤˜o7Mõl@=nÇÙ¬%pOè{ËÌMMÆSwÂÀÔ5žJ›3xúW‡jÙˆ*‰Ì· ¯QAw8Ø0iÕ=JƤ\‡sÃ<÷•oÍì™Uà Ò¹4M8^ò·Äiqiõ€w'«3øáúÖäµÌ5">Æk\OÓü²‡HŠ:©Éô‰H ¾J©WN Û&iVø”òËNÄÅ+¨FHëÝV>-õø©Š/ƒôê ÚS­Øà8Äã&ì×u£NüíøsYcxÅy÷¥ÕM3ÇPlÔn–ágÏo–Þñ!}r ØwØEE ÁÆø{ø¶¹5åöúqßo¤¿ðôcþй}¾ ÿaê•}¾ŠWÛ采íï;öú~ÞÖot Œ“pļ5"_Qé&µ(î%³ß½ëŽø]¯¥Ô¬ îÿ(ÿn—aûÓ§‘Ôç0i¼B;ТŧœÝl'u »éÐHQbñãŽB˜2Íi¿LÞ£Ö3äÈà•‘n6¶Òé¬èRž*÷#Ω¯ÙÇW凄 ¤ÔC¤ÚÇR`’B.¬BûÝ:©™!¨€žþÎ =Ë;ì­Ê±HúûD3Mv¦s;.Fo©S‡/VºÒîiF ð¢…ó-^•ÿaÆúI&òb¹ÿƒ„À£\ÏlG¶à ^;£ˆ]ÆŒ<ºÉà¡VǾ™œbí8” üûíåW !•ô!Zö Vœ„ÌOb²,gí‡À'~ ˜¶³~¼–Pk ­¿Æ¢‹°äË€Á]¬Ë0òn¡;<ÒvïµC­.yÙ€R€o&¾rî4ovŠ‘½t”ŒøXçáŒ[ÞBhCãZ{!3ÜhÇéß•ÜòçÂ=áÇÏ3± G&Žƒ×øïÔöÅNàÑ•Eå…«&kweÝ:{f4±lµžneš¹*Ó1`I#ù—IƒÚ,7q„¨ ‰‹€@u*Á\Þž¶ ¹§'rcJ,J_ù’œ«k¶ ‚ZÑ.bÄò>:ƒ¾=v¬_¨'\ˆ‹ÇÓN…|Ù=ê¦y÷ˆ#“±NóÈ01³¸”R~gˆh™G8=CµËù…$’ÎFŠM‹Yâ*Â2ü/xkp¨œa¶lÃd´s«J—7VR2ÞeMŸFßg™ÿ¢ i =$Žü´äžÚ÷5ªáÏ fd˜31!&ÛuOr‚…ߊç–s|7 u3EeÌqZ6ÌL¾ú-y¤ƒÑF]<¥ÄrrÉ-:uck²dë«ß%`n¾ê#’ÙJ¿33†»/ÿ Mý;nšp],Z• ud¢xY’73\àtá8Ü"„üáH•ÏEÐ ä*ÕL*#;s¯ðe€LYû]ì$wú»ËC¤§ìY\¤¬ãù¾Ñì$A‰Øí"¤‹¶â<Žü€—©&µ6x?ë€Èt[aÂÿgk’uý’ŸËÕ‡ðbBwë?ñ·v¡:5,ï 0?9Ó>θ/È3 ?êQü !DØà=ÈDa—•­RAZ•—ئ™— Ôq´êO¹i¹v멈ÂéÞ »ß‡¸¦©Ü@“ˆPàùw}egòí%ƒ0úRòf?«˜ü•RN[ý·ØNÝžÔªà ÌñæEÈ(Ê© ˆt)~»Æa ¼¼-(E‚˜@µœFWwß}ò´çà‡n°´ <]JÞ‹jÉkÉštMBNÅK€3h£ƒHLçõŸÂSÚ[QÁxIa8P¯(}!VÅ÷‰_‘| ¦#t«AíT&Z¡—ÉPÞ{ª-†ÀWªGjCþ'æ-’‡¢‰>fz@!ÂØè?LݧW°0«døôÙoj—LS¤(¤®¬„%ÑÅTË6ØÃbχ”b…áóìŸaé÷;[ÚâT­× 3™@‘¬¤¬MŠ1éòåì»êÁž‚q ›=>~oj5ùöHªîãñ)–¬<©Ñ«é-¹ìY¥µƒÒO¹ºØ0hÅ€9 ÜÃüTÌL+κQHÒ˜qèêèe“ Ì*Üê«?³´&j‘Ãy;ÏÁM¹ª·§|Fg ‡K#ž6ÖU 3–V„š„výˆÕÜÛÊxøìç6l[_6¢k±r­ÔpU<xft"î—Çðß2<¤¿æ´|•S^å‰Û±8XOß×Ló¹È¸éw =©î¶¥K íRã~»Ü=&ó£E`Sé ÈHgDIÊjš4j!Ù…·¨Ýê¶HcX[覘ÂÞßWg"Ù7} ‰Íô:oêß²æÜ©Ž7캄£Ž¬§ í˜KUÂ_ö§|ÖZ°´¯Ï+ƒàÑ4Æ×JÉôñè_=ª^f˜.3’²;åÀè7èXAüÎÔBÙG?ébÐ|5ú×`òfÂ*Ê7 Æ+|«™*gé(uàŸ·Áœfcù^½ÿMõàëxýã,ÆýžÃGþ^„æNGö ’Ϭö©“pŸq® ÄÕóúäÖçô(¨Q€ÂV 9ƒƒjÆ'›¾²9§Ž¥F%±é¢JzC<ùäëÌV±âgIŒh ^š…õ,Á8)˜&s”ãæUäÊ&E6ó¥åaÞ<™¥XÍ“F&žÙÀ9¨·q¾uëØRç)‡‰o4Ç yÔóÈ+ÊK+©°A‚Ù£LôÈ‚Â̦ü}UY¹[ÉVºKÜÃø ©[g©™çþ!˜€~“/ZÞo‘§ƒý9&¹Jvpi=§iÚt$™ñesÎÕaTCq­‡Q[ææž3ó²IBˆmÜ©¨üã°¶¯Jb-Þ¢ƒu~JÝe¢ëN×.ÂÿWß¼ÄÒ¨6 ~á-TN}ZÏ ØµYý=<‡4Õ"Î¶Þ A“¹[nß±)ê9Ã=l¶ñúŽ6¨î=gÏ„âÓX먆sq$&3Ö|Œ–qêg”ÌRQf&âÌ¿DwÉøäoMLI-ÿ˜tµ~ybǼI¾AΜC Œ`œ Þb0fóþ ˜ÃÐmÆç÷“"kûyµ£þ A솀n™d$嘎jOdÌ ×—9+óŒ”ìçÙ_‰Âêÿ<•© Åô¨å:1Ã<Û*°H¼¾N7§IÔä9pŽjÝvséw+ÿ?¬„3‘ V¥wÓï{ØT…¢¼‹}ÊþXªg]J7°æ ë£(4ÌI,áNkîì-›FThÓŸaÅÉKZÒ…ÝÇ€ÚXÕUÚåü7"áQž¶Cù #d©˜×žÄ¸'ê•Êaj ^gÞ?ö—Q¨½*\¹@0ìšØ éþ’»à·Âï^»ßþ†õ¼éérääþ¸™à™ž ®•yd$ÐU @Ÿ‘sÑãZjÅ>´”:`…{…¹úm¹  %›E¾BOD0@Ý.7¬!¶iÜ–äß®ÚâØ,ì_ÓƒŒR`—Õs«oÌs|ËÚFO±G}«¦Ôg|²ëtô¼Hú7ÙL–jܵ¿‘Ê9?3¤'f—!ãÑÃr•Ã&õs½°æÈ?â–lŒ®_ûè õ^d°ÜÊw›ÊjJµ€"¡#E‹-®ÆWwˆþ÷ô¿ä›/¯Ž< ›sJHˬºFqøáÞ%i¤‡ÍÖÍæ5%“«æßBžmâžÁäúŒ@;Ç{L“Vó¿ñ@”\¢ 7²L¢QÑÛFšþÐDq|çf4ë`®ðI|*-=ÉQB"DVÕæ<«‰ÐQi²›â³äŒHQ½‚¸Ža“®NB†T?*®Óè!¬ckC¹¼ñ=NÑ€H&+àʉ/t¦¼k>/ÿ ¿$é,)ïU¥/Œqö,óû0ݬcåóxÖѬ>n™)#U]±]—ʤbßÓÝŒ;·Û"ÆS* ‘&¼åBgmúò¹Yݳ·ì‘‚„#5ä·|}{»ÆØ)þ@ewl,­xè²£Ó¾AÑ]Áry¶ÂD{ .y&ºKìÑ­ š"®åW½1ƒÂ¥ÄJè3”Îó`µmøÀåBñY˜ ’ý¬·ámôà ^½Ÿýì³bG^‰ žþµvú~g‘‚lÞâ#®Áy±^†¡ã˜ÚôØ|È’É}+#Ä!‰!;ÃÖzT˜Á˜ƒ‡—»|Œ­~ …²ß¤ˆÚe‚ÙºB“í`».A @fê…Sàéï šÃÀ»•|U³›f¤Ç™µž)õ0<~)õ©uy¨­ÿ#:ÜÎ~í‘Õ±Ì÷ˆÚ¹mâÇ Á¨ê؇oê àehI(°IPt¹}"ù‡· Ïüq³X¤amð'ã|ûG‡Ín—ýJáõ‰·ç’±öpR‚ñ„|Sþ`rOnàD&ÿB»ÂñöCãé÷KÈÆPNqÖödú»Gƒ#ÛÿJÈ›±ïå™FU´šw#@Ö°fcU¨˜£Í.¤È„jn“.Rndç·Yù-Iu›œû@ÊòW¢}‹î4+qfÊŽ*`ç½Ö¶-éý/†}§3K_,#>XÚgH\Qb,)Ïhz±n1ß—rãuäHMÀƒÜÎ虇€JÀ@a¤® .—Ö+Ù}'e"éò¢€{‚Ìfì9‘­s-Ùà«n…lìGW‚6ó³ÅO+ØùY7T'n‡ô#ïfde=µ]ÝY" dÓhÅò^ö± ÖÓókÓvß³¡<Ë2y¨4­ìrw i%Žêû·3xsÈ(l>ý…Å1´>C gÈñ&j $æëNÍ9Šnø»SvßW…¿e"ý¬§[MX>‚%Æ—õë™°…ý?Žvé™/g8ZËÈ$QØIòìn|!äÛ÷þçm+Sp¡(ÃHÀ³iº+µ\V(<=M@y÷ÝÌT«îÚ’êå«Ô¢WF ã›E9Îö@·Úœ;:ÿN°—ôÓ·™¨´–Ù|¾àWüó BêE·K±£}®L²Ô„ú£>§) ˆ„?’T õ;‹, )/>ëÑÊBÓªÃ#j”©Žùù91Ð/šÊYI”zwBÞÚ<Ž€–·¥M|¯¾zpjî…5o‘Ä»3"ã'áÑvó¹…œ…:3Í7ó¾ùYbÕOÖܨm‹Ÿ?~9çögBùŽâŒPTe3^#«p——Í"ÞPÛò^xXh ‡Ž‘ñ‰`. çáÒMì,E=žš‹a¾•v€ZÐtš}^\‹!Âk°z_ÔdHœÍ+ê¹m 7öÃÚ¿aöñ0á~ ×o)mBºã€ß{‡‚ŸÄ¶›õERÐO4PH®B'T—+xgèhØØnA¼€ÜûT²¤çtW’k¹kº#ÚdKüæî€‹ŠÍ©ÐUÙÓ_ûÍçèZuxÍ˃ÅòQ^åÛKYÚiÛ±§yäYþ®}‹,š'+CIøðÿWêY.Oº‹N}¹„‰fõø»Hõâ‡òõØ/X®(-“ú±ÜƒyrÉ ê%ÝT3èl¼~MôºH_¨¼Œ»äÍxiæ3r7¥¿'6„Ý0VíA”àfé%`BqøQPœhTä)Wn¨$ödáE)!IC åºj Ü%„ãW)TB`㙹'r U5ì_ûŸ;ây¾˜Ç$Zï ²hT>k?­±`9…¶¦?ÕtOÀ­®™È`ªÏs@6¿Xl VñŸãòB6.„˜I*µ¦z)”†éþôH\Zʧò îÈžˆe]§ËDéPÑjfñ.CÑäÔ'•ÜN˜àО!Û™?±+Ö$«zu×:I1•’Í6³:aD a;[’g†©ÉÛ^ï“Î1ôeTõþ+q1IÂQ”\¾/lâÔê5qjmMEi,âò‡ÿi&‚Õú6]`©ÜñIêúþ?œ=Ra¡ý:QRæ.@”h›ŠX ~wÙ5ºT"Cã|ˆ& Cô ¯tÖó~.fLù{Èñ$=+yöÉ3êõ:êÆL¢$½" +ExxõDÄ&êÖ–‰•7‚ÖêÝ¿/ÇS ‚õ'³Ä­+1´ºÏú5or¹}ã±w²ýu¶¦0 æÀy€¨‹ÿ^º†ÒåûŠ'ª„}]Ü_*ž Î2»Þ¸š>i!A%]6¾oŠ­‰rƒ[&Gòø")*ÄH ü× Ì½Uw6»bÕi,¶Á´ˆ©ûxݑΨ¾ÐÐQ³Q€ZãE"˜ôv…g\øyÍzšê4Ù¦I® )÷ïÆtGkÂS[êV5¢ÂåRçDž5(ˆ!cfÂŽ…K`>dÌÄ—Ô‹fõãFòTú5º†” §Ï5•ßlàuÔöW˜?E¢Õ\ú_ÒŸòˆ²›Õ&©;†ãzFú¹·$‘ŠòptèL“³ÝOX€º|7w:;}N7 }?4 üUP—Py­Óîù£ßkKþÿh´ùjÜ™tà žšîO—ÖB]se¬áaò9ñ‰û6É}í˜jT°þ‰#Æëf@,¨\ûÈÜ/œþz1KNÉ%éu’³ð4~tVªž›ÛhGž`Þºòd]èh‘«Èþ6 .AÀ[IO7U>Å@Ñ‰Óæ,Í´FÖ[A€šÈIZòy`ëÜŠB$š-X®¿½ 5>¨Ìè"0]U†›SQ T]Xµ…¨òžê-v\nÄÆùtWQ¾ºÔ —`6˜—q*0ŒAh‹ÞÃNæM $<íuŽ ©èS5–Ìc5üiÚã` ˜Ä¥ ëï²€ò¦eÞ¶ƒpsÓ¶ZN´0RòNaMZøªŒ¡ò>›Vu?ªµ©×ÈÔ+hûn …è¢:å°‘3ܲS¹§‹¨r²"ß]x::,mä’¾h‚-ꥲbª`‹µ< g«Е‡{ͯ'«l_‰ |P‡Œ—¦V·ªäÔUDþ„(zÿ5¤Ž”&òuþ^›Qä¡1fq3Ü„îïÛ.„êŸ-ð~©:ó-ÖR+ ycºß?ÂìŽa ½ÌEÝ(H&ð€øuS ]¤ÊæÝ¬Ì$ð„o0†»Bר‹‰T#P²®ìKØ"’6SjÏ÷˜-Ùfï[gz[ú–oh¨Ü]úcKªwTÞ„mÊòV“ ¿*ێφ´Ï:®œL}Ÿ– zÐR ¦gã<ûê(å—ô_t‰k¬¢Õ·j¼ØX¿ˆ™¡4zV‘%“©Æ¦½]ÁÔÎhùo…>BPÚ' è:ÎéžîI°e 0«â<Ã,i4<ƒƒïMõ²,åœØ™J‚D‰…ÿaw„³™ü6¤Ô&kË[ìc‚OŸÁkYl‚9%Îà™£±uµ{a6ß xÿê—3ÍkÓ7"É ÔAðøØº D‡€±0u‹Qa–bf[¹R¿ýHA@Úà”?CóTP!(Ó·Šb>zºO{6«ù¡qQtŒe×xé\ê€dèéÿ½ËÔÔ­ø·ÀSI—ý¼DlŠW¯|Ö™>ÔV載ÈCJ‘Ôϵ-½6kR “å‚“8šl…)ŽÙMb&y“ æó‡ øfµB›DºÆsâè.”J<Fèºï¡ÁòÌ(ø~°‘!Ó|ÞjIȉQÌI˜€ÌœvìµûŠ(, 9z¦×z~|¡Ðü>ñ™!’ã¼I˜´Pï6½Ÿ#ôËÐÚ{Ý$Øs²Èse4•ªvà¥S§”1+ªp¸óèa—8NžpøìL¬œ§ªq5I¤ÜŽÿAJш€–Óö/µÇ}¤ámþ‡0GO|sôm¥)ºŒ¢Êõ¸R¤Œ>Çù"ŒûxÈ$*#2£ÜÅZáfòem)OýO”ëÍú¥éE²gç¶OdÀkQC³í¢jÝ4D¢od^ÅD^â:Ø,LèŸ#;<˜µCe¡JéÉFP£¼ý39íž d9 ¹öõsà`Ǧ$;$õ07seA>Ÿ$¥ï#T·u÷%5”EE‰¢bðI±ú†uœ7ÆÖ‡G9j÷×ߜزÅ‘ô(Ý5µÖTx¸«8˜ð&ÁíôŸýë–à-@gkÏöòX”Cp„çQø R^ŒÈéòÇa7ï5R¼è(#g–ÈU{£{¤Í0g“÷”ŽoïôyN¤=5ÚŽDWPf¼J©ÇyúÍ>ÆÛêæM¬ÍwÐÒ[kú ÑùOïC<Ûkèsð~1}/ZÞñN9©ð’[Î;2–'ù`²Ã£¿Õß'‚‚€“ÍHn}ê:‡Èdèß›®{…’®ˆºOꚥmQÈÙÄy1~Iº°0ù`(ø:×ÎãÜV¹|`ž[k›YûM¨•eLQËŸ â“uêÈnv©Ð™C5Mg³sÕÆ7fáØÖÃìp< Ág§âPÊô/‰9e8ܸ™3=P¤gí­O'­¬L·ñ–C´ÖBV]Ÿ{ à@/Oˆ~éÁ¸Õ»Ö;í{Ü£ ÊX±†´4ë–üUé½IA+ž}Ĉ–‘ùcrˆeøpFù§¯"N/lpåf<Ø–šˆ¤ç5,\±ŽF(a'ž‹´šËè…ÈUÕݽPz·r³°J_æ­ä#£@¶Üã³;>Ë£·fù5/@p™…Qn|Ð)õekÑý鳆{R¨½7NBÅàÇNŽÙò âï^Jç`µ<¶À01nðÞbúgLãù,Ö\tP¥P¹Æ|Î&pêx¥.Ôè!fÀÂeÉ[§'FÆìUÒªØsjBפ‹°¾Æ6Ú˜‹ÿ+&ôìND:Ш:q«X{û¾ãüF>pÄ€›ÏeÛÍ.îqÈðõ0f˜âÙ7!éy}’‹x>zÕ]’ä:¢{ä–#¥èhƽÙÍwB$ä æÈ"[›ytìô¹MÀ›G†-BYm 4ù“©êâI£ýT^˜›£"Êv~‘~Dg÷ð¹dT¦ÑŽäs|<½ð˜s¼f„T‚qÁp‰ÕOðûǶ“¤'iç ”$ù߃å|{ ûßð]‹ïÔÔ¦×Ù³ÖwÚ°ZxwÃBG¸tRJŸn´.XÅýÀµp°˜{«Î&‚%pÉQ‰‘¦õ‘¢!út Ÿ½ùɵYÂÝÇ›Ë]x3¡*“O¢NùÛÝž OcÀP¿nSBScy2È=ÛL½ì ¦¹ú Ý´…ƒ€ ‘vs!ë÷†Ý×Û(0ýNö ×yè)æ™ã¥5TtÀSãî’|;v#{â/°Ì¬ éB7£ŒâSQãÕíCÝÝ.Ò­ ² vþÐ!•ûô±–äÚ³%Ò&Ô[5ÃÜòŒD‰†trL¯èXÏd);çëmpÐhP÷ˆÕJ®O‹Ú;Ë;óÎvÛ ¯Å¤€»ÚÛVRȬ±l76ÍcÕ¦¬ÑdÛÛäÓ£",àÈ¥ª ½fº¼¨ÓÓ·7rµ\@ô²2Ç]M„,á}¡ç£¦þœšúBûg•3]Áå¸×® ŸN]ÎìaAÖº1 °vÔ¡³LÄfâ¸ÛœÝd6´Üh;ÑE›ñQFž,°)kx ÉÄþ¬/‹AªMë üÇXA4ù6 \;n‘aüMh:&‰ëAëº8àlÏ8½Ä›rHtÏßNN'–NÄÒ¿&PãÐöúå”Ù-éZ²vò°‘‡&ùÃõðŠƒôJ×ýNÙ¤0'êES¢¬Þ Åy`„Ëcøz€0 ½–Îj|ŠQr5"†¸¼:m4 Ùà]ˆ~3^Äm-×?D T‡@wGh½ž5ðï6€„/š˜GCã{@¡`ÿb¬ £°»àÄF²»ïfSâ,ª6óöÞ•ÍFFšl+ Þ†ìþE ¼«¨LìÁl-Ãòúª ѧM,A¤§s®„×ÁZ·µ61^öZ8µÁ‘…~†:ñâ[ ëT޼(Þ2ƒáÃW\èê^ÆçZª(•ÌöI'æúµ£çXyAjyy7¶asœ ƒRÓHûé˜ru æKFÎ}ÃC5¡N:óÏŒŸTG'~£@…È"z*ÓÄÎ'-CvL¯}'ÔÅóãŒÏ?—Øà†£b“¸2¢ng ìA|Zï>ÊmZ¯;•+zï5!w¹u‡…Šs+ÉdÁJëí_½¡Q•Æ8åÉ8Ùj”äè”ä“5kØ0T#Ü Åê‡&'iÂÖ'ÍÏÓ»³²üyÝ%fc,ØWä œîE1wˆèø"ªì ë*K|ä 1HͼͨҤ;ò•{©$pÀðe˜MíLMhŠ:G’ã¢3]Â0óigÜÉb8È #ÌUŒÚ7×Ûp B\$y?îôsñ1)êBøÆôŒC-mv¾>_+ *i´Óê)«þýÃÞ㯦á«LPÌÏÖ£ DaûÃeNEÒU8”BíêîRâîsO{?,&ÿGÓ},üq1þY/žÌžái“T¨Ã-¬…4ãRxN¿ÿ3²ö¢×·Q—[ÏÒCÊIúõØ*çØì½zFfK.1Ôâ`?®Âšäw¯ºûÿr,w‚¤ßÈí6´å|D#䨺¡zÖC¦ç#%ÒáK÷ºøAcÇœ«~,þ_7§,¸]ÄÉkFÎU# 2àló{~í’ÿ>³¡µòeÖ±É28k°¿GÈMør~ø"4£ÓÏ„'A‹èp54uÕ¦ª@aåÛ#¬””R‚³âY“Ód óWøõm†üJ¨ëEG~Ïô%7bê¹3+çD÷¦x y±˜"Y6+!±òD(Ú#‘ÙëÀUüH^âp&S;HL+Jþ—é!9ø _TR'¨Þ¼ƒOP.­›ïw D‡$YoŸ"ôïŒ0­ÎPzo`ƒBØR¥Ñ=úõç@]ï9gg&©Æ¿ÚC {vNŒö !OQüåÊ0c8Çbä¿—84§Û,tÞ´­($Käzš„Œ)-(uõ,½ªec¯œí_c´ÜÁßguÿRÒæ; ù™loaóH3åösɵÈ4ïÜFç2‘}µWÏÄ•ÌÝtÏ #_ª³‡ÈŒcù#™‘»Ð.¹-ZŠ€¤‚Ն칾oï2u£óS¼µ оNúØuCòIòzª+®ÌËÊMtqγšÍ¼ïS Šj»¡/QF@ÿZ?&ú4:|¤Èï7¿æ¼@¯ZðOv,ý'5šýkñ ¿÷OªLç—b%›@àŠSxŸá÷´¬»ÆÿBfZÂ^ûa€u—„+ËVG gØdqŠñ3F2c »á™—œð—•¸šQ=@û®gILÞÇcZÑï4x€Ÿ¹žÚðIwPõî}RPïûƒ·Ê­’Ç$G«Ï ïŽÏT`”?w :Ô~é[-Qé- .ßAQ'«÷´ý3>˜×æÓüô(ƒƒão’)ZY#,ú4qpŒÅÒç«e€¼jeÐUHÈäÅ×°²ì£ÅÄ@­ÐÜH='ŠX/µÏlž}ÁU5Ùît¶؃‚ÉF4M`¹òu.Ïs^:ùàL1 æÓ]ýK¨5*7oÓý­Õ.é3©¥._ã0;eEkùëZ9ù_ZdZx»Ñ§J»é9·A®Z](C|Ç‚ð¾ ÙÛ­™PÏ5€ ÌËÅ…ZÊÒ˜œ,´ÅÉ·pòÄMê €[Õì_m‚T ,kQ@Ä Hú¼³è®°•/ÿ7m%Åõ˜ÛÆÒÿa2ËyèSk[j¤è_1±˜€UC¹´’G{î:(3/!¹rŽÑN4*@ÈKVÏa¡ ·"½"_¯"éa4UÕ Ž­½\¹þ½ˆŒÈ ÒuÓ‹wÔƒœçVU‰KfáÂË{>Jõ娙®[¿‚«{¹ðnGÞ%gh«ùðê×z¿]oÚU LêäåoʢɈy½á¥B6Á¸ ɤŽ=Y\ÂâZgú’•½b7[ :Z$>*¥½¹Üã2çd|?è07Ø=²ŠÊ .Oy.vdȺXò)ß`ÿVeϰ°ã7äÞ·tcf|ãeúN;ªoA6äUé· %¼-<œ•ÈG ã½¾<åÙ¹L–ZféÌ”òinM” ,f <37,7sÜ™÷n1{¦V̓‰‘¸¡'€fPˆœ&6§ÉÑn3Ê™;ö‘ÿoØ*“,W¨„Ëôw¢îái„‹ß[œ5ŽË“|„Çù;„jÊBÈ,Y.å»(i©Ÿnµ©SUòãPj¼» |ï2A w0çírHõ "FP ¡*É÷ÒGe£l4î°ÎuŽ´™I×:|¤©SeTñªáܰŸ:æw•B!¹q&)7r"× S«“ç±–î(*`ëÚ–ˆŸkÚÉÄ5Qð\t¥U*všÄ{,m.@àL²ý¶¾I[ t'ÄÜ}ÑtßÛE§†\š\me64IL¬¯§b³uv&=y<½Z!{*e2;öøcSì Y×·UxpÍ.Çä+Þ"s›jœ¦È¿2]¬o›­ÄiÇ ×K³쫃Þj¹êjì9·Àl÷™˜ÆÞgð¡ÇiöX@ *:°¡±kí™”ÛÿèʃYf­ðóV¯4t¦­‘æ¹f&£ûf4`fpË9)pÜ By;£ê°‹Çyü„ãI¶.•ÊŸ•ñiål±ðuû¹C›M µ'jFÀÊÎñzÄHm#¸Â¼ìܺ®8<`>‰÷±P FP7sr­_Œ°W”‚!×wQúk%ëù©à^øÓµ„!lŸaÁÜ£èEÚz^‰ÓasÚrþ£×ŸSr‹õ̘6Î |C™<(*Ê×%‹3gÛ…²/iXîeB÷yÅv.{×ìúÛQ†%i%"×vYnGä«iî¾a]ÙõCU]ÒR#æÔ[ò†ªšÅvøú=c@e1|‹‡§\°Xoø>À/xRÏtϰ‡ÎÉ7¯XFD\’+m1掀q°ß$z¢ ý»I¶îsFä@`qŸŠþºÛ DŠÊ< ‹úÐÖv¦½É·þyù¯ ÜU+™H¹6«Þˆ æM”LYHðÇv†Î¡oë™A£´µgrÜJѸr1ŒuëÙÂxåÌ8—@`½tXöÒ+ a¸8ö°~Òù5í$ ,¾owÊÆù8àÅ#F(·\„¦ò G;lâá-ôgÀ0”ÉÝêQÔŽ—©Ò(èJ™)‚—¦•àȨ«Ynp%K°èd4Ìbqƒ")~Y9¿ÇÑqóIDÓKÛËþ´ô•Ó _¥ª& ß$çÁ¯[‡Ðu 4®¿Ží†esqp¶ä*4€ÓèÒ7»ƒŠ‰·vêb@¬)8×aÙ@25¾½.¢®Çx tëûÈËm* ‰Ò6l¶döƒ„±ù+”]®KëÁýNµ8ÕÍÑëe‘š•¯f2˜J=ø§/ÉžÃGôªï›AÛ¬š÷éœkï´mn;pšÏª¾öš‹^¥Mà(y›÷¯èï• ëáýdÓª÷CKl‰‚Òã¯íÿ”êH,`« ›Q¤ «$…MgUˆc]­ùUŽÜy¢ MÛg°ëÐ^%5™p`Ü[%:Q „ §ŽÝˆÙˆû:ÿvô ‡YxÜ6 ²*‰@Z½ÏžÌËéòÿ·MiN}ò%)í#®ÐóXÝ÷:kS÷¼{^]n f& ¤ýaÓùúÊΗz6­z¸ÛðCªgª2!®}-²ÙíÔ°Œ÷cDŸ´ Ø«¶Ýs¼bÝÉ<¥¦„Èη¬c´òç3ÂCä•ØÐ‡rm0”QÞÒiƒ¬)@4º ]ZR‰ 9ñ9îÔ“ð•'ÛŒìñf—×õDeç¸+6„^\üÞçF&¥|%5ïàvºîy§ËK>õ`\°ÙÁ¤õÑùÈ¡q)ãø"ÕüUx,÷¢Æ„“R÷\q΄g $ÒC_â7¨xK§<ÏgWtÅ’¢a‘Ø ¬ÌÚH¡éßvâ Å}Öæñ ȃééÜúõéôvʌą¨"£Úí†ÄwvŒœÇ”@åEmù…ˆ«*¹ 5'Aq#~;DžÏÎtJ‘äÃiÿÑhÒm8^àRê,–>Ì·ñ%‘²3׺Îx6ÏϪ­ÜÖ; •UX  3aNTáˆízë§ ;58¾À¯ñ¥‰Š§~E {Í»¯ËÔ–À5ÌÙzöë%ÍJøžÌjep$:ÞÅ/šÊ›Qëad‡ŸèÌîÃaΠCc€Ï×s¬©úOnÇ)hgt3ŒnOžú¤ p9%[Š y,ek"oØÀ{ˆvÃ(–’•KÁŠñ\rœýrQŒÔ|ÈEç hK5'«„*ñùNÜ'²xó!(+u—¸2ÔØÔ" ÂjNžªŒ45Z{B9£v Ö0Õu»g_š™óÕë<­ØþjœPŽs5ÂÏ9­8¶Þópã…öäòHìsí¾Jµ·i ÂÝÂQG·ý\Õõå'dUŸöÿ:!N{ÚH¸–8/͉¥Éµ±ýqQ€Î%&0Wš•´å6®LP:þUMЫ:?¬Ñ‹ sYˆ™Ò˜(#”g×ßø2jù±võ.f¯]>âÌŸ‰¿¸L]}h¥„eQ¬Ð¡Õ&ÿN÷Rû0~ƒf²_§"’b v¯NíÛÞ…ÙiwwE±P ¯(KŽeýæ3µ¨d;êL ¯ó¥rÐQé­,>Ê»ñ (ž É›3ázlÿ’2L\t²}t`{D²‰¬¶¿ ø¦ˆ9‘oÐõQ¶¬Àg^“@$Ô`P­à)AE “`úèPÌW¹ÐÛãTúô^®‹¦œÅÝBäå!ï¿ÉU52%®!GBw ¯~Ô¡¬]±1öJ¾d–qÕ2ÌÜâ²ÊÌCÈ):ãJòÕKênW9`m´p„e І비8¿Æ=”ã„ÍÂsrCp¢6ËÚVCc~…KÌ7:|¾¾ÁMmŽæïêÙÖX€$€7-ÆÆ³Ð¶dÕsŸÍ.ë{m…UPñpñø‰¸”öÖû¤2…€ x£+ñïMÝVÞÜp…ž:¶P´†ú]xÙqÏ@8T"Õ^\(KE¹ÃÚ³ÑÈÈ‘GdcN4JX2Æè«þKÄÝv™yõƒ4â3:¢žºå¬ë°4…Í!g½Ê«â [À™À&ÈRK3Ö»˜,;ëM{}Ô#i¹€«’5=ªÝòã¡UWõ†àM×ô§/måvÎ¥>—)×ö ò†mË/Vù/N‡Òj:ºÀ”v_„$’Ê„ª|Hg43+A· èDjä9\ãÉMÄÔêsT¤¹Wñ Á«­†üúƒÉ«f¡‰Y—I =T+W P½Õë.Ób7®¸\;Æõ×k²;í¶Ô¹¢öH­ÿ{ɇщEðß’mË·é%Ð%SÏ79¡vÛæ$É(óé_“ÿ{¡ÜÇŸ†'˜OH¿Å¨S¬üá^ç†dTOEöñ,tHºH5†;&2¨ŽSx#Gx2ÜÜV´I+.=$âÉËZuõê–HÜaº&ßzr{FxÖ!K¼»ÃÃo‹ÑƒÚ-£Ê #ŽWôÛÿz§+&X­]†Šê«¨¦R²Jp¾Ô}Q¶+™ éÑ Hæû?øõý[ Qvo¦g(8ùzt3P¿1r1‰׷-0;±Âî{ЙU9ˆ_ÓŸt«:.â¿—â×h³q2~ÓÜ“«ðERÝàþQ6 ªTNM,®rî÷3”WöŽ)>ùv „ˆª7æ+ ³êû8ˆ€Ëûx@~ÉE`’ò¤wvøv³D»Í+düÒC‹îܨìE‹þþ“K00¡|B«Cîƒ×aÞ¹þHWÔX½LO½övŽ£ø$®)Ô…&îx*9˜­ÅgYö4píRÃt½×`,yø9üãÀíÅ=ÁÈýæ]Qët]œt"8•\™+RÞµCIA×TÚ¾–¡ËÂkØÑ[ü"?Ê_¤"@s"À_ÊîGÚ Í.xqXy.ˆ%ë-¶9!}\ëp±uw؃bfìâ þ7±-xúëT}2Ýö85ߟ¬ƒhRÁ‰' ý^’ƒWo V{”§¶VHYN‡_ 0ô³ë×¥†Y0©5Ç3½†ÙÚ§+Ù9„`¼à±zþ÷‰NeîÇñ\ëá;2|0Ãzx|Ý7486î4éÓ“Epb‚9(fyx¢¢= ½JL|55÷€³¤^[•|f`üc×K 7Æ|†X²ÿí#¨¡†×°Mª¼M=p|¦,Z‚餱ó™ñÛõ¨6ÝFèKÖ˜Œ’ T"Y*)Wƒ|ðÖ<ñ–}ᑱÔÕùéƒV£7`Sñhíuæþ“µ ‹€•û²bã\¤q*9CºV*iC'T#ûD| ½=÷+Žü‡èÆIÂ`±h£^ÈðN£5…¥òúö%·ÿZD|“G@Coådˆg¯øœÃãB°ïB.‰?xÕû€Ü‘߈`ÅÙJ7Ä ,Â’Øýëf¨i¼æ.¡ÞCmm„­XE päÜ ÝßþöEÐÓA¶B× ±bºhÅTÚEü•ÊRjæõ3RØá^ç´)ãùþYG €R»¾›v‘V_[íAb|²jð“§ãÝã¨Êþ¾¼ý}òÙƒ­E¶Ž‚ìèI="~) €µ%ó=ìTmxÚ6¸‡ö5ŠØÏ2À¤Ü.%Â:¯3l˜ÃkZe’]ÞÄ_àê (ååíAg"ßr¤ÞŽÊª+Ñ{}Å \%ùè*$_÷â]9!w·öÒðds]â°îdy(È¥êùçò›Ô`ÆY8d†‡$>Êladr˜álº5Òg¹ó¢C¨uéùÖÂ{øO9}Lv€ ¼çíáBh×YC”f>úÒ$‡>¹/œWRôæˆ=ÆZ?Dz :~ª2­>ÆðwЇ)þS?¹WΣ B¿‘ÁÄNÞäŸùpæŸ Ã´…(›²¸ ®Þö¢Gõàm–x:è`¢ÐRÇYPú{n©a0 Dwît>KT=_T8JŠ,ø 2—Ã,`§¢yV|gôBt–P¼‡±8sÙ˜Sp&ùœpv>p˜C,Óy ™’Fj%'&ÿ-äZp_!ÇÅ!ÍfzRáöLXV©a9x­GRù5Íj3ͤU,†ýê.µcª8…ýÊf¿ª°m¿]ó:Àæ˜Î*R¢‹ o a:fõýórò)M·9Ìb ‘¯§BÃÓ 4Z–g2Á!;›ºüy·œ5YÎ~Pùá9~ïH®± ¼VU¨å>¡{%ð)'z¬#â%p]D|K(X¼ÿ ]³ÐˆÍå ø¬5–äVz2iH§µKÊ“ä=MËy«±T¦Ò¹¨˜n µsï a6 Ì ¤ó7ôc¶©ì~ÓR¡í=´‹?—l3}:ës@7<À¹ö꙽¶ÊåJ"2v/,,ûŽãßmDç ÜÀ¡"q”Ä¢bUx:î5hÐ=SÊ ûû{äÙ‡÷’ËR€t^d\hLGºŸÀÝäÌÔý"“ÊæèA-#3I²åëoÒ|4?ÿã|1²Ýœû-Wý»¤ó¤ÎL×K€‰k÷îNEN‰©Í¦Y¨Õ5AmÜ•Ë3ÒÖøÂßÑ…:=`çê, j[€æ´JÞcC‰!aA…ñU¬Çõ‹Ù0ÍM^ážÞ0äšJšªãpøëdy8|õ¯*#Ð>žþæ¼ä˜ßõŒÔÍ"ÂNœøn‘8I®‚FDC¥îðÌ-5àPl×Juƒ?,ž²»ZÁ øý‘ˆLAèPL ¾H/6pb’µÄO-QW÷™¸o^^ç‰#åÆC~ôQ f9_ÝpÒ}¼Ë½e¡eÜ ­ÃG9u»Rˆ h'úÒYMÞ´2¶M÷ð¿Î–šŠé‹³Îúá»…Å{`z":YM“2á^?oÔe¨ãó´/ù§£O"ðôÞI°ů¥äu¹NþqÕ¾áâ¶»u,½=d–á ¬oˆ‰Õ ~pBÚUz ¹Âõ:8²·Ñãëß”®gí9öfOS´ÿN†øÂÄ+—£ô&ÉÒ¹3Æ~ÑQ×Â=¿®yRîŸÈ H.òug8$\1I¦gWÁFž˜Úß­RÔHÇn1_ŒIËæÐfõM.‰Ùa‰ÖJ'×o™N1§±8”ß ô?”Ó«F×çvõÔ[;^ƒÁ“ÊÖ¶Âl¾…,_C¤¹^Nteyy£fh¤ÚŒ(ÿ!“+9¡<è‹iÖ‚¼XhwŒÔIIÂêïÕù€ÖõÕZ)d9/Î6È¢a³ª'³]™“ÓjÝœõØ(?;F-Â}‘ÔI‘3B±Úp§Ë;®Gý»î±œËßkIé9ù?vÚÁ&rObZ2â%=ÞúHܤןZîãÓé@Š’õÈW°5Sˆðö⣖³B~¡±ˆyø’3ÿÀ{».0²©¹ë'qy5Ž×þÑtŒ1«iÍÕ‰I:Å]@SëãèVøÍ¤#±K “p«f¾–@5¼y¤VàRÖJ4'*˜²ˆ['ÉZóÆe¿åx~í8G‘®dÕÇ­FÑל‘ޤã@Ðsû ¦v!¦ì˵½Îñ›«ë„ñYìÚø§&eŽwYèÅõvp蓼àsE"g,œ|k¡ä‚“1ÆÎ!1_¸i8~²aÆX‰ úCÀ}+cÚ‹ßÃmÜzPÃ)ÿ5çÓÄéܪòÈÂ2Ð-¯xF·>g†3™•‘¼3QãH#mz9ËêD–x!(ùz!—rfz†§Jƒ,&40ÖÏ1r©l›`Òhj4Ëò­î2Ú¯wx84 )€ø0I(Ø%â°Dë|¯û:’3U˜î:’ilR+™ò¯ˆA:î …E¶©Ñ(Û“IŠsq½BO}d¶Y¾Þqjt°÷1 Q”‡%™:-’§èøRüUH•1•W÷¯ÉdV†v¼Ã™”áC܃ӥCxµ[lÖ¬^™¹NÑ¢zÅrQ ¡žŸ%þÊ|?sÇ@ '» ”t™{×´#xé\¥ÛZ»f»¨Ç•á8#RI>vC„}‘¸3Îà¼Ñqç’ ÌØcNˆUn ð©œ7*1:&RPÇ!Z<ŽK…中¥¶?0Þ °P){WÇÃ@ʵ˜ß Æ™ÌwŠ¡‰E ëQ ‚¯Ù[šRÞeúÖD):bT‚(ãsïÀ1¶´AÂ:X:‰ ç¡yV n›TÍŠ•ë™ìÑTÒ½ë]" o¦†‚¢¥ÿz)‹Ä„À7l¢æÛaþ/—æúéÌ A‘Ÿlúõ«^œ?î)±O(ÓAé-ÆÜ£ °P{¢Àd´Beh¦_©TF4Y hZ¤À  0™ez®Õ·ù_‰Ölx}L•ô]y0T¨+ÃKÇ:’Úü…6ïß+“^ OäºFH_ ñ@2þDõÚZßÜüÀyÐßš•¿…FNP㘶°Ã ÓêÉ>Ë›¨°"WõÒaV]£ÂRƒxo>¿™DÝ>SÑ"z¯èwÅ8ѱµ¼=ÌÑEûS06|Tô`Pû Qx Ú:'Š»}›~)½þ“,š2ÆôNk}çj©âÇÙ?†ÃÁ2bîìÓÌŽò3DîTMÑÝûÂ!±ƒU“‘Ãß©¹¨ %vµy|øI÷i Þý´ ÆX‹]ÙP}mÔ!‚öÈí—Âå‘4+}~Ô‹Ôw 37)[¦ ñˆpã(ôâò±!ìê;Ì輂ëª!ɶ8½ |l óI¼Y‡Ù¨ØD}vpd « Ö1ÍÙ&8÷„ßɳWƒaÑ|»o¶H§'°D›¦ñºcý¯” &êµÕdµõÚŒ£çZ7ó ?µÑµîº6οß9¼XZ°Áê~ñÃ/> mîX¥î÷N%´-mo5ŸØO9“}ÁPê®O‚F]A6Tñ>½mí˜&g·sâJ[AÈ’‡Ç¡”à+ÄÖeHé¿„ƒ–~4d-pÃë³‹ï° cÁÊÏ_ß|Û^‹ÓÓ ¹frëŒÜÁí³3wÜã\Xñ/6,tÆ·¢·>I04z¹ï+6ia\!ó!Îu™è¥“½ƒ ‰}%‚Z{–…õBZò5 ¨;ÚŸo¡¾ådv¼;uÆ"ݧÁ¸­Ä6_‹ Sºì÷Œ{Ë}ÖBVèÀhE±õâèšÓ6Ýà¾bdjxº–u(®ºìÔŠÍ)-¿Ï‡ÇÒŽ›p~î ÊðÆ«‚UqÏ­h.ËìŠ 9%¢ª«.²Y%¼SåzpwÀãAhCëåRBÜÆ¬È©}'#$Âô‚q%4[¥î „XÀ›š"sŒ´ÖKÁ÷>„¯é²š{¸=êÜ_KÆ7˜f]É„ù*yÊ«7Ó´,~¥“NÁãÞ§$ÈË,ÛXÌV‡Sqf}n¨c?e“u›lb ÚRš)çYdsÍÍÀVá/`0Eƒ™k,öf;ÑÆ—#1E¨ÁYs“’}ﳌ'Òd´@gyÙ‰~JÁ§³º­Ä3Ip¶¹8Öí%O’þa§û³Ô-«È2»öö K1/<²ëÆç8å=/—½•O Êþ„¬IïõEr1·pWinÓ/¬{¬=§ à„OC—{„!ĈóMN”JÉù%à'ö \bwcÐ#äö+Ðw×aýÊ­À‚zEr„ú\à…5=v„pm8ß°rq¬ùÞý쨎a[Æý0×rŸi¹Þ‰o>‘ŠûÕæ J¡›óÄ¿Ziñ·¿ü£Sòƒ’Îé" •rêhN1"'zɵÐÉÛ2Wжb¿Y)Ji´²gêÓŸi`|4 :«m[ Hè´ÍO~àó}S­V@€ ¹OlßàÛå€^®R…y€Â¼ëìÆ“âS¾‚`çÍtÐè{¢H™‚˜¦A†¼ é˜Ú™ü‰L‘8g¨ê×ç9¤§óò-áX²Z1ìN ûn¸…–RîònÌãÕ!ËZ¡‰qd!FÀåuÓúF¾\–ú|vÌÿ4_!IuWe¡y„‰1þ/3ˆjã…Ý%·¸ó¸ýØ6ÄÛ3ˆ0rïò‚“6/öñþl™«N9jÇ<ªÏ=.§zIùË€g1z>H‡#>|¬J FPöò>Ÿ|Ö tßú|‹à£óE5 ƒós«©OB­©sâyWIÇ€Ù¹Äl;ƒ™S Y~§{&À:µ s©õ1dKŒDWŒcDn+‹.5Z9¸˜`‹~Ç©––òFu$åå$OæÐ#i‡àm?q ÿ6x™úWx°ÏÐöív}¢þDô©!ùüÞ. v%È8‹‹ˆÌ½G ’Ç\8¨{­«|ÂDR×ý¼Î8¿( "T³rƒe<ú Žç¤°{,/Î úAM ×"S¿¾·NÍNïíE¦üŠÏ7 M¸bžG…vrÛ¥¯¬âA¬<è×ÉÄå‡Ý‘ú¯Ï^gÌgþ5„Õ¼„XáÏUó°¬Wàvß BÕ4Nº´8«½žUc:FÝSQÍP{׿Vó΃ê_r½å?h‚ÌÂB!'¶Fow†õã}„Ñ ÖVÒŸt [rt`u±sz뺜¢Ì¯7%0¡ÝÃÓËå†éÞ3Îìf”-}f<ûl…\X¸³Ã ù3ɶn.&!€ yƒ…÷Š3¬ŽžjFNNsÃ_;!ÐÎ_íÏ#i;õ&om—ØõÊ;qU’Øâ's…e¿÷2yö:ÐDãQW"‘Ï*åübQ–IüQòÔÖ¸Rƒkš‘"×Çè §‘±‰$ˆyíõ :k1ÌNšr)öMeá®gÁBðî\è%WòÐÞNñ1XPI$?M“¡ [¦]«‰ðšÍ^Ý)ŒÔ³’>‚¤9nØl~~Hóm(çÖXƒ†ò¯¬ã¨àÝÁZñ›g=œDw…´M[!ê'ÊèLÆ4M>Í’Ÿh1 ©ãvïî~/zŸ0Î}ãû?+äëS àÓ"ŠÁóIÅ™%×Éa¦?hÞM¥ûªÒD&ÐÖç[Óªm>á€áœÈ-%ñŠN#œb ñg)Ìe‡èxnYª&)Êœ0·0Q’“f"Y…(Š»Ðh)þùr¸â¬ào¢éJ1æcK×>ãóðH´­`Õ %n0YyêOL¨èâGî€èTGÉw¨èŽ0F™á<ö£ÞTi\ZI]Iž_o¬ƒ²ÚÂÜ}bó×Îpç`Wã@ { mN4,º Êñ‰&@â“Í,'0œÂè`ó±l›:T\Ö܉‡ 5.RxgG¯ Œõ;Bï#×p[üÖ'ÍÂ/ïÎRyNçý™U†>|È–@Ó24á-·g,¿ï²«âï*ú¨4,ml:m\Z“.\¸wÏáÓÔ£)%¦9¥åÉ—?ùiÏ »Ö´Ño¨°r{õeYŠ¢f‡€W“Nšœkà”!‹ñÈч¾úŸ¡nÏr(‹Ù)ñ¤}ËÓ{Z=ù›†ßç~šf©‡ßs…Ï (¢½`iñ½9ebVº‡Uã´qí…m$E‡A€Fw³áº·øEFÙ/nûrk6x4ÊÞè%ËŒéÔãw)”]-ô`øòEæ­©­Þì•ô!yÖ˜ÿVip¯™×äÜaKpG+™ ÓH°Yy „!âÀÃ.txhV#–6fËAAÙK1Ùú@á‹$^íq°JÙø eè_㢠ÿàg¤+öKó­¥ä¯Ùuc€WȘ”ÊpE•ŠRó(cSé×Si•$×’?“+äÀœÆ_§C‚‚F“ ÅæøàA\¤à×Ï&­Žô¶ÊKX-Ô»Ú¯èâ+ ßö6€A8Ø6Ûr u–‹¼·4=Ç–(ä\Õ®'enE`³Þù®~Åàz‘À}Õow ýQjÄÍ>AïEHrÏ(u Ùïå­â‡µ}˜€Ké¸ýß“‰Lþg‚~à—!’ÓaBFÁÛsù7“ë™Sš‰âoÌÀ¾ž'—㨉ԯô… ±ê6èç¦ñ¬Š[„€>è´©W¯'jˆûWÄ…Å[éBÚa?dÌŒCÐBóô•do2' ÉZglÙË<”¦ËEˆ?.F‚ôµ’WþÙàÐ%)¥cŸ%eç›m“Û^rPÃ.\ÙÀ&’áU˜›·1 ûÙVÄV K¼ð¹³Q¬úÊrÖ0í ué…››}M¯ç澿Ԃþ5c.)íÞ7„‚2÷ßðí:i0h5á=ÈA/Þtªr4»ã[¾ó£¦;jõëÃΑøV§î`4O›Ðêf°Žk$–_zXí¾ášÊÈúÞnÈ“+_…å„ê‚¡Hå S¼ºå#Ù x‘tlç7°Ûba3ªvÚù£–I)_Õ‘µ›¶ë° ÿ.®4k¼×ç½99r¶âuðЊÙ(馛G]º@*š¤Æ0ªÈ1Šùù©»J*+˜¨È|NÒ¦P?”ÿz°3‘J€ÂR+–mN j­¼fïñ\ª\ƒ0 ºcÓ»‡þ;ü‚„(#¶Œkx1›†­ïÕýžùœµÁb ü¿ÎxØ=À°ëUkbÓ „_lŽÍeºât¯…ûxZ÷Üd+^Zè¼0¼>ßÞáW<'}o0QÈ‘‹Žî™¾ks/—¯=k‹]ލqÝEâÃh>P?=±˜«&OûR!9Ãl~%e jëC˜¿†DrÙ"܈Š,io§EAB¨évØPêá¾ùUÁ€³¿;™˜Xýgòh̨æ[ˆóQ•oÇûJ ÄïÙ nØfD¸›õHÿzñŒpÛÔž! ¢ hDì6V»Q—’m0Ca¡³Zúlú“ûº`Hº­ ™F‰–Ç!kIT±6q¢»s¥]þÒ¨ï kÀ+!(gÔ}…ðÉŸmýdÃŒ/~ì oò5–q`¿&M vH~!試yí©Q‹–º¾{ûT†¨—IÌ—%ÿnT{FJ2…ø Ðt’•ÖRÁuòG½C­ñ°°eáúb°å³®ìU Pgªƒ}çÛ¯œ5aÒx¹¯‹Ë´ñT¾<ó*àsˆÎfX; "¼5OGÚ™˜•®9ÿY¦ÍNªJŠƒ[0aôÍ'ôseÐvœPP9a‚¿‰Ì[|YþF¸û¾(zœÃö¬?Ò0?ívÜ+Ùܽ­‰#¼ÉYÁ®x`ï¬'–ÃóU/Fz¡ƒ…U4!»?,ÃÅ:êØß±ä?j†öÅ0vÍJLNM‚sÓaàrðøc,Kµ‡ûjU´uSR>‚ †Sí±½ÓÔ ÚÛyð…,¶¸bŠ»ÏÄÈgé‰S¿ºÑFÛ.D7=C#åþ`i©`BK¥C²‡¿1Óá¦<a§îû¡V@'¦f"«%T »pûv6< °3+2Ú¿à²óþnµK^2ÓJOq÷À_CßGòéÁ,Ú5É&à°/7rÅ ž=wàz6AÆä?·&Ðdf¸Gz,IltZG·«Hdžã¿â*˜ZMg=M9ªË wŠ7¦M“ŠÁSb¬QúÈ¡]gŒnwÓ!Û·2âÿ`¨ãeøÛ¸ÔÓ`¶Øp.‰#”“p`y@™ Þ)8ÆÜ&–o^/Bé€É÷'sâ$ö˾OŸ’q@Ë™²öD‘$Þ…óð‡Ó¬tPÌã!ïÔÃ87Ø]¶y˽¾c5j^”gPÜļuï> ÏÑ£?ÕŽkóVDtšæ0©ÐVgxM]ì;mØ ÔxoQóYíÕ±Ètµ_ÒoŽjÅÞ ¢Ku4»Pð56€õ¥ù´´âå@çˆZC…lv™jòÜb?ø³Ç'º[éRD¢u½¿Ò§ÿ‚cõ6ÂâÅ}"•ŸùRy´5ŽeàëVŸ…¸Ò×™:dr!`>`JM› º\ž“Ô,µ8Â5žuq¼I5[›ø8vÝ:‡$ÕãNþ'ôë¿%Š I×ÿ rAØð¥—G5;º¦ñªWøÚ\l“ š'Õâ´›5 CPMÌšPKL¶–­rÉVÈ „´£ÏLeçëÄL—¥6[¬w†[`pb'¶´ðô—  w•e*úšãú¢‹{Òª Í&¢Ñ{òO'z›]…Í¿qMòÝ­û‚@ŒA{[AÙI<ÛRß3~ðµ´è©XEƒõ4*Ÿ™Ëç0ÈàíÇÁ÷z}ÑÔΗ¨IþyÀdQÿgtbGh˜ƒvþº¢È¸â'šÞ¯®Í²ëÆoØS·¼¶ÍÊyʪþ =üGà­>•dA¾FýGü¤Í)b¼ÉKq#¬ÊðG¼#v‚·^ø1U54VúÀÅõ<Ì>ù{ñر 5+ÈË¥×®bM}_¿>pûîá½ÝÅÚoħûÖþÕÀ­Ã>‡3.}™C»ìb½÷$Yq®cWâ-ÔL\’P?ÐÚÏZjÐ.Â=uÎsÞ¡Õ,ãÓÖTu¬w¼ÙNðxÚ¿ xÑeÂ=xî×q; DðÀúþ]1è'KE·°6™o£‘ÐCV±NKÖß ÐüñáÙ~Ó<ë Ò¯ˆÜ³ìÆBCÇmDã6ž¾Mh8_1(3wò î°üèB½×ý¼-‚T|I>ï Dx3þ‘¿>&ê —0ãc‚tÔ2òã²)‡i(8PÙ¶§cѨö6ÑÂï^{ÔfºÑ•y/`£Ι5)]ÄàV—õbGÆ@ŠàlDÜÏ«*ÇýÞ½ZÑã ³T‹?sGØŽZ„~NЫ'sÓã^ ¦MM?ä¼H ì3ßÅé›W¡ö“²\]ذKmÄÖ–mOåfÕÐ逨BTßÿLÀ2úÛ¿•ìÕêþSUUø±²¨Õ·· ü² aGãfu¨„ªâ¼3^aZøLº:HOG¼ÆÉ [ƒŒó/gjPÜg“$h ñ^|kgÇÄK¤ßtë¤×‰¸f/^õärÌ´ž~7`¤ ìˆÎ Ûüø¶ðB;Ž .ËJ#qn~‹C³öIPƒ×—¨h9 åãÿ)b_Ø4w_ýõÜò*ŠÙÐo·x‰8±„9àPì°ÈŸ°HqìšQký£65ÁQÒAíÝþ¯¯bF~3h_ ǰ| !ÄñMÖš~_ñ_}à¢/´  ~bмßÞoûRå1 §tò@r }¢­À³(”FÁ‰ùPt{äŸÐ"c•æëS^P~³ŸíGÐ ¯ ”3t5Ë ûŸóÒÝáÿ;#«¯-ÒjÜñÅùx>¯Cwcz` ²úëê9¡QÊ1‡/¾ûíOžG{·ÜWWTÐN\I<–U 6jxèˆÁ½wCÎBŽkÐáTt‡ÛPªÔ”|Ý /Bî;®Ò¤Z[Ð ŸË\©/™¼£·CÙS€•BPØÐ{dEãÁ‚:“À·h._<)¿ûÕ„¥R/'Ùsâ41p¢¦/ÈH#æÓ‚Õ xX´²ËQ UmqQŸÎƉˆvt¹xJƒÃN „i¸N ÏØÃºƒ„ ,¼¶æ„»8pŒäO·$ç"mŠSÈJ( èñÛ—í,¶Þ qÊ•ç.1¸Ô`»'adÕÅÜkü4KæZ?éߦL+hˆ[v(š~c|?¡Ù4ñ÷ÈÞP?ç½#˜ÞÐ1AJ“ðrÃ9Ó-³~%]ç™ro\tûëQ×X^¿Ù€P›¬O~¯ÔÚy¹#†“R(±2}b­¡7<¦,™\‚§Ðì¿ ÿeaê8KœÆ§qæmvM'ôÆrÕ¶(¥ßFNæÍ-=cnu/ìîŒ#9Þ@@f ·tqC»$E4½œQKY§•AŽVÚ-¡F‡5–kÂ#0Ü ‹høÃáŸÓüÁõœ&g܃I€Ú _ÁÇôߨs‹ŒÍæ/BÖcvî|£Øþký‡xžcÂ|0£Ñ€þG2oÍ8²éœ-ÄKÜ#ê·Äžx¡0KÛ÷L2ÁM!ÇŠX†Ð%˜Dêõ0Kp&Ûç ”»Ü·¨¦âb£åXF ·ÑS ô,Œ¥/t¹T riº·îê{>¥÷ç/\bKXï8¥Òµ"ðÚ‘Ó¨% k•¬â‡N‹-È!óÉ!å™÷°ÚÁá5¾|Žß±÷ŒdÒÀÞ÷@¤E‰5;õ(GG—àõ£øFÍÜ5úpºÆÜqûYàíaN‘@í;%/A/ÅrvõŒá v¡hÎÿ8áï5£KÀë%€el(JoâYwvã¸'1ÊE¼·˜ÒäaxbÐø»3ÄøBi´Ù_¢p0¸¡ÍO$uã{Œ,q¯ì¯xcªÌù 1{ÅÆñÈ­GϱØs±T Ê¼ °=”0x²chíÄ)z©€ SaEÇ t`]ËžÏÞÈÍk$ãÖ!ïš:Û Q¡£Ý€m’¹ä bˆ¡°.E›, £VP‹Ôã¢ÄÑ«P| ÝOÜÚ vr=-º—g¹÷Tu§ÄòsõáDPzÞ*|Ù8Q©ÿòÈá—÷Á¯ïžy,ßaîˆ Òšª·d¯¦4«ÿz““|¥QÃä¦ï‘Å_XßwGИhã’°ƒøíh—<yäªØ saÁTv‚Ð_Vçé•4ƤE2^q7ÄÄëO:ƒ…bÊŠò…Oôˆt)ߨKßyC=tŒßðxÔB >ÐmrKŸR. £çÊm!î ûI²6O@A—9\œ¼Ät;‰8Gf %—¤p!u2£$”‰£D“]°ªPø4IhØ´¦Fÿ š°Wù!ü%q“ûÌ€…ÊýXÞš—Ì·+Ss·.Ux ¤“:™12¸µ²+Ý'üÛ»µãÇ@@4Ô7ìF£Ôbð½Î¨ ¬cǃ1Ù‘¥!hüo;ÑÅRT®Àlii©#4ÞûÑk‚a/¿'I››åUA±$ʾlµ2—¨o ¡eظ±îHmM"MËáø¢ÍA’/¤ÓàÿdS†6Oá™|ì¸M2¢§ÐÓ§ Ìc1²Š“\Kÿô8º‚ï=ðÉ϶B1–rw<ê{äKÐ ÙÚgìÿ‰#uCžÑ;ŸÈM ôáw?½OV–…êÜý…¢V b(J[¿7³DÌò“@‘Mñ ÖA,®\\ìv&h"MÊ'*éçÝÙÃoƒžfXmž§Ðo|bU¥7RÚæÁã‰Ôf-xº•¿¦“ÊjG1:þ$€ àuŒÂ!n ¯l%— “3.| ì™í…þ™(î<b£’Õ`d œBÍ=|C£ 1"&+Î#hÛIÍOÕ±P›%ˆkJ¡¨ž;â¬Õ6ùuö[²È;ýX/ WÔÖÄh‹é«.£ ìëê-ÛÄ öÿ*L…pÀ'7`{,ít>cfwÊ[M¥,xÀ»«Z©žÌ;AriàÑBìðâûzÉIžz.þGk‚éâï{±Ëÿ$µnÎûufsLÕF¹/nîÏñõífö]¶kÌ+Ïw¤‡ÚŠ*z¿Hecñ‡_îÒÏõ¤&4Ït{)^%eH—Mžv Ô¦3ˆ‘Fý¤t9Jå'gnA'Ÿžžåá:ø_‘“Îߨ·ßqŸçI•v”¸Ö †@½£ûØ»Sp~èÌãú6xîèf̃MœYGEÞå%Ï X¨:ìiCÚÄ•zÓ½÷*ý»Ou몮â¦R-D|Ž—ŠÞmWßèO/˜ÿ`à¢Áðøé;B%²07Åìš¶fG8ñØa©{“uË?)d•öRë®Ú1ìÚãÈ MÉtóYÙs «Aª}õWÊ0MÏDžÎtűraT….–rÚƒPö¥6\e_¦léÈt?Mp‘v—‹é.·Äê$¸ï†Zðà&s|þ2yÈT¿3»«¤²jûæ›Jâ('ó—Õ ‚ !ì7èæü´‰íæB,p4¢· N:Sîí6,w¤fœÏÎhê´¤z)uu+2šý®¹O‘£Õ*ÛGØN¨¤étøöûCz >X:$\úÜ>%å°õ«QSsÅ,‚Ë?cµ% èH;ý…=¿¥ì"¯Cþûé8ãeHÖk–0DrÒð޾H­t÷|ߨƒ÷ùŠÁð¦rqð0²S8¼‹ù\묳sP™Âò™˜ àßÿ'­ïÛ¼üÏk"ÂC¤@÷1ÖÙ,sŽ6›ïbM<fÿ‚ð“ £h¯ÿ)³ŸÞW ù0µöySRù¥¯âÄÄèIƹbnuëC)ÖO†pü(ÏÝì^f™-¦6=>7}AëŒYýD‡g¾í±D?4â›J˘zÈI}&]ÙþVBü:ÂTφD"qÙ¬€ë¢ÿEGDâûFù`—›xW-¼gaÐË}0¤Äñ°Zà–Z²™d%74›!‚ZzÆ’I’1d’sr3Ô““‘7ü|ÍS‚86ôB½.ó±FÒêXÆS)%0[GH›–‚´®·[:«¹ *ƒ¸ø}j¬[Ì#´lÊïxR`&s–qF-ýsþGµI·lFL½S*È›1:n÷¤­¤=Խ߲Žà6”×sS×r¬æ‡È&9åp¨¤ÆAÚ÷ŠúF‰‘A`òÎØç l„t'd5¢¯SôÒqpÝÝ~MÏÁ4ŒªÒûð³ƒiÜÅÓœ‰…øÈñ_TSâ"È0¨¿±³Wp—ÚÌVvær‰£m¾)òøZëW馰îF7ëüh9ætn‰}޼?hy-Î@ÏðÎ<Ó{Ê„z­õ¤YïoïGuŠ)#m€(KŽÌþ‰ÈôNÀ¡+ÛrVËo KKéùÙh ‚ïìÎwH:•R³,±9(+«uȺ×{È/Y¹^SˆNo–øöÎU@—˜Ç‡C'6ˆâìIÁ;h¯í7ÒR·8ñε°ÎÀD¤d­’y ¹áÊÃà‘2hËÖrÁgCé•LS×9> úR5ibÅÞð„”ö««Ù²Aì1 §pçâù»6+ˆÀZ­‹”tÛé[ÑU¢-ª„±Ä‡èñæPäÀb"Šo UT&¯–ç  ”^EKv..QžK¼7‡Î¿oÄ®Zy}Ú-¥(QcDA’TÉ/Z¾ðÛ1¤g`ŽâOÑcä 9âìVˆoã_¥ ½&j KüatØhO(x‘½Ü¡*ЀõâF°Zñ΋sõÚtËxû^žx'Ö)Ù 14´WµÐÐæJµ4‰Õ2ÏÄõáÇhás½ª8cËÇ÷ñž¨Ð„lb)ÑW‡ãå 4¨ÔgL/¿2‚~¼­þ›Ð*Ó·á ƒ’‘iË%]ˆ½ft6›¾ÑkvM ² Ÿ]M2½õ ,© 4ÊïuÖ¦»—Þ`¶lÜ™?…FA`íJÜçö&aÌô N®g‘$%…ÍC¬Ö”Þhûû˜*—~ùeížIkù•0–¤Š?i_à"ªë¸öàö€>¹yš! ‚›Ü†?ɦaäP¦ ˆÇ; ¸³£{£çÁØdcXä¦vÄ.=bo@«ÒÒ.b¹dIË5gx`alÜ%pŸQ̓’µ7|\›ÿyˆ6>å„X86欯+@öÄX¯ÇUšÜ4!„ï4OJ*;2"!4ç&ÕùðÄYÙkJÅ~’¾§˜½UšßØA>aW—ÿ#Sˆ‰J^úœü´€uÆcn94½t"¸j«mG f{ã5ÿsÛϯØöW>×rMeç©ö®¡‘èÎbLʰu¾çÌ3æ˜ÊÔ\¢ ·ˆÓÍ{KõZvÜÖ»5½wL¨¯b~«ü°AÃ×89E­/Òf-û_½ljºUòMú7ìn‹p©ZþïM.°Å†è¸§â“c ÅY°ÿ.¸¤Eî!^iB³ƒÂ ¼bXo&ž…ØðI( “ýÓ¶†ÞöÓMä£eˆý¸’Õçˆæ)©>Ÿæ®.]Dê(XÄ!A9Te^  G=&§Ê² èL¡7ã‰È`øÃí¨ŽƒÓo­†›S2 ¹p¾YG½ñ©çjçþ³ß€DOÞ褈æbâÈùRÿfÛ®{/¦Þ„vY„]oA ÿ cÒ¬N†(S¦‚c„Q@Úhþå+¶ÙÎÍIÓçjÿlC;#ܤl›šç ³6vjêȺ^“ΨNqBëV¹©3^U¥±o3ö߯-‡–®ö0YÜUí0Õ2!…¥Í.tCBUøCŒëµ<4;Iy®Õ„H—ñÿCËŒ¹l¯Î· 9g„µ"´JãáÀ†ÑµøÊ‘ÈÆö¿,lo{ž8ƒšáÈèX&µ92el±Å;vóf¦YÞ\Õ'% f4Àˆ©Bbçý¹×¬ø'ê÷ÏQŠûÊ­}Þ7"·Uò‚Ðmu ˜.ýÜÞmÞ¢j±~þÎ(w+•p7¸Òû_D0Šï¥Év†A#vS&P°<¥—cyƒ}ÓÛ©:wºbÄǃÈѱûéõùe¡‘ºæ#“J5dÓ)ÙNC!Ö¸_41)cº#¾¾Ù§'*ݹR£œÞÎ2µ’óÁ­[`D ·’ ¶‘“ð+ÄÃŽSÍpyBÿF5Wáãl¿¿»l´r³Ó—ÛV¤Ð;1ÆÍ ÐÅ'¦F_ô¬…÷¿tE-gD¢Aä0 !«D”*<ßåªguv ð‘!ÌA¨†F‚'&Ÿ-†-Q>à(ËIœÓÃÊÏ!Ù äs{G3Ùbïâ¸~I)6€hÕÔR[¹–ÙsÌ>ñJˆYΗpÚŠkŽg‚QJTð–…$h¥"sLt⤜}¼‚þê9Ïþ¶<\ ? °«Æ3îºJUeÔ«Ñ­ª¦¦ò®eâ74l¿¢åB<ÙÍ7Ç÷¢ù‚ˆòNW‰cõñÞLÉ ó9í]EŠÅ¤"·)¼ù6ŸËn»ÈG6´t;ËhÜ9‡Ú,‚®à^¾ç1PøM3ñÛV±9\_q8“Mlzd®ŒŽ¦UòWç3ò–G‰T/¸/ñ´ý*]ðȵ-¯_€HŸu2NqC=´¿ª¸€|/š;~ g ½[W»‰D¥öÅk ce`6ÿGèBÆ‹é,¥¢çMÈôv¯Ž<ôSAÌÉ÷¹[V3ʰ{™MŠËh'vWÜ£oUH“­ëâO nȰEOÖ "ÿqdWnÔQŽåd ]Äšgšz;F:ð7‚\2˜±~®»Ú>•0=J‚üÆ'K üz%‘tÚ8ë˘%ÜpŽ Ý „*>·,Kñóô¦Ä°0…l'3ÉŠÔ|…~ŠfÝðfŧð˜Jºæ¸7Tc;.&Æ” ±è)|ù¤àw6" Xû-)@_Ý’î%+F—ÌI¢îùolÓ½‹\iè«K¹V–ó¬`R-̃%ˆaèö*Äìï8~â/rœLR¡q³‚xƒ³.°³ò Ó:µ—P˵ŭÀ™p7.ˆŽ~dØ?¨Jž;)¢g·V¬a Q^k%2ån^1uÙЋv¥2ˆ?iÄžMÔIèùªÓêÀ)‚¢ÏñGÏ|Q8ÕC}|ù`¡¾#Ø‚O¬À¾Ì}ŠæøÉ/¼8 Gà â§kè¡Ì£L~™ -ø +’ °W/–o;+)NrÃÚ%¤LicA”\¥Œ›3œ×‚øKð›ø%ͺîϰ¦±ï}YgA¢‰Ï6t,š ÑŽ¡uó£èƒTSÇbiŒ ü™Y\ê©ÿ .°O«Å茵Éï 穨]s§­ÝåísÂ#Š¿Ëdå¬[.Ș6fÂÑ*3Aè]¿ÕÅe¿-Ú­ñøßwu“âìp£ª+Tn¢¬R…³Ç8ïYvny:¾†)á&xFñø§ˆ‘M0ØôAçKþ@@Ú˜@×4(ߊÉ„°–.‡Œ9ðÝÙ—õí‰ G¾õ'Ö&ËÊžâû›¶§›‰xö>ÿU(G Yæ ûÕÔxEè;BÈ“:Ô¢¡2¤N1ÔNI`‰Ò‰•¥c÷}\[ «í º]Œúá¾ÈM—ãöÚÿ[gþݬý»ÙÛj~ÛÏöïOíéCÛnþÝý»EûzÖcrÛt¬¼ô“ õÑá9W;ôßà°"‡ðá´¢­í‚©4¾Ìþ’P?Ûn±áO=MkNU¡«Æ>õüùP*¸Sñn_VôÀCÆÌòêÙl ¤ÏP=’ÝÝ”aÇzë¼~8·ÒZ›“™(óðŸCÎ"¯Òdß’ý}§É¾ò‚RŽØÏ¢Ä=÷^&û›‡ø„me”åxʳP«@ˆ),Ðmä~è´Ôí/Á 2ûßßøøüÃ`^Šßêk僛»C¶Ì‹Êu ”¡Qi1¼‡ƒçÌâDs Ù¼r(hûþîVi´|Ãë~a_ø2€ˆ ÄfÀÆÎWÏ 0v¸ªJ5-ËhÂÕØà_ÚŸðxÉéY›³ß¾¬,Ñå)¶ ©¿#˜¼Ûá]Ñ<p`FЛªOrÝMÇ^sŠÖocÅè1›&b„ѳ¢24&=\¡åM[X ØØ‹´èX¸°ˆ_Þ/ôùAn¼ÚÞÒ²|B.JƲ!¬hõݹ+î«lAÿ·þ¥gb&g@ñ)Nq ãeU$³Ï€Xv€GÁíÒ©ïp'DüPÚ–Ê–µFÌ©ø›ú*P³ža>[) ²rP¤]1º&?ÞSÆsû 3úþ/ñ0Ü‚Q­¬ùɨÛZ€`!º­&F¾õ Ý‘ù­žÐ¨$ ôÈR¢èÖ.G§t­'Z&Åz,°÷é¸ÁÖѾ½ï€SžÍfXå8ÒÆ„8ÂÒ#"¥1¶HØ~G^Ñ×ܦEü’5¼(³™yPÉc…wó{z*ÄoÝüˆÎ>ø7q±Ä´Íà¿æ–“6”î0<ïצ‹Ì1vÞÀÙ ×9ÕIÁÀÈœ!µs„ÿJ¥Ã¦F¹èŒnU‰Ïþ®‘P|œnj”±˜âsbpóÆ éè: ©öëÙ1×.Äë´Ê‚ ª³‘7ÀaÁÈ)4êOðüEo¶Íí°äƒáG­h‰ }ôX±äì‚ÞÍñÛ·­zÿ4­n7±Bûždæ@ôºôÕ÷Ê>:Ü…D¦BÖZá’÷UóQ) Ùjd£MÄFL¤ À™¡Ödÿh!]ÉýÄŽ9ã÷úÚ^ºDáÓûí8âO'9*Û'Ô¥˽}ø[v±¢ížûÁç ıƒÆ¸¾lLŠZû úçàU†ò¬),Ê出¹Žÿe!´8¦O¼ˆXºÑü˜?¬SåòŸO1‰È”[]°¢à§¾ÒaC†‹PIv‚ü§º,»Â8ê’œ Qì´w3{©è*åu€CÓ c%ÑæUKãǃªR­½7&Mr¾;á9[.š‹:*V hDFÄ·±š˜ÒèÏ6ćFh ×ÿoá_æ*ÀW®Ppî ž³Ã# 5ø—«_x.bÂ%¡ 1k^™aL®[[/η'à…ÊÞHïÍ7ó°_Ì}KÂz'Úâ\¾Šû…€›fÓš¢k…éå4ÎlÀx1@:V/¹kåW͉ú$?‰b™£æœ˜Ví”hª%•ÒüýeG'ùMCOBѱÌ-Á)Z"ÖP¤÷þî”~à-‡Z0t”âßÏ «Ž;ðp”·Ù¤¦I:îË=¶SŽ”ÞÔãàÏ)è¤Kî%8U—”lÅJ¯ÜAš~Žˆ]·½ß߯‚à;Ñ2à£(ZÕJý1íWéð(êO=WŎÄé6óú”AôÖp‰ªÞQz±œ ñZ¾Ué”âH[oäŒ#É@eÉ¢²ß~6—-Hœµë±¤/¨p<(ÀÈ«ôïqUñšS§Ù2‰1ÛàJ œŒ¾¡ÁÃê¬/BÍdåh²Mム2‚_ÆDÇ…,ÚØSRï6´ÌjÿQ=\ßþYŒÉ’¹»dáåQ}Øðð;åõèSAŒ®¦›£¥œ#²VøVå×í‰W|¦«‰(ÚZª»­Ó7ùÖ-ŒŽÁúÊOIZ™4¥©iÅÊØ¬£y¹  ‡Â5¢øN‹­EO ¥ —ˆ7М.§¨3:YÉÐabÉ–:|ª‘ò 6çé®(°Q @rTH’õÒ*0ÕNæ¼W–·¡ýe c‚ }®Þ=¿Žàf M‘Ì3Èü†çU‹É1%@ó]Ä2’Ëö](TRa>÷µˆ~šswo1ºR§+8r†ºž çN?A\4Ûô1¡šïÓ(—…ú@:6B}pyùJ¯Ô׋/¬¢Ÿ³(ý4ƒqø¡Î¾WF…óæÿi÷°ýûK5ó®Žño“Ôјn¡]]ÊÁ,=Õ¾Ô!p±VⲨ%»¼ªzkçÛÆÒ‚ðPt*ÉßõÛAâ÷D&¯º«öÇPX²rt#¹»ÝÍë=5»]ÞÖ;‘sçeß0EyeÌN™ÿ ®Šp!GOkÍœ/QÖϾúR碣ë96d¯|¥ †¬¦.(xU] ÙåÙ[Ž0‡ŒžÈþ0éŸtö(’F&ÚuýŒE©¢áôF˜Ê-ÈCmÚŸ~tgÆ4QqÛU¹Å÷%[¸šämUÄñ&µÅô8,…ñÀ¶ùKwä³M*¶]Ê`öxÒ`T©Ê°–C&Þery^»OKMáä_&¾ NSwÕJ 47§òøËXÅÜ‹/RºÈLHÓ»¨ý<ÚcÊ3)l|8$ÍYþÿ)ø®§½ý,­ÞÒÜý c$Q@KÞ¬CÔ>@´*°œ½Ï mŽZαÛK¶Ä0ó¥±t¯Gä?5š‡å¼Pî<û43Ëô¬tFo&X‘`"f6¢hIB{ã]F¶Ý®Ùj’8ýZ©€Ç £œ5³ª¸Ò¾s}‘¾‰¡¾zŸŒ‹vÑqذÕŠY\‘И$çՌԌ=ËòÔ$z®N+OéÀËÛ¼N_·ß(y„"˜cÇ!0Vbên¹“ÿy4h:˜Œ·ï‚oPS·{EÞ¼ú¼%ÜHÍç÷ï8€<rë‡(#ø[‡äƒˆ“m/çŠØJ hpsuARg» b4^ã²¹~Î2I­#<ØHí&vgý}ø#]!çÏözŒÐ)S`géL“`eÄ•W*½PŠÄ+T†%ô!þUz|ì¾ÃMdb¼°ø ñÎÄn—êÊ Qp§.ÏþYÌ"1„…Ûy0¬#LܦÃÒ·\¿7üûoWEi}¶Zj˜Î=.}ØØo‘!j‰¸8k'~Q;ëXB¤¶õe[ÉšwæáïÝöóÍ1*ÞŒ…9Sð˜ùw`J‡C[>óprí“ ŸG³,¹Ý³ð”¬ê0 µKeÏà8ÓÐ᜽ ¼!·ÍmfMC«'Ýû4äƒKýmÚ~hÄ ÷I…uèßP'S'ůâ±MRÀgŒh=É…˜‡„8âÄþ›·ìDã‰K]ÙaY¬Ø’ºx53| |›^«.ŸXç™ä¥ñûÛ›§fx‘ýyÀ]‹Í:rör0‹ËOàf©½|nàM»Ü+'¤$@ÁNqo‰@o]#„üxùŒÂP§©´ú¯’HžÓ˜W.Ö¶@|»8½<ÕT¦×’%–¡P }2þ8;‘P›^£çaékN¡P ­ÁÀñ¿¼‰½‹°áÝë× L 0º>Ö-/–Žý-šv9B@tЬZÎÀ_Þ¯#uÁêtܳ&7јg¢ó½r™9ø‡Zµ‹›ú›¡òo½SOô(¤Öíd`/O<ÃäGÂëÌZdlç›E»l£q0»<¨[sZ¶`é]>D¨cóG¾K |™2]æ"}úê°:êÎþï†Ç"̵ž=ánÜÒ2×ÙœV#6»l¿³ãé¨ÃÉù»©D¦ÓÚþ5£TÛuóQÁq¬iññqÓ‹™qkÕs‘#qºZJDŸ,+éD)<¬F"ê¯E«¦)ŸÇ츤|•bÍ11P=JÜ ~ŒÈQù»V!C/5ù’N»i§”¼¼lÁAµŠiÞ Á)UÕN^Ü­šC<„Dአe…{›ß¯Å#]?Ý$'ùÝr¦w›™ÛZûš¾dÌúA†Gü=wÿdÈÐç¿}`Œ39¬i ¼ü§/¥ "'YÜ„$ÚNâ°Ãq—‰Âá4°k.¿DyŒ|úøGôB‹& ôB2 à àüjêìÿqý—@ë«fâ9Ç*öÀäTC;ÜÄÍØ$®Úbˆ†©šhYžk3«‹¿Í ‡…5¼¡’-ÍQ]&E1(c‚…2ÒÚ·Ö¸º’[f€ª“5wýCÀu/;/tGsò¥Ùø™9 v(X1—E2Ã1Ó4²Vêüx-0‚‘Ja >ó÷|ãl”é[Rk¨§TäoÊ"IƒˆØTq–VžW”ù¡C m®pÃÑ#è¾G“|*eJ¾fiç»BEq#\UgGŸoè˜ç:èU™Ç@š\í'Hl àU&.åÛ†ƒËÒ56’ˆ”.8‹5.ÏEß:§KzäTçgê»ÑÈ¥klÜËËebȾÄ)˜¯úÐA—ýFÑŹìÉÉÌ̤{÷v|.uû¢¥Ý·ŒÜÕdLúW,·Ë ¯¬Sg€ŸAÏå£lœ"Yi˜î~»TJ9M}ù#¨±Á5¥â¨ UÆë›òt»’ƒœÎ™ë£­M´*]€¹³L)‹Ÿií ó›¸&”hî©/èª\$ Öì}äÒ·Mà)¸ Òã¯í¶Fèþûr¾NZ˜ FŒê"ò_„òîybª…-‚¾Èö òõÑEKÛNc·¦4޼©Xt¸ ÄÜn¹¢ƒéb-aq-ÉêÕ”D!j°À¸«ju^WÃ4ÓÓiÛÑ;ƒ‘.PëiII`Éz¤?­¼GÔe È:UüæT,á¹sý+ú¯R³L)—Þu®ˆ˜lìèôDnè¿6ëÿˆ†Od–³˜ó@@’j±=fóUÉÝ¢“‚)¡ÊPÉH&iñþ +*þ) tΫ$“ÊãKБ¸Á*cšTŽCQ~«µ”‹†96Q{؃Ÿît`µUNƒ®ÑPø—!ûÄé3Ge]˜ê¡\§8xÇfÝÒo%ÄÕ;xÏ Õ‰gä¹ù]b~Ö4"–ig¼WÎÇh5;ÃìQ©dê¢ÉC^Ç'0®šot|=mDDE¡ÿDðñrª|\ñø#¢0X÷mÓ«èrËå“‹ºAzÑ¿óg•­áâí'ì óMõrsOGŒÞH‰—œ°IT¾é“Í\+ÙAššóÌçS¸4•å²×² 6—N¤¨âL‚Y*âcm®b^¹'­MG5{§éóÀ³`{hr+×P1JH’cò…¯êncp_[Ø0j,1Hgc›Ò/î>–ª[iE¡=<û^+ÊE'ê\qf’Q¸™ä•ÑLÊÃÝøÅl²¾†^Ñn[CŸvÕÜ~ *Á†2êøèï%öz_¦ùô´4صSù%Ð ]¤©zùÿ€ŠÐr£´˜i-fÙãEý‚ ‚hRM²Ð>%$O†•B´f·ýFM …“eGº `¥F¡Péwsá·¼6ðñª¯“ƒHM}ÒV½sÔ¶ŸÈ“ƒh X ´ò\Ý®6fòﮬc1— º²Ù[Q“¡Ñă®WïãÞïBÚž­³&ϼháÈDÿÙicnV BðR2_2_5/images/updater-32x32.png0000644000175000017500000000572511667203025015471 0ustar danieldaniel‰PNG  IHDR szzôtEXtSoftwareAdobe ImageReadyqÉe< wIDATxÚŒWil\ÕþÞ>ûêm¼¼EÁY\H“B Rªò§ýÑ ŠÄ&ŠZºH• ¥P ]ÔVU)ªh©ZZ m„à´²9NB{2¶glgñì3oæ½™÷zÞó$$´H\éêÎhæÝsÎw¾óó˜ssø´¥ëº[– /{ÜŽÁàôL6Ÿ%Ó’©th ·g:“É&f"ÑÄGã“IAô­›7"‰"žH <;†Æ\38€ép‰d>¯6› “!oÚà5]ÿT†ñ‘ñu#ïŸrOF3­m>Ç:·ÕþtU«ºl®äÐ2W¬»«+¦T«!zbŠã¸)ICIœx.©ëZTU…q~rñôÀ¥/š®]ñ#˲EE.»4o@·+?+ÃÍVàÒʼC«´°ªÜbãØPE¾¤Âåo†Çß\éêé˲ Âd~º¥¥åE²Z-Óù|aŒ] à–ÈærÔày UòR×.¡R¬¶R¯ŸÇWžÂŒ§ Ó7X—’ÛKƼhitb]À†§aéyjU“4Moš/4]ǯu9ípù0N‡#·ëüDð«år©l8Áì?0jæcjjåJÛ¶lB¹\1¢-êšz¬»£aèìÙsˆÆ2Èe2ȦÓÈ;_¤¨e”Õ%§–…( °X-p:ìÈåŠ8}.DHò` iQ”°ñ†5¹ƒ._L¥g9ŽÏN58žÃÈÞ°Y­¸eÓäL™r¦©Y‘•j -ò4†ÛbÀPà<×™Õè·šRAQ­ "—‘Ê–\Ì F‘œ»îÚÕ(KÈÈYrøªî6×ÄDc/Çó³FúùË(«Å‚Ý{ö"›Ïá‹·ÝŠŠZÕ+J¥d±Xqi@ò÷?Àãt« úÆ{ oxð«°ŒW§|p¶¸r¸o¸“#PÔ*°j:Êñ„ àøÉ±•r¹òž¿Â“õ,v¿¹Á`Ÿ[½ËúÊ ‘sånÀ(ûgœùÛ70d›€~è0nÞÐîÆ÷6¢Û§#“Jb`ƒF)µB­A°d”ȸ…Ò¤¡X®R9zV½µwT-; i†·ª‡_æX¶üÎÈ»H§ÑÑHQ*ˆ¤ÀªµÃ8©=3o?ŽåÝ*0y=’ŽÕ Û±`íÇsëlYÙ…ÂEöRPâV<'HÐ]í˧@¨ÜÝ;€Áª×13„«°þ¶F$- zjžƒLùt8–.5È%¿û:OŒ‡ŽA{çœxü8’îÁ ‚è¦æOÊ)¥·Z5DìdÒ)X­6±Áï[vòÔ™½¼Q‹Fý ‡ª*c.B VÝä„!O©SÀùè·Áž›C­¤ØÅxéž Ø]<ñH#îÛ"˜¶»}$nnÒ„•d©X@ €Ïï7¸uMg{;‘°.‰¤€òë×`û¶[/Ê(äKøðèœ8~©Å4ÚZ›‘ž€{è~àÔJ”‹äÐr4þðiÜvâvÅcáPl÷»åع}<°d„øc·Y)HÞ$»$Šèéî´Ù,v^¦¼°$¡ZQ¦·Ó¯Ó›Ä¢µÙƒ1jyúO9›Aäë; ovË‹KQTȤûF44”g 8Ž¡ù¥gÐÕMQWÚ€sY"ÑVáàÌíḲsÖ½á±h’Ð ÏQe)¨RuðÑhÔì|4˜È•ò Ù ¢, ,ÄƒÖææ£ù÷³¹dsy"hEr`n6bî¼Æb})•ÐÛÚ ÎÊ+Õ¥šU eõŸl ûúªÒQ&èòêa^‚HÝÓ(~~~~©õjzQQ*5 ¸ÛêYiÛiSIp¶áN×Mív~È¢T59Z î¨¥U‰‹P]Ã5z9*)îåú¾è@­î„qêLcšÊ×  i XÚöúi—êJ|ñ³Ú`¼½V¾ÕU­Ú5]mµrµ_«Ú,ãÏNåߊËJ¾nøbôW¼Šqõ ƒ.ÚÚÞúé¼Ì ÉŒz%ÅÔúþ¦³o8ûµ~‡¸Ü+QËa'¯ôñÝvÖË@Á `çšIÔÇRrºw.½‚ñõ/åËŒ\ôP¿ìó%Ï›é èÎÕ­¸oÀ5|è_ɳríü‘8[¯ë:~ÿMmÛ> {Ôš¦[$V`lµ/&'y%”,^º§­½Ó˜Š¨òòø¬€¦Ü­ËüØ0èÃ5v±3¹ÿ¼ÜÁÉ×ãÖëÕð«ƒýÞHü*»Z£.C•hs”Øþ¾Ó‰+ßöô¾J5°}ݸ}û—hDó ‘ˆƒû,Æí"‡k[±þj/uÊš´85…‰ݰlç ¦­©…‹Õ\b¦¢ |vªÚá °òyÆÊ”¡Ë{£§àí]¯Znf6m¼Ñx]`‹¥¢nÌÿ`#¨‰æ…‰Œ’IEND®B`‚R2_2_5/images/updater-250x250.png0000644000175000017500000017775211667203025015647 0ustar danieldaniel‰PNG  IHDRúúˆìZ=tEXtSoftwareAdobe ImageReadyqÉe<ÿŒIDATxÚ콸$Wu.úïªÎáÄ9iÎäi”Q`‘$0A$Dƒ±ñg®ãgãkû>c?û]û»ÏÙFØÀÃ`À€Á` &J"H( 'çprè«j¿µöÞ•úœAÒŒ$tZªé>ª««ö¿Ö¿²Rbí¶v[»ýtßÄÞƒÓϨlYµZ÷ÁàÀ¡£¤’‰×ŸµcëËF× oÉdÓÅf³UY\,Ÿ_\:R*•gjµÆŒe[GmËš¢ûÛ²Ù¶UB¬­žµÛSöö•ÿ§Øß‰g¨|ƒë¸ïÙºeÃo½éu¯Ø±ó¬m(rH%“hw:#•j}¤\©^Z¯7H(40=3'ç––—–—gfæçææ[ÝöŒ%¬#$8öY–uˆ€œîÖ–ØÚí©x{]\ÚlµþXXâšß|ß»2;ÏÞ*Ý®#×›1ÙLù\“£–¥„B«ÕívgXo­ÍVåR3ó 89=Sž™¯/,,6ffçkž'÷ÒnŽòíïA2Œ@b€ýãó€5F°v[úé»]JàûìÑc'¶]zñù8wç6Ô-¡üÊU¡ý„yz(!# LgRÈdÒô¸OÕÛäá|z£ëzE×uŠ®çÁq\Òþ³Í-,4¿{âätwvvÞ)Wj%§ëìë:݇è=Ç9Ôét Ý6iß!¬1ƒ6ÏšX»­ýqšç´ý6zÛ É€7¶¾T4_Föj÷€ 0W AáÐÒ5æ¹¥ÓiŒe1ÁAF|,ÝnDï õFãRç´ZmÐcÌÍ-°)Р­<=3»47·Xj¶š ô;ж‹¾í(}ßQþÛÿ¥kr` è?Í·&¤Ri¢Ç%0Ò Àn'l&Åíw=ˆ»´ÕZ“@ËN7×hi=IšžAŸ°må¨ë/æ162ˆb!‡¡F†IdL&ÌÇôw)ÚNÿIcç{Rk|¾gì—|ðBðK-x_ƒýÐ&mn‡„€›#Akw»N§K I`'¦gÚ Ëmí“S3 ÇqÓ>ÙCÛC´¢¿OÐ~ú—vç¬9×€þt¿±ç­­žB³Ù 4›0ª—l`,.–ññÏ}{GÒ¶5@­€à«7:ŽGàrÂ=—Ù¹%ì?tB%äø¬ÒÂðPƒýEôõç12Ô~büw†„ƒmi‘ áb‘ÐÈ$“êK<Ô0æÏB? át|$p¤H‹l6£ž¦mã†õ¸Ä»0MŸK+sƒ„~óÂÂÒ gçç155ç-.-yDÿ[NgW§ÛÝOÂâ`§ÓÝÛn·wÓw”è·4ɨÓw4èÞ]k@ºÜ”FO§’ô6¢ËÖ²Ú¤ ÿûÖ»ðЮCÈåÒÆ&'ùà™w2z= xå¤ã¿¥vçKc‹³ίzê}fæ–1MB  ïŒ]Ï}Ċž@ZºˆB.KB¡¢í||ÙlJiðl6l:©è»KÌÂsµoÀ5¾£õ ˜2æ3dÿEÂd||D™‰óô¯!»€ØCèÿ• K‹W..•ÀNÁyÚÈ,hÒÿGkõƺ?H‚ñX³Ù`ÀNÄá}~=>¦ýk·5 ŸÞ[ÿa[ÜìÉvUˆ—¿ðõ.kD×1À“ – 2‹h8ΊýeÈUœ¾'Í5øU^ê›D +lKh!“°üO K¦ÙÓ¤Y¡„¾RNÕO5O§“ÍϬ¥˜Ï’Y`Lv²¯ /§œ‰êø¤VøÂ„eptÚ p]©²ý| ß·E_ý}Ø8© ’V»$z¿©Óîlâcl¶ÚX\^fàÌÏ/UggçÊô¸^­ÖJ´›Ý´¯ý´Ãô׽ô÷úÖNüt­™k@ÿÉou%Èþm¶Z*”¥ô6ቩ2ƒÜs#™hÊ mA&é5;‰D&Æ´»m´\iQ § [Ùß ¦ü*…ÎSwJ+@×âýŲì¢T?\äBê8\h>6ÀL€•/XSw:¼uWqÔÙ&F/”Vf ïè+’æW>‚>5 3@ 6Ü!TÆkrŽ*(9àùmb>CCø» t^øÜø‚lËæ,(ŽëÒydvѦó5;3÷3óó‹žaݹ¹ùv»Ý™&f±ŸÞ¿‹LÝ´¦ïáa›vÖ¥=vè7¬ùÖ€þ¨nMí…¢LšcÑÙLF‘“ ÅÍI2¡FW&5ܱmØ¿ã˜Î®C’–¢µŸI¤²)ƒ^ ÅVYÚÒ­:,Ú$QZ„A‚ç@v»p‰A¸F¥%™Fûà—–R¯ñpŸÎ̃a¾?!0ø#2VA0^a˜¸ç¹jC„-ÔêMÌ,,Çœ‘LíÉ4È2XG‚ OfÁ f|^˜90[àsǾ~Nù”ÐàgàI7 9|8>Ëà[Ž„Ì`?ÎÙy–ÅzIZÈT&pÁüÜÂkØ!X"ÚÂŒ Õlí%†p„Ä!º^‘@8@`Þ¤—IUI6µ,k-Kp è1 Kè²Ùl‹¡A˸ӴHŠ™vrŠªÒ±¤Ñj“àDßäȼLÀSœ1gIEìZÌK‰"Ê}È $mÖ¶Ò´Û|ÒE»Œt»ŽL·›@³ ·Õ„ÓlëÇÝŽzì»pHt[ʇ%Ið šh+Ї©¶¡¹ÀQw/æ"ˆ[„Ž@hºÞ“Ë«þgœ0éÓ1I?´gœwìýç¤ ¶û•C0—!PPþæhc!Í¥•ÉI¦L8ÐD \?;0t†…D:FÀÇ>2 ¶oÝl—>Þ¥Åå¥re'aqKt_'!Z¯7¦È Ø[o45›ÍÕZí™as$–èÚÍ‹a§`cQ©Tgæ´¥£ÇHLÓýqÚOi è?ý6ºc ‘`úÉ!.a…T˜ìW™N%D·Ëáö¤¶yA6jh9TÒâ„adI-féý9‹€O§ˆò'é±m4£‚¥)·g,sRÖh5h£—ÊLƒ­$i¾!Ò†Ä[ûIð~mýù”G6›4+Ûm·Ñ¡û™-½G›[©À¡Åí4êèÐßN‹X²Ïuv§çiA¥šžï`ªÍŒAúZÞ÷ˆ 1ˆ†wcFa  +¡>àè8ü&MuÝ«(GR©„Öôx¦ïi;§ sÄ€ÙA¡%á ™BÒ|—Ÿ-è'¹j§,=v‡ø1Å&8º ¢ÆÒ"ÁMll„À=Òh6.fÓ¬Ñhp¢\ZZ&2P.Ó¿Ë ‹K‹dΜ$¡q„¶Ý´¤Ó„×€þÓqkðŠœÂJ6&/ŒhT̶mÁ‹Ó!{Ú}s¬¼³¼„¥QÒj´“u¦þR;ÄèŸLÛAÚ8]øn$B{áÖaü‹Ù¢’OǨÀ3ÑçrHCLœqGé4TÒ@¼Øë¬et}?ŒíC?ÂÑÂY¨'2 ìqçk]i{˜øÊ§Fmµøuì»ÀB -ä0Q€Á0œ±Ð—AZm‚„Ó|ϨÿŽ+ˆªK´5¤…ݳݟO@fhÇÄ8ˆþ'`t¬ÃÀ!ä¸h³ÏqqzÜ! ´ n¥ IæH—שVe«V,ºM2 HMZž„E§«+ìG†ãçè[@˜l@DJyã>˨=Z¦úŽ«C[;}œ™]„Ÿk¯}kÄ”Hà À¾f:äë¥ §[‰Ô‚à h¦1Å¡Çw Ȫý®–͛XøäÉ”Èë„#€?¿si¹„ÒrYÎÍ͹‹KË.™xKN×Ùir˜„ÅÃt¤MúÞ ®å§:ðŸ‘]9ãHk6µã+ðX3¸ÙFwØAf‹pÑ–f°õ®›±nÓ8R<NqÝL?¾€¶HöÔÂôë×-¿x…VY“@3×$:[F˜RKŒ@Hí)ÏÑÚb6ñ0Àì€T{Î\ŽïózÏÓ{ I)ò$4†ÒJp „F.Åf=æ÷Ókm7A §¾¨íé|_ÎÐ:2øt<Wж§…@£ÙWZÆN·ŠÍ f–*¨ÕZ(‘h“¨5Z$8X+k-ØaaB,‚52KÝ “g`šcøaBÍ/ˆøP²w¡4çXNÛê¤óíñSÍXt@UÒ>´c0«˜³þ›zªÐˆ#$9¿€k’$-•@µ ãD"-LX¨Œ@åZI`ã†Iµé@‡àåD»ÝšX^.Må! å XZZbF8ßh6w“YðÄ´¾šL&ö¬ý)âŒc&Ç6It±Óèº4•)¤ãmìZ‘ì7Kyz~¦o!dN¢šÇbbÍÔ’\L’ÊA¦sp输*6.6Σ+tZÕ³+í&ùM…iÑ6‰UŸèH«A esš 3gvú vb´«~@ýd°=Ÿ¦m8l*X˜È[&AÑGr§ŸÖ-…ߢû‘’6-~—O€L¢ÃL —Gsp„ŒÄµƒ–ÆÑÆÙy ‹¤Ùˆ ”JU•5È ¨Ti¨ê¸Šr‚µ5gÁŽM×ѬˆÆµºÉ†ŽÝûö‘¢Ó®ŒiÿhˮՄC4’ ‚tD©²Ë•¦¦ç´]ïizÏŽA?:!MÎ~´¢ô)Å R\CI«kÍ~^\ôãïƒÌ"ržðýlZŒŽŽ`||,ðð÷TëµþÈ‘#Çžç]÷üêÂÒÒ»é·k èONÁU4/Éθv°À™ºg’*ûŒóÝaÀij­ª¤"åÔ:q1!¥ÒVŠè`" /‘‚›È¢k§ÑJäPYþD†hf6O Äò$úРÇåd? ƒœÒÚžqw+6 =EÿU’ }Gƒè|ÕÊ1å(·´Ð^>ÞR’ÀiùÍcKl(ŒçŒÖ'À%8Í•€a›x<_ô=è*?Ù3’]]ô>?ÔF@-öõ«-~ÓŽ1öÀ—ÊUÕ!·NZŸ7fG•JeßârE•÷²@¨C`A A´_¡œg–¦çv¬EÖÊ4âè«EBá ¨¾r²è}pÎÿÒ2ÇáK†ÆëHûervÎÈóã<±¾ƒ^œ;ÀlÀ5ÉAÊ aàpR”‘LlVŒarr›6mØúÙÿ“výÆ»×€þäSwWitºÀõZ9º„•&Y7ŒN»‡4%L9hJ*§„@ßᱤńÃ$¹­ýÖ*IÄS–`^Ùý ‹vR…Ý$Ý»±ºïXô˜l~ζ³r,òp³ý褋hiPN÷cÑꃫ>Ï¡<¡<ü´SÚi!Öüd,R—êö–Yãyp²A ì›ú€t¿´ýz²é ¶NÍe ßäR[h­Ï·yúc"ùHv&ŸÑã>µõÞ<×QZ¿Nß³3Ž; —Êb‘À·ÄÝrX Ô8Ÿ¿…; e¨Ýubµj2P,M¸‡Ä€ï 4BB{FõEæªÅ &’Æ ÐBÎ`ÍÍÎX6ITå ³€\Ze ²ƒÏ÷ð{tA2è<²óvrý^ú’ë&þí3Ÿÿ[Úï³×€þäÞZ>Ð9¼æ;ã|° Î;CCýJ[¥”󑾑¦y„RÑÅiÅ Y\X¡&R3æÌ$D;`ñ}Ò8ž,m·Í—œnKÇ1@÷tïÐs61z[„GB ›-¢šDƒL„¹ &bì²w8µV$IƒÚ8R±q|>4 ´!âþ;‡& ì[úHûõïOkïAOfI½O$ßÉe¡–/ÔÖ{ã0§¿²­ßU›£¢­vÓ³ ¼š‹%f MbM´é}*áFÇš§¯“Î,K‡K«:£BÁ B*VxÍ\We,¶HÈKSñ~¥",ê1 ØuÃ8÷¬-ôÓƒ%ý.±uËlÛºåÜý^FïýáП\ÝQÔÞjGu•rÔœ}Öv¼ôÅ/Â'>ùYZ9]]æ›”ª§›Içð‹VütÔ`1E5mÌèbáójßô½ÂäÇ["ÒÔJh:-š%Uvã –4kvÚ†é¯Mü>sŠLŽÇÉtmbíTŽLƒAÌ“y°”Èã^b+»ÈàHcë`›‡ÒìËa¨‚Èѹ8ͤìèÊñÖûÏíÛ¶èÐ Ý6ÛQ ÛYnšIà_\ª¨–^ tϦA­Ñ¦÷ H­õ³WÕòÁ Öê‚F „ ýR‡$]74)ŽŸÆôô.»øì<{Ç”O„×ÕÖm[rûöx½y èOâM%ÌðÕb ûÙcìàñí0¦ïo}ÓkqèÐa|ïö»•ýPG/èkŒn -LvD }ç‘<5Ðã÷Â:j³Fï{÷a‡ÄH3ŠåEó 'KŒÓ£I¡óèlb"™†G÷Ìöféw‘ >ØŸGadõbÝuå¸â0T± é*;µ²ÙÜé»"B_ uK¥b/­['%Ù¾†b³ h4Ø·ÿî¹oî{ø ë.¬„‰ó‹ Ç«¥žÀ ‡ç7ÂýO=hÃ\;f'wß»Kùt¶m™T …M€õã ZG—0ýÿ©ºïìà"!´„k•Ÿb7®…vMOX¦í“N}õLê(Ó· “øŸ¿ókø?õøæ·o£‹™QšC‡pÌÛÐ:ŸF†hüð’N‰•M€Tç—† z0Ä¢MÈJï[gÜé’pj~øˤ¼º‚mpK–Í”m•eµa<ìSžn3µ—lÒo¤³*[-C€ãª6nlÑW,¨¯k__Ay«‹ô7 Uú:ØB.·*]"¤€éài³ MŒå²Kû0>:€ ·ÜwIØ1û]Í !ÓÙÁóÑs& ù=}¨û©Â¡}‡@(ógÍ&|øÆÖ )¡Èß7Ð×Ç!¿mN×6I6?]@g澇pÛwî@›.(¼ë¦7k»Œl±§PBAWyLÙIFö/Ç…“©DÐ8Ž/"ÓÆÍ›6àýþoáâgÏ~îK8qrŠ~cB…Út?w¡„C¨Ý…jVá×gKãY–œ–¯q|ÛÞ5@u£Zz¥æ(¾+ß@L£ý¼u\ŸY…°o€ÓnS:ÔÇaÅ¥%mΜ˜š1鳞)pÊcàŒ=;7Ää4Wf<ªFN§³²àì6Îk$!À ., ‡ú•s 0²‚ßñ˜Íºv}}ذ~2"»º«’fB ì®Bßù÷z¡°„±ïï;^}ö%Åj‘€xž'MÍóTž¹Eœµ}3ºŽ^Kcc£ÃGßLZýÐOÐYãñð»ï½M’téT{öîÇ•W\Š7¾îzUxðÑ\ç+Ët‘µ "ö¢ÆÂ:R(Í><4ˆ›n¼×¾èùøþíw’v¿ûöR)¨žIõ‹3¤ I<ÓFÓzíAvà;òBãÓ{¬BùƒÎ±x`ž ŠÐÃ}ÍZøÆÃíÓé aÈ l[þ‘Ê‘FçLVŒ5£ƒÿê7«´VNoUl[1<Q±) Ø^šÓ\¹ 6‹¡>Õ¼¢ ˆuCª&~p` ¬›Wuôv𸷠5EBctÝ€>ÕzÅÔù÷ü¦^GœÞçX†‚:Ò‹ KÄœ²QÀ¹œSÀL³SÉÆFGÇX ‰H˜- v^¬Ý''×ã5¯~…ÊžššÂÔÌŒ´8·°€Z­F¿uYàøñ“ üÌbxoÒ6¼»ŽkN.ºn[Ulñs J¦”?z‰™†PŒÛ ž³ÌÀÇS Ñ“`âO¦Ü5f— Çö‰¬&zm[KøÝn#̺.½éü‡±tjxØÇVßmaØ–é[¯#¯“B1nœÉæÂ@ŸîŽ388€abÃ$T‚ ½·Þ¨Ó5XP‰:ºæ1ÊÈ1‹É7þ‰|/À£]Vè|ûz­¡ºéTÛ'× ¸®{ö3Ƨ$:mŸøô¿+oö¹;ÏRvÍSÀ!§_˜ÀóîÓ¶Às£ÿ‘R·SòwRÅeQ{4Ä$ ÚAó|·V§™Ù9QVæ‹eTÊìA^V1æ¹ÙYåeæ×Ù³Ë÷œÇÍ~3Õ™¥ÕÖ€gp@k9¡ q‚\tê*3Xa h”åa…a›°bÂ^[ô¾Û#D"ÏËÀJÖlÙÐx‘f˜ú½]s*›t¾9ÛmÚ÷kÀ/±Aú,g³±‰À瘉>Bųã‚É8äVqfšVøD"N<±‚ Å[€ùfB•‹ˆH¸1sáXüðð 3Ƴžq^wnjx×=?Â9våø º$?,Yrp;-½ô:nûŸèˆ=Æ„"@ïa1s Š™©kDÇÄ~ ¾þù\žÁ¾¹T*çH7ž1@çqÃ_ýú·ÕT‘wÝô³Ÿ4çSwIö¤òÂr­wÌ«[ÒOÚÒÕØ˜¥HÛ'ÙKüî­Pe”Ñ>ëag¿#k.ŸW¯°Ó B·³Â)CµÚP@g†à8]er-º:W\ ø6móKKðH€,ƒàD•ååeecsú*_ÎßçȈ¾¥M¿¹ƒO§-3ÄÂÅü ?&LhþÁßbE¸KDœŠâ”áÀ!ô˜%f°e¯Š:!{mt±J‡Þ•Ç%"žõÇ"*-š$¹TV‚yp°Où*Ø\·nxûââÒ¶»ž1@gÊÅ6×­·Ý®¿ûoS»'éVáæ Ÿº›ãÖOÌ…LSz´"”@´—[h凄áŽ}*aO¼Î—Q)_J;EÙAdŽkðke;‘ÄÄxÆx¯Ãx½a‡–/l&)“€[WÑ}«ÙPßÕ25êm“¥ÆbaaQiËÅÅee6ÌÌÌ*ưTÒfû&xÖ›öDÊW#¶z,Lhè¾ÕÚlVÄßÐóZÜ·;š73+Vµµªæ^¹ßhbV°€p?qM«Æ£ÿ–K%enñoe î‘á¡m»=o#­µgÐ ŸËâ¶ïÞ¡ÿ"]ÙŸî52•’‰dB]þf«Ó›Ñ.?æT‚ÀOÕ–a:fŒ ÈRº4UѾiÑŒ¸¨W0H×Â@Ù®jÂì]öóöX[( z¡ (9°¹ÂSŽAö¨„ìPc Mg²ÕøžÀ21n0é3…Ù¹9e>°°àýðß­V'üE¦w<Ìp ÃxthГA+m_(èØ¹eRUu(.|~M»ÂÖ¶Vµ½{ë7Üô[}ÇÀ †Òk£‡ïWùýõF Ôx 1¶6I‰§ÄPË3 t>Il¯ßúÛÕÅ{çÛßô;³Î8)6QwK{ÝO}¼þ+L¯ôäª3g=\ÙQmÎ0%½ˆ"þ€ÈTô> ?¢EÆÀýFO ô…x~KI3¶NŒ{Hj*®Æãþ8©T*|GÔÁÿlÝlbì2í¤ò™ ?æ>nì\ã¾neÒz\PÂŽHO.,.)áÀqhå|tug\•þj&Î(áÂ!=ÝCJ±Ït© |~¤ÂxÿmãÉ" m"≠€h ì*ÂÁ÷OÄ…ƒˆ$âèn7ž§}'Ìž|f3DBµ¯X<»ÓéСYòtìEÒ0ß¼å»êñ;n|S0NèŒÙètmˆº[ʹÓîžÒÜ4­Û†(Ý+G1w6i>Šì°²‚žía†š4½âõ¸t1 d˜{ÝCåýg‚Ô\¦ŠžX?‚9î¾ý*CèŠ2ñÊ0m7 saå2ô%øóÜ¢ì$qàøGB ã)/CCC«ä Diµî±Å]^ÛĸÅS¥ZQ¥Â ž‡Ç_ØÁM:~¶‡]è¨÷i3¤£€Öà| ®*$s………Î…·TSKE%,ã‘ÇÖêì@¬–ŠÚùf¢- *ZNJȸ®1aphࢹ¹¹A2·–žq@÷AÄÓ>¾þ­ÛÔã_ ÍÞò¼3c¯²j£`;±ÙnÇÍis|ª·XG/éµaÏìGâÁ/!wé³!vþº:uÒé*-ék2alv3á­€®{ˆdƒIm¸ŒzƒÖKÞ*ŽÂhØ)ê1ˆpÄÈÇ<ÓkNå$|ç!| æÂH†Í¤£Cµ-¼¬ð@¬€f„NÈHWËI¿#Œˆ¶Ö%_1Á’%¦—Ëæˆòö¸¯¥¹÷žoаeaÀׇ‰ì‡`às£O.]&Á¡6Îmàw‰{è©P\] ¦Ùü~þ<Í8nÕŠmÛ ãxô…€æ1˜¶U– aòq0±àø9×±OLŒ)¡¢;ÚÐ9 ¨ÿü©©™AË’ÏL û`ą̂oßú=å zû[Þp¦€^“&3Ž•I»Õèq±±§œ‡°êõš¶[W#Ù/ÑøÀŸ`ò‚bìÝ?±îjz÷ t[D­9üi+A”nÀÍ$,)x¼E­cËØíºZÎãK#B”Æü}͆þÂ<{íÓïfÒ(-hô`bŒð§¬„yኾJ )â¾FiÞãW ƒID ú”l Kû5~dÂO#•êwúC+µÅâùn‚°QI #çŒA—¶uH?YÈÏ ´Œ™e¡Çsá<“«Ð!ÁÜñY;!UWí¬dÄ<™ÌX°Ð¨ÐõgÇ%G28)¦ÝiÓþªæªF Ø_Ä«^ùlÚ¸A}ÖÏàäl¿þþõdžŒX¶}ò ô¨ãâþ†x+ÎTŒ]9ãüQ×ø ɰk‰ßR‰ãÙîD~ º×ü¦ÿæ7±ùÎ/`ç+.Ar˼T"Ù‘¡-Ý¤Š´€$Ý'rôZžä@–4Sš~d†óåò”Â6¢A;¤×„[;&½Äˆ©>Uæ‡öz™|âF©JD`f`Ù£mƒð‘µ@¨õƒâ߯à…DAFM†«È¡Ddä¿“+ôà _(Is¼ÑDË´Ù’"” ~‘Ôs§Õûœ˜K$4.¢C"üzrî(‹XM@!¥Š…6'IùpçX^]«î¨È›ü˜GLsÒkòa2O˜¶«^÷*7Ê×Aô]¤Ò©sHˆü ZœóŒºº¨–îÇýÿþÍÍøõ_}êìqš‹`ê&„­NnD°øþ0¦g©Tš„Pù|^QÄQÁ6^Ž AÞø?°ç£ ÷ï¿ó®¡‹:I;ìú,ÜI†¶$9A€Nå€4o$ hC¶Oodïƒ2|?HÓ§m"E Gré>ˆá—@òóÜKNÊ“—Ñ!覻MzŠ^øÚ[„n‚ð}æ5KôßÖF¯„0>i}üÜ…,À–N—Ñ@&÷|&!Ãã¼BWëI#,ãô¢?B„Œ(ØGô ̈ó{Z÷†.ýÙqÑ©©dRýDÎÿ÷+bq-[<“þk*ÙIhr„qšŽ¬âÊÇKæ'hçÎ3èê H2>¼k/þêï>„_û•w«j(¦K§ ì5E¥žEÞí4b C˜@4ƒ(ö娼q S9l:xï`/=yÛQì¼6{œwblGW×ZÒG¤šÜ¾òVlŸ»ºpQMš4> Öþ…aˆsÎFbhîߺWC2S@ìÑè¾4ê\ö /˜Ê"ƒåË ñ‡»yæ7²'»ÎžkOúµp¨D€dm°ÈÏ—º LÿNÿX”_À Á!ãŠf«A@Ä^j¼dÀ¾]/ü†ÑF»{2`1Ñ}øÆ"Eœ}Ȩy­o0.ŽÈ¤Ú(cè •©!]¿CðûüæÀ©°étúÂz£‘Öït¾qS>¦ðõÿ„÷ýò/¨¼r¶¥NØ+ê Sƒ›ž¢f~æWì¬ñ …¾0ž-Ù;\Òi³c›àüüÛðà‡þܯ5qþ˳°Æl»QUÑœ×ÞŸàONôµ 'Ê4Z ³´‚\z⪠1ÜDwžÎÃØ[”0PÓZMl/•U_Gǰ „­°züçl£*Ç#QÒ -ðÃdj,&{vF"AŸé˜Eïz=1{_ûšÆ‹"Ãó꤮y„’DƤ´¶üšnSG EÄþ—f8NÄæ×ZXýÝ4ðÍ3Í3}?Œ3h%˜'"8nÑ“ÅF'ÌñÊHØ3ˆÁ`í°ÇIªñvvÐúZ ¡‘‘ö#\,½ -°úÐÍ…æöûîóƯþò;•ÝãW=Ñ6ºÖè EÝ9é#khWìü'÷+‹ÆR[©¬Òyí-çÁ¹á=Øó…O#õ­ì¼.kP¨¬4=9 [=Þè«=K«wå×£Ï.’½xçw«®&°§ÿxã×kSÀsbɸZ¶X¡Ã=.‚îÊ2«gÇa(v:vêU”’9ü5™ÛÒ&heØÜªI¬sl­’T y‹ÛYAAMªÃ•ZûKDæ¨yÚ1§†4¹Üšƒí–«ãÐ2Âôe—qºyŸBà­·B°Gp(ƒæšÊ{AØÑÓÖH$Q):§.æßÌ›x¸Ò”õ³", «÷tˆP÷”Óq.›ÃCƒ'ONo¥w-®½'ìöàûñ×ÿa¼ï½¿ êšˆO$й²Š9³¾çRR.¯Æú£`ç÷q×Ópˆ‡J¹L,] yÅ5èf³xèc7Ãúú¶½ˆ„÷ ¥zœöã `÷ü-z´0ßl2šwýÖsÒ°‹ßƒÆñõÄÅNk}•Sæj¥ŠÛ¾wûñ†×^¯Šž©È×±"¥7È6ºçzAˆm…âÑð¯Pλþþþ°ƒ'£rF7™¸èÙèöàá}âÖ8ëÚ¼ÖìmÙèÞ|ÒS¡Œ\¢“U:ŽÍ~5¬Äíð¦‰4¿˜¤OÆhö˜| ëgzRlü—»VkòÅE4ˆ™ì-ŽãëC“$³cÿ1‰#¹ºù»Ýã<Œe³é]ò·«¡‘jþ“þ­Ëüg¤Í’Yú™;ðª‹êø7\ˆÑþ4ZªACÜQÚøPÂÀ3ôØ8âlSÃÎo·¥oÙ*áÇïÀVµ‚ò‚œ£°ÚÀ è{訳‚š=V+râ ê­e÷›à64^XZ÷³vïòðKθ¤çׯW‰4W°[çÉÌyJwµM;¢cÇO*'kUN{|À^ç*#Îdê2л§vˆŠØÕüôtJÝ:¿Æ9ÝZärËYh½úõxðBâ[ul»ŽÀÞo«©©Ò“+µ·õãT½‚Öyݘ-CÞ{;¬«’DÝ¿ ÷$óä+X†š=´=…ìñÇù¸“j³ÑPç³¶4ÙT¾°nšÅfy8ùí«ìiã[D9qäX{í‘ÞÔ~~oƒöqÇ.l-LáWßó|¬ëG³å˜¡ ½„Æ cþ&aHÚñ"¡ÐY§Áì›–g/¹¡òl›'XØ: '’d¨< RϳƒßTŠ`@‡ôçæ!ì´£dIP& 3¦YF²ö m7¿‡K€=ªìïça…mõzƒ¸’(­ý7Î~úÑ}âfæ»ßùV NÌÇö†'¤jtÈ6z÷|ABˆ¹Ð<š×b°G l;Ó5ëÂ+Ðxu÷}öS°n©cË5EX´¨šreæŸ<™·Va÷Ä…-A¦î ÿ<$¼ïÀ™ÍC¬‰13d,ë§7®­œo$l8<Ƚý–ˆ²/š¿:zŽs¨Ÿ”8ñת«g8;ˆ{í½(Õ‘§ö;¨Ç„ŽÝ'?üþǯïÄs/Þ¨¦§j2 Y!¼øþ„ŸOhÉ qÆ3v¶çG28’îŸ%ÖìV$Þ®´¾mÌÕ0,(Bò3ÕëQc‡ôGÆHPéæ'š+2&Ú/¦±ƒqZíVWUDrS õg­>‘œ™™»”>þí5 ?‚7žt7ø_ð‹vÃôŸFWX,•餿‡?Â-¶–…½õõ÷™cÑv¡¬”ÔØãäs¯E#•Æýÿþ ÈÛªö¬>ºð vO®È] Qœ’Ê«EžÏC&î€uéÏ Ñþœ¢ïcW›ükï’bþ–fx 7£`´¸0OÌ\â+;qßÀÚ%Ó òeyàºîaprü’¹g®ëÎ{ñ†ëðÎ×]B€¤ó¬:³Za<ÛO–‰$ø ãö«Ä,@¶…¥_®‰k[Fj„ÕsÚ†·Í{4—Aû*Èžª=+’4fÇ­d‘¹a7]U«yÿrµ©‚2ŸÉ‰ñôÄÏZú£;÷ß³÷ýãx÷;Þ\¼Ÿð¦†³GŸq] øc¸ñN«þç}&ÙDåT«ty®÷U/DµÓĽŸþ}ýg‰’­Õ”·ø«IËhöóÉ;!.º võ?t­÷Ä Í$o%á&•dDÓ±ÉÅ…Ñ­UðpaîE“„ÏÌC]¸%/¤ç^Ï©pÅÙaë¡@´6mÁýÎý¸bx¿ó+¯D&•¡ï)»É—±¨¿D´kv4ŸÞï¹.…ñ‹Kã—ñª?/â¬2šb§ÅŸŸ$"-<©½ôÒÄ夈7 ±D¼±…»ŽÕòç*¿\i(V'¬0/™ß±qÃz>³W<™²ð4¹ñEbϽã?ô‘OÞ 2ºãVcFÀÎ8íuw~";@u.M&U ã‘‘u*A¢¯¯_…W»‰«^„Úõ¯ÃýÇûqäëUÈ:iqÊŽ*ÛlÊ›“PƒÃ-±ò9abíÙè^ŽÀ>¹÷~zÛìÚ—!OÞ¢G; «‡ èºîF½Î"D³´„}Ù1|~x+jÄhö8hð4˜%Bïšk<^þ¶â9˜x›qÂÑáfÏJAì>Šâáñï½ ['ש²R•®ÁÀ·'‚¿iød^4‡0õâ„·„%O·ßú*hmùe©ªêL0HغŒÔJÐßæ13:n•ůs瞤i1­^³õœ5×Þtÿ;ÔwÛa×?×Ú×H›[ˆzä?Ö­[Çëä¼Çko>#€îߨ>Þà >üÿ}R”µ²kº <†­®³á,‚îãˆÓóÂâãÅðºasçE#¬4Ò×¼nÂ}‡r8öm"m¡ÁÙ€ÚL[oþs6Ûú1†‹a\Ò쇦!>H‹nVå‹Ó·) Žbm_7ηúòNÚ|iÝv,çÒXØí ´ß MgÐò½$sd?¼Æ¯uÌcÏÐB$9Y¼ ‹l©ç ·áú—ŒâÅÏ?Wù"%Üq¯sÏ´ã[)¢/˜8¿£ÑÁ¨iã“XtöZ ÁÊóÛmÄVø^~ìÏw·Íç,_ {CBd R8(ue~¿ñÚ)œ~ðÌ<¶Âr» =ØÄæ¼ÕίXåjë¾Ø«¶|¶Íi`aÂp‹•š ÑZÆdÏéÆ,aýÄøÀá#Ç. µrt èÆsÙá®ÝûðÑO|ïzûÛT1†óè»Ô¨ÁèÜœ‡*¶WOfxL4‹/fš5{ÿ€¡™zõp·‡4^âêkPq<ø__ m?±—N¤UeÛ‡±VfØðh ÈžøºAAÛÖ`Ï÷Á"ËùÏ —/ëøÊùÆ| ‹‹¨ÔºøÌôF|-9Š¿…ÚpËR‡Ñ|BÓæéŒBl±ÐÇžî.Ÿ#¢þ\ºÉfˆRͪD{ÉC—>/7¤1~®…Ò?ÜÉ“ûñû|1ÎÛ>®Æ$VjXl#;:âÁû!ÃäžHw¶ #.hÙÄ:¾øN<-xýZûHs]Æ( ÐE¤ÛìŠ.:†=0£\\âVÏ]I‘²À \§zy·aãDŸû}ïB:ÝÿµôŸÀA·oÿaüÚ¯ý2þèþD à{”þUMkec·[OL֒޳§Ñß×¶u¤ÜÈ@Š| ò¬ìþ4’3_ `^‹j=…:O‚qj¸á*•>€»>>¼äùƒ$$\úí)²QótcÀð:iñéŽÀx LsÄÌBÒ„º£MÓ‚Jâ²A#;øË~×<·o¾á*Òœ¤ù]'Æøå£I¢‡ÂËÞ8£ˆ,þQ2n¹¢' GžâJN³­EœÅG ·Z,WÑi;Ê~•½ŠH/¿H§_G=488Y©T2ÄþZkθŸìì ûÈÇ>©º>Jç\ƒ,¨|÷½Û~B;Ûø6;ƒ}xxëhãazƒ1èOØ£Z¨V­¡›)Àþ¹×a®Úw~õxvbFÞø,²ïe£ãÏûéÑwÞ©ìø°µ§ü-ÒçSÓÀÆíoà¼éï[}6¦Ðv³†sÏêÃ{ÞîâÿåvLý ïª+a‰ U]´lÝ™®­šåÔIág“ºÝcn²q×Ý üݾŠ×\?†×¾âÕ˜"YÌ«Âü2OÉò«zÁVãô+I¿Xñ–HV¤^W㯬 1Æ ]'ôy¶"í¢‚Þ—$4¸H¥Rk’yØ6%,sU½ƒî½Æ '£NH]Ç3åÇFGò¤P¶¯ýqRxn495=M`ÿ(ÞýŽ•ý~йº)láI¥§«)eìÒ`Ì›Žhå‘|Ý[±”Îãžo—göbÝë.!°gÉfïš /Ù3FÆ ô˜ /Ͱ ZfKMÈì"Äø‚÷Î=ñ=xârVäE«Qǹ;ñK77으“$Ý-5å‚O¨™m’“Œ@:!TŸa00’ÆÉßøÃ[pádúþë‘'mÕéº:½ÒƒëÌ‚°JLBÄIøÔwÐ=ò{€-Wµü#ˆÑj+Ú7êhWqñ0ÿëô½ äW¢Vk¡Þl+ÊÞëD‹Ö@ø©ÆñvßÚrWÅ7dR²ÀÏçsÛy­õÎ{_úc;7sœ™ÅÍÿô¼ë7)ð«’¬ðú†»ò;Ç‹C?,Y)çˆcз¡õ$Ô’Ñn«f \WÑWìSÀ®Ô&‚ ¥múG줧e0í&HÑEP†«†8Ów ôñðÅ33³ƒôå5 ?N°s·Aü¡þnzÛ[T@D»«Ž\hÁÉ6\úêž |ºê>.XžeÖ%[;ùÊ×`ºÜÂ}_¼W3xÍ•d¶s/¹fHÛc] WÿévÊÀáŸ;OZ=7 9q!œbçÜwযŠòpÚ \uÙikO|éÌÞC;¿ìRõáN‡4[[¨Z"åÁ&°K;ƒß:‰¥/þ{—ãå?{I؃=¦TÅŠ" ÷•ëã1ºbyTž ôŒÅ«„¯D̼1ŸcÁ>33ƒö«BNšj5›*ñjbr#¶mÛ©Zˆ‰È{EçÙÐF šQÆÀŸ{ÒðÐàY'ONOÐ’\úqc¯77ªxßû~ c#ø¿>ð纽³ÖÜ5ÿ¢qš#7{þ5\žÊ£øÆçØI&5z)Åhûjík¢ƒ!ÈêäxùôI²× À¦ç`л;ï„“{‘\@N0ØŸså¤ÊÏÿà¿~¥t ââg‘ôTŽ—&­nK¤Ópg:XüðWñÒg'ñΛ^d†­øÑ–Xaz["ÞX>:HRƉw|zé*g4VÌŸM©Ì£hý}ŒXá1ðY.@RbryU T'š>=;ƒî{÷ìà _t-ÆÆÆ•Ó6 2ì<í’óHÍ(™=p~} ­Á1zû²z& …Ô“éç‹øðC÷ã“ÿúQûT‘E×q;G«Œ6»˜›!­’Q`é[ÂÙîb8kÁNeáv=\zÉzÜôóƒ(üÜ}û`%Ød£·8ŽM‚0…ÅÏ“Å#øƒ÷¿Œ§ÈeÒ2SOýþi1Oºè¡ï"žˆ4UŒ>6sƒZž`3Î0ËŠ”‹ú…&¢×=Žvއ™X‘°l¤Si5uE0’‰56>ŽsÎ9W±¿Û¿wªµJdX#Väí¯JBÄ3ûDhÌdÒI:û…Îxˆítiô>’Zoìtº›é'žl'{Ø¡“Ýfû„îy;NÛ½~øtRy¾8xSSSÈeÓlyÊN—ÞW(q3†3t¾±ÍΚdÈ}~b ÏsG ßr#Žè|è{xv"‰¾·½VÊdSê׃<ôÐy¬BM#?îÔ$­³8 9ºÖ¶«1qðVÈådîùXDn§…«f3ZÃøØ|í¾×#¹y':ËmÒætï½öý_Ãþþz<÷²³ƒqÇÑPW|d˜4Ø0Ö#PžÇìÿèùåAkðå«AzTœ©öÓ]žÀÂÇ–@:m«QLùB‘¨ûvìÞý0vïڅ˯¸ˆ뤈›J—=tB[E¥ë<:ºžâEÄ(¶ótú+ÉÞyÿ† ëŸsÑç)í¥Z¦ffUh©¤Fè¶èFúÂqÊ´ÐÐÉo’à>QUz¼@çfšîЇѶÿñÔÑ£Çð/ÿWÜð†×1È<¢c5bˆKy@ŸëÙ9í؃i£Ð=Ü Òâȼë=˜ýô§pÏÍ·à2‘ý7¾2AšºE4ž‹E¤4I€˜pêN”&6VïB,-ëIö’N™h~èf±'w9‰ººdŸ¾àêÍpûñɯ~ Þ«nÂÄug£³{ _þ Þú†xÛ럕ì%£7Å5 JŸÎ¤Ï^‹<œ Ϋ„vÉ ¹¤´ÑêÂå"—Ç0'‚~qZwŒ*Ùijêi÷K”ŸÇ/ŒñÓj•ïÁd Æü„ÞŽNfOoé+/ª×ê}´–ž®@y×é~øÚ=äÜóv¢ÏëYÖ¦3ç¶­[ÔLlîºJ@Ë8®7Ivê$Šó›õ&NNMsqY.WD³Õì’ àŽ­u:ÁË´±k©M÷ ìb¢ûƒtOwÒãC‘Fñ`©Ñèì}礚ù×Oá­7¼±Közí2¯ñ1áí§»ÀcƒmrÒìâÆ›p’{œýãã²ÂН}¨8O‹ñ öÞ0ÛŠ[”Ý¥óŒÅ9È‘ó!Î!°ïý*dµÝ¤Ù—›ôºÓÆ5×mG³½Ÿ»íóèö_å¯Ï¿,‹÷ÿæ+‘L¤´–´"Î1µÅŸ uýx›bÕ°EàîtnõÍ3/ ¼)Õð“ý6\“¦Ì ›ûÊ%Ô$V‰ ¥åee««Þt"{àåG¼¯ahMš|{˜Vá##Ãè+ä/<áyÅ$ð´:1`ûfçæÿnr|›}ë oRÙ4Ì4ØNg)ÇPšúD‚YƒÝ× vžÚ)³$(ßôfœè6¥øóÏ‹K Dû^û2HöÄ7jè1Ý©âí‘FêÌŸ«uˆ­±¡+ ¶9XÿàðHcwß TVœåuñÚ×^€âÐ4þùƒL xÿÿ~Î;kãŠÂ“S…Æž*ö#p7öǨ0«’O©$Rélnùkóc—,Xç;«ÕÆ'&4=÷dON¾ zöņMFÀîwžåuMÚœ»­£÷²CîèÓ èÛéþY¹TImß¾}}:¹íÀE¡Š<Ó@HúÝ}Ô$á æŒºUÂíв3=Ö¯ç&{ˆ¦Upa]¼÷(?zäH‘+µææf7ÖªÔõë8!fhhçœw±Ê’#­ÝHØÖr­V›Ÿ™™ÙÈ=·¹+*7‰`úþdé _³û@÷ ajõdqâ-oG›þèŸqU¶ˆÌ˯£_žU¡7鹑¸ºŒ¬´Ulwpþ: K0sœxê4;ùð—H³ÛØ›½u7EZ'‹_y×2Dkiq>ïyçG‚ÒOM`û7—ÀÝu¥aŽ^h¿û>é¶­(;7ÕýŒc‘O$xÚQǯ³IµÝ ̈ÅÊ£ñt3øAD²qz‡?Jsm''Ç‘y }­Ý»ÎT%Ûô³iVvˆç…3²Íè`7ÜÕ];„ˆdHU^ì°0 ƒf~Ñp‘q¨ø¯IÓÞ—¬Ÿ\OTk€ó‰U¸Êé¶u臛é·;‚‰ñ1NÙ~V£Ñd xO' [ZIÐb¨•˪Î;VîgæTóëÙ<°{¦§Õcý7?ïO‘üž™íå²½DÒÚõÇãòk®.Tá“ÉÕEŽÛUŸc¦@B@ Dª›2™¬ò°rÿ6Û8ä΄¯è±Øì~Ä€Kpņí°Þù‹8òÁÄØ>ˆmÃC°¯}1í¼Æu“‘\´^M#ãq-5KÍosM*©Ç5ŸývX¹~¬ßõ-Òd p'.Wa¿B>·z*úSä¦Ú×y¦Û•£ŸGË(Ï´~6Ýàu¾„iTë,MkSãSkÔ÷õ(3“Ö+'Ípb ;I9銅¯‡Ðý«|õÏ¿çÇûóð|¯<3ŒIb§™túòZ­ÁÝ­:O' ×øGùšQ97,Ý@ß?ñ5¢Š÷Ü·SÓ3’$¨h¥)ÚàÂݬ/¡O07èK$T󾌆;NRÈe3j8b6—VŽ”4-T¦hªXB¨ÙæA?O› ¾ Ð“EtȧÛí'Œ¯Ñ›O‰…kÒe¹è QbëNo|3ÒögÀƒû€—\O‹AsÕðš_X r´MϨ í¿„Uš™®D÷µyÈOÂ>t£_þ=Ô_ñ{H]ûšžÎ¨§O!?VâÏÈ45ÙŲ‚Iµ®Çq}Oª¨vÜÐã™-j®§‡0&’6ÝFÇä²ûTZ7µ Ü嬛!†3]úâ…&Œï¥ò~ª «k¾vVd}tdwH:aq™û…/<€^׋4ŒI§R º ¬K¤Á¿yë895Ï'RD“øÆ@• ›lʦNÂæ"š†}þ`;“•#гi¯æp#NØúB²P`ðû“DýdŠº›YÀ¼ÏU4új‹ïŒ8ë|°sR GxnWÇ!Õic³µŒñ‹3°Gsº= —³¦VæÃV¥‰1ñg >8©Âsry8¶ ò³Ÿ,ѾÅ2¬½ß‡ÛháÈž.¬Ô7±ég_s¦4¸øI?ÀM¶<T£Æ&¨ç¥eê|ø:Û„¼Ppª$žôšÐ Ä5¥§zBªT ÷<[QwÞfgf±óœŽÒŒŸŽÔ¢ËˆÛ=¨]ëqÔiúk1}Ï?1uýyëÓ èªeŽ­ú¯y hzS{î}GN):Œíò¢>÷0$â2ˆSš4FÇŒàô»G›ò°@‡t޲ÍÝN[ÓvéšMf Ì8&ºc«@±Wvº­Úõ¶Ð“'-žˆùxÀÎ¥·¼ññZV›Ëâ<܃ä{_\v½vÈqÔ‘À.¼Hóõ ±‚‰ƒ%I( ‘wh‘îøîWà}å‹ÀÌ4PšÖÉ4)úi·ÃS.H ኗ½Vÿ=ÓBî'{0+ÁÌžðcâ–4C=b{BkyÝDÒ3ô\³HµV~(X+þýj¸f¡€F«¡lyEßý–Q‘Þ4aŠl¤¨%ò|goØÓwúÎKèù§ЕuD RtU¦‘.Y´iáÌÌ.`jjÖØI^d€ˆT‰Ø˜Ü˜Vê¹´2šr$Œ“Ï“FŽkg"Ú®×â¡nŠC´#EªÈÀúõë•ÏŒ¡Ñh=•Öp0*Š£<˜p°9‹ó:?DòÂóäïÖ‘2hÕU?7¥¾¬*-N—·0È6¸”{~$ä7>ùõχÒéêj2I‚ÏÊ U’½¸èâ€•ÃÆßøUL<ÿ…OšûI/¢q|OâyëRuüµ‚¡‹gû=éyÊ'ĥʊ‚K­Ñ‰‹úžT CfH£sÑ ³,¾.^0ùEÆ;ôš{µ׋%×QzmãÆIú¥ÌØÎ„çý‰:--:aYW±võ{n³Ã‹G ³ƒÌsEÄéA¯)jei—…sk™ù•Ï%n!•ÐÚýyW¼æ<~»æ´®ºWþáŸÀÎå1OvhyiSKM|vq&6då [ Fèýÿó¢$~ϳð§»üÅåI§]a?BF!LR•PŒÆA¦íeiÀîFš|h’e¨ªÖ”fU1v5VUkhËWTBÏ8ç}©i© £í½Àã„¥ŒLÔÒÌ÷Ã`ß¼u3Ž9Šù¹Ybuít/þMi ìr¢ìÝÙ“Øqì6 '+Àùo »üê°˜ÛNø" NöâwÉÿÎ-_ú0³ ¸¹[z•ìq€ð–£¥.f††pÎï¼ý;ÎÆÒܼ4õZß™Å¡Ì þ씸¤(0׊D">p‰¿Ýoá/÷I¼o‡ÀÀék+òˆ,Aec&’ŠEÚ†vëH‹gÒaY³[9Éa6Ž©KDó^ö°{^ƒWà5…+Ú9gé2T#w<7Až×[(©ÒdtÜÞ˜ ƒØIÏààþ}ذq£Nâ2quNÙ. [ëFJ•h?-¨»çÕó¤Øñ €®hT ˜™¥CàKº ErŽ-dðÍÝ;qùƇMÌ«°‡€§.Š­. _£[?±$åJ£"i~¤õi5¡æƒÑT}·3h;²ÝªDá¹-WÏI‹Y±†d^}–ÍU›ìåißõ‚ÎÍVK¦RÉ3JCU€Ž³R©`žlòúâ<6íú*6fÈl{é;€¯ÐbøçætÆÏ±p?õQàÄ1àþïC¯ýôŽþT“ôN rU2u˜²þÖ˜|ÑÏ¢Q«‘ɰ„Zy÷Í¥ð­öf¼æò ®8NòfªJ×’VË–à½;þïû<üÑ%>p¹…bòÉaAìQçõ¥“bt|ÑžòÇØfØ¥Ë'“f^ƒ§ld€ÈÉ2|Ï€ž¢7žÊ¿Äë'Î(i"uH†ñ;¿ÖBDB‘ê5NÐâÔk‹«5S(Šd³—•Oˆ×¶éŒ­Ž}Ɖá]{öo# ïyZht®/ä³èf\.oœ$Ã9nzïÚR®YøïmÆCNJظ®Žñþ†ìÏÖEf{YiÝpŸIr Êî¶ Û n-F?äðÃB~ü“‹KtðeÈ}Gx(¢øHJÇ%%ÑÏ`A×±ì^èÀûÙâœw¿‡¨l¥ùiTè³e·Ô¶cx}oÙ‘À‰°N/lÆÃlM`Ö [þ‚€þwzøÓç¹dÿXÊ}Zœuª0…û 8&,kR`u›ö°1† o±&u…²×Uí©¨ôl^d¼Ô}™ÍÎ¥¥Ém&”+ÌIò>L[X/¹g³@J]sáIíùO¨tcZm +À'qmÚ09úàÃ{. æû´z—ìšZ>›Q6“ë†s¢ÓÉ”nîà´é$NÖ!Í»ªˆ#s}H%wøã»$Þ™@_ê””û´±$îµ§m:ÕB9¼¸¦Ã Á¸&eÞ±pý4k/HQN5K·›Æ$Ð…+®+,»0‰v*jã™þï~›p?µÖ7ÿØçÔåv»IO¹bóÆ-Ä,S‘ 9©& mØ0^ ¼ì|ú$Ìp e“ƒÎ1iÿêr¹§²tsœn¬q½MRSÓ›Žm ³Š¥ªïX‘Æ{–‘º"èöÉN‡„EWšC,éD[{—éð²I=eƒ…IÚ"Á&‰Ñ'!uÊî)€~Z)k.¤)‘]ÎÎ7qòv,?€¾9xwïþûn Ô çóÎ¥´ îE£&\ 4 ÅbÅÁÞ®±wý6^÷b¢ìuÅ$ê•%<4—Æ»xî…9X-àÖ£-¢ø^0™DUT evhÞÂ`ÞúÿÙ{pK®êLtíª“nŽÝ·[“R ©%!‚,“ ÂÆŒÍLrbÛÏ?'ŒÇÏxŒÇ3ðÆà±Á€d  ÜÊ¡Õ9ÜOΧj¿µÖÞ»jWso·¤{›æôwúÜ{î‰Uûß+ýë_p):@Oà¹úÔS¿~)zp.œõK2AUUA Ê©fü±eFqy|¥Çqç#[\Ýáæ«–VÓ^J_ÙçN}Iÿ)²—ã%õºÍJ?Ú™’2Ø\TžŠz-RbÏî `ûŽv=Hꚤ—t2±k­ÉZ«æºsÔŽJÄÓ«KtãÆó ;“aÒq‹CyróåZÖØZÁnt8·À,2'p×ÂTX킪lRõTŠ r~Ò(ûý!–¹ºj½= Õ—N÷¯a«j§ä›Ìçóbn1 ¹8r? Ÿ× }eyÇ~tÛqÃêMGú™ùKûòÙ{B±d+užÌzú™7Ã…ïûH grÙ9(äåÑ9?(l¡mýÐÇð§jbyÄÌ2“z˜!¹É'ð6“ta Ï…ûðÞOøÐ…€Öì<&ZèÕµš §_´öØâ¡Æ× Ì4¢PRÂÚŒ62ZvaØœf<u^ÒЇÁÁ!èîêæ¸[˜‰ª¼Q8Ú˜©5KyJRS¼.Q óš’Û€ÇÆÖm›™[@÷=ÿBzÙ´œ’eTŒLݾ&\±ïR¸÷ž{àɧžŠ ÊP=SX VÇOdP_ÄÀŠÈ” 復[ÒIfÑ s"etÒ%?¡°ãEÑ?k|wré …‚| Š3°õ©ï¦î%Y\ ·Ü0SÀ˜GµuÑ1¨8#@D:Šcå›PØ·öýçB÷†M°0;9rÙóe±?;¹¡QØ–8ød ‹¡2K ò¨É9 üð²ÅîszC ¾Ñr8Üz×.ø¡$è¨DAÅÈUc(óîRÉŒª>šèbZ”M-›ÏÍ+Ôp%Tï£Ñ Ö›ã˜$<}-^ÛK¸9oß¾‹§º˜VgsœìŸ§etâbôù¨±jƱ“Ó³Ûèë@§ ÷¤S·u‚9´‚wRRÔ|ÛÛ~²¹%˜šš¶5MþHŘœðÑ*†“nôÁíé×"&œÔOYŒB%@øgß‹ñQˆ§ƒ®b(%5ä+11A=ógäœ|Cçaìé»aGÝä0ø·Þ(›Q,6¦s­Pa>à kLøBŽâX2ÛÞÿ~{ÙË¡T(r^€d·&J}p*µ †‡Ópêñ*,œ¬ë¸ÖÌCrT-Yáü[R ­+Ý\ìK è+§àªCcÄñ {z~n|‚çÄ¥ “1½ö`L2•Œ [êG³Žk"ÙäþóÀÐè*„X Ÿ°´¸ÀU *C¢­[+S²£Z.¹÷Ô·qlÝæV«µ ÒéÐK ȈWì0õ•<ŠÍwïÞ¿ú+¿_»åVxìÑÇX!†w5Ï-7ÅÙ”%5€Ä¢Ò¢f»J2TóM’ÄS5R“$Ô‚ç×U-3Tg%ž{SµÔ’*(½7Å]Ë eØMò(®‰Éã°+w;Öÿƒ'A>r”oØÏ–ÏÜöŠ¢Eš«ûâPS@ï[ß»ÞüVÞàh±rYÏ ¸3»üý;RC £E«y*#­UèRÕÄo8ìm‘tSÊMU "6£ Ùü~ÕnøÁ5hÙ¼}7ÀPêù‘bžOÞÖ‘·—ë´Kæð–Fm«¬] "íp,Ráv©Y…þ6== ›¶lŽªuE&µ„ßPFÆÉXýéZKaýúÑ$Þ¿m-ãôÕz…>h*f6Z¯LfÐ.4kûömð¡~Ž=ÿúõoÀ‰'¸ÖÍoœ,qµêŒß6PÁ3ÝhfœO \LÝÒÊ"ŠÇ®:ÙB—×·N—µä íº+÷x€ÂZ]è=(ùF„"ÅȉcpÑc·C×…A>uä·áf_H'Ã{ºs~ð£qcêïtÙKW] WÿÆoA]vbiQn)W†»€#½ƒÐ‹.øáŸ¡ž~ôxŠ-=éÔd©…¥ I`ÐÌü y9ÝNÎTá±oƒƒå pGöBi² ²©º¼¤”As·L£„T¦ƒKmè®W=ôTûññoÖ¡Yÿçz£xÇžÎSZε‹ã(•$âÍKÝ'N§€î3Ÿ®än/ÌϳAëÅ0Ô·øîØÍœ Öú‹€Ä9Œ"°_tj|j>w®½F Ó•:º†äÞ‘¸ž ÝtÍÿu5à[Ž"¬_¿Ž¯F:À¡¡rœãÛù(*å äs9m¡}Üš077Çzè%jW¬VxóPˆZ”f !•Þ(SÚ…níÊR‹”+Õ59%ès-àf•_X€Oß[Zs »@~ùvð§ó É’KÑÑÜuôâcwÚ!§£Ÿ+6á)™„õïÿìF—6Zúþ”#(áñêk«®ÍÂÑÿýuȺœó~2}ކ¦éý7 V“¾¹Ù(¨ùI7¨7+©.ºùãw±l$®¨óýÆ]šžŽòG ξ{ , *1¥šØs=ôé©iÈaèÓ?ÐÏ䕼v¿„ˆZô6° CæE‹><4xññãÃø Îy ×ÉúRÉÁ×´Uæ¹;ÊmW5MW›š±¤kàÒ׺ž¶þfÙJÖé6A†—D}tt4Pò KÝÛׇ ¹Ä-‚¤‰^¯WyCñÙ•7#s•Ö=gbb wæ>y>K+WWäô¹h³YX̺íƒß{Æ„Ķ1ð¾qx‡g9ùÆœþéåÙÝ@1$áÃC\¬o¼.ýå_LowÆÙÉI:†W¾ôXÀûÅ¿» šY´^#¯S %a p#UŽ@d2°äª4ªvG=^¨z;YēߚÂÍ~3ä~"‹€^®ížïa]E—_Z)]mµ•0)õN¨š¸£¡.5·^IKðIˆbÛÖmÖøgmÙeÔm‡ÐÞKs };ît@‹>8†Ø «÷̹ôg{ºu ]¨º$“ø M0ì* 6® Ò# ~ðX•<ÑF¾éòƒŽ!G— Ç,s©ËgšÏLn¼i'TƒªÃ¸K·,2ÖóVÝ¢ÛÌ7y×ѧaϱ µyZïþg”„Ùòeá&X3ºbÅME‰$RU«…Ox²Ð„Ùó6ÀUø nÙ¦à¾hŠ1)L)}Ρ\ÿÚ« nèWoþT—p1¾“‹`mh¹I–ŠäÒPBÚÝ×? vÿýzŽÝ6Žaܸõº œ×ðæçÏ[͸¾­×Vͤt8ô Ä}´8º.žNCß@†—yn J&’z Œò¨DQ m'RŠH@/I%¹ž&íÅ÷üþZ$äVèMk£§§;%´«C¬8îÖñAƒ¢}Áúªú|æ'|BªÇàsú9Ú•7v©gºÉ„ϱ˜:á’L~H€ÇäÅz‚H+¡v<ñ3*)É«I˜1É7’ƒš[\„æ‰#°óé{``(Þø´¾ù6!NlèD‡®XÖ[žÆ4¹nG*M8€‹qǯü2œÿú7„uftKÉ‘'drämÐ{Ë›¯ãÅwÓM_‡V! éáWá EO¨UU`—nàÆ†ÖÝ 7JÎY±<³$“èä×òpä_©]y;|%•t´àç_|nºîfMȉàBzB†"¥.~?ç$¡¯§ŸõÞ)ïBÇüØÜ5KäÔNÔAl¸ƒR;ò`½¿¯çò|±”Â÷oœÛÝ—µÞÞžË3 —ãtõ½%w¥·Ñw eUÓÝPš×ˆ¨ŸÃ‰-¾V‡ñÍßLw›žhB'‡€žn&¡žN@ª‰@o)ïÀõUs‚±|BŽ£,¹¯{‘›ÍÕÑï2É7n;]\‚Êäl»ç0–*²\Vó€¤0(­~¬¸j=R-8ƒUŠû!Ì£Ëþ îWîk¯}ï}$Ò˨n:$\E°Süüú×½søÖ_™IBϺע…G¡šS±;ØVÜèQYjŒvi¬»ÚÄ\ÜD¼Ò¼Å…ÞpSÅ¡üÜKœg• £#AèÔtÔµ¦h'sÊK¿ê;3ñ—-ºê®$² %’çæfaݺQkL´)iB˜„H¢.¨»[^ˆ½GãÁÐH^–˺à\:‚°Ú××Kã`9Û®ÜiW¥Ð¬—; ]a¬²¡º‰ãÚ+zF/´Î†Ã¬Êq>‚»‰±y–baJŽú™8®*Ÿ‡JNºP†ž™Sš`S«×Y:hU2ìè²ç1þ{ü^ØV™¯oA~øY}ÉvûÐNª8¿“CŸ¸‚Ïß_nÁÒ¶-pýG~ 6mn{ž™N§©™šÏkÀÞIÀÛÞ‚–Ý«Á]w}ÜAŒ·] G2Ø]œ4qïóM™ú½¥Àï¦%´²“ðô¿d`ìW7Á×Oâ‡+ïÆ+OëY®L_‹M³x½Öfâ·ê{áÌ;‚¹em xÝÂÇ㳨+“b!¯¸ Ž%­o¹æ«‚‹åv½Ç4ñP‡‹qÝSOòªSa«(ˆXG+Qééêbõ•\wj)U»¼‘|` ®†P±Ç VèÉ’ƒÌ{xXpÖÀF®¿«ùæ¾l&“‚&¸ëNäÞ‰½PÝßlJÏ;ÖÑ=E¢!ìsºI¾Q\¾¨I1™§…­§€X? {Ÿïñ“h-ó-Ôú†¶yˆâtîº&Ï%4Ñâ@µÏ$Sð’_ûÏpþëÞ°ìþ`æ¼°›˜>÷ðP¼ýí¯ƒ¤ðáßý4tõuÃy_ “=šw7ݥΧ´)Ëî3¤„¥=-GÞA°ÿcF¼úGà+¨D ð¶—Å?Mß× ~*7ê’£kæ×Ø©u÷ÒµòÞ•ºŒë:A.ÒQ€Šá“Ü}F *õRËiËlLö x³C0¯MÄëí´nzzº`lýhß¡ÃÇvâ]Ó«tã¯FŒªCšOì±ã°nd„'¶°›-£³Á´ÇÊð@è΀°ŠҚ æ.­Ž!úkvû r¾âû6› .Ú '†4IôU9Ž÷4›Î÷5H«œ}.Ó‘F¤˜E*ýxvÞ{dÆú¡~hZ÷4§‡ûm=¹"ŠÏdû5 [ô’'›>Ü× ïøxɻߋÖwe²y|‚«¹’eè…Ÿ~û› X¹ þíž?¯üìÜw5ððꌽµe÷õ˜À¢[ù`R‡²“4€251ñÀò‰//þéaøÜ=èAÕxçkÌvW’P»]z?؆ý˜P’cR…¼¼²x= ßë’5ŠÓ•Õfv»¯=Äóý””KàkÔêZÚ,Õndúâó”!HX›ÇñÖ-çQhu%œ»W;!·Ú@¯z¾Rl™[„¹…,lX?¤:Ö?ÔnX‘‘f%¹¥˜2’ ÝvipãûBÇÛ~BXeM¹læ»:/ "£ÂÕß•;æé&rÕç r£Å>ŸÍAuz v=ô=LIhÎä ùƒÇÀo¶„$±F]FÒ¿²£'¿l¦=OÌãë}­yëÊÃ+ë7¡gxä ëÆN`ÙƒîAšóV©Àà@7¼û=?‹gâf¸ûžÃžë>»®¹ŽÞ÷=ðšEŒÙÕŒ{ðŸê†~ˆ–U×É}»x®ÒeñøíwC&y5\xý:øû4`¨/o$7¾þó_G€oÇ“™КW '/ Щ7Q¸¯”ؽúõtÚ¢;¬/hŽ•è·ëp D:ӪܧP„™wºòÒràƒi¬VòvËæMļ{q¥²úCþêé¤Ñ©±uu 5·Ì-ä`ãúeUƒøÅ”ÂDdÑ2!"ÙæàØ5 %èlU8{î)b5Ñ•yË ‡)YŠJòÔ""˜ž©(°Êí~.ã“%f®+9(´æ…¹YXÏw`}% ZÖÚÝûA.””"« O¼¿‚)—Ëüɶ®Þ]©4áDO¼ñÆ-û®x–$G"Øk6Þ‘qãG†záÝï};4šÿ|ï`Ç+þ6í½ÆŸ¸üVžuüÂMÚ²ì†.«ÛYƒ&;ôºœ$U8 pÿ—¿êk`ï àþ¢îïÀÎ _" Áq¸ŸU2µƒ=ø2½z½4•kÏK 'Ü„×÷áulu­ºP¡]’x6˜TÅÜ îm÷ø¾"?¶sçVžÊj†F„Ìv+*`hÒ÷ ÐÒÏjMÒkoÝ´‘€~)¬®RiBÊU³è¼Ýú,Žï²U ‹vsÆÖ ñ­Ô‹’‘XÈ?dÐk–™m³ç˜L†«â[ú‡/RÐuƒìh0U•ŒêÀ"r “tìңמ=Ð;ÅåÙ…èù·;aÓýெÆþ§Ð¢/¢UrÁ±ìûË„ÅÊ,Ø8Ð4øà‡þ#\}ÅL<útÃðæËht%ÈV 7Ò:º±u–æUü=z-ãßÑB·f@õ·U7C Ÿƒüþ›àmŸgxB k ÕnásÒu%; JÚ[Yñ¦¾z`8€ßÇë·Ö¤Ò–L¦x>z·N0«îȈó6žû.¿ºÑ“2ƒ‚¤¥}4aÅ<£…hAlݲ‰ÔI÷ËÉ8Úv«ôzÉT‚ç`…1Ù|¿ÐúÑÁ0›0 ÚíW( 0ƒ¡}£vê™Ï!¨ïZ·ê.$ý<¥øA=ê"ÒþJ@7tXz²Ì•jýY'߸í”âò™)ØöÐÝÐ-<üyZOæB¤Ý ™(ìò ´ Ni+«ÇÈrüw²]”$º­ùDO7¼ó£… »÷<ÿ]k6›¨‘ý¢lÃúAøà/½ àÓŸ{üŒìú-èÞ¥ÅÇñCéhÊÐ3ßL±å¤$°çìy•Ts†ðCìNÁŸ½s?œ1ycu—þƱºcviýLOþ ^ñºsU2ïBSŠ¥N.“·C-؆ÃÁ[´¼”­)‰0éfæºEòñV¢N‰[Jع}+Ý{åª[t£b¹ z¡J O Õ©õTHa&fsE–ÐÙ°nPëhÉ•0Þ‘ÒþXËš ¶Ô䲇Zt`Ô«‚§2E—y¾šºIm­g£+ŽËäÙ…yè¹ë[0zäiðû öäh.¡»šNp‰ÆmlÊn`÷"åu'豓xüîjù°ñÕ¯‚×ÿæo‚k±ßV ìñÒ'ò^6¬|èpCüßðØãÉס5ÌTYãRKÍ›Ph)1ÈÉ¢ëê+ÞTáÒøŸm‚Óƒ÷ðÄô!èû{ôAjB»ß#c`7çŸJÏŸÅëojÀ?]B¤J$„ŒôKHž-3Iͬó@9I%6¹U”o• ²C^©Û¤)  vã†uèUu]Ȇr3ï«™uvÝ©ä€;ÍZ ]r}Ròùï†c뇹–íë®´¨+/—üJ`wT0Q vS2=Y'ì—IèTQ«ë™Äè¦Y…jå4' ž~†'Ž ]::Í)ŒCÓŠ´\¹Ü^¢^lCûÅn$YW<_?À¸<;8ïùßõ;wÁZ]è 'OÞ†¼L%áü²²®¤e.©«Tx+øK Z© %ý] ø½Ç`çŽa€¬>œ£dÝjRD›Ënƒ\FÉÌ‘Æ ¢ù$>÷+¸ª?ϧ÷%›5°}«2ŒuÒ \cÙù~0’ff¾›jS3ÍYF%~Ž€œœßÚ´q¬ÿ™ÃÇv»B9-:}ØZ _f°ÑljÑ¡¤`:Í Å2¸õhÙI ^5­¬ˆäÓ£;ÇÎm´oÓBDL*Çè<Î f¹WO#©JpU•|Ëå¡yßÝ0vëÍêICi> 㪆,DÜ=—vØ!;x*²ð6Å4«4ñ³?Œ è©TÞù{¿{_{}Ü»_Ui&ãÆSbÎ.½Ñ÷?ÏføèG>óÙ/À¡ƒ@¦¯7EV¢M‚Çoy¬µßj¥x›âÚÉ4|äêüì+Ñjç[jc×oì²viÇÙGQÚEùê«§jÚömÅ•ýº<2Ó¶?»ìi†¤ +2zÔS &ª>†ùYè {“\feš¤±ÉYF(âiZ,OJôaœÞàà‘KñÉ«ôÕœ ޝÅnWW†­¤ÇŽ€Ýìh”4#ñÚ(AGí­QËþ¬Á®'(÷¨8]0–ŒZ T7˜ýDqfÖùÌ{×lcf¤e5)¦xø |ÿÛvÑ­Í uè$‹.E¾eL‘!–l”zmúVÙdãéHж3ôäœ~ï¼ì ¯ƒW¿÷½ôùÅ2Ϊ[vv:^Ô¬C¡ËÞ½»áw~û#ðøãOÀÈèÍcm%Zæ~íÙÙ9Þx£p°o° ¿rñIdUm_&ž¡Q/Ûz•UÇåÁ`4ß0rsðšúþÉ¿¢Qû<5š$^²Œ[î³<74I%jw š·3j3NàZ^¢®àÔj¾!vɶ:iHü è×VŽLê5¹cÇ–^Ü$/ÅÇüó*ºîÞ*TfÈ¢gw%pØehÐÌ^F‹†äx¦ga݈ƒ½QË),Ëåãv¡øÉ"(Y(áÂh(¿rOÁB5/PmŸ;Ø”ÒÕ±)†ùÂâ"䦧 ýÝoÁ`!Ëʳµ£§˜ÙLº4CZƒS¢ BÖºTNlS—ÒRE® z}}_³CÙþFÒ#{ví„÷|üãÐ72gëb,ûºuë˜F™yjÜ¡û·nÝ W_ýb%2¢ïüü>|„3¿7qu4à¶à?Œž§YäÜ8™`‚|4 <Ó,Ïjá3³géÛ°·ìûÐí¯.àí§6ÿÞ¹µ­´åjÖ¤ÒÑêë·óuÂ-‘t‚Z­7y­„n9=˜¾¿Ð#˜CÖâû¨êDõwZï<Û7£GŽp“Ôj DÑm7oÚ(ðù{W5§ú±WíR¡AXÛÑì6>i‚t?´™¹%\<-îkÐV†“-mĺª5»RN[zËá!ŠºÅÉ8W¹îŠëóîrÓ‘Æ3Ò²Y€¯| Ò·ßû-8€Ÿ»P©Ë9 /ª/´ñ ØOÀt]fã1ÉB‡3$_ÔÕIº" ¤ ^ÓèÒA½nÃ]—]óRØvÙep¶/6Ø©¶l„n¢Äª‰ãIûœ›=pm©Š»ð†ôQXçÏ”¥ÉšªÓrºë»úÐ{ ¼¶»#- ûši€Z¯ó¸¦ÖóqÃÈ@DÃÿŠ*{ú\±T‚~ܘL®ß×땬þ÷ÿí^xê駸‘å'n¸6l<½Ç1CðÒ÷&ðNMNÁÜ”9 ‹‹Kð¢K/ƒûî»öì9ægg9÷AëéR¼_ v4$1Òzï…±u#›—zqC*­ŽE÷VUt²N-5üPFÝoËÕÑ_Œyj gª/dóPC@±Ú¦™S%£Tƒe­»Ð‹GY÷pB0&B÷Ìè –ºrt,¦vgRZ1 Ô€œN(+ÅP³ }úÿ|Æ¿z Lãg]Ä»Fƒ‡º4‰MuuãÉîÁ¸½2xM÷büŠ›_¦§WŲx_Š×NB¹†®–0¢ß)!C ºô{>nxdÖ­_Cxg•9Ð+…n:þT™cŠ„Ç"ñ,ÕÛÇÇÇYÝ—ßâ)&$„+Ýq¸X¢Áx–ö²P.û}*Qi…kÄ·M«F¢gûßZsþ Ö@÷õyê|½/lx˜cñ|ÎtJNOO#Ð÷0͵Ùò‚ÐŽ<¹*†×\}5<ýôÓpÁKIÖm€ÉÉq ¸7@2.óssìÁ=v” ÉÐÐ0ƒï|çNÈáúyù˯e½Ãƒ‡bèsI@ Öº, ºiÓ†õ3³ó;ð3"fü•»Îä'¤E6@¥UÚ ÎS Àæ8ZWa>!ÑPÌnÚ8¹Q«¡Ð†6Eã4pÜéã¯=žºª£‡+x³·`8… ÷Â8,T‹”,T¶Ì·,»Ô±Ž´Üx_»üjÂ&À‰›ñ-Ç ÒýjHeºàÖ[¾W^y‹’’Žßà@?•³”•B@/bXvï½À‰“Çàúëo€ /Ø#ñ²ºÏ|FVnyüY6lƒjµ}ýýðè#Ã+®½–é±ýƒƒpñE{™+ß}÷¾}ûà5¯z5¯ñ;ï¼­ø>¸á'_·Ýz+ìÞ½‡C .¼Hy“Ri-ô÷õá±]Ŭ{kµÞDà$é˜ç‹Ô5€;{`jRÄuôÍÆšœY€áÁ~ìå¸ðLu&S휦|"ñJ7’amàÉ&ñ‰¾Þî0& Å`…aܽM6U‘rD°û00´ö˜yŒ ˜päOø³Ø”¹_êÚ}'pÚà[hÛPškœFgĹZ/ÀYA Æ|Vù©S§`bb‚ÝW–ÔÆ³Ð#pmù1è¯Ïêä›Zà­=;zÃÛÔ§¥7ƒ N÷E¯{úÏd3­Ø]šš¦T%?Yyè³ðDölºâ약üš—ÁÓš½ÆëÁY#~Á†ðÍ;¾ Û·oçØ›6†]t)o|µZ&&'x æùç_À³Ò¸.¹änþ¢PÐu_R]•ž¢¸Š@_U‹^å|“”IR¹X8ë–¯Gþn1Z–rœ€ÞÞ./ÉÉ5QN¼ˆ¦¾íÇIÓíæàN¸5øj/dÚhHP‘,”_üÖŒh+ŽÎ8XMc'—ÚžäÑé6¾y,hÕßs†:NgBÚ †àÉ“'#.»jC°¯t¶B0Ihœæ5]8ÀÍ>››“ç[b`×xž¾“@{ú8ûVÃðChJjs.JÜn×[`ËÎ àòK/†[n¹^ÿú×+íÏW猙p’šøÓ êß´¶oßÁ¥C¢ÅÒ&ÈOUb(Ù¶gÏ8rôo&oz㛸IˆbpšS°^@ SQh``P'ú<–/Ûºu—šÖIHÀt¾€ÞÃÑ©T*q`õ€¾ŠYwPÍ ©kÖ¥JY:ª¾e­vK0ÏžG%­Ê².@«v×ëÄV{X‚”e Ø%ˆ°×w9×Sï’RÄ+6$Xè†@×V±Þ¨ól[Ô”>±é˜òLÜ=6?[@+ÅÀqºq"ÞàÓ ÀÏ‘9µªA>ydÅ;ƉÊëä“j ;«SðÒŇ”t´“ ‰1ô v"ÈÏËsiÅs¦–ëîwˆËíÚUKÏ<’Ö&`uì¸!ô{Çoza®…q9ðèÑ£°mÛ¶ DÕb¨€ú ƒ.=ÕÏéü_tñEÐÝÕà ãÍ›7óz!ïêk®æó@.ÿÔÔ¼âå¯à¸œƒÈZ¯[¿cù1ôk"˜~ÅÚt¸Û’¾$Uªh-b\ÿðå¯É\®ðwø¹Ê«hÑWè5mÑYr§R®Ç$Ædœ†Cž••—©ÝÑ@\Ê¡Œ Bw~ ¯;çfämtHÒuðö)>7@÷41¢Ž ·-ze¤††îq'—Ø€Ö¶ú»óž`èZ;44ãøñ㬈J±¹Ô\–¾f^=·º*Y`•“I#ðmƘø‚^•%7V9H™?"0©G·,Ö‘‰Õ•¤°°Ræ«$úԗັ·Áá£‡à•¯¼9£#£Áùy嵯€ ‚w-±‘p¦sN‰Ùèš·ZjÂeÞ¹Z„ß_õ{|}}ý,¼I92¦ãÍ-³öèþùù%È£¥Ÿ›Ã[ {ææ`q) 'OMŸ˜ù_òÿoUËk« ô†¡5ѯ"h„#"†ZZ¼)W;€¨S³©›07ŸeVÝèðï‚ʨë1.úêËÈŠ ”UOèùÖÆuW1zübj¯¶»ÞÁUÁ‚ö¹\(þ¤¸|rr2ˆËàÌË–‡±ÂIE`ÒÝ À.Ü‹2ŽrÙ¥ Z©ÌDÀíǬ|àÊߨy@§÷kAÿÜð¢Ë.…TZí‹"oC•\ítTX.Tã”j:‘ÜúìºÉà<û®ÃÙy¿¥*äªSÿ:•Óˆ±”ÍÃÌÜ" Eojz¶Q(½¹¹Åf6Wh5šÍÌáóŽøÒŸÅðá(þ|ßç n¹Õ>W ¯µª@¯j°s«(Ån"ÒjeÙz+ÖÛ"‡–¡¢^÷ ÜDéd ôB*Iª2ŽP›–f,µÇ°\&Š>©Ë[Æý&k^‹Yt“ˆ;/«Ay}N¯AÖÛ.¥‘ ¯ø ¸,öÍ=©nOÃ¥)ºìcêŠÐ²B`)Ò@؈`—×âx?îÊw(½i—=ZƒÇ7+,Aê‰Ï ïèÛѹLË=Ìá"i¡AÃ=hV5=Ñ ÀJ­Êtéé™9´Ì¥ÆìÜ|±P*×gfæ‹ù|±–ËrèÎNã+œÀ—˜Çë!}K¿ÏvêSWÆdmÊj[ôŠ)±Q ‘¬£{,,LDÀ^vHÔµ×Û£ŠBUÅqÇÌ£uèïáRÅïŽ m.±æ2ÇW¸¢":N˜«c,eÇèçøEœå×àÓG ¦x”@>??Ï:{Cè¢o¬-Â+¦÷ƒ[+[*±B¹Û›p³¼°?Jv1 ú2V7·hí¡U–1êšõ?“GwÂz ¥{࿸î=ÊBá9§†&ê®$k\(–`vvfçÑ[)7gçJ¥rq!›],+%\#sh‰ ¸vN¢¡XÀÛq\gKx{ÃÕE\Wò\Z(k£7LÂD´~nº‚¤°Tq#‰º(u6LÔYYy0CNv™ð…2ºò)¼&©T!1þ† »RÍY±ºœ –"¯ô5›çý°ü|ôM\N '°s\N ºÂ….¯×M>#¹)=¹%`Þ(—ýòauÛô­rZ´Ù,íµ6¸-`àË(5Ö·2öAO´gìâ.¨:Ÿ„[²ûàѧN´ªåü,Zí,Zâ‰J¹²´˜ÍNÿÔë^³xÞ†õ³]ë†ò7ŒÎà‚Ê'\w½Ç¾rkÖÉ %T[ ÓW§ú1ݧ= fÏŽ%ê:¶©.“¨“ÚZSìD%l¾ŽW¼¿Õ¾ßÔMd+Ÿ*›v=²Î;{ý¬d¬Ï"pÅj¼#ªùR)ÜvŠÑ™ƒ våÌSpáÜKþÙâªïAK¾!MêÿVü¬=-ÌÒQg×Ü™wM @ ¨|Q)•ñDTx²gÂÕ–]švĨE§0£›Êkƹ~ÞÄÙ~/:VDŠ!+N@êå—c¼´£0 WO<¢ÑÔYvmEÉzS–ý¢>-#-ËíG÷t»K)˜— ÑÄŸB/ö»ì M¡ïðb ½ào$[5¸|hü2Ø8Ó—ÞðíN3Û­ŽúýSÿýàèñqøý?ù$·YŸó@÷WèuôT"ÁTRGØÄ·Ó€b“&O“¨Ë;3sÉÂë,x½Ñ‚Z¥ -¿™TŠOH"HèÉTC%vœy\¼¢V«Á/1W ‰qÙM\ÎYvtÑûš¸öäƒÐSÖ¥4ÏŠ•‰Ë~É ºµ­yp>m€Zí¨2^V‹Ù5öû~4Ë.cq|'Ë.ñ³ÎŽ£·|º7MÀîë÷CTNvÙ8{ÃØ:¾~ôÃï…?úÓÿASV`5[¾Ïu‹N/V7l2®Qh1[Ú6>a2’¨ƒNõöΉºˆ¯ ,[mT^¥ '›Šhásǧ’K¦ ôI5Z‡Û+MÒHí1?zôB$²àdÉÉ¢“eçj•ñ\\3þìš;¦’o2Ö}¶³`K7p¿®Êi^‰dÌyúA¨šè[.¹ˆeÞ:4ÀÄ6€øfb㑈<³‡Çàá/ Ö]øØ<¥Á¾’èOpÙ|Þر}3†1Å ê\¼8¦ûh¯Mº¥dœÔ-À–n|"ÝÙ­ÇD¤s;9©öã BÍýŽ2ýdØm qHù†2õ³ yXXÈa<ÞˆÅñò\ú9e¨¬D]{‹ óL!/ˆŽk=¦“ÏÀUã†`ò4 †8ÖaL~É€º¿áëf{?lÄojŽzDËšþî‰à~&Õèçøæïú÷–ýºÚM7¯ÁÏñ¬iu¸ÕüJ{þÔ#/»>ù盀@ÞvÙwéEðÖ7]›_åÜvÝåêv¯¸ÆýbùäJ•Û-b¦)§„ci:X÷NâHRD™âÞ€i>u´ªŒ£'}ªÆ¼+Áj–R­Þd÷>ô¸ÔSž'Î<»¹¾/Ô|ÙK.W„9ø3φ'Ÿz’Ýö\¶U*AJvË2¼²ø8$½jhÍe%;ÕÌ» —]F=1c‘#Ñ™ˆ&Ôl¶œ5´0ʇ¹í£ÍBÌÂK?jõÍýÄ5?üƒÿ½„«ᯡgXœé\}dß«5ܺTè;S£%kÈeäM6f—Ö ªx¢ÎR¤‰¸ð²M¬Ç]ŸTC”1`eÂ~ŠHMÞ cô 7ŠKɹ³dù¡–ësËäÜü"«óNMÏò´™é™Yîâ«ã1¨£wCÝVU¦·ªyá"†¤oÏž€-M­Õ.cCãH1†%ê^L–]F¥xÛ2îÐîÒûÿÝ·~‰€8§{­ÑŸï,e<~ûŸÀ¦}GáÂ×Þí&ç{Ym…º”L2m"Åb FG†Á¤?Ãx]ãdÏ$QÁõ2‰:!¥5##:#šÏÓ™t?2Ýá²ê¨Þ(pÁ&y"gèb5w ÓnKlG‡KÔY¥vrj–Í $ƒ55=K‹Kì†#x…0Ùd%гéhóK0ãЕ™TJôvwqsGA.R¸~îI¸®1§Ç$[ß„€LÌ·‹úÖR› O¤Å‰0¿]® þN€[r™û¥U»—–§!qÃZšìƒ»þןAïú°ñ§ÀMžvZK*µ s;뾺ÝkÚ¢«òé·W5 ¶mu‹Î3¨:,°Çu26êÂPÝèÈ´×ÒÍdK¢Äö÷õ±®ÙìÌœYapôè n‘}®ã“׊Óa ÜyT¿%9m2ņsó ä"ÌÎ-ð&595Ã|ëB±Èy WðP‘Æ<ûM¨ys]ï'W[ºp‡šNj7)Á³ä“òd¼d.*N “ƒÓ¨ª,»´$Ÿºðu÷¨ÛH) bYñ:2Í¢ß]v°ÚñŒ|´Ä=ÖáßE$³4Óè8þÔã—Àõ—°çÚÂE¯=…»ÛŠçf,Ýà$/éQ$ÜsÓ…_ ‹^QÊ>÷Û­ÐqÄòöì ÀœÌXcLd£Ù',Ãé -+™RzÙ½{/„S'Ç•ÞqüØ1¸÷þGàü]ÛΪ'U\Š÷ …ƒ™h˜ù”ç¼ÁR.ËYZʲÏ‚™^Œ¸þZ؉9;“”îfÓG™TÓ,QBPZz|Э·GYuÚR òHúX« o8y? R)ÍMFåé,û¦L˜“€»ìS‹eÜùNíôêçp¾B„*ë…äÉj‘*ü é0™~šïÿù/Âî[áåW¯Þ§Ê\}²ú-K&8ضô¶í!iÀ;4³Zh! ²âÔ µìøŠ»vòQØ3$Yrߊ§(;¾!âü>ª÷£–ZˆöZ8Ä“/'Ýœë€Ê*cÖ_„É5XÆ¥×’ëAbJÉÚtz&ü÷þ‘Øô¤{ŸÄƒ<¯w ºFŽƒ›ZÀ/½g’d«¼õeçÁ7žZ‚c UÝc~Ž}•¥¤èRnl¾Ÿ$«AL3o—+fF½QZã’—IÔÙ¼š¶®¸HÎcìÌq üœ×\s 1>´ÿan¹/¹âT¿yÓo6Wà$Yã™™yü=¯³ÒzZ‡P'̘fÁ N¢_Í–YdÜÚëp=9D;׿ï°C«`-³‰Vkéè`¢ˆºc|ßÀ` ³6D­+4ÈÙš»¼ù0ñ)‘‚ Õ,\änH×*Ðpœ˜Ë, ¹½œÝª”Ö)¾¶ãî€O¿Ÿö5–‰ù!¶I,ÔÐæ)ÛýËs?ƒ›ê°é\­K'ƪ®ó#zYí¦.+²G¬ÅÑŠ‰è¼è•S˜jíúK»K{nr<+oï"ŽcK<Ûq¾hs(ìŸ}=5sݺaRÖ‘´ØÉ+©5à±GŸ€ûîˆkïVj‰Mg”µ#ºïú‘M½Uy‚@[^'Ã5'Ã5ê«™D*’~AÛÇ"†ž¬™Ä«H,ÁH æ¿–ؽíņBK¹š-H + ŠÁä=² ¯=~/¬/-€çPKù0Æð»{£5oè(ËÄÖÀ Ú§OÊåÛuxênsRŒkf¨‚ÊÞlÿÄB­–·&Ý(¶‡Ðl5 2 °åU›£õvm¬áL¸ò"*Ù¡¶ÖÆÑ½@5cKym¯ב2ÙÛ%Hœ22ï:HmÅ]›©¢ /øaùAñMü˜ï¢?¯£×)Ȉ¦ åêÛÅ& 30žðŽö 8Á½”Gq9ù¦¬8¹î¯Wžz.ž;Üùl§qc¸]ö¾d(½ \i¹‚µ…e@—ÙÙRtrÕ#›Œöô\ŒÁé §Öü´—µ°èeŽºôäLvP[ìvm3š?£¬|`Ù)Æ ÜxKç=Mèë¯ÔÓ)K.;-¸•=“ ×I:˜Q¼vªQX`—f8£ ÿFÚy2lêÒG@øzRg8 0ÕÒ³¸-^vÊùë9ñôoÉ‚'ô —H8°wî¼üÄ~HµšÐrbò'¤ŽºµÔ~Úò:”¸ Ð:$Q‚$šˆ¹á²s«²¬‹€;v¤]D7'5nª.¾áâ$@n]öžÎ ½ýô9)кqB/B3ÍÈAŬýÓfåCêlÄѵx画ƒÁL6ˆsëƒpWŠNq{ø0 3DBˆ˜«ip©ÛE›³"Ðf;Œ£µËmeÅÑvV\U¿$y¢`ÍÙV Ü·âî¨{.¤íHË¥­CŸ ,:Ys‘LAFzpñüatÙç¡–ˆõ]£ç#F´Ë@»Ó[£?#‘©„ E·ON7ßóêÎN]$d‡†èð:‘Û÷w,×IÕ¼â¤r Ü:—k¸Lü€ž>€T¼À‰o?4 {&iDq¨ÐÖ¥)/ãJ/Wsq/:EµFÕ»×ìD\›7‘^›h¢®mñ&gÀû‰øíW·Ç쀰iÝÁ±¾¿ˆZp{xT̺Ó#]é‡{ïë:¹ 68ßê)äœl>íõ€žê¸jàeØy”ž ê»)øÁîk8ñ±oâI&ÞøZ{]d\Hž.;)Æ´:QZm°RaË^xp&Ó…*Ì” pr©†6@§.ïæa-íl¸ÓÔÌa™$\œ]Ç%5t¦ošN¥Á‚½R@ÿ3(èþÂy¨@zkm²î¼€˜h䇣aõ"yî•“6u£Øm6çÆÛ^-CÕþlÚôéVÚpbr–mµºÐºË؃·±ôèíêQ°X‰‰Ah%ž5„§ÃÊ@[Þ$$ ñ+>÷N‡Dt°8®c¬¹®—#ØãXè[·ïýI˜í]¯§n'µCÒ—w^ÀðæsIªNutVJ€î¯z|ÂYw¡É/Dø ,->ßÇ.Ùå1ò[eçZÛ²õvKY2Ro7 XhUG»ï˸QWÞJÔuª·+MJý`ÙAùÒ±×1°Û{аcwÛÌKëƒ(F±\s`É'&ŸÉÊ«9ð*ÞöóG¿”+8 %6¡p WiÝ;zÇtˆÊŒ®î};_ K=#ðšgî‚­é<8 ßÝ õ¦Í®!ȧσœ;9膉zN–¨µ„*©»iÈdBv~µ&$è|õ|ØHƒ)Í„–h&^,›°[ÉÚwª¥Ók'RE\Ó€@èL²!w¨/4I@¥æ”j¹ˆ /Áþ{î€b>‹ùb<ë¾úM-Ê¢«L0i¤×ª4¥"%þ·IIÙ#”D4öŽyÛAìk*Xõp庴Ð@˜©¤ -£ëÙé(ùeñ¬|‡¸]ˆñÁ éˆÇ½"ÈÈ;6É«Ãn{øæ&+œ€£qAf: þ-ˆõXhÙoqoÖÌRS¥4W»ì)›'T¹ÐÌ•Ý/àjéáMAi`^ ‡ÁY¿ÆÓ[ä\£K›Kä7$‡K®Ðe΄€LRpö>…¯ÒU§ævаSÇw€ø5®w\Ž ë/î¶L{'_'÷R=‹Ðhd¡”_yõ:½/§Ò]Ðj6`zâ(œ:þ ÌL[>F÷×(ë.t–µ^Ub‹=<µh!̘ӦCÑtKœmæËKŒK’ú$€{ÁÌ4` Lð9f§\–Ë4•h¤UÖçn-_Wžõs‡xı\ì°¼u èÜÛî¸É˜XZD„JEl‘ZÏ¡÷bŽ©Ê»Ùµs+>uÛ1É®Çä"!Ñz ¶äÔ•F÷¤+…›áDZ5À@§R!÷åF·Â?'v¬zà—}¡@-ð5LAPWŸÁ8‰®yÁN:¡”›ãÃ@Úá¯cc XĈ•Žuú±DKdCŠ“ß3|Ò=¸“­¼z¥Î0£b1Jç0…×4>ðò‹pòèÓgPG_} ÓÞÜ䘸îÍ󯕕ð"³)4Êç pjü$TÊe\ÇbŸÓyº}RDÊ'&Å&ƒ(_­ <ÑJ)\¨TÊxY¯7í|Áœ4P é=Ó³Ó°wï‹ ÎðsmW^Èöp¢SVÞ¢ð…VØ 3ÛâvýNÄè´ÇíŽÙ $¶ùÄÕ<4ßO‹XžöŒtP«»òÆzêDªŠ‰ |¦Æ ,P˜DdPã֦ܱ|oV‚!-;º¿©â`?©rfq¨Ãì´c¡o< ÞI2¸éJ# )ÎãD%šròn\G„›…AqŒËMeÉ,.o6ÂJ(’Ý/áç­°Œ½Q¨Zˆn_c8ebôe2æ€fUE;9'îöãéšÁÛCСì´Ê¾5üõ ›à÷¥b&KMèI9ÏÊi¦sBÖ›dÊKÅ,<ùðݰ´0}NfLæ] Ó@p1ß]D‡3£ - šTé†MÆi²&K®¤vYr‚‡úé` 3Õµ/!m§— E¯jÏ¢v"9ka³×‚o¥ÝYH)­î1Àb+ß–(WÙâçk}zÚ-=íÕמµ»’«íqƒ =ÂYm":ôQÝsz,•Khh!HD"•Îà5ÅÖ6©'†Zršaˆ¡wY?b©ÍQ›¤c‡7ÒÒNç‹¡B£‚@/bŒî@?# ´ ºp“íw!Ô[‡bm{ê‹Ý#Õéq>„”["Ç ŒÆ8ýˆ,±¦©2L ø?;OŸ,ÂÿóýYXªúNˆ3Ü'8qäI-ç¦`üÄÁUûd Ïó× èœÀ¤lå§E +tÖÖ ¦KÚq¹Ðµ`#%"º‚Q_Zwr™Lt@’QDÊÞ{›·Ø²Óg*•K óÀcô3ËèFŽz|M>ÒšZt:é-¯ÅV(fÒ·Õô?«xOÆ2Ñ ,TPF²½¶°SË—¡%ñµú¬að˜TÂÙvŠÏõý†N™æmÛw@_ÿ@À «Y¶v¼á„+7ÕqÂ6XÇ ³ËjÖ›ž›.ö,„º3ÈPÓBGØ…ýêÚâšÇ ]Ò2 4©%‰õDb®P :ªÀàÄÒÅ×›'à5Lƒ¾«J¼%9¾w„Ë{¨°Bšj%舾Ef,¸ÙØ|þOï BWAð—V’~2I—]yÚpøzÑ¢÷‚Nv‘+¹à³è\{j¯»û é¿Ð>+4WúÚ}Ýpë×þ þú¦¯ÁláÜÐ{Oxþš=øvM_†„”É-‡{»q!:z(£íXò¥EŒÑÝZÆ=óµ Îcm~¥€JYw®Ç{[±®nJ<™ ¦*1%Ù¢w±¬5ÝC° -ö™+ñ-Ùi×ÄÅÀÙ|Ö\QËì8øNàº;úõt|¯D:Œ‹,BB• ÕϺbd˜†LƬñx\¡1 üž)>,E¶×\Úô!e¦Õã[#-5÷Þ‘V?½íAa AåPßl¤Rnü—.-AJ6  ?ye‰Pb`>”°I@8 VȬËÀ½l’¯CçMጩºkMzÃõUÅÏs÷}OÀ;þÛç¡T?w„,þÚ¹î¼2¸œåÇ&³X¥+.€ÆÉœ¸£Œ¹A¼Ì·v¯µÙ J±”d”|Põ]žÀ”J(}µ®nÈàkòàÌzƒëꆌc¬¼=:Fh@ªÂžŠo…N ÜRƎ©£˜dŽv½Àl:îV`“YRÇTÝD{r X1ÆAàçu}pZª”= *[E•¦oÂÊwkî:ÅåIÍz£¼…éC®Ú^ƒp*Ô@öU9Rõê+ž‚ï)q‘ P Z„à¼&ȸ4£ ¿CB0ÀóU¶OGÚMÏØ-ÁÚsÚ)³tϺ­ßG/­iß9½vOŽŸ†+þ¯OB×Û¹&+µ–1:ÏÏ"¯]ž¦I¬¬LW­V‹'¡¶ìœÁuT|™Ð5^r-™‡MuãdŠß‚\qEå$Ê«¢sò‚'7Òj«'“’ëJ÷±[ou…9º|¤ØeZ•Þ;¨A«z°±Èf0î¼r°p,”f¯í¤]´'Ì`GK‡zü üpô8&³DÅqÁÄËR[duÜèx¤!Eîºë‚¡%syQ'÷èu=‹m¨öROݯpLül¥t ¨š‘Ôe?{ VÐ1§Ã)ÚŒÒÍxäÒãùáº& RØìù+O9°LëkØ¢íyô}G=èü&îôk•{S]pƒ½ðØã‡áUðÿB±Z‡sñ²ºî¦Ž.yAù‚I*!‘£ƒ”3ÞfÒ]àôãB+Ì͇:š§®ËnŽ«cÚ0V‡nD-?ý#«Ÿ)^Œ‰„ ÜÔp/R}q´2Õ0£ãA’0̈ +1gÏxKY5ûF µÐëÖ´–*·Þ÷uKªŠqê'S]}¼@ÂZ‹EØLH[-WXïEb”ôzMe¥¥±Ð¸ç\º“R_ÔÆæàñJ8¡7cxú‘PA‡Vp¥.¸…mtxüý ¤JSДè©á¦CïC’È]øúCôšÐAcL®‹ûú›c¤ dl× Èô|{Í@ŽV|üÔ üã·öÃ_ÞôMÈ£ _k c˜æ¹TÔ&+Mn¹±8²Sáÿ–ÎdøjwcH+é¦~ö#œÛ2ƒnîd«gêÓº6ïéæ [¨ÁtÁ9Ž•ñçxT'Ö‚²“³ÓVöÙNG‰2ÊÒìÀÁ1ä³U™DO Ñ41ŠÁyp%qÿ1Æ4Í,*'ái&`Øn6Ç¡d[2"õŒ›—IG¨æ!'Ye\mŒ$—AÉNFâpˆX÷0''mbdÞœ>œq÷ëj•ôäZ‡ÞÀ×ïÁ÷ïáÖ6)#-vËIFÉeÈ,„†VÈNwPÆàÆoˆZ5«îFK¦ÏMåáÆ?ÿ<||ÎõËZeÝ è>†ôÉ©©„¬³”rÅØ‘#­ÿÚLbÌ]³VFV:uQh÷R$Eðþ¶¶ZP_—–„š=öµ3Vc@VÀ µ¥Œ®Q!£Ó‰ÑH4Ùú:&n>MciÖxìjø³®$µXíÒy _t‚‘»ö¸ñ!¡ƒ*FôR„.ºÙB/ÃD±ækž´bÿ09ðU)¿_ª™…n/õT‚…%éûQ¦‘VÓME»V÷Jdió:êòIra6löÅÀÈÍ’”e„¿jVÜÑO¶\k÷oàÐ\^—ÄÍŒâ[( è•*—…ÝÝ1ÐˆŽ–=Â/·uãâåÔXrOX 0B†I-%g.Â\m•luÔ¨ Ø[Œè4ü"‚*"¾…Ýv2Êë#ËLíš¾vÉùwO²¾;mŽäÚrˆ¡õß%³ø\¥2«“†lÃl}¨Çž0ÂŽNÈGïÚ*à:V¿>††³  D!Ç_€M{“"$¦ô'MH2ûÕÕÓ<Æè%ŽÏé”xøåý{›÷£//ÓýäÒ¸ò1i ÙX"ô¹G·Ü/éÇ5QaUµ‹›Ußä û4)tß%Ñu×=¯¿ÚÑ”V D¹ë¢¥d;•“Ò’Œ“¡5ïgxãÍ~½±Ïsn½~‚6ÑþÈ‹ðö¿ø{øÞÓÇà…vY+×½l€Nu×j¥ÎL´€X!Ïì‘lShÙ# Ù¶N™È|6e×ehqD›w.ÚN­)ëù°vO¼/eÐÎÊn´.2»O`£Á{B3Ót=]ØaI¸pÃ2õÓ³êž&Mçžú"Vf_÷Š»fFZ"¨€®ûCÌÒE´ÜòN೨…UŽ»=AÇ:bº–¦=.i©á(TÊÅÍKÖ¡¯1Ç€OQ"ÎW5xbÅeZºÁÄw¬|‰ jkc "ºhî# ,Û‰{\gÎð†)蹃ÇF‰çgÍ©G€^üï¿ÿ(|é®áÎ È×Ò¢¹À¡­µŒRŒéXù+aŹ6ÕTvråMVY„Yk)žB´Á$T¦ ”!Ãæ‹èx#“œ3?«XO——"!ƒym¡,÷Ùi↴´×ã±hìòõÄ‹¹' S,+Åáú‹;Úbóû»Ê’«y_VE"H¨=Íš ûÁŽ e}«¢n¬­PU>Ó"œWϸ3„#:”‹¡ë3óYèªÏÃÅΔJˆâgöqó E’L« érSÑi5Ÿ!œ²ä[ [+ûAôg+¯Fq8Õ Îú­ÿ„žÉ!–zÎ¥q ™Þnþ¢ïûŸ_Ï}ÿ!x!_rmˆ*§ÛF‰¬¢h°Äå_;r×;ªCŠÈ"³5ÂrWØ>jjÄœ¦ygZ†$£œøù&Âzy •RÁ¢½Š°³NX^‡m¡mž¸ì8à=–t”&NW@W£ôñÑl;ö”A3û2’ËRSOH÷[Xž×ñ¶Œ;ijîVNC[q‡uš¾j}Ü„z ,Ú‚Ÿ_ YëÓ<íµ@"õ8gšø:·TZº~K½Ø³=·­A@× @ò3Ä«ãy(¾2š‘!x¥5öð¾Ö‚³ãu¢8»#›³0¼áVÉdŒçâ­ª”è…ßûÂíðÀ±IøÖ ÔŠŸµ::ƒ n£^çEhÂEú´Wråí,«¾5ÖW—š”õó‚ùc¶õ´ëÞ®¶:D5 *á¨Fk²‹ŒÍSW€Ð˜‘ÑypqÚ©lúN-ÎrÇwKÍ4ó¸¬&ufž^ŸbCß±64ÝøÂª-:Ù&q‰ph©i5"’ÂVž5¿KCó•¨uxâ{B…(šY85='NNðŒ¹2‘šÐEk4-wœnµZOàs¿_å×ujŸx님ý¤3WÞF‚“¦ÆžÀs–,Ö8á&+£{_„,'CÒŽ·nÝghÒnw~ËO¤îg›kž‘"M¥’ð‡ÿxü×Û¾?*—µêÛk Û^7u^¢žšŒ0F¶tÒM¬ªyÔÆ]ó¥o¹×^ .)­pÃpÉ“šîišSd[ "ÁvÑ¢%0h“2 K馯@ÄZÇ{ÖCñK“•K²J…â"ÈëF¢¦zꮊ,~½áÑ;V›k´þìèä·šÄk…ºE¬AÏL4â–ßâ÷ I°§Æ'ØZç²¹F¥Z+àë”ñÔÑ+›ÀŸáõI|ѯãûO0?_.‘Hp±€TdþìÍëà’M©!¼|åÛ’Ž“°Uüb¥†úÝ‹‚\[-b-ƒ¦E½ÂøÜ¤H|Õ笀O}úýƒY1¶ùoÉ­ÏB`‚^³—nÉ|áîÇàCÿpTê?Z×böšV¤êŸ¦™ß¾Õ÷Igˆ\<ã^+¦–§[ëI¹“asˆ¡¿KðËíüЉ:Kyv¥`á †H´MYêS¢³•ׂx¡e7Ým®ÃÜv’X&7Zq4SÍÑ1¸+ÀIaVq»ôõ MÍE°B±X‚J¥ÊòÛtΩnjzA=…V:×(—+‹Ífë>¡€ïEåÑ<‡è»ñ¾'–g§? C?•mÁÿ©9"¾Ry¥,ç·šò}Pâ,TM€ž¦l×rßõU„Àêd ‡QŠÀçsêBfëùߓ¹SÖkÏ*ïï醊li|³³òá+É•æÁµ‘7ÚšS¤Iz‰8½#’¬³›P˜C¯{Ì)#îZD£ØbfŸGÄ#\7ðnæÐS“³Þ,,å AgÞR6 ‹KÙF©TÂûŽ õ¾ Ÿ?ƒÏ­ãmŸ;ÑÝ•9ª+#ÏÏkÃk®æ¡ÛëÀïß0ûöt¡û@^œèÒÄ«UüV!ü|š…„îvð•UfÁ·æ,Fbwµê&;ïëÝM@jÛžÂïûþÌ) çt¥àá‰YøÛ›¿ _~èÀ4È×2Fg ÓB'×½ÅZmÒ’¬fy@Û+éLuñ¬¼í·[|¸Î¢Žö+Y_Û¬;,oá…„˜êó _ƒDÁL)­q ‘ÁˆB w?1'NŽCv)E¢7›ì†—Êåj­Z›ª5Oz-ï|Êæ2Zú*n¥t:•ËdÄÂZœ\ú„4°ác¯_;G’°s,^‰’w¸¤üÚ«diîüøœæÆt¼FXNÓU!•°€`7(EŠB[zÃßÑÜ%U–Þ¾mÖíù¯þi„NMßB7Zòƒ³‹ð¶Ïß '— ðïᲦ@WY\*o5¡š"£À ±èv«ŠÞs°GûíôÙ¸+oσ‹ƒNãÚTÞNã]t!"Ÿ‹Zr‰Þê‘Xƒ¯2ê3sspA=3=só‹~µZkàFYG`׿4þ|Üóü'qå_o ]no›ÉD¢–J&Ï“¤ øßþä(¼fo/ÓÝÀ*“²œýy¨W»ƒ†säëP_ÀøÜrÛ-+-L©Ì©ÌŠÏC…£c¥O¡ŠèéƒÄ¦ ‰Ä!¹LÊÝ¤è •ªOüºÿyŒçŠ=‡»Í^p@çD Z®¥|-»0—mR± åÖ¸Ñx½=6îpÅz{'®ü 1+Ïr_aœë$”’ª¡·âjºJ‚¡kMIIæ²£:rì$—«æç ¸4_o”«I4m§ÇêýëgÑT=êx­ûñeïÇש™ C§’ØÙ¼4<É@ÿÝŸ€×\à‚WŽI49Î¥²0÷ò¸Û^Ÿ*A«Ò B½-žºßžœÒ´ÄêS૆èÙ²ë6·»ïÿÈe\v uFº3PÀØýC7}nû¨‰Ÿk@Ïlò…<»¡Šš)ÛwÕOSo_.×vx~1ÀÎ-—Üdb)Ìâç1nÎa¼Lm¹5ÍXÄûÆ'§afv~ž©Õ“¾ïŸÂç•ÝDjò§Sã÷¾5“­ô¤ë­»ººÒ¿P¼àZhô Bqx3 ÓC²UkŸóC¸,aüM¿ƒ ¿á’nðª>ë¶“¬y5ÿ¨d·UšÙT§KÐlù ¬Vå¨U“pA’ ¸Ü×›€R“LuÍlܼÛôǸyæZÕf›íÉ o—<_zâ0Üvà$ü{½¬%Ð+¡9P,”˜Ô’0JœxëÀ,ÊXB+Â8‰œØSV ~ƒ(8œ7nçå"±ò˜Qgq-†|¡“S3h— ›/p²‘JVtßÜÂ" Å…r¹r¬ÙlÝ/g¿s²Û?M¥’‡©tÅ ð jóC‰®ô•Žç¿ Í÷â÷œÜôø¿ï ÈâyA¦Yƒã[.‡z2éf퇲Hx£FP¿÷Ê^Ø3š„×¾A^ñâMøtÙ(ó³7B£*Óz²utÝÁŒ“ÒEu/Ö¼âG¬¼Çki+aÔp=Ht÷53[wý‘“H>h\Ø%³±Þ.øÄƒsYøÜÃáßûå,]]Šå [¸$LhK˜u´îQm÷öØÝî‘t¹lì.;¼¯é\sHt>z‚¼¸˜ƒ\¡À\î2ºâd¹ Åâ,ú@³Õz­Í}‰D¢Œ€®Pv;•JͦÓéñ•¢{‰Ž[Å•˜ìú‡T¿üsAd’¦ÿL×±®já³ÛÜ ]ø­†* Pí‚Çv¾­{CË^K®·Ÿ gÑ’ÿ§WôÃÏ_Ó§Ê–<rj‰­n„âܾ £â8²±T¥ñn„ROŒ’Vf½Ãï`«A(---uô"ú¶ïúj¢§÷³­Z5òY’xþÖ#ÈÿøÛûá¿ûüørctF}©Ìí—h#!2t™„´“R„hdåõbê/öô’h N1öt—–TîäüÜǘùä©ItÁÑý®Q?¸_*WjÕZm~ ý0Ɔ_ÇÍà^=¼Ö’ÉdAMaʳä\zÐW|Dw7~Oç‹®ç¿Ãj^&çk<ŽÀ)4äÍÔ<5š›„Da6ç'áày—À@£s½ëa¦oƒÝoëÐ ‡*,à˜V=@„BlÐu ~y/üü•ø9«-è¬_Àçe‹Ÿ›ùÔʃž¬oË…cY¨æê”Àà¤]$6·âó0nƒ_¥é@ª½oû¶Ç2ëÖÿšïµªôØ„–éN£ùÚÁ“ð‰ûž‚§æs?F÷Yz!³dñ ?襎xÜ¢ØãI³0vöœ›¿AG{ä/eµ)FV˜\k#!õô#pr|fç ›-ÔªÕZ(ž-Ï+yžw ¦Ìö~|ÙïàëU”ÝöÒ©T–W2{vÞ¯óP`¸˜¢ë¦Ìw™‡V]–[£ø&ª¯ÿö–›d>MO-Wœz€·Ê½Zy6–þίbÝts!àÒ}ãz:4)|n½Râ™^æB*¼Ï<~?LžŠNèüOo¾ÞqÝë˜Ñ¶¬H ½h½ô ?s…5ÝÊÓe(œ(*rg·C|n~öµ·ò¦£°gãyÓ½çmþnÐSÔ Û•ta<_†™r ÞzÓw ÖôÐ)òŒì³ô£¾­Vf¦ç¬RSØ_7áÁný,#éŒ0&nä‹\cFÐ2¸IÓ0¨þ|A½¸+VªÕ…V«5‰Ï©àu ŸF?“w'^çM>Á]ã‰$a¬ò($3Iê"ù)ÑðÞÖ3æíkœ*Ò¢Þ„GâoРÕñcÝÉÏsÄpRlB´ä´E¬//À;ŸüŠúÜ fÆ—’Ýðí×ñ0F+.ЀÐ%‘„ýÝ ÙÅ™ÓgÙIA•|îíî tÙjì„¥©_ô4@(úm ­ÿâ%¨ã­Ô#¥‚캷³à`=zŸdž®‘áBß–-¿ˆç~ÿ†ž.8˜-ÁD±¿tû=p2_þ1šH@¯Ç…ë0;7ƒ—½t“h:VªbÙqÕ¨¢$”¸)ÿ•Êe˜C÷:¥b êÔˆ úÄ© ˜žž‡Å¥\5_(¯ÕOãF0‡Ï¯%\w­ý1ÃŒ£ü08u˜÷C2Ik2T•Aü%ÒC’Jz7'ÆÐ*M•‰5¼Ýwásø·àCþ¥ýµTóŠnž´ðX¥½:üÔÛ0FK­¥ï,ÆÊŸšÆMðÙ$ñcSv¢÷ãFUÍýÌMnç \_g¡0SÖÔÜêê[ÒO¾ìîH¹M d¶|È Vú¶oÿõõ}=·ñõ>ýðaø—CãðÝÓ?Fñèd1—Â?¢+ÜU)dáK7ß }½]pž½PŸ¥õÕy.7ôu#VúÆÌ3j/äó%¿\*•`nžøÜÙb±T:Ö¨7y¾w?%ÂÐ%Üí—Ð"ëíé~æ\<àdÁGýièIÒT×T¼$ôON÷À¿vzo¨¢%ô–jà;Îf_Š¿Å¿măò)8"7mõDº#ÐIîÁM£•®ygòF$µ}º‰hf„h£~ë=röØ;M9ÍIÈaîé%=Ä Ýr"“Mºq÷žŒQa)üJõ 47íÞù ô~öã÷> ‡ò¸åèäÑ{Ž._ÃëÏ8®û»Å|öG‚OæKpÍUûàê«.‡­[Îã,üb6ÇÃñã°”UýÎͦr½ÑÏ£;>Y«ÕÄ8û{¸)œD+Ý$Pãu)Ù“ Šç Æo£…Le K ;ˆºÎÀo'ÝæË2›å`¡îWk‘@ÃBê¸î/À‡ü!E*gï#°I©Ï'Ù"eLÿ¥þܱCµè‚Ö‚§ÄÛÔþ9¨•šÁì8);dÕÁÒ„ÜA.€n{‡J]´ç·?udúÓßœ| îžÎþµÏèñ¶Ã5hr¡¾¿{ñu‡r ³;Ÿ*æËåÊûî{ð±kÓéÍ™”Í–ç×êõÆÖ'1†>€qæÃøø;\Ç­"°=!œ>¶”ÉˆÚ ñ Ûj¬ŽTÍ) =\±ƒ5~Rt}¼Ûm}"¹Í‡ü±³À0ÎÍ ÇúÜ™/ÁSö_ð¡œ=¬‹Nå´ riü¿A~f Ojq1.ÇMirÿ,äg+ªÏ×TÕ`ÄS´YÅ;ÔÆÖftõ}ø]·ïÿât¹Êsü~|yŽ@¯×«‘;R©.­îÃ*¶°æpCÉáI>ªœõÏèw»…‚ÜJᮢ2s)„è‚û‰òM¦ÚîËgçƒ Ô£~óu¾6è/£nŸN^¸ƒ¯Üè¿)‰¿æŽåÊÐ NäÁkЉþnŠ¿~be̳bá'#sS!çO¼’Î'Š(Y6ñØ<ÌÉ(2æþÿÏÞ›@Ivçaÿ]ÞV[ï==Ý3˜3ØA$âÊ$M ä¡Å£(–ZÑq;qâ£X‘cYtœxɉì#+:Q[Ç }|$EŽã(¤t(Š$DŠàƒ˜Áì3½ÕþÖ{oþÿ¾WÝÕ5UÕ=ÀÌ`Ìjººªººú½ûÝïû÷þn­›æD1{bKoyr&ÒÆ¸{÷ü©œÒõ3ß~îËÅëÅ€7‡½ƒphvø¸ÙægFî„òÌëÏmy`zv|¯dçœUªSvž¸¹†áŠÂón8çd6¾m]Ïß²Ö˜ ç)8úå+^û½ï|uË÷Î=ûà³Üaã¿”Ú‰à}ïå9lMÈÉ_ÄõþžùÛø’D ¬lÚAåáè”9ÿï~_þOÀ6‡¸a LóÒ¯™K/ý4d Mr´«ëüñ8ûôržÃ¤úFbÛ(ôQP <˜XÚõÍ'µøëõÛ'~€/tû€Ýðk×°ýæu°ÄìàûÞý‘uXWçÚÊùbár˜AÐAÊ•I¼€ óî“NvÚˆõVóæÅgŸ€þ~{¬˜ÿê OoûžßüÁëxÒ.êÝÓøs?tÖÛ$©Úpn£îy|÷¿ì_-á5—3³úZƒQAI‘{BêøÇñåDªû>ô›øÖ×7¢ÀÅ44.ücsáÅÏCÙî®tœ}f^ýîEÄ}‘Ë®·®hö´oÞŒCÞó¾{½8=¡^qýþ¯/¶éß¾zaŸ-`ÞȦ›} ïæX»+¿‡›«vÆ‘t_Y> Žã!Ø+03·×Î׾ƒþ¦:ǽ‚¥Ó4ïþñ—¯ú…³oNŒüþ“¯ì-à{¯\„Ý·î=¸ n„¹ò?ð©Å_vÚçÿ—wJYö¥9ÿÂKR”ÌÛD!†Ð ø›xï1ü±ßÆ·üm|øÙk~r„¸Ó¬þsùÕOž¹ÂÏqê©ËðúSË–m(mcÐD_˜ÌôZGmm•Ïz76ÚrÛÒìËßùÿÞKçç\;¢úÑ™©Îdû:»J–}«@®‡|…¾ïÙvÀÞ1Ð{õ£[ul晇²~a÷Á<Îà¦fùaýÍ`è¨l&Êã_ý-Ù_yZ¨‚VóúyzcÈ·Nœ†gO]†©ª?ÿÙ‡ ì9¶-25”bŽ÷¿ñé½S²}î—Ü!ØDÍ5¯¿Ì’ž¹e6áQ\õ¿„w?y´ãßáí ¸ºÔÜ~¶ìáT—?£—_þES¿p˜ºYÒ ú¸“ÁËß¾gŸ[Íãä…óm‹ƒ Æç³Ó7Õ‰j¢'ªÿþg_¾ü¿ž‹’WIàÓµ!¶¸òù5¡¹€ß °ÿF=äé\G³“n›Í]ÂÔôn¨MÌnô.­Œ–zàèÝ×tƒ Ïså_ 춡¿(>úî·¾íV}è%HÓ·¾AÉsìù¼Ùýg?qL–$ÌTÁ²ä‹Aóìß X$;õ^þþ2Ô/†¶_š+¨Çû§`µ°Ýÿ_¼}-£,@€ä2ÚÐÿç¥NÆ †Ø¾½üUµkºüügÞw×_{tÿ/zõ3AØtì\xtk5‚?_m³”Ù€÷|sŒr/Noôƒ3¶Uµï¹)LÔžýV”ýÊož^}b-¶¥ynÞaì=ÌF¿Ú5xûO?¼ïÃ2k}P­^®•wò²âµ‹]8õÌ2œ}~7Ï|ö• Þô¤“¥N!7ú½“¾ Òw[—¤óÌñÔ<þzç×»$«J}¶QLͶ3Üq Æ‚z0¯Æ#®wð˜ó9ô6öù8§ÜÐÏwÝ€Þ;è¾_†Ù¹=[Bò Ú}ÿíwY@Ïg{o•âž{æO`0ÆO öµ—ŽÃ»ùØ¿{>ýàáCõCûþö¡ üé´¹"=´ÕVPR/_êÂz=²ƒ!ÒŒzêÓÌzÂE1Fâë]WÀDUf ³•ÆÔ|5ºíðü8º¤šõ¼t×q,`Ûøž§Ÿ]…ÓðÆJ¢°zžôÍÞì½8xJ#'ãd9åÊ3ßKÔãÇcõÌsÝäû/å ^bso·&õ@øhÔíj€>h£6í~ÿ(¦5cÔƒ³IŒ¶çH¼î@ï|;H¾‡€ë¹pôÞ÷ÁËÏ=¥JVQv××—·Fqpƒ¸|ñ4Ü:6BJý’–nñ=&¿ðÞû#Ý=ý—KÑÚ'X¸&m¶*Úàišç‹+ÛŸNC’(ß¶M?€€ÎíÍqÐVv){µ7`2AŒÝXé”éç_n@70ïyúuQ6ºÅ³nlR¥äñÝÓˆøz3zêÅ(;u2L^o&V†ypõi×fÐô6ŒUõ˜ûÃ$ó¸0WïP#{ƒŸ‘¯5;Ü„†)ŒÙ¼7 èÃfvœOBYvZ–¹)|õ.?ØsOΊ>€‹¯ºxz¶L}îáÃ÷|á±»~Ö ×>PÒ´ß3Q $bès”Ù)®Ôð7rò­]èÀ…ך°z®Iˆ„2}3ó6u²m«%…âŽLpÇX;{^ë¿ÝˆŸ{¶_èhÓm¤Y—ÒV¹ÊÄŠ)̦˜rÌú I3Ôföø8·ÆÝ†½ÿ ¨Í˜ÍÆl60d³0Ûø®Þ øVý˜·ÜŒó>÷[ ¼Fôm²/ÔÂ]Gº]œþkŸ¼÷‘½“νN«±¿¦;‹óUYvioõ¨á:cÔ΋âßQ'Óa+ai7­µ˜5WBÝn$@å=y¦é匑žŒm­„»ÀWÎÖ#€õåLŸþA+:õ½f¸’äÙC½lW2Úh„œ(&»ÛY¶™Éc³Í&?ZÓÍ{Í_G€@棘Xíàf„ƒk·“èã˜ù 3ô- ß¼ì ަžï+`éAÐzœyŸ Ù»k²ú‰c{Ìp˜)ûrŸtŒR\¥Šµ›QÕ»àiSCµî #´Ì3‡æ]Ç`ZÝÌ´WÒl-R&MV«‰ _iGÍ.êx—1é =ÎÏV§2!˜„'$ «eÅž|8;õeW™ â>ƒÖE¬Mš æñ>ZÚ:æÕøaTÛ{Ø †ßŒaíQ@×ÛFlìzúÐo 3÷Û΃Éãäw?+èÅP˾Ÿí3äwð!Ìdžxªõïõ Ú`‚¹„ÀöqcÈÎT 4ÖܩRäÝml§èf'Òäó äÔð9ͨq @+‡’t‚›Ji€&Á‘™áì› ¾èÃd»#ïa¯¹Z}£XùÐo  Ù@ÃK³!²»ÿ&G€pPšË!`ÜF½ÿþ°ôÐØ ÚŽg¦”8nˆ©-ÀØÒG÷(òÉñÌ%V—`(]I8¶V‰Ùfºäòù8eàÌ )ìÔ.?Y BPG+4 X3C ÝŽn#Sa=Q~#ëGÔjŒäV#ºŸÉaû~'žò›È·€~u¬ { yßk†ÝØûzÔëǸ÷µøb`ÓCTİMh¨ÿm”,-ï†ú·"H25G 72¸ ¨x–€ÎŒ#s£D7"ýÆ$F7½ŸXô¤É×èFᦡiT:9ö9g Ò}‚b?ÔLtSí–æº‚Öù8鬄*^I²4)e§³iØ>>½S†‹~Ûƒ@—ï@³1€f#œclÀþ¼ÏÇØ×lé>t§ï¾p1d³¯£ÒDG} ò|ø !éí¢ ؾ9Jt´Ù}Î¥‹Ÿ Ù\ò¼¡” &•9sƒ¡±Š”?ƒ¬m¤ f‡ÞTÞ¸êð *ãP‰²m5I6>•+zœqə ä\¯i79ªèd'É.$qº&¶‰ï¼íãlçwukXöù¶/Œa>¶ ³òxP–bûAÐ÷ÛÛ|€Éå0è¡g;¸mÇè”5§È޶» 2¸Ô ¸$tŸªsñ>îBÊtªŸ¡v$øÕ²>âàTæ@±Æ„€I9®‘ü(S‚Ãð¦ ò¶r'äp±*§ðX€XCÜ-ó}ªBÎínr²ñ¾¦m§^’ù¹P2+»‰áq× bYÛÍ€riÈGþ8fï'ŽšeàÛÐ8t4Ø)ü†›íÚn†k­„¦¶ýJ£ý¯DMr¡=G™ÏšI­û*t“³íNÿPU™>ŽǬIs è×Þfæ;ã°ÆÜ €GÙרy”tæ°óŒÁ×ôKP6pŸ a§a¯åCâ«bš3Éî1.ü“1rØ£ŒÑ)>‰¿×¤ÔOƒN•Ê…~TmŒ BJÜ„œy_Ô—}·ë…QR*ßÎrÓ¯&”öÛøò:°ò°ûÃÀ;Ї9˜`h·cÚQ!¯~v‡1Ì<ȘÃÇ2¡F8‰Lp{ VÛ(šÁ÷ݲ`íÊ,Ã2 ‘•e¼pbp溨Ü]´Ç©Â•6ªUcù YCrçðÚž nëx+¦^±Þ4kú®‹zj8¨)BÇì†9µÛ‰é¦0,°iøÛ“Ë’ù\Ñkyë­›j"{)k‚‹ iœé²-wL–(­`| ¬²9ŽKn<‡f›µy'Ö0‚áÆ9Çø››m#•å€ÏG03áÔâc6¢kî/žƒ%6ÆÙ8 ìýç“ÀÞ³wY0§"™¨H²Ãy@lîrpPÒ²´m«mífB®±yèÊV¢å‰ª&)䀇Ü^ßšÇzþƒüN¯¦‚l.TþsÐsÚÙÍ"÷Æ4ÙµÔ›e@ŠÁX‡žÔZ䬎òuBI]ó„('²Uç:NUB´®`xy稄™†Ýà„ÝÌÛèl›…µ@côai¡£ä³ØsL ñ¢³ì¢|.Ô´'Íj¬Ìª“ŠTó´`õ4mèO°Ù®Âmœí¿]˜nÔØÀ› èì Hé} F9»ÓCÙ{›oãˆT |LXîZïÂã v Lë4c•u½àÄàËŤ/½9Oús“ˆ’ª#\O2))!)%xÂò:ï[Í¢GËhU•j¦2¼¥ÊV·éD¡MIéšõ5dÏOnÑä¢ÛY5yÑ›)fWZäs(ÆëåB€k¬Ø>ìæ ‹îÏâŸlvÔhë£ü`:›tx6ëKµK3ņ}áû¿°}Lÿ9ç#6£ UØ3ì-gz¹ÃkœÃéx½·³«G±²#ï·‹#÷¯Gز×J†ì¬4rØ ¶ï42²£×ÜA(MŽÜ]óœÅš íÓ¾,W\ð|É\)•ùS¯Öh8#˜Hf3šAN¨tÞ’|pÒúÁ3#”.À+@ ¥¯d Se cEQz¹‹Bû@|ËÔгjõF\Ûùv_°^|z®w¡lI|aØuVÉSÒN©ÆX 7®x=õÒ¢<×ïf˜í­¢½È†êp?Yß}>ÜdÓ³óÙÊ ¾ãYd0ºûÇ8pKt~ÊÏ|Ül£ `ÈE¾ž'q\ñ ¨‡•LŽ+£Ta1 £û„AµäÃÞ·ÏÕäþšW^œtÝ™’ð¨ÔM™BÙT šë¢ ¬c *ÒFw‰¡© &Ÿ¸ášœé ¤w9ßÃè idväΕÙL8ËYÄ€¯©X½èàÅŠa™…o ¾±…-Ü=0ÛôXž3¿MÀ!DKV¨Ê¢³Q¹Â–§x7~_Š™(Ϻ»ɨ•f,L23°Fô€Ï aXÛç¾®£aQq&Ú¶½Öo4£_ ³±@•Ï=.$%`|Ã?3„ŇyK¯wvß8/í ä\3üÛÝ k„+ŸÂSîÛ#Ž- y÷bï*1o2_À à)­³j–i7N5›5»ÊDÃ"•±¤fª!èQšG™æˆW™'®Q‡)à­ä VÜ”I 7R;\*—³Ô9ÈìNi„hL”mgkW,›ÌÝcù"öEhncQXç¬/yQHÃ6¿JÖÿ˜uñ¡Åa\ü ~§ìz«©–õ$³#•“|ÐÀv*ÃÖl“¿ ·ñÈ¿Y@› ôq2`tQǰÔÌA§×8À¨!N:ÂÆzˆzБu=ŽQÅf¸ \Y7=¬´rÔ-ñžçâžC5€¶Ç>òÃÃq†™Íø¡‰ i·†ò|Ê5­Òl2NX)I™ µFH›Ð(ÕPJ4[™—“,·S½ÚÎL˜(ÏóŒ’Õ( N0·æ‹ ìŠòdÀ«Rð ÇaÉt™æ¢iŽ€7Äê,CþO…)Q3 ”Pº×|’Ù˜;/¾)Xr…nòx¾ekbm›JkÓps9o7’îùë¸uÎÙ¹|v´6»à^Ê…_Oµ»ÚMY+JM¢G:Ø.ì6nCVŽÊ†„C®nÌÒ[b§Ë¿Ø à0O%ïß&l5*u»~Ý7:fÉ`|K¡}'L=ªÝðÇÜ_ƒ;'àŸþÒCÇ÷¸ÔÜØõtV’ &2•ͤi6£TZM“ÌO»)º*Žâ¬¦z-Rl­®²æÅ ’WꩺXár'áiFÙh@¾9AÒÝ‘RÖéΕ=i¸âH1QbºäÀ”dªl” >£RÁ—síd&¡DõlöŒÙp\áˆ';¼ DÖkÏaW07³/= ç¯Ù`zzœž{IÀ§´;NÃkÀQüÅŠë^3±':R:ÓÚŒó¦ï¤¿ÀÕu™NÓq-¡Þ2/‡™ ±w9lÍØèaÎ2>&éà q„ ;)lLø‚í ±aPµ˜m z fP®Œn>¸œz|îÃð;_¼ 1 °–—¥ží:³©¨¨$›J’lÖ$ÉT¦µv'q;ÈÖívFaVGi¾ÚÍÔJGóæ¹8~°žéSk N¶cˆ‹kAg\à5À=×áë&£ÐV—¶$š¾ÓvÞ- 1…6 %´—e(Ü=ÉR'et–ˆ”e¥Á©Â·J½0ÝmÔ‚oTÝFöº)¢yö¾ºÉ7ªšáŘ6Q0~n¯£žVÂ_¹3'á®Ô|v©›˜f7!¿ÃNZ=kø°³’ÖQ}îÜÄÕrrvƒòqN±AP±ñ`v³&Œï¨Åsµ6â¶Çûyð ŸŸ…»w2÷t!@AN¶ÜTE5•¦3iœÌÆa2ÙiE¥V3–fœvZiÔ Õzš¨UnÌJCëDGíË]õ͆1±6<2f˵K³ük’iÖ¢ÍVQO=Wvç'üp—ëF%’¹œƒ®±Œ;©gdЬŽ7HPʧ-dv{fò˜ÍaëÅÔ!§rfAlXî cÉ76.ÈzE3,—뜪Üz¯)JçSd0R/:-…؃»Í…ªo.´Â,¢ Wß‚†}Ücã<î7uÅœÜÁ‚•÷;ŠG…¸Þ.Ç8{Nï€%ÞÔ19Ãáÿù÷Ópp̓=óU€O]„”wiŠ«Z×KMXÃU=›DÑ\·M¶›a©¹²z3I;Í´ÆY=Ëô Dn ²©gxòS—:ê·šÚ4Ô¦¹âúh×½,·º¼Flªâ&hÆ'LŠÔ„®9 \JeÉÒ²VÈê>™‹v:"2Fôf¸=d‰â*Ëå•õÑm;c6µTo¸„a=÷Ùòy—†’>>Ïå¹¹ùÏ „~N.U„¼úìõuºi¦PÁèmd·†í;¯Ë—ß.”vÓò*?áTx§ ¥ØÙôkz‘˵‡ÿøõi8¶è@ù8^šfj+½MkO+ÚÓª[M¢t6êD³Ýf4ÑXýúzhZõ(ëtÒv©udå•,cë\A'K[Éí§”º³lŒp6Ü}f»ª`¢ ÿþ¹¦ºm÷dv J¦x4Šù¢ÜçÔ:PJ«³ …~Š(L´³0e:ÑLé1ªÈ™Ñ¿[“΋)2 t”G_´£ècwèÙõdË ¦ÕÏr&æ¹äj%v²êó­PŰ# Ã6ßéFð¶:ä}¿—›Ã»ã¸!;·D)úÐ\ø«?ö)Ö©ZKƒ‹¨t3Ìs‡EZån¦ZÈäÉlØ g›ë݉új×[_‹ r=ìf-”êk™‚U–éu%X÷<ÄHþJ߈Sfè‡ß. õfW½zº®~ôž=%úd%}Ê©QHSËŠ,# ‹ Ñ—"J3üÑŒ®;ZÛ u²ý ë¾[ñ’·“&ôæ|/ƒÎérÿÍÏU`MÌÕ¦¶AKá )úž¸]$’¹5+:J¦ÃN4Ý\ëV×–Ûn}5´Ëã8Òm•ª5…?ލZïøi8í¦iwt“]Uxwè /¬´ÍùV=»gïB仲)áñ4vMJ eÀ—Jɼ …„ÌxhDk¦Õ)‘]«›çvz.åó zJ³X‡öe‚myLä7Á®3Û°ŽñÅŠ#M—àåNÕ\htTž?³# ÚÐß‘-§ä-¨½uǯý³)ø¹¿R†³ mWA –]HÖKpúÛGø”çÈ„7˪N%ÝhªSïV×/·½µå:-yÚF{x¡´ŠªëDuö!€ÿk7@L¿Ù±ÛʧægáSøÊÆùoŸ>'£.†<Ñh¾¹Mí°©©T žƒ,{ªÕýðЃÓðµ¯~ V×ׯÙu¢3âçno³QÝúu<>wHÂïü$̹×Ê£ü^qÖÝ×l‚›´î…QVÉÚQµ³Ž _ïò°•¤Y¤bÜZ “Ó0AÒ­£•kyùv¾b/¾ºÏþßýäøÑðL΄)k£’ˆ§±f±²Åodˆv¥Œ ’W"]Ê}£î54Œë¢©\OÁ˜<]ŽõDuá3Ô9¿›^6͆hßH˜f[ÁžWµQQ]†{æàµfăŽtÑAÚŽËq=ôÛõP„Í8C§xõZÈäu\Ø æ'vWeu0•^;…1îó ø³÷¾Žø5h=߇ÎÊ ÄadgÖßvÛ{àÔ©'ö‚ÿñC.Ü_nÃc_èdþ0|#ö*xA…À£¢ÊoFfJ›$C®Îç ƒƒT+Q  ¦Al ™ ¹M»{£#M›ç ìúmô­òž×VðÛ~• ¿k1ˆÎÀßQ†¾û+ø0•ØU> ðDÄa⃋øò m§ÀÀýw‚­Àï;Yބ߾ý ü!ý ÿá+pº5š)KÕ |àC…˯wÀÜ~äã°gï>èt%œ8ñ‡²¯B['¡“×ððñz;zÔ}rb÷Я÷AÙmŸú„G&!|_”UfdÚ ºð€A µö²N),ëúY'-‡í(‘‰JÐ,Ó9¾QÓ¸Y׉T¦›¹M> ä¬hõTN ü›‡? OÜ÷x.ž= Ír³åI4Âü®28N ,ÎÁ‰ù¸pß,´ÎœyîÊ^+h[fNÕ´*>šäQ†Û‚ñ™”â× ‚Bj4ûرF{+"ç…M¾ÙHÎô§Än­ž`›ü>¬™ G”[G€bì5ó:Þ]xø ¦VœK9ĸ›5}µŒƒ¨àEqR<ù<ú¨±½iŽ]˜Ÿò\xøC†üÍÿ.5ϽïýÁmû€Hxöø)¸óþûÀ7M¸¼ü „aY»‰@ö Qrc²ù{›Çìì,ÌÜbôë{TpWÿÜc”J6YT4J®çØ¡ÑÂ|&`-éqQï:¡VAÖŽ ä²ÛLLÚMS­tWhòݱV*Y÷pj2Þ}‘çÎãayž‚ˆ÷À!8}äÏÃÿt2„éCsàF—pOÈ„BÔuªx 09@§ÂÌô.À}žkyнTƒßý³‡`WòMøÕŸ‚$KðïÉ®NbàÓÁZ–"ÀSeâD1•1§–rŠIâ‡rMn±ÐÌ&Ñûty…ˈBä>i>ª+aŸMŸKzSèj,mƒvx‹‘ÖÐ&OðQS@9Ö('oXˆŠÃg‰ÝaWÁ”cò¤pðöøÞoü]øø~ |ä¯CÇ7p| ÜÈEnkTm/,-Àw|j’CËEö¶Áê­»¼MNA»Q©ÌÞÏ¿ ”܈4¬cíÂï¾X™¯/Á?zä%d}‘;ûb Q96eª³%©a¸!ü•‘qfsaÃMŽÙpšìSå›Àe£KŸúŸ3ìÊC›á6#ÌFà9þ’XBJî¾Ð…”n©‡¨k­}áe6è!ðiÏØú×Ç_$|Û¥i ÿöïÿ%øÕ¯ø(ÏKø{"|Ë2¼Ý,à¾åu¿ÇœÃàÑ)w/ ¨âýTí¬ÂG£i¨gJ,>_æ™j9¬›ùY;ñâfÂãNªt’¥ò6g†pv£4™^MtØÍ+¾ïêû%Þ_Bž(ûPß½ÿºzì×¶y2űߘ“:‰ ÷ÿ[Y‚;ÎMÀ’|8Ú‚ŸÜ¯‘aÝT'Z©4Che&‹3•¢±.p{bvÊ*þÞ2â©Ì6fAõ11Âè}ŒÍú½îWØè}ñ+º(\z(ÜQBù(!Œeñ$D€#ÈMæ Ðq¯átB2ȤE7´ÓÃf(¥Ó9ÿþôÎÁ¯'“PÂm)ÞÛsÞú›8&$ƒÿ㘙d°#+ffge|”·«ÿé»YçÕPJž¡å{i;–i'1I”Å<5!î-&L'Vˆ£•Dó¨CáÈËU0]ÀÝøÍSàßsü}·ƒsúÚ„oèýgÿl ž{¾ =üÂ¥2Ü6×6wÌy:BAª$M´É"4ßÉ+G5í¤¬S›Q‘K>JÀ€û¿¿"1¦—7ø­JLH´Eþ†q’!ìÑ&ÏbTâB¦$ƒ£:N‚ïãCQï+8€kñ£ LråNˆöùמ~ž:yž83 ‹úmŸFw èoð ¶úÒ ?„vù¹¶Ùy.‘×'¨±Öšäe¦”—uR™vcB ò£Ž(j/íà„¢4f°n"_ç”ÿýÒ êã³ Îÿ!,´Ûн–Žü%´ fKyÁøo/Ã=·µØŠ+§sÅ2F]¤Ò8I±¶DÙ6Ð(ÿèxKl‘y>ãi‹ƒŠ a÷Pï“êCl÷>ÑkÑ©€¤ã[à½"ÀgÜFì­—_¦(×CpݘŸ€ç)Ø/þè%34Sv¢?÷øßý|dé1üU¥[@·BkWÓB@xÂoáp/‚¼›7p ¬L-0s!¸Ýç°7 mûÔku½„½¹IÉLe_QlQ®³ dD®Ps(ü7µ]j8r©ü6D&OF³ž,ð{¡´-)¼.c}a·¾úxÞ{Œm ­m˜TM“*Ž9JÑË[^(D©)(×îÄà–˜½xòÞol¸p Ñ‘vxö›/ÃwžzöÎOÚî6ï„ãЇ´(ÒPíD–`ß¾*|æ3Ÿ…ï|ç5h7Oƒ¿ô<ðÂ?ÙIÙåŽw{KD¨qïý¸°œ°é.rgŽêÆ]ëH)¦4*^ÓA>Šg´ÊÜ¿!ò*¬áÏ7iê(Jõúlž¾÷' ™MBùrí‚y“ý?˜" m“c @›ŸÆ¥dJ³ùÝ·³Yd:GHFM.RYÃå..x9Ÿ‹Š6»Qh¯S1ºá¸5uzÔà‰€®‹ym[Û³Áaˆ~˜tï·å76#´&³ñuS”Èd 8n¾wS¸m†{>c`öØ'ðô‡pæÙW u¯Oý8˜ut¦)Ã9=S?¿ô›àð''Q¢Jˆý)X8<÷Ì}vM øêW?ýèáÅZ³É%ÜÿvàéùýÀÛ«ÐlÕw¼ë£²…“¢l†‹Èˆ,M¥ a»²Ä¬R W*D™GZ¥sëZ·Ô ž_(ò²wðw7ƒ9ø½Ï}.•@\~ó ÈzàŸÓÊÙN Äý&¨yðþGÞÇB\­Iæ3oºÊ}ßcJ‰ÿy¤vb'Òž#¢ OA¤cüèqj›NØÑª]üÐ1ÓÓ¶´âŒ3}Rž¼ÆÀÖ¢–-íF ÐzsSØPhÄSa¿$÷bpÊ ¸³ æï˜?Ã\¦~àAflÕ|rýF .윺ryDæç’Å^´f¨^²$É'Óp~ è×ïØ‡† Ô†uÈ`ù•Ádé¤{æ`/wàÌÁOB[.ƒz~²ZÍ$d*£Â¬M»/Ô¯}ð3Pþ»ð?ùßÝP“cí]d‰O™€OL &qˆ“Tª0ãÆz±”âZÅa¬ÓDµSÝj¡¢'ŸØŠzì~x)¸Bgöh²ÆÝ«2(,”"µfNå§R(Lº,õ4Üí”™¹Øe±[f“3 ‹ uâ2Âuxð\ïÔ¹ô¹AŠO¶p‡Mdô–Žì@Fò‘)è:‚¢q(Ý k9£›+™»xÎJõÙ÷Û€•åÒŸXÛ²:ï‹ÝÑÏ÷6 š²Ž¶¹ã#ÈèÁLó¼)cgà ٛŸüþ÷ßT×l:¯ôww`ŖߨÿQvÿ]T?óÐjÝ\oðJ$·¯¼pZâ=pô®}P-? ˑɴ†åç× ÛmØâ‚„*-u qTÇï;ùpï«’»4ù  ‡Ž}.^J`öÅW`ÁqFQaÃDuJ >ëdç1Yኙ74‚‘Écü ˜LUB£ýb]›ÿÁуtWNácóÉeh²ÊUÅÈ(8ôagóUÊä‘÷ h”xà8,—BXGIŽÌAàÙïR:œ„:28ó\—yžË\×c’z8 a¨·3Ùº]%FöxˆTªlšœÅÚ˜ òÁç6w}£ˆ †å½…,E ë³ãùén6&3ö¾ßîTIÃéâd Ü<%ûTóG zåËÂP6·~(oy'”®½çùì¾û?ˆ›=cK‡* ýyîãæ7Q®2¿DÃï\ÚÇN˜£Ø4ëuÜ4\W¦ÕN¬—óF–«Þt@w\×&q £s0»`ñ¶_†GºMyž~æT<±?´‡&›e`¸y;È–‹‡ ¬Á™“uXGfNâÄ"Ư”C¡¯ý‰5¸£3.Ô« ÏI˜D}­6úœ,\í­}Ó I;BhÅ(cÔ¹)å²›T È=£3¯cÌ3uгçëû™é{!™9»§SðVN_áp£ý‰Âto61]T) ÕHÙË•]Ëx “Ujñ$íÌdW'žgxó‘¡Ìœ´¸ë¹‚€^ FR] ‡q[_.Aº’¢ †Ññ³Š±˜2̸‹‚4(ÓÉFg¶o›&¡¢‘í¡¨'…Í’Óþ˜ø&xYà¾ûMoÈ÷--ùOrf®ùBh9ž0/R-ƒÉ½¦à‰ÙÅz“%/ýË/A§ÓÝ8‡Æä€ÎKвTëÎB0-YŒjfÿi†Xf®çáù”¢ä¼Z.‹J •OàférrÂuÚ¡YÁk‚ÖŽ^]nèj­ÆJeÇ0ö—ît*§gðĶÑNTT&À×hR힃;…ó÷Ã]΀Y˜ƒµµ xå›T*“I8n®ñp'uQf‡6u“ƒPÒS–ØôÄššˆ¿+àmøÓò_„:ÿ7L‰è€7Í%ë"›·÷.BÒi0–Ò¼2ü'U(Ñ‘Í5îFe‰Lõ‘*˜gÖÑòžÞ /y ^•på¡P[µ‚EŠ"õ79µöajú0¸ÊaûöM£lÆ']Á*ÈÀž+qá¹V‰#sLŽÌÌK%|î8.‚Z¸yÎÚÉJC çùcË-`ìw¬ñ89ïß<ïýYrý²½ÿ=9ÙæBë¥àV3(£d_ïr¯0kJt+£R ð9|Ì‘hÖàµk¸ÎµbQœ°F« Ósóàr72Íî†=ðX\:IÒ²l3;?÷ßûYëȺXnÁ{äsp_Á3ehŸzmˆTR– ÝìNk®Zj߈ͫ¾gœ:üŠÆd¤&§fÚঠ8R^pD…AêSø7QòXšQ+ôucV€÷À{aí®¿æµ'A¼xª¹óºæ ÏC¥Aæd¬4«áÑ;¾®žc¼º‡BXL"¸NcÆ.FdîbñáÂc’¼hh“û(=}µïábæ$Å2»Á}À ½Sßt»a²¼[kò¢ÁäÞnSP,];Úã ~P¦LØÞ̤ ï²!å÷–ö~6/Š_†xêû'ž‹Ag]ñ³Ä掇/H!@©WE6Tg†6*'“êñLJz} Ò™I8}ñ"´p-X:ÂLàÂîfÏ•3]a¾/xÙ-±rPá²v…€nìêÈà ™¹n®kP%ALíªpñ–š¾q}׸¸‘´š“Ӕꢿn@ŸŸŸ‚”K¬wÞ±,>íîkP­– ´–y!™¨q1ÞT–ÂÛ5™˜ò3Î<ð |ùÔ3Å‚ã›H÷|~®ÆT™Ñü¢MA˜#ÐSJO¡ŒÿZ½Oîù<øØ°v¼iÏ õ5£ÔZjâ03=¸°@‹IVmácÓ\ƒö³>ÌÁ[r ìˆSbo†Œâ² ì³R)@æA@;tºI¼R\:ìbºißèp›Of{¾äM hcÕÅŸYà\ç÷º¼ÚÙÈ41¥Ã?*>‡ZI˜2~ã Û.v@ªo £ ½'å™ÙRàÂXOÒç 1½ ArßÚæŽFÙ—A©œAmNÃ̼¿”¶õòPaµš hãíÜÚ2¼rq¥Y Y½«—Ö "Jl÷,©GÜ(—ûfdë²OÀ.± ?ŸÄÚ¨–œ|ÍçIÙêJ®´qâ9ÁÕ a¤ñ{m§Ãn$m[É›ˆÓß@ßw`/´ºwÁÂÂY8vä¸^‚=jи¼Žæh„82ÚÓŒ½³†».\ý<ò!Xyùy8zi~^ŒÍÑVžìøÐ”1 dži£ÒLIü‚Æ­JpÏ?Ôñøz L| _†4qáÀ#03;G•q &¼9Ë&v¡ÔFÆCvvÈ9ŽöÅËÈÚ(‘ÐÇ•'‘a|xÉ‚ÜE劋N"cƒÈÝ_Üf–°žá«lÕ§±q¦ø£èI]ôa±€ÏñmUÕ®Z¼Ùb0å’D³ÊIu.àp ÊaWY@àØi¨vlrŸ„/©³Í:õMæÞ´Á·ÄÇïö¶`ù¦ \° ÷ü ‚š†©ƒj‡fvƒOÜM¡fpáÂËpâµ× ¾Ü†ÕvÈš®K`ç[µ@“/¤×UàU4L,=½î¢Q¡€ú¹—áÌå:POüÕå³ìR«Nµ0¸×I˜ J¬4EQ²‡ ÷¬iClM> /go@ó74ÇØCåuý1®ï8M¬ò¢MÏEÓùÏ[mØM€ò0tŠ7e˘iv.€î¬õ”›è$QHî»mŸ]h—Ø+‚ËÞ­‡Â‹ž¡ n”kÐê´‘Í#H§4ˆnÆÈýÌS pëvPÆÓñÄœ‰öƒ`ö^¸ <¦dŠ PbKÈ.².4 vFfhó» *-ÓWdë4c(Éï¥C“pG Xù`„­YÝÆlMñ±Ì½ îž>ÏëÖ{:]Ñldx}eÖ'mƒLVp¯BæEjdõ²Ã FòW—_ɡŨ@¼»g[s¸ÒáìJÛ»ÿõlЉ]%Êv¿¤UeZÇî’¹Ôœ€sË«¬³þ¬Ô°†×Bu3@ ‘•ýšÔ$Ä#?+£$'ö&Ý‘ùX8”76òàJÄ¥ Ð K“"T™œa ^smxx<^W$ÃØî¸=EÆW:IQ¾… ÌT'@Núp#GÊ7Ê\¥ »ví²±ÇŒ¦r³wY_ü¡G†Jf÷Ááð=h.þÉ—Á„e°Ùbœ ¹Œ0ÂŒ™\¶tª‹{p¡ÕÀ•=§˜@fÆÅ‡ìHRQ’LDð¢M …mHÌm(Él#FšŸ`mB mhlÍ DœF™9Y›Í @a%]ôu JP8ׂ;/mA­ƒ¯A­‚H.㚨÷) 7|F=ãÀfæc‘lÚÖ|¸ƒmà W8ÚX/tVÄØûcé[ÀÏsO»piÑ^M7åózkN5VàârO»¢~óälAíMø@,í»ä¿ðÀš99i -êt93=cÿÈ·:Yÿf´ÕiA$xn$w zç1ÈpÁm¿#\¼¢VgfÉÈÅÃàÎ,²RµŒv4.4dd!sû$c¥T6^±øps%޲\bpòè€ÈÁSÌ41ýR¶¦j[JŒlÈö"š¡s7´ýÞÊs•!¸‘Áà.2¸Ÿ6ÁOÖ¡¯C€Lîá}/iÏ: Lh«Am°­ë0ÛHt¹²P¥ÇÜ|¹Ùf2Ì06§È·’Ýhî›LVÍj¶Û¼Ôœ…×Û1DÝL&J%dZ4o|Áà¹(4†¹VŽžkˆ±iƒµéxí:Qh:íª²– ‘}ÜX)·ƒnY<Ó–ôèq™<(•QP´QäÑ Š ¦ifÙœÆEᦀÅ4þQqÞ÷úfúÄäT‚ LMOåîûšÑ½Û:” ÇÚ†jHº:vL;¨T*`h¼AeD„`À«ìù%(M/@y×^ð¦fÁ-UÑX©@€ö±7ÙhÚŃ 6YÂ6«<cÖ³]͆˿Gâön>ÛP÷zª÷±6är¼èº²$æVndg·§:¢5dsdñ¸.²ºÀç…ÎËVÀÎI°ŸY¿-½àø€½=ÄþÞÇ~ÞØ¯ y ä§S”캆›¬Ï¦¦¬2 ”Ú@¹V}ö¾6WÀ‘Ö‡a •Àö ãÆ6®Þh4¡‰·0ó}’ª­ã‘ÛõïÜl]n¯7½¿‹7º^VºÓ®›»Þì&‘$±¡{h¥Ãêz §WjøÙ+7tnúôô4LÔ&®È £D,2ªñÜ»—¾å] wÜqìÝ7 ~™ RT;³eЍGV®213O]‡ôR©NBuzJµITš¥R¢b7êKã ì#™)ÈCÎÄFäk#”½áÛä𢡴±-Ìæcÿ:z“‰ÆË6jÑ©áVš·MÕY®›RVGö^gnR7^Ò™¶™T¡:aù¼•{¼yÏsÎûÀ °ù\ŠkßÐó°o2ºÉ³tzyÃ6²ßŠÙɽMÃÐW^26 +f .±¦ã/BÅ­ù2蜨Q)!°]C>¤ÀéMóójŒRhw+ê‰J‡n·Û¬ÕnCœ“Úè2•‘OŠ6^4¡(¤†ïeð})ËŸ“d6‘]oO¥6yqbÆ º3vê…aÒî%¨7OØ|’ë{ü[~øÐáÍo(¶Š Ì i$øn¹¶ˆØ{S©*³s¾9ð9\CÙ;Œ,M;=·©¢%¼ð$áH~S“ ZËhÓ†i*µ*š>\p~ÎÞ$Ó×Þ·™h|£„ÑŽ[Ócá^„k#ÈÅú<âÅK•C^L1ÕÆä{¶õçIGíÆ:òël6{O¦±ñ;«PmŸ‡Zr Á¾ ¾n€«Úh£†VÂãRµAu»›l¶f.Úcì,8^<×û†“‰4…¤ßÜÌfÅ7Ì΋ße_'A 91߇·Ã¸1î…oÊ‚An|/°À¦Æ–Üæ ä_ ×…!%†²š¼â†*mÚݰK“OŒµ»mͳY‚n!ω±]éÒu¶€ïùEŠMÓþ\>ÙœrDR¼%*>etœÂÑy G+€ÝØ2Õÿ_€$ã9¡Ìù³ùIEND®B`‚R2_2_5/images/updater.ico0000644000175000017500000003535611667203025014703 0ustar danieldaniel h6  ¨ž00 ¨%F(   ,7== O 9~I•^ˆ mf  ^VR  'pŽ0„;›¥|Â$K;-+=ÈÀ»Çͼ±»¯©Ž›‰i¨›ILUuk+8™Be‡³,gò× %¾á"/j0OC?aáÝÛÿêæãÿãÞÛÿâÛ×ÿÜÔÐþÍÄÁööªØÄ´¥½´„‘k’ÍÃOþÿ?mÿ´^v·pdbgÖÑÎÿËÆÃÿ¥ ÿŸš—ÿ¦ž›ÿ¬¤ ÿš’ÿ¦—ÿĵ²ÿ’ÿ^áÿ&hÿø{¥ÿ#…tߨÕÿÙÒÎÿ˜‘Žÿ›–“ÿ¶±®ÿ¨¡ÿŒ…ÿqfYÿMWÿ*tåÿ,ðÿ&xÿÿR”ÿ|±¦¢}ÛÓÏÿâÛÙÿ™“‘ÿ¿»¼ÿûüýÿÿÿúÿýý÷ÿïîêÿÌÉÒÿ=‚ïÿ5²ÿÿ+¢ÿÿn¯õ績ÍhȾºˆîéçÿýûûÿ§£ ÿÄÂÁÿjmÐÿJHÅÿ´´âÿÿÿÿÿßÓÏÿpPdÿAÆãÿsïÿÿïööÿñéâÿÛÒÎ’ÖÍÉÿ¾µ±ÿxvÿäàÙÿÂÆõÿ îÿïÿ»Ïÿ´2ÿÈ9"ÿÙèâÿðÿÿÿÿÿÿÿæãáÿÅ·±¤KbhÿAbnÿRZ^ÿìèçÿÿÿÿÿµÂôÿRZþÿPOÝÿî´ÿÿòâÿÿÿÿÿü÷öÿéåãÿØÓÑÿº­§~ŠzÈ~pi¦{ni·öõõÿÿÿÿÿßßßÿŸÈðÿ‡ªìÿÐÇËÿÿÿÿÿÿÿÿÿýüûÿàÜÙÿØÒÏÿ«ž—xcYµ«§TÿÿüÿÏÓãÿ*{âÿ@¬ÿÿǯ|ÿò”ÿóßÈÿþÿÿÿþýüÿöôôÿúõôÿðæábêêíÿf£íÿGªÿÿÏñÿÿÿó×ÿ÷ÇuÿëͧÿåâäÿÞ×ÓÿÔËÈÿÙÑÍÿêáÝmÆÆÈÿœœ›ÿ«ž‹ÿ©•~ÿ¡–‡ÿ ž¢ÿ¡š™ÿ¤™“ÿ†tmÿwaVÿŽyoÿáÛÛ—{Yÿ­|0ÿ·’Tÿ·˜dÿ»¦ÿ·¨¡ú³¤œí¬œ”×£‡µ˜†}”š‰€máÙÖoʽ´â·¨œÂ®¡¡³©¨”…‚\¤–?œ‡$qaZ ÿÏÿÇçÀÀÀÀ€€€Àøøøðø( @ %Q )’ ›ŒwiŽ{t„lZ]rŽ _Å-&sÿ,(wÿ,,~ÿ,6Šÿ&U¥ÿ ™†uº¯¨³©¦-b¼ ¨$;‡ã&%jôH"eÿD"iÿG.sý=S™ÿU–ê@€ö2 0¼'3^‹ 9…ôTOÜdL×cSßi%TÇN)G " (/57860'&<2YŒ%R¢;?†?)F>D{l3‡Ž !{Œ („Š4 Œ%\Q  !+6@IPR[b] n 8ˆF“ SŽm‹ Žˆ*Š`   .8!2y,N¦&V¤ M¤J“ Ev :R 4$ (K‡‚A¶Ð4­ˆ!C‰Z3iˬ1½õÞQŒ/,2-&"  *[OKmµ«¥“„}“„{Y¬ ™=€qi&hWO9l^ &¥š²X¢ÿ5Òÿ !Èÿ#ž´ -$#Œ‚€ê÷ôóÿëçåÿâÜÙÿÔÍÊöʾ⼲­Î©—´¦˜‘–‹„z@EkžGAi,^Y{ kh‡v¸ò4|øÚ6Ûÿ4Þÿ(FÑ¥Qc¬/!)•Œ‰éíèçÿãÝÛÿâÞÛÿãÞÜÿæàÝÿæàÜÿæàÝÿáÚ×ÿÜÔÐÿÔÉÃýʽ±ôÅ·©ß¶¨šÁ „ž‰rc}yuMY•á¸\üÿIðÿFïÿe‡ÿSD74.£š—ïêæãÿÛÖÔÿÜ×ÔÿÙÓÐÿÑËÇÿÒËÇÿÕÍÊÿ×ÏËÿØÑÍÿÕÌÈÿû·ÿ޹ÿÖÌÆÿ×ÌÆÿÐÄÀÿÒ¼­ÿžµú gëÿ ^ÿÿUýÿ?oûµ} þWJH5°§¤÷Û×ÔÿÁ¼ºÿÅ¿¼ÿ©£¡ÿˆƒÿ˜•ÿ£œšÿ¦ ÿ¬¤¡ÿ²ª¦ÿ© ÿ–މÿ¥œ–ÿ½±¬ÿŶ©ÿÒ»¥ÿ¤œ–ÿW°ÿ$jÿÿ dÿÿ)hÿô|¢ÿ"gZX=»³°üâÜÙÿÒËÇÿÓËÈÿ«¤¡ÿ‹†„ÿ”ÿ†ƒÿ‹„ÿŠ‚ÿŠ‚ÿˆ|ÿngdÿf_\ÿtiÿwužÿd‚Íÿn‡§ÿ"S—ÿ&týÿ&qÿÿ"kÿÿnÿHuqH¹¶ÿåßÛÿߨÔÿß×Ôÿ¶¯¬ÿŠƒ€ÿˆ…ÿ¾¼ÿ¹´±ÿ¬¦¢ÿ¡™–ÿ™‹ÿ|tpÿ_XUÿaVHÿLL„ÿ Eûÿ(Šþÿ0Šùÿ,ƒÿÿ,ÿÿ&yÿÿO‘ÿ¡x­ÿ4±ûšŽŠQÊÁ½ÿáÚÖÿÚÓÏÿØÐÌÿ´¯¬ÿqifÿ¨¢ ÿÿÿÿÿÿÿÿÿÿÿÿÿúùùÿòððÿçåäÿØÕÔÿÌÊÇÿµ¬žÿ?Oµÿoÿÿ9¦ÿÿ4™ÿÿ3•ÿÿ0ÿÿÿÿv¬õ‚®£Ÿ[ÌÄ¿ÿÜÔÑÿÛÒÏÿçáßÿÆÄÃÿzusÿµ¯®ÿûûûÿÿÿùÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼º»ÿ7dàÿ6­ÿÿCÂÿÿ>¶ÿÿ-¨ÿÿi´òüßÛÚÄÖË¢£›•‰‘„~o‹|vQgTK Áµ±hÍÿÿàÚ×ÿòïíÿöôóÿÅÄÃÿ{usÿþ¹ÿ»½ÚÿY[±ÿtt¸ÿ~}·ÿ®®ÎÿÿÿüÿüüüÿþýýÿÿÿÿÿÜÜÕÿq}—ÿ,œîÿNîÿÿBäÿÿ_ÙÿÿãíïÿøòîÿæååÿÛÚÙÿÜÙÙÿäàßÿtc[=;qÖÐÌÿ÷ôôÿøööÿòðïÿ¿¾½ÿ~wuÿÎÉÅÿïð÷ÿ?EÐÿÕÿÑÿ Åÿ··ßÿÿÿÿÿýÿÿÿ½»¹ÿx)$ÿn ÿeXgÿ[ùÿÿhÿÿÿÚÿÿÿÿÿÿÿþþýÿìêèÿîéèÿöòðÿßÙÖìhVM!ÙÏÊ}ëçåÿùôòÿðéåÿæÜÙÿ¯§£ÿ~tqÿ×ÒÒÿÿÿÿÿâåíÿ/<ìÿöÿôÿ+-àÿæêõÿø±ÿ˜$ÿ±ÿÅÿð°šÿØüÿÿãÿÿÿÿÿÿÿÿÿÿÿüûúÿÛ×ÖÿãÞÜÿþù÷ÿƼ¸Ävf] ÜÒΆµ«¦ÿyhaÿk]WÿbXSÿ@:8ÿ\TQÿèåäÿÿÿÿÿÿÿþÿÆÐéÿ0öÿþÿüÿ]jëÿБgÿÙ: ÿåHÿú¸—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüûûÿóñïÿ×ÓÑÿåàÞÿøóðÿ©œ—œÛÎÉrhaÿ!\oÿ6wŽÿ@w‹ÿ/Wgÿhosÿòìêÿÿÿÿÿÿÿÿÿÿÿûÿ¨¼éÿxŠüÿDPÿÿ ýÿ‹ÇÿÿÖÿÿè¾ÿÿÿÿÿÿÿÿÿÿÿÿÿýüüÿñïìÿæáàÿãÞÛÿ×ÒÏÿÌÇÅÿÖÐÎÿ‚zpÒÆÁ¥–‡€ÿny{ÿƒ††ÿ‰€}ÿeXSÿˆ|xÿõóóÿÿÿÿÿÿÿÿÿÿÿÿÿûûòÿ½ÌÞÿÝêÿÿ…•ÿÿJcùÿÞçôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüÿñîìÿêåâÿÕÐÍÿÍÇÆÿÞØÕÿÝÕÑù~ofGĸ³e¢’‹Éœ…{¹”~s¤ƒpgŠXICkŸ•‘ÃùøøÿÿÿÿÿÿÿÿÿÿÿýÿÇÃÌÿx—×ÿ—Éÿÿ¦áÿÿ¢¼ÒÿÅ•€ÿùö÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôïíÿ½¸µÿÖÐÌÿóìèÿÓÉÄåyh`"ud[tc[ÍÃÁ¥ùøøÿÿÿÿÿÿÿþÿÊÅÍÿIÓÿD¢þÿA«ÿÿ}²ÔÿÉz8ÿï› ÿäË´ÿüÿÿÿüûùÿüûúÿüûúÿýüûÿöõôÿâßÞÿéâàÿìãßÿ¾±¬Ê\H?ÙÐÍ·ûûûÿÿÿþÿÍÇÎÿ0pÒÿ ‚ÿÿ ‡þÿ~Ðÿÿàγÿõ’ÿý¤'ÿê’+ÿèиÿúüþÿ÷õôÿ÷õóÿöóòÿõñðÿøõóÿöóòÿòëçÿ¢”ŸÛÓÏ¿ýüúÿÂÅÏÿ)lÑÿxþÿ ýÿnÁüÿûÿûÿüýþÿì×ÿþ¶;ÿÿ¹JÿñÇ‘ÿú÷ùÿú÷õÿøóðÿôîêÿðéåÿíåâÿïéåÿôîëÿ’ƒ{oìâÝâÙÖÉôôòÿ®Äåÿ—Ñÿÿ´ãÿÿÊïÿÿÿÿÿÿÿÿÿÿüûüÿõõùÿîðîÿæççÿÜØÕÿÎÅÁÿ¸´ÿ¹®©ÿ´©¤ÿªž˜ÿŸ’‹ÿ”…~ÿÀ´®ÿ~nf@èÝÙãÛØÒ÷øøÿÎÍÍÿ¾¶´ÿ®¦¦ÿ•—ÿŒ„‡ÿwwÿxmjÿuhbÿtfaÿvhbÿ{nhÿƒwpÿŽƒ}ÿƒuoÿaLBÿeNDÿhQFÿoWLÿ¥”ŒñiXPçÝØ æßÜÛ‘‰†ÿP8%ÿfH&ÿuT%ÿ‡b'ÿ˜q.ÿ©„<ÿ¶™TÿÀ²ÿÆ¿¾ÿÈÀ¼ÿǽ¸ÿʳÿÄ·±ÿ¬™‘ÿ’ymÿ†{ÿ¤ÿ¯šÿ¡ˆ°cQHçÝØÜÖ×åvbÿË%ÿä«EÿÛ­XÿÔ¯gÿÌ­uÿÅ«ÿ¼¦ƒÿ¶¢ÿ²Ÿ—ÿ­™ÿ¯œ‘ÿ¯œ“ø«™é«š’˨—«™‰ˆ‹{sf“„|F‡woåÚÖ!äßÝ𵤚ÿ¥‹uÿ±ÿµ¤Ÿÿ¸ª¨ÿ¶¨¨ûµ§§çµ©§Ð­Ÿš¹©›”—¯£v˜‰ƒU†xq3l\T}neäÙÖØÐÍ·äßÝåÄ»¹Æ·®ª¤¦›–•‰‚_¶­©?§™*Ž€ziXPÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿÿÿƒÿÿÿÿÿüCÿ÷ýáÿà ðÿà0ÿàààà?àààààÀÀÀáÿÿÿÿÿÿÿ?ÿÿÿÿÿ(0` *M!Bw!Au!@szs_ZmbSsd_pj’{ ¥—»­¥¾±«8Qn\»*}ÿ*}ÿ,‚ÿ.†ÿ+‰ÿI ÿŠ¶ï‘‹‹“ƒu‚y›ˆ¸®ª®¤  ‡}w‰€y‰€y‰€y/V(X&T—&T’;” +“XYf{hYuc[s[Wm[Qv`Mls‚*\›*"cÙ,'rÿ+'sÿ,(wÿ+*zÿ+/ÿ+.„ÿ*WŸÿ n¥ë’›‘ƒw€rioi†|vz{p{|q{|q{|q,F&b-p².f°0 0¥%¡EGvud[qZUj\XXƒ¶D†Ô,mÇ<$fð>#hÿ=$kÿ=%nÿ=%pÿ?FŠÿ#O–ÿYÿ³ÿ…¡õh`[€si{v’‡ƒ„x„…y„…y„…y #7j°NŒä4iÌ- *¤:¡#¡&U $F’ïJšü'0yíO!aÿM!aÿM!büM"dúO%jÿP@rÙ$9V[~º_jš*-G:20<74561661661661=[V—õ6uä?1ª@ #Ÿ P5e— B’ùN%bãbIÛbLÕdMÓeOÔg$[á`3f "#$%$$#" %=G€Ë9zä;#UÍE7v   /+[—W!S¦,‚*Ž„.“ƒ4›€:«@f "   )19@EIKMMKHA90( "-%5dLBn?xw?x†3r• c”e“ l‘ u $€.’‰LM%!  '1:BIOSU]irvsw %Š Aš LœY–gw‡ ‰ƒ(¡|/L   &1@PZXc j hj"q 7z FzY{ hr ^N !   93/ $Eqy*[­Ñ)_¾è)]¾Ö%T½ß #–à vÅ`§ 4vF?HC<4-$  *1#"K<7‹{r`NER?5_NF»ÿ (ª² šY \(1V}?Dˆè¹GÖÿ²ÿ «ú †À 1O-0/-*'&%$!-!4'%4&$-  OB=J”‡€isbZL`LB)dQGVB7eQGgTJ]H?lZQZH>WH@WF=;44;Zy1X™¨ !˜Û§=!«™P2Ijž×^«ÿM×ÿ »ÿ !Àÿ"»ñfa5'%3&$2%#1$",xª¢žÿîëéÿßÛÙÿÓÌÉù¹µâ­¢œÉŠ¥ˆzs‚ve][n^V:\J?dRI_KBVC9%:YJv± “ .‘88l@=gH=DB?Bm™ÍÀÿ D“ûÖAÙÿ,Ìÿ+Éÿ+Îÿ0HÃb1ÆÿMÿÿ4šÿÿ3•ÿÿ1‘ÿÿ0Žÿÿ/‹ÿÿ.ˆÿÿ-…ÿÿ.ƒÿþ0‚ÿîx®ÿxÆÜýŠ–³ufa_LBiWOue\[H?\J@¥š—¥š—¥š—¢–“©ž™ëàØÕÿÜÕÑÿÛÓÏÿÚÒÎÿÙÑÍÿÈÀ½ÿ¤Ÿÿ†ÿ^SPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ööÿÖÓÍÿvx„ÿAíÿ'zÿÿ;­ÿÿ8£ÿÿ6 ÿÿ5ÿÿ4˜ÿÿ3”ÿÿ(Œÿÿ;ŽöÔÂÓéûôë€m`p^UZG>fTLue\[H?\J@³©¥³©¥³©¥±¥¢ ­¢ñÞ×ÓÿÛÓÏÿÙÐÍÿ×ÏËÿãÝÚÿÛØÖÿ´³²ÿ‹ˆ‡ÿf[XÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÌÀÿ`n¡ÿVþÿ:­ÿÿA¿ÿÿ?¸ÿÿ=´ÿÿ;®ÿÿ3¥ÿÿA§ýÿÆÕåàÜÓ˲ÑÊÇž¥™”‘„}ezjbKxg`0rbYZG>\J@¿µ²¿µ²¿µ±½²¯+¸­¨ùÝÕÑÿ×ÏËÿÛÕÑÿíéçÿù÷öÿßÝÜÿ²±°ÿ†€ÿtjgÿýýýÿÏÏÙÿÐÐÓÿßßÚÿèèàÿîîåÿöõëÿÿÿûÿüüûÿúúúÿúúúÿûûûÿûûûÿþþþÿÿÿÿÿ¾»±ÿPuËÿ+ŽÿÿKÛÿÿI×ÿÿGÐÿÿAÆÿÿ;¾ÿÿ¥Ëáÿïæàÿçæçÿåäãÿ××ÖÿËÉÇÿÖÓÒÿÔÑÐþËÃÀßbOF ZG=ÏÄÁÏÄÁÐÄÁÌÀ¼4¾³¯þÙÑÍÿàÚ×ÿôñïÿ÷ôóÿöôóÿÛØ×ÿ±¯®ÿ‚}{ÿ€vsÿþþþÿ§©Çÿ¢ÿ¡ÿ$%¡ÿ++ÿ33ÿnn°ÿüüøÿþþþÿþþþÿýýýÿþþþÿùûûÿËÍÎÿ©¢ ÿhhiÿ0„ÚÿFÙÿÿXûÿÿRòÿÿBåÿÿ ìÿÿÿþûÿùøøÿõôóÿäâáÿáßÞÿÝÚÙÿÖÓÒÿáÞÝÿâÝÙ÷`NE!WE;ÝÓÏÝÓÏÞÔÐ×ËÈ<º¯ªÿåàÝÿöôóÿöóóÿôòñÿöôóÿØÕÔÿ®­¬ÿ€yxÿŽ…‚ÿÿÿÿÿÿÿùÿ…‹ÖÿßÿÝÿÛÿÛÿÄÿŽÇÿÿÿÿÿÿÿÿÿÿÿÿÿüþþÿ¶½½ÿk.&ÿeÿ[ÿV%.ÿKÆëÿWþÿÿTÿÿÿ‰ÿÿÿýÿÿÿÿÿÿÿÿÿþÿþýüÿòïíÿðíëÿôðïÿóïìÿ÷óñÿùµÑ_LCeTJèÞÚèÞÚéßÛßÔÐIÌÄ¿ÿ÷õôÿôñïÿòïíÿðíëÿñíëÿÐÌÊÿ¨¥£ÿ}usÿŸ–”ÿÿÿÿÿÿÿÿÿö÷îÿeqÝÿïÿ ëÿ ëÿïÿ ÒÿÏÏãÿÿÿÿÿúüýÿ²»»ÿ‰>1ÿ ÿ£ÿ¥ÿÒC!ÿÀÚÝÿ˜øÿÿ¡ÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùø÷ÿâÞÜÿÐÌËÿôïíÿñìêÿùõóÿ¨œ–¤VC9_LBîåáîåáðçãáÖÒTÒËÈÿôðïÿíçäÿæßÜÿâÙÕÿÝÔÐÿ¹°­ÿ”ŽŠÿtifÿ¯§¥ÿÿÿÿÿÿÿÿÿÿÿÿÿåçåÿH\êÿ úÿ÷ÿöÿøÿ9=Ùÿóóóÿ¸¸·ÿˆ2)ÿ¼ÿÀÿÆÿÞBÿÿãÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõòñÿáÜÛÿÎËÉÿôîìÿðêçÿôïíÿŒ}vs]JAdRIïåáïåáòèäßÔÐ\É¿ºÿµ¬§ÿsc]ÿkXQÿfRJÿaMDÿP=6ÿ;+%ÿJ<7ÿ¼ºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÏÖßÿ.Kôÿ ýÿûÿüÿ÷ÿvãÿÍ®ÿÓ@ ÿØ5ÿÝ5ÿëXÿÿâÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿïìêÿÔÐÎÿÙÔÒÿôîìÿòìéÿéãàÿsaYDXE;\I@ìãßìãßïæâáÖÓg¾²¬ÿUF?ÿ299ÿ/HNÿ1NVÿ0Ubÿ(MZÿCQÿJTYÿÐÈÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿ­¾ßÿ0Pùÿ%2ýÿûÿþÿòÿ¬®Öÿï½vÿùµzÿüµnÿÿëÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿùöôÿðìêÿéäãÿåáÞÿÚÖÓÿÖÒÏÿ×ÑÏÿÙÔÑÿ×ÏËòcRH`NEbPFéßÛéßÛìâßÚÎÊsµ£›ÿYXUÿ*”¸ÿC¤ÈÿV¥Äÿc£½ÿYƒ—ÿOhuÿmnqÿ×ÐÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúùóÿ¦Àáÿ×åÿÿ¶»þÿ>Qýÿþÿ!4ëÿÒǽÿûâ¬ÿÿöÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿñîíÿèäáÿàÜÚÿàÛÙÿßÙÖÿÔÏÌÿÍÇÅÿÁ¼ºÿÊÅÃÿÁ·±ÏYG=]KB^KBêáÝêáÝîåáÕÊѶ§¡ÿwbXÿh]Wÿsc\ÿ|dZÿƒg\ÿpXMÿ_J@ÿ|lfÿßÛÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçèèÿ—µßÿçóÿÿäîÿÿ‰þÿ,Aúÿn~îÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷öõÿíêèÿíèåÿãÞÜÿÏÊÈÿÅ¿¾ÿßÙÖÿÚÓÐÿïèäÿ¤—¥\J@dSIdSIëâÞëâÞîåâÔÉÄyö°ÿô­ÿ²”ÿ²Ÿ–ÿ°ž–þ¨—î„vpà^SNÉŒ€{çåâáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÈÃÂÿn|Åÿ¬Îÿÿ´ÖþÿÁáÿÿ¼äÿÿ“­ÚÿàÓÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿûùÿúôñÿßÙÖÿ¾¹¶ÿÐËÈÿðéåÿëãßÿíåáÿ‰zrrYF<_MC_MCëâÞëâÞðçãÑÅÀ }ldq€og€zibcn]SLhWM0dTLA3,MC?­¢ž§éæåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÊÄÃÿ^u¾ÿt´ûÿ}¿ÿÿs·þÿ„Ïÿÿ”ÀÝÿ³oDÿÌeÿêÞÝÿÿÿÿÿþýýÿÿþþÿÿþþÿÿÿþÿÿÿþÿÿþþÿÿþþÿûù÷ÿÎÊÈÿ±¬©ÿß×ÔÿéâÞÿèàÛÿâÙÔÿq_WD\I@`MD`MDëâÞëâÞðçãÒÇÂaOFS@6cQI^KA_LB\KCpc\À·³¾³¯µíêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÏÈÄÿRn¼ÿ?šüÿJ¨ÿÿ@žþÿJ´ÿÿˆ»Úÿ°nPÿñ‡ ÿûº5ÿÕ«ÿöôûÿýüúÿûùøÿûúùÿüúùÿüúùÿüúúÿûúùÿüúùÿëéèÿéæåÿíæãÿäÜ×ÿéàÜÿÐÆÁðbOF\H@]JA]JAëâÞëâÞðçãÒÇÂeSJXF<fTL`NDYG<‚slÍÃÀÒÈÅŵÁñïïÿÿÿÿÿÿÿÿÿÿÿþÿÓËÅÿJk»ÿ„ûÿ&”ÿÿŠýÿ›ÿÿÞýÿÊ«‹ÿïzÿú§'ÿûÆhÿï«MÿÚ´–ÿûÿÿÿù÷õÿùöõÿøöõÿøöõÿøööÿøöõÿ÷ôôÿùöõÿú÷öÿ÷õôÿëäáÿèßÚÿ¸«¥ÐXF=_MC_LC_LCëâÞëâÞðçãÒÇÂeSJXF<fTLZI?cRHÌÀ¼ÞÓÑÙÏË;ÊóóñÿÿÿÿÿÿÿþÿÖÎÇÿLkºÿvúÿ†ÿÿ ~ýÿ ‰ýÿ”Úýÿÿÿþÿêêäÿè¾EÿøŽÿõ‡ÿùÿã‚ÿäËÁÿúûüÿ÷ôóÿöóòÿõòðÿóðîÿñíëÿïêçÿîéæÿîéæÿñíëÿõñïÿíåâÿž‰£[H?bOFbOFbOFëâÞëâÞðçãÒÇÂeSJXF<aOFdSIÇ»¶êàÝäÙÕåÛ×ÓÉÆÑ÷ööÿÿþýÿÐËÇÿDj¹ÿlùÿ}ÿÿxüÿ…ýÿ‹ÕüÿÿÿúÿýûùÿûúÿÿßßÎÿõÌFÿû¸<ÿú½GÿûÂYÿ滋ÿóïîÿóîíÿðëéÿïéæÿìæâÿêãßÿéáÝÿéàÜÿéàÜÿëäßÿðêçÿðêæÿ…ulqZG>aNEaNEaNEëâÞëâÞðçãÒÇÂeSJUC9lZQͽôëçëáÝëáÝìãÞ ×ÍÈÙùø÷ÿÞÞÜÿvÀÿHœøÿ^¸ÿÿs¾þÿˆÉþÿ­áüÿÿþùÿýúùÿúùøÿüùøÿúøúÿúúõÿýþüÿýþþÿüÿÿÿüûøÿ÷òîÿõðíÿòëèÿíæãÿèàÛÿáÚÕÿÚÑÌÿÒÈÄÿɾ¹ÿ¾²¬ÿź´ÿàÖÒÿuc[C^KCbPGbPGbPGëâÞëâÞðçãÒÇÂaNEN;1Ç»¶öíéìâÞìâÞìâÞíâÞÖÍÉâù÷÷ÿò÷ûÿñýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüûÿùöõÿòïîÿêæäÿáÜÚÿÖÑÐÿËÄÂÿ¾·´ÿ²©¥ÿ¥›–ÿ˜Œ‡ÿ‹~xÿqjÿvf_ÿtf^ÿo^WÿjYQÿfULÿeRIÿaNDÿs`Xÿö¯ïcRI]KB_MD_MD_MDëâÞëâÞðçãÏÄ¿we]­Ÿ™ëáÝèÞÚçÝÚçÝÚçÝÚèÝÙ×ÏËêÿÿþÿöõôÿÌÇÄÿ·²¯ÿ«¥¢ÿ›•’ÿŒ…ƒÿ}vuÿqihÿf]^ÿ\RSÿSHHÿM?<ÿK:3ÿJ91ÿN<4ÿUC;ÿ_NFÿl\Uÿ|ngÿŽ{ÿ™Ž‰ÿo\RÿlWLÿr[Qÿv_UÿxbWÿx`Uÿ‘{qÿ±¤œÎ[I@_MC_MC_MC_MCèÞÚèÞÚéàÜàÖÒâ×ÓðæãèÞÚçÝÙçÝÙçÝÙçÝÙçÝØÜÔÑñãáàÿ_URÿ7-/ÿ7-/ÿ:.-ÿ@2-ÿI7,ÿU>+ÿbG)ÿrQ'ÿ„`,ÿ–xCÿ¬—jÿ¾·¯ÿÐËÉÿÞÛÙÿçåäÿìêéÿíêéÿéåãÿàÚØÿż·ÿ‚j_ÿeXÿƒi]ÿˆmaÿŽtgÿ“ymÿ¯¥ÿ†¦WD;^LC^LC^LC^LCèÞÚèÞÚçÝÙéßÛêàÜèÞÚèÞÚèÞÚèÞÚèÞÚèÞÚæÜ×'âÛØ÷³­«ÿV?/ÿœm.ÿ¶,ÿÈ-ÿØ2ÿç«7ÿò¹CÿùÆTÿþÒkÿúÝ…ÿôÞÿéÖ•ÿ×ÐÉÿÆ»µÿµ¦Ÿÿ¦“Šÿš…zÿ“{pÿxlÿ”{oÿœƒxÿ­–Œÿ¸¤šÿ¼«¡ÿ¿¯¦ÿ½­¥õ¶§ŸÞ«œ•¼m[R4YF=\I@\I@\I@\I@èÞÚèÞÚèÞÚèÞÚèÞÚèÞÚèÞÚèÞÚèÞÚèÞÚèÞÛåÚÖ3ãÜÚý±©«ÿ™o:ÿþ¸0ÿø¿Pÿê¾eÿܹsÿ̱|ÿº¦ÿ«—€ÿžŠyÿ”~oÿŽvhÿŽujÿ”{oÿž‡|ÿ¬–Œÿ¹¦œÿijªÿɺ³ÿȺ´ûĶ¯éº­¦Í©›•®”„}Š‹{sftd[Due\$m\TYG>bPF[H?\I@\I@\I@\I@éßÛéßÛéßÛéßÛéßÛéßÛéßÛéßÛéßÛéßÛêàÜåÚÕ<áÜÙÿÀ´¯ÿ{^OÿŒoXÿŠp_ÿˆpfÿvoÿ–€yÿ¤ˆÿ³ šÿ±«ÿÏÁ¼ÿÔÉÄÿ×ÌÇÿÓÉÄñǽ·Ø³¨¢½¤˜’˜zuphPrj1`NDhVMfTKP=4iVM_MDm\Sp_W_MDdRH[H?\I@\I@\I@\I@ëáÝëáÝëáÝëáÝëáÝëáÝëáÝëáÝëáÝëáÝìâÞäÙÕEáÛØÿ÷ôòÿÍÀ»ÿ˾»ÿÚÏÌÿáØÕÿæÞÛÿàÙÕøÔÍÉåÄ»·É²¨£§—Š„…–ˆ‚^wg_=iXOraY R?5_LDeTJ_MD{kc]KAlZPm\SXE<m[RbPGn]Tp_W_MDdRH[H?\I@\I@\I@\I@êàÜêàÜêàÜêàÜêàÜêàÜêàÜêàÜêàÜêàÜëáÝæÛØù´®ãßÝèÕÏÌÔº±­¸¥›•“–Š„nyiaJ€qj)eSJXF<o]VUB9{kcgULaOFxg_ZG>fTLkZQdRI|ld^LBlZQm\SXE<m[RbPGn]Tp_W_MDdRH[H?\I@\I@\I@\I@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð?ÿÿÿÿÀ?ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøàÿÿÿÿóðÿø÷ø?ÿðüÿð<ÿðÿðÿðÿðÿðÿðÿðÿðÿðððððððððàðûðÿðÿðÿðÿðÿðÿðÿðÿðÿð?ÿðÿÿðÿÿÿðÿÿÿÿðÿÿÿR2_2_5/images/up.xpm0000644000175000017500000000136711667203025013710 0ustar danieldaniel/* XPM */ static char * up_xpm[] = { "16 16 26 1", " c None", ". c #000000", "+ c #DBDBDB", "@ c #C7C7C7", "# c #EAEAEA", "$ c #C5C5C5", "% c #9C9C9C", "& c #9D9D9D", "* c #A5A5A5", "= c #BBBBBB", "- c #E7E7E7", "; c #9E9E9E", "> c #BEBEBE", ", c #E8E8E8", "' c #A9A9A9", ") c #D6D6D6", "! c #9A9A9A", "~ c #A8A8A8", "{ c #BFBFBF", "] c #EBEBEB", "^ c #AAAAAA", "/ c #DADADA", "( c #ACACAC", "_ c #CACACA", ": c #B8B8B8", "< c #E5E5E5", " ", " ", " ", " ..+ ", " ....@# ", " ......$# ", " ...%&...$# ", " ...&*==...$# ", " ...%*$--$...@ ", " ...;>, #...') ", "...!~) )...{]", "...;{ ...^/", "+.;^) ).;(+", " _:_ _:_ ", " < < ", " "}; R2_2_5/loader/0000755000175000017500000000000012220571344012526 5ustar danieldanielR2_2_5/loader/loader.qrc0000644000175000017500000000014611667203025014506 0ustar danieldaniel ../images/updater-32x32.png R2_2_5/loader/fixPackage0000755000175000017500000001400211667203025014515 0ustar danieldaniel#!/bin/bash PROG=`basename $0` INCLASSISTANT=false INCLDBPLUGINS=false INCLIMAGEPLUGINS=false INCLXTUPLEPLUGINS=false if ! [ -d $QTDIR ]; then for PATHPART in `echo $PATH | tr : " "` ; do if [ -f "$PATHPART"/qmake ] ; then QTDIR="$PATHPART" fi done fi if ! [ -d $QTDIR ]; then echo "Cannot find QTDIR" exit 1 fi if ! [ -d $PGDIR ]; then for PATHPART in `echo $PATH | tr : " "` ; do if [ -f "$PATHPART"/psql ] ; then PGDIR="$PATHPART" fi done fi if ! [ -d $PGDIR/lib ]; then echo "Cannot find PGDIR/lib" exit 1 fi usage() { echo "$PROG [ -h ] [ -a ] [ -p{IDX} ] .../executable.app [ executable-name ]" echo echo "-h get this usage information" echo "-a include Qt Assistant as part of the application bundle" echo "-p include Qt Plugins as part of the application bundle" echo " I => include image plugins [ $INCLIMAGEPLUGINS ]" echo " D => include database plugins [ $INCLDBPLUGINS ]" echo " X => include xTuple plugins [ $INCLXTUPLEPLUGINS ]" echo "-x turn on shell debugging output" echo echo "The executable.app argument is the path of the Macintosh application" echo "bundle directory. This can be either absolute or relative." echo echo "On rare occasion the executable file within the bundle has a different" echo "name than the bundle itself. In this case, add the second executable-name" echo "argument to specify the executable file." echo echo "Env variables:" echo "QTDIR location of Qt installation [ $QTDIR ]" echo "PGDIR location of PostgreSQL installation [ $PGDIR ]" echo echo "Examples:" echo "$PROG ../bin/openrpt.app" echo "$PROG /Users/random-user/testing.app trial" echo "$PROG -a xtuple/trunk/bin/xtuple.app" } set -- `getopt hap:x $*` if [ $? != 0 ] ; then usage exit 1 fi while [ $1 != -- ] ; do case "$1" in -h) usage exit 0 ;; -a) INCLASSISTANT=true ;; -p) if echo $2 | grep -q D ; then INCLDBPLUGINS=true ; fi if echo $2 | grep -q I ; then INCLIMAGEPLUGINS=true ; fi if echo $2 | grep -q X ; then INCLXTUPLEPLUGINS=true ; fi shift ;; -x) set -x ;; *) usage exit 1 ;; esac shift done shift # past the -- if [ $# -lt 1 -o $# -gt 2 ] ; then usage exit 1 elif [ $# -eq 1 ] ; then APPROOT=$1 EXECNAME=`basename $APPROOT .app` elif [ $# -eq 2 ] ; then APPROOT=$1 EXECNAME=$2 fi if ! [ -d "$APPROOT" ] ; then echo "$PROG: $APPROOT does not exist so either rebuild or specify a .app directory" exit 1 elif ! [ -f "$APPROOT/Contents/MacOS/$EXECNAME" ] ; then echo "$PROG: $APPROOT/Contents/MacOS/$EXECNAME does not exist so rebuild, " echo " specify a proper .app directory, or name the executable as well as the .app" exit 1 fi cd $APPROOT || exit 1 APPROOT=`pwd` collectAndRenameLibs() { if [ $# -ne 1 ] ; then echo "$PROG collectAndRenameLibs() expected 1 args and got $#: $*" return 1 fi if expr "$1" : '\/' > /dev/null ; then FILE="$1" else FILE="`pwd`/$1" fi STARTDIR=`pwd` NEWLOC="@executable_path/../Frameworks" FRAMEWORKSDIR=$APPROOT/Contents/Frameworks [ -d $FRAMEWORKSDIR ] || mkdir $FRAMEWORKSDIR || return 1 cd $FRAMEWORKSDIR || return 1 LIBSTORENAME=`otool -L $FILE | egrep "($QTDIR|$PGDIR)" | awk '{print $1}'` for TORENAME in $LIBSTORENAME ; do BASETORENAME=`basename $TORENAME` [ -e "$BASETORENAME" ] || cp "$TORENAME" . || return 1 install_name_tool -id $NEWLOC/$BASETORENAME $BASETORENAME || return 1 install_name_tool -change $TORENAME $NEWLOC/$BASETORENAME $FILE || return 1 done cd $STARTDIR || return 1 return 0 } collectAndRenameLibs $APPROOT/Contents/MacOS/$EXECNAME || exit 2 [ -d $APPROOT/Contents/Resources ] || mkdir $APPROOT/Contents/Resources || exit 3 cd $APPROOT/Contents/Resources || exit 3 # create a qt.conf file pointing to the plugins directory echo "[Paths]" > qt.conf echo "Prefix = .." >> qt.conf if $INCLIMAGEPLUGINS ; then [ -d $APPROOT/Contents/plugins/imageformats ] || \ mkdir -p $APPROOT/Contents/plugins/imageformats || exit 2 TMPPLUGINS=`ls $QTDIR/plugins/imageformats/*.dylib | grep -v _debug` cp $TMPPLUGINS $APPROOT/Contents/plugins/imageformats || exit 2 fi if $INCLDBPLUGINS ; then [ -d $APPROOT/Contents/plugins/sqldrivers ] || \ mkdir -p $APPROOT/Contents/plugins/sqldrivers || exit 2 TMPPLUGINS=`ls $QTDIR/plugins/sqldrivers/*.dylib | grep -v _debug` cp $TMPPLUGINS $APPROOT/Contents/plugins/sqldrivers || exit 2 fi if $INCLXTUPLEPLUGINS ; then [ -d $APPROOT/Contents/plugins/designer ] || \ mkdir -p $APPROOT/Contents/plugins/designer || exit 2 cp $QTDIR/plugins/designer/libxtuplewidgets.dylib $APPROOT/Contents/plugins/designer || exit 2 fi for PLUGIN in $APPROOT/Contents/plugins/*/*.dylib ; do collectAndRenameLibs $PLUGIN || exit 2 done if $INCLASSISTANT ; then cp -r $QTDIR/bin/Assistant_adp.app $APPROOT/Contents/Resources/Assistant_adp.app || exit 3 collectAndRenameLibs $APPROOT/Contents/Resources/Assistant_adp.app/Contents/MacOS/Assistant_adp || exit 3 cd $APPROOT/Contents/Resources/Assistant_adp.app/Contents || exit 3 ln -s ../../../Frameworks . || exit 3 echo "[Paths]" > qt.conf echo "Prefix = .." >> qt.conf fi while [ `otool -L $APPROOT/Contents/Frameworks/* | egrep "($QTDIR|$PGDIR)" | wc -l` -gt 0 ] ; do for LIB in $APPROOT/Contents/Frameworks/* ; do collectAndRenameLibs $LIB || exit 4 done done cd $APPROOT/Contents/MacOS for PDIR in sqldrivers imageformats ; do if [ ! -e $PDIR ] ; then if [ -L $PDIR ] ; then rm $PDIR fi ln -s ../plugins/$PDIR || exit 4 fi done cd $APPROOT exit 0 R2_2_5/loader/Info.plist0000644000175000017500000000101411667203025014474 0ustar danieldaniel CFBundleIconFile @ICON@ CFBundlePackageType APPL CFBundleGetInfoString 2.2.4 CFBundleSignature xtuple CFBundleExecutable @EXECUTABLE@ CFBundleIdentifier com.xtuple.Updater R2_2_5/loader/loader.pro0000644000175000017500000000253211667203025014522 0ustar danieldaniel# # This file is part of the xTuple ERP: PostBooks Edition, a free and # open source Enterprise Resource Planning software suite, # Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. # It is licensed to you under the Common Public Attribution License # version 1.0, the full text of which (including xTuple-specific Exhibits) # is available at www.xtuple.com/CPAL. By using this software, you agree # to be bound by its terms. # include( ../global.pri ) TEMPLATE = app CONFIG += qt warn_on DEPENDPATH += ../$${XTUPLE_BLD}/common TARGET = updater OBJECTS_DIR = tmp MOC_DIR = tmp UI_DIR = tmp LIBS += -L../$${OPENRPT_BLD}/lib -L../$${XTUPLE_BLD}/lib -lxtuplecommon -L../lib -lupdatercommon -lcommon -lrenderer macx: LIBS += -lz win32-msvc* { PRE_TARGETDEPS += ../lib/updatercommon.lib \ ../$${OPENRPT_BLD}/lib/common.lib \ ../$${OPENRPT_BLD}/lib/renderer.lib } else { PRE_TARGETDEPS += ../lib/libupdatercommon.a \ ../$${OPENRPT_BLD}/lib/libcommon.a \ ../$${OPENRPT_BLD}/lib/librenderer.a } DESTDIR = ../bin RC_FILE = rcloader.rc macx { RC_FILE = ../images/updater.icns QMAKE_INFO_PLIST = Info.plist } FORMS += loaderwindow.ui HEADERS += loaderwindow.h SOURCES += loaderwindow.cpp \ main.cpp QT += xml sql RESOURCES += loader.qrc R2_2_5/loader/loaderwindow.cpp0000644000175000017500000012300011667203025015726 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "loaderwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "data.h" #include "xsqlquery.h" #define DEBUG false #if defined(Q_OS_WIN32) #define NOCRYPT #include #undef LoadImage #else #if defined(Q_OS_MACX) #include #endif #endif extern QString _databaseURL; extern bool _autoRun; QString LoaderWindow::_rollbackMsg(tr("

The upgrade has " "been aborted due to an error and your " "database was rolled back to the state " "it was in when the upgrade was " "initiated.
")); LoaderWindow::LoaderWindow(QWidget* parent, const char* name, Qt::WindowFlags fl) : QMainWindow(parent, fl) { setupUi(this); setObjectName(name); (void)statusBar(); _multitrans = false; _premultitransfile = false; _package = 0; _files = 0; _dbTimerId = startTimer(60000); fileNew(); setWindowTitle(); } LoaderWindow::~LoaderWindow() { // no need to delete child widgets, Qt does it all for us } void LoaderWindow::languageChange() { retranslateUi(this); } void LoaderWindow::fileNew() { // we don't actually create files here but we are using this as the // stub to unload and properly setup the UI to respond correctly to // having no package currently loaded. if(_package != 0) { delete _package; _package = 0; } if(_files != 0) { delete _files; _files = 0; } _pkgname->setText(tr("No Package is currently loaded.")); _status->clear(); _status->setEnabled(false); _progress->setValue(0); _progress->setEnabled(false); _text->clear(); _text->setEnabled(false); _start->setEnabled(false); } bool LoaderWindow::openFile(QString pfilename) { fileNew(); QFileInfo fi(pfilename); if (fi.filePath().isEmpty()) return false; QByteArray data = gunzipFile(fi.filePath()); if(data.isEmpty()) { QMessageBox::warning(this, tr("Error Opening File"), tr("

The file %1 appears to be empty or it is not " "compressed in the expected format.") .arg(fi.filePath())); return false; } _files = new TarFile(data); if(!_files->isValid()) { QMessageBox::warning(this, tr("Error Opening file"), tr("

The file %1 does not appear to contain a valid " "update package (not a valid TAR file?).") .arg(fi.filePath())); delete _files; _files = 0; return false; } // find the content file QStringList list = _files->_list.keys(); QString contentFile = QString::null; QStringList contentsnames; contentsnames << "package.xml" << "contents.xml"; for (int i = 0; i < contentsnames.size() && contentFile.isNull(); i++) { for(QStringList::Iterator mit = list.begin(); mit != list.end(); ++mit) { QFileInfo fi(*mit); if(fi.fileName() == contentsnames.at(i)) { if(!contentFile.isNull()) { QMessageBox::warning(this, tr("Error Opening file"), tr("

Multiple %1 files found in %2. " "Currently only packages containing a single " "content.xml file are supported.") .arg(contentsnames.at(i)).arg(fi.filePath())); delete _files; _files = 0; return false; } contentFile = *mit; } } } QStringList msgList; QList fatalList; if(contentFile.isNull()) { QMessageBox::warning(this, tr("Error Opening file"), tr("

No %1 file was found in package %2.") .arg(contentsnames.join(" or ")).arg(fi.filePath())); delete _files; _files = 0; return false; } else if (! contentFile.endsWith(contentsnames.at(0))) { qDebug("Deprecated Package Format: Packages for this version of " "the Updater should have their contents described by a file " "named %s. The current package being loaded uses an outdated " "file name %s.", qPrintable(contentsnames.at(0)), qPrintable(contentFile)); } QByteArray docData = _files->_list[contentFile]; QDomDocument doc; QString errMsg; int errLine, errCol; if(!doc.setContent(docData, &errMsg, &errLine, &errCol)) { QMessageBox::warning(this, tr("Error Opening file"), tr("

There was a problem reading the %1 file in " "this package.
%2
Line %3, Column %4") .arg(contentFile).arg(errMsg) .arg(errLine).arg(errCol)); delete _files; _files = 0; return false; } _text->clear(); _text->setEnabled(true); QString delayedWarning; _package = new Package(doc.documentElement(), msgList, fatalList); if (msgList.size() > 0) { bool fatal = false; if (DEBUG) qDebug("LoaderWindow::fileOpen() i fatal msg"); for (int i = 0; i < msgList.size(); i++) { _text->append(QString("
%2") .arg(fatalList.at(i) ? "red" : "orange") .arg(msgList.at(i))); fatal = fatal || fatalList.at(i); if (DEBUG) qDebug("LoaderWindow::fileOpen() %2d %5d %s", i, fatalList.at(i), qPrintable(msgList.at(i))); } if (fatal) { _text->append(tr("

The %1 file appears " "to be invalid.

").arg(contentFile)); return false; } else delayedWarning = tr("

The %1 file " "seems to have problems. You should contact %2 " "before proceeding.

") .arg(contentFile) .arg(_package->developer().isEmpty() ? tr("the package developer") : _package->developer()); } _pkgname->setText(tr("Package %1 (%2)").arg(_package->id()).arg(fi.filePath())); _progress->setValue(0); _progress->setMaximum( _package->_privs.size() + _package->_metasqls.size() + _package->_reports.size() + _package->_appuis.size() + _package->_appscripts.size() + _package->_cmds.size() + _package->_images.size() + _package->_prerequisites.size() + _package->_initscripts.size() + _package->_scripts.size() + _package->_functions.size() + _package->_tables.size() + _package->_triggers.size() + _package->_views.size() + _package->_finalscripts.size() + 2); _progress->setEnabled(true); if (DEBUG) qDebug("LoaderWindow::fileOpen() progress initialized to max %d", _progress->maximum()); _status->setEnabled(true); _status->setText(tr("

Checking Prerequisites!

")); _text->append("

Prerequisites:
"); bool allOk = true; // check prereqs QString str; QStringList strlist; QStringList::Iterator slit; XSqlQuery qry; for(QList::iterator i = _package->_prerequisites.begin(); i != _package->_prerequisites.end(); ++i) { _status->setText(tr("

Checking Prerequisites!

%1...

") .arg((*i)->name())); _text->append(tr("%1").arg((*i)->name())); if (! (*i)->met(errMsg)) { allOk = false; str = QString("
%1
").arg(tr("Failed")); if (! errMsg.isEmpty()) str += tr("

%1

").arg(errMsg); strlist = (*i)->providerList(); if(strlist.count() > 0) { str += tr("Requires:
"); str += tr("
    "); for(slit = strlist.begin(); slit != strlist.end(); ++slit) str += tr("
  • %1: %2
  • ").arg((*i)->provider(*slit).package()).arg((*i)->provider(*slit).info()); str += tr("
"); } str += tr(""); _text->append(str); if (DEBUG) qDebug("%s", qPrintable(str)); } } if(!allOk) { _status->setText(tr("

Checking Prerequisites!

One or more prerequisites FAILED. These prerequisites must be satisified before continuing.

")); return false; } _status->setText(tr("

Checking Prerequisites!

Check completed.

")); if (delayedWarning.isEmpty()) _text->append(tr("

Ready to Start update!

")); else { _text->append(tr("

Ready to Start update!

")); _text->append(delayedWarning); } _text->append(tr("

NOTE: Have you backed up your database? If not, you should " "backup your database now. It is good practice to backup a database " "before updating it.

")); /* single vs multiple transaction functionality was added at around the same time as OpenMFG/PostBooks 2.3.0 was being developed. before 2.3.0, update scripts from xTuple (OpenMFG, LLC) assumed multiple transactions (one per file within the package). take advantage of the update package naming conventions to see if we've been given a pre-2.3.0 file and *need* to use multiple transactions. */ _premultitransfile = false; _start->setEnabled(true); return true; } void LoaderWindow::fileOpen() { fileNew(); QSettings settings("xTuple.com", "Updater"); QString path = settings.value("LastDirectory").toString(); QString filename = QFileDialog::getOpenFileName(this, tr("Open Package"), path, tr("Package Files (*.gz);;All Files (*.*)")); if (! openFile(filename)) return; QFileInfo fi(filename); settings.setValue("LastDirectory", fi.path()); } void LoaderWindow::fileExit() { qApp->closeAllWindows(); } void LoaderWindow::helpContents() { launchBrowser(this, "http://wiki.xtuple.org/UpdaterDoc"); } // copied from xtuple/guiclient/guiclient.cpp and made independent of Qt3Support // TODO: put in a generic place and use both from there or use WebKit instead void LoaderWindow::launchBrowser(QWidget * w, const QString & url) { #if defined(Q_OS_WIN32) // Windows - let the OS do the work QT_WA( { ShellExecute(w->winId(), 0, (TCHAR*)url.utf16(), 0, 0, SW_SHOWNORMAL ); } , { ShellExecuteA( w->winId(), 0, url.toLocal8Bit(), 0, 0, SW_SHOWNORMAL ); } ); #else QString b(getenv("BROWSER")); QStringList browser; if (! b.isEmpty()) browser = b.split(':'); #if defined(Q_OS_MACX) browser.append("/usr/bin/open"); #else // append this on linux just as a good guess browser.append("/usr/bin/firefox"); browser.append("/usr/bin/mozilla"); #endif for(QStringList::const_iterator i=browser.begin(); i!=browser.end(); ++i) { QString app = *i; if(app.contains("%s")) { app.replace("%s", url); } else { app += " " + url; } app.replace("%%", "%"); QProcess *proc = new QProcess(w); QStringList args = app.split(QRegExp(" +")); QString appname = args.takeFirst(); proc->start(appname, args); if (proc->waitForStarted() && proc->waitForFinished()) return; QMessageBox::warning(w, tr("Failed to open URL"), tr("

Before you can run a web browser you must " "set the environment variable BROWSER to point " "to the browser executable.") ); } #endif // if not windows } void LoaderWindow::helpAbout() { QMessageBox::about(this, _name, tr("

Apply update packages to your xTuple ERP database." "

Version %1

" "

%2

" "All Rights Reserved") .arg(_version).arg(_copyright)); } void LoaderWindow::timerEvent( QTimerEvent * e ) { if(e->timerId() == _dbTimerId) { QSqlDatabase db = QSqlDatabase::database(QSqlDatabase::defaultConnection,FALSE); if(db.isValid()) XSqlQuery qry("SELECT CURRENT_DATE;"); // if we are not connected then we have some problems! } } /* use _multitrans to see if the user requested a single transaction wrapped around the entire import but use _premultitransfile to see if we need multiple transactions even if the user requested one. */ bool LoaderWindow::sStart() { bool returnValue = false; _start->setEnabled(false); _text->setText("

"); QDateTime startTime = QDateTime::currentDateTime(); _text->append(tr("

Starting Update at %1

").arg(startTime.toString())); QString prefix = QString::null; if(!_package->id().isEmpty()) prefix = _package->id() + "/"; XSqlQuery qry; if(!_multitrans && !_premultitransfile) qry.exec("begin;"); PkgSchema schema(_package->name(), tr("Schema to hold contents of %1").arg(_package->name())); QString errMsg; int pkgid = -1; if (! _package->name().isEmpty()) { pkgid = _package->writeToDB(errMsg); if (pkgid >= 0) _text->append(tr("Saving Package Header was successful.")); else { _text->append(errMsg); qry.exec("rollback;"); if(!_multitrans && !_premultitransfile) { _text->append(_rollbackMsg); return false; } } if (schema.create(errMsg) >= 0 && schema.setPath(errMsg) >= 0) _text->append(tr("Saving Schema for Package was successful.")); else { _text->append(errMsg); qry.exec("rollback;"); if(!_multitrans && !_premultitransfile) { _text->append(_rollbackMsg); return false; } } } int ignoredErrCnt = 0; int tmpReturn = 0; if (_package->_initscripts.size() > 0) { _status->setText(tr("

Running Initialization

")); _text->append(tr("

Applying initialization scripts...

")); for(QList::iterator i = _package->_initscripts.begin(); i != _package->_initscripts.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) { qry.exec("ROLLBACK;"); _text->append(_rollbackMsg); return false; } else ignoredErrCnt += tmpReturn; } } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after initialization", _progress->value(), _progress->maximum()); if (disableTriggers() < 0) { qry.exec("ROLLBACK;"); _text->append(_rollbackMsg); return false; } if (_package->_privs.size() > 0) { _status->setText(tr("

Updating Privileges

")); _text->append(tr("

Loading new Privileges...

")); for(QList::iterator i = _package->_privs.begin(); i != _package->_privs.end(); ++i) { tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new Privileges.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after privs", _progress->value(), _progress->maximum()); if (_package->_scripts.size() > 0) { _status->setText(tr("

Updating Schema

")); _text->append(tr("

Applying database change files...

")); for(QList::iterator i = _package->_scripts.begin(); i != _package->_scripts.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } } if (_package->_functions.size() > 0) { _status->setText(tr("

Updating Function Definitions

")); _text->append(tr("

Loading new Function definitions...

")); for(QList::iterator i = _package->_functions.begin(); i != _package->_functions.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new function definitions.

")); } if (_package->_tables.size() > 0) { _status->setText(tr("

Updating Table Definitions

")); _text->append(tr("

Loading new Table definitions...

")); for(QList::iterator i = _package->_tables.begin(); i != _package->_tables.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new table definitions.

")); } if (_package->_triggers.size() > 0) { _status->setText(tr("

Updating Trigger Definitions

")); _text->append(tr("

Loading new Trigger definitions...

")); for(QList::iterator i = _package->_triggers.begin(); i != _package->_triggers.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new trigger definitions.

")); } if (_package->_views.size() > 0) { _status->setText(tr("

Updating View Definitions

")); _text->append(tr("

Loading new View definitions...

")); for(QList::iterator i = _package->_views.begin(); i != _package->_views.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new view definitions.

")); } if (_package->_metasqls.size() > 0) { _status->setText(tr("

Updating MetaSQL Statements

")); _text->append(tr("

Loading new MetaSQL Statements...

")); for(QList::iterator i = _package->_metasqls.begin(); i != _package->_metasqls.end(); ++i) { tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new MetaSQL Statements.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after metasql", _progress->value(), _progress->maximum()); if (_package->_reports.size() > 0) { _status->setText(tr("

Updating Report Definitions

")); _text->append(tr("

Loading new report definitions...

")); for(QList::iterator i = _package->_reports.begin(); i != _package->_reports.end(); ++i) { tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing new report definitions.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after reports", _progress->value(), _progress->maximum()); if (_package->_appuis.size() > 0) { _status->setText(tr("

Updating User Interface Definitions

")); _text->append(tr("

Loading User Interface definitions...

")); for(QList::iterator i = _package->_appuis.begin(); i != _package->_appuis.end(); ++i) { if (DEBUG) qDebug("LoaderWindow::sStart() - loading ui %s in file %s", qPrintable((*i)->name()), qPrintable((*i)->filename())); tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing User Interface definitions.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after uis", _progress->value(), _progress->maximum()); if (_package->_appscripts.size() > 0) { _status->setText(tr("

Updating Application Script Definitions

")); _text->append(tr("

Loading Application Script definitions...

")); for(QList::iterator i = _package->_appscripts.begin(); i != _package->_appscripts.end(); ++i) { if (DEBUG) qDebug("LoaderWindow::sStart() - loading appscript %s in file %s", qPrintable((*i)->name()), qPrintable((*i)->filename())); tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing Application Script definitions.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after app scripts", _progress->value(), _progress->maximum()); if (_package->_cmds.size() > 0) { _status->setText(tr("

Updating Custom Commands

")); _text->append(tr("

Loading new Custom Commands...

")); if (! _package->system() && (! qry.exec("ALTER TABLE pkgcmd DISABLE TRIGGER pkgcmdaltertrigger;") || ! qry.exec("ALTER TABLE pkgcmdarg DISABLE TRIGGER pkgcmdargaltertrigger;"))) { qry.exec("ROLLBACK;"); _text->append(_rollbackMsg); return false; } for(QList::iterator i = _package->_cmds.begin(); i != _package->_cmds.end(); ++i) { if (DEBUG) qDebug("LoaderWindow::sStart() - loading cmd %s", qPrintable((*i)->name())); tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } XSqlQuery qry("SELECT updateCustomPrivs();"); _text->append(tr("

Completed importing new Custom Commands.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after cmds", _progress->value(), _progress->maximum()); if (_package->_images.size() > 0) { _status->setText(tr("

Updating Image Definitions

")); _text->append(tr("

Loading Image definitions...

")); for(QList::iterator i = _package->_images.begin(); i != _package->_images.end(); ++i) { if (DEBUG) qDebug("LoaderWindow::sStart() - loading image %s in file %s", qPrintable((*i)->name()), qPrintable((*i)->filename())); tmpReturn = applyLoadable(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } _text->append(tr("

Completed importing Image definitions.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after images", _progress->value(), _progress->maximum()); if (_package->_prerequisites.size() > 0) { _status->setText(tr("

Updating Package Dependencies

")); _text->append(tr("

Loading Package Dependencies...

")); for(QList::iterator i = _package->_prerequisites.begin(); i != _package->_prerequisites.end(); ++i) { if ((*i)->type() == Prerequisite::Dependency) { if (DEBUG) qDebug("LoaderWindow::sStart() - saving dependency %s", qPrintable((*i)->name())); if ((*i)->writeToDB(_package->name(), errMsg) >= 0) _text->append(tr("Saving dependency %1 was successful.") .arg((*i)->name())); else { _text->append(errMsg); qry.exec("rollback;"); if(!_multitrans && !_premultitransfile) { _text->append(_rollbackMsg); return false; } } } _progress->setValue(_progress->value() + 1); } _text->append(tr("

Completed updating dependencies.

")); } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after dependencies", _progress->value(), _progress->maximum()); if (enableTriggers() < 0) { qry.exec("ROLLBACK;"); _text->append(_rollbackMsg); return false; } if (_package->_finalscripts.size() > 0) { _status->setText(tr("

Running Final Cleanup

")); _text->append(tr("

Applying final cleanup scripts...

")); for(QList::iterator i = _package->_finalscripts.begin(); i != _package->_finalscripts.end(); ++i) { tmpReturn = applySql(*i, _files->_list[prefix + (*i)->filename()]); if (tmpReturn < 0) return false; else ignoredErrCnt += tmpReturn; } } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after final cleanup", _progress->value(), _progress->maximum()); _progress->setValue(_progress->value() + 1); if (_alwaysrollback->isChecked()) { _text->append(tr("

The Update has been rolled back.

")); qry.exec("rollback;"); } else if (ignoredErrCnt > 0 && (_multitrans || _premultitransfile) && QMessageBox::question(this, tr("Ignore Errors?"), tr("

One or more errors were ignored while " "processing this Package. Are you sure you " "want to commit these changes?

If you " "answer 'No' then this import will be rolled " "back.

"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::Yes) { qry.exec("commit;"); _text->append(tr("

The Update is now complete but errors were ignored!

")); // this is currently being done in two places and it shouldn't be QDateTime endTime = QDateTime::currentDateTime(); _text->append(tr("

Completed Update at %1

").arg(endTime.toString())); int elapsed = startTime.secsTo(endTime); int sec = elapsed % 60; elapsed = (elapsed - sec) / 60; int min = elapsed % 60; elapsed = (elapsed - min) / 60; int hour = elapsed; _text->append(tr("

Total elapsed time is %1h %2m %3s

").arg(hour).arg(min).arg(sec)); // end of the section being done in two places _progress->setValue(_progress->maximum()); } else if (ignoredErrCnt > 0) { qry.exec("rollback;"); _text->append(_rollbackMsg); } else { qry.exec("commit;"); _text->append(tr("

The Update is now complete!

")); // this is currently being done in two places and it shouldn't be QDateTime endTime = QDateTime::currentDateTime(); _text->append(tr("

Completed Update at %1

").arg(endTime.toString())); int elapsed = startTime.secsTo(endTime); int sec = elapsed % 60; elapsed = (elapsed - sec) / 60; int min = elapsed % 60; elapsed = (elapsed - min) / 60; int hour = elapsed; _text->append(tr("

Total elapsed time is %1h %2m %3s

").arg(hour).arg(min).arg(sec)); // end of the section being done in two places _progress->setValue(_progress->maximum()); returnValue = true; // Close the program if the -autoRun argument is used and the upgrade is successful. if (_autoRun) { fileExit(); return returnValue; } } if (DEBUG) qDebug("LoaderWindow::sStart() progress %d out of %d after commit", _progress->value(), _progress->maximum()); if (! _package->system() && schema.clearPath(errMsg) < 0) { _text->append(tr("

The update completed " "successfully but there was an error resetting " "the schema path:

%1
" "

Quit the updater and start it " "again if you want to apply another update.

")); } return returnValue; } void LoaderWindow::setMultipleTransactions(bool mt) { _multitrans = mt; } void LoaderWindow::setDebugPkg(bool p) { _alwaysrollback->setVisible(p); _alwaysrollback->setEnabled(p); } int LoaderWindow::applySql(Script *pscript, const QByteArray psql) { if (DEBUG) qDebug("LoaderWindow::applySql() - running script %s in file %s", qPrintable(pscript->name()), qPrintable(pscript->filename())); XSqlQuery qry; bool again = false; int returnVal = 0; do { QString message; if(_multitrans || _premultitransfile) { qry.exec("begin;"); if (pscript->onError() == Script::Default) pscript->setOnError(Script::Prompt); } else { qry.exec("SAVEPOINT updaterFile;"); if (pscript->onError() == Script::Default) pscript->setOnError(Script::Stop); } int scriptreturn = pscript->writeToDB(psql, _package->name(), message); if (scriptreturn == -1) { _text->append(tr("%2
") .arg("orange") .arg(message)); } else if (scriptreturn < 0) { bool fatal = ! ((_multitrans || _premultitransfile) && pscript->onError() == Script::Ignore); _text->append(tr("

%2
") .arg(fatal ? "red" : "orange") .arg(message)); if(_multitrans || _premultitransfile) qry.exec("rollback;"); else qry.exec("ROLLBACK TO updaterFile;"); switch (pscript->onError()) { case Script::Stop: if (DEBUG) qDebug("LoaderWindow::applySql() taking Script::Stop branch"); qry.exec("rollback;"); _text->append(_rollbackMsg); return scriptreturn; break; case Script::Ignore: if (DEBUG) qDebug("LoaderWindow::applySql() taking Script::Ignore branch"); _text->append(tr("IGNORING the above " "errors and skipping script %1.
") .arg(pscript->filename())); returnVal++; break; case Script::Prompt: if (DEBUG) qDebug("LoaderWindow::applySql() taking Script::Prompt branch"); default: if (DEBUG) qDebug("LoaderWindow::applySql() taking default branch"); switch(QMessageBox::question(this, tr("Encountered an Error"), tr("

%1.

Please select the action " "that you would like to take.").arg(message), tr("Retry"), tr("Ignore"), tr("Abort"), 0, 0 )) { case 0: _text->append(tr("RETRYING...")); again = true; break; case 1: _text->append(tr("IGNORING the " "above errors at user request and " "skipping script %1.
") .arg(pscript->filename()) ); returnVal++; break; case 2: default: qry.exec("rollback;"); _text->append(_rollbackMsg); return scriptreturn; break; } } } else _text->append(tr("Import of %1 was successful.").arg(pscript->filename())); } while (again); if ((_multitrans || _premultitransfile) && ! _alwaysrollback->isChecked()) qry.exec("commit;"); else qry.exec("RELEASE SAVEPOINT updaterFile;"); _progress->setValue(_progress->value() + 1); return returnVal; } // similar to applySql but Loadable::writeDoDB() returning -1 is a real error int LoaderWindow::applyLoadable(Loadable *pscript, const QByteArray psql) { if (DEBUG) qDebug("LoaderWindow::applyLoadable(%s in %s, %s)", qPrintable(pscript->name()), qPrintable(pscript->filename()), psql.data()); XSqlQuery qry; bool again = false; int returnVal = 0; do { QString message; if(_multitrans || _premultitransfile) { qry.exec("begin;"); if (pscript->onError() == Script::Default) pscript->setOnError(Script::Prompt); } else { qry.exec("SAVEPOINT updaterFile;"); if (pscript->onError() == Script::Default) pscript->setOnError(Script::Stop); } int scriptreturn = pscript->writeToDB(psql, _package->name(), message); if (scriptreturn < 0) { bool fatal = ! ((_multitrans || _premultitransfile) && pscript->onError() == Script::Ignore); _text->append(tr("
%2
") .arg(fatal ? "red" : "orange") .arg(message)); if(_multitrans || _premultitransfile) qry.exec("rollback;"); else qry.exec("ROLLBACK TO updaterFile;"); switch (pscript->onError()) { case Script::Stop: if (DEBUG) qDebug("LoaderWindow::applyLoadable() taking Script::Stop branch"); qry.exec("rollback;"); _text->append(_rollbackMsg); return scriptreturn; break; case Script::Ignore: if (DEBUG) qDebug("LoaderWindow::applyLoadable() taking Script::Ignore branch"); _text->append(tr("IGNORING the above " "errors and skipping script %1.
") .arg(pscript->filename())); returnVal++; break; case Script::Prompt: if (DEBUG) qDebug("LoaderWindow::applyLoadable() taking Script::Prompt branch"); default: if (DEBUG) qDebug("LoaderWindow::applyLoadable() taking default branch"); switch(QMessageBox::question(this, tr("Encountered an Error"), tr("

%1.

Please select the action " "that you would like to take.").arg(message), tr("Retry"), tr("Ignore"), tr("Abort"), 0, 0 )) { case 0: _text->append(tr("RETRYING...")); again = true; break; case 1: _text->append(tr("IGNORING the " "above errors at user request and " "skipping script %1.
") .arg(pscript->filename()) ); returnVal++; break; case 2: default: qry.exec("rollback;"); _text->append(_rollbackMsg); return scriptreturn; break; } } } else _text->append(tr("Import of %1 was successful.").arg(pscript->filename())); } while (again); if ((_multitrans || _premultitransfile) && ! _alwaysrollback->isChecked()) qry.exec("commit;"); else qry.exec("RELEASE SAVEPOINT updaterFile;"); _progress->setValue(_progress->value() + 1); return returnVal; } int LoaderWindow::disableTriggers() { QString schema; for (QList::iterator i = _package->_privs.begin(); i != _package->_privs.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkgpriv")) _triggers.append("pkgpriv"); else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkgpriv")) _triggers.append(schema + ".pkgpriv"); } if (_package->_metasqls.size() > 0) { _triggers.append("public.metasql"); for (QList::iterator i = _package->_metasqls.begin(); i != _package->_metasqls.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkgmetasql")) _triggers.append("pkgmetasql"); else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkgmetasql")) _triggers.append(schema + ".pkgmetasql"); } } for (QList::iterator i = _package->_reports.begin(); i != _package->_reports.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkgreport")) _triggers.append("pkgreport"); else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkgreport")) _triggers.append(schema + ".pkgreport"); } for (QList::iterator i = _package->_appuis.begin(); i != _package->_appuis.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkguiform")) _triggers.append("pkguiform"); else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkguiform")) _triggers.append(schema + ".pkguiform"); } for (QList::iterator i = _package->_appscripts.begin(); i != _package->_appscripts.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkgscript")) _triggers.append("pkgscript"); else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkgscript")) _triggers.append(schema + ".pkgscript"); } for (QList::iterator i = _package->_cmds.begin(); i != _package->_cmds.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkgcmd")) { _triggers.append("pkgcmd"); _triggers.append("pkgcmdarg"); } else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkgcmd")) { _triggers.append(schema + ".pkgcmd"); _triggers.append(schema + ".pkgcmdarg"); } } for (QList::iterator i = _package->_images.begin(); i != _package->_images.end(); ++i) { schema = (*i)->schema(); if (schema.isEmpty() && ! _package->system() && ! _triggers.contains("pkgimage")) _triggers.append("pkgimage"); else if (! schema.isEmpty() && "public" != schema && ! _triggers.contains(schema + ".pkgimage")) _triggers.append(schema + ".pkgimage"); } QRegExp beforeDot(".*\\."); QString empty; for (int i = 0; i < _triggers.size(); i++) { QString triggername(_triggers.at(i)); triggername.replace(beforeDot, empty); XSqlQuery disableq(QString("ALTER TABLE %1 DISABLE TRIGGER %2altertrigger;") .arg(_triggers.at(i)) .arg(triggername)); disableq.exec(); if (disableq.lastError().type() != QSqlError::NoError) { _text->append(tr("
Could not disable %1 trigger:" "

%2

") .arg(_triggers.at(i)) .arg(disableq.lastError().text())); return -1; } } return _triggers.size(); } int LoaderWindow::enableTriggers() { QRegExp beforeDot(".*\\."); QString empty; for (int i = _triggers.size() - 1; i >= 0; i--) { QString triggername(_triggers.at(i)); triggername.replace(beforeDot, empty); XSqlQuery enableq(QString("ALTER TABLE %1 ENABLE TRIGGER %2altertrigger;") .arg(_triggers.at(i)) .arg(triggername)); enableq.exec(); if (enableq.lastError().type() != QSqlError::NoError) { _text->append(tr("
Could not enable %1 trigger:" "
%2

") .arg(_triggers.at(i)) .arg(enableq.lastError().text())); return -1; } } return _triggers.size(); } void LoaderWindow::setWindowTitle() { QString name; XSqlQuery _q; _q.exec( "SELECT metric_value, CURRENT_USER AS username " "FROM metric " "WHERE (metric_name='DatabaseName')" ); if (_q.first()) { if (_q.value("metric_value").toString().isEmpty()) name = tr("Unnamed Database"); else name = _q.value("metric_value").toString(); QString server; QString protocol; QString database; QString port; parseDatabaseURL(_databaseURL, protocol, server, database, port); QMainWindow::setWindowTitle( tr("%1 %2 - %3 on %4/%5 AS %6") .arg(_name) .arg(_version) .arg(name) .arg(server) .arg(database) .arg(_q.value("username").toString()) ); } else QMainWindow::setWindowTitle(tr("%1 %2").arg(_name).arg(_version)); } R2_2_5/loader/loaderwindow.h0000644000175000017500000000335011667203025015400 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef LOADERWINDOW_H #define LOADERWINDOW_H class Loadable; class Package; class Script; class TarFile; #include #include "ui_loaderwindow.h" class LoaderWindow : public QMainWindow, public Ui::LoaderWindow { Q_OBJECT public: LoaderWindow(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::Window); ~LoaderWindow(); public slots: virtual void fileNew(); virtual void fileOpen(); virtual void fileExit(); virtual void helpContents(); virtual void helpAbout(); virtual void setMultipleTransactions(bool); virtual void setDebugPkg(bool); virtual bool openFile(QString filename); virtual void setWindowTitle(); virtual bool sStart(); protected: Package * _package; TarFile * _files; virtual int applySql(Script *, const QByteArray); virtual int applyLoadable(Loadable *, const QByteArray); virtual void launchBrowser(QWidget *w, const QString &url); virtual void timerEvent( QTimerEvent * e ); static QString _rollbackMsg; protected slots: virtual void languageChange(); private: int _dbTimerId; bool _multitrans; bool _premultitransfile; QStringList _triggers; // to be disabled and enabled int disableTriggers(); int enableTriggers(); }; #endif // LOADERWINDOW_H R2_2_5/loader/main.cpp0000644000175000017500000001526211667203025014166 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include #include #include #include #include #include #include #include #include #include #include "data.h" #include "loaderwindow.h" QString _databaseURL = ""; bool _autoRun = false; int main(int argc, char* argv[]) { QString username = ""; bool haveUsername = FALSE; bool haveDatabaseURL = FALSE; _loggedIn = FALSE; bool multitrans = false; bool debugpkg = false; bool autoRunArg = false; bool autoRunCheck = false; QString pkgfile = ""; QApplication app(argc, argv); app.addLibraryPath("."); #ifndef Q_WS_MACX app.setWindowIcon(QIcon(":/images/updater-32x32.png")); #endif if (argc > 1) { haveUsername = FALSE; bool havePasswd = FALSE; QString passwd = ""; for (int intCounter = 1; intCounter < argc; intCounter++) { QString argument(argv[intCounter]); if (argument.startsWith("-help", Qt::CaseInsensitive)) { qWarning("%s [ -databaseURL=PSQL7://hostname:port/databasename |" " -username=databaseUserName -passwd=databasePassword |" " -noauth ]" " [ -multitrans ]" " [ -debug ]" " [ -file=updaterFile.gz ]" " [ -autorun ]", argv[0]); return 0; } else if (argument.startsWith("-databaseURL=", Qt::CaseInsensitive)) { haveDatabaseURL = TRUE; _databaseURL = argument.right(argument.length() - 13); } else if (argument.startsWith("-username=", Qt::CaseInsensitive)) { haveUsername = TRUE; username = argument.right(argument.length() - 10); } else if (argument.startsWith("-passwd=", Qt::CaseInsensitive)) { havePasswd = TRUE; passwd = argument.right(argument.length() - 8); } else if (argument.toLower() == "-noauth") { haveUsername = TRUE; havePasswd = TRUE; } else if (argument.toLower() == "-multitrans") multitrans = true; else if (argument.toLower() == "-debug") debugpkg = true; else if (argument.startsWith("-file=", Qt::CaseInsensitive)) pkgfile = argument.right(argument.size() - argument.indexOf("=") - 1); else if (argument.toLower() == "-autorun") autoRunArg = true; } if ( (haveDatabaseURL) && (haveUsername) && (havePasswd) ) { QSqlDatabase db; QString protocol; QString hostName; QString dbName; QString port; db = QSqlDatabase::addDatabase("QPSQL7"); if (!db.isValid()) { QMessageBox::critical(0, QObject::tr("Can not load database driver"), QObject::tr("Unable to load the databse driver. Please contact your systems adminstrator.")); QApplication::exit(-1); } parseDatabaseURL(_databaseURL, protocol, hostName, dbName, port); db.setDatabaseName(dbName); db.setUserName(username); db.setPassword(passwd); db.setHostName(hostName); db.setPort(port.toInt()); if (!db.open()) { QMessageBox::critical(0, QObject::tr("Unable to connect to database"), QObject::tr("Unable to connect to the database with the given information.")); QApplication::exit(-1); } else _loggedIn = TRUE; } } if(!_loggedIn) { ParameterList params; params.append("name", _name); params.append("copyright", _copyright.toAscii().data()); params.append("version", _version.toAscii().data()); params.append("build", __DATE__ " " __TIME__); // use C++ string concat if (haveUsername) params.append("username", _user); if (haveDatabaseURL) params.append("databaseURL", _databaseURL.toAscii().data()); if (_evaluation) params.append("evaluation"); login2 newdlg(0, "", TRUE); newdlg.set(params, 0); if (newdlg.exec() == QDialog::Rejected) return -1; else { _databaseURL = newdlg._databaseURL; _user = newdlg._user; _loggedIn = TRUE; } QSqlQuery su; su.prepare("SELECT rolsuper FROM pg_roles WHERE (rolname=:user);"); su.bindValue(":user", _user); su.exec(); if (su.first()) { if (! su.value(0).toBool() && QMessageBox::question(0, QObject::tr("Not Super User"), QObject::tr("You are not logged in as a " "database super user. The update " "may fail. Are you sure you want " "to continue?"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::No) return -2; } else if (su.lastError().type() != QSqlError::NoError && QMessageBox::question(0, QObject::tr("System Error"), QObject::tr("

The application received a database " "error while trying to check the user " "status of %1. Would you like to try to " "update anyway?

%2")
                            .arg(_user)
                            .arg(su.lastError().databaseText()),
                            QMessageBox::Yes,
                            QMessageBox::No | QMessageBox::Default) == QMessageBox::No)
      return -3;
  }

  LoaderWindow * mainwin = new LoaderWindow();
  mainwin->setMultipleTransactions(multitrans);
  mainwin->setDebugPkg(debugpkg);
  if (! pkgfile.isEmpty())
  {
    autoRunCheck = mainwin->openFile(pkgfile);
  }

  // Start the upgrade if the -autoRun argument is used and file prereqs pass.
  if (autoRunArg)
  {
    bool successful = autoRunCheck && ! pkgfile.isEmpty();
    if (successful)
    {
      _autoRun = true;
      successful = mainwin->sStart();
    }
    if (successful)     // not else if
      return 0;
    else
    {
#ifdef Q_OS_WIN32
      mainwin->show();
#else
      qWarning("%s", qPrintable(mainwin->_text->toPlainText()));
      return 1;
#endif
    }
  }
  else
    mainwin->show();

  return app.exec();
}
R2_2_5/loader/rcloader.rc0000644000175000017500000000011011667203025014641 0ustar  danieldanielIDI_ICON1               ICON    DISCARDABLE     "../images/updater.ico"
R2_2_5/loader/loaderwindow.ui0000644000175000017500000002021211667203025015562 0ustar  danieldaniel

 This file is part of the xTuple ERP: PostBooks Edition, a free and
open source Enterprise Resource Planning software suite,
Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple.
It is licensed to you under the Common Public Attribution License
version 1.0, the full text of which (including xTuple-specific Exhibits)
is available at www.xtuple.com/CPAL.  By using this software, you agree
to be bound by its terms.
 LoaderWindow
 
  
   
    0
    0
    590
    480
   
  
  
   Update Manager
  
  
   
    
     
      
       _pkgname
      
      
       false
      
     
    
    
     
      
       
        
         
          
           
            180
            0
           
          
          
           
            200
            32767
           
          
          
           <p>_status:</p>
<p>Multiline Label with some basic information.</p>
          
          
           Qt::AlignTop
          
          
           true
          
         
        
        
         
          
           Qt::Vertical
          
          
           QSizePolicy::Expanding
          
          
           
            20
            240
           
          
         
        
        
         
          
           Start Update
          
         
        
        
         
          
           false
          
          
           Rollback successful updates
          
         
        
        
         
          
           
            200
            32767
           
          
          
           50
          
         
        
       
      
      
       
        
         
          1
          0
         
        
       
      
     
    
   
  
  
   
    
     0
     0
     590
     22
    
   
   
    
     &File
    
    
    
    
    
   
   
    
     &Help
    
    
    
    
   
   
   
  
  
   
    &Close
   
   
    &Close
   
   
    fileNewAction
   
  
  
   
    
     
    
   
   
    &Open...
   
   
    Open
   
   
    Ctrl+O
   
   
    fileOpenAction
   
  
  
   
    E&xit
   
   
    Exit
   
   
    
   
   
    fileExitAction
   
  
  
   
    &Contents...
   
   
    Contents
   
   
    
   
   
    helpContentsAction
   
  
  
   
    &About
   
   
    About
   
   
    
   
   
    helpAboutAction
   
  
 
 
 
 
  
   fileNewAction
   activated()
   LoaderWindow
   fileNew()
   
    
     -1
     -1
    
    
     20
     20
    
   
  
  
   fileOpenAction
   activated()
   LoaderWindow
   fileOpen()
   
    
     -1
     -1
    
    
     20
     20
    
   
  
  
   fileExitAction
   activated()
   LoaderWindow
   fileExit()
   
    
     -1
     -1
    
    
     20
     20
    
   
  
  
   helpContentsAction
   activated()
   LoaderWindow
   helpContents()
   
    
     -1
     -1
    
    
     20
     20
    
   
  
  
   helpAboutAction
   activated()
   LoaderWindow
   helpAbout()
   
    
     -1
     -1
    
    
     20
     20
    
   
  
  
   _start
   clicked()
   LoaderWindow
   sStart()
   
    
     20
     20
    
    
     20
     20
    
   
  
 

R2_2_5/builder/0000755000175000017500000000000011667203025012710 5ustar  danieldanielR2_2_5/builder/providerdialog.ui0000644000175000017500000000657111667203025016272 0ustar  danieldaniel
 This file is part of the xTuple ERP: PostBooks Edition, a free and
open source Enterprise Resource Planning software suite,
Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple.
It is licensed to you under the Common Public Attribution License
version 1.0, the full text of which (including xTuple-specific Exhibits)
is available at www.xtuple.com/CPAL.  By using this software, you agree
to be bound by its terms.
 ProviderDialog
 
  
   
    0
    0
    438
    362
   
  
  
   Provider
  
  
   
    
     
      
       
        Package Name:
       
       
        false
       
      
     
     
      
     
    
   
   
    
     
      0
     
     
      
       
        Information:
       
       
        false
       
      
     
     
      
     
    
   
   
    
     
      
       
        Qt::Horizontal
       
       
        QSizePolicy::Expanding
       
       
        
         40
         20
        
       
      
     
     
      
       
        Ok
       
      
     
     
      
       
        Cancel
       
      
     
    
   
  
 
 
 qPixmapFromMimeSource
 
  
   Q3TextEdit
   Q3Frame
   
q3textedit.h
_accept clicked() ProviderDialog accept() 20 20 20 20 _cancel clicked() ProviderDialog reject() 20 20 20 20
R2_2_5/builder/builder.pro0000644000175000017500000000275511667203025015071 0ustar danieldaniel# # This file is part of the xTuple ERP: PostBooks Edition, a free and # open source Enterprise Resource Planning software suite, # Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. # It is licensed to you under the Common Public Attribution License # version 1.0, the full text of which (including xTuple-specific Exhibits) # is available at www.xtuple.com/CPAL. By using this software, you agree # to be bound by its terms. # include( ../global.pri ) TEMPLATE = app CONFIG += qt warn_on thread DESTDIR = ../bin LIBS += -L../lib -lupdatercommon -L../$${OPENRPT_BLD}/lib -lcommon -lrenderer win32-msvc* { PRE_TARGETDEPS += ../lib/updatercommon.lib \ ../$${OPENRPT_BLD}/lib/common.lib \ ../$${OPENRPT_BLD}/lib/renderer.lib } else { PRE_TARGETDEPS += ../$${UPDATER_BLD}/lib/libupdatercommon.a \ ../$${OPENRPT_BLD}/lib/libcommon.a \ ../$${OPENRPT_BLD}/lib/librenderer.a } MOC_DIR = tmp UI_DIR = tmp OBJECTS_DIR = tmp FORMS += packagewindow.ui \ texteditdialog.ui \ providerdialog.ui \ newprereqdialog.ui \ queryeditor.ui HEADERS += packagewindow.h \ providerdialog.h \ texteditdialog.h \ queryeditor.h \ newprereqdialog.h SOURCES += main.cpp \ packagewindow.cpp \ providerdialog.cpp \ texteditdialog.cpp \ queryeditor.cpp \ newprereqdialog.cpp QT += xml qt3support sql R2_2_5/builder/packagewindow.ui0000644000175000017500000010432311667203025016075 0ustar danieldaniel This file is part of the xTuple ERP: PostBooks Edition, a free and open source Enterprise Resource Planning software suite, Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. It is licensed to you under the Common Public Attribution License version 1.0, the full text of which (including xTuple-specific Exhibits) is available at www.xtuple.com/CPAL. By using this software, you agree to be bound by its terms. PackageWindow 0 0 600 483 Package Manager 0 45 600 438 QTabWidget::Rounded Prerequisites Add a new prerequisite to this package. whatsThis Add Qt::Horizontal QSizePolicy::Expanding 16 20 Change the order of the prerequisites by moving the selected item up in the list. Change the order of the prerequisites by moving the selected item down in the list. Qt::Horizontal QSizePolicy::Expanding 16 20 Remove a selected prerequisite from the list. Remove Type: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false _type false Qt::Horizontal QSizePolicy::Expanding 40 20 Edit Conditions Message Qt::Horizontal QSizePolicy::Expanding 40 20 Edit Providers Add Edit Remove Qt::Vertical QSizePolicy::Expanding 20 40 Scripts Add Qt::Horizontal QSizePolicy::Expanding 16 20 Qt::Horizontal QSizePolicy::Expanding 16 20 Remove Action on error: false Qt::Horizontal QSizePolicy::Expanding 40 20 Message Qt::Horizontal QSizePolicy::Expanding 40 20 Edit Reports Add Qt::Horizontal QSizePolicy::Expanding 40 20 Remove Grade: false Qt::Horizontal QSizePolicy::Expanding 40 20 Message Qt::Horizontal QSizePolicy::Expanding 40 20 Edit 0 0 49 16 Tools 0 0 600 29 &File &Help image2 &New New Ctrl+N fileNewAction image3 &Open... Open Ctrl+O fileOpenAction image4 &Save Save Ctrl+S fileSaveAction Save &As... Save As fileSaveAsAction E&xit Exit fileExitAction &Contents... Contents helpContentsAction &Index... Index helpIndexAction &About About helpAboutAction Q3ToolBar Q3Frame
q3listview.h
Q3GroupBox QGroupBox
Qt3Support/Q3GroupBox
1
Q3MainWindow QWidget
q3mainwindow.h
1
Q3ListBox Q3Frame
q3listbox.h
Q3TextEdit Q3Frame
q3textedit.h
package.h fileNewAction activated() PackageWindow fileNew() -1 -1 20 20 fileOpenAction activated() PackageWindow fileOpen() -1 -1 20 20 fileSaveAction activated() PackageWindow fileSave() -1 -1 20 20 fileSaveAsAction activated() PackageWindow fileSaveAs() -1 -1 20 20 fileExitAction activated() PackageWindow fileExit() -1 -1 20 20 helpIndexAction activated() PackageWindow helpIndex() -1 -1 20 20 helpContentsAction activated() PackageWindow helpContents() -1 -1 20 20 helpAboutAction activated() PackageWindow helpAbout() -1 -1 20 20 _grade valueChanged(int) PackageWindow sGradeChanged(int) 20 20 20 20 _reportMessage textChanged() PackageWindow sReportTextChanged() 20 20 20 20 _editReportMessage clicked() PackageWindow sEditReportMessage() 20 20 20 20 _removeReport clicked() PackageWindow sRemoveReport() 20 20 20 20 _addReport clicked() PackageWindow sAddReport() 20 20 20 20 _reports selectionChanged() PackageWindow sReportSelectionChanged() 20 20 20 20 _prereqs selectionChanged() PackageWindow sPrereqSelectionChanged() 20 20 20 20 _addPrereq clicked() PackageWindow sAddPrereq() 20 20 20 20 _raisePrereq clicked() PackageWindow sRaisePrereq() 20 20 20 20 _lowerPrereq clicked() PackageWindow sLowerPrereq() 20 20 20 20 _removePrereq clicked() PackageWindow sRemovePrereq() 20 20 20 20 _editConditions clicked() PackageWindow sEditConditions() 20 20 20 20 _prereqMessage textChanged() PackageWindow sPrereqTextChanged() 20 20 20 20 _editPrereqMessage clicked() PackageWindow sEditPrereqMessage() 20 20 20 20 _providers selectionChanged() PackageWindow sProviderSelectionChanged() 20 20 20 20 _addProvider clicked() PackageWindow sAddProvider() 20 20 20 20 _editProvider clicked() PackageWindow sEditProvider() 20 20 20 20 _removeProvider clicked() PackageWindow sRemoveProvider() 20 20 20 20 _scripts selectionChanged() PackageWindow sScriptSelectionChanged() 20 20 20 20 _addScript clicked() PackageWindow sAddScript() 20 20 20 20 _raiseScript clicked() PackageWindow sRaiseScript() 20 20 20 20 _lowerScript clicked() PackageWindow sLowerScript() 20 20 20 20 _removeScript clicked() PackageWindow sRemoveScript() 20 20 20 20 _onError activated(QString) PackageWindow sOnErrorActivated(QString) 20 20 20 20 _scriptMessage textChanged() PackageWindow sScriptTextChanged() 20 20 20 20 _editScriptMessage clicked() PackageWindow sEditScriptMessage() 20 20 20 20
R2_2_5/builder/texteditdialog.cpp0000644000175000017500000000222111667203025016423 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "texteditdialog.h" /* * Constructs a TextEditDialog as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * true to construct a modal dialog. */ TextEditDialog::TextEditDialog(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) : QDialog(parent, name, modal, fl) { setupUi(this); } /* * Destroys the object and frees any allocated resources */ TextEditDialog::~TextEditDialog() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void TextEditDialog::languageChange() { retranslateUi(this); } R2_2_5/builder/providerdialog.h0000644000175000017500000000152311667203025016074 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef PROVIDERDIALOG_H #define PROVIDERDIALOG_H #include #include "ui_providerdialog.h" class ProviderDialog : public QDialog, public Ui::ProviderDialog { Q_OBJECT public: ProviderDialog(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); ~ProviderDialog(); protected slots: virtual void languageChange(); }; #endif // PROVIDERDIALOG_H R2_2_5/builder/texteditdialog.ui0000644000175000017500000000512111667203025016260 0ustar danieldaniel This file is part of the xTuple ERP: PostBooks Edition, a free and open source Enterprise Resource Planning software suite, Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. It is licensed to you under the Common Public Attribution License version 1.0, the full text of which (including xTuple-specific Exhibits) is available at www.xtuple.com/CPAL. By using this software, you agree to be bound by its terms. TextEditDialog 0 0 600 480 Text Editor Ok Cancel Qt::Vertical QSizePolicy::Expanding 20 40 qPixmapFromMimeSource Q3TextEdit Q3Frame
q3textedit.h
_accept clicked() TextEditDialog accept() 20 20 20 20 _cancel clicked() TextEditDialog reject() 20 20 20 20
R2_2_5/builder/queryeditor.ui0000644000175000017500000000651311667203025015630 0ustar danieldaniel This file is part of the xTuple ERP: PostBooks Edition, a free and open source Enterprise Resource Planning software suite, Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. It is licensed to you under the Common Public Attribution License version 1.0, the full text of which (including xTuple-specific Exhibits) is available at www.xtuple.com/CPAL. By using this software, you agree to be bound by its terms. QueryEditor 0 0 545 480 Query Editor <p>Enter the query below that will be the condition for this prerequisite.</p> <p>The first column of the first row of the query should be a <b>true</b> value if the prerequisite was met. If any other value is present, or if not rows are returned, the prerequisite is not met. Any additional rows and column will be ignored.</p> Qt::AlignTop true Courier Qt::Horizontal QSizePolicy::Expanding 40 20 Ok Cancel qPixmapFromMimeSource Q3TextEdit Q3Frame
q3textedit.h
_accept clicked() QueryEditor accept() 20 20 20 20 _cancel clicked() QueryEditor reject() 20 20 20 20
R2_2_5/builder/packagewindow.cpp0000644000175000017500000004571111667203025016247 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "packagewindow.h" #include #include #include #include #include #include #include #include #include #include #include #include "texteditdialog.h" #include "newprereqdialog.h" #include "providerdialog.h" #include "queryeditor.h" /* * Constructs a PackageWindow as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * */ PackageWindow::PackageWindow(QWidget* parent, const char* name, Qt::WindowFlags fl) : Q3MainWindow(parent, name, fl) { setupUi(this); (void)statusBar(); _onError->insertStringList(Script::onErrorList()); fileNew(); } /* * Destroys the object and frees any allocated resources */ PackageWindow::~PackageWindow() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void PackageWindow::languageChange() { retranslateUi(this); } void PackageWindow::fileNew() { _filename = QString::null; if(_package) { delete _package; _package = 0; } _package = new Package(); _prereqs->clear(); sPrereqSelectionChanged(); _scripts->clear(); sScriptSelectionChanged(); _reports->clear(); sReportSelectionChanged(); } void PackageWindow::fileOpen() { QString filename = QFileDialog::getOpenFileName(this, "Choose a file to open", _filename, tr("XML (*.xml)")); if(filename.isEmpty()) return; QFile file(filename); QDomDocument doc = QDomDocument(); QString errMsg; int errLine, errCol; if(doc.setContent(&file, &errMsg, &errLine, &errCol)) { _filename = filename; if(_package) { delete _package; _package = 0; } QStringList msgList; QList fatalList; _package = new Package(doc.documentElement(), msgList, fatalList); _prereqs->clear(); sPrereqSelectionChanged(); _scripts->clear(); sScriptSelectionChanged(); _reports->clear(); sReportSelectionChanged(); QList::iterator pit = _package->_prerequisites.begin(); for(; pit != _package->_prerequisites.end(); ++pit) _prereqs->insertItem((*pit)->name()); QList::iterator sit = _package->_scripts.begin(); for(; sit != _package->_scripts.end(); ++sit) _scripts->insertItem((*sit)->name()); QList::iterator rit = _package->_reports.begin(); for(; rit != _package->_reports.end(); ++rit) _reports->insertItem((*rit)->name()); _reports->sort(); } else QMessageBox::warning(this, tr("Error Loading File"), tr("An error was encountered while trying to load the file %1.\n%2\nLine %3, Column %4").arg(filename).arg(errMsg).arg(errLine).arg(errCol)); } void PackageWindow::fileSave() { if(_filename.isEmpty()) { fileSaveAs(); return; } QDomDocument doc = QDomDocument("packageManagerDef"); doc.appendChild(_package->createElement(doc)); QFile file(_filename); if(file.open(QIODevice::WriteOnly)) { QTextStream ts(&file); ts << doc.toString(); file.close(); } else QMessageBox::warning(this, tr("Error Opening File"), tr("Could not open the file %1 for writing.").arg(_filename)); } void PackageWindow::fileSaveAs() { QString filename = QFileDialog::getSaveFileName(this, QString(), _filename); if(filename.isEmpty()) return; _filename = filename; fileSave(); } void PackageWindow::fileExit() { qApp->closeAllWindows(); } void PackageWindow::helpIndex() { QMessageBox::information(this, tr("Not yet implimented"), tr("This feature has not yet been implimented.")); } void PackageWindow::helpContents() { QMessageBox::information(this, tr("Not yet implimented"), tr("This feature has not yet been implimented.")); } void PackageWindow::helpAbout() { QMessageBox::about(this, tr("Package Manager: Builder"), tr("Create package manager content files." "\n\nCopyright (c) 1999-2011 by OpenMFG LLC, d/b/a xTuple, All Rights Reserved")); } void PackageWindow::sPrereqSelectionChanged() { if(_prereqs->currentItem() != -1) { bool found = false; QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) { if((*it)->name() == name) { _raisePrereq->setEnabled(true); _lowerPrereq->setEnabled(true); _removePrereq->setEnabled(true); _typeLabel->setEnabled(true); _type->setText(Prerequisite::typeToName((*it)->type())); _type->setEnabled(true); _editConditions->setEnabled(true); _prereqMessage->setText((*it)->message()); _gbPrereqMessage->setEnabled(true); _providers->clear(); _providers->insertStringList((*it)->providerList()); _providers->sort(); _gbProviders->setEnabled(true); found = true; } } if(!found) QMessageBox::critical(this, tr("Not Found"), tr("The selected script was not found.")); } else { _raisePrereq->setEnabled(false); _lowerPrereq->setEnabled(false); _removePrereq->setEnabled(false); _typeLabel->setEnabled(false); _type->setText(tr("None")); _type->setEnabled(false); _editConditions->setEnabled(false); _prereqMessage->clear(); _gbPrereqMessage->setEnabled(false); _providers->clear(); sProviderSelectionChanged(); _gbProviders->setEnabled(false); } } void PackageWindow::sAddPrereq() { NewPrereqDialog npd(this, "new prereq"); bool done = false; while(!done) { if(npd.exec() == NewPrereqDialog::Accepted) { QString name = npd._name->text(); if(_package->containsPrerequisite(name)) { QMessageBox::warning(this, tr("Duplicate Name"), tr("The name you selected for the new prerequisite is already in use.\nPlease choose a different name.") ); continue; } Prerequisite *prereq = new Prerequisite(); prereq->setName(name); prereq->setType(Prerequisite::nameToType(npd._type->currentText())); _package->_prerequisites.append(prereq); _prereqs->insertItem(prereq->name()); Q3ListBoxItem * item = _prereqs->findItem(prereq->name()); _prereqs->setCurrentItem(item); _prereqs->ensureCurrentVisible(); } done = true; } } void PackageWindow::sRaisePrereq() { int idx = _prereqs->currentItem(); if(idx <= 0) return; Prerequisite *p0 = _package->_prerequisites[idx-1]; Prerequisite *p1 = _package->_prerequisites[idx]; if(p1->name() != _prereqs->currentText()) { QMessageBox::warning(this, tr("Data Error"), tr("The data does not appear to be in a correct state.")); return; } _package->_prerequisites[idx-1] = p1; _package->_prerequisites[idx] = p0; _prereqs->changeItem(p1->name(), idx-1); _prereqs->changeItem(p0->name(), idx); _prereqs->setCurrentItem(idx-1); } void PackageWindow::sLowerPrereq() { int idx = _prereqs->currentItem(); if(idx == (int)(_prereqs->count() - 1)) return; Prerequisite *p0 = _package->_prerequisites[idx]; Prerequisite *p1 = _package->_prerequisites[idx+1]; if(p0->name() != _prereqs->currentText()) { QMessageBox::warning(this, tr("Data Error"), tr("The data does not appear to be in a correct state.")); return; } _package->_prerequisites[idx] = p1; _package->_prerequisites[idx+1] = p0; _prereqs->changeItem(p1->name(), idx); _prereqs->changeItem(p0->name(), idx+1); _prereqs->setCurrentItem(idx+1); } void PackageWindow::sRemovePrereq() { QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) if((*it)->name() == name) it = _package->_prerequisites.remove(it); _prereqs->removeItem(_prereqs->currentItem()); } void PackageWindow::sEditConditions() { QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) { if((*it)->name() == name) { if((*it)->type() == Prerequisite::Query) { QueryEditor qe(this, "query editor"); qe._text->setText((*it)->query()); if(qe.exec() == QueryEditor::Accepted) { (*it)->setQuery(qe._text->text()); } } else QMessageBox::warning(this, tr("Not yet implemented"), tr("The functionality for this type has not been implemented yet.") ); } } } void PackageWindow::sPrereqTextChanged() { QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) if((*it)->name() == name) (*it)->setMessage(_prereqMessage->text()); } void PackageWindow::sEditPrereqMessage() { TextEditDialog ted(this, "prereq message dialog"); ted._text->setText(_prereqMessage->text()); if(ted.exec() == TextEditDialog::Accepted) _prereqMessage->setText(ted._text->text()); } void PackageWindow::sProviderSelectionChanged() { bool selected = (_providers->currentItem() != -1); _editProvider->setEnabled(selected); _removeProvider->setEnabled(selected); } void PackageWindow::sAddProvider() { ProviderDialog pd(this, "provider dialog"); bool done = false; while(!done) { done = true; if(pd.exec() == ProviderDialog::Accepted) { PrerequisiteProvider provider; QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) { if((*it)->name() == name) { provider = (*it)->provider(pd._name->text()); if(!provider.isValid()) { provider = PrerequisiteProvider(pd._name->text(), pd._text->text()); (*it)->setProvider(provider); _providers->insertItem(provider.package()); _providers->sort(); } else done = false; } } } } } void PackageWindow::sEditProvider() { QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) { if((*it)->name() == name) { PrerequisiteProvider provider = (*it)->provider(_providers->currentText()); if(provider.isValid()) { ProviderDialog pd(this, "provider dialog"); pd._name->setText(provider.package()); pd._text->setText(provider.info()); bool done = false; while(!done) { if(pd.exec() == ProviderDialog::Accepted) { if(pd._name->text() != provider.package()) { if((*it)->provider(pd._name->text()).isValid()) { QMessageBox::warning(this, tr("Duplicate Package"), tr("The new package name you specified already exists in the list of providers.") ); continue; } (*it)->removeProvider(provider.package()); provider.setPackage(pd._name->text()); _providers->changeItem(provider.package(), _providers->currentItem()); _providers->sort(); } provider.setInfo(pd._text->text()); (*it)->setProvider(provider); } done = true; } } else QMessageBox::critical(this, tr("Error locating data"), tr("There was an error locating the data for the selected provider.") ); } } } void PackageWindow::sRemoveProvider() { QString provider = _providers->currentText(); QString name = _prereqs->currentText(); QList::iterator it = _package->_prerequisites.begin(); for(; it != _package->_prerequisites.end(); ++it) if((*it)->name() == name) (*it)->removeProvider(provider); _providers->removeItem(_providers->currentItem()); } void PackageWindow::sScriptSelectionChanged() { if(_scripts->currentItem() != -1) { bool found = false; QString name = _scripts->currentText(); QList::iterator it = _package->_scripts.begin(); for(; it != _package->_scripts.end(); ++it) { if((*it)->name() == name) { _raiseScript->setEnabled(true); _lowerScript->setEnabled(true); _removeScript->setEnabled(true); _onErrorLabel->setEnabled(true); _onError->setCurrentItem((int)(*it)->onError()); _onError->setEnabled(true); _scriptMessage->setText((*it)->comment()); _gbScriptMessage->setEnabled(true); found = true; } } if(!found) QMessageBox::critical(this, tr("Not Found"), tr("The selected script was not found.")); } else { _raiseScript->setEnabled(false); _lowerScript->setEnabled(false); _removeScript->setEnabled(false); _onErrorLabel->setEnabled(false); _onError->setCurrentItem(0); _onError->setEnabled(false); _scriptMessage->clear(); _gbScriptMessage->setEnabled(false); } } void PackageWindow::sAddScript() { QString scriptfile = QFileDialog::getOpenFileName(this, tr("Choose a Script to add"), QString::null, tr("Script (*.*)") ); if(scriptfile.isNull()) return; if(_package->containsScript(scriptfile)) { QMessageBox::warning(this, tr("Script Already Exists"), tr("The script you selected has already been loaded.") ); return; } Script *script = new Script(scriptfile); _package->_scripts.append(script); _scripts->insertItem(script->name()); Q3ListBoxItem * item = _scripts->findItem(script->name()); _scripts->setCurrentItem(item); _scripts->ensureCurrentVisible(); } void PackageWindow::sRaiseScript() { int idx = _scripts->currentItem(); if(idx <= 0) return; Script *s0 = _package->_scripts[idx-1]; Script *s1 = _package->_scripts[idx]; if(s1->name() != _scripts->currentText()) { QMessageBox::warning(this, tr("Data Error"), tr("The data does not appear to be in a correct state.")); return; } _package->_scripts[idx-1] = s1; _package->_scripts[idx] = s0; _scripts->changeItem(s1->name(), idx-1); _scripts->changeItem(s0->name(), idx); _scripts->setCurrentItem(idx-1); } void PackageWindow::sLowerScript() { int idx = _scripts->currentItem(); if(idx == (int)(_scripts->count() - 1)) return; Script *s0 = _package->_scripts[idx]; Script *s1 = _package->_scripts[idx+1]; if(s0->name() != _scripts->currentText()) { QMessageBox::warning(this, tr("Data Error"), tr("The data does not appear to be in a correct state.")); return; } _package->_scripts[idx] = s1; _package->_scripts[idx+1] = s0; _scripts->changeItem(s1->name(), idx); _scripts->changeItem(s0->name(), idx+1); _scripts->setCurrentItem(idx+1); } void PackageWindow::sRemoveScript() { QString name = _scripts->currentText(); QList::iterator it = _package->_scripts.begin(); for(; it != _package->_scripts.end(); ++it) if((*it)->name() == name) it = _package->_scripts.remove(it); _scripts->removeItem(_scripts->currentItem()); } void PackageWindow::sOnErrorActivated( const QString & string ) { QString name = _scripts->currentText(); QList::iterator it = _package->_scripts.begin(); for(; it != _package->_scripts.end(); ++it) if((*it)->name() == name) (*it)->setOnError(Script::nameToOnError(string)); } void PackageWindow::sScriptTextChanged() { QString name = _scripts->currentText(); QList::iterator it = _package->_scripts.begin(); for(; it != _package->_scripts.end(); ++it) if((*it)->name() == name) (*it)->setComment(_scriptMessage->text()); } void PackageWindow::sEditScriptMessage() { TextEditDialog ted(this, "script message dialog"); ted._text->setText(_scriptMessage->text()); if(ted.exec() == TextEditDialog::Accepted) _scriptMessage->setText(ted._text->text()); } void PackageWindow::sReportSelectionChanged() { if(_reports->currentItem() != -1) { bool found = false; QString name = _reports->currentText(); QList::iterator it = _package->_reports.begin(); for(; it != _package->_reports.end(); ++it) { if((*it)->name() == name) { _removeReport->setEnabled(true); _gradeLabel->setEnabled(true); _grade->setValue((*it)->grade()); _grade->setEnabled(true); _reportMessage->setText((*it)->comment()); _gbReportMessage->setEnabled(true); found = true; } } if(!found) QMessageBox::critical(this, tr("Not Found"), tr("The selected report definition was not found.")); } else { _removeReport->setEnabled(false); _gradeLabel->setEnabled(false); _grade->setValue(0); _grade->setEnabled(false); _reportMessage->clear(); _gbReportMessage->setEnabled(false); } } void PackageWindow::sAddReport() { QString reportfile = QFileDialog::getOpenFileName(this, tr("Choose a Report Definition to add"), QString::null, tr("Report Definitions (*.xml)") ); if(reportfile.isNull()) return; if(_package->containsReport(reportfile)) { QMessageBox::warning(this, tr("Report Already Exists"), tr("The Report definition you selected has already been loaded.") ); return; } LoadReport *report = new LoadReport(reportfile); _package->_reports.append(report); _reports->insertItem(report->name()); Q3ListBoxItem * item = _reports->findItem(report->name()); _reports->setCurrentItem(item); _reports->sort(); _reports->ensureCurrentVisible(); } void PackageWindow::sRemoveReport() { QString name = _reports->currentText(); QList::iterator it = _package->_reports.begin(); for(; it != _package->_reports.end(); ++it) if((*it)->name() == name) it = _package->_reports.remove(it); _reports->removeItem(_reports->currentItem()); } void PackageWindow::sGradeChanged( int value) { QString name = _reports->currentText(); QList::iterator it = _package->_reports.begin(); for(; it != _package->_reports.end(); ++it) if((*it)->name() == name) (*it)->setGrade(value); } void PackageWindow::sReportTextChanged() { QString name = _reports->currentText(); QList::iterator it = _package->_reports.begin(); for(; it != _package->_reports.end(); ++it) if((*it)->name() == name) (*it)->setComment(_reportMessage->text()); } void PackageWindow::sEditReportMessage() { TextEditDialog ted(this, "report message dialog"); ted._text->setText(_reportMessage->text()); if(ted.exec() == TextEditDialog::Accepted) _reportMessage->setText(ted._text->text()); } R2_2_5/builder/providerdialog.cpp0000644000175000017500000000222011667203025016422 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "providerdialog.h" /* * Constructs a ProviderDialog as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * true to construct a modal dialog. */ ProviderDialog::ProviderDialog(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) : QDialog(parent, name, modal, fl) { setupUi(this); } /* * Destroys the object and frees any allocated resources */ ProviderDialog::~ProviderDialog() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void ProviderDialog::languageChange() { retranslateUi(this); } R2_2_5/builder/newprereqdialog.ui0000644000175000017500000000775711667203025016457 0ustar danieldaniel This file is part of the xTuple ERP: PostBooks Edition, a free and open source Enterprise Resource Planning software suite, Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. It is licensed to you under the Common Public Attribution License version 1.0, the full text of which (including xTuple-specific Exhibits) is available at www.xtuple.com/CPAL. By using this software, you agree to be bound by its terms. NewPrereqDialog 0 0 299 129 New Prerequisite Qt::Horizontal QSizePolicy::Expanding 40 20 Name: false Type: false Qt::Vertical QSizePolicy::Expanding 20 40 Qt::Horizontal QSizePolicy::Expanding 40 20 Ok Cancel qPixmapFromMimeSource _accept clicked() NewPrereqDialog sAccept() 20 20 20 20 _cancel clicked() NewPrereqDialog reject() 20 20 20 20 R2_2_5/builder/texteditdialog.h0000644000175000017500000000153111667203025016073 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef TEXTEDITDIALOG_H #define TEXTEDITDIALOG_H #include #include "ui_texteditdialog.h" class TextEditDialog : public QDialog, public Ui::TextEditDialog { Q_OBJECT public: TextEditDialog(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); ~TextEditDialog(); protected slots: virtual void languageChange(); }; #endif // TEXTEDITDIALOG_H R2_2_5/builder/main.cpp0000644000175000017500000000126211667203025014341 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include #include "packagewindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); PackageWindow * mainwin = new PackageWindow(); mainwin->show(); app.setMainWidget(mainwin); return app.exec(); } R2_2_5/builder/queryeditor.h0000644000175000017500000000150111667203025015432 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef QUERYEDITOR_H #define QUERYEDITOR_H #include #include "ui_queryeditor.h" class QueryEditor : public QDialog, public Ui::QueryEditor { Q_OBJECT public: QueryEditor(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); ~QueryEditor(); protected slots: virtual void languageChange(); }; #endif // QUERYEDITOR_H R2_2_5/builder/queryeditor.cpp0000644000175000017500000000217411667203025015774 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "queryeditor.h" /* * Constructs a QueryEditor as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * true to construct a modal dialog. */ QueryEditor::QueryEditor(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) : QDialog(parent, name, modal, fl) { setupUi(this); } /* * Destroys the object and frees any allocated resources */ QueryEditor::~QueryEditor() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void QueryEditor::languageChange() { retranslateUi(this); } R2_2_5/builder/newprereqdialog.cpp0000644000175000017500000000324411667203025016607 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #include "newprereqdialog.h" #include #include "prerequisite.h" /* * Constructs a NewPrereqDialog as a child of 'parent', with the * name 'name' and widget flags set to 'f'. * * The dialog will by default be modeless, unless you set 'modal' to * true to construct a modal dialog. */ NewPrereqDialog::NewPrereqDialog(QWidget* parent, const char* name, bool modal, Qt::WindowFlags fl) : QDialog(parent, name, modal, fl) { setupUi(this); _type->insertStringList(Prerequisite::typeList()); } /* * Destroys the object and frees any allocated resources */ NewPrereqDialog::~NewPrereqDialog() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void NewPrereqDialog::languageChange() { retranslateUi(this); } void NewPrereqDialog::sAccept() { if(_name->text().isEmpty()) { QMessageBox::warning(this, tr("Incomplete information"), tr("You must eneter in a name for this new prerequisite.")); return; } if(_type->currentText() == "None") { QMessageBox::warning(this, tr("Incomplete information"), tr("You must select a type, other than None, for this new prerequisite.")); return; } accept(); } R2_2_5/builder/packagewindow.h0000644000175000017500000000417211667203025015710 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef PACKAGEWINDOW_H #define PACKAGEWINDOW_H #include #include #include "ui_packagewindow.h" class PackageWindow : public Q3MainWindow, public Ui::PackageWindow { Q_OBJECT public: PackageWindow(QWidget* parent = 0, const char* name = 0, Qt::WindowFlags fl = Qt::WType_TopLevel); ~PackageWindow(); public slots: virtual void fileNew(); virtual void fileOpen(); virtual void fileSave(); virtual void fileSaveAs(); virtual void fileExit(); virtual void helpIndex(); virtual void helpContents(); virtual void helpAbout(); protected: Package * _package; QString _filename; protected slots: virtual void languageChange(); virtual void sPrereqSelectionChanged(); virtual void sAddPrereq(); virtual void sRaisePrereq(); virtual void sLowerPrereq(); virtual void sRemovePrereq(); virtual void sEditConditions(); virtual void sPrereqTextChanged(); virtual void sEditPrereqMessage(); virtual void sProviderSelectionChanged(); virtual void sAddProvider(); virtual void sEditProvider(); virtual void sRemoveProvider(); virtual void sScriptSelectionChanged(); virtual void sAddScript(); virtual void sRaiseScript(); virtual void sLowerScript(); virtual void sRemoveScript(); virtual void sOnErrorActivated( const QString & string ); virtual void sScriptTextChanged(); virtual void sEditScriptMessage(); virtual void sReportSelectionChanged(); virtual void sAddReport(); virtual void sRemoveReport(); virtual void sGradeChanged( int value ); virtual void sReportTextChanged(); virtual void sEditReportMessage(); }; #endif // PACKAGEWINDOW_H R2_2_5/builder/newprereqdialog.h0000644000175000017500000000157011667203025016254 0ustar danieldaniel/* * This file is part of the xTuple ERP: PostBooks Edition, a free and * open source Enterprise Resource Planning software suite, * Copyright (c) 1999-2010 by OpenMFG LLC, d/b/a xTuple. * It is licensed to you under the Common Public Attribution License * version 1.0, the full text of which (including xTuple-specific Exhibits) * is available at www.xtuple.com/CPAL. By using this software, you agree * to be bound by its terms. */ #ifndef NEWPREREQDIALOG_H #define NEWPREREQDIALOG_H #include #include "ui_newprereqdialog.h" class NewPrereqDialog : public QDialog, public Ui::NewPrereqDialog { Q_OBJECT public: NewPrereqDialog(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WindowFlags fl = 0); ~NewPrereqDialog(); protected slots: virtual void languageChange(); virtual void sAccept(); }; #endif // NEWPREREQDIALOG_H R2_2_5/utilities/0000755000175000017500000000000011667203026013276 5ustar danieldanielR2_2_5/utilities/autorun.win32/0000755000175000017500000000000011667203026015734 5ustar danieldanielR2_2_5/utilities/autorun.win32/updater-backup.bat0000644000175000017500000000362311667203026021337 0ustar danieldaniel@echo off REM ######################################### REM xTuple Updater database backup script. REM Use this backup script in conjunction with REM the updater-restore.bat script that is setup REM to restore the backup file with the correct REM name and location. REM Make sure to schedule the backup and restore REM for a time that will not span midnight or REM the naming convention will be off. REM ######################################### REM ######################################### REM START EDITS REM ######################################### REM ######################################### REM EDIT these variables to your environment. REM ######################################### REM Connection info. SET server=192.168.1.1 SET port=5432 SET pguser=admin SET PGPASSWORD=admin SET pgadmin_path=C:\"Program Files"\"pgAdmin III"\1.10\ REM Database name. SET production_database=xtuple_production REM Path to save backup to. SET backup_path=backups\ REM ######################################### REM STOP EDITS REM ######################################### REM ######################################### REM Create the correct date string for the file name. REM ######################################### for /f "tokens=1-4 delims=/ " %%i in ("%date%") do ( set dow=%%i set month=%%j set day=%%k set year=%%l ) set datestr=%month%_%day%_%year% echo datestr is %datestr% set BACKUP_FILE=%backup_path%%production_database%_%datestr%.backup set logFile=EmproDatabase_%datestr%.log echo backup file name is %BACKUP_FILE% REM ######################################### REM Run the pg_dump command REM Add the -v flag if you want to see the progress. REM ######################################### echo on %pgadmin_path%pg_dump -i -h %server% -p %port% -U %pguser% -F c -b -f %BACKUP_FILE% %production_database% R2_2_5/utilities/autorun.win32/updater-initialize.bat0000644000175000017500000000276111667203026022235 0ustar danieldaniel@echo off REM ######################################### REM xTuple Updater database initialize script. REM This script will run the file updater-initialize.sql REM The SQL file can be setup to make any changes to REM your upgrade_test databse after it was restored from REM backup and before you start the upgrade. REM Use this initialize script in conjunction with REM the updater-restore.bat script that is setup REM to restore the backup file with the correct REM name and location. REM ######################################### REM ######################################### REM START EDITS REM ######################################### REM ######################################### REM EDIT these variables to your environment. REM ######################################### REM Connection info. SET server=192.168.1.1 SET port=5432 SET pguser=admin SET PGPASSWORD=admin SET psql_path=C:\"Program Files"\PostgreSQL\8.4\bin\ REM Database name. SET upgrade_test_database_name=upgrade_test REM Script file to run. SET filename=updater-initialize.sql REM Log output file name. SET outputfile=update-log.txt REM ######################################### REM STOP EDITS REM ######################################### REM ######################################### REM Run the script. REM ######################################### echo on %psql_path%psql -h %server% -p %port% -U %pguser% -d %upgrade_test_database_name% -f %filename% -o %outputfile% -qR2_2_5/utilities/autorun.win32/README.txt0000644000175000017500000001036111667203026017433 0ustar danieldanielxTuple Updater.exe auto-run scripts. ==================================== contributed by xikar These batch files work with a modified updater.exe program that accepts the -autorun command line argument. What these batch files do: 0. Make a directory called "scripts" to hold the upgrade .gz files and another directory called "backups" to hold database backup files created by the auto-run batch files. 1. Backup your production database to the "backup" folder. 2. Drop your "upgrade_test" database and recreate it as an empty database. 3. Restore your production backup file to your "upgrade_test" database. 4. Run an initialize script on your restored "upgrade_test" database. This is optional and currently does nothing, but is useful if you need to make any edits before you upgrade. I have a data type mismatch on a custom view in my database, so I drop the view and recreate it after the upgrades are finished. 5. Run through each upgrade script .gz file in the "scripts" folder. When an upgrade script is finished, the updater.exe will exit and be re-ran with the next upgrade script until all have completed. When finished, you will have a fully upgraded test database. The main batch file that controls all of this is "auto-updater.bat". It can be scheduled to run every night so you have a fresh upgraded test database each morning. All the other batch files are called from this script. BEFORE RUNNING: 1. Backup your production database manually and make sure you have a copy saved somewhere safe. 2. Perform a complete upgrade on a copy of your production database manually to make sure it will upgrade through all versions without any errors. 3. Test this on a test server first! HOW TO SET UP: 1. You need to have pgAdmin III and PostgreSQL server installed on your Windows computer. The PostgreSQL version on windows does not need to host any databases, but the scripts use the binary to run SQL commands in Windows against your actual PostgreSQL server. 2. Create a new database called "upgrade_test". 3. Edit each batch filstd::string to your environment. Each batch file is commented with a section where you should make edits. The comments say: REM ######################################### REM START EDITS REM ######################################### edits go here... REM ######################################### REM STOP EDITS REM ######################################### Make your changes in between these comments. You will need to set your server IP, port, user, pass, production database name, upgrade database name, path to pgadmin and PostgreSQL. 4. Download each xTuple database upgrade script that you need to go from your current production version to the latest released version. See the note below about file naming conventions. Download your upgrade scripts here: http://sourceforge.net/projects/postbooks/files/ 5. OPTIONAL - Edit "updater-setup-database.sql" file and change the "upgrade_test" database name if you are using a different name for your test database. 6. OPTIONAL - Edit "updater-initialize.sql" file and put in any special SQL statements you might need before you upgrade. 7. OPTIONAL - You may want to change the "updater.exe" file name to something different and then change it in the batch file. I've noticed some other Windows programs also occasionally run "updater.exe" programs that will stall this process. The "auto-updater.bat" file checks to make sure there are no "updater.exe" processes running before it starts an upgrade. BEWARE: 1. The backup file is saved with the current date in the file name. Don't schedule the "auto-updater.bat" file to run before midnight, or you might get a backup file name for the previous day when the restore script starts running at 12:02 AM and is looking for a file with a date of today. 2. Make sure all of your xTuple database upgrade scripts sort alphabetically in the proper order. They will be ran in alphabetical order, so you may need to prepend numbers to the file names to get the proper sequence e.g. (01pb353to354.gz, 02pb354to355.gz, 03pb355to360.gz) R2_2_5/utilities/autorun.win32/updater-restore.bat0000644000175000017500000000420411667203026021551 0ustar danieldaniel@echo off REM ######################################### REM xTuple Updater database restore script. REM First create your upgrade test database REM to restore your backup to. Once created REM this script will clean the database and REM restore the backup to it. REM Use this restore script in conjunction with REM the updater-backup.bat script that is setup REM to create the backup file with the correct REM name and location. REM Make sure to schedule the backup and restore REM for a time that will not span midnight or REM the naming convention will be off. REM ######################################### REM ######################################### REM START EDITS REM ######################################### REM ######################################### REM EDIT these variables to your environment. REM ######################################### REM Conneciton info. SET server=192.168.1.1 SET port=5432 SET pguser=admin SET PGPASSWORD=admin SET pgadmin_path=C:\"Program Files"\"pgAdmin III"\1.10\ REM Database names. SET production_database=xtuple_production SET upgrade_test_database_name=upgrade_test REM Path to production database backup file. SET backup_path=backups\ REM ######################################### REM STOP EDITS REM ######################################### REM ######################################### REM Create the correct date string for the file name. REM ######################################### for /f "tokens=1-4 delims=/ " %%i in ("%date%") do ( set dow=%%i set month=%%j set day=%%k set year=%%l ) set datestr=%month%_%day%_%year% echo datestr is %datestr% set BACKUP_FILE=%backup_path%%production_database%_%datestr%.backup set logFile=EmproDatabase_%datestr%.log echo backup file name is %BACKUP_FILE% REM ######################################### REM Run the pg_restore command. REM Add the -v flag if you want to see the progress. REM ######################################### echo on %pgadmin_path%pg_restore -i -h %server% -p %port% -U %pguser% -d %upgrade_test_database_name% %BACKUP_FILE% R2_2_5/utilities/autorun.win32/updater-setup-database.sql0000644000175000017500000000050611667203026023022 0ustar danieldaniel-- Database: upgrade_test -- DROP the upgrade_test database from the server before the backup restore. -- Then CREATE the upgrade_test database as an empty database for the restore to use. DROP DATABASE upgrade_test; CREATE DATABASE upgrade_test WITH OWNER = "admin" ENCODING = 'UTF8' CONNECTION LIMIT = -1; R2_2_5/utilities/autorun.win32/auto-updater.bat0000644000175000017500000001171011667203026021036 0ustar danieldaniel@echo off & setLocal EnableDELAYedExpansion REM ######################################### REM xTuple Updater autorun batch file to REM upgrade a database through multiple versions. REM Put all upgrade scripts in a directory called REM scripts REM The directory structure should look like this: REM - Path_to_dir REM auto-updater.bat REM - scripts REM pb353to354.gz REM pb354to355.gz REM pb355to360.gz REM Note that scripts will be ran in alphabetical order. REM You may need to prepend numbers to the file names REM to get the proper sequence e.g. REM 01pb353to354.gz, 02pb354to355.gz, 03pb355to360.gz REM ######################################### REM ######################################### REM START EDITS REM ######################################### REM ######################################### REM Edit these variables to your environment. REM ######################################### REM Path to directory containing updater.exe REM EDIT BELOW SET updater_path=C:\xTuple\Updater\bin\ REM Name of xTuple updater.exe. REM This script will check if the program is running. REM You should change this to something like xtuple-updater.exe. REM This will prevent conflicts with other updater.exe REM from different programs that exist. REM EDIT BELOW SET process=updater.exe REM Setup connection info. REM EDIT BELOW SET server=192.168.1.1 SET port=5432 SET upgrade_test_database_name=upgrade_test SET username=admin SET password=admin REM ######################################### REM Edit this section for your initial setup script files. REM Defaults should be fine here if you have setup the files. REM ######################################### :Start echo ---------------------------------------- echo ---------------------------------------- echo xTuple Database auto backup, create copy, and upgrade script. echo ---------------------------------------- echo ---------------------------------------- echo Creating backup file. echo ---------------------------------------- call updater-backup.bat @echo off echo ---------------------------------------- echo Setting up upgrade test database. echo ---------------------------------------- call updater-setup-database.bat @echo off echo ---------------------------------------- echo Restoring backup to upgrade test database. echo ---------------------------------------- call updater-restore.bat @echo off echo ---------------------------------------- echo Restore finished. echo ---------------------------------------- call updater-initialize.bat @echo off echo ---------------------------------------- echo Initialize finished. echo ---------------------------------------- REM ######################################### REM STOP EDITS REM ######################################### REM ######################################### REM Set some variables. REM ######################################### SET arguments=-databaseURL=psql://%server%/%upgrade_test_database_name%:%port% -username=%username% -passwd=%password% -autorun -file= SET result=INFO: SET message1=No Updater running, lauching first update. SET message2=Updater finished, lauching next update. SET cur_message=%message1% SET index=1 SET /A counter=0 SET /A filenum=0 SET /A script_counter=0 REM ######################################### REM Get script count. REM ######################################### FOR %%i IN (scripts\*.gz) DO ( IF !script_counter!==0 ( SET current_script=%%i ) SET /A script_counter=%index%+!script_counter! ) echo Total of !script_counter! upgrade scripts to run. REM ######################################### REM Start update. REM ######################################### SET /P var=Checking for Updater...