libjpf-java-1.5.1+dfsg.orig/0000775000175000017500000000000011247552340015060 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/jpf-boot-pom.xml0000644000175000017500000000436510605753250020121 0ustar gregoagregoa 4.0.0 net.sf.jpf jpf-boot jar jpf-boot 1.5 Java Plugin Framework - Boot Library GNU Lesser General Public License, Version 2.1, February 1999 http://jpf.sourceforge.net/license.txt source-boot jpf-boot-target/classes jpf-boot-target source-boot/ **/*.java **/*.jpage org.apache.maven.plugins maven-compiler-plugin 5 5 org.apache.maven.plugins maven-jar-plugin org.java.plugin.boot.Boot true Java Plug-in Framework (JPF) - application boot library ${project.version} http://jpf.sourceforge.net org.java.plugin.boot ${project.version} http://jpf.sourceforge.net log4j log4j 1.2.4 net.sf.jpf jpf 1.5 libjpf-java-1.5.1+dfsg.orig/source-boot/0000755000175000017500000000000010514450040017305 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-boot/org/0000755000175000017500000000000010514450040020074 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-boot/org/java/0000755000175000017500000000000010514450040021015 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/0000755000175000017500000000000010514450040022313 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/0000755000175000017500000000000010612737270023272 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/SplashHandler.java0000644000175000017500000000617110552472774026702 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.net.URL; import org.java.plugin.util.ExtendedProperties; /** * Interface to control application splash screen. * * @see org.java.plugin.boot.Boot#getSplashHandler() * * @version $Id$ */ public interface SplashHandler { /** * Configures this handler instance. This method is called ones immediately * after handler instantiation. * @param config handler configuration data, here included all configuration * parameters which name starts with * org.java.plugin.boot.splash. prefix */ void configure(ExtendedProperties config); /** * @return boot progress value that is normalized to [0; 1] interval */ float getProgress(); /** * Sets boot progress value and optionally adjust visual progress bar * control. The value should be in [0; 1] interval. * @param value new progress value */ void setProgress(float value); /** * @return current text caption */ String getText(); /** * Sets new text caption and optionally display it on the screen. * @param value new text caption */ void setText(String value); /** * @return current image URL */ URL getImage(); /** * Sets new image URL and optionally displays it on the splash screen. * @param value new image URL */ void setImage(URL value); /** * @return true if splash screen is displayed now */ boolean isVisible(); /** * Shows/hides splash screen. * @param value true to show splash screen, false * - to hide and dispose it */ void setVisible(boolean value); /** * Useful method to get access to handler internals. The actually returned * object depends on handler implementation. * @return original implementation of this handler, usually you return * this (useful for handler wrappers) */ Object getImplementation(); } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/ControlThread.java0000644000175000017500000003065610554436520026716 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * @version $Id$ */ final class ControlThread extends Thread { static boolean isApplicationRunning(final InetAddress host, final int port) { try { Socket socket = new Socket(host, port); try { socket.setKeepAlive(true); String test = "" + System.currentTimeMillis(); //$NON-NLS-1$ OutputStream out = socket.getOutputStream(); InputStream in = null; try { System.out.println("found running control service on " //$NON-NLS-1$ + host + ":" + port); //$NON-NLS-1$ out.write(("PING " + test).getBytes()); //$NON-NLS-1$ out.flush(); socket.shutdownOutput(); in = socket.getInputStream(); StringBuilder commandResult = new StringBuilder(); byte[] buf = new byte[16]; int len; while ((len = in.read(buf)) != -1) { commandResult.append(new String(buf, 0, len)); } socket.shutdownInput(); if (commandResult.toString().startsWith("OK") //$NON-NLS-1$ && (commandResult.toString().indexOf(test) != -1)) { System.out.println("PING command succeed"); //$NON-NLS-1$ return true; } System.out.println("PING command failed"); //$NON-NLS-1$ } finally { try { out.close(); } catch (IOException ioe) { // ignore } if (in != null) { try { in.close(); } catch (IOException ioe) { // ignore } } } } finally { socket.close(); } } catch (IOException ioe) { System.out.println( "seems that there is no control service running on " //$NON-NLS-1$ + host + ":" + port); //$NON-NLS-1$ //ioe.printStackTrace(); } return false; } static boolean stopRunningApplication(final InetAddress host, final int port) { boolean result = false; try { Socket socket = new Socket(host, port); try { socket.setKeepAlive(true); OutputStream out = socket.getOutputStream(); InputStream in = null; try { System.out.println("found running control service on " //$NON-NLS-1$ + host + ":" + port); //$NON-NLS-1$ out.write("STOP".getBytes()); //$NON-NLS-1$ out.flush(); socket.shutdownOutput(); in = socket.getInputStream(); StringBuilder commandResult = new StringBuilder(); byte[] buf = new byte[16]; int len; while ((len = in.read(buf)) != -1) { commandResult.append(new String(buf, 0, len)); } socket.shutdownInput(); if (commandResult.toString().startsWith("OK")) { //$NON-NLS-1$ System.out.println("STOP command succeed"); //$NON-NLS-1$ result = true; } else { System.out.println("STOP command failed"); //$NON-NLS-1$ } } finally { try { out.close(); } catch (IOException ioe) { // ignore } if (in != null) { try { in.close(); } catch (IOException ioe) { // ignore } } } } finally { socket.close(); } } catch (IOException ioe) { System.out.println( "seems that there is no control service running on " //$NON-NLS-1$ + host + ":" + port); //$NON-NLS-1$ //ioe.printStackTrace(); } if (result) { try { Thread.sleep(2000); } catch (InterruptedException ie) { // ignore } } return result; } private Log log; private ServerSocket serverSocket; private final ServiceApplication application; private boolean appRunning; ControlThread(final InetAddress host, final int port, final ServiceApplication server) throws Exception { log = LogFactory.getLog(this.getClass()); application = server; serverSocket = new ServerSocket(port, 1, host); appRunning = true; setName("jpf-application-control-thread"); //$NON-NLS-1$ } /** * @see java.lang.Runnable#run() */ @Override public void run() { try { while (true) { try { Socket clientSocket = serverSocket.accept(); try { if (handleRequest(clientSocket)) { break; } } finally { try { clientSocket.close(); } catch (IOException ioe) { // ignore } } } catch (Exception e) { warn("error on server socket", e); //$NON-NLS-1$ break; } } } catch (Exception e) { error(e); } finally { try { serverSocket.close(); } catch (IOException ioe) { warn("error closing server socket", ioe); //$NON-NLS-1$ } if (appRunning) { stopApplication(); } } } private synchronized boolean handleRequest(final Socket clientSocket) { debug("handling control request"); //$NON-NLS-1$ if (!isValidRemoteHost(clientSocket.getInetAddress())) { warn("incoming connection to control socket registered" //$NON-NLS-1$ + " from REMOTE address " + clientSocket.getInetAddress() //$NON-NLS-1$ + ", attempt to execute command was IGNORED"); //$NON-NLS-1$ try { clientSocket.close(); } catch (IOException e) { // ignore } return false; } debug("processing control request"); //$NON-NLS-1$ boolean result = false; try { String commandResult; InputStream in = clientSocket.getInputStream(); OutputStream out = null; try { StringBuilder command = new StringBuilder(); byte[] buf = new byte[16]; int len; while ((len = in.read(buf)) != -1) { command.append(new String(buf, 0, len)); } clientSocket.shutdownInput(); debug("got command - " + command); //$NON-NLS-1$ if ("STOP".equals(command.toString())) { //$NON-NLS-1$ stopApplication(); result = true; commandResult = "OK: stop done"; //$NON-NLS-1$ } else if (command.toString().startsWith("PING")) { //$NON-NLS-1$ commandResult = "OK: " //$NON-NLS-1$ + command.substring("PING".length()); //$NON-NLS-1$ } else { commandResult = "ERROR: unknown command"; //$NON-NLS-1$ } //debug("command executed"); //debug("sending command result - " + commandResult); out = clientSocket.getOutputStream(); out.write(commandResult.getBytes()); out.flush(); clientSocket.shutdownOutput(); //debug("command result sent"); } finally { try { in.close(); } catch (IOException ioe) { // ignore } if (out != null) { try { out.close(); } catch (IOException ioe) { // ignore } } } } catch (IOException ioe) { error("error processing control request", ioe); //$NON-NLS-1$ } return result; } private void stopApplication() { if (!appRunning) { debug("application not running"); //$NON-NLS-1$ return; } appRunning = false; debug("stopping application"); //$NON-NLS-1$ try { Boot.stopApplication(application); log = null; } catch (Exception e) { error("an error has occurred while stopping" //$NON-NLS-1$ + " application", e); //$NON-NLS-1$ } debug("application stopped from control thread"); //$NON-NLS-1$ } private boolean isValidRemoteHost(final InetAddress addr) { byte[] localAddr = serverSocket.getInetAddress().getAddress(); byte[] remoteAddr = addr.getAddress(); if (localAddr.length != remoteAddr.length) { return false; } for (int i = 0; i < remoteAddr.length; i++) { if (localAddr[i] != remoteAddr[i]) { return false; } } return true; } private void debug(final String msg) { if (log != null) { log.debug(msg); } else { System.out.println(msg); } } private void warn(final String msg) { if (log != null) { log.warn(msg); } else { System.out.println(msg); } } private void warn(final String msg, final Exception e) { if (log != null) { log.warn(msg, e); } else { System.out.println(msg); e.printStackTrace(); } } private void error(final String msg, final Exception e) { if (log != null) { log.error(msg, e); } else { System.err.println(msg); e.printStackTrace(); } } private void error(final Exception e) { if (log != null) { log.error(e); } else { e.printStackTrace(); } } } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/DefaultPluginsCollector.java0000644000175000017500000002371510554435200030733 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; import javax.xml.parsers.SAXParserFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.PluginManager.PluginLocation; import org.java.plugin.standard.StandardPluginLocation; import org.java.plugin.util.ExtendedProperties; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; /** * Default implementation of plug-ins collector interface. Supported * configuration parameters are: *
*
org.java.plugin.boot.pluginsRepositories
*
Comma separated list of local plug-in repositories, given folders will * be scanned for plug-ins. Default value is ./plugins.
*
org.java.plugin.boot.pluginsLocationsDescriptors
*
Comma separated list of URLs for XML syntax files that describe * available plug-in locations (see file syntax bellow). No default value * provided.
*
*

* Given repositories are scanned recursively collecting all folders that * contain plugin.xml or plugin-fragment.xml and * *.zip and *.jar files. *

*

* Plug-ins locations descriptor is a simple XML syntax file that stores * locations of all available plug-in manifests and contexts (in terms of * {@link org.java.plugin.PluginManager.PluginLocation}). Here is an example: *

<plugins>
 *   <plugin
 *     manifest="http://localhost/myPlugins/plugin1/plugin.xml"
 *     context="http://localhost/myPlugins/plugin1/"/>
 *   <plugin
 *     manifest="http://localhost/myPlugins/plugin2/plugin.xml"
 *     context="http://localhost/myPlugins/plugin2/"/>
 *   <plugin
 *     manifest="http://www.plugins.com/repository/plugin1/plugin.xml"
 *     context="http://www.plugins.com/repository/plugin1/"/>
 *   <plugin
 *     manifest="http://www.plugins.com/repository/plugin1/plugin.xml"
 *     context="http://www.plugins.com/repository/plugin1/"/>
 * </plugins>
* Using such simple descriptor you may, for example, publish plug-ins on a site * to make them available for clients without needing to download plug-ins * manually. *

* @version $Id$ */ public class DefaultPluginsCollector implements PluginsCollector { protected static final String PARAM_PLUGINS_REPOSITORIES = "org.java.plugin.boot.pluginsRepositories"; //$NON-NLS-1$ protected static final String PARAM_PLUGINS_LOCATIONS_DESCRIPTORS = "org.java.plugin.boot.pluginsLocationsDescriptors"; //$NON-NLS-1$ protected Log log = LogFactory.getLog(this.getClass()); private List repositories; private List descriptors; /** * @see org.java.plugin.boot.PluginsCollector#configure( * org.java.plugin.util.ExtendedProperties) */ public void configure(ExtendedProperties config) throws Exception { repositories = new LinkedList(); for (StringTokenizer st = new StringTokenizer( config.getProperty(PARAM_PLUGINS_REPOSITORIES, '.' + File.separator + "plugins"), //$NON-NLS-1$ ",", false); st.hasMoreTokens();) { //$NON-NLS-1$ String token = st.nextToken().trim(); if (token.length() == 0) { continue; } repositories.add(new File(token).getCanonicalFile()); } log.debug("found " + repositories.size() //$NON-NLS-1$ + " local plug-ins repositories"); //$NON-NLS-1$ descriptors = new LinkedList(); for (StringTokenizer st = new StringTokenizer( config.getProperty(PARAM_PLUGINS_LOCATIONS_DESCRIPTORS, ""), //$NON-NLS-1$ ",", false); st.hasMoreTokens();) { //$NON-NLS-1$ String token = st.nextToken().trim(); if (token.length() == 0) { continue; } descriptors.add(new URL(token)); } log.debug("found " + descriptors.size() //$NON-NLS-1$ + " plug-ins locations descriptors"); //$NON-NLS-1$ } /** * @see org.java.plugin.boot.PluginsCollector#collectPluginLocations() */ public Collection collectPluginLocations() { List result = new LinkedList(); for (File file : repositories) { if (file.isDirectory()) { processFolder(file, result); } else if (file.isFile()) { processFile(file, result); } else { log.warn("unknown repository location " + file); //$NON-NLS-1$ } } for (URL url : descriptors) { processDescriptor(url, result); } return result; } protected void processFolder(final File folder, final List result) { log.debug("processing folder - " + folder); //$NON-NLS-1$ try { PluginLocation pluginLocation = StandardPluginLocation.create(folder); if (pluginLocation != null) { result.add(pluginLocation); return; } } catch (MalformedURLException mue) { log.warn("failed collecting plug-in folder " + folder //$NON-NLS-1$ + ", ignoring it", mue); //$NON-NLS-1$ return; } File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; if (file.isDirectory()) { processFolder(file, result); } else if (file.isFile()) { processFile(file, result); } } } protected void processFile(final File file, final List result) { log.debug("processing file - " + file); //$NON-NLS-1$ try { PluginLocation pluginLocation = StandardPluginLocation.create(file); if (pluginLocation != null) { result.add(pluginLocation); } } catch (MalformedURLException mue) { log.warn("failed collecting plug-in file " + file //$NON-NLS-1$ + ", ignoring it", mue); //$NON-NLS-1$ } } private void processDescriptor(final URL url, final List result) { log.debug("processing plug-ins locations descriptor, URL=" + url); //$NON-NLS-1$ try { SAXParserFactory.newInstance().newSAXParser().parse( url.toExternalForm(), new LocationsDescriptorHandler(result)); } catch (Exception e) { log.warn("failed processing plug-ins locations descriptor, URL=" //$NON-NLS-1$ + url, e); } } private final class LocationsDescriptorHandler extends DefaultHandler { private final List resultData; LocationsDescriptorHandler(final List result) { resultData = result; } /** * @see org.xml.sax.helpers.DefaultHandler#startElement( * java.lang.String, java.lang.String, java.lang.String, * org.xml.sax.Attributes) */ @Override public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) { if (!"plugin".equals(qName)) { //$NON-NLS-1$ return; } String manifest = attributes.getValue("manifest"); //$NON-NLS-1$ if (manifest == null) { log.warn("manifest attribute missing"); //$NON-NLS-1$ return; } URL manifestUrl; try { manifestUrl = new URL(manifest); } catch (MalformedURLException mue) { log.warn("invalid manifest URL - " + manifest, mue); //$NON-NLS-1$ return; } String context = attributes.getValue("context"); //$NON-NLS-1$ if (context == null) { log.warn("context attribute missing"); //$NON-NLS-1$ return; } URL contextUrl; try { contextUrl = new URL(context); } catch (MalformedURLException mue) { log.warn("invalid context URL - " + context, mue); //$NON-NLS-1$ return; } resultData.add(new StandardPluginLocation(contextUrl, manifestUrl)); log.debug("got plug-in location from descriptor, manifestUrl=" //$NON-NLS-1$ + manifestUrl + ", contextURL=" + contextUrl); //$NON-NLS-1$ } } } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/BootErrorHandlerConsole.java0000644000175000017500000000541310541226146030672 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import org.java.plugin.registry.IntegrityCheckReport; /** * Console out based error handler implementation, most suites good for * non-interactive service-style applications. * * @version $Id$ */ public class BootErrorHandlerConsole implements BootErrorHandler { /** * Prints given message to the "standard" error output. * @see org.java.plugin.boot.BootErrorHandler#handleFatalError( * java.lang.String) */ public void handleFatalError(final String message) { System.err.println(message); } /** * Prints given message and error stack trace to the "standard" error * output. * * @see org.java.plugin.boot.BootErrorHandler#handleFatalError( * java.lang.String, java.lang.Throwable) */ public void handleFatalError(final String message, final Throwable t) { System.err.println(message); t.printStackTrace(); } /** * Does the same as {@link #handleFatalError(String, Throwable)} always * returns false. * * @see org.java.plugin.boot.BootErrorHandler#handleError(java.lang.String, * java.lang.Exception) */ public boolean handleError(final String message, final Exception e) { handleFatalError(message, e); return false; } /** * Does the same as {@link #handleFatalError(String)} always returns * false. * * @see org.java.plugin.boot.BootErrorHandler#handleError(java.lang.String, * org.java.plugin.registry.IntegrityCheckReport) */ public boolean handleError(final String message, final IntegrityCheckReport report) { System.err.println(message); return false; } } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/Resources_ru.properties0000644000175000017500000000370310541226146030067 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky # $Id$ # Boot errors related messages bootFailed = \u0424\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0431\u043e\u0439 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. bootAppInitFailed = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 # Error handlers related messages errorDialogueHeaderFatal = \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 errorDialogueHeaderNonFatal = \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b integrityCheckFailed = \u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f? initMethodNotFound = \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043c\u0435\u0442\u043e\u0434 [{0}] \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 {1} # Error dialog related resources errorLabel = \u041e\u0448\u0438\u0431\u043a\u0430: {0} noLabel = \u041d\u0435\u0442 yesLabel = \u0414\u0430 closeLabel = \u0417\u0430\u043a\u0440\u044b\u0442\u044c infoTabLabel = \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f detailsTabLabel = \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/package.html0000644000175000017500000000327310514424204025547 0ustar gregoagregoa

This package contains helper classes to start/stop JPF based applications.

The main class here is Boot that contains standard entry point for Java applications - method main(String[]). The implemented boot sequence is following:

For details and supported configuration parameters see documentation for corresponding classes.

Note that described scenario is quite common and can be customized and changed in any point providing other implementations of key classes.

For a list of available configuration parameters see documentation for the Boot (applicable to any scenario) and DefaultApplicationInitializer (applicable to scenario when this class being used) classes.

libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/BootErrorHandler.java0000644000175000017500000000434510541226146027352 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import org.java.plugin.registry.IntegrityCheckReport; /** * Callback interface to handle boot-time application errors. * * @version $Id$ */ public interface BootErrorHandler { /** * Called if fatal error has occurred. * @param message error message */ void handleFatalError(String message); /** * Called if fatal error has occurred. * @param message error message * @param t an error */ void handleFatalError(String message, Throwable t); /** * Called if non-fatal error has occurred and application boot may be * continued. * @param message error message * @param e an error * @return true if user wish to continue application start */ boolean handleError(String message, Exception e); /** * Called if an error has been detected during plug-ins integrity check and * application boot may be continued. * @param message error message * @param integrityCheckReport integrity check report * @return true if user wish to continue application start */ boolean handleError(String message, IntegrityCheckReport integrityCheckReport); } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/Resources.properties0000644000175000017500000000127010541226146027356 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky # $Id$ # Boot errors related messages bootFailed = Application start failed. bootAppInitFailed = can't initialize application # Error handlers related messages errorDialogueHeaderFatal = Application Start Failed errorDialogueHeaderNonFatal = Application Starting Error integrityCheckFailed = Plug-ins integrity check failed, do you wish to continue starting application? initMethodNotFound = method [{0}] not found in application plug-in class {1} # Error dialog related resources errorLabel = Error: {0} noLabel = No yesLabel = Yes closeLabel = Close infoTabLabel = Info detailsTabLabel = Detailslibjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/Resources_de.properties0000644000175000017500000000145110612737644030040 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky^ # German Translation (C) 2007 Stefan Rado # $Id: Resources_de.properties,v 1.1 2007/04/22 18:03:47 ddimon Exp $ # Boot Fehler bootFailed = Anwendungsstart fehlgeschlagen bootAppInitFailed = Kann Anwendung nicht initialisieren # Fehler Behandlung errorDialogueHeaderFatal = Anwendungsstart fehlgeschlagen errorDialogueHeaderNonFatal = Fehler bei Anwendungsstart integrityCheckFailed = Plug-in Integrit\u00e4tspr\u00fcfung fehlgeschlagen. Wollen Sie die Anwendung trotzdem starten? initMethodNotFound = Methode [{0}] nicht gefunden in Anwendungs-Plug-in Klasse {1} # Fehler Dialog errorLabel = Fehler: {0} noLabel = Nein yesLabel = Ja closeLabel = Schlie\u00dfen infoTabLabel = Info detailsTabLabel = Details libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/DefaultApplicationInitializer.java0000644000175000017500000004420110554436550032114 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.ObjectFactory; import org.java.plugin.Plugin; import org.java.plugin.PluginManager; import org.java.plugin.PluginManager.PluginLocation; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.registry.ManifestInfo; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.util.ExtendedProperties; import org.java.plugin.util.IoUtil; import org.java.plugin.util.ResourceManager; /** * Default implementation of the application initializer interface. *

* Supported configuration parameters: *

*
org.java.plugin.boot.applicationPlugin
*
ID of plug-in to start. There is no default value for this parameter. * In common scenario, this is the only parameter that you must provide.
*
org.java.plugin.boot.integrityCheckMode
*
Regulates how to check plug-ins integrity when running JPF. Possible * values: full, light, off. The * default value is full.
*
org.java.plugin.boot.pluginsCollector
*
Plug-ins location collector class, for details see * {@link org.java.plugin.boot.PluginsCollector}. Default is * {@link org.java.plugin.boot.DefaultPluginsCollector}.
*
org.java.plugin.boot.pluginsWhiteList
*
Location of the file with plug-in identifiers that should be only * accepted by this application initializer. This is optional parameter.
*
org.java.plugin.boot.pluginsBlackList
*
Location of the file with plug-in identifiers that should not be * accepted by this application initializer. This is optional parameter.
*
* Note that all given configuration parameters are passed to * {@link org.java.plugin.ObjectFactory#newInstance(ExtendedProperties)} * when running JPF (see bellow). This allows you to configure JPF precisely. *

*

Black and white lists of plug-ins

*

* In some situations you may want to temporary exclude some of your plug-ins * from the application scope. This may be achieved with help of while and black * lists - simple plain text files that contain lists of plug-in identifiers to * be included/excluded from the application. Each identifies should be in * separate line. You may provide unique plug-in ID also. *

*

What is application plug-in?

*

* When application starts, the * {@link org.java.plugin.boot.Boot#main(String[])} method executed calling * {@link #initApplication(BootErrorHandler, String[])} to get initialized * instance of {@link org.java.plugin.boot.Application} * (or {@link org.java.plugin.boot.ServiceApplication}) class. The method * {@link #initApplication(BootErrorHandler, String[])} in this implementation * scans plug-in repositories to collect all available plug-in files and folders * (using special class that can be customized), * instantiates JPF and publishes all discovered plug-ins. After that it asks * {@link org.java.plugin.PluginManager} for an Application Plug-in with * ID provided as configuration parameter. Returned class instance is expected * to be of type {@link org.java.plugin.boot.ApplicationPlugin} and it's method * {@link org.java.plugin.boot.ApplicationPlugin#initApplication(ExtendedProperties, String[])} * called. *

*

* To the mentioned initApplication method passed a subset of * configuration properties whose names start with application plug-in ID * followed with dot character '.' (see * {@link org.java.plugin.util.ExtendedProperties#getSubset(String)} for * details). *

*

* As a result of the described procedure, the Boot get instance of * {@link org.java.plugin.boot.Application} interface, so it can start * application calling * {@link org.java.plugin.boot.Application#startApplication()} method. *

* * @version $Id$ */ public class DefaultApplicationInitializer implements ApplicationInitializer { protected static final String PARAM_APPLICATION_PLUGIN = "org.java.plugin.boot.applicationPlugin"; //$NON-NLS-1$ protected static final String PARAM_INTEGRITY_CHECK_MODE = "org.java.plugin.boot.integrityCheckMode"; //$NON-NLS-1$ protected static final String PARAM_PLUGINS_COLLECTOR = "org.java.plugin.boot.pluginsCollector"; //$NON-NLS-1$ protected static final String PARAM_PLUGINS_WHITE_LIST = "org.java.plugin.boot.pluginsWhiteList"; //$NON-NLS-1$ protected static final String PARAM_PLUGINS_BLACK_LIST = "org.java.plugin.boot.pluginsBlackList"; //$NON-NLS-1$ private Log log; private ExtendedProperties config; private String integrityCheckMode; private PluginsCollector collector; private Set whiteList; private Set blackList; /** * Configures this instance and application environment. The sequence is: *
    *
  • Configure logging system. There is special code for supporting * Log4j logging system only. All other systems support * come from commons-logging package.
  • *
  • Instantiate and configure {@link PluginsCollector} using * configuration data.
  • *
* @see org.java.plugin.boot.ApplicationInitializer#configure( * org.java.plugin.util.ExtendedProperties) */ public void configure(final ExtendedProperties configuration) throws Exception { // Initializing logging system. String log4jConfigKey = "log4j.configuration"; //$NON-NLS-1$ if (System.getProperty(log4jConfigKey) == null) { // Trying to find log4j configuration. if (configuration.containsKey(log4jConfigKey)) { System.setProperty(log4jConfigKey, configuration.getProperty(log4jConfigKey)); } else { File log4jConfig = new File( configuration.getProperty("applicationRoot") //$NON-NLS-1$ + File.separator + "log4j.properties"); //$NON-NLS-1$ if (!log4jConfig.isFile()) { log4jConfig = new File( configuration.getProperty("applicationRoot") //$NON-NLS-1$ + File.separator + "log4j.xml"); //$NON-NLS-1$ } if (log4jConfig.isFile()) { try { System.setProperty(log4jConfigKey, IoUtil.file2url(log4jConfig).toExternalForm()); } catch (MalformedURLException e) { // ignore } } } } log = LogFactory.getLog(getClass()); log.info("logging system initialized"); //$NON-NLS-1$ log.info("application root is " //$NON-NLS-1$ + configuration.getProperty("applicationRoot")); //$NON-NLS-1$ config = configuration; integrityCheckMode = configuration.getProperty(PARAM_INTEGRITY_CHECK_MODE, "full"); //$NON-NLS-1$ collector = getCollectorInstance( configuration.getProperty(PARAM_PLUGINS_COLLECTOR)); collector.configure(configuration); log.debug("plug-ins collector is " + collector); //$NON-NLS-1$ try { whiteList = loadList( configuration.getProperty(PARAM_PLUGINS_WHITE_LIST, null)); } catch (IOException ioe) { log.warn("failed loading white list", ioe); //$NON-NLS-1$ } if (whiteList != null) { log.debug("white list loaded"); //$NON-NLS-1$ } try { blackList = loadList( configuration.getProperty(PARAM_PLUGINS_BLACK_LIST, null)); } catch (IOException ioe) { log.warn("failed loading black list", ioe); //$NON-NLS-1$ } if (blackList != null) { log.debug("black list loaded"); //$NON-NLS-1$ } } private Set loadList(final String location) throws IOException { if (location == null) { return null; } final Set result = new HashSet(); BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(location), "UTF-8")); //$NON-NLS-1$ try { String line; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.length() > 0) { result.add(line); } } } finally { reader.close(); } log.debug("read " + result.size() //$NON-NLS-1$ + " list items from " + location); //$NON-NLS-1$ return result; } private PluginsCollector getCollectorInstance( final String className) { if (className != null) { try { return (PluginsCollector) Class.forName(className) .newInstance(); } catch (InstantiationException ie) { log.warn("failed instantiating plug-ins collector " //$NON-NLS-1$ + className, ie); } catch (IllegalAccessException iae) { log.warn("failed instantiating plug-ins collector " //$NON-NLS-1$ + className, iae); } catch (ClassNotFoundException cnfe) { log.warn("failed instantiating plug-ins collector " //$NON-NLS-1$ + className, cnfe); } } return new DefaultPluginsCollector(); } /** * Initializes application. The sequence is: *
    *
  • Collect plug-ins locations using configured * {@link PluginsCollector}.
  • *
  • Get {@link PluginManager} instance from {@link ObjectFactory} * using code * ObjectFactory.newInstance(config).createManager().
  • *
  • Publish collected plug-ins using * {@link PluginManager#publishPlugins(org.java.plugin.PluginManager.PluginLocation[])}.
  • *
  • Check integrity if that's configured.
  • *
  • Get application plug-in and call it * JpfApplication initApplication(Properties) method.
  • *
  • Return received instance of {@link Application} interface.
  • *
* * @see org.java.plugin.boot.ApplicationInitializer#initApplication( * BootErrorHandler, String[]) */ public Application initApplication(final BootErrorHandler errorHandler, final String[] args) throws Exception { // Prepare parameters to start plug-in manager. log.debug("collecting plug-in locations"); //$NON-NLS-1$ Collection pluginLocations = collector.collectPluginLocations(); log.debug("collected " + pluginLocations.size() //$NON-NLS-1$ + " plug-in locations, instantiating plug-in manager"); //$NON-NLS-1$ // Create instance of plug-in manager. PluginManager pluginManager = ObjectFactory.newInstance(config).createManager(); pluginLocations = filterPluginLocations(pluginManager.getRegistry(), pluginLocations); log.debug(pluginLocations.size() + " plug-in locations remain after " //$NON-NLS-1$ + "applying filters, publishing plug-ins"); //$NON-NLS-1$ // Publish discovered plug-in manifests and corresponding plug-in folders. pluginManager.publishPlugins( pluginLocations.toArray( new PluginLocation[pluginLocations.size()])); if (!"off".equalsIgnoreCase(integrityCheckMode)) { //$NON-NLS-1$ // Check plug-in's integrity. log.debug("checking plug-ins set integrity"); //$NON-NLS-1$ IntegrityCheckReport integrityCheckReport = pluginManager.getRegistry().checkIntegrity( "light".equalsIgnoreCase(integrityCheckMode) ? null //$NON-NLS-1$ : pluginManager.getPathResolver()); log.info("integrity check done: errors - " //$NON-NLS-1$ + integrityCheckReport.countErrors() + ", warnings - " //$NON-NLS-1$ + integrityCheckReport.countWarnings()); if (integrityCheckReport.countErrors() != 0) { // Something wrong in plug-ins set. log.info(integrityCheckReport2str(integrityCheckReport)); if (!errorHandler.handleError(ResourceManager.getMessage( Boot.PACKAGE_NAME, "integrityCheckFailed"), //$NON-NLS-1$ integrityCheckReport)) { return null; } } else if (log.isDebugEnabled() && ((integrityCheckReport.countErrors() > 0) || (integrityCheckReport.countWarnings() > 0))) { log.debug(integrityCheckReport2str(integrityCheckReport)); } } // application plug-in ID String appPluginId = config.getProperty(PARAM_APPLICATION_PLUGIN); log.info("application plug-in is " + appPluginId); //$NON-NLS-1$ // get the start-up application plug-in Plugin appPlugin = pluginManager.getPlugin(appPluginId); log.debug("got application plug-in " + appPlugin //$NON-NLS-1$ + ", initializing application"); //$NON-NLS-1$ if (!(appPlugin instanceof ApplicationPlugin)) { log.error("application plug-in class " //$NON-NLS-1$ + appPlugin.getClass().getName() + " doesn't assignable with " //$NON-NLS-1$ + ApplicationPlugin.class.getName()); throw new ClassCastException(appPlugin.getClass().getName()); } return ((ApplicationPlugin) appPlugin).initApplication( config.getSubset(appPluginId + "."), args); //$NON-NLS-1$ } protected String integrityCheckReport2str(final IntegrityCheckReport report) { StringBuilder buf = new StringBuilder(); buf.append("integrity check report:\r\n"); //$NON-NLS-1$ buf.append("-------------- REPORT BEGIN -----------------\r\n"); //$NON-NLS-1$ for (IntegrityCheckReport.ReportItem item : report.getItems()) { buf.append("\tseverity=").append(item.getSeverity()) //$NON-NLS-1$ .append("; code=").append(item.getCode()) //$NON-NLS-1$ .append("; message=").append(item.getMessage()) //$NON-NLS-1$ .append("; source=").append(item.getSource()) //$NON-NLS-1$ .append("\r\n"); //$NON-NLS-1$ } buf.append("-------------- REPORT END -----------------"); //$NON-NLS-1$ return buf.toString(); } /** * This method may remove unwanted plug-in locations from the given list. * Standard implementation applies black/white lists logic. * @param registry plug-in registry to process manifests * @param pluginLocations collected plug-in locations to be filtered * @throws ManifestProcessingException */ protected Collection filterPluginLocations(final PluginRegistry registry, final Collection pluginLocations) throws ManifestProcessingException { if ((whiteList == null) && (blackList == null)) { return pluginLocations; } final List result = new LinkedList(); for (PluginLocation pluginLocation : pluginLocations) { ManifestInfo manifestInfo = registry.readManifestInfo( pluginLocation.getManifestLocation()); if (whiteList != null) { if (isPluginInList(registry, manifestInfo, whiteList)) { result.add(pluginLocation); } continue; } // blackList is not NULL here if (isPluginInList(registry, manifestInfo, blackList)) { continue; } result.add(pluginLocation); } return result; } private boolean isPluginInList(final PluginRegistry registry, final ManifestInfo manifestInfo, final Set list) { if (list.contains(manifestInfo.getId())) { return true; } return list.contains(registry.makeUniqueId(manifestInfo.getId(), manifestInfo.getVersion())); } } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/BootErrorHandlerGui.java0000644000175000017500000000643010554444316030021 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.util.LinkedList; import java.util.List; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.util.ResourceManager; /** * Standard boot error handler for GUI applications. Uses Swing based dialogue * to show error details to user and prompt for input. * * @version $Id$ */ public class BootErrorHandlerGui implements BootErrorHandler { /** * @see org.java.plugin.boot.BootErrorHandler#handleFatalError( * java.lang.String) */ public void handleFatalError(String message) { ErrorDialog.showError(null, ResourceManager.getMessage(Boot.PACKAGE_NAME, "errorDialogueHeaderFatal"), message); //$NON-NLS-1$ } /** * @see org.java.plugin.boot.BootErrorHandler#handleFatalError( * java.lang.String, java.lang.Throwable) */ public void handleFatalError(String message, Throwable t) { ErrorDialog.showError(null, ResourceManager.getMessage(Boot.PACKAGE_NAME, "errorDialogueHeaderFatal"), message, t); //$NON-NLS-1$ } /** * @see org.java.plugin.boot.BootErrorHandler#handleError(java.lang.String, * java.lang.Exception) */ public boolean handleError(String message, Exception e) { return ErrorDialog.showWarning(null, ResourceManager.getMessage( Boot.PACKAGE_NAME, "errorDialogueHeaderNonFatal"), message, e); //$NON-NLS-1$ } /** * @see org.java.plugin.boot.BootErrorHandler#handleError(java.lang.String, * org.java.plugin.registry.IntegrityCheckReport) */ public boolean handleError(String message, IntegrityCheckReport report) { List items = new LinkedList(); for (IntegrityCheckReport.ReportItem item : report.getItems()) { if (item.getSeverity() != IntegrityCheckReport.Severity.ERROR) { continue; } items.add(item.getMessage()); } //items.add("see log file " + Boot.BOOT_ERROR_FILE_NAME + " for details"); return ErrorDialog.showWarning(null, ResourceManager.getMessage( Boot.PACKAGE_NAME, "errorDialogueHeaderNonFatal"), //$NON-NLS-1$ message, items); } } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/ApplicationInitializer.java0000644000175000017500000000573110541226146030606 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import org.java.plugin.util.ExtendedProperties; /** * Interface to plug custom code into JPF based application boot procedure. The * implementation should contain logic on configuring and initializing (but not * starting) application. * * @version $Id$ */ public interface ApplicationInitializer { /** * Configures this initializer instance, this method will be called once * before any other method call in this class. There is no pre-defined * configuration parameters, see concrete implementations for supported * parameters. * @param config application configuration data from * boot.properties file and System * properties as defaults * @throws Exception if any error has occurred during initializer * configuring */ void configure(ExtendedProperties config) throws Exception; /** * This method should configure and initialize an application instance to be * started. * @param errorHandler callback interface to report errors to the user, * it is recommended to use this handler only for * "non-fatal" errors and ask user via * {@link BootErrorHandler#handleError(String, Exception)} * or {@link BootErrorHandler#handleError(String, org.java.plugin.registry.IntegrityCheckReport)} * if he wants to abort application boot process * @param args command line arguments as they passed to program * main method * @return initialized application instance or null if * initializing failed * @throws Exception if any error has occurred during application * initializing */ Application initApplication(BootErrorHandler errorHandler, String[] args) throws Exception; } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/PluginsCollector.java0000644000175000017500000000416610541226146027430 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.util.Collection; import org.java.plugin.PluginManager.PluginLocation; import org.java.plugin.util.ExtendedProperties; /** * Interface to encapsulate logic for gathering information about available * plug-ins locations. * * @version $Id$ */ public interface PluginsCollector { /** * Configures this collector instance, this method will be called once * before any other method call in this class. There is no pre-defined * configuration parameters, see concrete implementations for supported * parameters. * @param configuration application configuration data from * boot.properties file and * System properties as defaults * @throws Exception if any error has occurred during collector configuring */ void configure(ExtendedProperties configuration) throws Exception; /** * @return collection of all discovered * {@link org.java.plugin.PluginManager.PluginLocation plug-in locations} */ Collection collectPluginLocations(); } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/ApplicationPlugin.java0000644000175000017500000000427510541226146027563 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import org.java.plugin.Plugin; import org.java.plugin.util.ExtendedProperties; /** * This class is for "application" plug-ins - a JPF based program entry point. * The class is part of "standard boot scenario" when * {@link org.java.plugin.boot.DefaultApplicationInitializer} is used for * application initializing. * * @version $Id$ */ public abstract class ApplicationPlugin extends Plugin { /** * This method should instantiate and configure application instance that * will then be started. * @param config application configuration data, see * {@link DefaultApplicationInitializer} for description on * how plug-in configuration data composed from * boot.properties * @param args command line arguments as they passed to program * main method * @return initialized ready to start application instance * @throws Exception if any error has occurred during application * initializing */ protected abstract Application initApplication(ExtendedProperties config, String[] args) throws Exception; } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/Boot.java0000644000175000017500000007264110563673364025062 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import org.apache.commons.logging.LogFactory; import org.java.plugin.PluginManager; import org.java.plugin.util.ExtendedProperties; import org.java.plugin.util.IoUtil; import org.java.plugin.util.ResourceManager; /** * Main class to get JPF based application running in different modes. * Application mode may be specified as jpf.boot.mode configuration * parameter or System property (via -Djpf.boot.mode= command line * argument). Supported values are: *
*
start
*
Runs application in "background" ("service") mode.
*
stop
*
Stops application, running in "background" mode.
*
restart
*
Restarts application, running in "background" mode. If it is not * started, the action is the same as just starting application.
*
shell
*
Runs application in "shell" (or "interactive") mode. It is possible to * control "service" style application from command line. Note, that * already running application will be stopped first.
*
load
*
Only loads application but not starts it as in other modes. This mode * is useful when doing application unit testing or when you only need to * get initialized and ready to be started JPF environment.
*
* The "shell" mode is default. Application will be started in this mode if no * jpf.boot.mode configuration parameter can be found. *

* Application configuration is expected to be in Java properties format file. * File look-up procedure is the following: *

*
    *
  • Check jpf.boot.config System property, if present, load * configuration from that location
  • *
  • Look for boot.properties file in the current folder.
  • *
  • Look for boot.properties resource in classpath (using * Boot.class.getClassLoader().getResource("boot.properties") * and Boot.class.getResource("boot.properties") methods).
  • *
*

* If configuration could not be found, a warning will be printed to console. * It is generally not an error to not use configuration file, you may provide * JPF configuration parameters as System properties. They are always used as * defaults for configuration properties. *

*

* Note that configuration properties will be loaded using * {@link org.java.plugin.util.ExtendedProperties specially extended} * version of {@link java.util.Properties} class, which supports parameters * substitution. If there is no applicationRoot property available * in the given configuration, the current folder will be published as default * value. *

*

* Standard configuration parameters are (all are optional when application is * running in "shell" mode): *

*
jpf.boot.mode
*
Application boot mode. Always available as System property also. * Default value is shell.
*
org.java.plugin.boot.appInitializer
*
Application initializer class, for details see * {@link org.java.plugin.boot.ApplicationInitializer}. Default is * {@link org.java.plugin.boot.DefaultApplicationInitializer}.
*
org.java.plugin.boot.errorHandler
*
Error handler class, for details see * {@link org.java.plugin.boot.BootErrorHandler}. Default is * {@link org.java.plugin.boot.BootErrorHandlerConsole} for "service" style * applications and {@link org.java.plugin.boot.BootErrorHandlerGui} for * "interactive" applications.
*
org.java.plugin.boot.controlHost
*
Host to be used by background control service, no default values.
*
org.java.plugin.boot.controlPort
*
Port number to be used by background control service, no default * values.
*
org.java.plugin.boot.splashHandler
*
Splash screen handler class, for details see * {@link org.java.plugin.boot.SplashHandler}. Default is simple splash * handler that can only display an image.
*
org.java.plugin.boot.splashImage
*
Path to an image file to be shown as splash screen. This may be any * valid URL. If no file and no handler given, the splash screen will not * be shown.
*
org.java.plugin.boot.splashLeaveVisible
*
If set to true, the Boot class will not hide splash screen * at the end of boot procedure but delegate this function to application * code. Default value is false.
*
org.java.plugin.boot.splashDisposeOnHide
*
If set to false, the Boot class will not dispose splash * screen handler when hiding it. This allows you to reuse handler and show * splash screen back after it was hidden. Default value is * true.
*
* * @version $Id$ */ public final class Boot { /** * Name of the file, where to put boot error details. */ public static final String BOOT_ERROR_FILE_NAME = "jpf-boot-error.txt"; //$NON-NLS-1$ /** * Boot configuration file location System property name. */ public static final String PROP_BOOT_CONFIG = "jpf.boot.config"; //$NON-NLS-1$ /** * Boot mode System property name. */ public static final String PROP_BOOT_MODE = "jpf.boot.mode"; //$NON-NLS-1$ /** * "shell" mode boot command value. */ public static final String BOOT_MODE_SHELL = "shell"; //$NON-NLS-1$ /** * "start" mode boot command value. */ public static final String BOOT_MODE_START = "start"; //$NON-NLS-1$ /** * "stop" mode boot command value. */ public static final String BOOT_MODE_STOP = "stop"; //$NON-NLS-1$ /** * "restart" mode boot command value. */ public static final String BOOT_MODE_RESTART = "restart"; //$NON-NLS-1$ /** * "load" mode boot command value. */ public static final String BOOT_MODE_LOAD = "load"; //$NON-NLS-1$ // This is for ResourceManager to look up resources. static final String PACKAGE_NAME = "org.java.plugin.boot"; //$NON-NLS-1$ // Application bootstrap configuration parameter names goes here private static final String PARAM_CONTROL_HOST = "org.java.plugin.boot.controlHost"; //$NON-NLS-1$ private static final String PARAM_CONTROL_PORT = "org.java.plugin.boot.controlPort"; //$NON-NLS-1$ private static final String PARAM_ERROR_HANDLER = "org.java.plugin.boot.errorHandler"; //$NON-NLS-1$ private static final String PARAM_APP_INITIALIZER = "org.java.plugin.boot.appInitializer"; //$NON-NLS-1$ private static final String PARAM_SPLASH_HANDLER = "org.java.plugin.boot.splashHandler"; //$NON-NLS-1$ private static final String PARAM_SPLASH_IMAGE = "org.java.plugin.boot.splashImage"; //$NON-NLS-1$ private static final String PARAM_SPLASH_LEAVE_VISIBLE = "org.java.plugin.boot.splashLeaveVisible"; //$NON-NLS-1$ private static final String PARAM_SPLASH_DISPOSE_ON_HIDE = "org.java.plugin.boot.splashDisposeOnHide"; //$NON-NLS-1$ private static final String PARAM_SPLASH_CONFIG_PREFIX = "org.java.plugin.boot.splash."; //$NON-NLS-1$ static SplashHandler splashHandler = null; /** * Call this method to start/stop application. * @param args command line arguments, not interpreted by this method but * passed to * {@link ApplicationPlugin#initApplication(ExtendedProperties, String[])} * method */ public static void main(final String[] args) { clearBootLog(); // Load start-up configuration ExtendedProperties props = new ExtendedProperties( System.getProperties()); try { InputStream strm = lookupConfig(); try { props.load(strm); } finally { strm.close(); } } catch (IOException ioe) { ioe.printStackTrace(); } String mode = props.getProperty(PROP_BOOT_MODE); if (mode != null) { mode = mode.trim().toLowerCase(Locale.ENGLISH); } else { // set SHELL mode by default mode = BOOT_MODE_SHELL; } props.setProperty(PROP_BOOT_MODE, mode); // Make sure that boot mode is always available as System property: System.setProperty(PROP_BOOT_MODE, mode); boolean useControlService = props.containsKey(PARAM_CONTROL_HOST) && props.containsKey(PARAM_CONTROL_PORT); BootErrorHandler errorHandler = getErrorHandlerInstance( props.getProperty(PARAM_ERROR_HANDLER), useControlService); try { if (props.getProperty("applicationRoot") == null) { //$NON-NLS-1$ // Publish current folder as configuration parameter // to get it available as ${applicationRoot} variable // in extended properties syntax. String applicationRoot = new File(".").getCanonicalPath(); //$NON-NLS-1$ props.put("applicationRoot", applicationRoot); //$NON-NLS-1$ } boot(props, useControlService, mode, errorHandler, args); } catch (Throwable t) { if (splashHandler != null) { splashHandler.setVisible(false); splashHandler = null; } bootLog(t); errorHandler.handleFatalError(ResourceManager.getMessage( Boot.PACKAGE_NAME, "bootFailed"), t); //$NON-NLS-1$ System.exit(1); } } /** * Boots application according to given configuration data. * @param config boot configuration data * @param useControlService if true, the control service will * started to allow handling application instance * from another process * @param mode application run mode * @param errorHandler boot errors handler instance * @param args command line arguments, not interpreted by this method but * passed to * {@link ApplicationPlugin#initApplication(ExtendedProperties, String[])} * method * @return initialized application instance or null * @throws Exception if any un-handled error has occurred */ public static Application boot(final ExtendedProperties config, final boolean useControlService, final String mode, final BootErrorHandler errorHandler, final String[] args) throws Exception { InetAddress controlHost = useControlService ? InetAddress.getByName( config.getProperty(PARAM_CONTROL_HOST)) : null; int controlPort = useControlService ? Integer.parseInt( config.getProperty(PARAM_CONTROL_PORT), 10) : 0; // handle given command if (useControlService && BOOT_MODE_STOP.equals(mode)) { if (!ControlThread.stopRunningApplication(controlHost, controlPort)) { System.out.println("application not running"); //$NON-NLS-1$ } else { System.out.println("application stopped"); //$NON-NLS-1$ } return null; } if (useControlService && BOOT_MODE_START.equals(mode)) { if (ControlThread.isApplicationRunning(controlHost, controlPort)) { errorHandler.handleFatalError( "Application already running."); //$NON-NLS-1$ return null; } Application application = initApplication(errorHandler, config, args); if (!(application instanceof ServiceApplication)) { errorHandler.handleFatalError( "Application is not a service."); //$NON-NLS-1$ return null; } ControlThread controlThread = new ControlThread(controlHost, controlPort, (ServiceApplication) application); application.startApplication(); controlThread.start(); System.out.println( "application started in BACKGROUND mode"); //$NON-NLS-1$ return application; } if (useControlService && BOOT_MODE_RESTART.equals(mode)) { if (ControlThread.stopRunningApplication(controlHost, controlPort)) { System.out.println("another instance of application stopped"); //$NON-NLS-1$ } Application application = initApplication(errorHandler, config, args); if (!(application instanceof ServiceApplication)) { errorHandler.handleFatalError( "Application is not a service."); //$NON-NLS-1$ return null; } ControlThread controlThread = new ControlThread(controlHost, controlPort, (ServiceApplication) application); application.startApplication(); controlThread.start(); System.out.println( "application started in BACKGROUND mode"); //$NON-NLS-1$ return application; } // SHELL or LOAD or an unknown modes if (useControlService && ControlThread.stopRunningApplication(controlHost, controlPort)) { System.out.println("another instance of application stopped"); //$NON-NLS-1$ } if (!BOOT_MODE_LOAD.equals(mode)) { initSplashHandler(config); if (splashHandler != null) { splashHandler.setVisible(true); } } Application application = initApplication(errorHandler, config, args); if (!BOOT_MODE_LOAD.equals(mode)) { application.startApplication(); if ((splashHandler != null) && !"true".equalsIgnoreCase(config.getProperty( //$NON-NLS-1$ PARAM_SPLASH_LEAVE_VISIBLE, "false"))) { //$NON-NLS-1$ splashHandler.setVisible(false); } if ((application instanceof ServiceApplication) && BOOT_MODE_SHELL.equals(mode)) { System.out.println("application started in SHELL mode"); //$NON-NLS-1$ runShell(); stopApplication(application); } } return application; } /** * Stops the application, shuts down plug-in manager and disposes log * service. Call this method before exiting interactive application. For * service applications this method will be called automatically by control * service or from shell. * @param application application instance being stopped * @throws Exception if any error has occurred during application stopping */ public static void stopApplication(final Application application) throws Exception { if (application instanceof ServiceApplication) { ((ServiceApplication) application).stopApplication(); } PluginManager pluginManager = PluginManager.lookup(application); if (pluginManager != null) { pluginManager.shutdown(); } LogFactory.getLog(Boot.class).info("logging system finalized"); //$NON-NLS-1$ LogFactory.getLog(Boot.class).info("---------------------------------"); //$NON-NLS-1$ LogFactory.releaseAll(); } /** * Returns current instance of splash screen handler if it is available or * null. * @return instance of splash handler or null if no active * instance available */ public static SplashHandler getSplashHandler() { return splashHandler; } /** * @param handler the new splash handler instance to set or * null to dispose current handler directly */ public static void setSplashHandler(final SplashHandler handler) { if ((handler == null) && (splashHandler != null)) { splashHandler.setVisible(false); } splashHandler = handler; } private static InputStream lookupConfig() throws IOException { String property = System.getProperty(PROP_BOOT_CONFIG); if (property != null) { return IoUtil.getResourceInputStream(str2url(property)); } File file = new File("boot.properties"); //$NON-NLS-1$ if (file.isFile()) { return new FileInputStream(file); } URL url = Boot.class.getClassLoader().getResource("boot.properties"); //$NON-NLS-1$ if (url != null) { return IoUtil.getResourceInputStream(url); } url = Boot.class.getResource("boot.properties"); //$NON-NLS-1$ if (url != null) { return IoUtil.getResourceInputStream(url); } throw new IOException("configuration file boot.properties not found"); //$NON-NLS-1$ } private static URL str2url(final String str) throws MalformedURLException { int p = str.indexOf("!/"); //$NON-NLS-1$ if (p == -1) { try { return new URL(str); } catch (MalformedURLException mue) { return IoUtil.file2url(new File(str)); } } if (str.startsWith("jar:")) { //$NON-NLS-1$ return new URL(str); } File file = new File(str.substring(0, p)); if (file.isFile()) { return new URL("jar:" + IoUtil.file2url(file) + str.substring(p)); //$NON-NLS-1$ } return new URL("jar:" + str); //$NON-NLS-1$ } private static BootErrorHandler getErrorHandlerInstance( final String handler, final boolean isServiceApp) { if (handler != null) { try { return (BootErrorHandler) Class.forName(handler).newInstance(); } catch (InstantiationException ie) { System.err.println("failed instantiating error handler " //$NON-NLS-1$ + handler); ie.printStackTrace(); } catch (IllegalAccessException iae) { System.err.println("failed instantiating error handler " //$NON-NLS-1$ + handler); iae.printStackTrace(); } catch (ClassNotFoundException cnfe) { System.err.println("failed instantiating error handler " //$NON-NLS-1$ + handler); cnfe.printStackTrace(); } } return isServiceApp ? new BootErrorHandlerConsole() : (BootErrorHandler) new BootErrorHandlerGui(); } private static void initSplashHandler(final ExtendedProperties config) throws Exception { String handlerClass = config.getProperty(PARAM_SPLASH_HANDLER); String splashImage = config.getProperty(PARAM_SPLASH_IMAGE); URL url = null; if ((splashImage != null) && (splashImage.length() > 0)) { try { url = new URL(splashImage); } catch (MalformedURLException mue) { // ignore } if (url == null) { File splashFile = new File(splashImage); if (splashFile.isFile()) { url = IoUtil.file2url(splashFile); } else { throw new FileNotFoundException("splash image file " //$NON-NLS-1$ + splashFile + " not found"); //$NON-NLS-1$ } } } boolean disposeOnHide = !"false".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty(PARAM_SPLASH_DISPOSE_ON_HIDE, "true")); //$NON-NLS-1$ if (handlerClass != null) { splashHandler = new SplashHandlerWrapper(disposeOnHide, (SplashHandler) Class.forName(handlerClass).newInstance()); } if ((splashHandler == null) && (url != null)) { splashHandler = new SplashHandlerWrapper(disposeOnHide, new SimpleSplashHandler()); } if (splashHandler != null) { if (url != null) { splashHandler.setImage(url); } splashHandler.configure( config.getSubset(PARAM_SPLASH_CONFIG_PREFIX)); } } private static Application initApplication( final BootErrorHandler errorHandler, final ExtendedProperties props, final String[] args) throws Exception { ApplicationInitializer appInitializer = null; String className = props.getProperty(PARAM_APP_INITIALIZER); if (className != null) { try { appInitializer = (ApplicationInitializer) Class.forName( className).newInstance(); } catch (InstantiationException ie) { System.err.println( "failed instantiating application initializer " //$NON-NLS-1$ + className); ie.printStackTrace(); } catch (IllegalAccessException iae) { System.err.println( "failed instantiating application initializer " //$NON-NLS-1$ + className); iae.printStackTrace(); } catch (ClassNotFoundException cnfe) { System.err.println( "failed instantiating application initializer " //$NON-NLS-1$ + className); cnfe.printStackTrace(); } } if (appInitializer == null) { appInitializer = new DefaultApplicationInitializer(); } appInitializer.configure(props); Application result = appInitializer.initApplication(errorHandler, args); if (result == null) { throw new Exception(ResourceManager.getMessage( Boot.PACKAGE_NAME, "bootAppInitFailed")); //$NON-NLS-1$ } return result; } private static void runShell() { System.out.println("Press 'q' key to exit."); //$NON-NLS-1$ do { int c; try { c = System.in.read(); } catch (IOException ioe) { break; } if (('q' == (char) c) || ('Q' == (char) c)) { break; } } while (true); } private static void clearBootLog() { File file = new File(BOOT_ERROR_FILE_NAME); if (file.isFile()) { file.delete(); } } private static void bootLog(final Throwable t) { try { Writer writer = new OutputStreamWriter( new FileOutputStream(BOOT_ERROR_FILE_NAME, false), "UTF-8"); //$NON-NLS-1$ try { writer.write("JPF Application boot failed."); //$NON-NLS-1$ writer.write(System.getProperty("line.separator")); //$NON-NLS-1$ writer.write(ErrorDialog.getErrorDetails(t)); } finally { writer.close(); } } catch (Throwable t2) { throw new Error("boot failed", t); //$NON-NLS-1$ } } private Boot() { // no-op } } final class SimpleSplashHandler implements SplashHandler { private float progress; private String text; private URL image; private boolean isVisible; /** * @see org.java.plugin.boot.SplashHandler#configure( * org.java.plugin.util.ExtendedProperties) */ public void configure(final ExtendedProperties config) { // no-op } /** * @see org.java.plugin.boot.SplashHandler#getProgress() */ public float getProgress() { return progress; } /** * @see org.java.plugin.boot.SplashHandler#setProgress(float) */ public void setProgress(final float value) { if ((value < 0) || (value > 1)) { throw new IllegalArgumentException( "invalid progress value " + value); //$NON-NLS-1$ } progress = value; } /** * @see org.java.plugin.boot.SplashHandler#getText() */ public String getText() { return text; } /** * @see org.java.plugin.boot.SplashHandler#setText(java.lang.String) */ public void setText(final String value) { text = value; } /** * @see org.java.plugin.boot.SplashHandler#getImage() */ public URL getImage() { return image; } /** * @see org.java.plugin.boot.SplashHandler#setImage(java.net.URL) */ public void setImage(final URL value) { image = value; } /** * @see org.java.plugin.boot.SplashHandler#isVisible() */ public boolean isVisible() { return isVisible; } /** * @see org.java.plugin.boot.SplashHandler#setVisible(boolean) */ public void setVisible(final boolean value) { if (isVisible == value) { return; } if (value) { SplashWindow.splash(image); isVisible = true; return; } SplashWindow.disposeSplash(); isVisible = false; } /** * @see org.java.plugin.boot.SplashHandler#getImplementation() */ public Object getImplementation() { return this; } } final class SplashHandlerWrapper implements SplashHandler { private final SplashHandler delegate; private final boolean isDisposeOnHide; SplashHandlerWrapper(final boolean disposeOnHide, final SplashHandler other) { isDisposeOnHide = disposeOnHide; delegate = other; } /** * @see org.java.plugin.boot.SplashHandler#configure( * org.java.plugin.util.ExtendedProperties) */ public void configure(final ExtendedProperties config) { delegate.configure(config); } /** * @see org.java.plugin.boot.SplashHandler#getProgress() */ public float getProgress() { return delegate.getProgress(); } /** * @see org.java.plugin.boot.SplashHandler#setProgress(float) */ public void setProgress(float value) { delegate.setProgress(value); } /** * @see org.java.plugin.boot.SplashHandler#getText() */ public String getText() { return delegate.getText(); } /** * @see org.java.plugin.boot.SplashHandler#setText(java.lang.String) */ public void setText(String value) { delegate.setText(value); } /** * @see org.java.plugin.boot.SplashHandler#getImage() */ public URL getImage() { return delegate.getImage(); } /** * @see org.java.plugin.boot.SplashHandler#setImage(java.net.URL) */ public void setImage(URL value) { delegate.setImage(value); } /** * @see org.java.plugin.boot.SplashHandler#isVisible() */ public boolean isVisible() { return delegate.isVisible(); } /** * @see org.java.plugin.boot.SplashHandler#setVisible(boolean) */ public void setVisible(boolean value) { delegate.setVisible(value); if (isDisposeOnHide && !delegate.isVisible()) { Boot.splashHandler = null; } } /** * @see org.java.plugin.boot.SplashHandler#getImplementation() */ public Object getImplementation() { return delegate.getImplementation(); } }libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/ErrorDialog.java0000644000175000017500000005373110554436632026362 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.TreeMap; import javax.swing.AbstractAction; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import org.java.plugin.util.ResourceManager; /** * Helper class to display detailed message about application error. * * @version $Id$ */ public class ErrorDialog extends JDialog { private static final long serialVersionUID = 7142861251076530780L; /** * Displays error dialogue to the user. * @param parentComponent parent component, may be null * @param title window title * @param message error message */ public static void showError(final Component parentComponent, final String title, final String message) { showError(parentComponent, title, message, null, null); } /** * Displays error dialogue to the user. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @param data error data, {@link Collection collections} and arrays are * handled specially, all other objects are shown using * toString() method */ public static void showError(final Component parentComponent, final String title, final String message, final Object data) { showError(parentComponent, title, message, data, null); } /** * Displays error dialogue to the user. * @param parentComponent parent component, may be null * @param title window title * @param data error data, {@link Collection collections} and arrays are * handled specially, all other objects are shown using * toString() method * @param error an error to be shown in details section */ public static void showError(final Component parentComponent, final String title, final Object data, final Throwable error) { String message = error.getMessage(); if ((message == null) || (message.trim().length() == 0)) { message = error.toString(); } showError(parentComponent, title, message, data, error); } /** * Displays error dialogue to the user. * @param parentComponent parent component, may be null * @param title window title * @param error an error to be shown in details section */ public static void showError(final Component parentComponent, final String title, final Throwable error) { String message = error.getMessage(); if ((message == null) || (message.trim().length() == 0)) { message = error.toString(); } showError(parentComponent, title, message, error); } /** * Displays error dialogue to the user. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @param error an error to be shown in details section */ public static void showError(final Component parentComponent, final String title, final String message, final Throwable error) { showError(parentComponent, title, message, null, error); } /** * Displays error dialogue to the user. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @param data error data, {@link Collection collections} and arrays are * handled specially, all other objects are shown using * toString() method * @param error an error to be shown in details section */ public static void showError(final Component parentComponent, final String title, final String message, final Object data, final Throwable error) { Frame frame = (parentComponent != null) ? JOptionPane .getFrameForComponent(parentComponent) : JOptionPane .getRootFrame(); new ErrorDialog(frame, title, message, data, error, false).setVisible(true); } /** * Displays error dialogue to the user and lets him to make a decision with * "Yes" and "No" buttons. The question should be in the given message. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @return true if user chooses "Yes" answer */ public static boolean showWarning(final Component parentComponent, final String title, final String message) { return showWarning(parentComponent, title, message, null, null); } /** * Displays error dialogue to the user and lets him to make a decision with * "Yes" and "No" buttons. The question should be in the given message. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @param data error data, {@link Collection collections} and arrays are * handled specially, all other objects are shown using * toString() method * @return true if user chooses "Yes" answer */ public static boolean showWarning(final Component parentComponent, final String title, final String message, final Object data) { return showWarning(parentComponent, title, message, data, null); } /** * Displays error dialogue to the user and lets him to make a decision with * "Yes" and "No" buttons. The question should be in the given message. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @param error an error to be shown in details section * @return true if user chooses "Yes" answer */ public static boolean showWarning(final Component parentComponent, final String title, final String message, final Throwable error) { return showWarning(parentComponent, title, message, null, error); } /** * Displays error dialogue to the user and lets him to make a decision with * "Yes" and "No" buttons. The question should be in the given message. * @param parentComponent parent component, may be null * @param title window title * @param message error message * @param data error data, {@link Collection collections} and arrays are * handled specially, all other objects are shown using * toString() method * @param error an error to be shown in details section * @return true if user chooses "Yes" answer */ public static boolean showWarning(final Component parentComponent, final String title, final String message, final Object data, final Throwable error) { Frame frame = (parentComponent != null) ? JOptionPane .getFrameForComponent(parentComponent) : JOptionPane .getRootFrame(); ErrorDialog dialog = new ErrorDialog(frame, title, message, data, error, true); dialog.setVisible(true); return dialog.yesBtnPressed; } /** * Utility method to get detailed error report. * @param t exception instance, may be null * @return detailed error message with most important system information * included */ public static String getErrorDetails(final Throwable t) { StringBuilder sb = new StringBuilder(); String nl = System.getProperty("line.separator"); //$NON-NLS-1$ sb.append(new Date()).append(nl); if (t != null) { // Print exception details. sb.append(nl).append( "-----------------------------------------------") //$NON-NLS-1$ .append(nl); sb.append("Exception details.").append(nl).append(nl); //$NON-NLS-1$ sb.append("Class: ").append(t.getClass().getName()).append(nl); //$NON-NLS-1$ sb.append("Message: ").append(t.getMessage()).append(nl); //$NON-NLS-1$ printError(t, "Stack trace:", sb); //$NON-NLS-1$ } // Print system properties. sb.append(nl).append("-----------------------------------------------") //$NON-NLS-1$ .append(nl); sb.append("System properties:").append(nl).append(nl); //$NON-NLS-1$ for (Map.Entry entry : new TreeMap(System.getProperties()).entrySet()) { sb.append(entry.getKey()).append("=") //$NON-NLS-1$ .append(entry.getValue()).append(nl); } // Print runtime info. sb.append(nl).append("-----------------------------------------------") //$NON-NLS-1$ .append(nl); sb.append("Runtime info:").append(nl).append(nl); //$NON-NLS-1$ Runtime rt = Runtime.getRuntime(); sb.append("Memory TOTAL / FREE / MAX: ") //$NON-NLS-1$ .append(rt.totalMemory()).append(" / ") //$NON-NLS-1$ .append(rt.freeMemory()).append(" / ") //$NON-NLS-1$ .append(rt.maxMemory()).append(nl); sb.append("Available processors: ") //$NON-NLS-1$ .append(rt.availableProcessors()).append(nl); sb.append("System class loader: ").append("" //$NON-NLS-1$ //$NON-NLS-2$ + ClassLoader.getSystemClassLoader()).append(nl); sb.append("Thread context class loader: ").append("" //$NON-NLS-1$ //$NON-NLS-2$ + Thread.currentThread().getContextClassLoader()).append(nl); sb.append("Security manager: ").append("" //$NON-NLS-1$ //$NON-NLS-2$ + System.getSecurityManager()).append(nl); return sb.toString(); } /** * Prints detailed stack trace to the given buffer. * @param t exception instance, may be null * @param header stack trace caption * @param sb output text buffer */ public static void printError(final Throwable t, final String header, final StringBuilder sb) { if (t == null) { return; } String nl = System.getProperty("line.separator"); //$NON-NLS-1$ sb.append(nl).append(header).append(nl).append(nl); StackTraceElement[] stackTrace = t.getStackTrace(); for (int i = 0; i < stackTrace.length; i++) { sb.append(stackTrace[i].toString()).append(nl); } Throwable next = t.getCause(); printError(next, "Caused by " + next, sb); //$NON-NLS-1$ if (t instanceof SQLException) { // Handle SQLException specifically. next = ((SQLException) t).getNextException(); printError(next, "Next exception: " + next, sb); //$NON-NLS-1$ } else if (t instanceof InvocationTargetException) { // Handle InvocationTargetException specifically. next = ((InvocationTargetException) t).getTargetException(); printError(next, "Target exception: " + next, sb); //$NON-NLS-1$ } } private javax.swing.JPanel jContentPane = null; private JPanel jPanel = null; private JLabel messageLabel = null; private JLabel errorLabel = null; private JPanel jPanel1 = null; private JButton closeButton = null; private JScrollPane jScrollPane = null; JTextArea jTextArea = null; private JTabbedPane jTabbedPane = null; private JPanel jPanelInfo = null; private JScrollPane jScrollPane2 = null; private JList jList = null; private JLabel dataLabel = null; boolean yesBtnPressed = false; private JButton yesButton = null; private ErrorDialog(final Frame owner, final String title, final String message, final Object data, final Throwable t, boolean yesNo) { super((owner != null) ? owner : JOptionPane.getRootFrame()); initialize(); setLocationRelativeTo(getOwner()); jTabbedPane.setTitleAt(0, ResourceManager.getMessage(Boot.PACKAGE_NAME, "infoTabLabel")); //$NON-NLS-1$ jTabbedPane.setTitleAt(1, ResourceManager.getMessage(Boot.PACKAGE_NAME, "detailsTabLabel")); //$NON-NLS-1$ setTitle(title); messageLabel.setText(message); if (t != null) { errorLabel.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME, "errorLabel", t)); //$NON-NLS-1$ } else { getJPanel().remove(errorLabel); } if (data instanceof Collection) { DefaultListModel model = new DefaultListModel(); for (Object object : (Collection) data) { model.addElement(object); } jList.setModel(model); getJPanel().remove(dataLabel); } else if (data instanceof Object[]) { DefaultListModel model = new DefaultListModel(); for (Object object : (Object[]) data) model.addElement(object); jList.setModel(model); getJPanel().remove(dataLabel); } else if (data != null) { dataLabel.setText(data.toString()); getJPanelInfo().remove(getJScrollPane()); } else { getJPanel().remove(dataLabel); getJPanelInfo().remove(getJScrollPane()); } jTextArea.setText(getErrorDetails(t)); jTextArea.setCaretPosition(0); if (yesNo) { closeButton.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME, "noLabel")); //$NON-NLS-1$ yesButton.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME, "yesLabel")); //$NON-NLS-1$ } else { getJPanel1().remove(yesButton); closeButton.setText(ResourceManager.getMessage(Boot.PACKAGE_NAME, "closeLabel")); //$NON-NLS-1$ } } private void initialize() { this.setDefaultCloseOperation( javax.swing.WindowConstants.DISPOSE_ON_CLOSE); this.setModal(true); this.setTitle("An error has occurred"); //$NON-NLS-1$ this.setSize(460, 280); this.setContentPane(getJContentPane()); getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG); getRootPane().setDefaultButton(closeButton); getRootPane().getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW).put( KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "doCloseDefault"); //$NON-NLS-1$ getRootPane().getActionMap().put("doCloseDefault", //$NON-NLS-1$ new AbstractAction() { private static final long serialVersionUID = -9167454634726502084L; public void actionPerformed(final ActionEvent evt) { dispose(); } }); getRootPane().setDefaultButton(getCloseButton()); } private javax.swing.JPanel getJContentPane() { if (jContentPane == null) { BorderLayout borderLayout2 = new BorderLayout(); jContentPane = new javax.swing.JPanel(); jContentPane.setLayout(borderLayout2); borderLayout2.setVgap(2); jContentPane.add(getJPanel1(), java.awt.BorderLayout.SOUTH); jContentPane.add(getJTabbedPane(), java.awt.BorderLayout.CENTER); } return jContentPane; } private JPanel getJPanel() { if (jPanel == null) { dataLabel = new JLabel(); dataLabel.setText("JLabel"); //$NON-NLS-1$ errorLabel = new JLabel(); messageLabel = new JLabel(); jPanel = new JPanel(); jPanel.setLayout(new BoxLayout(getJPanel(), BoxLayout.Y_AXIS)); messageLabel.setText("JLabel"); //$NON-NLS-1$ errorLabel.setText("JLabel"); //$NON-NLS-1$ jPanel.add(messageLabel, null); jPanel.add(errorLabel, null); jPanel.add(dataLabel, null); } return jPanel; } private JPanel getJPanel1() { if (jPanel1 == null) { FlowLayout flowLayout = new FlowLayout(); flowLayout.setAlignment(java.awt.FlowLayout.RIGHT); jPanel1 = new JPanel(); jPanel1.setLayout(flowLayout); jPanel1.add(getYesButton(), null); jPanel1.add(getCloseButton(), null); } return jPanel1; } private JButton getCloseButton() { if (closeButton == null) { closeButton = new JButton(); closeButton.setText("Close"); //$NON-NLS-1$ closeButton.setSelected(true); closeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { dispose(); } }); } return closeButton; } private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setViewportView(getJList()); } return jScrollPane; } private JTextArea getJTextArea() { if (jTextArea == null) { jTextArea = new JTextArea(); jTextArea.setBackground(java.awt.SystemColor.control); jTextArea.setEditable(false); jTextArea.setOpaque(false); jTextArea.addMouseListener(new MouseAdapter() { @Override public void mousePressed(final MouseEvent evt) { if (!evt.isPopupTrigger()) { return; } copyText(); } @Override public void mouseReleased(final MouseEvent evt) { if (!evt.isPopupTrigger()) { return; } copyText(); } private void copyText() { if (jTextArea.getSelectedText() != null) { jTextArea.copy(); return; } jTextArea.setSelectionStart(0); jTextArea.setSelectionEnd(jTextArea.getText().length()); jTextArea.copy(); jTextArea.setSelectionEnd(0); } }); } return jTextArea; } private JTabbedPane getJTabbedPane() { if (jTabbedPane == null) { jTabbedPane = new JTabbedPane(); jTabbedPane.addTab("Info", null, getJPanelInfo(), null); //$NON-NLS-1$ jTabbedPane.addTab("Details", null, getJScrollPane2(), null); //$NON-NLS-1$ } return jTabbedPane; } private JPanel getJPanelInfo() { if (jPanelInfo == null) { jPanelInfo = new JPanel(); jPanelInfo.setLayout(new BorderLayout()); jPanelInfo.add(getJPanel(), java.awt.BorderLayout.NORTH); jPanelInfo.add(getJScrollPane(), java.awt.BorderLayout.CENTER); } return jPanelInfo; } private JScrollPane getJScrollPane2() { if (jScrollPane2 == null) { jScrollPane2 = new JScrollPane(); jScrollPane2.setViewportView(getJTextArea()); } return jScrollPane2; } private JList getJList() { if (jList == null) { jList = new JList(); } return jList; } private JButton getYesButton() { if (yesButton == null) { yesButton = new JButton(); yesButton.setText("Yes"); //$NON-NLS-1$ yesButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { yesBtnPressed = true; dispose(); } }); } return yesButton; } } // @jve:decl-index=0:visual-constraint="10,10" libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/SplashWindow.java0000644000175000017500000001554610552477736026605 0ustar gregoagregoa// This class originally taken from // http://www.randelshofer.ch/oop/javasplash/javasplash.html /* * @(#)SplashWindow.java 2.2 2005-04-03 * * Copyright (c) 2003-2005 Werner Randelshofer * Staldenmattweg 2, Immensee, CH-6405, Switzerland. * All rights reserved. * * This software is in the public domain. */ package org.java.plugin.boot; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.URL; /** * A Splash window. *

* Usage: MyApplication is your application class. Create a Splasher class which * opens the splash window, invokes the main method of your Application class, * and disposes the splash window afterwards. * Please note that we want to keep the Splasher class and the SplashWindow class * as small as possible. The less code and the less classes must be loaded into * the JVM to open the splash screen, the faster it will appear. *

 * class Splasher {
 *    public static void main(String[] args) {
 *         SplashWindow.splash(Startup.class.getResource("splash.gif"));
 *         MyApplication.main(args);
 *         SplashWindow.disposeSplash();
 *    }
 * }
 * 
* * @author Werner Randelshofer * @version 2.1 2005-04-03 Revised. * @version $Id$ */ final class SplashWindow extends Window { private static final long serialVersionUID = 7264517933349367876L; /** * The current instance of the splash window. * (Singleton design pattern). */ private static SplashWindow instance; /** * The splash image which is displayed on the splash window. */ private Image image; /** * This attribute indicates whether the method * paint(Graphics) has been called at least once since the * construction of this window.
* This attribute is used to notify method splash(Image) * that the window has been drawn at least once * by the AWT event dispatcher thread.
* This attribute acts like a latch. Once set to true, * it will never be changed back to false again. * * @see #paint(Graphics) * @see #splash(URL) */ boolean paintCalled = false; /** * Creates a new instance. * @param parent the parent of the window. * @param image the splash image. */ private SplashWindow(final Frame parent, final Image anImage) { super(parent); image = anImage; // Load the image MediaTracker mt = new MediaTracker(this); mt.addImage(image,0); try { mt.waitForID(0); } catch(InterruptedException ie){ // ignore } // Center the window on the screen int imgWidth = image.getWidth(this); int imgHeight = image.getHeight(this); setSize(imgWidth, imgHeight); Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize(); setLocation( (screenDim.width - imgWidth) / 2, (screenDim.height - imgHeight) / 2 ); // Users shall be able to close the splash window by // clicking on its display area. This mouse listener // listens for mouse clicks and disposes the splash window. MouseAdapter disposeOnClick = new MouseAdapter() { @Override public void mouseClicked(final MouseEvent evt) { // Note: To avoid that method splash hangs, we // must set paintCalled to true and call notifyAll. // This is necessary because the mouse click may // occur before the contents of the window // has been painted. synchronized(SplashWindow.this) { SplashWindow.this.paintCalled = true; SplashWindow.this.notifyAll(); } dispose(); } }; addMouseListener(disposeOnClick); } /** * @see java.awt.Component#update(java.awt.Graphics) */ @Override public void update(final Graphics g) { // Note: Since the paint method is going to draw an // image that covers the complete area of the component we // do not fill the component with its background color // here. This avoids flickering. paint(g); } /** * @see java.awt.Component#paint(java.awt.Graphics) */ @Override public void paint(final Graphics g) { g.drawImage(image, 0, 0, this); // Notify method splash that the window // has been painted. // Note: To improve performance we do not enter // the synchronized block unless we have to. if (!paintCalled) { paintCalled = true; synchronized (this) { notifyAll(); } } } /** * Open's a splash window using the specified image. * @param image The splash image. */ private static void splash(final Image image) { if (instance == null && image != null) { Frame f = new Frame(); // Create the splash image instance = new SplashWindow(f, image); // Show the window. instance.setVisible(true); // Note: To make sure the user gets a chance to see the // splash window we wait until its paint method has been // called at least once by the AWT event dispatcher thread. // If more than one processor is available, we don't wait, // and maximize CPU throughput instead. if (! EventQueue.isDispatchThread() && Runtime.getRuntime().availableProcessors() == 1) { synchronized (instance) { while (!instance.paintCalled) { try { instance.wait(); } catch (InterruptedException ie) { // ignore } } } } } } /** * Open's a splash window using the specified image. * @param imageURL The url of the splash image. */ static void splash(final URL imageURL) { if (imageURL != null) { splash(Toolkit.getDefaultToolkit().createImage(imageURL)); } } /** * Closes the splash window. */ static void disposeSplash() { if (instance != null) { instance.getOwner().dispose(); instance = null; } } } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/Application.java0000644000175000017500000000267010541226144026377 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; /** * This is "marker" interface to abstract an application that may be started * (and will stop itself upon user activity). * * @see org.java.plugin.boot.ServiceApplication * * @version $Id$ */ public interface Application { /** * This method should start the application. * @throws Exception if any error has occurred during application start */ void startApplication() throws Exception; } libjpf-java-1.5.1+dfsg.orig/source-boot/org/java/plugin/boot/ServiceApplication.java0000644000175000017500000000275510541226146027726 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.boot; /** * This is "marker" interface to represent a service style application that * may be started and stopped. * * @version $Id$ */ public interface ServiceApplication extends Application { /** * This method should stop the application. Don't call this method directly, * use {@link Boot#stopApplication(Application)} instead. * @throws Exception if any error has occurred during application stopping */ void stopApplication() throws Exception; } libjpf-java-1.5.1+dfsg.orig/build.properties0000644000175000017500000000055210601272650020271 0ustar gregoagregoa# JPF build configuration compile.debug = true compile.optimize = false compile.target-vm = 1.5 javadoc.access = protected javadoc.use = true javadoc.notree = false javadoc.nonavbar = false javadoc.noindex = false javadoc.splitindex = false javadoc.author = true javadoc.version = true javadoc.nodeprecatedlist = false javadoc.nodeprecated = false libjpf-java-1.5.1+dfsg.orig/changelog.txt0000644000175000017500000000254510623626274017561 0ustar gregoagregoa$Id: changelog.txt,v 1.8 2007/05/19 14:58:35 ddimon Exp $ History of changes for the JPF (Java Plug-in Framework) project. Changes are chronologically ordered from top (most recent) to bottom (least recent). For more information about the JPF project, see the project web site at http://jpf.sourceforge.net Legend: + New Feature - Bug fixed * General comment ---------------------------------------------------------------------------- 2007-05-19 : JPF 1.5.1 + Maven POM files are now part of the JPF distribution package. Thanks to Jens Köcke for contribution. + Changed plug-in DTD to allow arrange of and tags in mixed order. + Added jpf-sort Ant task to JPF-Tools. It helps to sort plug-ins in correct order to automate build process using tasks like . + Added German translation of resources. Thanks to Stefan Rado for contribution. + Significant improvements in classloader performance. See new configuration options in org.java.plugin.standard.StandardPluginLifecycleHandler class. New performance optimizations are ON by default. + JPF version number is now available as system property. See org.java.plugin.PluginManager for details. 2007-03-04 : JPF 1.5.0 * Initial public release. * Porting of JPF 1.0.1 to Java 5. * Thanks to Jolkdarr for great help and initial port of JPF to Java 5.libjpf-java-1.5.1+dfsg.orig/README.txt0000644000175000017500000000071010536106574016556 0ustar gregoagregoa---------------------------- JPF - Java Plug-in Framework ---------------------------- Welcome to JPF! JPF is a general-purpose plug-in framework intended to help building scalable, extendable Java applications with low cost of maintenance. The framework is specially designed to be easily included into Java project of any kind. For more information see project documentation in docs folder or visit JPF website at http://jpf.sourceforge.netlibjpf-java-1.5.1+dfsg.orig/jpf-pom.xml0000644000175000017500000000401710605753416017156 0ustar gregoagregoa 4.0.0 net.sf.jpf jpf jar jpf 1.5 Java Plugin Framework GNU Lesser General Public License, Version 2.1, February 1999 http://jpf.sourceforge.net/license.txt source jpf-target/classes jpf-target source/ **/*.java **/*.jpage org.apache.maven.plugins maven-compiler-plugin 5 5 org.apache.maven.plugins maven-jar-plugin true Java Plug-in Framework (JPF) - core library ${project.version} http://jpf.sourceforge.net org.java.plugin ${project.version} http://jpf.sourceforge.net commons-logging commons-logging 1.0.4 libjpf-java-1.5.1+dfsg.orig/MAVEN.txt0000644000175000017500000000103510606647612016471 0ustar gregoagregoa---------------------------- Building JPF using maven ---------------------------- The command 'mvn -F jpf-pom.xml install' will build and install the new artifact net.sf.jpf:jpf:1.5, which can now be used as dependecy in other projects. ---------------------------------------- Building JPF Boot library using maven ---------------------------------------- The command 'mvn -F jpf-boot-pom.xml install' will build and install the new artifact net.sf.jpf:jpf-boot:1.5, which can now be used as dependecy in other projects.libjpf-java-1.5.1+dfsg.orig/jdocs/0000755000175000017500000000000010541226066016157 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/jdocs/ide-eclipse.jxp0000644000175000017500000001225110536106574021073 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("Java IDE Configuration - Eclipse IDE"); printMenu("ide"); %>

JPF-Demo as Project in Eclipse IDE

Note: for simplicity and concreteness, instructions prepared for JPF-Demo project but applicable to any JPF based application.

Preface

Download ZIP archive with JPF-Demo source code and unpack it into some location. This location will be the project "root" folder. Following instructions are created for Eclipse IDE version 3.1 but similar steps applicable to earlier versions also (tested with 3.0).

Note: JPF-Demo source distribution package already contains project files for Eclipse IDE - .project and .classpath files. You have to remove these files if you whant to go through steps in this tutorial. But for quick start with JPF-Demo source code simply import provided project into Eclipse IDE workplace.

Creating Project

Open Eclipse New Project dialogue and select Java Project wizard. In the Contents section enter location of the unzipped JPF-Demo source folder.

Eclipse IDE

On the next step wizard scans all project folders to detect Java source files and libraries there. The result is shown on the screen. What you have to do here is to tell Eclipse to put compiled classes for each plug-in into separate folders named classes and located in corresponding plug-in folders. You have to create folder with such name in every plug-in directory that contains source code and point Eclipse to put output to those folders.

Eclipse IDE

Eclipse IDE

When all source/output folders configured, press Finish button. Now you should get configured JPF-Demo project. In the Package Explorer it looks like this.

Eclipse IDE

Run/Debug Configuration

Open Run... dialogue and select Java Application on the left pane. Press New button to create new Run/Debug configuration. On the Main tab enter configuration name and Main class, for JPF-Demo project this should be org.java.plugin.boot.Boot because JPF-Demo uses JPF Boot Library for application starting.

Eclipse IDE

Now switch to Classpath tab. Here Eclipse by default included all classes and libraries from the project that is good for usual "monolithic" applications but is wrong for JPF based application. In JPF application only "boot" level libraries and classes are required for application startup, all classes that come from plug-ins shouldn't be included into application classpath because JPF itself manages lookups and loading such libraries and resources. Thus you have to Remove the whole default classpath section from the configuration classpath...

Eclipse IDE

... and include only jpf-boot.jar library.

Eclipse IDE

Here the result.

Eclipse IDE

The last thing that remains to do is to configure sources for plug-in classes for comfortable debugging. Switch to Source tab and press Add... button.

Eclipse IDE

In the opened window select Java Project source type...

Eclipse IDE

... and mark checkbox near the JPF-Demo project. Press OK button.

Eclipse IDE

Now source configuration should look like on this screen shot.

Eclipse IDE

Finally you may run JPF-Demo application and debug it.

Eclipse IDE

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/tutorial.jxp0000644000175000017500000004106310536106574020556 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("Tutorial"); printMenu("tutorial"); %>

JPF Usage Tutorial (Demo application explained)

Introduction

This tutorial is a detailed description of JPF Demo Application (JPF-Demo, available for download). It is aimed for developers to get them quick start with JPF. Please note: this is not a Java Swing application developers tutorial; this tutorial also demonstrates the only one approach in JPF usage and not cover all possible usage scenarios.

It is recommended to download JPF-Demo source code also and install it as project into your favorite Java IDE. Look at detailed instructions on how to configure JPF based project in various Java IDE.

JPF-Demo is a GUI application that is designed with "Toolbox" metaphor in mind. The main application window is kind of container for "tools" - a small (ore huge :) utility applications of any kind that are developed as JPF plug-ins (or set of plug-ins).

JPF-Demo - Code Colorer Tool

On the screen shot you can see a "Code Colorer Tool" - an utility which gets java source text on it's input and transforms it to HTML text with syntax highlighting. This particular function is implemented using open-source Java2Html library (GPL, Java2Html Homepage).

Application structure

File system structure of the application looks like this:

[APPLICATION_HOME_FOLDER]/
 +- data/
 +- lib/
 |   +- commons-logging.jar
 |   +- jpf.jar
 |   +- jpf-boot.jar
 |   +- jpf-tools.jar
 |   +- jxp.jar
 |   +- log4j.jar
 +- logs/
 +- plugins/
 +- boot.properties
 +- log4j.properties
 +- run.bat
 +- run.sh

Here are the explanation:

data
Folder, where plug-ins can store their configurations and other data files.
lib
Libraries that are required for application start, here are JPF libraries and libraries for logging support (they are used also by JPF itself).
logs
Log files come here
plugins
This is repository folder for JPF plug-ins.
boot.properties
Application start up configuration file.
run.*
Application start up scripts.

Component structure of the application can be represented by the following diagram.

JPF-Demo Application Diagram

Application boot

To perfrm application start, the run script makes call of entry point of JPF Boot library - org.java.plugin.boot.Boot.main(String[]) method. This method reads configuration from boot.properties file, initializes JPF runtime and loads all our plug-ins from plugins folder. Finally it calls our org.jpf.demo.toolbox.core plug-in because we specify that in configuration.

From this point the application control logic moves entirely into plug-in org.jpf.demo.toolbox.core, which we can name as, like in Eclipse, "application plug-in". The plug-in class for plug-in org.jpf.demo.toolbox.core extends special abstract class org.java.plugin.boot.ApplicationPlugin from the JPF Boot library. Thus we allow JPF boot code to call our specific boot logic.

Core plug-in

As almost any JPF plug-in, org.jpf.demo.toolbox.core consists of two parts: the manifest file and the plug-in specific Java code. We'll look through them separately.

Plug-in manifest

Plug-in manifest is an XML syntax file created according to plug-in DTD. The root tag of XML is:

<plugin id="org.jpf.demo.toolbox.core" version="0.0.4"
	class="org.jpf.demo.toolbox.core.CorePlugin">

Here we state that the plug-in ID is "org.jpf.demo.toolbox.core" and the version identifier is "0.0.2". We also declare that our plug-in have a "plug-in class" org.jpf.demo.toolbox.core.CorePlugin so that JPF runtime can initialize our plug-in properly. The "plug-in class" is an optional element of plug-in declaration and can be omitted if your plug-in doesn't need any code to be executed during plug-in activation. But this is not our case because this particular plug-in is an application entry point and have to show application GUI when it is activated.

The next manifest element is libraries declaration:

<runtime>
	<library id="core" path="classes/" type="code">
		<export prefix="*"/>
	</library>
	<library type="resources" path="icons/" id="icons">
		<export prefix="*"/>
	</library>
</runtime>

Here we define that all Java code from this plug-in is placed into "classes/" folder within plug-in context (home) folder. We also declare that all classes and packages (*) from this plug-in are visible to other plug-ins so that they can use our code freely. We also declare a resources folder "icons/" and also made it visible to other plug-ins.

The last part of manifest is most interesting and this is most powerful feature of JPF (as for Eclipse) that makes our application extremely extendible. This is extension point declaration:

<extension-point id="Tool">
	<parameter-def id="class"/>
	<parameter-def id="name"/>
	<parameter-def id="description" multiplicity="none-or-one"/>
	<parameter-def id="icon" multiplicity="none-or-one"/>
</extension-point>

With this we declare that our plug-in expose a point where it can be extended by any other plug-in. We call this point as "Tool" and explain that extension to this point will be represented as a "tab" in application GUI. Any plug-in that contribute to this extension point should provide several parameters that will be used to present plug-in in application and communicate with it. We define four parameters for this extension point:

class
This is required parameter of type String that should contain full Java class name. The contract for that class will be described bellow.
name
The name of tool to be shown as "tab name" on GUI.
description
The tool description to be shown as "tab hint" on GUI. This is optional parameter.
icon
Path to resource with tool icon. This is optional parameter.

Now we are ready to implement logic for our core plug-in.

Plug-in code

As you remember, we've declared in plug-in manifest, that we'll provide plug-in class org.jpf.demo.toolbox.core.CorePlugin. So we did. Usually, we have to extend JPF's abstract class org.java.plugin.Plugin and implement two methods, the framework runtime will call during plug-in life cycle: protected void doStart() throws Exception; and protected void doStop() throws Exception;. But in our case, we have to extend org.java.plugin.boot.ApplicationPlugin class, because we are developing "application plug-in". Our implementation of those two methods from org.java.plugin.Plugin will be empty. The real purpose of this plug-in class is to provide "entry point" method from org.java.plugin.boot.ApplicationPlugin that is called from JPF Boot library and do all the magic.

The main duty of our plug-in class is to create and show application GUI. We also want to implement support logic for extension point, defined in manifest. The main trick here is to organize GUI logic efficiently. The main principle is to activate other plug-ins as late as possible and take maximal information from extension declarations. That's why we define so many parameters in extension point declaration. We are building GUI as "set of tabs with lazy initialization of components". Look at JPF-Demo source code for details. The most interesting place is communication with plug-in framework to get all extensions that are "connected" to our extension point:

ExtensionPoint toolExtPoint =
	getManager().getRegistry().getExtensionPoint(
		getDescriptor().getId(), "Tool");
for (Iterator it = toolExtPoint.getConnectedExtensions()
		.iterator(); it.hasNext();) {
	Extension ext = (Extension) it.next();
	JPanel panel = new JPanel();
	panel.putClientProperty("extension", ext);
	Parameter descrParam = ext.getParameter("description");
	Parameter iconParam = ext.getParameter("icon");
	URL iconUrl = null;
	if (iconParam != null) {
		iconUrl = getManager().getPluginClassLoader(
			ext.getDeclaringPluginDescriptor())
				.getResource(iconParam.valueAsString());
	}
	tabbedPane.addTab(
		ext.getParameter("name").valueAsString(),
		(iconUrl != null) ? new ImageIcon(iconUrl) : null,
		panel, (descrParam != null) ?
			descrParam.valueAsString() : "");
}

The next interesting place here is the contract that we are defining for extension class. Here we state that "class" parameter, specified in extension declaration should refer to a Java class that implements interface org.jpf.demo.toolbox.core.Tool, defined in our plug-in. We also explain that objects of this class will be instantiated using default empty constructor. We also promise that method init will be called once during extension life cycle. Here the code that implements described concept:

// Activate plug-in that declares extension.
getManager().activatePlugin(
		ext.getDeclaringPluginDescriptor().getId());
// Get plug-in class loader.
ClassLoader classLoader = getManager().getPluginClassLoader(
		ext.getDeclaringPluginDescriptor());
// Load Tool class.
Class toolCls = classLoader.loadClass(
		ext.getParameter("class").valueAsString());
// Create Tool instance.
tool = (Tool) toolCls.newInstance();
// Initialize class instance according to interface contract.
tool.init(toolComponent);

From this point we can distribute our application and wait when someone write plug-ins for it :) But we don't have time, let's do this job by ourselves and create several plug-ins that add tools to our box.

Code colorer plug-in

In this section I'll explain in details how to create a plug-in that add a tool to our box. As you already know, to achieve this, we have to implement an extension to extension point "Tool", defined in plug-in "org.jpf.demo.toolbox.core". As before we split explanation into two parts: plug-in manifest description and plug-in code comments.

Plug-in manifest

The root tag of manifest XML file should already be familiar to you:

<plugin id="org.jpf.demo.toolbox.codecolorer" version="0.0.5">

You see that plug-in ID is "org.jpf.demo.toolbox.codecolorer" and plug-in class is absent because we don't need any code to be executed during plug-in start/stop.

The next section of manifest is new for us:

<requires>
	<import plugin-id="org.jpf.demo.toolbox.core"/>
</requires>

Here we define that our plug-in depends on plug-in "org.jpf.demo.toolbox.core" and may use it's exported code and resources and may also contribute to extension points defined there.

The libraries declarations are more expensive here as we are planning to use third party library among our own code.

<runtime>
	<library id="codecolorer" path="classes/" type="code"/>
	<library id="java2html" path="lib/java2html.jar"
		type="code">
		<doc caption="Java2html Library by Markus Gebhard">
			<doc-ref path="docs/java2html"
				caption="java2html library"/>
		</doc>
	</library>
	<library type="resources" path="icons/" id="icons"/>
</runtime>
	

You see that we defined code library "java2html" that points to a JAR file "lib/java2html.jar" and also provide reference to documentation for this library (this is just for example, but would be good rule to provide documentation for every plug-in manifest element). Note also that we are not exported any code or resources as we suppose to use them within this plug-in only.

The last manifest element defines an extension. This is the main purpose of this plug-in.

<extension plugin-id="org.jpf.demo.toolbox.core"
	point-id="Tool" id="codeColorerTool">
	<parameter id="class"
		value="org.jpf.demo.toolbox.codecolorer.CCTool"/>
	<parameter id="name" value="Code Colorer Tool"/>
	<parameter id="description"
		value="Tool to colorize source code text"/>
	<parameter id="icon" value="codecolorer.png"/>
</extension>

As you can see, we give the ID to our extension as "codeColorerTool" and specified extension class as "org.jpf.demo.toolbox.codecolorer.CCTool". Bellow you'll see that this class fully conforms to contract, defined for "Tool" extension point. Now the JPF can automatically perform integrity check for our two plug-ins and warn if we miss something in declarations.

Plug-in code

Code part of "org.jpf.demo.toolbox.codecolorer" plug-in consists of two classes. The class org.jpf.demo.toolbox.codecolorer.CCTool implements interface org.jpf.demo.toolbox.core.Tool and thus conforms to a contract for "Tool" extension point. The method init from this interface in our case simply creates tool GUI and adds it to given Swing container as it's child. Class org.jpf.demo.toolbox.codecolorer.CodeColorer is the internal plug-in class that do all the job. The code for that class is taken from Java2Html's class de.java2html.Java2HtmlApplication with small non-significant modifications. I'll not comment this code here. Refer to JPF-Demo source code and Java2Html Homepage for details.

Notice as easy it was to add a tool as plug-in to our Toolbox! The most part of plug-in is a tool logic itself and not "plug-in support" logic. The JPF and core plug-in do the job for us!

Other plug-ins

There are two other plug-ins bundled with JPF-Demo application. First is Plug-in Browser Tool.

JPF-Demo - Plug-in Browser Tool

This plug-in allows you to load any number of plug-ins and investigate their structure and dependencies. Note that plug-ins are loaded with separate instance of plug-in registry and not activated by demo application, they are even not visible for it. The main purpose of this plug-in is to demonstrate how to "instrument plug-ins with JPF" and provide rudimentary tool to look at plug-ins structure.

Another plug-in is Database Browser Tool.

JPF-Demo - Database Browser Tool

The purpose of this plug-in is not to demonstrate how to work with JDBC in Java but how it is possible to provide more extensibility to you Java application. Actually "DB Browser" is not just a plug-in but a set of plug-ins. First, "org.jpf.demo.toolbox.dbbrowser", implements "Tool" providing extension for "Tool" extension point and maintains DB browser GUI. Next, this plug-in defines it's own extension point "Database" giving possibility for other plug-ins to plug into this "DB Browser". Actually, the "org.jpf.demo.toolbox.dbbrowser" plug-in don't know anything about any particular database. All DB specifics are abstracted as extension point (and several interfaces) and actually implemented in other plug-ins. Look at plug-in source code for details.

What's next?

Hope this article gives you a basic understanding of main principles that forms JPF and applications using it. Now you can try to apply those to your tasks or form your own approach in development with JPF.

Feel free to ask your questions in public JPF forum. You are also welcome to share your ideas and use cases with others. This will definitely help to improve JPF and make it popular framework for building extremely flexible applications.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/todo.jxp0000644000175000017500000000245710572565606017671 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id: todo.jxp,v 1.3 2007/03/04 13:53:41 ddimon Exp $ // Updated by Michael Dawson 26/01/2006 %> <% include("/functions.ijxp"); printHeader("TODO"); printMenu("todo"); %>

JPF Project TODO List

Although the current version of JPF is of production quality, fully functional and very stable there is always what to do. The follows is a list of ongoing or planned tasks:

Task Priority
JPF-Tools library improvements MEDIUM
Documentation improvements (native English speakers needed) MEDIUM







































<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/license.jxp0000644000175000017500000000065710536106574020341 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("JPF License"); printMenu("license"); %>

JPF License

Text version is here: license.txt

<% includeHtml(System.getProperty("jdocs.outputFolder") + "/license.txt"); %>
<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/about.jxp0000644000175000017500000002051410536106574020023 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ // Updated by Michael Dawson 11/01/2006 %> <% include("/functions.ijxp"); printHeader("Home"); printMenu("about"); %>

JPF System Overview

Introduction

The JPF framework is based around the concept of "plug-ins". A plug-in is a structured component that contributes code and resources to the system and describes them in a structured way. These plug-ins can further define extension points, well-defined method hooks that can be extended by other plug-ins. When one plug-in provides an implementation of an extension point defined by another plug-in, we say that it adds an extension to the system. This approach allows developers using JPF to build highly modular and easily extendible applications.

Framework Structure

All required information about a plug-in is defined in the plug-in manifest. Depending on the PluginRegistry, this may be any structured data that exists at some URL. JPF provides a default XML-based manifest implementation. The format of this XML document is defined by the JPF plug-in DTD. It is very important to include as much information about a plug-in in its manifest as possible. This is because the JPF framework uses this information to check plug-in consistency, whether plug-in dependencies (relationships between plug-ins) are satisfied (including version compatibility check) and that all declared resources are available. JPF also checks that all provided extensions have been declared with the required parameters.

The high-level structure of framework can be represented by this diagram:

JPF High-level Structure Diagram

The diagram shows the three major parts of JPF:

  • PluginRegistry - the storage repository for meta-information about all discovered plug-ins
  • PathResolver - the component responsible for finding the physical lcation of all discovered resources
  • PluginManager - the framework runtime that loads and activates the plug-ins

PluginRegistry is a set of interfaces that abstract meta-information about plug-ins and plug-in fragments. The framework provides default implementations of these interfaces based on XML plug-in manifests mentioned earlier (plug-in DTD). The general rule here is that a manifest should be registered with the PluginRegistry for every plug-in and plug-in fragment.

The framework also provides a default implementation of PathResolver, which simply maps manifest locations to the context ("home") folder of their corresponding plug-ins. A special implementation of PathResolver is also available that makes "shadow copies" of plug-in resources before resolving paths to them. This helps avoid locking of local resources and running native code from remote locations.

Bringing these interfaces together is PluginManager. You can access an instance of the "standard", or default, PluginManager by just one method call. This makes using JPF very simple in most situations.

Plug-in manifest

If you are using the default XML based implementation of PluginRegistry provided by JPF, you'll need to learn the plug-in manifest syntax. It is simple and shouldn't be too difficult for any familiar with HTML or XML.

The plug-in manifest is an XML file which contains all the information needed by the JPF framework about each plug-in. The XML syntax should conform to the plug-in manifest DTD. Look at this file carefully, all elements are documented.

PluginRegistry

PluginRegistry manages all meta-information about discovered plug-ins. In general, you may provide your own registry implementation, but the standard one should be enough in most cases.

To make plug-in meta-data available for the application, you (as the application developer, but not plug-in developer) should register their manifests with PluginRegistry. The counterpart method - unregister() is used to "remove" plug-in meta-data from the registry. To make plug-ins available for activation, use publishPlugins() method (about PluginManager class see bellow). Note that all mentioned methods may be called not only during the application start up phase but in also at runtime. This allows application developers to implement "hot" plug-in deployment functionality.

PluginManager

PluginManager is the runtime system of the Framework. The main responsibility of the manager is to activate (load plug-in code and call the plug-in initializer class) plug-ins upon client code requests and manage inter plug-in dependencies. Usually, programmers shouldn't care about plug-in activation, this is done automatically when the plug-in code is first called. It is also possible to "deactivate" plug-ins during the life of the application. This feature may help to reduce application resources requirements. For complex usage scenarios it is possible to disable/enable plug-ins. A plug-in that is marked as disabled can't be activated with PluginManager (but it's meta-data remains available from the PluginRegistry).

Object factory

The ObjectFactory class allows application developers to easily create base JPF objects: PluginRegistry, PluginManager and PathResolver. It uses a simple and efficient discovery algorithm to find the available implementations of the main framework classes. It is possible to provide your own "vision" of all aspects of the Framework: you may write your own registry and manager and that will be used by JPF.

Usage scenario

A typical JPF-based application may consist of a small boot launcher, which initializes the registry, instanciates PluginManager and activates the main plug-in by calling some of it's methods (Or you can use the JPF Boot Library provided by JPF to greatly simplify this task). From this point on the flow of control remains within the registered plug-in code. This allows the development of applications of any kind, not only GUI applications, but also J2EE applications, command line utilities and more.

See the demo application source code for an example on how to build an application with JPF. You can also go through the tutorial, that explains the internals of JPF-Demo application.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/ide.jxp0000644000175000017500000000442210536106574017452 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("Java IDE Configuration"); printMenu("ide"); %>

Java IDE configuration for JPF Based Project

General Notes

There are several common principles may be formulated to describe differences of JPF based application from usual "monolithic" one. These differences affect on how JPF based java project should be configured in a Java IDE.

Plug-in classes
JPF based application consists of some "host" part (that runs first when application starts up) and plug-ins (that activated "on demand"). From the developer point of view, plug-ins may contain source code that should be compiled to the very specific place, each unique for the every plug-in. This place is described in plug-in manifest file and usually plug-in classes are compiled into "classes" folder within plug-in folder. So, the Java project in IDE should be configured so that it puts plug-in classes into the right places during compilation phase.
Application classpath
To run JPF based application correctly, only "host" part related libraries should be available in the classpath. All other libraries and resources that belong to different plug-ins are managed by JPF itself and shouldn't be included into startup classpath. This runtime behavior of JPF based application should be taken into account when configuring "run/debug" settings in a Java IDE.

Described principles are quite general and based on the JPF nature - manage plug-ins in runtime. Understanding of the JPF runtime behavior allow you to use your favorite Java IDE building JPF based project without any problem.

Concrete Instructions

Currently detailed instructions available for the following Java IDE:

Contributions with instructions for other Java IDE are greatly appreciated.



<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/roadmap.jxp0000644000175000017500000005106010623626272020333 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id: roadmap.jxp,v 1.4 2007/05/19 14:58:34 ddimon Exp $ // Updated by Michael Dawson 19/01/2006 %> <% include("/functions.ijxp"); printHeader("Roadmap"); printMenu("roadmap"); %>

JPF Roadmap

Here are some details about our projects progress towards the final 1.0 and 1.5 releases.

Version 0.1

Status: done
Release date: 2004-05-28

Initial public release.

Version 0.2

Status: done
Release date: 2004-09-01

Change log:

  • Implemented extension and extension point validation.
  • Documentation improvements (JavaDoc, DTD elements comments).
  • Introduced public ID for the JPF DTD.
  • Multiple changes to the API aimed at providing support for tools to instrument JPF.
  • Multiple changes to the API aimed at separating the PluginRegistry and PluginManager roles.
  • Introduced the PathResolver interface which "connects" the PluginRegistry and PluginManager. Now all resource locations are handled via URLs only.

Version 0.3

Status: done
Release date: 2004-11-05

Change log:

  • Now JPF can use any JAXP compatible XML parser implementation.
  • Initial implementation of JPF Tools ("Integrity Check", "Documentation Generator", "Plug-in archiver") with supporting Ant tasks.
  • Non-significant API changes.
  • Internal code improvements.

Version 0.4

Status: done
Release date: 2005-02-08

Change log:

  • Added support for extension point "inheritance".
  • Added a new type - "fixed" - to the extension point parameter definition declaration.
  • Added new attribute - "custom-data" - to the extension point parameter definition declaration. It allows additionally customized behavior of some value types.
  • Added static method "lookup" to PluginManager that allows an application to find instances of PluginManager that have already been created.
  • Added possibility to disable/enable plug-ins during runtime.
  • Added possibility to deactivate plug-ins during runtime.
  • Added notification system to PluginManager.
  • Removed internal code dependency on java.net.URI class. Now JPF should be able to run on JRE 1.3
  • Added notification system to PluginRegistry that now allows all interested classes to be notified when registry changes are made.
  • Added the ability to register/unregister plug-ins during runtime.

Version 0.5

Status: done
Release date: 2005-04-03

Change log:

  • Added methods to PluginRegistry to retrieve a plug-in registration report separately from the integrity check report.
  • "Documentation generator" tool is now based on JXP (Java scripted page) templates.
  • Added methods to RegistryChangeData interface to help filter extensions by corresponding extension points.
  • Implemented possibility to discover Framework configuration.
  • PluginRegistry implementation has been reworked so that it is now uses SAX XML parser to process plug-in manifests. Implementation is compatible with JAXP 1.1 specification and based on the SAX 2 API.
  • Greatly improved "hot deploy" function implementation.
  • Deprecated and removed some unnecessary functions. The deprecated methods will be removed with at the time of the final 1.0 release. This was to greatly simplify some implementation aspects of PluginRegistry.
  • Greatly improved the JPF demo application.
  • Many non-significant internal code improvements.

Version 0.6

Status: done
Release date: 2005-06-24

Change log:

  • Added utility methods to PluginRegistry and PluginDescriptor interfaces that simplify the checking of availability of various plug-in elements. Thanks to Lukasz Grabski.
  • Implemented basic Framework localization. All locale sensitive strings are now externalized.
  • Revised API exceptions policy and introduced a number of JPF specific exceptions.
  • Added new type - "resource" - to extension point parameter definition.
  • Added optional "version" attribute into "library" manifest tag and implemented corresponding method in the API.
  • Significantly reworked and improved the plug-ins archive Tool.
  • Now PluginManager uses the default (or no-arguments) constructor to instantiate the Plugin class. The old two-argument constructor is deprecated and will be removed before the 1.0 release. Thanks to Lukasz Grabski for an idea.

Version 0.7

Status: done
Release date: 2005-09-24

Change log:

  • Introduced the PluginLocation interface that encapsulates info about plug-in manifests and plug-in data locations.
  • Introduced the ObjectFactory class that is used to get instances of main Framework objects like PluginManager, PluginRegistry and PathResolver.
  • The Framework API has been significantly restructured to make it much more flexible, consistent and extendible. To start using version 0.7 existing application should be modified. Most changes are related to moving classes between packages.
  • Improved documentation tool - added printing of documentation notes for extension point parameter definitions. Thanks to Jeff Brown.

Version 0.8

Status: done
Release date: 2005-12-10

Change log:

  • Introduced the UniqueIdentity interface into the registry API to mark all plug-in elements that may have a unique identifier (PluginDescriptor, PluginFragment, PluginPrerequisite, Library, ExtensionPoint and Extension).
  • Introduced a special implementation of PathResolver that transparently makes shadow copies of plug-ins before resolving them to the application. Among other things this helps to avoid locking of JAR files by the application since this prevents "hot updating" of plug-ins. For implementation details and configuration options see the javadoc for the org.java.plugin.standard.ShadingPathResolver class.
  • Introduced the "Single File Plug-in" Ant task to package plug-ins as ZIP files that may be run directly without further modification (part of JPF Tools).
  • Introduced the "Plug-in Info" Ant task to read the plug-in ID and version from the manifest file into project properties (part of JPF Tools).
  • Introduced the "JPF Boot" library to simplify running JPF based applications.
  • Added Path and version info elements to jpf*.jar manifests. Version numbers are no longer included in JAR file names.
  • Introduced utility class org.java.plugin.util.IoUtil to handle I/O, File and URL manipulations.

Version 0.9

Status: done
Release date: 2006-02-23

Change log:

  • Added getMatch() method to PluginRegistry interface to get complete access to full information in manifest. Thanks to Sebastian Kopsan for the idea.
  • Introduced utility method readManifestInfo() to PluginRegistry interface to read basic manifest info (plug-in ID, version and such).
  • ShadingPathResolver now uses relative paths whenever that possible. This allows, for example, run JPF based application from different network locations without disturbing shadowed plug-ins.
  • Minor internal improvements in JPF-Boot library.
  • Now JPF-Boot library passes given command-line arguments to the application. To support this function, ApplicationPlugin API and JPF-Boot starting up arguments have been changed.
  • JPF documentation was reviewed and updated by Michael Dawson (this work is in progress now).
  • Added support for splash window in JPF Boot library. See additional configuration parameter in Boot class.
  • Fixed bug in StandardPathResolver.resolvePath() method. Thanks to Sebastian Kopsan.
  • Fixed bug in ExtensionPointImpl.updateConnectedExtensionsList() method. Thanks to Sebastian Kopsan.

Version 0.10

Status: done
Release date: 2006-05-03

Change log:

  • Fixed error in StandardPluginClassLoader incorrectly handled optional prerequisites. Thanks to Peter van der Winkel.
  • Added German translation of some documentation. Thanks to Frank Gernart.
  • Introduced StandardPluginLocation class that implements PluginManager.PluginLocation interface and helps handling of plug-in files and folders. Thanks to Per Cederberg for an idea.
  • Added probeParentLoaderLast configuration parameter to StandardPluginLifecycleHandler. This allows regulating of plug-in classloader delegation behavior. Thanks to Richard Bjarne (rjvduijn) for an idea.
  • Improved logging support in plug-in classloader. Debug log statements are now more informative and allow easy find problems with classes and resources loading.
  • Improved extension point / extension API and validating algorithms.
  • Improved handling of plug-ins dependencies loop. This situation now should not raise an exception but simply put warning in log file.
  • Refactored PathResolver to be interface instead of abstract class. Thanks to Per Cederberg.
  • Fixed typo in PathResolver.getRegisteredConext() method name. Thanks to Per Cederberg.
  • Improved handling of "resource" type extension parameters.
  • Improved handling boot errors in JPF-Boot library.
  • Improved handling of ZIP and JAR files to prevent their locking.
  • Improved "Plug-in Info" Ant task to make it consistent with PluginRegistry.ManifestInfo interface. This change may break existing Ant scripts that uses jpf-info Ant task.

Version 0.11

Status: done
Release date: 2006-06-29

Change log:

  • To the DefaultApplicationInitializer class from JPF-Boot library added possibility to provide lists of plug-ins to be included/excluded from application (white and black lists). Thanks to Jonathan Giles for an idea.
  • All Ant tasks improved to be able to work with single file plug-ins (JAR'ed or ZIP'ed). Thanks to Prashant M. R.
  • Added possibility of advanced control of application splash screen in JPF-Boot library. See additional configuration parameters and new org.java.plugin.boot.SplashHandler interface.
  • main() method in JPF-Boot library is now refactored into several separate methods to allow more accurate controlling of application bootstrap procedure. Among other benefits, this allows to write unit tests for plug-ins and JPF based applications.
  • Improved JPF-Boot library. Implemented more flexible boot configuration lookup procedure. Thanks to Chris Ward.
  • Added "reverse-lookup" attribute to the "import" tag. Setting this attribute to "true" allows imported plug-in to see classes in depending plug-in. This flag helps creating plug-ins that can see classes in other plug-ins not depending on them. This feature is very similar to Eclipse' "buddy class loading" behavior. To make this new function available in your plug-in manifests, refer to new version of DTD (0.6).
  • Improved error logging in StandardPluginManager and StandardPluginClassLoader. Thanks to Peter van der Winkel.
  • Fixed handling JAR file URL's in StandardPluginClassLoader and StandardPathResolver. Thanks to Prashant M. R.

Version 0.12

Status: done
Release date: 2006-09-16

Change log:

  • To JPF-Tools library added set of mock classes to simplify JPF usage in unit tests.
  • Nice looking 3D-style JPF logo contributed by Johnny Grattan.
  • Numerous minor improvements in JPF-Boot library.
  • Added version update Ant task to JPF-Tools. Thanks to Jonathan Giles for an idea and initial implementation.
  • Fixed error with caching of native libraries in StandardPluginClassLoader. Thanks to Sebastian Kopsan.
  • Improvements in StandardPluginClassLoader preventing several deadlock situations.
  • Added possibility to specify default value in extension point parameter definition.
  • Added build instructions to the source code distribution package.
  • Fixed bug #1538888.
  • Splash image related improvements in JPF-Boot library.

Version 1.0

Status: done
Release date: 2007-01-08

Change log:

  • Plug-in manifest DTD version number changed to 1.0 All references to previous versions are mapped to this one now.
  • Previously deprecated API has been removed from code.
  • Improved Splash Screen API in JPF-Boot library. It is now allows more flexible handling of splash screen behavior and configuration.
  • ShadingPathResolver may now filter files to be shadowed. This is regulated by includes/excludes configuration parameters.
  • Added black/white lists support to all batch plug-ins processing Ant tasks in JPF-Tools library.

Version 1.0.1

Status: done
Release date: 2007-03-04

Change log:

  • Directory based Ant tasks in JPF-Tools library are now support nested <fileset> tags like many other standard Ant tasks.
  • Fixed problems with file names and URL's that contain non-ASCII characters.
  • Improved handling of "reverse lookup" plug-in dependencies.
  • Improved interpreting of "jpf.boot.config" property in JPF-Boot library. This configuration parameter may now contain FQN of a configuration file. Thanks to Eduardo M. Costa for an idea suggestion.
  • Added jpf-path Ant task to JPF-Tools. It helps to automatically compose plug-in classpath for using in various tasks like java, javac...
  • Fixed potential deadlock situation in StandardPluginClassLoader. Thanks to Chris Ward for assistance.

Version 1.5.0

Status: done
Release date: 2007-03-04

This is port to Java 5 of JPF 1.0.1 Thanks to Jolkdarr for great help and initial port of JPF to Java 5.

Versions 1.0.2 and 1.5.1

Status: done
Release date: 2007-05-19

Change log:

  • Maven POM files are now part of the JPF 1.5 distribution package. Thanks to Jens Köcke for contribution.
  • Changed plug-in DTD to allow arrange of <extension> and <extension-point> tags in mixed order.
  • Added jpf-sort Ant task to JPF-Tools. It helps to sort plug-ins in correct order to automate build process using tasks like <subant>.
  • Added German translation of resources. Thanks to Stefan Rado for contribution.
  • Significant improvements in classloader performance. See new configuration options in StandardPluginLifecycleHandler class. New performance optimizations are enabled by default.
  • JPF version number is now available as system property. See PluginManager for details.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/tools.jxp0000644000175000017500000010320110615372136020041 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id: tools.jxp,v 1.5 2007/04/30 11:51:25 ddimon Exp $ %> <% include("/functions.ijxp"); printHeader("Tools"); printMenu("tools"); %>

JPF Tools Reference

Most JPF tools are implemented as special purpose Java classes and wrapped as Ant tasks for ease of use. To make JPF specific tasks available in your build file insert following declaration in the beginning of Ant build script:
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
Note that jpf-tool.jar library should be available in classpath (you may use nested <classpath> element in <typedef> tag).

Integrity Check Tool
Documentation Tool
Plug-in Archive Tool
Single File Plug-in Tool
Manifest Info Tool
Version Update Tool
Classpath Tool
Sorting Tool

Integrity Check Tool

The tool is implemented as Ant task (jpf-check) and allows to check integrity of plug-ins collection.

Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
usepathresolver If "true", JPF will try to resolve URL's specified in manifests to check existence of plug-in resources. Default is "false". No
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files for plug-ins to be checked.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-check" task to check plug-ins integrity -->
<jpf-check
	basedir="${basedir}/plugins"
	includes="*/plugin.xml,*/plugin-fragment.xml"
	verbose="true"
	usepathresolver="true"/>

Documentation Tool

The javadoc-like tool to generate documentation for plug-ins. The tool implemented as special utility class and wrapped with Ant task (jpf-doc) for ease of use.

Note: documentation design looks not very good now, but this is just design problem, not the documentation engine! Good HTML design contributions are welcome!

Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
destdir Base directory for generated documentation files. Yes
overview Documentation overview HTML file. No
encoding Source files encoding name (templates, overview etc.) Default is system encoding. No
docencoding Output files encoding name. Default is UTF-8. No
stylesheetfile CSS style sheet to use. Predefined style will be used if no file specified. No
templates path to template files (should be available in classpath). Predefined templates set will be used if not specified. No
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files, documentation should be generated for.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-doc" task to generate plug-ins documentation -->
<jpf-doc
	basedir="${basedir}/plugins"
	includes="*/plugin.xml,*/plugin-fragment.xml"
	destdir="${build.home}/docs"/>

Plug-in Archive Tool

Tool implemented as special utility class and wrapped with Ant tasks (jpf-pack and jpf-unpack) for ease of use. Plug-in archive is specially prepared ZIP format file that holds all packed plug-ins and special descriptor for quick extracting plug-ins meta-data without need of unpacking the whole archive file.

Plug-ins archiving task (jpf-pack).
Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
destfile Target archive file. Yes
Plug-ins un-archiving task (jpf-unpack).
Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
srcfile Archive file to be unpacked. Yes
destdir Folder where to extract archived plug-ins. Yes
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files, documentation should be generated for.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-pack" task to pack plug-ins into archive -->
<jpf-pack
	basedir="${basedir}/plugins"
	includes="*/plugin.xml,*/plugin-fragment.xml"
	destfile="${build.home}/all-plugins.zip"/>
<!-- Call "jpf-unpack" task to extract plug-ins from archive -->
<jpf-unpack
	srcfile="${build.home}/all-plugins.zip"
	destdir="${build.home}/all-plugins-extracted"/>

Single File Plug-in Tool

The tool is implemented as Ant task (jpf-zip) and allows to process plug-ins collection packaging every plug-in and plug-in fragment into single ZIP file. ZIP file names compozed according to the following scheme: <plugin-ID>-<plugin-version>.zip

Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
destdir Directory to store generated ZIP files. Yes
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
usepathresolver If "true", JPF will try to resolve URL's specified in manifests to check existence of plug-in resources. Default is "false". No
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files for plug-ins to be processed.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-zip" task to process plug-ins packaging every plug-in as
  single ZIP file -->
<jpf-zip
	basedir="${build.home}/plugins"
	includes="*/*.xml"
	destdir="${build.home}/plugins"/>

Manifest Info Tool

Simple (but quite useful :) task (jpf-info) to read some data from plug-in manifest into project properties. This task is modeled after similar purpose method in plug-in resgistry and covers the same properties as corresponding manifest info interface

Attribute Description Required
manifest Plug-in or plug-in fragment file to read data from. Yes
propertyid Name of the property where to put plug-in or plug-in fragment ID. No
propertyversion Name of the property where to put plug-in or plug-in fragment version. If no version specified in manifest, the empty string will be used. No
propertyvendor Name of the property where to put plug-in or plug-in fragment vendor. No
propertypluginid Name of the property where to put plug-in ID (applicable for plug-in fragment manifest only). No
propertypluginversion Name of the property where to put plug-in version (applicable for plug-in fragment manifest only). If no version specified in manifest, the empty string will be used. No
propertymatchingrule Name of the property where to put plug-in fragment matchin rule (applicable for plug-in fragment manifest only). No
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-info" task to read plug-in ID into "plugin.id" property
        and plug-in version into "plugin.version" property -->
<jpf-info
	manifest="${basedir}/plugin.xml"
	propertyid="plugin.id"
	propertyversion="plugin.version"/>

Version Update Tool

Task (jpf-version) to automatically updade plug-in versions and version references. This task upgrades vesions build number and optionally version name (see Version class documentation) if plug-in has modified since previous task run. Actual version numbers and timestamps are stored in simple text file in Java properties format.

Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. The folder should contain non-ziped plain folders with plug-ins and plug-in fragments. Note that this task will modify manifests in this folder (leaving manifest file timestamps unchanged). No
versionsfile File where to store versions related data. If not exist, will be created automatically. Yes
alterreferences If "true", version references should be upgraded also. Default is "false". No
timestampversion If "true", the plug-in timestamp will be included into version name field. Default is "false". No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files for plug-ins to be processed.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-version" task to update versions of modified plug-ins -->
<jpf-version
	basedir="${build.home}/plugins"
	includes="*/plugin.xml,*/plugin-fragment.xml"
	versionsfile="${basedir}/plugins/versions.properties"
	timestampversion="true"/>

Classpath Tool

Task (jpf-path) to compose plug-in(s) classpath according to manifest data (libraries and dependencies declarations).

Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
pathid Composed path-like structure ID. One of two attriutes should be set.
pathidref Path-like structure ID reference.
pluginid Plug-in ID to compose classpath for. At least one of two attriutes should be set.
pluginids Comma separated list of plug-in ID's to compose classpath for.
followexports If "true", libraries export rules will be taken into account. Default is "true". No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files for plug-ins to be processed.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-path" task to compose classpath for plug-in "my.plugin" and
  put result in path-like structure with ID "plugin.classpath". -->
<jpf-path
	basedir="${build.home}/plugins"
	includes="*/plugin.xml,*/plugin-fragment.xml"
	pathid="plugin.classpath"
	pluginid="my.plugin"/>

Sorting Tool

Task (jpf-sort) to sort plug-in(s) in correct build order. Places result into output path-like structure.

Attribute Description Required
basedir Directory to resolve relative links. By default is equal to project base directory ${basedir}. No
pathid Composed path-like structure ID. One of two attriutes should be set.
pathidref Path-like structure ID reference.
pathmode Regulates what to place into output path. Possible values are:
DIR
put plug-in directory into output path
BUILD
put plug-in's build.xml file into output path
MANIFEST
put original plug-in manifest file into output path
Default value is MANIFEST.
No
reverse If "true", result entries will be placed into output path in reversed order. Default is "false". No
verbose If "true", more detailed report will be generated. Default is "false". No
includes comma- or space-separated list of patterns of plug-in manifest files that must be included. All files are included when omitted. No
includesfile The name of a file. Each line of this file is taken to be an include pattern. No
excludes Comma- or space-separated list of patterns of plug-in manifest files that must be excluded. No files (except default excludes) are excluded when omitted. No
excludesfile The name of a file. Each line of this file is taken to be an exclude pattern. No
defaultexcludes Indicates whether default excludes should be used or not ("yes"/"no"). Default excludes are used when omitted. No
whitelist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be included in processing. All plug-ins are included when file omitted. No
blacklist The name of a file. Each line of this file is taken to be an ID or UID of plug-in to be excluded from processing. No plug-ins are excluded when file omitted. No
Parameters specified as nested elements
fileset
Ant's FileSets can be used to select plug-in manifest files for plug-ins to be processed.
Example
<!-- Define custom JPF specific Ant tasks -->
<typedef resource="org/java/plugin/tools/ant/jpf-tasks.properties" />
<!-- Call "jpf-sort" task to sort all plug-ins in correct build order and
  put their folders in path-like structure with ID "plugins". -->
<jpf-sort
	basedir="${build.home}/plugins"
	includes="*/plugin.xml,*/plugin-fragment.xml"
	pathid="plugins"
	pathmode="DIR"/>

Look at the source code of JPF-Demo application to get working example of tools usage.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/resources/0000755000175000017500000000000010541226066020171 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/jdocs/resources/css/0000755000175000017500000000000010541226066020761 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/jdocs/resources/css/base.css0000644000175000017500000000407410536106574022417 0ustar gregoagregoa/* Java Plug-in Framework (JPF) Copyright (C) 2004 - 2005 Dmitry Olshansky $Id$ */ BODY { margin : 0; background-color : White; color : Black; font-size : 100%; font-family : Arial, Helvetica, sans-serif; } H1 { border : 1px outset; background-color : #E0E0E0; width : 94%; margin: 0 0 .5em 0; padding: .3em 1em .3em 1em; font-size : 130%; font-weight: bold; } H2 { border : 1px outset; background-color : #E0E0E0; width : 95%; padding: .3em 1em .3em 1em; font-size : 120%; font-weight: bold; } H3 { border : 1px outset; background-color : #E0E0E0; width : 95%; padding: .2em 1em .2em 1em; font-size : 120%; font-weight: normal; } H4 { font-size : 110%; font-weight: bold; margin: .5em 1em .5em 1em; } H5 { font-size : 110%; font-weight: normal; margin: .5em 1em .5em 1em; } H6 { font-size : 100%; font-weight: bold; margin: .5em 1em .5em 1em; } TABLE { background-color : White; color : Black; font-size : 100%; font-family : Arial, Helvetica, sans-serif; } P { font-size : 100%; font-family : Arial, Helvetica, sans-serif; margin: 0 .7em .7em .7em; } A, A:ACTIVE, A:FOCUS, A:LINK, A:VISITED { color : #0000CC; text-decoration : none; } A:HOVER { color : #0066FF; text-decoration : none; } DIV.menu { position: absolute; top: 0; left: 0; width : 11em; margin: .5em .5em .5em .5em; line-height : 1.5em; } DIV.content { margin: .5em .5em .5em 12em; } DIV.footer { margin: 0; padding : 1em; border-top : 1px solid; font-size : 80%; } DIV.menu P { border : 1px outset; background-color : #E0E0E0; color : Black; padding : .5em; margin : 0 0 2em 0; } DIV.content HR { width : 100%; height : 1px; color : Black; margin: 1em 0 1em 0; } DIV.content PRE { border : 1px outset; background-color : #F5F5F5; color : Black; padding : .5em; margin : .5em; font-size : 90%; } DIV.content DL, UL, OL { font-size : 100%; } DIV.content DT { font-size : 100%; font-weight : bold; } libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/0000755000175000017500000000000010541226122021427 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/email.png0000644000175000017500000000335610536106572023245 0ustar gregoagregoa‰PNG  IHDR©ÓêBXµIDATx^ÕT{lS×>ç>l_Ûql‡¥Ië`¬›Ö©ëÊm4´MÓ^Ý4­ÛÐ?–-$­S7FQ’–-T¤S­@Ë ÛZZAYD 6äAòÂŽMÇÆŽûúuí{Ïc÷^gѤe“6U|ÒùÉ>ç|ßﻟÎ9€>(xpœr ªt,ŸYK{ÿ¯`@J"—éý+$‰æ0F„®lTe'J‰’I$Òò¿0Fxe@ „®èôíþ[.?RûëXÖ=Å`EäO½ðfà´çüëmç&“hy;š÷Þ¾‡VV!‰ññ͔̿RŒ¤ÙÑ¢>AZ’\± ˆûëú¥„Pµè•ª¥@-0-.yö¶_Æ©îýWXnàÀQ§`-!=M©õg²Ê[Ƨt±ÕÂT¡dºnw´°\ػԘRÝ)E¢»w*!œB“ýÁDdd4¦€5 ;Øùé©i_D ÏE"óÁ` ˱¹…¥È¨w8Hc@!ROÛÓÛÝøôÖ3’ ƒã±¸ïæL&¿à›òxÃbd.Žò‘ ˆ ätpöžûæÝ4¡ùØdïpXʆîLyýq-}Ÿ»·0ÃÁɆBÝ)E‰ö]õ¿ìÅ€L5Ö¿öÓš½×ì¬>™"ž¦Ö…3ìϨyçØ‹WšêoäSm ñ’ÑÈÉ] »ö\Ik38zö‰õokmN~åýpöDMóK;kÚÏ7ÖìÍ\˜Þm<y­Î¥¤šw]CcL°»¾öD]McNòµÔ7Ôývbî””üU£Ks*Ÿ«}õ¯{O~Ó0"»}DÏ4÷Á±ÀæÍH|èFIì|Écœi÷ÊÑÁ±´‚Å$÷·uÌ¢óâìÅÉŠ¥Kž=ýFnëûe-†ÑèSï÷|SD%Ýï`G”sÿþ-ûðo’…«Y¾38§d'‡îe‚SÞDt¨¿SûN'‡ßûĶ’¿¿š2h±òúµñ¼wÂLÝŠáÔ­[b!SñƒÌó?¯ù"(Á¶_y­=дJ¼‹†ïW˜¶¿Rc@äG^Ù\ÅõûúÂëÖs‹VÉ|ª®ß]î’4q§>õp™‘5s„qÕË{­ÊöÃß#nôÕ Æoµ¼hÕ¥Z¤¶ÚêêB†}-Ûwa캰õɯICù Öý-Û4«”à‡÷ÝÁiG}ñåPý%Üã«r&ínAKEY™ÑYfµ‰ŠºxƒÑX\*$ aÃF %Œ\Ûì (€†c¦u%§ét~Ñ:‚RŠˆ ~U¹b…åUpˆ1 ¶R› ï{ *M•ky¤xr©£ER± ™ Æ’R†È€¡€-¼”f]âp"åe¤ÏAÈ0ú@HÌ Yž£ögn½“*ÝdZêhÄt.ŸNVSZƒÁ¿&“¸›ý$§KA}h?)’$“Êä 0íü‘Zì…n:˜²Ÿ”°ŠPáX‘™Ä$þŒ†ãQ*)ÉÜ¢Sdž;g4¹üÙ„ú€†"ôQ¹Õ¦ÿ–öIáÛ•XSþèå?çã.á)3€€ÿ¼yä¹ö—­%W¯=¶Ž]&ÆÙÈ­l•¥ÔeLÌP`tVh§…ùçêÖÎz+ùùÁ2³)Ùs¤”C_*0;}oÜY[Á)°>?6¼ÏÎ:lF³£ÈÄ[E¼Ñž6sfG±±¨Ês鿦Z{ÒÌÈWnôت¬P Z«£½„|w«P¤2…çÚW×eŠE*¬v抜VÞd7¼EÕªúÜŸ;ðìõЩŠbÁÂé‰à0šX³³ØâhlíèfýeOÞx½äÇJ9«ÃÆè|vzxz½XX|ö“ÃÇwíÆÅ¡T°«;–½íÌ${:ýÒlgO<~ÿPsW¨§sF¦‡J¾îSÒ3ãc:|îÐÙ‘ —ˆRíd¤–¡°SÈRB†u+ð âÞéݳ£(Ò4K€Kí—Ažg¨F‚(ãñãÕ›Öó€è*h*P-ŠBy*H“ц Š5}½¬¨x"u‡ªFYH4AH±‚Y¦@üÇP.·š÷}–‹»æu§PØ¢zº”"YœgÀÿÿ•S‹ó™µ:XnO›SJ)`胂Ü` Ÿ«lIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-logo.png0000644000175000017500000000227610536106572023673 0ustar gregoagregoa‰PNG  IHDRP< ¿0PLTEýýý‡‡‡IIIËËË(((§§§iiiééé™™™XXXÔÔÔ888···wwwãN tRNS@æØfÛâ} aƒfÒ;ší6®RHÈEx•E‘„Rh™i6½°pÿ¹í?‘áaKÈX˜Bf½Ñí·Àꉤj•«qŠ,e2‚LJ²Z¹Ê4› ¥ÛK{ MQôjŸj¶´—äÌÑõzO’9ë)EºR¤Y¥ým’ërOÖ4î¹å†ßs‘¡J=Y¥Ù9OŸ°.ƒö'C‘´ˆŒGtŽ@ÖX£È/rj°¸! áT2º&Û° Cvó>-žœ?Rë2GRaÙsw¦Y+O5£Å_A©^ãl aBÙ\ÙqœQw4ƒ"Îð½®þ¯Ô•»‘áN¹\l·tüŠ^…d%m]O+¾fS¥†Ê~Û3Óú¾ç+uºæk61-³ÓÚgš~oF Ø"™´î›Â4ƒ§ùÖy¡o3Í „¢¢(Édt‚=Mì!ÄÓýŒ¯;Š’w|"eN”Xè°]Ø4Ï(q¿%棓„¢¤ÑŸP DÞ¢D–ÁË`œÞgsÓ4—x½5ó1^Ìð,£çxî-hòD/™3c>ÂÖ&ä4›û¹ê‰‰Ÿ¢ô;R¤7»vÈ²ÖøÂLlÿh²lîË— Jl‡¤[˜Þ죅˘,ó?Èà=,®·¿À²øØY67¿Q…ñ%Œq‘ª²º6ËLðÑd™Ãϸ'bú„ôwh–™bQ`sÆ'ÁæËÄbqš1äÀ+Xl8 £ãÙ;4dß ‡d0^SQ*… ús’ÁøÑ¦J¿\•{Ç¡Œ÷ú-Ì ¡¬û½õÕœYÚ"ÎÍIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-11.png0000644000175000017500000001151510536106572024554 0ustar gregoagregoa‰PNG  IHDRZÖ¹AÖ‚IDATx^ìС !DÑå²Ýœ@Ò‰ÝîÀAý@BûŸ˜ÉØ k4q@.Uoý1‰cÌ즾±gß|\à°o¦AQQ=»áRnD® §(Í¡QcL¨DS©J>åKâ4ŠWˆ€F«üdŽ ©HI‰Uš • ¦<ãŠFÔhŒ°’ìì »“·Û»ãì,UìTVÿ¦yûzØêYØš7¯ÿÝ¢é¹_ƒZ!v¡¯6cëH‡Ã[e¿DðÅÖsg@‡³ ‚öÀÅ©u uºZéºò·w? õ•J‡«Rqø Ô£—Džúo}ƒjI|U”¼—¾\ã«ú ðLÀ`0´ÝÆ‚+w÷à€ph9¢Ðrè£-!B¨ƒ'5ÙQ1'®7CÃ`0¦ —ÉÉÉù ¤ºÇp i D G:A¤ôˆþ`0 ·ÖöW׸!%rÖùŠßp¯ 2Ëóf/~eÎ É)‘Q±a~ƒ†r Ò O)MGW7-ƒÑsv@´ƒ4\Á»SÇ&„ê ¦æF]Ë£.Aèx£È™ˆV0k'zYvðèÚ.á»\æŸßÊЧ¬׸uf3Ú1YkÀ‰?¯Q9}#mœ;¸mêëÛh÷ì<´éoî€ ƒŸ< ­´ÉÐùŒ;ÙáÞÏŽ ð4t]'A0<6ž7ùÿ :^ÐÓp Ç+ú#ï˜Eèè¯î— JYAcA/¹i㲋"§EM[/Å‚>'mþö´7¶Ã@…ÁÀÛž†E,P“pdPäHÐhÚùÇ¢YôôÐFGû=îìèaiB»ÎÜ~¿íàߦr´Ãã–)·3•‹ÁNÖ‚]ØÐ9ùí‡ÐO0XDõÚ­ÕzÿÀŸ|;Î xlo4tx´‹íê'ÆÍŠ“‚€Ú!€Ðì€î©p‘{ [@S×Ñùåú±µÒ|¡ù'eàP&Ï †b²€Am8 Z½^8èoö3™MˆÙlêBƒ>6t,Ü:Öá¬H;Æ@-˜H;±ÜeÜÔu@Àd`v ¨™fò=mÏ ¦&¢¯ˆn-4j›oë³MÞWZ~=töTÕÉcµ?|YS½ç`åÎÊŠ²Š½Å_œÙwyà—<0,ȃ‚Êì êô=_Ÿ¡I1AF09w³ƒ7ð,‹ ‚Ñ8*$:4hœ»OR¿ø<”Ú.n“¤DÅs:xÂJ”p² WÃÒ P>¸S÷©$%bõFg)ñfw«ŒÑÓ7 | Ÿ,<ÿÒfÉ?³å5qö–¤Ù%( š(I‰æmŵFIJ;¨&¢|€j¢LJ$0P`0Õ@yFÝÊ‚DØ{äöœŒàøˆà±á~ßT×_»Ås>þ¾!!aA'Ÿ&€ÃP5PD„„U¾ÃFõÜ+€8Ä qˆ@â€8Ä qoÏX³ø¿ÄÂ醫ìÉDÄ—ìþ§–U]®V¾ ý¦ð|Ö-äT×̲Tè¹ÿRŒmã@ýŸœØ<Í ršCL„qbŸ3•çàxqß«oO1Ês;U{~¸ô]ñS/×Q†ˆ}Ö²®#;ðî &Bñ“¹¶B,éªÐ •Kc šÆîÏv»p2tÞ¶íœCï’ùÁÅæyus÷õï=-IXŠS5‰­ÎóLuÒz½N5þOvîp*ñ‡};4„a( eÊÌÄP­¬è@`¹Ã!jòÄ7™!-ØòÓçJòªúOôhÜì[MhQžgMk¯A¨XüCQãE1Q°çBCUz0R Jž´´‚±TíE©­‰Š‚BéI‹þà)ëA㞊ElÓ$&›àóÑ'y‡ÉîlYÜÄ0ßeç½™]–yß~oØ54R?<©ÍBÀt°sàöÇéó–ea.H&“à ƒ%½Àƒø£1ƒd2G}ò%]µoéo`.h6~dðâszOo¢:|ÿtDvž@»®þÆäGÓýò§åÛ¹ù•£<·µü-Y) Ùü¯Ål{kéÅÜsE=ñôìX_3T?««MN4‘³×V6DFc¶†ÖAûzÐØv>-üðVý†nÔµ´]j¯má`ÿ 3ÓÏŠûø‘Át@÷º£Ç>xöfpÀxì¨j"*cødĽúͲ7C³rÜ$ö*3ßê€Át`êÞ{q©Ð öRmß×GÑ®þh×=²,ë_V¿Q˜Y°ú¨Î£Hâá—¨ér ®»:`0ÐEïq‘,C`g•K´ @j—:qOÊ•)Ê{ah?Qý~¥» vÐzh é53>Qg«é™հÑÕƒé`µ/Ì\¹ Êß•‘º¸Ü;¾ñôµ~p@êòcçê§o€Öá8ƒ_зáÿê«LHÈÛ!(ç”Ñ=¶ëìÕžb® B òn|vrt7Uýþ7á8CðIð‰ß;`0Ð;p»*ÅCW^:žÿiK4€” (Ü™œŸŠo úÍmãÉ௼:`0ùV,•[öŠämR7 À4 äô­×©ëîÕõˆIOæ\M$}¢‹ ÏàvfýÕƒéÀÿŽ÷~¢ãÔðÂÔÍ·à€™‰RSm6å¸Ä¡Ž|žWUå:‰íÿoýÙubûɳ›'XÞ9a§7¡¶ÿú¹%ryŠÄwmÝN høùŽK1p±CÈæ4ã3¦4€©8%ÐWJ*¶Œèr€z É_óM .1Ñ-ã8 ½/=–jÑÀ㣡 NO@ 2¾aü<ªÜnlÌ~þ Nh¿Ñ4¶YÊkoã¦yëa'´÷à.cŽ&Ìd|Æ”s`¿#£Ë#&c;!¹š‹8Ï{Ï5œÇžÞ7MSLp¾&ož¦Þ*=ÞhÖÆ20môÜP¯ 4g9@;€Õõ˜L0øª»Lþ Èâõå`²±ä9@ä9@ä9@àцÓEÇã€ëUä ™¦É2€üáúúzùàÏM6½È{çþß]L¨'c‡Ã¡úš_»ªT½6)j¯‡ó«ƒO:ä§írZ0>óæ rõ?Ãõ6mÜê/Ü“‡ÊÇÜ÷²š`93:,m…YÎúV¦+²ËøÊi«RkôIz íÍ”›ŠÔc©§Ó©hÁnÙH?còäT–ò~«ÁÉC%¼|~^[/L /Ää%õìÎÏëÌôÏ4³Å'yaòëk(RoÈAZpé=ÂVü>âüH?h]Ó4•ÞA}>‚ôÚíÏB6ûû‘BgçïÿË‚ ÎÈr€ Èr€ ,¬ÀÂê,¬nŽåÕÛ…ÕKÖ,nyuXX}OóMÚã%rð‹;FŠa0,âqtóþ“›Èý!”ÐABþÌ¥…Rèöý«K*ùPùéš;ÂáðêðêÀêc½~s-àpxuxu`uÌÔûøÃáðêqV×/, ‡WO °ºþRŒáp5ðê9V¯)n½•¯®léeïŽQ"ÂŒªxí´ÎÒÂûhiiá1,,-Sj§ çYYþ@~ !(ë̼ÇÉ Å„ÍG6›MpcõõŸ*Ý8ÜVÚ7VOöø¨¢õ¼Ëm%G}GG»€ rÈ €rÈ €rÈ €rÈ €rÈ €rÈà¡lÐËSã‰/ñô°ƒ¦•Rî×ä6›MÃ;Æ0 y<;ÔäóTV@ìmî8wÈ €€/zjÊÞâ»WŒ¤åºçµt ®;@ >ß_ór©x^ËÉZ0^#µ Æc¦±#ùoÒª ­˜”.LfãØiÀ‰Àü/åò‡VÏ’,ß}ш}~þTB½óúõštqt€"Är3Ç1¯X‘å[cnã9¸Û¾ªÇLÒrkóÊÓLƒ3«Á‡-9äÀuü»!PJ‘¿-9€¸¹¨üÉ. èKÜtü¯8•È €rÈ €rÈ €~ÂôÍ0{uÍ„sKòvà€˜Ñ쟊AŽ¿~ž#*ã$ñ—ºIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-06.png0000644000175000017500000001207010536106572024730 0ustar gregoagregoa‰PNG  IHDRƒÝÈ>å§‹PLTEÔÐÈÏÏÏ $j´±ª@@@ÿÿœœœÿÿÎÎÎcxwlfe\¨Š8½ÆÍ¶ÃÏÅÉËÒÏÈÂÈÌ¿ÇÍÍÍɦ¼ÓÿΜ£»Ô¨½ÓÇÊË«¾Ò³ÂоÆÍ¡ºÕ¸ÄϹÄδÂÐÁÈÌ·ÃÏž¹ÕºÅλÅÎËÌÊÆÊË:l¡°ÀÑ®ÀѲÁЬ¿Ò¤»ÔÉËʪ¾ÒÐÎȱÁÐÏÎÉ¥¼ÔÎÍÉà½\¢ºÔýå£osxÊËʯÀÑŸ¹Õ ºÕw{€ÿ߈Zv‘b‘ÂÑÎÈ̆TµÃϼÆÎ³ÁÐÀÇÌÀÇÍÊÌÊÄÉ̺ÄÎÌÌɼÅÎÃÈÌÄÉËÑÏÈÌÌÊÃÉ̵ÂÏýþÿ©½ÓÈËʧ¼Ó®¿Ñ§½Ó­¿ÑÏÍɰÁÑíÕ““šªðÏy­¿Ò×´VðÏxöÕ~°ÒõÒÜó©¾ÒýþþŒ™ÈËËïõü ¹ÕÏÎÏ÷÷÷òÚ˜çÇtΈW<\}úüþæïúôøýúýýåñüáìùy¦ÔèòüÙéúøúý[Œ¼ÏÏÎðöýêóüêòûûüþå¢qÏÎÎë¹—Øçøúîæìõýøûþ÷úþõøýÿÿþîõýå¡pçñü÷úýíöýò÷ýÜéùáìúíõýõúþáîûãðüÝéø[‚«÷äØÜéøÙæ÷ÆËÐúýþô÷üÌÍÍ讄ïʯùîæïõû=n¢ÙæøäžnüûûŠœ´é³ØæøÜêøÝéù븓ñÓ¾â™dóøüÕ¸¤ç¦{å£så¢r謀õßÎõÛÈãšd¡³Å÷åÙ̇Uûýþöûýõùýç­ƒU…·ûýýùûþòùþïõþÕæøùëá·ÁÍôøü÷ûþõùþòöýöãÖçòüðõüëòû÷èÞç¦vçª~âïûàíûTÐÈÏÏÌOÏÈ€€€ÿÿÿwYhIDATx^ìÑ1ðú7XäÀƒ†=‹…pªÊ¤Ž%Q’õËŽô¦ „qŽô›+«-Ìž=‚@bl )À%ʾtUº¡^Z©ê'&'&ÓflÇAJÆ<‡qzG<üçõxcc8ü;Õëý~©Têv]×4ͯß-˺ù½¿_©T:Ÿ?¾µÛƒA«uÛëíîžT«««Ÿ²Ùìúz£Ñl^nnnm]g2™Z­X,ž®­ …wŸ.Þçr¹r¹üçËÞÞÁÁùööÇ+Ã0‹æ¨Íè7 hÐÓ0TêYº³HÈ™|šÉh‹}.R3Y­²<‚  4Ìä¸;¡;ÚîÊ ™•`û¨Ádk€¦{òtšœl¿Ìï*Ò÷E©AjܳG‡0gèâ̰ v^ü=`ÔTçýAÏ–»×Qâ.˜{¦mÌ<Ì%·!6JÈ44Ô&Иh´16Þ¾ÂuWy­û8 *‚®B1²_õ/3d×i÷8wÃôÞ€ F&ݰÁWñz6ß6˜þÊUÈ@ˆ7pMÎ fá ‚0<7ÐZgC㎗vO°¦\ü­&{ï²ÐÀÌ:¿Â€ 6žw˜x˜fšLyà êxÖ€ þ£¼¢èŽAÕ‹®htyjcÀÃ,hdàK p®`L÷Ámi€±kÀuª ”Rõ:ÀÔz-V Øàû˜Ã"i4 a¿±ÁRÊÝ6–2® òÖS7À«ÁÐVþÉ|?ø4éêŽÆo¢Lÿ øÝôÄž½ä,Ca†ÿ‹-T¦ì„0c%æ0V×K—#½xIj€DÓVzÞÁñ“#—f‰uˆÑ@&Õ§A–R~ ¦|SdàqÂÐpÐðsQ0Æ̀怗&®ó`@γ3/ž±k€úÊvÂHÓ‹{T'g€PxkPÏkƒÁ¼ôöøÓ""2¶ü  NwaßîÞÚt7hÛêr:× ¬TæŒ ¾2Ö@ÊëfuþMú/ª™èºªëû-`ö]“?¿/ªÙ¼D¥S¶{MÞA$Ï¥NŒcõß4Žè}tbÐ{SqÔ‘íÐþÐÐLéí>šL§h÷Ñnì›M Â@ FµRÿ·ÞDÜy‘êZ=ˆ'4ÇqÀ1øtñ 4¤3¥‹¾¦CyL÷?‘È£‘AF <¤òhm¢ù÷#§G‹ˆÜÅjcm¥ugBG‹èáúÀMXîÑÚ ,K}ÿýPIZØt2Èì2À=Уѣ=Ù;³;Š0 ·¼¸{ëoè? Þ…pþÂÜŠ¨·QC’0I˜1Ì$! b‚‚à‚¸\¨¸ï ®¸+èÏq…¼|ýq¦ºÒKu[ïhªªëŒäÆ‚dÊ£1Ã…õ÷Ö³‚ô’G«À«/¸[b0HmULC!4‰`6óˆA÷< tØ& ´À{˜Ï:xbòy42—M2Ð'åÑÈ 4à×eÀ¡¾(fþ´d€~(‡fOö Â4ø½;åÑPõSZóG \¦è÷:ê÷:Š<š<š“G“GëXòhùKmØ‚àˆýìó‹ëãOžÉ´Äà«ó¾þæêÕýúìÉL ô¹è‡ëŸêk×ê“¿lÕýž—‰–ç êÿ~]:XW¶n\¯[ŸIÔªÐÔœ ƒ¨ÿ,êYÅ™Kûg¯lmÝøãúŸqH^0óáo°ÊeP³ ƒäó2m ÍIÙ™à?•Ikµ…¤ŸÍ•Rp Ç RbÀòYJ+5m4ÄFŒ¥=ýbqUJÿY6LõÄènè"™ªÊ«;µäýÀÉÇ0ÌQ'5iiRXUÊ>c¡»LØ–¹†rñp$2ðJÓŠÁš·ÐIÍÐìÈ`ÍÔ²¸=vÔˆOÀ¬˜Í•{2˜ æuÚ“]!K:y?›Š€J ²—̼Ä@ Ä@ Ä@ Ä@ Ä@ Ða–¤ÙL´ÇÍ3€i¡À Hg¬î JÍB"2yIËir"Ǩ;9sxa(1—és~¼ŸœÓ´cl¡{ ܵŒÈdÛ)ͤœfœ{(”Íë±í4bN3ÎÀ*qDm$[‰9Ͷ vßäk$ï'å49ÑlÀdÐøzZƒ 9ÍÞJ —‘b çEb b b b b b1ÈËô F?S¹LDf ¶tÄÀªÃU/Ã)˜b{Íq ¦X8©S0 u™cŸ‚)>¦šáL}6u¡ÌaOÁƒ¹œc @ßÄà_öîÇMðW£ÿ²{…žà?`k§²eë[Ë¢%ax§Âã¶È1!³^ø¾¨`€ù9qYƒòœ`,ò8`€`°¦ìûº½Vå)Ù}r8'f÷1˜§:ÙœÂ×é¿›Ýeð}¥±hJ£É@ÛÏîsMž“ôiš²g§e÷1èkôJ;3»É`ª<)»ON”êÌy,ºjvŸ{4‡NÇÀƒX`€`€ƒ— rÞìÁÜ÷íöy.j½´Úc §R¶ú'—­}e1P륕š(0˜j9NâZê„Î¥/c_Nm£ÿQ}7¨‹väŸ-FÕJŠA.­,í$îoж-ƒ^ÛÊÒªê:§¢zhG}¡í?hl´²FÛÖ_’jUæ¢ú©uÝѫƿ'¡œvƒRC½:¶U+Õ«uI‘ŠÜ–Ñ·ÿ×êÕº1V‹ÁT/NôVÚ«SŒñf¬†GÅÏ&­ªŸ ´£¨E­ë¯0X£”1®Œ%µEEß×z¾5,µVõE­µ£¨E-Úƒ­ÈÚùZ+ÅÁsƒiçVGc 0p 0À 0À 00 ÜŸÍeÉï×,c`*ý&b2/s™Íá3eržˆ‰A[Õ𚈉AJ£‡ÏžˆÉ5Y^1ùlº>²ý„‰˜¸ÌÄÀŸƒàéåxœAzWtƒòz<Π¼/Þ§ù°ßµœ.%•ç„¿׃;`ß3Èo ÷ÏE|.~ccѧ l##yb‚ƒÍþÛoù<ƒ1¡Þ–ÎX^5XŸÕ8²öÉ!Áïd`5v Ò–AzÑ@<åÕÌá9ÊŽuˆÊÕ@Ý£îÐ#ÀçÂ’í˜)¯T™ ü:Ù„P—ýÅõ ÖI»k n•h´C‚ßÃÀ&r[ó™ŸFÑë&ƒccÑbàà÷1P·M,{¦Í¹÷Žhd[Ç"‡Œ÷A2XzÁÀ!»þz ƒ% S©óz5ð'ˆÿ¹h;Œï*>~sþ÷U%šßU 0À÷<y´ÿ^Ǽ/øYG~ÞôãY+üÓ—x¦/1˜ó“µÆ)}‰Áèn‡ô%ê۱៾ÄÀ%}Éñ)%䔾Ä@rg~2ó“1ð$ÀÀ?0À 0À 0À 00sNeb`Þ3110óSÎæìT&KebÐ6ÜS™œžÊäš,ƒ±œŸÊä³é(Ô½.©LîÑL+òhÎð]`€`€`ù&ÌBìæ+Mk÷Œæƒ oP—¸f4׃½§’•cmþ“3ltu´^9g4lxƒZ_ïá±ûß ÍkÿÉ™6þ5yg,òÈh?ظq¦\¥ûäÌãÇÀr&÷Éþð}`€ù9qYƒòœˆ?1a€``)JØ= ”‰a £Õ‘ÆÏá„zØšÍWÜÀ~>7óê©g2ïcPcÊI0‰Ä‹"(»oæø>À@ÅÝ Úê’öƒdf6Ðdê¸÷øŸ‹ Þ|.0Àà÷××÷ xÓ'§ONŸ±(`€hrcßv‡ßo<Ìbæîe`a €™E7°ÐªxŠŒE+Â- B?ÇÆ&ŸM¹Gã> 0À 0 §ONŸœ>c× 0Àæé3Äœ øÞÔüß䔀j¥µ5y´s Æ2J#ŸìoàŽ€AòV`,ò¿0sMv¾$“Ó÷î“1À 0ÀrúäôÉé3q=À 0À€œþþ£Z?ÔÅó']0XŸ–?g’™ö}4±€Í¹´íÚx¿b\Ö|fQ«×Cà}°¬µ-NVÀÀæÚrý,×äQ«ëµAÀ=šq†w `€ü- RBXýÿó&ÏiغHPlÐ0(x0™p”"3¸Ó„ JƒÌ¼3¹eÛ.Ë®æÙ¢&øœ±(?(©ËÌûÕæ=@]Ö°»·CËçŒ /ƒíáx ÓÅ¡IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-11.png0000644000175000017500000014640410536106572024735 0ustar gregoagregoa‰PNG  IHDR ðœpyÌËIDATx^ìÅ¡ 0H81¹‘;­éì:ãØ‘ëuÙ¡c@ë³ÃÓþÍ,øÔ0öî-6Ž«Œøÿ›]¯×±›”¸¥iÒ(¦M(i¶”Xª„ú^P%^*Tè¶ô’6‰)’r ðPõ-êHÊc…"¥Ð¦P ¤IÈÒÓ‹ã7Žc;»;{ø¢#ŸÌÚ;ë§Ûÿ?}rNF³³«‰=Ê_ç|ǃƒƒ|(àà¾×@DDDDDx!"""""òrÃ;0D¤úq„TåqwòlW÷gô ;¹Ê{Ä}ŒÚ¯,ÕOp¤æ·v£‹½s¹2¢ÿ:•W®r‹s‘˜; 'îÊÑ’º‰ÿѸÈ;`.™HãžÌ|2@.‰'³¤ÙžÌäžÌA“?™ óüd6ö ±cñ’{2C%þdvoh žà#ïÚÌ¡PH˜Ý®_GœÛî| ‘¤>—4ø³ñ!À[$h>Rý_˜$ÙKÊ%ô,h:~•„Ð9|$ ÛÝSP4( @®³+ÛÞÞÚÚ:zòÄ—7ôïúýÍ õ9N¼ÿÒÄŸKða!¹t?> ï?¿ÿ›I®ÿµu¨ÙÀÀÀîÝ»çtþ]ÛvÚw©ãUaþl áŠÓG >D}¿¥«GÀ‚`|4Ý‚ÉÑ¡oÞqûÕÂï‚Ú€ˆˆˆˆjÞ1è…/Öw~]¯ŠògL+Ï)¦ä–ôø>¥ÄÏ ­³«81ú•¯Þî $¤Qßš~Ì"‰ß{æc&ÇŸûƹ³f¼ ¯UÚZ½l›¤R(žÃÙ)|0fÄGG298gþ@[ï· €ñ#¿Z´úۘəÿÐñé{ €±CÛÒù™{‘¤“û~âÆ—­ypä ûWwä!;8±÷ÇYºöa„¼ÿú6„\~ý#yïo[ÝøŠu¢6ÿ}íi7^ÖÿøÐŸ~€«ÖoðŸ .¿ù \èí=O!äê[6aÁ#"""bºÐ QydÎ[ .¾LzzýÕkÒ×Ý”î[›^¶2µh±†J0)ô¬õ_)ÈbhN9*ÔC3ýZNÿs;’´äºÝ œl<y#š la&=×W«2!Øl àÝ¿þµ¹òÆÇµp¡eë7jEâÁò›ž°…Y¬¸åI-o½ò=49""""r3•UË«l0ˆMñ3 Kû2(I 8‰B¾Tà Œ'+LnµŒM™“¿5'†ÍéqÌì‚›RpãöOÝãÆc‡Ü|ÂÌNÿãåÐrÍ}v0zðç˜ÖÕw?ôÈ=RÖý¹ìàoþ Ó>víwPÍ ´>¾ö!4?Í o¿ò”æ;Ÿpìår`Xyëfè‘?"dÕ—¶üû[ìø“ìG_ÚŒi½M9ˆˆˆˆ˜.4h¹¿ÖùËÔü¬ˆo$e6"â-ÝXÒ/¹^9¶¯ôò³ÅSÇK¥3&+p"kÂÍ Zn¡‘²ñ@+”¶kÙåFn>¡óšû´|0º>{¿­H<èî{@Ëeýj³-Ôkxï3¶PÁ.:ÒÂ‡îø«ß·…Ú¸)…•_ܤ‰«nݬ@‚æ-ÿz©üµwà€£»7¡91'¸Aý= ž“AP„§ãÚ–{…LéÄá`ho0|Ôä'MK©¤Çå„ÈŠ#b—Ù¨ ñ@sBådBÅLB¼Sûj£êUe¡‘Ë ï½¾Õ­8ŠõÎ_~Z_ôâØÎד`• Žï)G…7?‰*ìdÂCDDDD‘åFšê ð€)¤2.x9œ*žÚŒ¾kÌ8ÚÛáùÒâP‚ŠÍ nõ‘ˆ`.ì4‚@ÁÍ'è4BlZÐEG:™à¢‚Ë ÷‰l0€jaÑÞe v"XˆˆˆˆØ»¬c­:{D$Õe$‹âH0¶?˜xÇಠ2üªÐT`gHs‚ˆhB@Í´Áv&ˆ Šá¿?ã&OpùÁG†6$4ÅGDDDDÜÕÔ­J4!ØË s_nÔm cÁÔ ?bRydrððáM³/ó!v„ø´é]ÖÒæ„Hã²mHp= úU×Ez—µt2¡úBlײn꺩‘»P5!Dz*×-ýüÚ\7Bd­‘æÝàH75r[ Ö±ÿé¼Ä›Ü@Û¢½Ëq´}YÛ\ïr£—‰ˆˆˆ*âÅú—oåƒ#|hAPrÈL hE(az&!íZǃÈ@‰ˆëZŽt#X"ѵFÊsËpv#¸öeHy#©²ªË € Änp$ê= î rNÌ…ÛüT$¼Ð(J;ª]Ù¶%D×)—$Ô¾ ‘ÈÖF¶kŽ""""HâÍÄ œœä/S3S&ÕS€¤€ [Idr:F¾µžþÝ«·Ýù<.1DDDDD‚„¼°óÅ:ÏOþUñËZ^¥ŸÒð (e ‚¤ýŸ½;Xq"ª!£ 7ý@ðâoíÁ£ÇÔ“‚~.¤ÔÚte§Çö=™mgªk*=¦;™Äiú‹„O7/þ°À÷¢}ÀaàÀ"°H,[ü§Ðýàë#ýÛŸý'Y´Š³D×þ)À"!flñÓxÚ+ÂfÝÅAºÓÙº—Æž-U©ûú9Än_?¸ýi§Ÿä®‘~i ¦}Wî6“ì¼=w<¯½€c¹GÌØâ׆"N££ Bí5ŸrÚ½“³n§4?ÉhÜi5"fcŸ"í8vÑë8ô_B뿦˜Cå×;›‘«.bãÒiJRœHlç|rËY´fµ2Ly^9¡ó–rç8…†T™ñßê+âïuYX?L×/W]¥²%oÜÓxNþàxÑÜ%&i:Û¡1S¨êõÂzâþëÏ"Ûy/™çSÎÇFË@þQ^ÆÉéÝKs¨t¾ùÜSwEq¢qhX^šÿ„±Ô¸(ÒÀ¸Úƒ˜ZÒöhÚw92þ¢®<ÙÔ¾ÜnÔ¿E;Ân,g›'—ûíj¤X´vªÝŸhÆQeýùwÿ|ûc¬_«v5Ö¿,u4SÿÚÏÃ86–Ç…o îgÛaµsìn«=¼š*Þ&*ª±”¨Æêò)ïÿß “€Ã’_ö—_ÌÙžíÖ3¡ñê„jÏI#jåË"£ÛÄÌ#|ÿÓè‹tJXã9à„ÎmÍù£ŸÙDüM²í÷rQcÝ%ŠüÇê1SKyF4rÀ"Tô[fÒÏ*ŒU&ô«Ñ‰Å¯åÀ¸âe•[rm7XzM¼ös/©}ïàáí“Ö£'Ͼ}ùXìÈê÷j®n¸yóöt:˧·æÝý°óƒ×…ÆW<5Ì­ÆüÌ×9ýàÓKÔïnƒ®»E^ÞI¼“p8ðíF€Eà+POïÞ?øÏ/_½þù)åX$ü`OŽMaºo Mæ°²¯…+ä®zøo¯1€>ûõeïŽUb€Jño:v)èèèào¹þ…CÇŽ ]:vèÿ(\A:†Bxo dKîJC{ÜêejË 8“°_Kê¦|z8Û]‚J…‚M—õ°åÏ Ñÿ]j, tlº”oÕÛÎ<òÜ&[‚ëåüKðŸýY²ÙÁ‡½3“«ªöý:cM]ÝÕs:C'éÌ! SF†@˜EED1 ú|‚ןzõ¢ø@P¸ïêUô*‚Š c€FLB汓ôÅÛ?NVÖ^'Y]TêTíÿYkï*H û®vÛ ÚHoNþ©—Þž™Ý´yëfÀýžóKfÊá…¤l™æ@)à÷8pLá$=lc>®R[Ð臒‚ ïŠ[¶MÆÖÃA<Ð×»\â'Æ¥†ñK ¼² 9N°¡¡|ÏÎØâe|êt ä…mÝ‹æÔT”©À%<•ÆEA‚_­©²²øåÊ8cy™$sµ”h x¾R.@‘6kT®æÌòái½³óé»D¶-™]KËçC©yŸÒþæ`õu3ãð‚s$Ejýºëð‰wBI—ŒrÊï¡tt& kØÔ&ÔD,ebC˜hwu¥ÐCWp(„Ã=]Âb†(£”3™²¡Ÿ•³Î‚ ¶%Ç ›0IÒŽ$cѬÍR±Å„cÆ ‡ `ûgõ"$Áß8å:%a”QF+ ó>Úæ:ŒÙF÷æã›×¹Ÿúà‘™sF¾wˆÝGq–cËó›¡̹fŸ•Ü—ly!qø3¼|YÆÃKÁB!Œè­q4±Z‡÷ÒGóÇvuX¥ ŒñXÂVdÅ!Xáà«8‘mïhÙ>~Ò™!´µãÇHo—zÃgærЃeå/¿pà±_›‹f<ß{xóuwüFLGÔêMJÀA(M‘ ›H¦C(ããjMcËÊŠäa6$Òf-š3‰,Iª"0‘9cZMUaP,z¨Ê†Š@HY~ZÍ*Ÿâ0éxÔ~{O·¦dÆW2ðÀ7ìgNæ2{œlgÄ4ÒolzÍóÈ€Ù”!†-”kEÙN#Ó²õÅ7J¨®ùòÏ¿gœ{áz_¾¬þ|(5Ó~ùEéžÕ\Øc]É'?¹òÁ\¾¸º´:¡¬{—ë¤Ói„&F$—ÍbBœ1B0ô3犛¡@zZ· K¨J©:qÚ‚!C/2•9iÅ÷æÇf_ºéW·–ñÉ+q½<òËK¨Ÿ.#lÚĘrá´'±œC÷wÙOmï€Âi¨hàÀ)£±ÄabÓ!N*›ö(Å…}{ºövgzÛmn|տ± »tNe*ëdMœ6P:‹Ó9'càœ ¦Œ l²rßA€ü­{j*ËàÁ(£íFŒä(Î +*üknüñ»®)Á{%g{krÝ=GOsUW¯b¹ó[ÖIÿ W„õWÎS>©zúµFïÖäÑG­¶û TŸv)“´&pʤÂ?gz™°„q(5ƒˆëù”PPop. PÆäpõìÖ£;&NYXÀ£êë±r™\2n$c^=wútmæÜÆy§U¦žJâ«?㜺žÜäÐ1P “ƆÄÒš6!è JG„ÊM‹ÄÓNW¬ïô™‘šˆ¿8™O£D–'Ð4UVdòÂÌÑÄPªPä¶îN4Íâ1~ú¼à„º Àr´€®úôõÏîºð<¶Fór¥üâÏ1@4l9Á–ø„æÖ°þ{?KŠKÛ²ñÇ0ˆX,ndM°Êö®À°zWÂöÁ7×zÕº{×ß{Ô« ¤xL+ ŽÐ ý•øÚÚÉgÞ~Ô–„‰Ü$,'#Ç6CÉÆ˜cä;guí£frË¡E¨n1»±ä¡G ?øÓ¿ÑÆ__W½èçðAåZJ^C˜²êfß;—ßrëS?¹Ëcùîäg$ÆQ$ 'ȘŠÅ¡aX”S ÈŠG…ðé¥ëòsxl§ìD¯ÕÛ™éÌ¢LkŸ¼®`8ôù-mC‚å!M0„ƒÖÿD…ðÁb”Q‘À¢(Ãì>$fu·G'Î*‘N` ¬TÌÌ6çº7w¼õo/ý‚¡âÕó/VV¤· 2bír>è‘eµËNýÅâ$:·»wÅŠk1 TŃ J cÜ´pÀ¯drhrC §¯³KXœ3÷¿‰™îÐOíø&ÆdÎPyÕ„ã‡wMž>FÆË¿üA}ã´òH@ÓÌæCøÎžç 5ÚKöîÎF{­DÜ&˜DªÊªËÛS…ÿ/+ DºíPL¨a„¥" ey„·Hž>³ª¾ÊK:)ƒäL¢(’¨Û¼¤«²ß§@ȯ Ë9‡ÂA˜¿¶Çnœ®UV13dž:?W|¯ìL]·2ÅÂ(öÓçŽ3j`–1Hw µÇÑŽV+n“_½žôr6žóqwHÒ=ÕÑf'zÄôq”ÛÖ]æÆß|á NÈ™—\[è|èÚÛ÷1êX¿pêêgâF\·äº_¿þèÇ'_%¢/ãœOë½’ ìÃ_Xzå¿oA(Ì1¶9¶„eHø'6£ˆÓ¼x€`ξy÷s?|ØNíO·o<öÊGA’*פŒêˆ[=/¼Åhóáœð[âH0”ÒW ›flZÖ4U ø(à¯j€A¤:©Š¯²aç„Q̘œŒ¶õ¯OÜ3eæ\V.·î»?;òö‹±¶p÷¿ý%“ƺe!T°ÂÞ”?/ÖP¾ÿè;ÅtWSÊ% zãeLWdY‘dL˜"K²;'–ϯ 1¢ÝqSMXå!Íßÿd2Ê-Lj#ÁòN—„-ª…‰v¤Õóšê0LAW€r°)P€xŠ·våª5áBÑW ÆëcÊûŸ) « •ÒTÄõ˜S’ !‹aKõ ŠP@A6ë8¼W–åBçUs?ÜÌX^!L<ûgØêŽZ1(«(;申×þÚX”€^#Ê9•‡§õ^IøÑNœ¶ˆ®IW=óÊz× ñXb\¢TÍêØíF8Ay…@©ð%E—µ€¬šŠ‚sèÐ3Vß›C"ºþÞWþ’Ð ¢[°p^ÿ‰Vò¥.ÈêöÍW¸Ã3>ùG/ aÜ™w;Æ€uÈsÁµKžùñŠâÒÚé#0ˆž, Æ…<þÇîzñ7/ï¯2¿&Cá`†-baF¤Á€äE!pJ¢(í$qu$ISÔ è"]KO[R¨Nh‰9CÞí¹°a?ÿÞÝ¿8W 0eP ¾ÝëÀm(|! †H…á9‡‡'t!v¸3à°eT$f6;9'@‚3º¯áìóLœ:HPÞÜ7ŠEdæ ¹• FLŠsÌI â±iïΘϯ=œÝ¸õÿ<±†ÇÝ«}IEŹÐê»ÞA¶þŠ}ËçýÅ-\:5ÄPΉ°Œ*NÇÃ\Ð|»u_Ö6$ê+ª4Ζ%)“#¦MB~:¾&…3ôÖ¸[Q`¬²¡±¯£¥ª¡–3R^YÏ9F„ŸN!1رFüß|¤¡ÞùR²Dd 1jJÜ’¹${{)ˆ”GX.L,n-œ)¦?°KdœãF2‹öµ¤Ï˜U#æP[®/íø4eþÔHEXó늻‚9štzNȯr.1Æ9ƒCx¸Øø…©·<Öþ¿Î®öxº aý}__{Ó¿<¿~=œ{ú$ D’LI’¶nø p®¬.L!\ÛLqnÿ“§Ž;ãÎÖ?ßÔ°ð›˜ÖÞ–pY¹®ûnºp;±àœpy cÌwßO`ø_>'¬mÙǺŽÖUÖN ¢ýàÇC2·öfÓ&ÑùC§T¸:Á²Mœlg² =ÿ»G`õÚK8£/=·Qøç_¸RÄóG±0æ z†¢4 ‚8qY¯Z~å­Ï<\ü½!¡f]úBºsÓS÷\à;c ”Ší¯¼~ùmº>Jw^|ó½®ÿÜ_ìØžØ±}ë_xãw^øÅ7Á}Ùq“Íž“—‰´=ñÖÚ£a¿ º–·ª HT– Š€q†)V$91ïö l>²$%QÊÄ–Å,&qEUtYÖ R’Cì"Ö$ –Æó°ö‚îyö sÄÐ;ÕÀHþ°¸Á?¼n dƒë$›+†øÿCÿäˆQFE"6ÚdIÒ3Ù_u €§öþ).3'ö»• j1lPf€Ç2E¬×‘dg׎ÌçoÏŒohêè>&¬¦ëƒ¿vº³»ùð¾†m[ZŠ ”ÃÞN›ƒ€Ÿ¸ ’?LÄÆUjP,»; …àNä£™Ä¾ÎæêÀØž8‹TøbIcBÇ„!Ì$UUžÓáìJØXË!wX3arÓ©®oˆwuq‰¸ñò •s…€Ë6Óª®_víB#ÝéäBŽGV ÙÛÄv°.aÎX¥žG8¼®&˜È¡†Úôã×å±B,qHF½qÛ´IЯ°&mÑiãBcE¶(²¤*2ç&|°P89¤øCA‹I΋UÎÊèµÿüÚ!‚œÊp™—+…:©½]Òñ>½YâÆÝ;m‘òÉE_€ÂaÈ$é^áplA?НìµCÍrö¿ô#3€Åk¯ƒ#Ï~|Ïo§ŠBÝœÛ:ßüzÍôOá\gÚH²þíVpM×V->_Lè×_ö¢(0b¦¯\ Á 45¾ÿ~7bÚ¥Ô!æÄM;X'¹#–nŽ:5aÝ@´ªL]qÆŒ+<äE'82{ö+ZHò…V_vé‹xúÅ Ï@?«.^Íœ0R´FpßG¬¡Coˆ¢î¸LóຓÝ*qÕà%×_ïê„â‚p„Bpoבð©ûV¬½åÂç8C¨#œ—º[Ä=¦Ö­Kñë\­§NNð±ýã#wLÉ®=êÓ$EY‡â(Ê(bàÄì[ˆ;(‚Ž\—³ª¢EÍ(aØæ6f˜pÊÄ,mefFfìnßb &ìOŸÜÓ³~¶þ€ðo\;kêÿƒ8å+[vܹػBp)nmÀÉ ‘¢ÄÉ@pðOÀ(£kp®MRƒŠ–ô ¢ø«}0CVC(×2wÉÙÊ Ÿ\-´™[ °;Y©à@õ`Ãòåi†2¥(J¿u`N[‹…]{õIÞŸ¯ˆÊ>aƒ<Ä)ÀXe<´ly%ŒŒ#Q4¸Åˆ1N?mbÞ‹èDq(–„‘ê3'ŸÑ•î9Ü~¸=ëãþp°ÚïSË‚gà6€È²”Ì8¡wÚpÆ€³ÚÆ)œs`”SÂwµC?WË+%ÎEÐáœè0bmR‚F=[_“%€e ’„$.‘1*$©¥Ë›U†XÀïînÄÛ{ÍËatôšf²òÛtx_1‰´£ª²O“å¢>›'ÖÈ;:¬ã]Ö„1Ê  ƒ…AA¬FFó'†3rÚ4¿‡•ëÇìÚÕÚÕ–{îsMi›¾ô…©Š,™»çбÑ4.:-§f6gp+‡³ÑK®_Ç)Ö<ºíO»w.YZ.)~l´Ÿ:e×Îc«RÑ£ðBŒb”ým‹÷<øÀ²óÆVL¸õß:5,«-Óô…1CU¡ªH82—?qýÓ~F!ÔÁ „B0vìÀõÞ×þÒÑ—jÇV*ƒ ¤KMÓ&¯yø#Ï^ÿÀÐÌ³Öæw0Œ­Ð0áu&˜fãÜ”þت5¼ôëŸåßœ±©cB±ª1æÈ²oè°hÜ÷g£M 5ºÃãÓ&u¾(+e …€šË—é¯Ûkê*w÷ÏŒEš£fg EÓØ-ɦm bëÏâ&ô~²ââ¿feZØ«OüND<îO*H[$m’JbÇàë% °‡jÙ5VzÃÂo=÷Óyiú¡äµ·?ñÛ»¦Ð«ŽÁ øÉÛì…c:¦îÓgŠœoÌÂeŠe{÷›Â2`¨O×9ç (ž4R6³çÕÎ)"y׺uMŒ™iÆ1gáæCí—¬ Ñb´í˜A9Wƒ_oN [Y‘ÏF¨—ù°d"kkó6D1h ser6ç±LYŸ¦¨²¤(’"K5¾‘/Û¥ŒqF3`”÷ÛªÚ:à”³ü‘JeCÀç´P‘€m‹bÜŸÊ^¸|q’ÔIb+n¤¹ ñ)¦&”† @¶îêA(ŠôúÞøà/.0mÚ£MЧŒ ¡¤þ§Ør( bóކRx¥_SxCˆõFÓ¾°Ožír‰ì‡N­Wº¤Í™¤yè$Q‰Ñ±½½qy·½¨)$»7r6¶¶\->-6(&Ȉ±2¢®}B!œUëm£yÁ Ë¡öŒt œÚôÒ³éiÙæWä}ï»ì–;„¿þ?¾vÖY²ïNtíŒîœP9Q–¥]]»ŽtiÞytäSyŽÑ:cÔ×C]œ e¥³8ÓÀǦìÔÞÞ=…¦už™‹Yõåaá­qÏ‘?¾é­’`9ÄHjŠÂOÖC®Bçü}š3&ª7ÄJBÑ0 òÐai±úvú#³¡Ün{í/¨8…@Ì%JWž9†r0l’µikJÛ4ëдEØÔRÜl¾-nÃê½ÏýbÎ9k×lÞðì*^õÅÍæ¡{ça¶áEp‹7¯œd:,kÓœÍ6íé†B˜qæÒWž~zõÕ Ö|æ+Ð×ú;aW~äêM5u_tÄ}áI à IElxM‰¥ú`Ãg§}üÖç¿qñâ‹…ïÓ5 R Œ‹ƒމ‘5fRa¤ÐÂ]w†r‘‚¾ú{^¸mëoõd'J;¾·˜ö+‡Rõ ço®"(ôìðÈ_ ÃÉ?O»Ñ(£•'{TçD’5 dY+“FÄá¯Yè'‘TíÎñ

9 dÞ‚ZŸOf¬,—•„M&rÆ”[Ê»Þö¹|¾âZŒ€¼wíÁä1e-ÁÂå‰Uc[âˆâ€îŸZÛȘ|°=ÐåS§Ô•USLÆ)‰wµ ‰G*BîºÕlFÐB8+´Ýˆ$ME»=mF&aår9šJt…)!¬("§^Ð'ÔH¾Å,‘Aîý~æ02 ‹º‚T‰ºÄàÇ=q‡ºäY3Æ#Ý÷Ä3{, uwgb]‰Æ±ÁD<ó¡Sý§hà j'M̳í9¶ïЛ›`Ö¢•þº)0ˆ‡ß$ìõ׬„cÆwööÄšÝÄŒ½úÖënðìógçK mã¯^\Ò¤B#0^#FQ”¹~Qȃµ7ß~ñ'n|î¡_œ¾ i#Ź==»…_ôTþð=÷ ‰dÍœIm‘VVäÁi½g&J¥Ü5 éÔʪãjÂù‘ÿ:ÿ£Ÿ#é¥}¼¿j'zeŽ~O Ì✠(o´'-ñU™ö¹î´MâYlH[4c(œóçÕ ëîF g%^¹£Š^uü€¬Esµ ÛøNwán~¨Û®*Ýil8ùÌo¼º÷äþ\ØÂ{)‘>ûÌË'?ûÓ5îðœUÓ…ÝüÒ᎕‡&•kn@Î%‰C¬(õ7¦ÝÞwo}õóN™’T©/×ÃRo¶‡qê—Ãa_xáäÓ~“ݰZ_V뫆‘wÒ_5ºèþ½€gÀ]‘ ìß9ËÁŒób>Lÿ3ïQF œ˜ gÝ›(²ð©b-8Q×j­LÕ# Sjÿt(;uPT*ŒèV=Ü$š $K†¯|²VuÚäék’=;¢/hå€Ï§4MósÎÍt].Ô’D™Î8 ‹¸ã8Èy«¾® ` ÅÈí)ÂŒ †á¥Ýè”ñS+Cå&²«BI3s°ûh.W~<À†«êêû+ 4o™°ŒS,|ràÞØ)d›„`M¡¹t‚© ÖQT)Çq‚8вÄF”IPR8‡XÜ’¥¼ã #Ãrˆ[„éK:0yh¼ÑÜ z¸6 lßÖÚº¯yö$?ñ‘ñ3ãkµÅ³¥Æjž!8#¬C¹Pwßùuáë;÷ž²¬ÜÝçÌŠÞ‡ÛõëwŽ\'`³Ë²jõ …°æšs±cäb»ÕÀ`DZè[G¶#p,´¤i)@kA5±¹yÃw­ºê¢ó¯ºøå'ž:aÄ+Z!(Šâ®T‚Ûþ*xQnæá”J!¸œ\ó³êºuÂR+#)ªð/Æñ”Ÿá¡CÏ«wÐÀfÄð®.ùÜ·ÄÖ@‘wÛÓesà@rFç¼à­?õÙ‡º­Úr-mR‹òdŽ…ƒ0l…Ó™t"e¶š–syéBáj7'˜u]‘ŠØ¥Ñ€h‚r9P§û/›³y…Pããœ?ñvL¹<ò/ZÆ eì¬á˜î—+?Ï%ÅîÙBu‚XçsÊìÙ}v¬¶¼nfåÌ9Õs—Œ[ÖËuUûêi_J8é´™" Ô˜=ò›n³¾¼ÅõçݾÕuÞ¸cÑþØ,œ5çMyöÕ£«–5ÁðÞ€$pFðw=fûgS,£ŒŠF bÇûSR|œ:‘©øË'ËzBU3Õ@e•³­xWŒC!l~ñ€°œ‘S‚<2éV Ï|s¸â DÊŒ¨#¿Ý;}fÄï—8aç–Å•}öÁƒÉã‡2W\3Y÷Q(„Á-F„òIÕ>Â8¥\ØüA!?ÌûP4Hã*ëmììî8ÍÄAÀ!m§ÁÝçaêÀ8%œÑA"¹íFà.t~Q³ìXØ6åÒ˜ñµÄQí\Ÿ™Igr†‘¡F.ä8!5rÎz t¤ ¢jŠ*AÎ"P ²,eM’È¢ª°%âhX¼r\]ùÛ»{þôç–5‹ÊÏYPfc®©R@w %àÏ›š…u ÷Ë€Ïæën¸öÿz gˆHG{Çüô!(Š2a’îu¬¬¿ñSZ戞bÄ(Áq Éþ“Ïž'2Oîn=ÿú; ÓÏ¿ä«/=q÷yÍ?÷¢ùz~eŒw§òO_÷””æ®æ£{Ž …PªïIp)¡BP+Íèþ`”Q,k~. Ù(s J§àFL„G… ¾AÈ¡ Ä'èÍ8š"ËÊ-ÌlÌ @:Ns̉æpƦ”ÖË®5›ßÕšÓueHå²$Qàn< Ë aU‘ÀB!ìZ¼ï´ß×~±îüä’ÛxM8ÿ÷Æ¥œ¶óé¸ÈøZŠbf¬;Ñ›¼!Ä€k #ù³áºg F4 0mÆÔh:z¸ë¦ì©ÝO.ŸvÎÓ×þû®W¨eK_˜ñ•ÃÈ ”ïºkÉü~yðö‹(“(c”ñ5ç51ÂY}ödBÙû'„ó·ÎD†ûdûà¬IeÕËFxœZR~°ÊÉu>—îG&­ D¦±w-ÏÑÐ"‹Vt'L|ظ[Q;†8÷keœS¦Vù«çU4¬”T Êkç…*q´ó@"eÁȘ2#J > –Å2i|äp¦µ9™NñË®ö_xa°,Ä œ½ ´«ÔöuÙðß#þxÀÂŽPÅÖÔù‡{Ú3FŠqàŠ“‰Ôx¹ÎÄ Í°+ (mQ‚cݱÎvË0!Š¢r.;N#ìXHÓÐT%žH£Š°F)7mZЦI’$…‚Z*K+B\‘%ðLWRÉÑpã¤Ê®¸¹ñ•ãKçøÏ]Ö5ɧC q¯øO0k›ðaá~ÿ¾Ÿ|êú«¯¼|œ /Þ÷ˇó'.-T¥«Péôµ7}ò£w^µâº;ªÆ,ûÇã¸mÇeµ ;íð^€ñP8n=áÕçîYzN½8`¸ á™?*NAé8Ú{ôø¡JøË®T(¡Bpl3’‹»[¸ô <ïpl„ XΆÄp‡^°“{¦ ÇÝðZ¼½ïA$tÂÊ«nfÛˆÙÀ4EÆ”!Ê¡@2i‰£H@òò;1.r6ß—#Ñ¡|šä¾ù¸qM•’&Ž®ÊŸŠÖKË\UNÁE錕© ×eœ´OÑ݈Ð'­‰LD‘8«É¸xÐ ˜Ò#‡šï¿ø{Ý$µúêäêú"I‡‚¶c¢ŒSÊßúîâÓ¿±0.` áKİdÚ`˜?0ºp¹€l#øëla0ʨHöe @Øî —] iz$ݳÕW5#‡|œs/"eŽrN80”ÞmfÚÃ5óÃõg¥»ßH÷50FL}½_Ø\'ãx÷ŽôÁ½)U“¯¼&°d‘®û¹ª2wiX¡ü•£°_ÎÚlÍü0”ι ruyMÒÌuÇ»Ãá¢È^sRTö» —OXÆs7И2sv¬puS²¤i!&a‚,Ù¦‘MY¹¬mZ”RÎY+ƒáöªº_©ð«Œ” _Å”ù4¹,¨õ&ÌúJ-PÁ3-}ʘ±eœK?spF¿xq…®Ið¾ñÛwÒŸ­ŽP UàÆÝˆ8x(RaäÚcïú8ÊQ€s§NüÓ£ßÖ"‘¥ÝOQ¹š<ò1G|~ËøÕ7ÜÉ…ÂQeÞš¯lyöûy‘Pr…à2\!x¯$”\!Þèv@î¿{¶¼(„tš‡½!ê®Bpñ®Ü›•—ÔƒÓ'xfWÞ‹_r ºÓŽî·§Ôúï¹ú8ä*lP—¡p¢YÔ•B†CCº¢Èpò¶"|@ÏxÆÁ|—¥ÊÒÉ]O甹ë+FŠÌÎL'Ž€!•„”•V3]Œ3ÊÝœžt‚pž¾úQÆh+KX}A”$‰³Âî»aÂcœÃ–oŸ…pÎ鉅ËÜ8£ðÊ(£ŒŠ„‘|0X²i¦Ry‚iWbîŠ/" ˜µ ÛÆš½b®iâ,m‰Žøæ%tv˜o¿ž|ëÍì¤&åÔ¾ÅKƒÕU\Rˆ,I6z( ÅÈ#Ь0`Éqh>ubõX¿êopB€Ÿè2âŠ#xÙ&v,I­HF{Òñ^dÛŽmÛ¦¡j¾`82qþiU "u ¡H5”¿.«õ…jÚ@š*i Œò jæ×UŸ*­.jJAÆÄ]‡úê«÷9—-|¼oìý,‘$é§¿PW^r^MU˜sÞÒûÍc®ûÈZqJÄ¡@¶u»*. PÆÊcÿï¶êºº•-;¡¾Ë=Ô²dYžsÑ—¶<¯ðÝ©|©H[ÚJBiœ+n†÷ Wçz¯_ zgÓ3½0ˆß]iƒ7âYRWÉûr8 ¿g cJ=Íæ9ÀöcYI’†ÜÔªg<Ð`Ksš²$ïËÄ]gH%aøY:Áma•@ªR*ãM‹L R…ÙÚ/”Ã9_vælW¬X~jMU¹ˆI’4¾¡zÁÜI"î–vÒGÕh>]2õU>µÖm.á’oÏÚKr•—‚TøÁûý{IÂG’´;w”ÏOmõho¿¨Ô{ºØ´ ÌM]¨/Â|P‹]ÈH­Ù[-e$4ñxS<ëqYT£¤ºX’\ôÉtsÊ…R_?I³3 ²PŠ&êó.ÖÒųøÍòê…ò(CF£²l$ —WײƒA,jÐ0¨Áœ²pÛ\Y^’-€$ááîÆ¶káï5h :Àœ|I8>:Ô~²_‡6 ÄlK‚aÿƒ`ˆVýpÿTÏ-@$,{w#WUÆqüÙÍj|I$Q‰ÿ1Æ •îÎvßh»ÝÝ6j)…­¸ M”ÔD¡Õ€i@b`³ oIuÄ¥4iJe[+Vigûʾu_ŠÓ˜(’Š0õ…nwæzfgÎ0g§w^öÎÝý~r{ûÜ;çÎÎÜIÚûÛsÎÌ'%Àœ„„|™Ú®~#eÝÝÝ:Eª ÿÀÿ¶®߃% èéééZ·ZÊn<áäÃ/4D®‘nºE€}{ž|BBeÜòyí¯Z€“MÛ~{ÊUúǬ‹—¬tGj­êC¦Ènài§½á¥» <­µ}H¼¬Ÿ®›úl™Onè¦}aºvžÍnÚãÙgÈnàÙ:Ç;uŽõ²NË–Þ'7ßu‡Ì-æ$ !½íÀiS¼qî|Ž„pmß“Ïüÿ"EÙ{xÂ,&!¬]Q'…øÝ±1Éá…š€»ù¹ÍæËœÛ¥`‹tmSÌø®}ú(æxBPúfÍRB׊ÿ wX‹ÝSFp;tí´Ñ¶Ès`þýÎÙt}÷g;Û°vãO?uù'LN‘ÝGNlZW/ïu["!¼âö0tu,Öâù褈ÜÜ^ûËÉ/&×"²®½V’öšÜÖ´F^L :Z½<²ÿh¢þÂòúÌ„ = «–.‘”ƒÇO¸Ý"¢= ­¦N::4""Ëš™"麦Ɨ‡uKc“$ ‹ŸH}óøØÖµõ-“ム!}söðC‚s±[Àä„BƒÇœNnNÐ¢Ä PŸüœfú ‚;¥¾}8wöµ=?¿ï«›Ÿ:楕«¯Þ»õ[×óñO~üŠž[¯i·ß>nY¹xWô¤NiøRÇâÝÉœ™^˜Ô[ ÞÔVgs‚MûŽ%•Ï/«— ŽŸÐŸ¸ré’èË'²º4'GGõ.¥Ë›4¸G†«$¡©±É7'˜„`rÂÄØ`Icƒ !‘ô Ó½ò !$èO ô@;DGëP¹×úÅ¥‹ ÂÿŒ½îÔº4°ç3(þ8(g>zÿ¾_¼õdãè±¾¿}@.‹né^´~ãU×6Hi4!(íIÈt㊺Œ9 žE{,“LgÂñá‘¥©nÛ“àÏæ„ºdNð ! œ W§¥_«WÏ•ßÇÂÈH6íØð(wTÒìŽ *Ï'è™^ܺþJ³˜„°ææ.³4|øbÿÅâžÌÓ“ÐÈ,Ú9'A‚´¢¥Áô$=:4*9´45šž„¡ä"ùI÷$HÙôB?Ðõ ӭß“àF­/ñ»'½©Å|É 6!dÍO0E@¯Z6<öæ³ZäÓX‹Â>ÁܰÿÔùHBüôhb»8—í<ðŠN\–¢ØáFh¿nÉ€Ž;ò³´)Ñ™ E°s<“š“äíO.Z8Ó}ËÜŸí†RÕ¢âi(òŒ.×üW]}ƒT¸ç6÷~[»…³é¹a:æEÿx~øÏÿ9óö” oîß!)ïN{’C_2'dÞÕ,™—Ýn„<'.›¯J¸¾5"Ì„¸\»¬ÃÜG’28<ÒÒØXÐX#I©ü9 @NÐÆ%\¥zzzfíÆG󑾯°†¯až|ÄE¼wßÞðÔ I¸ýž¿ÿP’Ún¿3æÉ%˜ž„¬¯YKO\Ö »&%Czâ²nîu¢Â¾ÔMôîF:ÕXeN\Öé¬e÷îFn7‚¸¬/,E»܉˺ž?€qGÚ, 5½“°®¤¡ßõ› œ|ÄbÞë?n{2óÌZ¤Íó$.bêi›B¦= ©xàOoî÷$P#sLÇ%žL1Sˆ‘ØôÄ,B{ BB¾¡Èç'$Àš»·KÅ ££# ÆöÙVSɲ1:~JfN>V|æcf©©/c@j­‰'a`ó]w̹ç¯ñÏ%!ÁÀÀ€,Hœ|twwKÙ! yö$ôööJ±à}U$o›îüÞÖÇÍõ; }( øÃä,€EµÍ9'ÿ ¹÷Y^PàîF;wõK·uuJeÀo©@µ”ÑÃÞ?ã²m{Ÿä w‘Ó® ^'Ÿ2o™×Éëœû@HÐ{™{Þ~ôtÌ“˜çÅ´ö<™“9`¸Q¿äÐÙÙ™GHðªDîþÎ×7ÜûIÚöȦxL{ä¡{îý¾ø‰D"’2>>®›™{´»Óòo>ÀÿØ;è(ª3ŽßÝl6@bá ¢P ¼¬h¬˜BPˆF…šÐÁB©ZŪáa+Z¨ZEÔ(`iñ¨b‡Ãát6ÀcT–%Êd¢¸sÛqz§7ⱇ! õmá¨!¬ü‡¥{ïEb–&QÒPMZÍÃ+Þ]õÈà¢R±4œ!8.|cûAB5çm_Lp¸I)Qˆò賯©»³.‡íKOý–$›ØP^×m†AÛÛþñQqàp¸CБO@:‚%ù>¦Ø!€¦!ŠÑœa&=¦vð'(”Š’2ôúûG+èÝ0“oË“nnŸb4´ÅybÎú/Ï-þ3I(ééÝ»74cPrãõzsss'¬(Ò”ãôñCðÆÕ«WÀ ãÝâV[¹õò8Žíþj=ù%´wÎV;!¾Oüzƒ{Þ–¸:ÍmVê×sf½U8[õ Z)Œ?¨?úµëÄ7¾êjØëØ£Gç>×uíw=1è»kŽ~{F’$W£+dIöø<$†¼'/ìù÷ãç¼ôÁË-Úm ‡cJ´t/Š¢(Í+`e‚v›IXýfÑÒùÌ{n…Úí«Þšþ›iIõѶv¦?¾ZÛÃáp‡€ð H‡pþ}áH“ƒŠ"+²ÈhˆÄ·ÉÛâIŠn)~h]æˆ.Ý6ävQZ±¿lͱþÏî  Fë®´ÞV{ùº½õ 35ç‰þ‚*‡øýþšš³ÙœššJ)•eyýúõˆp¡‚,ŸS—覟Ïr¿(TÄ;„·Þ&WîS„@Þ=¿d®jÖpzí Ï­kúJŒf¼±‰y¬±ŽÙO°ÆÚ‡Fz§É'h¥v¶=e¼µCÇMlߣüÞoW”~dó¸{Þ”¥Ë'¸=îéÓ§C) ÂÅ.Ñãñ¸a÷È‘#Ç‘ÆoÒë3Æ]=ºEûB„ÃM‚¢(gY»¬ÙF‘(ÉÏχm¬mhêQˆ~t-?À«ááp8I÷gx¤P­Ús (»Åg ÌŠ»h`Œ©“¸Ÿeú¢û+YpЈ—J^0™FÙPBôq<Ì÷Oq…Ú&*º3 ѱP³ÄN•|vzâH验²ýŒyg ‘Šàg^ó5^Ýëª/O|£Ë$„E±¡¡*Íc”1H(µïÐúe´Iøðø'·üüæ‘WÞØ¢}±Áá&ÊÊ{늯ëj‘©Røè ‰h¯-)Î’§÷ù§I_´ .0Ðñ_4£Î¯ßàp8ÚˆG Ö@g¬C€ÐGoÖâoÆ8uK)U=ì¶oß^§OÐ>Þ'Ze´íCƒ4 Ru—¨¨¥Gñ¤à$7ne4£O­ GR/‘3”p»!©)£]jëKŒH ®€ìhþ/z¾øßùpØ/¨EL7jWÕð3ô 9%|­¿VÄöˆ„jìã•Ùø|BÊ€ŸË¾«`‘Ér1ÿýÊ ‚¢ù5êj„ÒŸ¸(JbÓÿªC@Jiu–ÞeÑmH³£I fKfªßWUMô DÂN— nC°–´4µ3b6Cf‰à°˜-å_|Q”óíOvî!1ŒuI”‘SÆ>_»èƒÃM‚öi§ú9êdƒÆL…Æ1'U{¾ßm  A¢úH翈ß>ÿp8œØˆ§É4ÊáFhD|Ç.­T·Œ1È!PJ!hQYà °7¨Î'1¦„eeÑäkÙ/Ò@˜nÜ£#X©´ pjŠXLFQfY¡Œ´X„%FЀ]ï“<" K t& ïž·©Vëð ö(FüpElkkk¡ØC}W~†>™y­{¾€°ž €,9ì’Bv‡ý'áªf²ýÀÌÒ¢l|>>|#{ì”Y“EÝMŠOhÑ#,ù*Îô?^J?r͉”N—/íb°t  ¾JÎ`ÖLI*Åc_ýÑö}÷ÝGbp#~„£Û¢¥8Ü$¨k EÅÅ‹ÉŇÃÁO.àÑF<¦´Nг¥xIˆ@  ]²¬p>Ÿí¢¹‚{_9T8©¯Ñ`é…›*ð3ÃÚ»÷}Yׯ_7™QБdÅ'Ê[÷{¹]Q® ­`Xáþh>áPe¶ù€êP5-ÿµ%ö±<$5¬Çˆ“'O–$ 5¨÷X¹r%âgè“åhØa=²ÖRÍí»f­PX„ÑP黯GupùÐÙZ”=qþ•dÛw|N~œ83ßX)ýÀ³ŒÜ’§[DTÄÚ ÝCD”RQaÝ:\„Ͷ®H|¹d ?‚6c åçTKåI;¤\¿ÛëEÉTÍ稚H6lØ@â¢ùÆKéÞ‡`óÜùÙ¾ûö½Ö!@["àÈwÂ!¢1VW*›L&µ:/œß³ß˜~V&ÃM‡Ãá t#¢* ëέCÀû„Ì<î-ýÌYý ?ìHpÙwô×ë4›Lðx<Á«ï€Ñ€·Ûí©MÐ&>¬:ì =¾òmyvδgˆÂ¢ÿM³C\Açü±OVyª¬ëqïñô®–2ënººÚ‚‚é!!³í” ²:Ör+AŸùÆKéÇ`€÷!ÀÓNáYF¾ª^¦–3%—©È÷!ðL‡›„è;×ÈÿçÈ¡}Æ'œc‡€÷ ø’ÏÒø}ç€O&ƺº:(.AEuÖÚêRcŸL€¼¬,‡ïnµZÁ!`fè“{n+ʾýþ‡“(Hb8æ8¶ãôNoÄc9B"$êI+€Ä‹ÓÙŒQY–(“‰BT.úL‚Ö'À£Ná @¼SùÍ$ü½» êJ8þŒ´FµÝ~°X©I¡vb³Ñ)jRc_v]p¡l‰K¡ÚÒ/ÝUº˜VZ(E°éÒÚ°¬¬Ð4ÑmSJŠ´"ˆEM:±ÅŠ4BÄ—uµšIµ›äÃô!c<—œäÞçåÞ™ü\Nι÷žsÏL¾ÜgÎ9÷Š_@µÒxÏgƒ\bâMÅ?’1'Ož´–A§ð }Zi›5RÍŒ®s‘®=I’Æl»wï•b„`ß­úÜ”ÿ|ø>§îÝ?Iøî»°8,[Ö- ø!è{P÷&ƒÜ¸.?ðëóF4Bhhˆ‰Css(Cq€i¾Œ$$!4;7Ý£ûÇmâ‡ð(÷Ä?zõdûÜåKl ùÔV)hœð±HƒãµÇõV8C/?¶Z¶ög…¹âÔü©¾N—AÓOþË|dúI?ó˜nÔØØ˜Ö‡6KVä¾@Ûg_ HG€š£ïI0ë•u‚L®¢¢!^‘ØÄsǯEÍÄSst컢î´Ïqµ/çÕSt6bŸi·c5âU×ûL3Faòný÷þ>3_‡’)‚5¶ Áغå„8œé‘O[tÏŒÄf阼±oîÇ…v#šz^n²LØ Ï›uûh"u=ÏTö!û%ÿ}š|ꀖOöHºOœ*//—ÜÀ¢¢ÞÁAq¸9pE¶ùµ-ïï|;'Ÿn …¬—þ˜ç¢ŽKçÏ—ñºEíxµJÓÖ½MOÕ¿022¢ù­;|QðW[BÒÕÓþa°di•x3søs1H0Qý\T;ÕDç™Ái1µŠÊ^ÒôG_—``a³ŒxS7I' û ܧIéëôðEÝD}çô—ëû¯óõ‡SÅ¿–Sgf"¥~Ý©;¤xºQèKÓn &t7KøVœÐÒú™(“Q‹Ä⺮À>êÍ¥»A—¤ÞUÍXgºÕõX¶ð‘Ê¥ÕI¦d$à°!@!Ø{l!ôþÔûxÍÊ7ÞkÔTóºGŒ<I0usf%Ô:CÐØ`ß??ÝòîßË–”‹È‘¯×Ö?Ÿ—# Þu€at–‘n¿bùöW¶iQgi1ÐÓt4 suhT Ûêgk¶íÚ´˜éF1‘ÐØß!‘‚ÀŽ$è‘dT¼ÃV^þ×áûòu14†ЕÊ:ãèö‚æuOv‚„ãoA`×$h„°q]ÁÂòŠkW/Ï÷»Öïš¿ø//ß{¹hviôjçáöȵ*ñÃíw'‹áó+ì«g§ˆé}±>Ë(¾aï?ö˜§åÙ{46°ò¦5÷¡bî±Èqé:~DÆtìÿpl$^V9ñ[í„÷ûГ`à‰FÞì÷!hZ[ÿ°µR9ïžnÔØØxgqÕª5µW/™{ÿCsæÌikÛ·fÍêÒÒÒh4ªéþ¶ÖY……"ÿ—ŒIå¾<ÑhÉÒ*}Z⩈ÄS7¼'¡¤¸dÖÌ‚âââ¾¾>-ΫØ1PøŒ¦£ÅØàÀ/â%<Æ9MÈ&¬hŸã<êr9{]t9s²–½¯’|dŒû'Jêû”) éÁ’Ÿ# ©Ó`àú¡‚´½|º¸ôþ«:G‹¡3îNl–ŽÉ›ŒuÔF¸½ÓnDSÏËMÖ »1á™NöÑDêzž©¬CÖ'Jþûd~€Þ÷û'M‚ …Ä!‹9£;•QE³‹†oÆG¢ZœýÏ•³ý%%³ûúÑ6Žˆ<ðIDÁÿY=Å%Îã¢# ^LTàuةڰòJ{{—¨ÎÕþE»c®Uhù²Å'ˆXØàˇ`$5 ú>„uuk¯,«%"uk몫WèÎêZŒ ^¿îëÿ¦Š-gày©.×õ«çÀÛ““`€‘„l‰ö÷ÿzchf‰„F~Öâ¥ó§tóÏ]ÔT$T8Ý “¼×ØG½¹4b7èÒÔ»ªëL·ºžgjÑyHS—^¹wÒ:šð{çÏÛDDñC‚³‘,$Šk) T”Ô)¡£àK¸¥ã;„&!ÑPQ! „äÖ=F‚*"øÄø”Ÿ½{“óÖæ½â2~y3³·ëböŸ¼˜Íf$÷’Ð4ïÏŸóùÓ8wêé2¼ý¡‰š¦Y…šçyÌ>2]zº›#Ƴë.7Ê wGkA^ið›S@/Ù—0DOº“÷+į‹úàh2©«Éݪú~ãæúÖíúlYVÕ·“Gü¹eV®™,¦ýA`§Ä4ò¾þ, 'éø8.A°JÑ Ç]ŒMD°^ÏÒ–€fx[/Ǥ }£c1]­m ÚTºPú€¯A‘½?C´“7¯à‰£Õߟ«+ ÷Þ¼»VUËÌ£ô Á»E ß/+¾VÛõáÉteT’ly—»i\/E;ñ:H4hÝš™Uêi_ó¢ÝugL† ]tg½ÅM %yˆC¦dìjö¼‘Æ$Ü*M1P‚!Yd/¡=cBÐNB<.Ì~ÿeF¹hËeõÿ AÐÍ@cUþüÙÚ­AþBé %Šl(7N¼îfôy)2l< Ö^‰X[¯°­¦!ϪËH21&'!¦DÀÍJ¾ª‹]Íùe6]/#GXîö§=»¤‰i˜=Pé*s©D¢­ÙËï¥ñ!h'!‚ þYAü‘{ºÀº‘Ýîñ§€˜([E&b¢ñ>nmíÕ1’kð* zIÐN‚ ‚àŸxŒï΃FÑ·?Í4Ê&*£´âRÁÕs<ÔKñ3IA; Åç],ÕUÂt:%)Žv ŠIæËǬ2ÞIž¤f·‰vHÁ—˜ÕKDÀíA; ãçAÆBú‚²‘¦á }—§rçî­áØ0fËØýÙ±énÉb¤i(æž@—1™Ýôf$” ]íÌ_\&i°§žîéú¯5@b8ðš|¶ÿr¹Û¿ºcÄÆPɰ®í&2ÛH^y/¡—üøÃÎý…ÆQE>3Q0’TÑ Hµ‚(Æŧ¶¢ˆ²X)B^jD B ©^Ú–…–¨µ¡`EITDƒñ_×BA¥Å µJ –RR7I¥µKK³›q6‹3KŽÎìÌšÙLòûÙ»sïÙ‡dΜ¹Y2¨$'Ž÷_#~øñçétº··wyVöκñL>W r3ùÌäôª•õ[×·ˆB%A®6f|~méß9}¯¿Z:^4<ôžTìÇã'[[[u¶Ãâuã•àñõw×ݪO+ª0è¾î˜ºQ£»W2…,PIH€ßÈÄ Û?{gzß½G Ÿ½F®;´»ëÎöÍ·ÞuOÕ+ ¼Xnyä Z„÷‘{pàÔÁǰE ‰Ö$Ä_CðÛ¶Ë3½u;Nü•ïk¿EDŽôœM=±AD¦F‡Þìy¾ÿ# í½ ý^ÝÄ/Z8-îV£¨&C€JBŒÜ¬À0 'P‹Ú*£'³+¤È;ZÜò³–Šž0è–…§2ðÇD* 1[°ýšýáÔå‰ó¹s5ùÇ•Y[‚xÏà#©¢oõƒë#k€a´¨' ã59æPIˆ±ž†%b_9ß±ÿ˜m|9³Gæ¬Û¸¥ FòÉÊwõ€rêÓ ‘uKHº»nT»1 S‚òt'Žçn>–Ì„ü¨$Ä@ý·Ó ûÌ÷[¶ä ¶³YgÛb‰8ñlÁ®æõ¡»ºÅ |V»»ÅmpßàF½  ¶÷ÊΛ*ükìnÝF·Ewq]¸pÛõh!ÆTt÷ÐW´Ä•„8s’ÈóÎZbÍe'Gq×v·²©*ÄÒ|› CÐå…ò]Uvð¸-n\:Ìm/|òŠ(c*>Ýý¯(ÂW$‰T1oê¥IˆP¹A+tV [BÜ@«1uKägöa{¹éÙ£OD@%añÏÛ¹¶QÖ¶É¢€¥PWTX“@%o‰nÔ±KP÷à¹Â©Dé®[âT¨$ì=œuã™|®äfò™ÉéU+ë·®o‘åT¨$è\S ,˶¥È›ÊmÚ5œ¹h55HiÊÒ* fMžè‹#Qóš¦Q7÷ãéñƒÛÚw~p"gÕIuþfïþA›ú¢ŽŸˆƒˆVQÄE¨Q¬ÇŠŠŠ¡K è Ô¡âfšBÁJ­í"nm‡€Z *-Qðu¡¤´Ui”þ(m^®/rC®áÝ’Òïgxœœ¼{n·ÞÃá½´æHÅt‘u €I‚hLìz—ÿ—üšþöv4zæjß–í»C§<~5%"?f—[öl¶9»Çãñ~käµz¹±¤bºàº$ÄoìÛªÿ%ñLBÕ…Ãa1D"±³¼8÷f¸·ýÆÐÈÐù®‡ûweûŠM>¸Ò"†ÂÃ}%§p³7°+Uþþ¿“à“@ eú=—|2pób÷àRê婳Ÿ÷_[œOwnŒ\>$åh-P”,º¡T³!"ž7›ys_›ÝóǦU& õ®÷µ¤vÜ~ñèçÀñ‰ñÑ™M²mìnøpG×Þ#Ç*Ÿ ˜Û—*eJõfAëMý@dzdƒ4€·ù1CÐRª°c1¯ù…©ÿÖú;šEd<:sîR»ˆÌdžGîG¯=?è5 æ £Í¨;4P‡0I¨-¥ÔßÁ ŒŽÅ¸b_—š$+35‘½:kéŒøÂœÔ¦`£v @0”zÀçï˜$Ô´£Æ¾/}HüŸZXmÊÍò_­¤•]Aªñî#@©¤Ôf& µ›'ØËˆ¨•…Ðà¤duޚ퓜¶ÎnGY²=ŽÚèŒy³E±ÜÝL«<“PCæÛNí9Žš¾w2£dÕQîU¤M)Ɉ¸qÚQ6‡ïRqQÆë£NêÀ+oÙrØ'`ªüaçŠmb A´ÌÀH *: ajZ6a` *DÁìR¸@rñŸèN¯—b%>û?A>€!¤] †Ç” $ÕÍþ9¾*„WçŒÜZ€Gm>Mvþ¨I²y›$é« ^IgE{øn!:*ǯ6½MD¬ìÂaÔµEª3¯Ò ñJ:p¹“A§—øJÀügP˜ØöWàZœ‘ÂÞ¿çã`'¡~Þíñ,=‡#¨‚¿ ÆàûÄg‡÷o…~`Œ(nññtüÄ‹³ ã߯N‚Îõó6ÓÓ~áé?‚ø°sõ: Ã@8-Œ¬Ì<#ÏÀS0ÂctêÆÈÀ̈ØXØbA,l l*EØ_r×ñwŠ„Iî¾û³Ö>÷ÛüÞ^°DÔ¶#åE‚Z?2 y*SGÐBq‚©‚ì s¢Ò>#ñšªO¢ñDÎ"Í;2 Rø£Ò‘½ä º{ !ë–Ý$êDß„8 T–sb“N>Ú¤ ~ŸF'öÈÆÅMûNBe ßI0S³Ê§¿hrròR¢Ø^]X†ÛY#¬xQ-Ø@XüØ @Èßrƒ) ¢Ëˆ 8Q<%$d L"E>šMÁY¹ð|¡ (e {(*€…qn£Í(øŽfDNÅ$Àe)'&}€É‡$E­‘O×xÿwÜô3 ãÖ;IÆïä䔿º”—| Ïð{èøÊì|ag/ ÐX¿óÎ’¬éÌæhÔ5îTþs±üØÃØR©d3ž)’0éymXã(6þ«€õ_7ò'''/xUí$¤_Ùå<%ËQ¤ü>S¾S¸@ë¸i¾v¶<¡ö3 åë=½ý×üæ­½f׋“ó‡ùÕsõ_È© ÕrüQùä[ q©I~¯àUÙɾ ¯‡²›j÷EUSÈ5ƒÙ€F@üS]i¤JSk4Ã.bGÎ’ôÐ.l£#¶é¯r P¡,@™ÈÏ$”¯÷ìø mÔuÓ|Õ =½.f‹÷z{«Ú˜N«?NNCYéågN´\ß"gÕ°¼äÂŒŠ79šRxÇXØÖ‰6fMe-ÄPêàš6Î\ºÐ‡£õöÑ{§÷Ñ<„yâ `7!ËRNLzÚÉ1y8ˆ*€ö9VÞIødïÞBã¨ÂŽ»¦Äh¢b }P, !H•Q›b,UQ¤ûÒ¦xAB/yhÒR‰/Q-RH">XD0`í**)V©UÒj$I+­]£Íef<»%CÜÎìN63;›ÿ09çÌ™™Ý„]ηßÎ9‘d'O|wµ3~òé©Tª³³s‰Ü“ 3 ™ AÙÕûKóúÆíûz:¶­©ªpdÁÊ{ù`YbÊãmK¿çt½Þ~¥¿ÞÕ×û‘äíǧsÛÛÛ[ZZdžúúúP>â ~'eI­· *GÂÝözWDËÀÿ%¬vÅ/y÷iš3V_¤8Á;(ÃL‚Ž T¹àGrþì¯_÷íèéÕ7­0¡£ƒ"rzlrõm×y÷ÕºK4r †A>SgzHÑŸ38Æa O°ðÿŠê%̳,WoÐO3ž³9"‰XfZ[[Eikk“üL^OõìÝôBwïkÍ<ÿnCm&N‘îþãz©6¾gá3€»¢ÃY¦Êœ*v«§éÃá øüBþæïYè›O3ªÙ’’¿DìgJ$R ?ÇG>~ç¥ÇwL~ùà†;>ëzîâÄHýòŠ¶Í«$»çèïCtg#ç<ªO\€ÙâcïWòùÍ{žüàÜ¿ç¾íûãÚK7ëhúiÀ²ƒ~khŽ)ëß4‚OgÝ'dˆÿìFÉ%2»Q"Ë-äD,zëýk¦kËJóc"„Ol2?÷^?säÍý–íHèt– 'Ø(õL‚#‹€Z)6ެ¸.Çq®D¦ "µUúO¥o {p ³µffm ™Žô‰XBbÜë©g®ºŒà3®Æ €—cbÖrŽý–þáÌ?£¦o™èï‘9—gC‚èç>¸ÝP!.Ž»¤È$DO(„-â\¾Ð|ð¸dl}eì€d5mÝi9R(÷ÛAnY·äy¸nTÕEèIϦD*Ë!“à›7Ð3ë…„TAõTUuZEõW-± “5Ûi–åœ}cíȴ嘭H“ãˆ-bʳ–“` ªþt»w£ª¡…¬RʆΘ‚Ç.ݨé½ú@ï3èþºEb @&!̘$ðugm±³Qe bdªŽ‘Ù†~+€R 2[Åw]U]Õ*âÚm1Ë0È$Äâº_>,EÂJjæ'%T¤Q4K-±¾ï˜ý-—€LBé_wÇÚY»ZÈr!·œ³wÁcz ÷w¨@&LøÞlZô^ÿ“è½éþº¥¸dÈ$€;òÖ-º§GUŸÄ·[1;,™2 o}“–y¦f¦%kzjflüÜí·T½øhƒ pC€LB,®ûþŽܲm;Žd$D'¦Ÿyµoì’][-×$“sCjž€L™„ ’É„[>œúp÷–íûz:¶­©J:[†‡‡¥4PWSs&þ_K]]$™„d$Ÿè‹çë6¯oü»ƒ{·êÕ’Cu0U÷Àb0»ë$TÚV¬<éVŸ­^'"ïý¹Ë²Îÿƒwpïß’¥[L¹¸)Àì1hTA†Âi#Úµ‚9°‘4bcc¥‘¬B*AAìÓVÖ–Ú ‚•` Aщ\lDÐäÝ;—[²s¹_ß¼e¹õ-÷Ǿ¹¹ÉÎ#ìììÞk·Ûr~]$‚|”Ü¥ø~|'ÏÛ÷ìûù•›¾aÆg¢À…u«‡XWŠ*ÇG/c™ð×x&Áí8ÒßwstJ^æà9³õÉ6j2½ƒI![¦1NÁ›Ù!‚SF™æÌ×¥‘±¡• ¾îç÷ޤÞÂJBúüDßÍÆÏNkÿÙ#SW:ýÁÜ]oÍnlv¬¼( ¢ÔR@È>“!„¹.Ób”•¹W–6ÖZ½éåhzÐ] ´®/*«µ'qBé•+4+pNÖa=pHýp Wj…AZ¯ð­àM‹¡çu„àgVò èõ]ãÇï—¿/¾XíØ×û͹²,­ðWÑ7c`b2 B‘ g3¸´ï4C3/ÄÜCäÚ4¿Žs8ÔDÿ¼¾K¨‰ÖW÷%° Ÿ* KFòwY©‰ý먓rÏš_¯:ß6hZ0XŒ„”RUE†@+ ¤4f­ûn­kÇŸ°—þÓž–#¸sÆG™Q¢ô„VþX ;C:êZ>Íp+‘šb=œÊKm¡¢™àvJÐ]î"=‹‡˜ã## Ÿ¸Ützƒ<ࡿʥΠä 1Ì%ä¬sC!„\UÕõ:®ŒKMS·Ò€Q’ú€o‡æñRöžÅÇ]ßB&F±ž „ð9 P”fi¾×ï}›+¾^)Ö¯/³ÅçËÛw.m÷û&Ó;L`b@á$Û¨Ðñ K…¢è§­ëÂÌ \<ú©ÉF„¡}Æ{˜`œ ás2á­G&øÂ‚®?„‚‹Çx åuÓ¶èXDY„r‰rܶŽjÃ^aõ@ÕD— OõˆsÐN!9f€çDM¨9¾ª‚6òúàÛFÅÐA'‘Ü6 Ä£2hoÚxÀŸ\ <“Ðx®Ï´ÌÌIC!dÌÛ{ð¤2¶#$(Ô­Çï ß°ÿ7ê?tsziÃ¥B¦8&”Ä]ýa ¿iu!´u[aÏI@‹„gXI „B`õ73oZžZ&¬$L„ÇOž™´V08Ù9ÃxÅ.²‡°’01B®Ý¸mB „B+ :ËËÓfˆ……œÎòBÜ_ þ—œÕ¯Íÿ†BùÃÞã C~1Ü@'g‹³'ðŒºé‡pãž‚˜(ƒéhâ¤@W± FM;@Éÿ¥i :BûÂk_Æ/¯¤ëîB$áó ! ož§å!3õŒ| K Mû$¸gA0Õz¡ÔÒ”4/yK’<ºž‹ÔÄ7ìHmÌ覮~Ðïo ž›öI(æű;¶àûsWc¦TZjl¡x¸¥½„PÀHÓÀ? QÉ›8ŽÅ! %eûïr€´ nÏÒ{>å@v£;{WóUÄ»7›%ƒ‡ Y !—|\\XöäQ¢Ä…èI=îM"Á‹¨OzØ/ÆKþ……Äì!„I–Õñ¢üŠè.B Š¢èEÉi¥m˜lñx?ízvÞ{“×Eè©W¯ëWÝ5™IUw×K¤”J)·È]ˆ_¨´O?-É×ZºKPQ ±Oð.šc@—Aì‰8Âêò=ÉÄG”)³ ß,æn6È/|,—Qø}GÇêÚJ{®{sç {:¡ðŸ——lAHË–’2„ȶäh¦³Y‰÷:ýƒŽÖÑ.›ü‡uw^×mïË]Ä7 Á†$Dt+m„a>ï~'¡±h4¿´ÎMS»%z„=¥â‘ÁH7” ˆnYs$A]¬ãÝ(ºlO¢QDCõ(SfAìÞ,f‰üˆ¼YÒmÓ¡ ðAåBò މÙ£å(£¡†vHl^B@âSÓÇ™mo›":¾;ÄÐ|SN¯cL¯/]01+p%ݸ’*ò; RÊ £” >5Ôvu}ä÷ã;u;óçäþƒ¿U«UÍ^\LøQãWåBŸð”ñÍBX̦\|3ÖÓrxåÃt­Ýôy(M’„ö‘µV†â Lëçê@†ñ«¼ æH$aÔz掄A ²†ä`ˆµŽ„žGœ,º­cgƒCЄ!mÃpœZŠ•Q‚BÇ5{Ä$y”!Ya¢ºíç<_gò; ”àq#`{çÎY3Z®ï¨n_•NŠô‘d™);Âzò‡)¥ÔM-7ئ~ºU9Õ*¶¯‰eÊ …B¦i`”€BÛ„„´êj#¶d’N/¡:™¦–„`Ô{ZåQæ ™ÀCr$öþ:±†,¬C@žGC¡[dÈ0wÄ 2`}¯šËö$ ò(´ÝmA!¦Õ¬0Q=íÛ~'Á½AÓw^¬Kžžôo­¬¹%‘ç¡JüÈîÄœYŠÁ™.°™$¿“ ššäÖ­šÑÂv1øLêÇð†X„i_¢A?/Qv'p+ÀÁP*Éï$Ø?íƒæÉõ]ž#.b~V½â3„F,QXï%l ¹óO(â§ÉvŠÁŸŽ†*‘!¹W Ço.=о&A>\*} ñ¯ÙB±Xœ˜˜ߎ¨FyÃůùÓ#ù#mš)ü]¤$alJ ;!ì‰É œ¡ãÉ“§fY¡//«¿Ž¦§þ0ÿŸ„`†poé¿þþþP‡ñññ|>ŠOZo‹Ô“±þ•Z-Û3ΆÜC®†bó¯ºx¤‡W¾—™)IÀ4[æKüæŽÇÎs‡K«w Ô- —íBûDÂ¥p™$A9 µÄÀƒ!Þ–Ÿ<È™/–¤3„ÝÍW«×‚’Ëݶ@?³w!rQíYTv9©5—,‰ÜÞ9«$ˆ‚zÑ ,ˆ°A³ä"1/“9ÌI/ñ´¹BÖõ…€(Fo‰àŒÔ Æ`\ ¨ËÞ"›ÃXéMª‹ù=õÓ´µ5;ûMå÷¯îªêš°]¿~ýêäÞð›e„ø,=³ºº&ÔŠ‘ ˜šš*û§Íc$ù¡‡Kð÷_+V.m$n ¥ :gÈçeGÿyeÉáþð'Å*£ Ï=òZ A7"Ä$(ž™ƒsÉö€Å”Ò0Ö’a"߆SöT­PìÈÚì©ÀîFŠ… ìn¼¼‡¼ †5£‡á _/?¯Ñ±(ž„AY€'!‰ ¯Q< €'!Ùõï3Itîï%ízzW”×èˆIhµR÷´^õ]/ˆIbüÂììÍññNvÖÎÒ:»‘àIUˆIÐ-„éé¹NgÞ|R-;.šÃhog¹G‰4CýCÄæÙ4t™R@L1 ºm dÝ·¦‡5eÛXA} ¶pE\(À¯ÑQ‹Ih4RÙl6…¶/3ü˜™q91 CÅää×&ív÷êm–VÈd·ÛM*cKËêíOÿ¸]!•jWè]7үѱ$µZ­òÈýnš–Xd(\3“:Þ(¯qs=ÕI<õ^Y\²^KùöجòO¤w²Ìõ (Ån?˜;Æ-´DV¹Q~µ&u‡·¤R ð$l5Ž/\¾#-ÙtbáØ¼ºJÇ•­ s¥Á*e!&U«Ô€Âf^éR”«ß«^ip³”'RzCïd+{{OÿíâxâÏ‘[½t2è#]{jS;â—©Œõìö]ç‰çÙU G ýØÝ(†Á ½^Ïݵ/ݹ3)ää‘}&]þäô‹¯¾yëÖ-#ÿðû!_D4ü3ßÒB¨ŽZZ¡e"OYÆÈ‘±‹"W%[+Ke…-S*]ä3ÁF°Ê- žk Á}±Ë2mµN$^vì9dÒ—Ž&b“€õXyKwàIÕ` OB%lÂØúÊ͵SW~igÒQö’·,9Êš¥ðŽ Wvsµ~ˆàI€pž„øx"øJÚ65,-Ÿ3©2v«ãQ+{rýˆB”ê”ThªÄ•¾{Õ+=ãu«TzCjÊ÷€ÞT` " …ñ$„Œ^À“Ðl6ËÏ7Ÿv÷2ʘxù¥æŸ/ÎõÂþg×V¯ùÂU}ÞZ9Õͽ!+ A»·|-¥žE¶D¹¾„F®RåS .YF)T Þµr¡fÒj‚n„*cܰ·Ä]½n÷@q×EO‚ˆ:°1ÊFÖÙ»·`Ûld´¾¾(ªØ»±àIˆ¸¬è+̈»§R£_þÙ…,N•Ûc."À“ [ Uâ}—Ξy÷£?2q÷…«×EË,L< ¬8< Ð= :3ç` „è ºøâr|OB|O¯Ñ±(ž„AYÀH^£xOÂ@L‚N«•º§õ:1Ä,¦eØÝH·fgoŽw²³v–ÖÙ–€)Q€˜ÝB˜žžëtæÍ'Õ²ã¢9Œfqñv–{$‘H3Ô/0DlžM”)õñ©þ[1 ¼Fï‹aXY÷-¤éaMÙ6–CPß‚(\èC¡×²JôàI€À_ Ö?UÄ$4 ©l6›‰BÛ—~4aÄ 1) &°øNB jµZåñàÝ4-±.ÈP¸f&u(¼Q^ãæzª“yê½²¸d½–òí±YåŸHïd™ë6Ћ•=S¾—On+¸²=í¤ xâs|áòiɦ ÇæÕU(®l™+'§­RbRµºA (lFá•.E¹ú½ê•7Ky"¥7ÔN–UȺôßNû¥ôßð$ÀÆ*#»ÜH*Mje+¸—%Õ< µ Gp£dZÌÉ#ûÌ1õàïÍ=uô'̱ºº6äKS†ö:Äj~µ4k™ô)=]'Š Á x0!l À“Ðëõ6,#ôÅ.Ë´Õ:‘xÙ±çIo\::2ËåÁú ¬lÒ€å—ð$àv°Žð$DCÆ(­¯˜#1\;uåüÌÚ?¿GÚ.SÞ¾äð[‰zƒ;.\YÚTj°D› ð$¢Pc!;!< %ü ¥lƒ4O KËçLj…ŒÝêxÔÊž\?¢¥:¥šjq¥ï^õJÏxÝ*ÕÞšò= 7U¢ö’§üí ž„ÿØ»c—Ö8€ã‡8è¿!n’vpÎàCì¨Ð±néà¤ÝÊÛÞèà9Õ]G…®âÐéPp©³¸ ÞqC¯¼{ôŽÄãŒ~?„x9’KRiÉ/¿äÎ…ü€ æ+C¼`ÄeÓÛ©¿<—ó}i«{»¿ÔŸ›Û»íôým¢Êý±³Ü±h]AjÄ”Û: ÖÊÅöâ.vÙ®ôßµÿ&>§ï¿èuä1ðç9OÓôìôˆ8!B “Ðh4fï(ë²[½nßÀ“öt: ôpÑ‚Ž}Ê#Íñà>B4<‰4ëõÈó‰#52 Îh¡Ì³ãW—Ç篺¸ÞO¾Ulßá.¼N2¡‚P>½@„dÜL&¡¨ýƒ–ˆ w£™„ø2 KQ2 â³dª÷¸™í£Ž°˜îŒ™OƒA2?)¢š˜xÀ®dü#„fócee¤—†z~XéÎ.â•O°"@&Á;B¨ÕZ£Q;Ï¥žÔ¤jz½Ó "’D[¼BÜ¡fópmšúÊŠq.äôüg€”ÒYi“Úçí7>©…h6ôFo_j|ƒâ™„ð±)»s I’¹*‡*rš[0»ëÝ/ ð‰€,Ë<¯¤”jea1•Ï6#œ‘K°Ó4GèS²Û°aDæ‰ð/®:0NB·Û-4ÆêP,ÝQºÙ;cÝ&‚ s …ß ÜPDT¼ótAM”s’K xHHXI¥KSXq$ M›Þ¥ sÒÂÊìw™¹ wìIÌ_¬Æã™fç¬h6»k£m‚RtŒ–Q™tNAÆ äËDÓÄX%ÒŽQZ&²J‚j˜åi2Ÿ¦UB94ôwœ~ë„×äcƒ$•”Èfàì?þ; DQݹÿÎUà™™ DÔ:Þf„ƒ†/EËzf=Š=Ÿø–uF¦"3"ZÒQž#íõQÓo8¾ÞHz©D¿+G Ç„³’NZ U,)ÃWjø‚™5º\:ºªJ wN¿£@¬¹ácƒ$唡3¾““rõKšÅñAyúB=¥“È‚Ìm„¨$IåpQC_¦AKäÃwu_Õ2*±ôjèEfÆÒŸPÔâ^8¾í†©£‚e·é%$øÛŒNwfÒzµÕ5ŒJ¥:2Ýißо’;䔲ŸJrøNÂý,{QØn·ñ–ÂxžVƒ«£Ñ(QN§Ó²ìï¢Å ¦KÆt¡™Éi¸ê 3(µ»¶ö@(Jg¯vÃ’Z£€ÓPvU¯ZZ+ w>)ý†7ÝE™¾zÙÉ#dØs8†ƒÁõzý‡f8ìh…ì²wǺQôP† ‚’‹€‚$è Lº”)rPPÒ­ÒÑ…n€ $ JÊ”¡$  XzJèXe¤ãÕ~1g³ÍzßG«hÖãñœñÿ/²ÇöL© àtìyDc: ¬FèàÚã˜vÐIøóëgƒ‘¿“p-•8§ jxßâë(ô>q°&zG¼< ïI˜€‘: # M¦骅4:˜ÍfÓ]kVŸn¼y Þ¸,gÀš„ÉI蹓€»÷¦Ý·Î­|Õ”I,_[Uˆ¦‡Ëô³M ^T]%OÀH‚†¸øØjfkÎ.>­Û@ÎÖBRÞ»üIZþÌçsk&-‘šYh} ÛÈ•®aðÓðt£1×'|ùt–¦GË—34¡âSÿÉ”»Í¶ËrJJo`íËacy[›¡kvʇçÄBÎêl¯¥[!öÕ²I¢(„¤ñk…8Ç*YrV(Ô’T²‘à5]*yêFüÆ5 ôÎbé&ýò.ͬºWJs”JÖÂ/,¶6¼@]Sã´Ï¼Ë=zósÒ`µôËS>Ü5gmH-šªårºVˆn›BŠSK¶­×^{9kþwøC[`$!~[qØV¶×¶KÇjŠmçú¨ô@¯œúð„æÑ”ÔÐCÐ{ òcïô޲}]óX¹¹î°œñ¬Í¢üàG<‘Ÿ9:ËË*¹ïIÒ÷â«f°¿›myHÒß”¬a»£  ‡àý¬è!°ä ŠN¿‰äŒ‡>NïÙoðÚ™íðž„«)¨<>0|F8VY ~ÉñðôÔ–¡S@¤‰/³;Ǽ£Š]ÞTõñCáa>~…xšœ(^ÉX“ +ÔÖÍ¥‰‡­µÐO°1„¼>¡S Øœ~Mè¬t\´üw9[±!^ι~HZ~\)$¿Bü«öO¤eº×n¥³[ n%ëáÃFÿý €5 ~‡ÁOôS¬aQ?›Ù/Ù ·Iž…'y$¥G Ÿ +•m}‚¥t†~BíäÛvwUR™èŸEÁ…B¢¢_#ñƒlP¦lk%o)€5 ÒžÖm?saá²s |u¸%kTnžª ¯ض·À°7ÐÇkN4$PÉkâ„ãããÔ@—7ÑÆÀHB7!ù·ùÑ®’§`$áèð€æÀHÂÖI¸ñÝ™üûöÙNuFÊÝëBÄ; oß½OÛ`$Áï Ä; ûûûi\0›ÍÒ¥ÀH‚ #´]“°··—Æ€îÝ™4xºÑééij ^<–v ¯C¶¯ÆÒ¯)FUIã'¤xÕÅCò³Å^á×êr´Ju¯$:qJb/xºÑÉÉIZ\¿ò7Uzüäiš }ãFß4l§“vy0Œ Æ?NHñªãMzÒy # —€Ôïjð}³G‰ ¢°ˆG0065‰<·104534ð6žÀh0056ð,òT½µºÁ÷±,3MýMu³Ôt×F­U_ƒpbª¨¸fGà%€b—Õa° ‰½sy-zISÏ9{G›R?u<(f ÄÊ)Ö-„ú èà 9‘ ƒ.QPR[|•Mçw¸ˆà"A¢ –f-¯ä×fqÖ‰ž§ˆ&“Ý™ÙI³³?öb±HÓT*ý&[Ë‘Â.F!ÎXŽ´ H^± PW˜<êt¼îë»G„9Ní(ª‘øÀAï§~âxÔ)° gÛ®£)Mãé»¶MKà-Y‘AjïzEûò»´©I¥ir2y(æóù¤"ê “ëO“å¶µü:Zú²u‘“Z×L{×Ô_Ùßf #Sš ÿ8ËÉ6@‘çùïL$Ir¸?`’W2³à7öfÞ1ù•ƒ°/~Õ¾d$ÝEN‡òïò ­åœÀÿç—]»“ðïø”»Î2mNv§ÞonøËö¾rïqÀ5¿øEÂl6k~Ͳ¬gG€eUš l#lÌi¸µ‰å0~Ú7ül%(ŠbY•õr[ÏÏŠU!¬×ëª<:9{{]­>ïïnÏ/¯÷¶ •=&Kvoø„ÐgfôYšAWŠMh—o›7¥Ä·i·«[²»ŽÓ?ú¯/ ¾çßaY’J Ò ¾Ù9{Ð(¢ ŽG±òŽ(v’ZµÓFH%$¥M@°PÑBS(Xhc%ÆÒ"‚ä E8D+QÔJüÀB1]°Ha­†˜»„ 9É„ ì_ß-æÝã÷+ŽÙÙ¹Ù7[ͼy³‘P èßÿÝI˜^yd·B0a÷®šËôއvƕ¹$ÍZ©é‹MðË¢à£FB)ôÊL;t!¦ìÉO1¹îu¦¿·¤7¬•õFÀ‘Ý<; ž,ZÁ„¯_Þ¸~m°Ñ¸sÿQM3ÍþˆºüxZY“«ªÒRHJñ7±Ÿ4E @'ÁwpMèVO[½uôø™h_±Rpß޽… 'ñnÚ2dŠoEÏq1q‘úU¤ÛøePŠðû+Æ~i&_1‚’&Œ© €N‚æì¹ññ“c“÷ÿzó|afº=;s³u÷ÈØéêþ@¬Ü Pí$jdŽ[± —5Úshe¸ ÖbãùÒtøùÇXTeÔ tœæÔíÉfkîý«Î÷Ù¥¹Ÿ›¶í¸°oÏă)ë'ˆ EEKAœ¡/Ž‹ ¡Œ~Ïàm áá“ÖCX©~lÞºÝô‹¿çÿjX‘à¤ô=fŽK‚ ¡¨:€N©ó—láêȰõ¬BÈ`|6ý_i-ŽlGЉ1 ¼z€N‚csvʨ+/-ÌtÚIgÔ¬Êk'_ƒpâÔàr´‰š˜%Gƒ¸°à§ ±†À¿Ú˜ ^‘~tþ1æXK0“`³6peÿПSFöÄço¦'I‚&¦àÒÆÆÂCŠAz8QÐÿu9ÁFXŠGgc®ÐIð:!|5ò8rI€ev®§™ˆ"Ä @HiÓ~JÅ 8Ä×ÓQPÒnGIÁY(é@B ª½EhÃJ+==â±=keß+"ïìŒçÏÛcg>Ÿ£Ý¶-ˆx,¨ÅÓ'Vò½ yì5ê1ÆÐcÉ€ðH@dø ¸Õ±Áê|ÚíþGùâ9U%!ua {´º¬H MÓLÊ_ÿDÙƒèº ÊB¾÷cl„B­1A£ – Ξ“ÖÜ.îcE^•„ÙlæÔ!‚~ÑH˜ø &cc7™˜Ý'A1·«‰Ÿ@vNÉwÜg`û”Œ°ƒb3Ï$¼åº½–+ãY»7–uÍÜeõi)V%aûA¿h¤…jh3ñWNgŸ ¢îÑ&y4)ßyb—4!†Ô™+VÇâìsf˜4tÀt@ÜÔŽWfÉ‚U$åˆ×*‘åæLJqWŠUIðC]ºÒ©$!iÖÂó&:ÙoÑf¶T¥ñŠ=øÜa‚ e€Wĺ!ßÛŸpį /Bœ&ÔÒ¡H@Æ®¡Ëqà³aL¬0ÅõWF8nôñúÔ¯V«Ï®q|tøsh®W0ORYRfIÄÓ!,ÇÛž‰ ‚:ߌJù|&>þö-ö íÅa ß]ãŸÂßd<(‡ø°>7àŒ4iS*G HÌÝ0s·ì{@D6l‹rdŽyæ D)&Å æ¥ø‹½»‰­"9Ã0Ú¶ò'~$F“Bò!Ï&™e²È"˰€MPÄEàÅEHk "Y±"AˆdE ‘Ð’Å(‰ˆfØdÄ  R4^Ùaá $¢Y€-ã{±SrCWç¾¹Uû]w_zž#t©û¹ºªn_„ªüuu;ìIðß}#o¸‚Ë!\˜ß54tùÚ¹¹¹¤"öµGÉ ²ÀM\ÄP34·ŸÝÂþ‰´¬? ÷XÂÙÐ{w÷ÚOHüXeO| ÅGn¡åÛtûWÌž/û]xºB8yä`òÒON½˜@çÏ^Û~ä^‘@ý´,mJ#ñÁh_ùÓõº‚õ€gíÕaHôîntìøèèÑÃ3Wo.ß¹µ¶8ß\Zœž?Ô‹N…u†Ý G´¬ô÷ªKYÈQîÌ ÑT£!ÅÍ_§íÑà9 Í^¹43{}åîíÖ£¥õ•§Ûw6ö:¯ùÕv¥~‘ ÄúS».º„å"ê dtnýÎØ©÷ÞÿÀå6WO·ípñçÏV-3uGsEꧯrxäš(àUÍ$ J$âìø”Ûà®2j=~¸Õw&ïÈI¶˜O h™…xâ²Û‡à®2JËëk«I«™½ú?ø#Ñ:® õã´£â÷?-Þ]`äšdÈ2µÚöö$¸½n™{_\eÔjNÞà‚&ÐR–·Áˆ”Coµ~ñ~õ¨Þ–:™]'È-P ƒÞöU2 ö…4ûñ%Ðç¹ê£díw»·ª8iCÒ®KþîâÕlhÓ È$”»qæô[CÛ]w ›ìÃpz2þ†d:uö!õIèÝåF0õ—©­–µ²Ê•òeíHÙœ?Äi«Ü]æA—±ùB´—ÀÇL èÔ»´é’ýÔi°àY’j‘¯¸x Y}ýŒE‚Ò»È$Ô~ú•ê4YÏҚݭ\A×>Þ™žFo«¦VIä—ô–‚TŽœº‚CêúÔiM/p–´Zà+ IZx¥€L‚Þå3©é‚¡8mD;²SÅ—¢mñcú˜Ú½MOñAJ÷ñòòÊÛ§¿¸0P棸_À0…êߎì»~Ór N©e<š±à‰Ëó›]¦+WxýµÝ½›Ù{éÛî’=| 2€kÂ×±d'PAêë̾øáU«>k3~ê†7E/3޼¯¾£-ìdÜ´{ßÈ®ðéG^˜ß54tùÚ¹¹¹ÄÆžaÀxQ¾Õ=£z¹| AG·%äßj<_?‹×`v`[#m5;UÓxàj¢¬M¶¯èKÆm3>¤â§.Uð|FÏ’v§§‹ŽìÊI•€ç$ø_ϧ+„“Gyf‚;D#Yƒá£\­Ÿ¿ È×ô‘”D(v-Š–m Æ»ë¢ÍH/¢x/R¶~pûÉÔ²¡ã'²¨x›–ç$HÐdÂŽ=zxæêÍå;·Öç›K‹ÓÓã‡cá,+käÞ&Y6ø‚ÓVߤfµÐ\ò1ë}ê,y€ºíO\ž½riföúÊÝÛ­GKë+O¶ïlìß39u¾Ëg0ë2@³ Z¿ì„æcJ›œŠhÕg @&AgçïŒzïý\as…ðdpÛþl5Ù š‹¨ÀÝÔÙñ)·Á]eÔzü0Àž„”Û‡à®2JËëk«I«Þë¬Ù—œE|¶ JkÊ•K[`O‚Û{àv œ9°÷ÅUF­æäý.Øo }+A)Þ– “ ë¹jŲdB™i€L‚. ª§,%} ØH’¤|ç’s掙„ÞPÕD½ªpñâÅ'N„ƒúÓ´àê»–F´O*º0^=ÜݨzèLݽÚÛ‰Vp|ÁÞ…ýp “  Šd¢AQ¾¾FâYk!Þ»k°|Ø“ 73M*`½áËl+l]G–6½‡Û´@&a°ø accãó¹]Ù½~úчoŸn$¢øÃNÛÏ^ëH#„³_êû‹ytTñO¤Áìp  “PÁåFóŸ}’®–—W\áõ×v'fº~èî¦é!rx]+ Q¯ß¦Ç?‘¤:K€L‚Ÿ»ïyÓýq+„ ã¿ýÍÌåk7#?¿÷’ºÒœÃ!’W±@&!þ¨2WØ54äV',òÌwˆF²ÃG¹ YYßæ#¾©º$€i´{Õëp²²ý"ÄÑ`´/mÓ ³HtŸtñÃ; >¾—ºZ¸»Ñ±ã££GÏ\½¹|çÖÚâ|siqzzüPc¬S– +käÞ&]6äëhY"µ¤|5‰[‚ö6‹÷b8<^3~xùðœ„Ù+—ff¯¯Ü½Ýz´´¾òt`ûÎÆþ=¿Ÿ:oyL²_-ô1€uæ]ÀžÍ» n…àrÍýs}åÉඃ_ûFò•¯&UØ“PM&áìø”Ûà®2j=~˜`OBÊíCpW¥åõµÕ¤Õ ìu–Hx#²¯ÓiÇ‚‹hý²7*®Á@ƒÚ¬FAû'’Ê&Úf‰ç³ø©‹'a4#õ­y* FhîÈÇ5XÛ4¸»‘®²µÁ/~òg¿JúIöh…. UÂM“€œC¾¬ÁÿY3<‰÷•ÃiЬø8uZihÓp> mJЇgßQúÖr-SÖHÉóK‘.–|á6óS‚µîndgœ£ëãÕŠ7¢emVïšZ¤Y­lÐ œ]9ì7:ÎpÍîÚ¯ô|j›ñŸjMí×®Ðxìmj:Bƒ52 šFH‰³•Éû\\>Ç­Ÿ™>ú ìK:NC&¡šó©ÁxGÂøÑŒé…-kÓ¿ÍWp4˜TdÊÞ¸<~ü§ü£ôÏô÷G\dddÄ-ÜŸà¤ßk‹´Õ ¬´…@#jÚl¸—¶?K;€¢3-û!´ÀÒ ½»…ÿVÁùì?Û¶ô¡^)ÔÅýW¦ÁÚ™uâÚÓBºHpÞúá÷šK‹ÓÓã‡cÑ«€4}Zà„»Ö ™"½zzÉ^À¾êõëÆMÆ:ƪ©ã|UΧìùõÞ©£"A?€Òk–²ý~µ÷ü^‚¶!e :Ò6 ›àk ìIXþû_ÜÚ q{νfÁõ•§Ûw6öï™ôÛš í0®êiÍ¥ X'hÄPS‚†”<Îþ?Ÿ´µ`|ïÇã –ŽìE¤N-€L‚[4^nHpë÷úîŸoñípåçÏV 3õ*ذ'ÁmSNÿ|k÷7ݶ„ÿn¾GY§é¬@ÇPÏ4È$(·Á]e”–××V“V3ñdÒ/‘¬œEä­¯/‡ˆb]«èÀبö$½ôÈí@8s`ï‹«ŒZÍÉû\0| NôµN\Y#Úu Y©ß{þð§¿&õ™]'äß&J×å²wí4>qÀhãtRWIÐuBÿî¶w­Ù†®˜™¾`øß­ILjÿ»@&EþwëI2 vÀð&‰x• É,ßÈ߆§Ü_:vÚ»ŽÐÎð­Å¾÷xe,ó[Öº:5A&È$%ÏxôñÀušcý`á”/Äj–ß»ÝÂ&ãáÅÿ.¼dêîÕÁïÚþÃÞÙ«HÑDax#.ÁÄÔ@Œ¼ãÉL½…ÓEX/ÁK˜Ø+0qQ ÄEÁÀLX•ýfÿ,,˜Ó̳[縧‡nfÞ— N¿}~j¦šáTª®Þn´qà¡d_s6›M§ÓÉZ#ÿMGxè„ J‚ Ôyùé2”4® ]™ºú^#inÎÉ3.<›n­­—î¿760M¨Ñ<îÓZûÙýÞ$â}ÄVÁ•ýŽct¶¼¥kÅ[ly„D;×:qÙðòù£Å§—|Ýdƒ‘„{·‹.fœ#É&™ñé"?Fu´¶ J‚ X®SÁÄ…SûUó|#„jÈ ©íÐt`ÎtšlåãM¢&£G&ò™â—Ëò1 f‘æ ݇Ÿ”³;bæü=™ß› Íö`;}…fýª1BTIhž>{1ßý0ßýXÎ]ÞÞ~|oë¿IÀ Ç '+Æt:ÅÌzÔ0é3HTI&gÙñè¢`.ÞDÍx”¤¦EO ¾ÛØdל䈞уÿ$ðÑâ­Ç>B¸ؤ5€ÎIàáàë§Ãïߎÿ¼påÚÖÍëåT5ÿ05ËÝá‰ÈœlvMx—€y2æÙGÆÄŸ%’]þÔèx’=h„ JBÙ‡PVUùx¾?9E(—ØÐ[}`çÍΰ¯IÛkF±» ‰“”µß0A8ÙÀ· B÷”+%C‚žä?ìÝ1Jô@`oc!VÃ#x€4Âßü• •åÄ Ø ‚ZˆWY—Bà1û˜•eLø¾B&“™d6Èlfß¾ìrW" qp;ÝLŸtYª³ JYÈÉAúBØ„“V /îõ1á¸På_a»òŒCƒ Ôe(¤Ýã0vX -‡" M¸ó!õ1 9 Å…Ažs¼õæ»´+éÊa3içG+?(Ý5ÞšO+cMìžžºT®í’ ã—Ãìf~q9¬ æ.êã,*Œ€œI¨×þ^°ý+jŸ^<ÇkˆÙ hõzt°€Ù |Öf‘˜ÝöDDÀgmÇUɦµ_+“Àjµêº.­Œ Ærß²8˜dTÉAB¯ä¢5ˆ$ä+„õzýõþ¼)oþ¾>=Þü¿ú#ÏÉ™û‰âsò6KôÐk;€Á´Üð_Èì†uÅ`/÷úõºÞXØíU¼ÌZ€œ„ö®´Š ßS!à;±ÁŸÊÖRAXh%bc¡)"Vb°hl)P,Rh#¢H!‚Z‰?FAL,RXkBÌ‹‰Ë[Ù9ß—½Ù͘Äw|_q|7ofvvs7ûã0õñ­C˜sdÏî]éYÊýå¶ôKWž¿eçøßØÀ$^ ÃîøšŸ0íàù*FàŸü>!vàQ}*øt#XFˆ¤Ë£-”‰ÈEŠmÄ\%z빈G(”=’»©ûTÍ ‚à9 ’ßì?|ÄWC¸}k`gw÷Ý'''U+En€Á¡˜tÚŽ¢‰dصØDUo»¬{ëLðéF˜—¶à¼o Ý5ðJsÙ­ç 8‰u‰è'w3Ë'šAðœüêß.Ÿ=¥žÁìôƒUpâå€P¢ÄMV¼-·¨˜@´j¶*\NVÞv‹Y>ºUt"‘¸kz»¨ƒ@RåãÏ ›CÿôWp•é?}Ä¢Ï?ŒO7‚eÄŠQG„5™œ#Çnâ¯ê€$ZeŒA-±FÍr»m1`C)Ý }¢mÒ(ÁJµ!·áú‰c®†àߌˆ­1è¸ÜÑ_UµÕ9_Ÿ.äêÃÌŸ5GÇMè·Ÿn75B‰"ÏT6„”!4v\áŠ]ÙÒM‚ XI¸un–‘çK óÅbÓ²#d,íÃUÅ(A‡Ëm¤E4©ˆÓ]C~ŒÊ<$…åÄ$¬@GÊí‚OОÄ|¢9jâ Øskü àlÿvü{]ÛUˬ$Ì) ‚ ¸&Á­=p+®Ü÷g–ÑbsðÓW'DMY‘ ©”‹Du¨˜k&È+’ià ÌÑ×%vÝÃÓõó= G ¾ÞH†]Ö_.é9ÞStiþ——[ÜëŸ,º6ç.\Vok<ň•‚ ‚`%AO(ßõÅFí\I$Õ%ÒUèh4‚þøÓ‰ŠmXÛçJñéö›½;6a *â6)ÄÊ12‚3Hº–‚CdœT!Eö±p€ÈåHxëSPîŽûþ 0Iˆ. Ês€I·ÎߟÎæ°WPžoœ ˜ÿ Én ×æ*@v½6E »Å““Ðkkª#ëüç›Ê€0I8T! ·i¿–ûø…ßfÅE.Äϲlì±kAÆ/b•èŸ`ckáYÙz¥m »hÔbE‘ 9 I‚‡¤L#HÚt±¼ÆÆJ-«Me)6*É]<î#CØ}Ùuæv.ç÷+–·ïÞ¼y79ȼ{ón¯Ž™g/0Qâ Œ<|vY6M¬n8fºB= ÓÇSàÖ6®øÈ^zÔZBõ$ˆ¸å<Ï2ã…°8Ó¯æ'e ÉõBÿI+^;NÓÇpÐÈ ?YÕŠÊÌü´¼B•e¸v¨¤ae|xÍÓEŒ˜(í*U €Ù†}òXû¶®OöãcöZ>y8Bì¿&…4Y„¨ø Z·Û…ÐtOÂÚýåÁÁWÈÃoYÿS»Ý~´´ˆc‹+n¡Ç­¡± û´_õñLèiBõ${_å5^.QTØÂ?Îô«Ä°O;H/8¼ÃYI6ÿâ“-Ër ?Ó§wËÁCžv„Š ÕHÓ¸üàí„^§ áùí[.aèõÖîd+v)BAYÐl`Ài`û$yÚBuÒíÞfKˆ¦Nû(‘ YF ¥ѦæÊŒ>{BÄI~½çrW@@†F¿Î-\ή]Ù·5ÛO™å*kc£Т0¡:©A•P Õ6¿Â·áƒ@Æp.¤Üâ ¡$Á%ÙIC‚ËÜuw¿ÿc÷õ…ùKNþstH#¬í> ºA=؃1cz„P1á?FLîD»Õ*±CûÕÀ£ör7ÏW£Õ Ç_"ÄäS= BIƒ6e41»SFßwÖ‘!DiGžùh!„ÐiÖ”)¹]µkÌgÚUªhÉz;—` f©;2Æ–™•½w~ì¹bœ«¤Ÿbòfòvv³„yóÝßΛ°ë`4 SS¡C lú ònµ]QÛ;û:ãSÔù.¿Ã|{¾Zý}Ë¥ûÿ-úª×Yý?$­Ö^Å‚<¤œ'„úCBþգ⠄ssâ·ŒŠ„påÑ‹’ ²ÕŠ[òù…Ë%¿…0µù3¶ÇP9!àŠyä„,!4"$¤œðéjh‡TL¯ŒSégl7‹:i9œÞ9ƒ¤j-¥yâèÙ¬‚A;¥™RÛÔI€šGÏoBíǵ¼]ÐÅÈ q  ª!€û$䓆IƒACBJ£ÑèÙÃ{³½…§Ãõwƒ³§ú«¿†vjÅG˜°é•„"!˘ŠÆ¾o÷ÖyNŸÏaZzsåÒÎ ÀÑÞ¡¹tñüg[Þ¼z*KSε é~xþØ“‡÷vw¶÷äí놌;ÓÕ§ í-÷ïÞ^½üóž™™ßÿük8†Ésê¤U²+þ© ‰‘¾~ÜirHHá˜N/ÿXåž ñ!ñá[®ÆFlç}¾¼Û¬ÚU•g¬©˜ê¤Úãô Gû†ä„¸l÷…ËkkkaÓÊÊÊ[wö?W$›™ïæó>¹â!©ÏV«±Ûe}Ê÷Yý£´e2€ÅÅÅÐЄ„ÐÙ~Zú!t@ýW  ’Њáf:ì¸výfiÔß’@%!Ï ]½™¤0o •„’¡§Û!9!_ •„’¨Û!9¡½ ê-ø ’ î‡䄊 äT\“ ' ’ :B€œ€JBn„PIh²ióú‡Öï÷cLl÷þTÜqÙT<ÿÏýƒÁ ¶ÏpÇå8îLp¤·‡ëaüqõzØtby)Ù¤Ô“èŸ@%!Ž# ÿ²w·!RUqÇÿ3Ž+>DPà; 6hCc‹"¨p‰ž$°XóÕâ¼2|ášn*¡³ºÄêî¦ô dŒÐ›RS(C#´(Œ¢rhMËÝÖÓÝÕuÆÙÇífYŽ3°3§Ùï‡ËáϽsÜ}£÷7çœëŒMãღöTû³åBû®-Z„;º:».èiéæà½}Šk5552›SÇ:\¬6wôSEYŠâ“ò¢É¡„&^ —É:»/ÜþŒÛ„ ñ akPD^yyÍòÇ*ÝœƒAqV^•gHhlhxéé'<Õ«t2A[­µç³ßé©5±àð!Þýsüo.Ä{ßžùg ÖÙ§LBØÓüºÖ¯n}£µyÇ©ï‘òþFsø~…¯ÏåÓ–ÞYá×B[M½{Äâð!þê`¼»/ÖÝ»pel8šÒçx‡ƒk{¶'z=’ÐbÞ\üÏn܀בõ5 ú[¸ €".7²÷  L<˜þ¨°îØi &!˜Z Í Úš‰…ÆÖV)ØðhêÚHr ’¥çWxc‰´ÓµFçMTx÷««©T:òeýв¿í×µ›6K¡tœÝ‘Úš–ÞéÓZD´8òÁÛÚyh[}mS»” HÉ …BfËšùEŠ8Ñá>Ç!Áët¦0™ÁXç"'\I^NFFSÉô¸†„Ѹ×UB0ñàž›ôè<Ö¶aMmKë[‘o'.ÿݾ·µnCƒlïC2Ô/×.I_ô_’Á^IÄ%>ÖtìŠdxÝìž|ªÇD=ùTÛW§4`Zs˜zÒUGú‡ƒÑd4žžçóÎõy|s<â”ÆƒLBHô\HG#ž…·Õ/[b¾û/Ô_?Ë?ô:°ö㯟Ýw¢¯÷¦Ì_$ó$;ÀW`*°§ì¥Gµ]äÅlP¾¯±cå ÓsôHè\ã²ÕÛ3ñ`ñS~Ѻ`ÇÔ =4!$’ãÉÔ¸¸Ð¨ÒÉ„ç7†2;tA‚wÁ"­S±1q"|RRI1 _…xçHY*++µíêêºeæ’Õ“•}ç”>ž{À̦ǮÍÍ™~ÓãΗå'ìÏšœÇ°z§§Ú_U»SëŽ3§–=°ÜìFÐ &3h`p³'!šŠ%ÒºÊHç4!è©(G9AWkNÐã^]e¤s"’ŽI2!N õËÂÛWU®½rzÿ’»´Ñ—2ØÙæñÚî±k›}g–Î)°±sBæžL!3 €à6NdæLÇÈ«vÏÑã$!èÛNíw9Ü“Ðuîl¸e׿æ¶Ý[«ïNÅþKÍá‹Nö.ÿôgß#K+Äãõ?þ°_DÆnJlT;e–Ìsv¾¦.¾2™Cn9i`¿)ï7#Õúïè8#Ú=2Ñ£­ž:‘åÿCp¶Ühå–Oµ>ºkµ¶š 4'˜«N‚¢>¹<´÷É*™ã•J6>)"³êÕF€½4ÈUØpÏ^Sd¯>*9B‚yè7…©³M)X—¦,ª[¿C‹ºõáI=%Bs‚ˆ†³l`Ø´­^ŒY{iPæáÛ¾ÓmBpÿÃÏBBîʦÍVëR~iA¿€Ïу)€äà`¡,x*°cAOUŽËÓ¼ñZk%ÓŸ”<ñÛûµ-äý§v6°Ç,üç4…=e‘¹j €N^dúÝß™ŸÜŠ]›vz@HƒŒ? $tœùq6Œ°q!!ð/{w°5x}õ¬‚ ‚>B‚=_gÙ× ¼íU¡PíY=zôàÙ…@¦ôgûcÂf›Ì÷–É43®ÐÙþdfÛ.ìIøûçw™­³Ó“Ý&¢®þ#㺚’„ív[¦pü#`•߬šÀr>ŽÀž@’H{Þ¾ûXX¯×7ì÷[¥›ËrñÖÀz½.-6›MƒáDü±'áÇÏ_¥%@ß#Ì1Üö$’„—¯^—ž¼˜ ÛZLʻ׆¦ I¸ïîî8¿¸ C7)Ït¨?ßuÙâf޵ìsSd×ûŽ2Pîcï’ØÛp“`5¯‹€ý ß¾|*íøËÓæø£Ú*Ô¤á>Nô?¼S2IÙV“-"ê> ºšî´/ï;Íkn °|¨Î`bM¼ {Ø®¾æÿn•]¹PЗkC¦+ŸèÊéd ÔÌ*ÙIB?z»A_ã€ïÊ¡¦êOC?¡ævúùG_îkz×.ˆó˜Ø06I»5É;lò„CeÅ1¦ïŸ*Ôëk!þKÎÀ“„‘Íü˜;•c“:¹É»Í{k#OÀPªyBW˜$Êç¹DÚÉÂC?H®= v‹"žÖg”s5 h2¾Ûð"_zKØSH5ÓGùñÌk)ø Ô8tkùp÷*–—“-ªéÄ"Ò|ÇQIÔd¸æÆ#b}™Èñß°š`HÇš®)ÆæÉÎæc;•wÇÕÓî5^0 gpM\xßO¸lN þ>G1Cˆû˜GÇôÇÜæ‹“¢ÿ\Ÿ'€$!Žáø£P“—“ÞŽ ¬yÈkÒÓMj9m’^¹Pxò–Šò˜^O÷UƆ§ · HêTj°ÙlÊ"€ý ‡ ÷€$áÙÓ¥%ÀÙéIi 0>Ü6.’Àr£ó‹Ë²,€É€pücïîYã8â0€Ïù…f‹ *R¤rc#ï¡"CÅ}àF•1ÈŠÔ©ªìN ‚ñ¹0ƒ‹. .$d„­B` «2êåÆª°<°°wxc“ ‰nö÷ãXþ7Z•ÏîÎþg÷þù$aqy5´ °½½R>°¶¶Ö¨“°µµÒôûýöÄÄñ¸ÿæÏ÷u G{!Y`e‘˜ƒ˜§d¼Ü¿ÙƒË€·\ àFþCñ³ÜmûONOOc‘eY,Êm9øÛ¯?ê$Œá?£_C¢@ÒËOH 0áTq2ðàÁÃø)Š_ʺ(®ßü¾âíÃvÞG ˲¸=>>ŠÅÜ\Øßqë8Rþu<“WÕK‡8òŵÅèÎE1fÏi”u™å$Tó;>ûmHºNÂîî«¢ ÞÆíáa·''‹A“„¿ê¤<ŽŒcŽ5 ÁŸ¶€ƒðVc[3¿mHºNB¯7_tò¢“0d33ßè$ÔåàREcJkÁ%EzœÊK: eQÌâ¶lÔIÀ:„·88•§I'!.7*‹b­Q¬ãr£ºo7r[±é‹)š i$Ú©\'¡×›‹‹b±´4?;›Çm¬ãHü4ê$`Â0yÏôîC€ÇÓ 88•WÇ[’t„²(—š$Œç 2¹.¿N*¦P}‰Y5éÉ,B¯~mmÒuVV~*‹ò—Ô67oã3 ÀãG·‹ŸKkÀ$ÀMÇ´pt°ðà2Р“ðì! €˜ƒ˜2Þ|’Ðï÷C211d¼ù$acc#œ'@žçõ/’?•ƒŒ_îüj[\^máƒËàñÄêòƒ³:!Y ã¡æ{Ö××§ÿíFÀYŸB¸ªþ:û*ÔÕ )¯Î+¦øíFK÷n…:€Î=C¸ð¿Ìvž¾ëv»ß]û6´ó“„É3„—¯Ÿ¿ÿpøõ•«yžŸ·  ;¢á¿Ÿçtƒ¤ÛÊà¤`ŽMw9’ àÒgöî&´‰( ÃhSº*…n¬hÚTK·.ܸqÓµ "EP!«šJ‹‘Ò³(¥TPÔE)EZt#dÓB‘A¢ ÁM]7HK cÚEpY(ÝÆK†¥_›ùk;cxÎâr3Cîîfî;ßI“¦ivÊ0 ï ¡§÷ÜFù§Î ‰D¢Z­‹E/¿eJ©`g%Ç:›”RÁF‹`"ð“Äìv:Ñ ßb4;ýô„* ñ^Cxÿe±£³}(›9“:õ}µøµüQç—zBÔ €„pi—¸)Îz[Èï:cŠƒG €œqòbê%çÇà~,g€ŒI怠$ˆH–÷ Sv*[÷z¬ã_P¢Û0~;6'‘_•ÝcØ´!à‰f:€…óqý£QV«/{vhÃPÁðH‹d‚ŒÐŽ„C—ùŸèÅVærÒI¯~iÖ¶ë·´$löîWŠð%°uè:…Ë@€c H‹™ @¼¤æ™á/3i¾O4ÝÀIs{Ò´x­Rèp8žÿ6€ŒÏæ‹ÛõÒ}ýÉP¾Dˆ>9ç²d¼û„PÖO‡„ɨ6ëeDƒ>KªþÈï¡I¸?¦ƒj€”R÷ûȦi¢j ão4 ¾IÊïÝÈø÷›„'{wÓÚDp<³Ù -í'Q½´Þ|zARô¢À/ãQ±ú1”Šè'PôÒ|ƒzRÚ ¤Û²i’™q è·:–ݤÿßa™ÝÌ 'ûä™ÉŒÑš «ýãÿ½’”RIh¾\¬ÅQI({Ÿ™!|ðíæ Û*Çñ•„šSz%Af›ÝÍ×÷^¹vÕJœÿeÔö§“Àïa./Êž"D\™•„4º€àÓ†À a«·ÕÉ;Û{ÛK·7Ÿ/¾¸¹ËÜ>Í1q°üêåŸSQ`ïw?jÜéÄÿÓÏþˆ òJ­ Êÿu£V«UÚív`†°³·ãÒƒ®îefNÏ<½ý¤ùÌç  ò‘„Ë>0Š}ÃPº£,,ø‹¨$„PJYk4ËÈ¥£ Á*;}jºžÔ56—EžPÔŠ¿æ”W|t |Êññ1ôé'¾?­> ¨¶0vß,Œb9Z%ùª;å+€JB™!dy–õ²\约i#щ6ºQo¸Táþõ–ë#óԢ˾ƒ|Êñ§O?‘}Æ"¼E ù‰ZäœkŒÚ>m@%A)µ¿a­Ý¿y‚<º—Ö³õµk›Y7›ªO¥*Úa®óÝánÖϲAÆo¹T¨çØ!wUÀ\£Â^Rà³ ’`­õÓÄÚeyt%‚…¥kwîtºÙtv &1Úè¡Ì@[ýéÃg×gÒž«ÆÀ¢ €¹F v€JÂñå nBÑÕ‹W”RÃÚ0Õ©;öt/×ù»Õ÷Ç—!ÄA‚&˜\$M-ïYËŠk ! €5 ÖÚÈ.Ï_ê›~¢cM_÷߬¼=4CKŠe’WäNÁí {#/¼O£* ‡OHÙ.îS>EKãwTx* ív;²ž0?7—ØÄ(³²º’!„©˜Î²ñFGì@|ÕZ6&À/¿’ wL‹ÌÎ^8³öñkÜ,#Pü ×DãÇ]IH|3zëåð<¡¬ õÇ`MBÐt£ŸìÝ1Aà'!£0z;‡ÒÂ-(è\A©p˜‚‚N³‰0“Í÷ÝáÏdæåŸ÷òϑ—7àp< ãUýnô^€PÐ4M2^°“0´ña½œG´Q°Ûn¢³ÞÙ ã& ÷ǸªIRêþ™sŽ^¯eOBñè)ê-€Œÿª“ðdïnv›f¢ {GЪ½lZvð}RY!$”6pÜDK…Ë\6Í‚?)¬@í %îâ4ñŒ ©r{*a NÃû,,×ñXÝ뜜™Ì Z“d·1^y'!¬¥“ÐzÑ<˜«}l…ðíÞ×?T'`[ÊÀöI¨¿“ +„áhøêÎËY«œ?Ì3 ÷.þêTÔö(/Ê;e`¼4æ@'!òk ȲÁ]!l·É`ggýÆÃÖÓ¶ØXÍë}ç¿G2ÀÞïu=_Þùw‚@ù Á†dþÜwÖ@ý¿nÔét¡Ûí–¬v÷wmy0Ò#£ÌÒé¥Ç7µžˆ:af9ÁA*?—Zù"ïw Ì‘O(å ßȇ¶=ÊÆ‚¸È÷t?²B°åÁÏ !SÙâ©ÅFØ0™yоßzæ¨d–àÎ]üdù¤áà(³y~äŠHÜÅøåFId\;ò~1² “Pe…'q<Žè@7£f¨Cmt³Ñ´¥ÂÝ«{¨)EAîR!€éFÅ™Ä?ò#@ÏáH'ТD? “ ” r²,Ëož ö£Íx³ÿ½¿5ÜŠGñBc!RQš¥‰NöÒ½xÇÓ¸ä«êÄMYXÃ0û]>€¹FÁëh) “ «¹vùØ£m¬­_¹½vk0,GËS55¡ÑF§&š©ÎôÇ÷ŸŠÛ5v ˆ–]ÙvÁì§sêüÕ¬I°5€PôÿÅÿ”RiF:²Ç±':yÛ{g?ý½÷‘ÿk€Œ/™LäÏóK‡ËLP>ö†òî7C€;è‘ €N‚pyõÒÄLBšÌLôäõÆY!”|1ç.AE$ˆsq±ð~yÃ/ ”£ÜÏqˆtg¼…§ü„n·ëY'¬®¬„Yh”ÙèõÊUî\„…Ë~ªXœÌ3€¯¹“ Wø÷Î^8ÓÿðÅs{ ܶùãÕw zî:¡® `MB©éF?Ø»c„a   Ä0¤£öHLEg ¶€:V ¤`˜(EhH”XÑ{;üÂ>Ÿÿøzž€Ëõ€Œ³“P> ¥€ŒO¸“°¬š( p:âMÌÈø“„¶[Å >5Ìÿêºþþ>2ç³2^hOÂÈ_$¯ç£ß›æ.¢ŠY~’ðfïŽA›ˆÂŽ_Š ¨ UZcM\4 ˆ‹Î"""¨ÐÉV©4PZC‰‡BÁQt³T;ˆ„.*E‰pÖÖ*‚£ .ñ¸@ÞÑïHž}Éõúøÿ†ãåxw)â—~_¾{}Ž™ø; À¼ÛoS…ã-ï$t¬¹NÂÐØy€û$¨N‚I…03ù!›Ífö¤ÄØ Rã|‚À> vtT…0ýzÊû9·ec§XÏaмÈÄK#Ùó°jáåñ^;6&ù±}&lÚ'A6dÙ _!ôîÞµ0ÿÕ¯R©TµZ-—ËNâì'ŸäûЯ‚pScyÆY Öö_7*‹Žàº®f…05ó8éÌ LŒßšûX~3ÿ²åu€ÚoýðqY¢NEÌäõkÃcñR¾»úõ/Žëp†C~Y%à “ƒZrÿ_OMN?ØÙ»#ŸÏoÚ¼adt¸P¼²´ðýUåiÓ:A&µqÞc?@ÿëÃÈ9‘A$ëƒrýîŠî…ƒˆ€NBòÈ ¡ôâN:Óí^½îW¿ýñcîÍ\á’çyOÞÝÕ¨Ô׊áYÞc?@?« n¨ùò> I_z³>º „öõƒ Ÿ 6OÇÛ…Ò‘3ûü:áþóñ‘¾{kuB_îtåSÅ_ŸpêàE½'Ž’¿&Ò†ín@u¡ÿÚä>â %3Ï ²'O:q`ÿ> Õ€„×.Ëc V'\8>êyŸÏ^>áWþñÛ⮞NU!´ÓlˆcÀ–ín@ºo^Z§4t–ÌH€èVÇ€Á#ˆè$¬ªz?áFièdÿ±Å/KÝ=ÛÎŽmÕ2Ÿ‰ «ˆ\WÐ`ŽÈõåƒFj^/$ï#ENê Ù[<â`MB«û +®ÜGƒÛÓ[û^BÌyý@aY* 3Y¼Œž&ÆâdÃùr‚Ö…´cS7”̃ ×u[ÒOÐX©Ü0Ë1Ï{’Àß“«ĸµÆÀ°N`o4¾ ³@Œ·»“С†1n½løÏD…¬¸“ õ¸Ñ?öîСŠè#0 ‚:tCáŠ` 8V@"†|ùÓ@Jšs¨»iÒ››Vh[)§ó5ï`“ðù%BÔrÎÈxÃMÂlòŒ¯Úm×õgÇÃ>FëþÚoÐ$ ¯ù_5 @Jiü{d)%º2^Ñ$ô¹I;E»ñ_mÞìOhEÇßAPA(H•€g‘VP!§Ú?J%iT^ [<ôàÚ‹’K "bbAÁK+”nZZ"‡ÐI°)Ö$>’~üè´P0 Ž—[·þ‡.LVÕSÛ öÝm×yH³O£¥:T6¸ÂŽÏÝXû+Ò ív; ê}}9îOxhòoØXöèШÎVR¼Ì6þßE® ò*ùWB!@½W7êv»šØëõ2*„å_ÏMlý`æÀÉŸ]½¾rqí§‘ê‚öœ¹š’ìÙÇöÓ ¤1;Ú{ÕjG¨}IÑÚpŸ¿¤Ø*GÉ^!º—óbõZìͤ›Ë'±4tU$b@Üeæ—#MiÙ ð$xwîs2:{þÌöÏÎÏÏ?ùÔã³sGºGoÝøû—Õïœ:!Kÿ#Þ”€G?Cvt¥ªè»C{®–Ñ]Ô ÅH.Ò,Ç›j?-Em&±Ÿ¿3®d®íع/ÖÕ¬ºénVµ¬X~ e¹„·äž„RQ…°ôãçcÛz})„û÷DáñÞ§3 ‡úýþ·—¾0ÌØD<úFš0DÁ½%¥g\ýKv¿þ—ÄJ7«‡Nhø‚œxFçCHFÂ0L~5 ›žÓš5E~ Uܾq É^…moO‚k+Ã0ŒBý[\\œœœ 6‰ÈZøDéA6öì{á¿òßþâçc±/"ÈF+AZb:s5’bYsÍ^’5JàrÐÀÜA?»ò(o&Üãqùì¡SŒØ“ «z°îO™Êþë»75â°¬¹šUèì¦ÀÚÜãu_ÝÈÌ1ðÔ F!3¤Àý«ùp{(„ò&.ë§—=«IBÖš`u£L—ÿeïqˆ¡ €~‡AP‡®ÃàP¸"8W@"8 Y»i %Í{X7Ù¤“i+´­€Óù€Œwq»ÑçI„¨äœñ†›„Ùä_µÛ®#ê¿ û­ûß.Èxƒ&axÍÿªIRJãÏ#K)Ñ5ñŠ&¡ÏMØ)Ú-€Œÿj“ðfï~B›ˆ‚ïª ¨XüS•4ÑÁ‹‚ âED/ÞDD­ôÖZ+ ”ÖƒÔ`¡èQTÂcúØ\Jfû¦³/¯÷$éö Ç[ÞIXÖq„‘©> ç$8‚9q9›Í¦w$­È8 Ò ¨™WÍÿ²Ú8'!©fžOW¿Î®[ÝÉdBXúÈ| YkI¶yÙ®x¹ªztš®z·o›ŸûhêÛ¶¥Nð»!ª“s?^ÿÙO> “ Âô³ûÝ=]ùÁ-©³ïÊ/æžHà·è±š$oh/(3¾WF§SÀÉAÏX'q4'.K…poæVª·'ŸÏ¯éZ56>Z˜8¿8ÿùiå¡mÛµZ­\.ëwC³Ð¯úºß}òöô,Ï¿{f´Ø¦(ãÜ”¤Ž&±='A¯Jo$Ó‰â…K¦Bøþ퇧ŠWr…¡jµúàÕÍFêï ÎYëȼ¶|‘™xW €¾&ðÍ2e&ªR^„™ÂØ“`˜ ‘ñj¡´ÿÄ®¾ÃgM=08Ö_¯ÌØŸ;^y_ÙX{lÏ¥Bz³Óûª:¯…t!ê¬NÔñ°'!üN‚úèÔ ¦ŸpùîøÉsGî\{dÆO _RéD  ÁYµ8±hQ¯@;žL@R`O‚»N˜,8´ða1±uÓ©}£ž A'OI¬Þõö$˜ÑwÆÐ®Œ’˜&øç¼’ÔaÀž½N(ÞÞœ\?pàbÐ A¿Óé šø/wÉÿIïÚ"Е· -gõd0œ“ uÂÄéëC'ƒTòOÍ:u#Üo éÑLü¶4½Aüä8'.K ßeþù:Ä@ŽÓI_ÓÒVßnô‡½;ÄA†ÂüH Aº7Ä…+‚c Àq$‚àf!-Û÷ îO“¾ü¯Ÿ$Ô€ÓùÓ2n»Q È9 ã=n7ZÌžñSínñý™Àñ°ÎF킌÷0Ix½—ƒš$)¥îï‘¥”5ñ‰þ“P=E½ñu>ìÛ¡ À ÀÓaHÆ`VÆ@"˜AëXCr—ü¯>á'Øk? ãÇ—„ðçcï©a ò¨ƒ˜\ rON¬’w5¾øŸ’ŽË½;$„†  ùÜĸ¼xb€ØŠìÍ“ð3ð$\öîØ€‚¨Â6 ¹ÊæV‰Â>6ÐHPÜà/ð‹ûÿIv º3À~äþ¾$I’ô²“°Ø»{•ˆ0 £±,ÄeÜlvµAW,,¬ö ¼±Ú+X¶ì´Ð ±ó´ð#hc'hv ‚«`7¤˜ 5!®>§ø†ÌÔóòe’|ÉcÃÎÅñT¥<¸×öÊZ³Ùt]ל1t¢HçÐT‘7`´¿nÔétDL·Û ¨Tpxz4Qœ>U‘Lºgz²¸“>˲Ä©¾JÞ¯êkÏŸ,ÞüÁ·úšž4Í]CϘw¸“*ÝI¸¾<)Vg^ú~ÅqTN°ú[A{!>£jdF>ØçóDÆ@NHX[­–ñÎãyôô@JþyB¼ê÷… µ­Û³¡÷XoÌ={}g¶ÑvÕr×u3ºm†çsú†Wýó RÊ !¨Aäîr¼FªUûw7O^¯\³7ªóÙ$ Fì¢h&¤dLŒ×u¥”›öBÉ®eœÌ-‚¿ÛR@Š À;{÷EµÆqü™Rþ$$IL|ÁÑV*`bèŤ…(V4Ä`bb¸‰D½Hú‚øÒˆ/Œ1*/4$&ˆ¦‚5%—[¸5‘?ŠÂ Œ÷¢†”¶»ÝíÎÎ9çqº™–Ýt˶nûý°Lž™œnv&Ùôüæœ3É5 ªZvNˆF!ÂzP÷Ä¢‚ÒOCºRiÉöñ‘*€'Ã!!9ªìœnË› ”¬“G’ÍJ¶‰êªŸ€¤Õ÷{ßKøŽÿ½CB¼ê`袄î’w¯X)ðqu“$$gTBT?qH¤Z©B`wËÀwü:9!Oˆ¨  ¡¡Að/•Âm¥Ö$Œ÷|q üɾŒ-ßñøM*(#ÀðßÖ¯ $­ —Ķ˜ þjI<ÝàiH• ­­­Àš„%‹þx²]ðt#„ $â#PvN‘ËYÓ™ _AGƤzm:çºzMoÞFç2¾†DäÛUd¬ZóÕ¤¨Pc±š7ê—ÍiWÎX«½ÆI¨Ú¯ 9ãëoéJûélÐÉw§ƒî?• z²’õŹxhbû™ "FưŸ½CDœjgÊOeƒtO¾£+÷ûÅlÆ÷r¾Q­ W „„Œo÷·“nš<>|ÉUÎôÊØ–¼P¡)7Oœ"GÏU!áBÚ¬_z·  "žªŠç©SQãô…ƒÇåZ6^cÁòE·I)/üEª ÿ»èK?ª¢âiHD>¼õûkîQ•À:¨~ÖœS'þ[ ñn¸•~Љv¯zÏè`b·¤øDíG\ò¼ŠŸË`?yϬIèú8íãT¢ý…oÿ°ï_õN¥¸¸÷_“Gâf7¼§;ü=æ]o-zÝŽAôæ«£gÖ$䈼ÿùOÿ|ªîƒ/N‹Èò'êî\óégúº¶c›æJÅÅC ý·É›ññn"‡DE¢Y¼[öhÃÙÎë䄵©¨ˆz¢Z4!$ÏN ’ŸeÕ©:q¢ ¶ýðå+õN=çÔ©¨ô9¶y®-$‡¢Ô80 }Ž~E—”÷¶ªz©ÇŠr‚'Ÿm]µtÝ“»°xåj“=d~ 2¿ÿòο)Ò$U Œ$øãŒScõÑwN‰HÞ¨BB¸mc¶¸èéFè©W“Â1"NDvo{ù™¦OŒß‘:·7¾î“§Š7nÞu°åˆô3ÿ±5AJ$ÛÿDªpá2 VO6ß?³¾Û4Ç:Ï:g.j˜æTÂbÁƒ·ëdÄÄky£ºd˨HüÔPMzµ3*vN“»hý®Æe+EºÀY?Œ &{¾ä‡/ùpØä’ëÒ틼°×8}æìO¶KiRÿ^m×ö™ÆªS¹oÃÑp~‘ªX+NC¢¢Îy*jœÞµñô©UF rbOóãÏ-³ùÎýŸ¶HÁÂ%Ù|Êæ.½>œ-{ºÑpv·8tèP­ R`4´mœ7¢ªö¯…ËuV®@˜ö~Ü<ÿÑé ¦y^ç˧ÿïlÖå»ã„P½Àt£[×~/ƒGNøzOó5W÷’ ÊžA„j1jdˆ öOöî€ ñ‹91¹x¸SßâŸuÂú±oöëЂ‚½¾ÊŠîƒC°‰ºî„$ë?ÀtÝ>ìÝÁnÔ0àPåm@‚[y<ˆGŽ{„Hð>TBÚHý‘ãõtq¢~Ÿªjë8Î$Îafã¨kl˜ðN H €"P$Š@‘ðîÃÇ¥"G;$r¦^U0¬ÙدßþW ¸ëéÏÆçv„¹u8¤ùÞ×$´á @n*LAì^ˆªÐmð yÆœž HÈœfz63a´—´ë– :¼zØY1ìXî–úëêmÓ‰æàáÖ4èïϳÔ'·v¶dN™îÃEÌñgÆœ‰Ý5ÔΑÛ}ŠÑ8n¶fªÕ9gsøªLå6f4æ8•ùj?ëÈKq–ª`­}­›¶­Ù?c´]wÉßõå:˜ë¹]Ž<Ö'eçÝZ=óÒ?S…KáíÝBümÞ`ín¡ÊkêÎP$¤\S1ñ5Ó¬ 2#¨U*Áô÷Éø +yJÑÖ;×o¡¹o€ôß-ý3u®…|ëKg{›ž\<mW’à{ïR9ûŒ-£/¤ïmÿ´ÖÃÈ–ºúIeï$Üšr%ˆ×ŸüB÷Ùça9­˟CU)L)oê‘´¯ÕÜ0êƒçg‡îݳs6žàIBsy÷ÖROë¹`†”17Î+G¸¶ä°Ù­³OçÖy‹ðŸ{µ[ZцƉdœyµÇN¹?†úÝ›ý‡È·Û‡Np>€7OÉÊÛ÷¿~_(<‘8xœÙbj²3Ÿ¿|½\.ë2€øú|òËÌ Àr#uÂ)‚ÌÓÑØ€‡åu €"P$Š>Õú÷C‘€"Eàÿ$üa'Ž `ÍzœwBà úÖÓÀ ›´ùWEøÑÖ€0~!•ªIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-10.png0000644000175000017500000002277210536106572024735 0ustar gregoagregoa‰PNG  IHDRö\BÞ%ÁIDATx^ìű Aã*”FT* ÄòלN—<à‘v-;qL ¬~:0¢ïƒ.ò«ß IöaïnƒãªÊ8€ÿŸÝ»›Í¦IšØÚ€Ô–j_hCIE°†i…Šggüâ8*o ”6´BkSZ|AÐŽß:~ÐÇáƒ(bEG PÛb mê€1¤/†¦i“îîÝ볞ôÙÛ»eÙÝdKÂüsæÌ¹gvïÞm¦;ÿ9ç¹»ž;8°o7Þ/ˆˆˆˆbxß!"""òrõ­;1a"rÞÃÐô¹3ö€Ò3ˆëì°äœ€M•y‰Ò“ˆHÉü¼þðl};ÑëÌ×ÿúí°ªë·§DO^íõ×þ·®ýúm5^¿ÍÈ…¹~‰Ì×ò·®ÿõÛ€Ÿ•]??+øYÁÏŠÚ-OŒDœóÛµó‹x77~ég˜bˆˆˆˆ¼2ù¦u°/ã#ÕÞ‘õ‘ƒ6dtk[ª¹¹±±qèØ‘›V¯ÜõTïä¦"""¢/\ÕŠŠ­Y³æ+;¯(âh¾¹øD_Öƒ2Co5´uˆ€ÀJ4`thà«·®½´E0ÕQ¦/"¢ªî…úåãOVºŠ£ùfÁ™¾\‚ô¬ŽœÏÃŒ¸xI4µ¶åN}îók=$0å‘€ˆˆ<œOÿO¿|æT0’?X£45ÆRM#w§Æðöp ZZLÜ:üc„ÌXô TìÄË?0sé¨Ìñ—¾àË¿‰sÝû=„Ìîºu6ð|€¹«ºÝá¿ŸÛ `Þ5÷còüóOØxášÍ‡ÿ¸ !‹oØàÐÓ²äÆïà\¯ü¾!K?݃i‚ˆˆ¨³k%û²âðLÕ7Ïœ- ½E]‰+®It®HÌ]Ÿ1S#²yqt¬ˆÍ¼DÂÀ "š~Ý…›‘¾¡b­KïІ‰²dó-nŽîý..¬¯êÖ†IõÑÕhùݰY[$Ü,þäm%ù&œl¶jðòS0Y”ÑXÉ7µ¬âÌéL"/¾Ü(²™|ÖGLĤe~^$ÃcÁ±_Gƒ#ÊrA§yñm'=Ö²ä6Ã+&›Ën·%[Åy[Ïjë¼Ó þ»ÿ6Ù~ù]ᵜYº–SÖ‘=ß0gÅ=ƒ{ÖÀà߯Y]¹À›/nGÈÅWÝçoüõ!›¼äë¼¾{ ã ¯ïî™»Ò <·Õå›ð*Nÿ³50ÿZDð¯g¶Øä¥×mÂ…eK8q´-»©À'×CñÍÛüã·÷!dùg¶¿ô›uãã[¶»Á¾'îÅY]ŸÝ:#""¦M6Úì°Æ¯þóR"^ ñ‰@Db@C;f­”ôByu_þ/?ÉïÏçO)A%4ß°|Ó²ävmN¼ò([¿±|Ó¶ìNm†ö?bù¦½ó. 7–oÜF•Ë7•Ð|ÀòMÇ•÷j‹„›‹>¾N›K6ÖèêõÚ,Ü8šo¢UÚìÐòͼkï×à_½[,ßÌ¿n£†›zä›Cبíà®ûQ±¿Û`ÙÍÛ´ØŠ;—¯}HÍ7šr´ÆO¬³|sÅ-;\¸Ùûk=¬;""bʱAíµ81 ‚$üb:N£i^,›Ì9äìñ™Ñ !‰x’…±ŠœH-Ž[Å ‚ x5±Š«Å±uë75øÏ ÛPBWq*yGý½Ñ=# :‘ˆóꟴñG®ÿ6ÞMßÓ›¬'¼Qe_š:—}j+ʰ…œ©Šˆˆ(²Q¥)§Æˆƒ0†xÒ†X'rÇ÷ùCoÁš›ó¤Á @þ<µ8"‚‰qK8 Rc- ˜$n G‰ Zn G ÜúmT½öÌæpÊY ±¦š‹v…8vrSZq\ÉŸÃ-á¦""bűŽ-åT½Q%"ñ6Ä;ó‡ŸÏœz!‡á •ÄŒf¤ShJË#é!‘@…ÈRŽ6¼§´ gšÞTEDDÌ7á SÓFU{öÇöû™£A<ƒd1<ÄFsOó 1TK+޵gøà£árcÇ*޵ÇmTYűVáh9Ž6+7Ö*­5¶rcTcÎÇîÑrœ·^Ü.7vÞüÛv+7v½–ãØF•U‡iűÞ7nåÆ6¯ÇZŽã6ª¬â8Rk\õã«„ÈÄÂMwä¦q­8ÖrœhÅqY® GËq´Y¹1DPgDDÄ*SûF•ÿZÆ?ˆ/4ÀÏi$OÃoD Ð#/…ø9[T±Š‰¤œÈoq•¦œÒŸûÒ”>´/Å‘Ò-ª\q·mèXʉü´ž•ÛÎŽe;±”#±Bc9›rDÄ¥"Uö¢•ß1nO±¯Æ±‹QV‘Sþ”ZŽzŠDv©"³®ÊØÆ"b·S…SŽ]Æ´ADDüê¿`,ˆ7 ÈBâÀiäQ$Ó:F¦Ñ"z~õì ÊnoÕd"""¢r¿Ì`j/7ÖK Ÿ’ð2@^ù$”߀x ›~> ùÆ…¼‡l»J0E‘þ²æä¯âhpÙµ³eu­ð0Ô‘þrx=6ª¦w|!"""òþÇÞݤDÃqŽ’Û(èî}Oã7žÃà-fáÒeꪂžGÄD&i-“ù(ú<±ÿÆd¡?bÒ†ožg¡Þ+•ƒÃ0€ˆ âˆ8" âˆ8"€ˆ âˆ8€ˆs|ú?C B³öÞâôÀñÚ?†Z{8€¸V¾ÉõGR%Ö¯~)Û¤Ò×á~r¥üx±y¢%g Z%¿R©¶Y)Žõ3 6.—¿Ú›û)cP{âDœúüÊ–Ó”ý¤Éž¦!;ª>ÿ=´ß½QåRž¶þ³89åäÓT)Úä«©^ÍIe›RÙæÇ8X…£“o/Oaö»`q{×u] »²³ €èi~ ï¨qD°Ü¸»³ç—ã9€8ý¦fn®¯B3Dœ¬ïûð'×¢mû ùt kqpMÇÚ=¤»ïò˜>èxƒz±AcosZŒÞÜ/ˆáwÃ$ÁüŸW þØÀ,|°wÅ*AÔ„@~ÆÂt‡Ø¶‚à7؈àï( ~ Â5‚],,Ek<Ôþbp1÷â¼$›°á˜‡ÈdvçÍÎä`gç®÷¦Ž®©ô¨Y ýžR NÑ­à|_ω.ôQÔch4?ŠICóëÁÉô‘è¡êš“Рh;¬?< ëâDQä„¢(üÙ öSö"”Cn‚¢ñ?a£S'Sh‚‚“Aãd` U¾ø"ùáñê §†œ d@™¾UýI:'ºƒÁJœè×7³8Ž‹bwg»øEÛ,Ëœçy7ïÈ&„«ß]ÜP[ÎA7²ý“ù´ à^°zè1ÿT¿SŠpDY2¬Ä¹ÝOKùéùåôìü`•8RˆHiâ]ßXYcePï×E}¶<»ûE!‡~'Ãg^û8Bþ– CÄ«ëßMKùõíýc>ŸlM..¯J}·2Å»2¢üƒ?¡ür|aÎßú÷YÕߨ¢PÖƒehç@ª9¬í·0¬‹Ç‘«o>¿¿Ò4M’Äi: ÏshÉÐ9¢/5KÍ!F(C8ÍEV²`S¤ºÖ@4ýC\8~T:™˜ ”(p¨Þ o«8™æGY 5Gè™WïÿÖa–žÀ¶©ûaï~^Û8¢Žï* ‚þ½9àôäLè¥ÐCÁZ—†úhK(BoB·ÞÔCé5"†‚öÍM${cdHNM 9Å(”œb7Q~@Óe§c-Ùu÷Ùí®¥Ym¿̲;z)$!/oßÎüŸ®þû07¿X_nà W7>ié¿¥¥¥qŽG«8¿·ï^ºôE¿ÿJç7¾ï¿è÷·ÚÛß~ó•R*Ý=&ÙL#s #ˆw¥I”yd Æä‡ÝŽÜÀ!O³‚Åy&ñMxòÖÖ7=Ï«:ùD¹‹ùx„R‡ýÅ­Öª¾?U­ž Þwwº+——ƒ pR’yŒ9fÂôgÉË´‰`í¿ì@/ŽÈ]RPJéþb]¹ißîè£è5.l1ÏjÑ j?±0¶ûð[§TÅIO é;SáeX¿ÉðÄxÜLƒ2FÎ&'”#’Œ—oO\N¨Úªâd^ñO& rDšÚÍ‘ërº@%Ç™(@96èÅ™(À-e– Š¸TqòTq¨âPűPÅ Šã~à@¬¶<{Ÿ«»C›w¼JÅ ‚Ã]9ÕPÚ=ìî$e÷ÓíoÚ{Tɧãí^»zEŸïõž^oÝ0îÄ)÷î¶ð¹Ò`m}Ó™)P¯×?¼_Ð*NX¿ ó›çû/ûýÅ‹‹«7oé]9E–“¶¨ç ѹˆÉ;at”“ËK1bÎoŒ“$.E)èÄØT‚çyÎŒ€_ù¹èUœJÅ ó›×oßÔjµjµŽd š1úÜœ! áK2~D>”óuì§Œˆ1"ãÉrÐl6à¬ë;cûáÇŸ¦Ú‹£³ãQfBA žôzýþ+ßø¾? ôÈ©4ÏŠ*‹ˆ1g?fÆLÈ8sÚIÄål÷07¿àŒ¡ÑhØéÅ1Pê°¿¸ÕZÕ÷§ªÕ3ƒÁûîNwåòrNJ21ÇL˜¬¯$n¥ýEÉI—æ Ý[Sžuq”Rº¿x«½Ý¾ÝÑGÑk\†N^Ù"#«Mù“§üpîü9ÂjãD’Cà‰*•Ø-Z éþâð2‚lÍÅ2Qƒ2FÎ&'”#’Œ×Fô¿§ç4~çpd†#ùç'OâòèÁ½“bôK9§Ê1³ 3+Ô€Àº8îIµœ·äˆ¹à‘ê½r$ÿ¥qæsf‘}ÇÅç:™èìAd" ëTæør!¿)8ìQnHÅçú˜œÄÛåÅyti¶X¤ E—G_ŠGd|V ˜’?V«8(ü¯ÉiÒÞ3ÒçãÆÇ'ñ þ g/…G õž¬‹/L³…kÞèœ&1b»§€DzqZÙRÚ¦œt_ÈrD~Cg‚@¶4µ7YŽ>ÎZ/@'Pæ`—‰*èʼnZd$ñª|ct>â%9]Z/öd^+Á> ÜZ’)ˆ¡½&7Ï“ó½ô+/È¥ìª8 ¨3ùFswsùU×uã5-uËh4¥ªâ¸C›w¼JÅ ‚Ã]9ÕP†¾\ëÍËø)€åþÊVÅq]·ãí^»zEŸïõž^oÝ;qrqžÀ“ ¾cž*O'¬ß„ùÍóýƒ—ýþâÅÅÕ›·ô®œJ©Tµ}ŽÈ¼'<9i·ËÑñ6—´¨×ëÎ)zq*7Ìo^¿}S«ÕªÕª™ès"2¡±¿‚ëØ<~xß)#¨ä¯â„«ÿ™ÿêI¯÷ç³gïÞýãûþ`0Ð#ŽE€GVqÌÇ#”:ì/nµV_ôûûècw§»ry¹(ÏUª8N&J)Ý_¼ÕÞnßîè£ì56.«Z¸vc@/ŽÒýÅáe©:läCãá  ‹bo1ÄgXÝX)5¹õæe»qšx@g6X[ßtf V»ÐOƒ²G•¡<Àó<§t°T UN³Ùtl€³®Ÿm·‡BWqææRíÖY¦*ŽÜ}Ó¬|·Ï`¥õ2Wq>úø;§þÞûÍ™:œ;áу{Øuß«;ÅršèÇâœ:2€^œÉ5=­øS¼ø—½³g"ˆÃøîeá ?‡…vAÒìB /(ú âGHi¡µ‡)ÒÙ !pH»¤°;¹Ô*x¾`q°·ã$ÃÝ#<Éí0—Œ;áùq,ÿyæe·|øÏæ®ì½8yžãÀ‹æOÿÕµëX™wÁ´‘¿A/Ì)hB©—{ž·Ô™]µƒãx#¾þ›EVЄ†BàÀŸO,‹“Ÿòn¯×jåUuò¯œæŸ1a8â{þ’$‘ûA\«x®É‹;÷sf¯Œæ+¾a±‡ŽBwÞL\”„²8°8û½϶žØøóàøuçß?qÂO°•‰m8øK’B.§F>I þïmòör6¬DA!—cãôjq\þÆù›/_¿}ï,vwví¿rcB÷C™ˆ3æÂ¬  bèÇ4-Ù#Ø=p~Ågzð{½×€ó:Ù¥!„˱ÏTOTµZ¹ó7?ÿj·ÛEQXÅßF¸ŸcpÃÜ{#B M€Þá¶{ˆ)·¥{%•B.§'ª¬Ëñ|f «*Ó †ÃÖߌF£²,­{(Üsp¨¹Èå Éº¡Ì />£‹×tqäl U“åŠ#„Љ*¸¿'0椾¸ÓéÚý©¢X(ËñÁûƒ‡÷7ªªÊbÁ›JaéÌm$‚M‚º‘ÌAï»'…˜E(5³’F!‹\Ž­/¶õ7îD•õ7VÉÒÕ?MEÅñLƒ®TBY‹­/žì[UÁÛCçÖ¸˜lF/w…ŽÁ°Ë)¸&çÙÂ_öîg·‘¤ŽxgaN<\2RƧä€y‚yE‰ 7Ë7næ€Bâ rÈÜrAcH““1áÄs åÂɨj執Ëv»Ú=Ÿ¼™êêê*g··çëê?>á {å€Â÷kN)â¼ú‰Å»ÄsôùÉ·amyÃPN…ò¶{õÙ)ßL€Çý qw.<7µA'âóù¼™xz¼oÆ@ÄùÏ¿ÿÐL âtzðÀ7Íqˆ8"€;ª€›Û»æÔžvQ¾TÄV«U39€GŠ8@³\.›Þœ=ðmµ#ÀùÅeoëÄ7…–m·êc?©2,vúbMÙæR›X“ʱ¦ÎµÆ"´d”°˜Ë¥6å>ãÚòVÝÇêþ;–SN‡š*É@Äò…2〈'šfX,Œ8€Çý qw.<7µA'âóù¼™xz¼o¦à›P âˆ8"€ˆàŽ*àæö®95€§]”ïq€ÕjÕLàQ"Ð,—˦€7gÏ|ÛCíˆp~qÙáÛ:§qOZŸþUfqàí»«Tþüði â&©eÏf"ä\’#Åð=Ô .8Q…©\ÞüL¯=7O-·6 å´XnÜT5›Í¾û3ÔgÍÒ Sñu”Y0Ù“ÛäB*¿¼^ ;WÅžã@ÕSÎz½n¾GZ•š ðÌ›”iRˆ»ãHÊý{èzQN·ŒUÛx‚ åòˆiº¥OCoH9å|ãZHçªCÚÐ)ߘÅAÊɗ˰ÏTnYkÒbÞ0«Æj¼—ˆ8cGK}aU¡Aqôò¸ÕcMa1”D¨†h€0Qé~ˆ8˜Åÿˆ,‹©EÀãþ†›ÅܹðÜÔ8œˆÌçófbDàéñ¾9 ý âð%ý9 âp–þ<qDwT7·wÍ©<í¢|7¨ˆ¬V«fr q€f¹\65¼9{àÛjG€ó‹ËßÖ9…ˆxÒúôï¨qàí»«ï¾öܤ½Ÿf?‡«o6›uk\ €UðùáÓ&Fl ý» ½Ú"¦vbjÙŠD­%ÍÏ–: —º­;‘³^¯S9-ƚܸ?€xÃT¼K\Äb4‰1%LÀtè*ö¹é¶ÃpµÅ4³UN5¡q/1ͤ”Ó9߈8H9-¹gŸ¹Ÿ®I¨Óé°Ñ^š“SÎð)'•¨‚Î1¢ÃÉ©°ªBj©4£Sëä åôÊ7î¨ÂtN"Ã×£Mýéœc†€nùÆ,¤«dv^œ¤ÅWôÙ²*Ö„ájNÛ¤IšTÞyõñV㦱¦¸Ø§&.vß6—릜XŽ‹¹¦.§¢Ž™!¿÷ó7ã€Åb1ÁˆxÜß@pçÂsS àtp"0ŸÏ›‰q€§Çûfê=ú@Äp¢ Îß]5_7€'­0‹˜ÅŸ`Ìd›ÅqD‡¦ñ}ãéµgûþÅŃýé~Õ\nŒ|3ïý~ù-òï€Yä›XË[Ó<±·šÅ8ß@ì*Ö'“ú¼Ã–á¦0‹’PZL«R9­M‹aó ÔÕžôy‡&¤œƒŸWÊ£ ôæ_÷kN8ñˆ8çëÛ—j(„ŒºŸƒ\À¾äPSˆŽMé*àb³âÚX“zŽáúâûUÜs¶jÆŒò1¡?bâb®Ìå\ˆ=t]Œ?…6Ø-Ë»Y¹Íˆ9Ô p¨q|ÎŒÓÌ)EÉü¿ï;ª¦=‹Ã—¦9kjáæö®94°³ˆCÍ|Ãõõu31ØÙó`Ëå²|øðáýû÷Íð°§MofQÄÁ<fEø{w“ãJ …a» 2‚é]A¶u‡wp—Á€ÌXŒ$X\Ñ’«U'ñWi·»“êçU«åŸS§ìÒqå+Ç_àp8<<rù@àó§¼¾×7ª‡'ÜKƒ‡í³Ÿì³y˜Ìâö?^ðÝ?íõeøð²‰ägÖ¬r€$ã!ײoÕ©IÃjö£þùëo“BâÀ§NKGƒZò¬.ÄÛxÈeoá¨RÈÎsß>FùŒ‰”tM·ÄöC2oSB.Ÿ+û¯:£INI´_%r²‡ñH qþÝQ‡yJfÿm¾ÝÅþ?`º(ûÁ~úÀZàt:m´ðý?·ôßþNâÜ.Àñx|¾¹÷`%Ý”M“;-½O‰Ìî4´Ê~I·ò³–O«êáÖâL~5öé@£Mš<þ5uÒ²-Q-·x#q&wüZ8 „Vã®Ã~cû÷º8AóåïQˆÔÂk½­ÔÏ€7_T·ô&*l*¾»7Ì÷?²Ð¾K*…Coƒ˜Ågë–=[>ãáb¯r®ÁC± ûò¿ç¤Ø\ÝÍpRÉÆkÒ±Á¦Ù—B) tW.go³8°³fK—ò×x…l‰Ua,é{h%#akkU±iÄnæS„>?û¦½ÊY2(KmòÌʲV›É ~æû$T ±ÍC#{xÙ½ÍoäFƒ« kJ6—×Dv;ÖLLØÖâ*ÔnŸt Jï ìÃ({þWû[So/W¹cÀÒcx‘;zØÿÞO•sZýùé?`â­°~¡Ð̈žÙÅ–îÄávO³Â>5¯z¨ „ST‡«òjŸ=ì8@½û—ÂÑ{ƒªä’œû–ˆÆÑChäUW {ÈÚƒ²‰À” H°Ìnñ˯¿‘8»|øðÁ,ÎnN§Óûì8ðùÓGg·ÇãñuNúæmƒ ”4ü. q¿·Æ HÀá ¯#È”ØàPKY‹°·ëívP×@âÀl|øý’ôÍù芸Úl²Úwµ–ÔóÖf·tǸÙÄ^ŒŒÁÚ¤Um¼×_®vÞì$p›Ÿ½{ž¹ãôĪ¤Ú¬ Îz+Ô£F¶ûîôbp Vªøë_ºNI§¶±É'HÀ× °@Ëv¨6+Ù­<©Go:pr÷-y‰ä‡Å–Þðì¯;GæTZí¤~Î;¿mùbfà*ÀÂCˆ™8Ý2oŽ!,ÙýÀ!Y`>uVKkÉĵÆol“}>üÏÆÅò¥*ùOçc07 _º|¹jí½Þ@âÀ|L.ié9@¼Õ` 6Ág6n“ÿ*5š(©%ƒc0dC"_Þšðy‡8ìj$Àò²ÛR6€åÆà?öî¥a0Œãðém2Ô-‚ŽŽžÁ¥èâ9\A½Cn à`7‹ÆëÄ‚ƒà$E´þû<×È–áÇ›ðeS˜â@ß÷ qàèð 6^T@âH‰ q‰ q$€Äðh·w>Ï?7w ­ÊÀ†ç§/Wî_^ßNfÇ vU5,æµ~Lq$Œc¥@â@ÓH@âH‰ q$€Ä$€Ä8@â@âH‰ q$ q$€Ä88@âH‰P%qâ?“8cÅ$NS9‰³:‰ q‰ q$€Ä88@âH‰H‰ q$€Ä8€Ä8@âH@âH‰ü2Ö3q$€Ä$€Ä8@â@âH‰ q$ q$€Ä88@âH‰ q‰ q$€Äà€üÄ$€Ä8@âH@âH‰ q$ q$€Ä8@â@âH‰ q‰ q$€Ä8ˆ“88@âH+š €Ä88@âH‰H‰ q$€Ä8€Ä8@âH@âH‰ q$À¤¢A;í* ¦8pu}[I0Åý½Ýa1¯L˜â@âH‰ q$`_œË‹óJHœÙéY…$Οn à[‰H‰ q$€Ä$€Ä8@âH@âH‰ q$ q$€Ä8`²Â=ðÎÞ£4D^ÄÛ(h§íÜÇÂ2GH™"ÇH‘2ݶÚ)è} ٠êöM¾›!Å<,ögèÓójèÂv³~¸¹{ò+¥t<×yÆqÌ~¿Nù|2Ûí}ÏuÆÄ€¸kf¿_öÏY‰ q$p{ÿØÃ¶%îè߯X©®½ùx]HrÍšÔßÅ@ß|¼½Ô×ÕÊ‚7Ä€F"¯c%cßÄzŒoc¥ý™\ÁTo»ž·“ÄH&‰V¯LFKQu.s¶]­w‘8 Îú;_\wR€“ ðSðr›Lœ6-à\0´”é P`àŸJß9¨™”Îü ËÑSj;Š÷ %U+×®–òc€£TŒÿ©…TZŠ­p'ˆ°€ÀZÒû’¯±£ÞÂe˜ @ATuLŒI1£cc~­|\f…’˜Å˜15Hû0;Îê·Ö%(`Ìhv£ÇM’¨ÖÛÚ€e²4~¶–‚Éox€Ü Qåi¹ÓIZ ú&Þª0´£-iË%HA™îáNíZ\Èç2¼»xÆ*Å÷­Fÿÿ\tC ÿ—¨" N¼±…|ÜíãR;  KQW•;3Ýð\t ©ñC¤éüÓXÿ^ît“Д9ëôÐ@©DÕFé fX[ÎÕx‹Z8.Ö‘7 FÒNõ£R=˜‘rm͘W˜,0¯IPɢ͉áSGÿ ¶S8¶Q—ÂTMäÒ¾keõ—d|¥“ÄPIE– çØ/R·À@ÄcF–ÅÉ™|TÃqm–F<•EžT˜ÉìV¼¯,–.ï3ÆÛø…²Ã@sbý¡lX)MsÇ67EôaÀÁ<Ô}3sü•Ö8”E‘­=œíóÆ@«üÆÄ¾µÁ0±eµØY¿í[Á‹1æ™Ý?œIa\7Á,°åçŽL4=¸K…·ÄYcŽõÛ8Õ 5UÿÂ@ñãNmðbÞe›g6÷‰ûjô hïŽ6ÁW Wоe]D•³ã1gÅ´ОÇjûº&ÔÅß¾áÒ„¿/JS}¬i»Ùîõ^.j°wÀó wQ_ëGöº.êÌ tÓÙU1FsÝŒj~£Ý÷óÝ^âÃo…üˆ«ŠúXÑ cöã—™<x³³Ívˆ³äç»æuëIý’$÷²s~AQ•Q?çÛ‹ ¸@€Š„`Š 9ŠŠÉìSÓŒ=ÔL3õÔKE:jåß&K)£)Í&_²?3åÈ@SLò –C ¢)ÿ´Á€ÒH\qv/²{;— w·{q—½.é ç·‡3ç\îå,÷Ξ9sηŸ¤9-çà‡a†pÿ`†a¤@gÅÓ_Á=€ˆÆ¼1u_Sê+à’Ë|-êg#\ëõhzh LjºgüS满F4¼G4œ­)=¢þËPw)tDÝ Q}Yˆ¨)4¸!îÒøxã6ßÍ5XDóƒö\H{Äô2ÝÓeú¹×JDÕ‘ü@7hÄðž‹ù#6áOœnâ˜ÿ_ÒhŽhpCÞ%ë5m•Ǧµ²°‘çW섉ñeã.° Ã0 #›‚Û®D€‚´@€$È& ¢ Q3è ­xAîÏ—:`JÂ0 óìòx˜0‡ãŽUÁ³°Ž@P…@$ƒ@Æ_•© Ã0LX«ŽT c:'1qVì¦gVïÛðTiÉ“ëžX’_½`az¢=:j†EËÍ7[÷õ·î3tžÿ†a¸#á¥(›ØòÜÚùKÒœƒÞŽg×íaY’ÝExQ’}6ÊL4Õ·/ÐŒ™¹¯À=píìnJÁfx°a†ÉË_IZÿ*œùH8µ0ŠŠ%ÏŽFç*²,{<7‰Û=èqßtºeÂ$ÐwNMÁöüöüMɪÀÃ0 e[-óR°•ZX`TvFØlýî;ŠO‰‰–rrï ÉÚK¹ßéëïEs!›ó2·:>Ž[8ZßlÛ&n\ø¤÷Ìûºýð²×I_9ý.é´åoþ«±”tFá–?ö1gåÖžúÝsVm#»«î#³hé?j߆1²Ö¾ ‚aNÄ”|It×ò·60&vú7—ÝÕ-×·õïsߘ>ÍýÐ@lœœàK¶‹´´Y‹ÓAA…«}?éøGKâ½êOÁ-j NÈ[Ÿ˜·!HSâÚÙ²šË4··YMÁ©Ë^#!ãjÓ{”žS{4£»~7éy«·Ï+REOÁó×ì$!£óä[Q†áŠX7,faI(êëíkêî¬û½ý§Ößjš¿o¬=ròXù±êϪ+?­¬8P‰ˆ0 Ì^º1ÐUqøP-¬Âwçrí.ˆ Ã0†Ž„õé¢ärÉuö{’/Ñëó>Ÿw˜Ù$d¨tŸ€1.}bйڵ¦„¨) *Hå0LZ!Œ¨ýD†ax@G6‰f‡?©£ÇUì˜ÙÖõë§©¨=Q~üÇ/ŽVüîðþÃåeå‡J?¯ÿö‚ùrj “¨ $¦0 Ãp ÌÅkኺ« q3–æ&{À[s¦sÀ=èVQ—IÈϜԜ´äGB·°„ZÆ]ÂâõÔ¦]5:´Fi±µ†ÿnÚëŸÎ¡:—£ ܹ«¶Qk˜tút.sÍj S;"â:†a¸#l>bm„ 8TÓ³®0%/+e~fâ×U»Ý .:)!55=9 Œ³à¥À61•úG£9ó"4š3o¢÷…Í›´)oÖüÀìO‰Ø°›OFáÖÀ«´Ñúµ”ˆÉx@; Ãð·6Ž#€‚Õ ×á”QdfÏÍBE"€@£zjÃ0 C_MŽ|() èu'‚ ²¢Ð „) Ã0ŒÃáˆ|-L›UÒNi`1•7Tc†¡=Ò"˜…ÃÈ­ Ã0Ì¿ìÚ1JÄ1Fñ--µñ{[áYì¬ì-ÄcXXí ¬-«ÍÌäs! ÿZ Ë.ïGŠ!x„0ÿÿ/üút«}À‹a?Qáð©v V«•‹­,o¢·p”?Þßžл³´‰é(kaV…¶"]Ý‘nÙ«k˜[a@–³\ݶZ8ËæU`k¼|mYÎR‹n 3+ ˆt–mmu»…kxj…UneYC–[v Zaø’>õëR:ÙÅòƒZv[?¢#Á\ax^¿Ü<Þùêüb}÷pqv½“ý‡åÍX„ø›#íøfçZZ£x‚ø&›lÌ®ànXó@ôÿ'h â¼JPÁ zPDDêð"O < sõ—\DÈÁ‹ÂJDA‰Beó’$w';³Y˞н“NwíXÎÃaë0ôV×tUwÕü¶¶ºwÞ~89röƒÁ3[âM¹™¼ŸÚí^TCðZÅæ@3(|€"z->Øò)áAÁ¯‡ m.ø˜KÁª, ¿Köç ¶ LjïÅ98¿"±ar¹œGžÇzéºÈ¼ö蛊[‚ßU§ÈÅU¡TŒÅ’ËF/ë¨K@ä0[‚‰(Œ¯p‚ ë:Õ©NuZ-›ÁeK-õåúÃת¾«ƒFwÇ•ßdš¶ 'C0gzƒÂ„Y- ø‚ èk{E05Jõ£ñ†Šï^‹ÑÌTm®«&›Âô…ÂîÂ'‚ ¢[B›z4|ò# H##ÏÎ…_tdýFaÓ¶?oO•T¢o&Rª®¹¥bwGMoà%yƒ¾¡0gXQ È|h;ø©z¹FÅà‚Œ&]‹JF¥]¾Ñ…ÙLVCïâ|ÌïÂBŸn =lBì<Ò\<¡îLF´±G×R^›þáéý±WÕÂïg¦N÷´ë°;wnä^ºõïÍ´&n;ß×yÚ;7Ö‘M¦SŽ?NÎ;Íÿ‹-¨a«R9"A0?£æ- ‹P¢Ô…õãû}oðZðˆ§¯ Ò£›}ïÐ+³¸˜&¢/K¼Ñ{q¼gd¾€¹Pˆ€,¸·=Û¾5AàhOïÌÊ[¸hšp}—ÿ6·8e£ð*Cá-Í-»weù˜ãŸg«“]V>^Ù4 †kƒŒË옰7ïÆWG|M¹ý-é3¹}*„¯SãÚ¹ Á-TðÃ6Q÷Ž n ÿg2ìDDÒ®¯ïÎ1jŽÇw¦3f¹\²ÊÅfÓ ¯,–¨šyâγŸ¥e•ÞáKmý;N F Ø“Ý9ÂW7ÉÓQΑñj¼òáŸ^ayŽ]ïàvÈ#Á>”&C0¤Æp]‡`Ëdép ® £pKkJ>Ôû_£5]‰6Õ›l~±Mx@Mþ8©!j"¶Û-TS¹1eH]Ïc¢lÓù_Š„wðßáÿ)ÓÖºíöËQ¨ÿB›Ÿˆس7Õ’€Æx~vâ{ÊU]H'²Ðà N2óæ©ý ]xBÿʩۯºðZ/V >g"8ˆõ¢J‰˜‹N1ØMª…ê’ù(.È þÇ å~â‚dƒ5|º%ô° ±wpãU|ë F,ÁrÒÓõøâ]'^Yמ M/- C |F Ç^’Æq1‚Ĺ²T ‰/z´¯L¹KÜ.ª`¿Ï'ˆBVV6ÙwgÛ‰fEÁþJUÁhaAÃÞq÷Jôã–)eròJ hˆÁéàu‘)¿¥°–ŽØPßûº‚¾Ãf~|jxVÚ•™šªàUß>˜¯Ç¹sIÝ2ùŸóଭÿy·øåwä)‰Ýüfà×$IÔmÈC@$yum¦SÁÌïežÞÇj=_Ÿot.Jвž=ÖlJ+]]+ל°…w擬ûnëÛ´o™ðãÈýò‚àtÂ?ìOK:AÇwWË@úC”¥yH¢CA‘éùG‡A—¼õ>:ÄïÞ:ø:%ÕA/A§:D :XÚšÎì¶²±ÄŒûmc`“œïAÆÙgçðÙÙq|™8ÄÿÌ¡ëÎFDÐ(çöh•E°þpÔÔË”†"Jit~sk7e!¸VO´‚E(ŒÑÌÀˆáÈ×WÞ×yfŽ Ž:'ƒ6àVdB¼{Ãñã)BÆ[RÁ¦‚åä‘À A£TÈío•t:Žm0®é¡â•_N®íük’I ÁÄ€§°Œ€Þç/á6@Óp“‡`œx¶Á³Ç×±7¿žZ5KIN3(œGÂVÀFp¶àTR…δH´®[V}¨x„ðGùVîwÈs_Ü­wKþi{ëX‘D ž’”<aºQ×TsR ä‘дŸ!¸f!˜ªº~OVÜ¡àƒ9(¶ôh#>!r©+%L]¦åÏήsŸfŠÑî«Ò SàÌ6‚iµœ\1ñm€à&IÔõ(@p7Róˇö²Ôç;Í/ùè%IÉT%à¹üé0ÓÓÐ"ƒóH,ÆGTR)dlÍz@°¡Y!ø@aTìïñ¸³Ì¼õ8ŠéÇ–âGÊð—_{ß——ÀT[öî66Šê‹ãø¹3Ó-ÛmKk ü[äQi}b IÿÔ ¦  Ä !‘hԄĈQC0Q‘(àK_¨ø‚`¡ë Ѝ Q,RÓiM¡tvgæx¦Ó]¶îténÛ˜…ß'›Û»3»}ùÍÍݺº8ûfP×ʬIضŸécM5¯ù4pÞE+_n~sè v$Áþ2î•/€w÷Ï9^_ý:Ì}g½Kv±—X¶sôÌöÚ Ý2ŸXxE-˜žW=¹]?ú®$X>œö¸fn‚;ZºZvÛVg\‚ [¥±;DÄì ÞÈÔ?IÔsþØÕs÷O@‚|Á±Û ÷±göÿ‰êy“$Á=û6äºûl:d_NpK[à§Óý 6#3{z ÝOfWpE€Yœäb³Oµ½ß‘x¾ö"EåæÏ6Þ±u`‚­ Vñ fÒÈ* ¸"çplÂw!¬]_ûlMìh[Oë×{¶\!Á ^^vGe|‚¯é °Ã)}wnÀº™îÀ¬w=µwËë%%Ù³gÐ|É,ö¶@PaÀvp ¾Ç;ZNìߺ¦/Áfò÷†çö†CÞêûš®03ûtÙáÁLþ§>ؼ±¢tH 6Ã!ò\Ë`¿U­ãPòUªïÉ#uûeœ4i° `ðW÷†gš‘ÓÈÓ(³¤“`ÿ³Ý==v~¶¨zJnñT+4‹ôÀ ž# &_X ö"l‡‰S·h¨«›6%«ì¦©cCÿӳǚE%áco'&8 ’ka@‚9a,ÒHp{ÛßGêö-©™ã%8Ò}!|áBGéƒ^‚ç/_WR±ÊM°M0ÖÂ?gv˜†Âw©\¿ësYçÝPæ%ؼØÚtâ÷ƒGz©káÝÔÏ^fYd;yPaæ´Ì”¨õLó·;wý¸û“ÛW”NpöÔŸ‡ëOþöGdaÕ’;«ª1~ÿìEÄL"ý…ð®íþþ Lž«yæ©—Ÿ>ÜØ2«¼âÉu÷åä{ÿŸ|a_€¥@‘¢Z›ÿ:~èPg{{á”éÓ/m§âÕ/¼´lÅÊ$8 ¬…{œRƒ™|_lvuçŒÏ»õþGo¯ª¬¼·&”ŸÇLɠ€sŠ L¤”OˆKgÍXûê+œqù!ÇaDZݑ‰Ërÿޏ£eËâˆmÙDÄòÛ¦8š®Ë¨4¥:©,M×úÙ22i$´¬Œ¯0ÀˆïÕOš(ñD"Ží–÷rv-SškG,Ë4‰("ãÐH‘uÃ0²³½¹0¢]¾DDÊë9Ã* Àœf‚‡ò¥4 MQ KBlºE’Q·¼z–!-¦8’kH²KQ±þÆ–Æ$¢KcÎĵ0{£ ¦”Òu7€º>†™ v8Íì8LDÁØÖ„GMI9[ʤÅ/{9Sw$ØK˜rg£F)E¤ËÀ¬)r±¦â>gc8úô_?IÁ =…ûÎ¥ýI5ภÓh–‡÷'EŠ2‰AC*~2ú€Óßðá[€‹r`¢ÌÝ‘ÈR&ý×~þ¡®JX  Â€  Â`Ðàv|º‡†Ö¯_Ÿäz£AIÕ××Sºà·6÷»s›6m¢4€‰}a?¸:¥ŽÏ½×Ö´›”-UE«hT Â’àÿ?Ñ@V'‡Û9|žÂçe"Oì}¿p´+ € Ëš÷‹7*˜H±"ÅÄä>™<§†Fö…so~ñ»qÛæ®8^¹æ—{ÖþZ¹æ¤Ìr¶ÉqžòòrJîV¹srõC‹Æçšb›YS*˜cÈ9.g}Û*F Ë¨ð©æ¶‰E!¥HÓ”d8 ËHºRš"9.giD566R *Ü|®cB(ÈL¶#ÛlɄ݇—³‰‹ÙÆ>2‰_ÞÆ? Oý_ìÿÆL¸:÷»uˆ Qô'‹"ÅE¸ÿ!¸‡Î–U˜®À’ô©¦“TNúÝ~œó4Þ¢˜E¨r™›¼í[ A·šß!>¿!ê_ó¥”²…v­( ãø{NïML‚¥ˆ¶ƒF(…fQAwK‡.-ر¸Nqð~g×B÷."….¥› Z°-‡.IiQÑkÒ{ï9o/ hKoA $ÿ$„óÈôpxÃ}.åøôWqêD¬óÖõ*©ó±Óì<›öbÏйJŸ½÷ïÊ);ϦҖ³OèþÒÊÊ)|{¨ÒŒÊE¯jœ#¢ªíWvžMs³²ûÛëùEø}·‘@ WïÜJ¢ÆÐh!ŠK‰†ê­ˆm2XlÕ£F6•3zÑlý'¯/ÿÅ>€¾WþøùË£é£xà$vWk­/ÜH ÖmÕ[µqÑCé0’÷Ï[îaþçüi?o$Â=œ¨Ý_}±[ 1*¢"FÕ4{0™M¥w€îñül5g@ýÂ@ hyZÞ´¼-ï=“ßGL1ZÞ§ÿv5Áwjæ è¾å]TÛ-ïÚiyŸ ®ûnWöûÀþfçNYÂ8Œ{Ÿ("¢AÖb°Xü~e?‡Å¢Õ¢öð>†þŒƒˆŸ_†—/Æ竕weïµ»+ïò¬vµÞÉÌ òþÜÜÑR°–ÝõüzRo 2ó¨¼ëzÒF¥nmûÜódæPyÿÑXÇN$3€Ê»’G¥ú|c’™@åÝ,>]dæâ›wÛífÞâ3ó¨¼?عc•†¡8ŠÃGQˆ˜p)”‚:¨ PqèÔê"î¡[7} qÈ ¸ ŽÝÜZèЩ¥Pî0©B¥CBiá6PJý}dH7ÙN —ÿ1öŸÂóçö*÷´kí—ÔÌ å@Ë{z@¿0ÂRHa+KìΞbnÅ׺°¡Ì—›ë§¶bïõýÒÝ›Z~Ø Há éÕQßM8aÌQårÐô4Å­ú3i›¾ÇÇ>t·¢d·¿.yfö¤p¤?9§’œ=9ñÍâÅ­bŸÏ÷®b–y³üe™­63/°;7’žå趆3+þÙ9c ЦHo‘xÏá„´6^E°´1há )R¸7)> G’¼ƒ×w÷©,ÊG&dÿ[|iåIÝÁ[)¿*m• JçŽàe³¥¾~Z]–¿¤pëþEÆÙÇ<°žË®Q.ü¾«AiàUûˆ£w¯¦ž }媺MÿyÁÊn±•| ùbïÚQ‚h‚šF‹`§ba)"b¡`ac£½G`éYì-m<€^@-ÅB ÄϺMp “ìß«vggØÙæ1¼ÀKÜ÷ñ:o_Šù¬Â_…”røªZÖ‹=,ÂvEé•&+4À¬ÿ ¦lëÞŸÞl ¬LJMl ónODÆeˆ˜ Yñš"øëh&`áñ 6¯{õÒåꦔLlç,) ÏFmÃpXU×_«æðUÔþc«ï/Ÿ4 X¸a;ýfy¹= [/&›½ Ê#}§sýLZB¶ªÐo N˜ú(“ŽÝ­äDìGäP0oÄÎ3ZtV¥qöÓÓ¹+ñé<“6I]äßìÝ]lUÇñ³µ†’­R†Þ 4˜H¥EhQ ÚjÂÛöâÄúøi#*ÕD²7b `D%@kRM …jd%¨Ñ€¨¥T/Z«d@·Øˆg:á ÙÁܲìlù~2üsæÌ™i¹ùqr˜=+nD»¼ÇÛ«`—÷‘L€O0³½:Â@ Ha …õn»íë ²ŠëHaí` ã®LYE)Ü,´ã­²¯é0{, …³ßm+ýôdÉö_ŠwüZX~BÃ_£Ã©²S^Ê l–5#+SkÄc—wõ¨7ð æþ-ûOµ¥—q˜fœü³¿¯Y¦p$qÙåw~ŸgÌ ¯6fg•±.¡™‹2”ã±Ë»â0^õ_ÍÕ$Ûº»ùko}yLްyû`£\”hÞșѺ- Þw}vywÞRÝåjr@ «ÀWb,JD„‰$`—w{.»o¸nÿé^€>[ýB½ãÕ>·ŠH«&"jQ"¾ÛŸÛ¹?-y …;ÏëÆ> þÅϾÌzjóñ¬1i²öš³ÏS[¤»ÿt@ whÚ…¶Ö7‚«†Q«rþ¿]Þítè´=-ù …/œÑ~ÜwH˜±{Q˜Ì öù¬žæƒû ¬Cê´ºsûî§I3@ \±G¸1"ØSíÞ€RxXz8Ö=£Š¤€ï`î1áÕ¾kĉsy ðÌ*aSš¶Èz¶é‡ð=Âí…߉¸€”"XÿaíØ²3²– òýô±Ù_»Ì“»,éÂË£ÿœ …Uø†kw˪…rüCŸûmÏ=²~¿¾o^ùÙpíç²ÅkÊj¶C‡ßb.|- …—ϲ´ú”ÞÈÈoÔúMþV>ÿwÙ^ZÝry]>}ˆÈµÂKN™ÍCtƒz”:®þ–†yn. €ž2sâÓÓïöçlÖúGuÕýªmU9fÊ܉â°^rÊ,Ñmêiæ¡rÓu|™ `]ø½ÿÓòücwé_tU«mU9FèÕ\Øa>«N/¿dã>‡u¸ÑÖV§ƒ½:À'˜§åçø Âº\ž]0J¶:þRpŸÙÎ/ùpvɨö²fÛ'§*õT;†1Š£ª­¦ÌöKö'«Sû\8´5O$RxG¨Q¯èŸü^7È_t¤¦sõc éÛ÷êÅ-ª©¯,ž´¨fo¥l›uKÃU­Àª@Œ J‡ÌU7F5\úï ‹Ä@ çŽ,ð5èÛúù‹Nm¨]Y\´¸ws‰ Ü µïÈ6ªÑ^)khË‚a·„ísa·¨u£.¹ŠáFOÏ…°.|ø«ý¿ÿñÓk6Ÿxô¥Ê‚>‘ÒÕ~±r½Q×Tý¡ª'óGÿ‡÷…­‰pœ©dOÊ÷…0¾sèÿÌÝÁUo.œW\ýÆ¢’ò`í¥ö|£.œ[Úº@Ž”ï K7æÂQ ®ï6¸q¿Qµ.Ù{Ô©lxt. €Þ´b`qÙ#åÏ¿~ÇàÂòÅË»ªjÕŒàŠ‹§Ê𲇚êqîtü_;÷c¾×£ëÂHaexp@X |BÈj°WQáK7á•ð7mm I¾. €}$*|Bø<ÿa‡fy¨émrï#€Ž=¼V³Dû±kö4|vû '°¿0€ïÞ‘PÎÕ—ªvú¤uâºæÂMëg[rHòTÄMvv¶ðõû$ò7À\ø\]éÔW—t´­‹hƒ¦˜4­½®T\&½h]TN=zÔ¡íÍ„U¿›‡ …;D§H)i™"M˜DVA@ Ø¿öÙt‘¤¼Ÿ¼X¾ D¤ÕázˉÓ}‹bœ„ÊTsd³FM¨£›muªF:ôØN]Ø«þþÝ€Ž4uºsuô{Ä}úöiª.1Ûƒÿ·QÅå«mÂÖéØ/Ùï5«sš«¶C¶FÝëÐvù[\KX‘ø£C¥ðÎ÷7L]üŒ¸MÓBU5Ý_pHdçÙklœŸìúØØž©ÿ°gÆ8 Â0ý#gà£bbì@ǪbáUOйWIÅb(C*Å ÔòTÉoŠ#Ëòôô•àghžò êëäÀp„MÁ>«à™4dÌ„ãXJM üï7eÃ0, ßûG}i@†CÌMå"þ”P#[C?Vafá÷¸xŸ€¯ .‚‚E†Ý‰“‚¿8ÖÆçG¥h7vܹ²wÇ* q‡âÛ(¨“Žæ-|BºvìPô ÄAÐI3ÖÉ õaœª ôWb V’\¿‡»C©×á—†fǾ¸~~»½¼»yL N¯î›Š–›§­ãl±u¥yš¯·ÿíö¯²[€ Ggðm>Î7@…TPaT@…Pa@…TΨ0€  Â* € xâÑl:I鳃ÿ @…Çãqê € ¼¿¦þp]PaT@…Pa@…TPaT@…Paà u 8:9O¥[.æ)¤Ãã³T´ªªfÓÉ`* ¬V«‚{T×õ^=Gâáée@çÂ@Ti{Ä(•@…PapËŠ ƒ²üüÄJ6ø¾z½÷H€/óÍq¶2Ô}zŸªïq¬•àX_ï4¦±’ÿN6UaÀ¹äŸd˜Í•l×Ý“TðÙZÇ—ÅUˆÃB¯€oÿ>¸SíÔþ~™¸€}õý5ç Äëq!gı¯˜ÆÊÖïF6Uá]šã›‹ÙWÛ6cÐ4íòŠEWPa|:K UU9êtF…º®uzB…Áͼå[?%žQ*€  Â* € ¨0*  Â¨0€  Â* àÛ|¾Øc†A³çsÑ ª›àÛc`“6ÿª*xÚú"ý™çiähIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-09.png0000644000175000017500000002255510536106572024744 0ustar gregoagregoa‰PNG  IHDRö\BÞ%4IDATx^ìű Aã*”FT* ÄòלN—<à‘v-;qL ¬~:0¢ïƒ.ò«ß IöaïlcäªÊ8þæÞ™íîv×" R[ª}¡]J+‚å%¤E*~$câcTÞ(mi…ÖniAEÐÆo41†¢ˆ²@Ql‹-´[®‹À¶Ô¥Ûmw;3w®ÏpÚgïÞa^v¶-üyrrÎÉ;çî&“žçÎõÝ`ïîx¿@!„’ÀûB!„.¿iêFDÞq™ž8c”ÞA\cÃ’{6Uæ+Jo""%óS¸þ謜øúcó_¿ «Z¿}$~ó*×_ÃÿºþõÛÚÚÊÀ8và'ˆ0mÞ·P1G^ü€é oEe~á>´øÛ˜È¡]ßG„s–Ü3ðl€™W¬uÃÿ<³ À¬+ïÁäñ¯?ßký¹+6øÓzD˜íFûŸ\‡ ®û&òÒÖ"ÂÂÏö`Š!„„5z !ÝK–°ÃŠ£3UoŸ~ŽtÍõç-I^re²{iræoÚtñ<ä =t-ML¿@ÆÀ b´Ìý¦7#}?FÅ´/¼UõbÊæ;NÜÚõ ¦–^±V“ÊÇ—ß«‰Ì»vƒFLÜÌÿôF}U6›4¼øÄL1„A BLʨ¬‰é›Z²8çv§P @~¹l! !Ò6;ÌÌ“á±ðÍ_†Ã##!Êâ„Nëü›î¤mÁ͆÷=S6Ýb)Ëâ¼¥ÃSttßæ:ÿÛóC›ì¼øöh.g†ærÊrpçƒÎ]zçàδ0øpŠó.]àõç· Âù—Ýí:¯ýí~›¼àS«¼ºcóÛý5¯îè™¹Ì  <³Éé›h§ÿi“˜}•"ø÷Smò«×cj±ŽJE×÷Øûøj˜(¾a3€þînDXü¹-/üv\ÿÆ-®³û±»ì‚%ŸßŠC!„*G•† k<úÏO‹ø¡x!’¡ˆ$€¦NÌX&™¹òòîÂ_š?Ü_( Ó‚JP}ÀôMÛ‚[4yéa–¿1}Ó±è6 C{2}ÓÙ}»ŠÓ7®PåôM%¨¾`ú¦ëÒ»4bâæ¼O®ÒpÊÆÚ\¾ZÃÄCõõ]¡JƦof]u€÷n4}3ûêu*n¡oöÿqƾíU”Éöþ~ €E7lÖ°'"w.^y¿Õ7ªr4ŠýÇV™¾¹äÆ­NÜìú!„ªëÔîÅIH¦ä‘Ð~-³¹Táàþ``g0x ÌŽ†M)x$Ã91/ŽËâA… í}5aŽóâØ—ºüM ü÷¹Í(A³8•$jQDZÚq†÷=µ;Ìq¬vW¨2DZºpÔŽ£avcuá¨×Øìƨ†s?q§ÚqÞx~kÔnìxýï[ÌnìZµãX¡ÊÇQÔq¬ûÆÍnlóê8V;Ž+T™ã8æ5®zÇøòû RŸ¸YÛ4®ŽcµãÄÇeq.µãh˜Ý"h0„BèÂ1j/T¯dƒC¡ð@‚Aê8‚f¤ùxJTˆ`މ©œØ»¸JUNéë¾TåD‡v(Ž”–¨JøðÒ;¬ c*'öj=³Ç´Ž ELåHÌkl‹u*GDœÊ V¨²/­|Ǹ}ÄŽÆq‹‰ŸŽ#(ƒÚq"‘X•*6ë\ÆÖÛNU9¶Œ³B!<ú/ ½&„9ˆG¾E*£}d›Mâ ç×O×ù‚*Û4®ûª„B!åÞÌ`Ôn7ÖH$QÈ)øY ?‡B JÐ/õ¿˜}ãÄ N#V®œv!„boÖœü,Ž —íÛzQ–µß(^†3“@ñpvB!„}sx# U&_ÎNð­Æ„BñÿÏÞ¤4CaŽ’Û(èNOã7žÃà-ºpérêj= …DšI-}Úéâû(¥óæ5é®?ifš~x]\¤ ðÙ©Ì â7qD@ÄD@ÄqDqŽOÏË£×Ââ£äÍÇûøœvhëéòVù¦ÖK)•rØ;»Ôö”‰ÊsœZi?@/´Ô 4U©¯W*“=+Åuãôäàv™õg±©;NƒÊë(@ÄiWeªxòèS{BS®¨Zþ<4ïµQíVžØø€Uœšrêa©4=õl©O椶§ê÷üú€ƒï ptröñö’þ¼— ,î†aÈiWv¶ÝÍ/ðU"€ˆ â¶OioÀåÕõúÛ@ÞüK%í¸»½Iaˆ8Õ8ŽinðÅÞ¬FQgYØŸñàÞ<ñ"x¿ÁK@„üŽ¢àÁ/DÈEð¶<Šž“€!zÏ8dpjðíÔ›êšÝîÔ#,•êªê®êšžšÊ°9 dýgjù¿“ÝǹSlXœëô+~ÁqÃ|Èžœh¹ÀÐåÏêòïâ¢Èht«Íñ‡È,Žüîóá˜ëÂ"Êß\´ã8£"™IgÎÄ© tnâkE‘uÜÎü3<º8@=I'¶¡áiIè†èFû"O:F£ÄØtòIÔabaRùaãKÒÜðQEÒºe(?Í,œÃ=¥Œ9uÜê‘}Fî²CÆ¥eÝVÜ&°ÃãcJËå›â‹5°3ïâTUÕu]ˆÕžÈHãGdHLjˆ±>j™ÔÑä J_X—ohÓšDAFÙ.PO‰_I©¥DoLdèJPËsê¸?n8£3‡eš<žB”ïßCé•eߎ–8Õ >|<],ªëëúñ£‡õ Æè®×ë–Øl6DÔ`M ¥½K¨ß×MS[ïý›nÐÃw§Uާ>¶ÞÛüÛ·Ÿ˜£XÖ¿ûøs’kùy&§Jæ+‘û"L«y–8ŸN?Ÿ¼…ùÍËÛkEJ)Ôü,V’!® E6;Éoîn{ÞÜ¡/Ó¯OòÁoíHRœ½¹ÝkUö>‹ét6ïG£Éä#Žã$I@Sðœë˜~”íµ½):ùb4¨äí¿OÀ•˜¹ùήq k¸ÉEÆ©1EÞrÞ‹;ýˆÿGNëiÝÓŒDfƒøA`^‚ƒà1 1ÀïÏ„™ÜgeêäôÜl¹gSsv®X5 ˆjb—ï°³0…HÁNj0$_ …e>ÁÒ"é…€E:A,ì´°ó;ÒémƳ sÞ;eåö`¦XænßÌîì-·ÃÌÜùŠâàÖ!cŽõÅÓé7å§J¥ûýþ°\,ß_{Q””üE5èlfžã+0ÖB]Äq\GŠpÄ'à:"B\ð@-00!›àò’‘ïVùj–J¨…Û@ì4b‘.ÅõbYˆ$]±áõ& [Ò¬'°+Ô= {«ÂO‹ßîŸ7ìÓðüýÝØóÒy¦ú›ÓUäßÀÏ©Üâ‘uRRò–<ŠE²Øåš6•†ñƒ Äj¥6æ}¥´„‚϶«ÅC0–Myè£åÙ,,{9Ìç²ÇüÓ[¿{ºñìå0ïÞ”0Ƹ"¯¤ÜÐ%‚%ñ" ƒxÑ:žLOS5ÖEÂ[pÝø1…¿°ìåPë¡ç+F„Ý}G·ºõ>¤íÖý Aéh ×!G9â©Q!ø»q›øGL&HÁ‹6™îï@”|ó-4]–Iüƒ›»`•íK~'LØ5!‡ëÿc b` ä°m;{÷ïâDp<Ñ•€‡‚Ziqˆ`'‚?PôðA9»ã:;-ÄÖ `!Ú‰^t=r FÐJ‰ÈU*x¨àˆG—åáŒìË혛ìæû)ÂÞìÌfïn/³o÷…ªÒ@*…È*…ÄN‹Ëíï ×c—œ£Yíný¥³ça]z.…»WgDy;å¼NÕlX=óÇÚ=ŸÿÕÓÊI·sÎJ?Iw¯þ÷t‡ûÿƒä×a(=Ç;¤ÑÝ•ÓâÒϤ$êæÍ<89ÿ©‚ñ“Ιæl·Û„'g¬s¥ñIû_bi±mf£ÌXn€]i<Žc«F•Z$!'ÑRvÿÌPå?$Ø`”ὤF•Ä!#|à˜ž´¿Ú“Uà‘®ëÁMa.—ºòÕ|¬ÊÐ30ôµæHë.i¥qYY©<¾ÔHÙð÷‚T~o~0Êð.z}Í2æâ*äq¬â@¿ñ¡_›§XÅ™,æææj@.NŨæ­m(Ã)õ5‹ªgÆœï--¾¬â¨ÁÍý‡qZ£ÊTåþ±¦8C)$æÇûLt 2¹8â´ã¥ ³M³ý¶÷îz놩ʩ…8zá\éàÍãLákT¥ë7ç›§Ìö‡Ÿ>¯¬Ìì™1UÇ‹]±²*}H‹4¦¤ÑÝ•ý(Ü>EOFÔª VqÌõ©4¾ùòík£Ñˆ¢È´x?S–¹² ã´Xçe±VqÒŒcýõoI2|Óë½_^^]ýÑï÷ƒi5bÈü‡ê¬ŸáU \`G¢œÑ^Åpø;¿¸Õºi®OEÑÆÁàgg±sòø‘$I«+¶<#cK VqüI”cò‹-<^xÐ6¯’k\BÖzRp â'Žή[%ÅjÕ*†ìÕvéÃõnrùl*@ˆ#N%­QBg¯>P){«ÕYp¡J@ˆ@ˆàûfŒÛ0 CÑ¢èq:tÌý§Žz 0 þÈSËXQ¿‡ 2Eˆ_ò šRÞ?.`)ã2Ö}Æ#"o/ç@Ü–¾¿>ÁzÁb5K>‚žòcرð\xݸìƒV•W""¦8"¼3E{ËøüŽzêq§,ì€Õû…©a‚1Åá­å·½X2ïÙ–[òƒ›ý»R —Àú‹þ=DŽÃå–Lõ ¬•þ°þ0ZAa Ha©¡S®KR êa…äŸ:EÄG$7ÈHhÀ¿@ဆ²¥Ü’·>Ðækaµ`Ùõì1¢ÂöÊaVÂÀ8âÎFÄGD¸.R>19êšHYX=ô&+çq0ËéûÏxDLqD¤•I¶[…LÙ¢2â a\Syºšßá+ ¾{̸ápDüÓ¸H;²¡‚ÄxíÚšå1+ þq˜¥¢”•dÃq£ÌsD¬âˆYNkCz×`ÙO úÚB!ˆ¯Ï&! +ïÿÆP$¬ùÈcŠ aî¼¼%[;Í(ìÐøaïŽq¢€¢ñ6˜àVØr@k‡…ǰ°´1&Z¹&z+)~$qÁìÊWx¯‚ ûwf˜d>³Ìî°óR?ôÃ×çÇÞ÷ÊÍÝÑñI]×½ï¼O#õÖîo¯§£1Flƒ­Üâk÷œ1\\^•R:YÅi‘ß@Ê•— €e À…*ìoqÔðoÖ¤8X¨ìu`<¯r}¼?ö~£Ñèüìt«S(¥ôÚˆÙt‘ ý*?_­âÀd2éµðÖû¸/€@ŠUU%ÄLâõŠ’(o8*¡ùmUŸ²«z>·ùýR¨¾JIMæ*ÓP½©YEv»¢üéSzM ùñ«ÝÆoS›Æ“ALZYgŸOfñ6&Ô(Ùº~‹³d¶+ÄãT;º fl|®YXý©yù¬âÀ{g°1 ÄP„øpãÿOÜàÀq@2«>­'L²û°JS×q’Bg“YÕàp¶o°¾‚Ã+4jžmxc`˜Õñ"T3ƒ@Íkd}šžš÷~tªlqÞ,ñצŸM£`Ƴq#5F¬àc/ý-9|= ’ú{È*N€Æ3¹ÄÂåªfÇÒÆŒ‘YtðNjÔ1 Ô¡{ͳô9²¢¶têkK¦*Ù¨8ñ„j¬Co€ü­^²¦‚Ùj zæøâPéí²]‰ODBœ 0Ï•…YÃò  Û&p4BÆ3i4'…CÒÖÔüýÀX‡5³“~ Ð÷Æèj‡'’ÁCÙ>aŸñ×.U¼þJg¹*ÃÙä䊿`öóÚZԷŽZrq‚`ýWp’ÿr/hö×!Ö*Ÿï2“fÖÞrŒcê}Ûÿ-„¨0IpB’ͺ<ž¬âÿ§Éõ|=TÁëƒ)M/RC ˆ&™4Ûâ9ñjƒþۣʮoâ7gA0·œ¿¶dj^4hÆUiÒÌ…9k Ó¿!ì,ŒåY‚³Sd$ÎJSn"!N˜\H_ϧBY (ÒÞ–šgÌ+{µqW·08òíæØ„j"fA5ÝVH6ÏÊÞ¡ïNCÐö[ãw jq}z•½·¬âAänÓ›˜šÄ|²wǺMq‡Ï‰‡)RÙÊê‘÷±ºek†;L¯™ÞÓáñÑ=4#OGæÄ‘‰ÿ¶ñ§Ãñ܉Vz¦íznèë ³}·'L,3, ×{×>‰Lhš…Ä+ª$ qìÅîîRI$P×u*ŒÄvÛMZ{q$€Ä8€ÄpEpyufáâüÝv3_â/ÏOi~n®8~¢ À^‰ q\Qvà~úø!•AâMÓäÁÍÍMQ•#qÀõêq{ž<ŽÕ.zzO»q?:3bÜŸ3?{q€H“槨“ü4¿LJ3ã6†1îÏ™U ;?K,‡•“s$2%/öÄJOÏOcfœðÊe3|·<_âÌìÅéº$â#þ™^ýÄ»ÍM‽8ÝŠKl7Žƒ½½5ç‹·šônÓI Î.å܉ƒq¢j¨73±„3œãDÕ_D—ô$b&¦ ½™½WÏù«$CœKЉ4„ã_>‰ôÖW–Z$(¿fÜú@âÀ^ ®l*„ÄêºN…‘8Àn»IØ‹ q$ q$€Ä8@â@âH‰ q‰ q$€Ä88@âH‰H‰ q$@JL“88@âH‰H‰ q$€Ä8€Ä8@âH@âH‰ q$€Ä$€Ä8@âëp:q€6G‰©–9\ˆÔß@Õ/3ýÿ8Q q$ q$€Ä88@â€Ï÷@â@•ú@â@âH‰ q$ q$€Ä88@â°íùóâqŸþG‰ÕùóâñM@âH@âH‰ q$ q$€Ä8@âhSq$P%$€Ä88@âH‰ q‰ q$€Ä8€Ä8@âH‰H‰ q$€Ä$€Ä8)1 ÄÄ8€Ä8@âH@âH‰ q$€Ä$€Ä8@âhSq$PùH‰ q$ q$€Ä8@â@âH‰ q‰ q$€Ä88@›Š#q€*-8@âH‰H‰ q€¶7.€Äª#c$V@¦ðÓG ¨R[jåHh§}<~_Ø/RU•ŽAâ`¥:x|e§€Ä88p㉸í€Ä8€Ä8@âH‰H‰ q$€Ä$€Ä8@âH@âH‰ qN8€Ä8@âH@âH‰ q$€Ä$€Ä8@â@âH‰ q^§rÁn»IiŸŠ€Ä¦iRa8ðòü”Ê€½8€Ä8@âH@âH‰ q|€pyuÖ¤®ëÝv³êÄîîÒbMÓœùq{1͵µ$ðøø˜Y¨@â···iy€}~Àvc‰Hàí»÷éŸÀ^øÁ®£0 ÃPÔ)=N‡Ž¹ÿÔ±CïÓ ’AíOƒ¶Ë{dOâEB’eIÉã~ò ®o…>P³MOHqÜo»v_<q{ þ*:qQT-õ±eû*j2;1j¼í*ÿ5cóœAˆ" ÔaÙº8@É¢5¦lý_h2gÛ}N À³”¥±‹-<¦Å˜³£moi]“âþl^ý9™î,ÁUŸ &¢®‹KfqzŽÅìÕhy´2H‡ w”È¿ˆSò?Àä¾)|Ó–/˧³F¦ÿ£ãíÆ“¯˜}‡œtÛ™s¿ÊÇ H°CYOL¸¹Ùn ^V’P€71m7ðØv›ˆÇh€ÄÖëuHœŸ?¾Gm€‡»›x€Ýþg8—_c‘€”RŒ°ªþA°å®}Þ¨8€Ä8@âH@âH‰ q$€Ä$€Ä8@â@âH‰ qV1|¹úMØv›èÅ»Ÿ¢~)¥†×õoŽÇcퟗñœ‡»›¨Ùnx-뚟8ÐØ§fþ¼lŸ½8@âHàýÇÏ-L[âàýÏW/|òù«åäšš2~/úæþö×øx0²èÉ#q OÇy¤Æ¾Éãy9ù4”¯©+˜ÆÓ¯·‘ÄH‰6,­ŠªËárÊ´ã$ˆ³ööšìÌiKÈO;ªÞZ4! ªSž¶7ªÐ1å­9uL~Ìëâžâ ròq]Ïròäói9}ɃÓþãžÆm7€çËfp\×ä k)\³¨%—§7a¼¢Äl .wL]‰xÌ6ÿbÛ$À*λý!Z‚Ä€”’n³.‰ºmÙë’8°í6Që²Ý@âH‰ q$ q$€Ä8ÀõU´Fâ×]”øKã¿Ù†aXŸs|wÏxÎÍ77{ÙÝnàûÉÙçž=—{s&{Ï~ç9ϳ$žžGÌTÀ”,ºæÍþ½;ŠŸF¿(æ¬üöòy‹’#½ŽžN§‡ÒnÊsF8žÎÄØñ¦Óì}¿¡Sš¿÷ÿ]ãö?Mj?LQùÏÞ  îÚG)'Þÿ¹´—Þð8…ñ¯î§¤}ÓÊRÆ:²­ƒ̽mÍXJìuÒ6.’ŠÄ¡Í£D]˽›GÝÀ•ßø±r¾¹Zjÿªoþ„&”ú€f–¿ÇŽ€±soëºUÉa"b/N§²¸®›L¹ÉdêbÇ«šTK£©jú®cgýÚÒ`åV_5‹.¢ð›yÍ£JŒIì+š»ôúlj)%½Êˆ­»l´ô*®új¾£­Ii¹³CÚÞ·ÖˆÖÒL(»úÀ–Ráãe˜˜8–úÊ+À.ZpY-Åb§Ý³^Æ«šon®9;4”V?¾¥OdNŸdRX2,¨ÁÄÑ/MmY¡ýÁƒÏ“ ö"ú‡Ïeý¤ýoïO¿*ëÿýY pÉÂ)*§þö+í×.yDÚþlÏŒ%ôøËK¿/¾8Ñ%=!œÜó ië¯{Ì÷?ðýY×ÿ@Ú¿¿>G}é؉Ýânü¡þ22ìŸ;ýCÅe7?‘íù©´—ßâûÇwdý[Wùþ{F–\!=Qùxk»öeç¡SŽf~ë”sx‹ï(Üîû}oÍÖÔÖN… 2Li0;V–º¢,ãX"*\ƒ…žè«¦LúÃÇîkNmîéß×ï~6é+ƒ“¿š˜2-]]©›é44\rõlò˜ÂPêK”˜˜ÎþÒºKL+1£Ä>(FçÆÀ¾§•î Š1-ôúÝ%–wÉaD})%&º‹,´îRÒë“]?³Ã_ѵR™–^ù&¦¤×1#ÆÂ9²µC™V_ón[«Œò3ù“bZwI«Ä˜H/¥¾þñ¶ß6ݾNLœ¾®µ_“m‡b4>”«|âfÚ ÏcŠ{DËúOþéˆ{:™r]±dÒM%IWÚ¤ß{7,¼“4¡2¬|vàíW/zˆ¢"0¢£u— frÀʇ‰€ã`¢ÄTìK…ˆ9³9ºÝè–9ËV‡lAŒŠ–aJ€ :f#›ƒ9`¢Á$Œ*€Í‡bÑh–³ÇÓÛgÖϬÍÔŒdF„LfdXñÅÄñ9Ö• ñ¡óÁŠ»y¬úꇊ]äÃÞyÈÁ0f*f;âá/ñó"êKÁøËÂ_s¾¶ºÔuP$ö¥Ô—Š}i 懿̶“–‰ÇÓ;Ë€‹P‡ÃäƒY8/Þ{|°u$1µçèî¿ìÚöêÖ®›ÿú»M/üùåç^Þ¸aã‹Oýö½?î7§LEÄ‚ŠpÙˆ(F!˜ ˜ U ¢ÁĨHHXΞCS1i]9Vú*ˆF†…DÀ^Ý~¢zÚÅK[êR4òú%ܤë“rS©t*uù¬æ†ºùLlK/òÒŽì?´êpØE8¤}@êpˆ‘Á¯Ã!i`:á¨ú‡RQ,X†^LÒÀtê—d‚1å"u8$ LmA4¯ü¨¯“:ªü†F²¿$ LŒ"bòÁ$¦c_c'€ILŒ G²¿ô^DÉû’401S„#‡ßY§u—]Cµ ³êpä­A”^vÆ—îÖóƪ2BðEç˜ÁV”@YøD‡cäÑ‹¯¿ëæúEõóæÖü¾³ûÐ1×!š6¹¶zÖ¬ÙuDLìä ×0³½ÿPõk &n]1ç%]~CdXAÌÞš(¢ËÎþ²5Øèc[ƒ©L0&ÖL\ 3ëZˆL¬Šê2ôª¢¦K Ç`ŠpØû!íØ—®…È…|ðÜekÈ:'X{ƒYk°Ü2ôóõ!³’a#2û5ÌöþC5EAfϤÒ]ú*>3c ø_7d0xûâþ™°…P„Á%Á.ÂALäñk;OÑŽf‡hî‚+Ùsˆ™ÈarT[†w¯è.»}å YµËþ-ÌžÖ?x†NÄû€ñëF Þ»xüðJç¦hãKw–‹/áìCÌì‰ç0;Ê!ã2¼{%6&aÛa…?=%ÆTl!r¨0¼â"Ãc@[[[´ñ¥>˰—ºÛ[›ZȆ£ÙÒ×Kçp¨`8†°Õ˜;€2D1º°÷¯ï¬Ø«ÄÏY+Q{þǾâ ƒPív’û«ÊŠhrbvYÒõ½@k> K8>¸3à/  @À"«½í®¼ÈzöË_Ëx½,Ày±s» ƒ@,N=öÿO=öÐjOÝH˜­ŒÞS¹x=XR iÌâ•2ÖQMeø^¢\€óaß_Ÿ¿¯j¦;ŸŒÜ2›¾î>¬¾5¤?È'±¨ñ7žhœ/Kc†ŽâE|€Ò<ŠPÿai沿w65¾ÀÉÝòÇÀ3é”GòªQ˜ªÇñ.ñilIuo%.8ªpiH-ñ¾­Ä€÷¿®ŸhÉêlš[Œæ4qå*{¡Ì+Û=XÑ ÄÞ 8Í/„Ç)ûH¾¥‚¢sýÑ{‹²u§$Æ^îéK… ,nD|# é|ý‹æK¯5†ó²)%z¤gS-ýÙŽS&§ù ·v¼;ÃЪuúþ.½Ån+ÏÀW³·úÔGK¯Êª NK¬”žÍkR?æî8Ô¸²®v­É•U6V3²Y°sOÜ Ó‘lÐ5´ûp²9$«‚/g Ö” “׿÷¿[Ôò/ôýêþ°' àà— ç+¨+HõmåúU²‚ft:{wŸµ44×q\&Ë¿`ÌïÒi`÷•…NC¿!ndC¡Qbk4VA´RqÖ91RK‡õÞm` Wd󑆿…q+9MèWõøú6.ÿaçŽq¢0Ñg¨„„Ž#(î³R(Ž„¨$Î ôtâeÍ®|_¶~³û¦™?³y©òN-d¯'h;à,>á X3^ùo—%nÁ»lþiñϸD<Äw-^<²JþOŽp`€@+U Ðît{ýAú0»®—óã~K%Aé«ôÜ…¢WÕo½À@ôbµÞ¤°¢(N‡öøçåb^³1ôÃñôõ|dGj×»©Õ^¸àÉÞ™€Eqe øTwÓ4 ‹6û¢ˆŠûÚ .h`\P£¢&®$˜13Ž 1®1ÆŒŽI43š(b–—ĘÄ-.Ѩq¢FE@@QQqCdߦ—ª®wàbÛ¡±»¥«Éd¾úÓ^NÝ.nuš.<¿çÞ* ÙŸ›µ²m{Cô+n<­xsôUEò—?_&l[ÝØ¢ƒpþÓäùS¼Õü ®¨V’Xß”ü ááááááíkëâEÐùrvêÖËÿ<öÀÂã§ä@„öñ4û´¡u-˜¯ÿ?f bAâÏ¡ßp•å€Étp´6y4€Ò~ çq‚´4|($ n\]“†-hcnáŽW6lø|åJ°<”“ý–´o2îf–)€³Ä¡O·—Ía«j€;rU§ïMϽoÃ8SvŒÌM6Òˆ³Z ÿ”Ê/§T–+ݬ iïêa \à}#ö«KR¿ÎÎÖ‘7:éX XXEȩԺS˜ÛÓ°¢J84 ’/up²‹ræ\"‰G z\LH®àáááááíËò™ù‰ÍkHàßÉYGÄ®}¸Ç8£:³}±¯á/ §|&ªª.«³.¦ˆp}±ù™§ùÕШÈÄ=‡-ç`Ùw®¶µ€‘ŸqXLòvrå`AAØfegûwí zܹwÏÏ׃ä¤$s&l×6>R­¨ i˜DÔ_!dçÎ4ÈBûßmÂÕÎ…i1ñ²W·=Û ñá ¥‚Ö‘±>_¹,ÀÖûÓî^–åÙ <ëØäÉYå¯þ°5lq—ÉÀ$$—]‘]_40¬ä¡Z£v¾[vgëù«/É"»[yýáöõËÑ¢>2wo@~9z'|¼;:˜ùö¥´õ~ý½—1NNwº“¹ËKÚöEÓ ‘Hbô¤#XÜR(J'Ksÿa FÁÐܼÐÁÇÛþ‹)>:[·ñG€Ð–¢Î<<<<¼}qŸ™/Ž«"ýηqG´èÑ–ãŒZV€­½ÃÔViŒf¨š‚‡bÁѺܻòkù4#0½†é®6&éî3ÙW÷Þ²Û7ÒàéäU3æÖõŽlÉw9Š( MÛÛÙy¸Ú»IBzy@ýé’ô¨ÕÌÃs/u±ÌF£a‚ÂÂÂ.;ƒØïÛ±PÏ2À Üܽkk«—V?ZUÍMZÐgÀï”W&KÃ?ì\¸0>>õI¯leò ”A¸á~V1­ªÁ¶‹Ÿ[£Œ=²}åäeOëß_YïÊn¿—Ö½}éX€ÞÒöø8~'{+4ßÁêÛ1©EÉÃ}Üe¶ËGú¾ðmý’¼¥¥¾.Ö»Ó¯[hS+„?¬} ­lo]Ë#›í¥äŒtUêÇY¥~.ž³¦÷ÐH[g_F½<ñŠÃ«mdJO¥Ómc_%`áé°,œ8u&b̨äÔ+ ÃÐ4ƒÐ_Ɔ®Ñ0 Ê ntozÅyÁ G~9J{{y6{–Cæo<õËÇp¥OEG&Ž^uûôúîж Lº˜ÌyY’‡‡‡‡'jCD,%¡boAEÀÐÁÁ½ØßŸ53GY*É/»ó°Œ`˃œùÀÀS·ƨ…6]‡[¹Ø%IÄ)Ì‘|@L¨€iÓ]€†LwM¯€]º|sÏž=B¡P¥R9::nܸQYWq”zÍ›7O$uéÒåäÉ“Ñs£8°®Ã­”XD 5 m'ò´»ÚYù¹X_Þé¹è0P¥x±àGÍáí“üÃ÷˜-`0MA³„Šì`*,Ëj[¯ŽÝðË‘†êY"pA|<  Á0†Z¶s!,Ôê“h7ƒpÄì ë@4¨Õ*…U‘«Ï¥ü†,‹ÛøÁ_–[bæaCí«[wE°øS &)‹=êï¾ïêUÊ칈ÛRö9‰¥ªÄŒ·˜rœÓkû7°(érº-åîiG}ŸñËß±ðGP~,ÚÁÙ±¬ø¯Y÷+IOg?WßÞî+®¿µzÔó}à½cÿ~wÜt°ÖÙסÕ6Œ¼V#¯ÉzPæÚöåáéUR\ AûÂ6pð@}‡á”;íÉŽÅ7ËÜȯ‘c?~5nÊ< ò ±õòôÐ\©×Ñ ƒ1pq¨¿25 íkÔŠÛgþÙJ}*<2ñ¹U·Hs›˜”˜ÌmŒ‡‡‡‡¿â¼Æ#pFdO±P ±¢l­„޶ÂÎ.6ù_ùF.:¬<;bþ~ ÀpfŽëµpÆ –ªÐš`Íò/q“ô/Þºô°ô8©}ûBˆ}!*%Ñ Ÿ'›†+`-¦»S—cºkúüÃcÇŽÅÅÅÉ•ôêp%ùò²¥ogæÜɽ'×Èç›[YY±sçN//¯ˆˆˆ½{÷–dq,`÷Î'7UÀÔ´½ƒ»ÔÁÍÙÞº—ÛÄ”>³bþ¹gç `¡_ä`6–%iššftç±ÐC‹Ë¸‘©VÑ •QÔ+#ÂG% Ñ£«OÜ Â»V®!å/ü,þòþÜ좌˜m)V½ŸÃÍïýÆÿË"‰Äzÿ¿þ\€ë¾¼;8VÖWB=€ˆƒUf‘ÍaÞ®¸›™E°ü‚{.V’œGõõê:Íü^;Ú[¯9˜ ”svÑð…¶çVÜ´©;r0øöÕÝŽR[ÒÙ½ûβͺõ¾š— ,…qÜù¯¶„Ä>«}a|xµ-#¯A«¿Ÿ:/ <¯MìK.¯3**'ÿsöù°Ð³’ 8‡µ)¥B®-wk//¿€©¸_jRâÅòÂ;ã¦ÌF{aò\Owò?« € ол‚dãW^Â8ã»û‚Ö’h˜•WYM=Å6¼?¸ ¿ÇkÒOZ¾[Uþ ÔÁþ{¬ À Ú ®& “÷îLJ+VhÝT Oûáã~õê{?[f43G;ÊN:6Ë«èÜÓ×ų^ï†Á'[ް&‹ŽCJ^º…/-*Ñ–˜Z-2\ÃtÛ#è§»×&¿ß9XFÒ]ûjÕªïvWZTùiËÒw`暥"‰=Q5sÀòWo0¹t!ݳ.ÄØCê{áîU0OÀÊ+˜:º„fi¹JþØØ­} 2+ÿív¶¶ÕVõÐæ”ŒžðÞ*eq¼¢J1îÅ~;¶ÜêÑÏ Ô´º¤®*±V:”i`·OÇa{‹íʨ™G«T }iêjê³R­j²òzoKÂ0ŒOG´¯êª*¡PlXÀŸ‰-M3ᣇYh19Í‹rnöèÞI{܃?|†Á¤¨W°Ez€SÆFÎÒh˜±“fý|ð뱓æ@aQ14âáî\“çDèòt–U«ˆ¨ƒ±I‰¹Ƈ¯L`éZ X[vˆeÉïT2æÉ!>SŽšo_hYÐmÏ­ƒýY틇‡‡_úÛ{_à›‰$¾yàí^/~HâNoä'opà fæQGÀ ™‚ò]¢ŒÛ~iX1nzѹ‹¹K=Ü¡‘ã×ò  Iìê(iƒqHÉKß¾µZø¸ƒ¥ÂMÖ€MœöÌ%,‡¨Ž€¦¦ZÂÁpõ!¶¸qCèè-—¯ÝÛNâX `%oŠö{󳔎òý:Ü8ùi–T“ FYÓÌÁÎû¬Ø—î!……ÒÌc©AÍHêÕ( œÌøåÃÿP)˜.Nj`AsŽe:J`@2‰;„xZôÜ·;?xnÎ*«XO_K‘KU>dM±/Ÿà×Y ‹f•BñÍæøY "°öeiû"éµ@Rg—Üœl‘ÈŠe5F+`§NŸ3z„R¥Ò]†g.ÝC«é1ϳñóuŇJÙ$ØÁ#B±Møí ¾€‚Â"Œ±6eÚíóßÉß„AƒúÑ´ŠlŽ7µÁÁ&Ïuì],'ÇÂòWcìRü¼²…_9'Ž®#SBßNhšŒÝ¸M8ûaÈÓìáþñoÿ êjòÒX ´ßÍê\VÃpsF¨UJ0ˆL6 --¬uo~Å’‡‡ÇYÜ<@Æ­-þr•ó€ iFí A4[!É» ¸»HÉx˜[&;È#z˜‡ãu0ÐCM‹Ô¥y»Êúœ›všZ•± ØÐ¨©¦¤»Fg!nߺ}þ«óÏßL¦DûUßvuðI ïQ¢›"¡Ìe€@(úËßþvÿFšELŰ%ëSlcÄ’º”FH1¡c JÊmœ@íßÜøw¹)y-Ãh°õöî”÷ôÀ~²ƒah†U X–õ÷ïJ餆öÓ4­Š LމÁ"Èdh_ØB|<~@­©ƒáh¨^ƒCcU­¥Ã\êpöšwêëkÙn£U˜Â+àøÍŸ{ö×½úe»·¿I>à7æý4ËѬê•Ч®ŸZ±û…å •ÙÇ3$äÒýd‰ EpüúÉúÔÆÎÚÓÓ£²¶6Ô'´˜y,ÓQ(Š€ ´ Ô‘½:=ê‹ {ýÜœ¡ «¨ê­ñQ¦Ø Ú‹J¥Vª]ûÌúü“¯f„Ú·}uôrʼ›ckg‹VRT(!`ÿ™[…REQ@.¼4d p ¦òYJ|;JA‡‹çÃò˲¤…)÷Îצþï¾û.ù ®ÿ&ôëÛƒV«´cR5úùÈã¿~>rvII)¸ººpr,\ôUú¾Ác/S¬" ã¦rU“D=V±ðT ¨+Ÿ|[SÛ¥JÃÉ¡¨¯Èñt1ûÍááá틇/5OÎI‚N3" „)ëË¬Ö €ËZ\á4èa3pV X~dÌ‚Ï(¡HˆÉœH,Y5¶B”œÝëÃeoìÞ¿i64!xk—á XâžýØNw3'¯7l_ˆF"ŒÛ7vâ âϯ߷˪΢*i×L±ÿ”·Ü*"Ýû§$&vp[DÀ”?c¬öšÏ$FïF@Ñø$#<ªclLÈn±5:Ó‰¢(G{‡ž½µS[˜£h¬ï¼}ç.øIaX“¦q (–««q¤¥¡#‘øIÞ€½_±`n4Z™ €6ùŠöÉ8 AÌd׺÷#/¢4lu]™•P<ijÿþԽúUjT ¸ÌÞÅŽÔÁÌùiŠT6JÐãÇÔ×Û6à,qQÚVŠÐúcÍì~µð¦ˆª—ˆÄXûúÇÏë‘ÆÃÑE­Ñ¬èWtó:>ÀÝÝ7oR„©Ç2Eß*³PudózxŒÀ(-=íûy˜{q›gÀkjZ­n06FÓ6öemkÛ§O×+WnÙÙÙ‰­­KŠ‹<½ì Ï">}öÂèÐa–®€áåõ²sÊ;z;=¶¯ó“g¾ÊhXž2=õ7œô_»žYœ{+däh²™ðÛ¯Ä0tÕ‹«c!ïtú7T¿KþÑë÷òDÊ’¯ åSõ©ÛË?ZÿBäÛq,KaCBt¾Ƽ³OWÀ rÿA:³ùoo_ˆB-ÄV(`á^¹—êë5-ì`’G-,ˆ`×ï¿LÒ»g©ÅÇ!Ð.ãÐ^ªôh'uµÚth×ÍE¾üµO =é2~DÃé.®#鮳÷:XW_k£ªçµÊ[³;ôø¦Æ±”I «SÜZ×áX´hNV´@Œnü7IWS‹`+ 4MPB +.¤r3!“6é"–)õr:è0X6€,ÃØóíÔш¡±pþذüEæ¢>ÁïA}2Wœ´ƒp‡•µõá/}”÷z˜îC¿=³ï¹€á …Scq‘Øì5ëv­[cÎO3´oÀݼLk=ûúìâ7^í½Á¬ARR®ÄÝÀ¼OŽM­pÑàÛSØ}í°Ôžî(žlŠõϽ±cØ‹K32 ‘úôfʱÌFY«Ò ØOÛ¶Mˆ…–¨ªª:ÿÅ`@ç;žS¦RvÃ~øà×~óÔ 5ÁgJÛØÃИ^wò±ÏzPéàèèéå Æ@ûÂV¥FÖàz0l‡ êßLÒ€¨ï >ÛȨhV׈pÓt/2ô?6‡ž4­Ö^Îñ…)s¶´´ gNŽEð›yìÐæ±“Þ|XÀ‡V»´•ÁúU÷9?ü`ìä77²P7-×ý Nè9÷¸ùg¾?èWÍ:‹óo $qN~îcÆ›ó'†‡‡‡·/°rµÕ…]ÿxü ÝiÒüuº7ÈdYؾâ90H‹ "líìñ¶¥z÷,µø8Q鱫»N6TÀ„b‘UCŒTÀÀÆîffº{àÀƒîø8.|}”oÿa«KÊ: /…É…´“æð™må)µ5µ3fÎ8qâDfF*Ǧx,`Ͱ0 ©ÂC¬÷LÚ×))àî"hY—¯\{áùÑÚþœ·SÓÒ ìgÊ´"¥J&Á$$“)ˆ€¶u{àã ràfZ+& *è@r)½A¸Äʦ]ã» ¯}rÃ+Jjôáßž<Âh&;ƒ‘£9ü]6gÆÝ¿úup}T_¢µ¯Í¿~Š5Ú8Hl­³*r?•­1ó2ôÞmyã˜%xÅù+9×mllÊ˲OÖŽ)ÚôÙ¤IwW¿` ;vhë`E¡RcÓh__Lx=šÈX3ª€öÕ3z<§koû2cÙ®ÿ[%í5S­¢ÉRÉ6³/y]U}}´=Å $†3iâ$g~K52DMÓŸïÞzôíâ ÜÞuxÏØb¬ ¨ À4LLú5:—¼GHìì,%=Ü«ç¼ãû>ˆ˜¶t% Ø·ièÑïÕ`ô«òæ*r²÷^p,CKŸŠîºöÅá›ÃÃÃÃÃßs¹N-Šœ½Ú×Ï·(lšìÚECµ*!ä­ñ-,ˆ¨¬¨%·-ZÙ&+ŸEÄÉòã¡Â.ÿµYgòF4ÉpÐÃÄû€Nw«dkžVóéÜó¯K–?~¼´´4ˆéQS‘1œîœ*X,ÊLOݵã;tÅ¢ü{xz¬ƒÄùÄÇÆ±&-#¤êûYïé4+°²›ù%^Åb›qëé,/+ÔÑ30ŠJ¥=Èu›uÙ(覥_©©€Y †K¹Ìq9$&,ÞáûuïcpìõHœp¸,þù¦å}ìÄã‹##P«†v ÈÈ»ê#õ!öµá×ÍÖÖ\mñkny î`¾}ië`x¿/ÀG#éË— ˆ˜´cã¿_[¾„ô8ýÄ!gË ©€ýôÅ Ñ/BzTä™ì‹¼£ó×Å~»Ñ¹çÔ¢Œ=c¬jKûR)VàJ2i£:"Û9Ó'ƒWÒRp®^ç ÁCð@§/ÀV[†ÂX€Å¸’– ýjßGÓb—Å’MxvPºöoŠ˜úF¬FÃB£µ/Nááááá‘«žTGjk,P6¤rµ f߆Á¦£{ «ª<œœÐšz×oÚú3<ƯK{ X~B‘ÂÛNÐå0v¶¶FÒ]ŒÑµôÓ]£WàX¶lÙÀ§OŸ^[[»uËVk›eKW¶ïâÁ”Uú¹ïÚ³+¿¬`„ b±877€sS (!qj (`šjAÙ ë9EÃ:Q¬î»qx·SlöíH'­®Ã¶N^nbqãÖ'+6ët´¹ãjZúH®gÏŠL¦;™Êh)t/1/”À–ñAäÚôÀ5xƒ¯­‰w/}&ßëhk-ë†"Õõ•Õre~E.Úî+h€/¶d“ÄØ‚å©®eíëE€íËɨ}!Vƒƒuì Iaë.0 Stýb_–C×¾ðŸîhZc¢}‘“÷·óG¾–qƒÁQh¡¿Œ68E£a¿ÛˆÄ³¦N*//¤R)XN½ÛÂ+ˆƒmŽ˜öf,˜AßWNìû8âþxxxxøò¢ EZS1" €-×Ó"SÜ)lf_×TK¿Ü}ܶ” Ö.3n«qjjܱµ°ú­«€aº«µé.^›ÞÄ{1oݺõôéÓÑs£ÑÔ©êêÞ_û&4‚·f¾yíRFföÚµk»uë¶~ýzÜäXÀ¬¬mÎnI°±ê# íëUdgc ûºWfÂw7\¬®Së húË6˜úrÜ»Ÿ0À¿ 3dšuŠlHztáKÒÉ‘p%œj €ê‹(ÀŠ•Õÿu×ÔØêÀ积¾X}vÏ”X×Ì(½V𯟰æRåòêøBжm´ûíÏðíø`ÐÇ´©1µÜ{<:gÉDTþ‰ø2·óŸ‰ã##·”X1ª˜uì¥Ä¢WŽÌ‰Ò,\Á|¸åvù £#•Ù]˜‚ÀF3 º‘Uwj±4Üln[¸g…®Ð£6‹®ýÓ‹¦Jðv{UÙDOA\ül6ë¿ìΡ…aÂK¬Á9V°A4‚(°’!– hªâIzå+÷†èz?[çS ·UAÿ/yaÂÌ–OQ´½Ù;ûØ(Š7ŽÏìT Q‚ˆJÄØJËKÚ WI¥*´¤r€”DMx‰ð’&è?˜óùÃD%5¾Ä@´Š1XiÄC¢F„ ‚PL‹EÀüJ[Ïá–îœ7Çsí.·»w|?i†ÙgŸ™¹Î}ûÌ<Ë€±#tD¹¯ClAtF€€]`½  E"‘¸“K•Q[]`~¿àÈʼn.ßF:ÌØ‚¨œË«6×4®q®kܧiº¦‰Ò§‹KQjº~Ý(æOÌnm4Ü˲븫º)Ñ@<Æ2ièc±”æaE…M?vÒøq“GSS¦¦×j§—?=#°`fùÂYEOŒgœe þ<5$g @ì7Ëè÷xÏvëíYÓ=Óvû=Óÿ+€Ž€Åã×+ámav‚Á jl=öÛ¹ã'4ÍŒ€‰R÷é\×5Ÿ®û4®iZ¼ä´´A|£n^šw“Œг}èI£}©CôF7TZÑné›Ð¸÷€p˜Z¶2uk_Áí77ŽYp ïÒxvÖ´3ÝŠn®Û0š§¿lGÀ`\VÔ‹^áV:¢v3KÇïõO2¶*í÷~E9BEq¶‡÷• 1GªI®ô²E³é]k÷}Y2ôî©…eOÝ3‰ˆ€‰3`Ö5ŒÒ›5ED8g®y¶ÍÚ¾J”—ô˜……^g@c «[åÐþòçR{ûœo†wJ0n@‰žù{P/¥]õ´ºU/©C²g©S˜°ÐsT§F6‘0÷€1eåÌ=Vþ°õÒéÏfÎ^ì/qI|5'”ƒ°?IÎÊ]韲­ìS1¦ 10ÅNáÍYÓCµ±¼Ú­‹Rãæú%‘FÀx®—N=Q*‹ö‘—F)=’‡@}Ù×`é—­¨\¶$Ãóo?ùgûyýÍlT:® #qÌþ7~ï(!Œº…˜ÇgMc{¾ˆ€Ôt†„Ë]>Qú8>Ó¾óÐù<žäæ€.RŒGÁzéŒÈH­åS Kµ6W²X|³)DßU=U‹}Yes+ ÇgMkÅAÅTotªuònï"`À“þâøÉÖ†Ù3ªD¥3–g&ÛoÛÖ§<¿;?§jéú¢AFs¶ÿt;cl܈!Iá¸uk–VÖ<Ã<‰[¡3:ÍFŽÍúñŽÑ¥¦ƒ{‰±9oÝŸµÙÄZ[ú·:=$û€ï_öÎ4Š Šã³æH#aá-RYR?®I á@.Øų·G*«@’"!`aeaqX¤<  6 ‰ZWm¡ Âæ¼ÜæÁ»Ì\Þ;vXî2ü„áÝÌÎÛ™#¼woçÝ;•#^ì±XçiCk³*}ï«ñÄWaø±ñ¥ñ)¨Þ./Þò©§ºÚ,9Ur}ðµæÝô7²6=z"›=n?pn+³O/ö8ò®óß…ûV€D™H™ÐéÖöÒ#jI¦ªÕÕ töEѵ$Sõ÷4¬1ZÒš6JôœÈ(Ñäžz˜»ˆz’¥Ì-2ô( ;ýâD‹]$/í·¯É>ˆ—ðcôí•ÇæŸåS¡{CÍ» «Ë§ˆÛïZ¢˜YŒ{óBEeœ€E‘ò¼þÉÒ˜õ6Ô6¾þÜ B¿RÜ«Ô|¥ö‚PM^9Nò¥ÇZ$˜£Œ©åO„˜kÄQ~Á™õ÷yn·b2†¶>/cîÂh˰}ÛG¤æ?tº3 ÷UŠooß( 6œ·“Œû-0ì£YNFîÇÛ2Þ!Ë®Y˜EòNÊ-«@æybÂwºÀTºëm”Ë×âzA¾®oR F-EeOkþr½EÑWÉ rzºnßÀôÊ.”‘ƒgy.#; À¢—Ö 5ñ×ùä*!P½×êÂ6 “&ÈŸå£<$œm²0mK\?>véáÔ¡í{¯¹8ü½M:uƒv‚ÍTŠ“µ&e_ö|Gî _ÙHýøìCíÔï¶UDI¼ÅŸÛÀdН{Ö’ÆΫ%,½d ´aš: &ÈÉ;¿ê§ .,E—ÇJ"çÜÜ9ºuæö£ä4ŽÉÚ'Zy(k_6Oa2/¬ñ±RöóýdBXþµTŠ6R` èj]aH,·}8'+쥉™Æ…a<þb‚œgÝú•–Þö€}˜_±ˆƒàðî´(ñÉéiÊ»JvҮܧqê4õçÛ¦[KB"§×N®%õ‰`a¾àÓ6? ÿhE†Ei_ru490Ó˜Â<6sã콟W?BB¦0°Qøa&ˆíÇÓ›9ÄKùç+’&‚𛽻gi&Ã0: †ha#¢ "ˆ ˆ`He«Ä‚…¦±´Ò_ X-SØXYˆ(Äâ} %•l§b”ˆmmËAMq7vfŒ×A†0“…Ü™Ì>\öD}²ÿ/Ÿ“ƒâKø­€Étk¨¯S½È€ÔåÍ}<2šèQvà«¿©kZÞÅIL #ÃW§Ê‹Ä“ã8©õÏQU>î-ÉÁ@èÖl°BlN}>ÜñãsŒäÒÕ1NPõõmëŒý€ëb¯´ùÔdVc®€µ·r=m{‰di˜¥ôþªÛüHݯiî³/>D•/s-ûïWN户.Áö€Éìëý.ˆV̾¨ì]‰Òä&o¨-}ÈÊ1s‚äõ ö‡·Ø&Û½”xR˜Š-”÷¸u^JÔðDŒÅÊ Ø+`˜-X“:`É…yi>¥¬€m-ÏÈ_&›O/J[~Xû=vü»`ôƒÒKÃØÝGgpÈÖ¾ÛXãc-Zba¯ˆÀ ØÔtWz7¢îiåØsΠ-ÎK¾Ë—c¯Þz?WÏÐ\ pUÕŸŽuÔbVÀÌOó*õ÷ÕŸÁWöÌØ`‚ÁmÚ ²6HåÂe“¼IY"—°:wnÔsW!è+ñü” Ø“¯¿®"û]¶˜>­ÚëDçÏàõدí»~$ L‘_9@F®e€kìš1 €0 EÜ=‹'sõ&“›‚àtvê9œ ìøÕä?D¾)ØdùAÓÿMÀ¦ã”¡©B˜e‘mÕ»jh¼è(]š ÙÕ÷üóO…ÛŠ‚ü±ˆàqb8IÉ–“àŒâÓ}®¾³×{~¬[b±±‘ù³Å÷M“ý*¸vÐjí#ØŠÛ#!„Ô7{çóÒFÅñÙ&¡HJ‹=Ø[Ñ[ -9Ø‚R”‚E¥·‚ç‚9„Ä^zð/È]<´õÐ{ÿK¥zò Zˆ‰ZÐu“éÓ1ø “™ýEÂ÷C˜Ì>æmæå0ß¼y»›¾¬€½zö°X¾ÈÁf‹/‹“SÔ ±[,7Èn[]ÑŠÈ;ºÏÇ_ãöò¼È×<[còÿIoü’» ’QŸ õt~±Ýðc§ÚM2ÀJú†%‘÷ù>Ìêä+Çs멲#Ò}È?T[:LÕ²P3¶ _VéuœŠüryxèß×=1sgw}9G-õÉBöù€¹^”É4×6mt˜pÊšáÕçç-j䟚z)K´w@q_÷eÜå¥Ïà Iúrk©5Á/yà@^½Ë¦_KövÌØ+Ó…7›«ã¿›x=pe«z@÷}QVª4(ûм8£q.¹h1 £¦)ê ß×´sI¯>yäËý£àמw©¼Ù±,YºÌjÜÿ4v²Ü%É©³°rQŽH+Àk{ÏØùyžh¦€Ñf!ÉU|ŽõSÿm!OÑ.m¼½wýÃ'õ4ŽRå7]yèPû²Rˆ¨ kLV-%ÖÝ×ý´Ú’âOH_¶Îš§ƒÿnV õÍÁŒ8 âØÆâ iê`ë¥G²èú噊€{À~ÖêB éy/x—%nÏ­QÞ•‘Á“v%ëÑçžæo’L6̬ÙÜ®:1…ƒ«ü ÉÖɹ{@䟨#ÿÂXmÆ9,‰l°Ý2²@×A 7Y¹Æo¤‰ÿÙ»ƒ—¨‚8€ãc$Ö¡¢QÂ"¸ÛÉëv =h±¦—èÔIÿ[!±£` <ÈR°‹ÚAñïf¤-\!‚À‹²Þ–ìg!F?Ø9ÌãÍó½ï‡å1;º¼™Ù·3 3ïýÚ¶«ŸÌ?*«…‘‡’hžt\ 0™nõß»eN¤BæÛýBöÁxwÞÄCJfºŽ:ÇWIbÛìÚÛ}ÙÚ×ÏÆF†§ Þ̽>ªÎò{'%‘ißõ;l5njұ^J^ß®ßj€ïÍ»rÜYŸ“1+™+`7¯6?nܾÑù~|æô°¸rߌóªyÜp¨‹Áì @$Öžkô{ÀdöµôtúZÝ?³/ÂÛ7"z(†ã©pèZ5à0¹ÝˈºÀð•(â€9 úÑ'—ËÎo¾Z­ÉKòÖ$€°x°Ö×s½R3é`Lâ€Í¼x&G€§ýÕ?$À¥¤®€-N=‘×Fu§¼9!Ç¿oåÚƒïŸ1°4—Ç6Ô§ÖZ”YŽáÀg;¤FX_\ªZ°ÚÏ£B±”y¾àùjäwªóis<Qÿ³ûˆøèqW>ÇìåwÙ Ø[YþeéR£z¬“Ž‘õ_ÌÊi]ZK] äMûè°žº^ºeT• g=»Î·<”zéêÌ–1ìgt¿0ôÇ«¦ã1œ§=ƒûècß‚¨–¿¼õ ÎŰwÅ’«Øî±Î­\þÍÞÕ…DõDñ¡— ¤(ˆ ȇ>Þ2¤·ì¯%e–Y«õàKRPôµôÔSFDDhA fjÙ[„–`/}ùÆD”†ò° «ŽO² @Ã?æØÛ¯èe¨Ý•§ÈŠñ5S¨eÜL0Hç+‘„v¬©ÅH½ª<Ôɬ¦ÔHÝn<óU4cÏVÕÓŸdº²æhoëÆöãwó4^)Ä*êcš 641ÇÆ·0ÿÞàÊ`08LáÞ‘šû\˜l~*„ø˜Ü°í¿-ÃïÚdºãý¦½ g/7 1ØŸ«WNÿ!—¬zM)Ô9àÖçíÈ¿ ?±üò:š`(‘û¡tOOÖõ#ë¾Û¡Xƒ³Q½û䪌>‹íÚJL~ÍåTÕœ|Ô]¿j뽂t?Æë¨q¨š'—0 ¶€E/J$õÛóÛP_Õá'Ùpêe|÷Ø—°¢±W¦o]¨É qº%%µ/wû]·‰*Ú¿ôVqAUÄy œƒælÙp§x sÇÍï–"äC¹m«Ü}"¤ÓavjRLŽGYAq&¿ [Àü/XlÈ}o°±šÁ`°Œ ¹Ée'Þ„Ó‰ 3a.½|é’-³ž‡f¶/×þxïàª4 @äŸêKFv s Ä–s÷² YÚÈò Ø3î¹e0ÖlïîéÚWÛp&—ÓÓq©¤º§/àñÿñß ƒÁ1`™L6›ù.ÒÉ0Að+bôÿ™ó7n»û?WGò§K¿;ùW”‘ ¬‚tè=£oÎSñ@y±Q¤ |ªÚ¥Ê«å°$k&Ž5d*Š™‡çaŒ©:±õè£åÜÓvŽï;EþU—’ê]wöhŒËtW[󺚇$rÂÚ'¾.œ² hÒ÷ ýkit‹‹5Ë`0?Ø;—'‚( W«3®fábÝ 1ŠfPpuaDp4â ˆû(¸Ð½ ^A}ˆAPDܘ¥.DEq£.|W¢3I[¦ Ss˜ª®æûh:5•ªÓ§ªCRgþTNòáÝ+3ÄÃÇÏÏŸ=i «éæˆò€}{ÑZºø ýõ½sýÆ¡ÅúÑ¥¶-ß¿yçÈ…’AEê¼¼®¬‰qqYý½ s3•üÞ½ïàÇ÷¯‹ìã©ÛíÞ[îäUyýü©Ë¶°kêkò€}~tÚžk­§_Zú.ámÊš°îéí|ZÝiÏ_ž-ÛϬÒ)`z¹¬¿–šéYûhziÚËÊiß”¡$Ä€”A¼P,(E@|>ƒB@ˆ?ú" ˜zù}i黄·)k<¼Í}{ÀTgw_¹Õ²…™­{·l;0(ÏÍŽý;-øïþ"bCðû£Pò;+ò(€8·.Gð3KálúÛåÅ;-°Lßq¦Þ®ÕÛ¶PËþÙ2z5 LßQ¿iÁ¬+rfü €lˆAÓw  € €™c·ß˜"^^Ùot  ˜i6æš Ûíq¢‘ÍüXÈÎÆ#{‹¦rÈÑÉú€þØsp—ÌGÉô¥öèPÜ5W{Y ÇÿŒ €™«ç¦Ÿ?Ɖ(ò¤jEwWß ®¨¿„lãp^3pÁÜóüÙAeÞ ¯íµ“<¦é¡r* T0ýòQ™ãK¦9‘f$f ’¡ÇU |å ÷ƒ§FÔçv“5Q'wØ„–ˆàÊsd-L`-Òź©Wƒ¶ÿI.–פÿá@ø*ÌôLœŽEg\½¸ûG_¨^@ư±ýÿ”Ygñ¬@ÏË£DžáÊBÜÎ8jD{á›°)Œ¸p;#/!çV³²ã˜dÇlȨÏa³ÑËô?×.Átç®Á_öΆ~Èÿ?Â/¹•`ZBioÒ4Á±CõÝQÇæ*â)klá^èjXÆ| #ðøþ6žŸ²I$¶dÛ¿¯eÑ ˜TIÛkšyØ;c•ˆ(ŠÎ°A«m,íÅÆÖÊRðW,ü Eð lmDAÁÖB Á­Üw D—;äâ„dsž—Í]§Ø\ß¼lù£0c]8ç÷\øÈÑ Ü8aàãØW¦=´`†Ša.OAå°ž•Þ¢4—‡Åaó9P„ÅbçøäwâþòÂb,YT+y¯‹·Ô>€ËaMË2|@¿̆â$a ¾þß­~Ü{©Y¬š‡@uÀê3`À¨O›o.¦›„44¢él ^ß?‘»Üôጱ>4þ7Ö;g¬ýÉçάÚA áMðCÄó¹(îõ­úÍn¬U$Ü3i ¿5„¸.¾3D±.D@œ$­>UK®ÖºïfLuÀÈfÀºñ?$“L 6Ùx}ÀN$öI&XJÊ ¼–BN¸ÞZŸï·ûÂîMÝÇÊ2n–»çYñøTmžÈ¶²2“x˜‡wQx jî³ Þ‹–Vÿ¯‹Å[vãDÈ€i ú0‰D/Þz=öÓÚÿàá8 ¸«sœ!æ_ÓI¾žUte:1ó"¡‡É£,PU•­¾KÈ€}³w÷*ÍQ†7bŒö‚`#Hÿ m­”4ŠØy z i„Þ‚…6ÁΔZˆ Š`cå6I„¸ìè˜ÙìOβyŸ"ÄYwfbÔ“ÃÙ™5`r{±ºéyÔݳlqs(Ù•/-Þ¢ïA}8ËÌeq,H“¢¯ãJ2½Ð ñ»Ê?€O±_ÝÎ丷RýÿUç_ËwìKÈ,-±ûL<®\=•ÿi¸·€m’Ö$åÑaz÷åŦE;Ô”Bø..¯w·7ý'Ý^eH*`½‰©~·ª/—ÚØÆ–Lù,4 \jWV_žî<?<µZ­³F=UAûlíÀ2W~×½X»¶ç •æ¹våA\>pîÝן°ì_®`U¼vgüÇ·f#ˆYTÀDr•{ÔI2º¦‘„@ˆ“<×RØ®Ca\…i(àÝE°Á¦…êÙÀ°BÈ(ï‚Yɹ "º‰‡w¨¦Á»ŸE'üV#TÀH'ˆ@ŒÅ9• 0òDTÀ¸˜0 ÷ÓßìUïW3Ѝ€¹þ‹nvPs9ÚYôœ>?¢ÞÏÑ*ùé2¼ilbk†69X6Ñ×’à±71*`)&K iy0î¦9‚Doî- MŽ4Øh—JöeoTx]¨€©€±ÌRù1ˆ¸TÏY±‘Ës§U¡F1bÔ±äYöþ·Y”§[ÊV¢Ó³¥OÈOØêï{ÂXý4òµ îÛ¹=oiÙ´Èá UâD[3Ïålûc:´£Â\ò£?윱JA†säH—&BJû‚âXYò*>…¯Èøjaak¡…`*“\r¶XaÂì1Çwð}År7{7LµÃ0ÿl{Ì€é…S|»Ï/f϶Zs¹ Íú÷Óiµî½Rè€U‡‹ùâ¿áuµ´Ò¢?¹+-òU–4J»Z´aMê#ôÀú'y ¦¯¶0c"k§"ËSÈ‚‰Œ+#ôC¦ä¢ùø!ûäK"‘Ýá¸Ô_ßá­˜N‚Åç ³„^÷ÓüËäm¾ïü€˜¾Ê0ŸÉ(‡âGª8ü+=<·a9€œI$R¯·õǺz{â‰rV-N©TI¨H1¡Ý‚Ò3€ò(À˜‹åMç¯~êìeñõ!€SÚÚìÇÃíYä £ñp°©ÜR»\"g §ãîD ûcïŽUš ‚Žo‚!vÚ‹‚ )L°°¶1’F;_B°ðl„¾‚…6ÁÎ+µÐSP+àƒ¯I"Ä•œQ˜ÈÈêr÷ÿq„sÝÜ%Wìfwdž5`2z¥7©§L)Ôÿ+{ÊÛ<=¹Û Û*š‚˜Hi¾„>ÿû½éI·\þÕ{oyý~áëØOï©Óï›zÚudOûg”í¹ð t{é¾89=ßÞ\÷'ýAµ °ÁÔŒa«ú¸k¶È>váC@¥Ô­-­<Ü]9Mž’$9jŒBÕ¨}¡µëO+϶º­'T;Ç®ýyÿúÔiû˜E,ºW¡‹)_cV0È€û­sÐò¥ü›“é#cüÒ1,VþÜã8 ž (¹+“ T€ ö 2p È€` "LŒ° =uÀÔ3£X³1ëµzv4GG#{uÐ7f eY,ô‡@,æ±·p!F¶Äÿ ô(VTÈ€¹ý­ºëß‹2¬ÇVnK¯üéÝí=íoÔû+;à‹vûwWžg¾ë &‡Óøo¡‡ÅHm˜xcïŒM¨àBNâè™Â~[Áî ‰x×þùæ!¤HÉBØå,I‰eCmþbNǵè¡ {Úüy”×Ó ØbïŠm „a Hˆ}0£P|ó#ÐP0 0b(pqÆvÊ» ¬ø.Ia'±¢äƒwÀðt ×èX6‹ÞàþUIPÚÍT¯Ái¢ÅìN©H¨}KRGq0m+`Îó Ç@c=ÎÁ] Ä:+ Å#ÐʇKŽ9(UôñUÉÝ,e1^Áá|° ‚°‹³W‰ †¢ðf°ÛFÁÒÞBP|+KÁW±°ÝðUŸÀ' [ m,·r×ÌÆ[¤ÜÉõ$p¾"ÌùÙËBΞ$7"Â0颈Ę]pթЫk¦ ÒÒîDKÛJÍ;=ÅßOI †?q QÐ\ïÄU0whiBoA Û£‹KIÈÓÝ­Ãzù%FŸñϨéjh~·iÞ ¢†¶Nì×=ý(´[„á˜]ºsÀüµ¬š.\¢YÐþ‘q\£»~ëP›BpI|oE$¾è§nwzƒÌ™5ÚŠZ¡áñ6Ç¥Ü%óI!„pÌ.¡°úWn´•¸•¯q‚Ö™BpIÄÕ&¾®Â󋞇éM‰«Ñ$¹‰,Ü©_ñ¹Ý>NRÞªIe ²d).F‘^þBhÀ˜Ö®:׺«é@M$…ÿe섲¿ýfoÐCŠ;‹^ÖXºÂTƬ n‚¹¦YotøÜ^¯çV…Àí¾¤ºû"„쇽;V‰#|w(Ú%} `#ˆERX[)6†`——,|á _Á.…6’.W&E0EHcåÒx'è†À"üzÃíz7Ëù}ű3°³s+Ì8þÎ?£²,&Ä«°q(Ö”Å! TI¹›n'>=ÖÉÑÿ`²K5÷q%ÚOüdSMüô_ηÞ/ÿ/õÿÕÜŒúå`Xad«0LUÐ%ùÄX˜*Ì,¡¦Â{ç;,´Ï~~»_þ|ôeëÃzq1¸{&°Û¯*¤ªÏ@êá©Û|̶¯—߬œÿúÞJ)¦§^¯wÐÝ+§ª²~qc»¸Xš½ÌÛø+çN§oTÅ€‹ÁBñùû¤[ÎY"`ùWÔMm’@ó×Z@_ËùŸU¿{±r* í~|ÛJz(U}ƒ’»Gf¦o׿ã$ŠŒ3Iß.3ZÁþTä½TLþ¾Õ"@÷cŒy™£*EmhŒ±ó°hiA< Yï!«à|ùž²o(eñ™Ïáb¸þþè¿€ÌwÀæïXãöO±Ö¸ÌÂljÒN>Éêy›²Lާ3€þñH.`L9—1ëŽò…Ú°•åzÃ(*v?ÍÛf¨pÛLó£ì½¿¿õ¿arý;/Ϩ³Á4f]`¾¶ò?y²©¡Ùr·zÈ2qQt÷[™Nû)ú-¦–Êãî[™Sžô[«eÅɧå¾ï<˜Í‰ô÷7ê¶Ê¬¼îb"Ê<ùÉÎùãDaœ„8ŒQ¨@â*…DA»­Ä]8Z!¢pPŠ‚r É~’óÉîïWL³³“oßÛb^ÞŸÊgÀÊט0‘³·êô5]*šJ !ÀÐáJe+½GØVO_Z¹¦ŸÇ}ÁóÕù%@­û|±žmvuÌ€É5ô€ù›Iô9åu_?ˆú´$ƒƒSÂ[vÁf¿ûñû¨¶c$ Û}³­(Š0zÀ"çªéýþ¦-Õx1åaBL¼+ý¦Ž7]¤*q¦ÃP†Y‘•޾àz9&(A|³wÆ: Ã@bä‘CéÄ#€X`à:óˆ©Á bÌ ÁÂÂÄ0¢m¥J§Hê;ùdÎQÿoŠÆç‹¯v.çØ~ø ¾G)ý ¯­¡¯xÑ–…%CM€jj£ ök±JÆš—iJ½ϭƳækýþjª‹VŒÐlx­ÿïæk kç°º•òÖ!„²þñöÜNßÝ?]^œÊdúUˆ€MwvË-Up_cP!R}âàÈïcm£¿†Äùô‡ƒãôÛDžš¦¹_ËP%ùûgW󃃭ïzô"„Â1kñ Ø×ãXÆ,FÀÀ¹"„@¬> ½/»‰yѽã!ø\;XsHö’Àèq²I a'ÉAŠvU®›ÚøÏoÀ.äbu«¨>Q§\ömëx)„O-¡ã~õ¯,jÚ.¯ÿ`ã23)?åù>éØUl…UÕƒ]Xå0B!dØB2%¹ìTû¬¯|]®±|U®Kж EÑrJÏ·a/§CÍ$ØŽN{° Å-FÊËEôû†vŽùª=[$Û>%™a‡rœqÿ‡@H’η$3šfN´]颥¿rØÊíô¾r|°{g¬1 ƒax^€k™`ƒ7áò¼ll¬Ò à=X™J¤Ó |§š*QøU'×çÄŽë¤Ê]k¿>φGJiA<ý5RJV A!ßnú¾ÏŸx¤”º®[ÑCþÕã{>†8,Iã¸S£í”^W˜A0IîÐd¾?ȳjd‚=äìeâ~ãx`¿±@\/ÐÀ1z”ìFô Ä'ùã$z݅ׯwŸ/Mñ¸Šøä!<@Àß³ÒWø{Öâö´üÊŽý˜ ‚ ç×ÉùYèy¶Çh'fD•ó`øcF$#10‘ÞÉ2³$ó=8>9©/ÙÌã¢þ¹ì~ÁõÄÚz¾/‹ÂºØþòqÅ}rCŽ+nktÞ;¹'].à ÒЫXAP ™Ê¡·täg.©Òè¯'v”ïóOkóÑ3îîçcÅÉ{-+Ê UÂ0Õkq™ceœkàR‚d1kZf̓Ò›:/ôöL¦·üüåèí÷zý¯µæ²c~ÜñÞ Ž«þõä—º¯½õÇO('«@EfÚ€}²wþ61‰9˜ÄT”H¬BA† hi¬À”_Ršß'?Ë8Q8WÉÅç¿OVîâèþù°‡» -ëëSfÅ<ÒŠ2½Ú­'jw6L éðUpÓ¥}o^¿µ*ÚŸ¹ï…6¯Mì)$ů0,2»ÿ,vÔñàTw\[¤^>Ê·Áü¦,8þ^·$Q©VM9zœ.ÏœIùŒ[·”câ¡Ðõ´€Þà wÄ¢ˆê¢ê… Y’ø$Ωö ¿D<ÿ­Õ“8>¿¨W›ÅãOuŽ+´ ‚ŒØ8låž¾µ½2¢ŽC…!a³.– =aÿ0€g¿]ˆtœƒþ#ðÚT^kN^h½ÚCL2‚ŸÒ†ï;EÍø“ ø”ƒ¸õýÒ´v=Ñ¡ðù9Þ«†úéáê°¹ØøŒ;úÜKvM˜þy]NQŽp:oIä¡=ò \¸@:ÀŸ‘°*˜Xz*ˆáxz%“iášÀ9ȰY¬d¡†1“IGüŸÔIcí i9fnöï€Ó¢‡_ýõ¤P¯®š¦©{6þ# kŽÔšY“’³ÓAäÁ…Pw´÷©`õr®‘1‚Œ‹.zM’ƒ§2•mßZM@£™ ßf ³‚¿Ê M)‚tÕúaïìu"†a 'žƒ`&f&F$žƒ ÆccAbàØy‚®üN°²±0ÁzK‰T©Fø„S™šæø>…¨¢upÜ–´qí@Áúør„~9þŸ°ÔòðØ?8–%øs퉳|Vòxð1Udž\#¦3„°Ó!²ÝSÐjs™ß†Y{mtÇrÊ }ù‘åÚ.t61€ªªRâ”ü0³žÎþ¥̨%¬€…oŸle†ÚGvͯ@ŒÎ›hbX”qGd61õ–eÔÓÛ¹íŒ"=`”0³8ƒ¿=¾—a?u‰ª‘ÎàÓ!âáÖówܯU|¤P´Îå»Âd£@çáùÙIUUùõ_é  Þ²Œš°¾bÀ̼+fÄ…Žû×ÇÛ/¤ù-'z[5ßV@“Ù…LÙ~N‡}p7«Ú‚z¯-ëÓÏϽÛÅJö_ô´æ×9ÿÕ²þ»Þ}ýØAÕZPSÀ`V&€LHùì¿–ñxÜlL~›Ôò0ï_ÞÌ2ͳTÙHü² í£S¢…ƒuŽ7×snêºîRËPÕn_ܼ§2逮V3<µcV[ð€9bÀ \©Ìµ³âuFs<`Ä€ùI±Z~D šâÜÒæ4g0[*`ÒP^À>Ù³c"@bv+Ý;Ô2HdüpÀÞÀ@4œ—=;&èYÇ‘ÜÆ`d -œþk¼û€{ìÝ!Â0à†p Ð$ˆ± Ð&{ÎÁa8ÁôÄ‚û€X¨"Á´!/ß——¹vËLÓ÷‹×€ š†ë– XÎùþ2æk¼S³ w04 w_0sÀ†~ó®Ëa©áSýòL4ŸÙZv óë"~CUñu @öbïìq ‚(Œç F"`W"qNÁa8)!`Gàœ` ÔË~opM·ìÖ÷ FCãzýShž»ìúò×ZUª>>t8Y„:>J8Q¥Úúél1µÓ¡[nl¸Ð™k¨ßWÑ{¾Z}^<ŠÄF‘Ä0Àó0žÖ¾~tÜwµ¬…]:¥4½¾Ä"çÇàdÛOÙ;iýoº xXþ ˜÷²Â?õÇ…ÇU~Œ^ÄJ)¡[ôH”áBÂxü¦»@qÔÅ2&Óá- Êp?ªÂô ãH¤Æ¾[œ æ§lmÛ¢¬5ûpÀŒ3`{‹a¼†Ÿ–Åø]î†ñªv\ìD˯l“‰Ê“ýnLwK¯±úÖš}%ÒaZj;–ùÅ,í¦é§»K8>‰€€¶Õ˜¾f΀YÏjöE¶em†8eÑ]C+#ŸŽüšSM$JÅ\øÀ²Î#VpÀpÀZêkæ XûƒIK6óÅ<êâ—Ή…5¬–«š,38`ýR>sÑ38`û-°- ŒgÀìW²ˆ\Æ{‰ú»é¥´wÉ|:ÚÔÛç :@8Z‰pPÒ·c:ß}ðOüÆ0_ b©Œ„Ø$èÚ¶âEÑY§F’¥ú¬Ç*LŒ=b‚!PdÓ/ËNŒò=&Ô¼eWÕ¦¬è{©î0À[¼½Ü±wÇ,Ía€O±8úGQŒ88;).Šøœ º•®‚àq¨‹¸9;ˆ(¸¸8ùý¾A"'FHêiÉó %¤—k®WH_^î½ðÉéàbgk=?øÿ:Ù’*ˆ¯SÓ ¥êSÕPʼCˆ×ÖÏéíÛüÓ‚ÎØËð1X|T½ÏntóƒùÎcø3eÙP¬»s!„‡ó“ü™%ö³à b¬mÑÈ€ Výu¯{¸{4°XÓ"v!^[ÿm—·l̤€*ˆPq5r¿ß‘5` @¬"Uë€*ˆ0.6È€€5`¡Ê6_—ûËkÀê€Ì>`.Û(¯—0„®Òú,ôœþq qï®PðQn^¬ÌÁvJ}Wª¾¸épò¿ðâV±AJÏEiéß(¦£üÝâ|¥‡Lñ̯—ËOî¼ü{ÈO~?M€ ÄXëK Öëõ*–è˜xcïŒM‚ ¨`7bd fØ Ú‚Ñb` ðüG&‡˜è!2/{iøöÎnë]&å-$¡Tó{Þ¯$y."éY×µêhÜì·0ÀÁ¬}Ý Xdß qŠ çà 4 nÂ87A€Ã¡„ 8à>áýÌæï/‚dFµÍvwº­èdÛRð0ÞDuqàӸꢈQëJøá§³KÐFðѦ¢6X²Hcáí€}\¤jâŸ<«¸ ¶âüa£óCœþWïNK¾+6\3 Ã0¬Á ¾ 0ÿSŠ+¡ÄH£zK#Ïñt€6lèpµ¯+—sËnGJ?äsBÚ¿gKb ÷|·_ìÝ1 1…aW¼…ZYÛÙ)â]<…‡ñ"Áx-Òm1O˜øáÿÅÂ,‰©†7Ù•ÆUkëjV_ Pƒ‰ê«£¬”Fz`|Íœ™•Œ€>ÕzÞœí^Aw™³ß¬úv´ŸáèM¯«á÷µe9@àÕÌ]$`ƒ(¯å ˜¡*Pó×F]j2~ñ<ù 8çœÿÏýþºé†5$`L X›7ç›ü$Ÿ>W+{i¹ p&6æí(ÃsP.þ -_ômÉ!HÀ&ð°/{竃0 „ñ-aAò$H‚º ‚Á3 «ÃÎÔCxP@ƒâM&.a韭›¾Ÿ¸T\¿^·%Ý¥éÕœÓÿ¦“ƒÌG]C[ñ‚t$ʱH,!q}r´ †}3Š +«Ea®¯7E´6)ñp¤LúñŽ? À½ˆ{:l?î‹N’=_Å?©‚ø*•ÍKÕÛƒ{­§@}¿ý±#T<÷‘<£¥*jW{¾hÔ¼«“ç<‘ÿh¶ö²Åš…°”É´ –!ȾÎ.›YÆØ<œ*r9ǘ±?!©€>¹7{÷¯êD†qxÁÒ ,mç ]‰n©SÌgìß5³ªMBèùhÒ™ütÐe±!ñï…¨E€?ì] \”U¿>Ãæ°( ¨H(¢".¥ˆ‚ˆK¨ßuIQÄÐÌ=´n•KÙbå/?C2ÜQ7$TdQ¼Bj’ ¢(¢¡™€¢Ž 0û{ÿzøNsßwæ]fFý.½Ïÿ=ç9Ë ¯ÆßÇÿ9gôVÀŠoÜ;YŒªeÃÌéÁvfß›=ª-â‡+ejÄŠÞ^V›MÎâ6`é«×B,**ëõãÊ·Ë«Šl*°î5š™¾>¯OJ[dïØ‰Œ…gçî7Kù›®Ý q@Þž þ 0Â1îÜ£o†êª]u•9J5¸u ¶r›5çðfà ãmoˆÉa*ˆ VùE²œtC½NÁ¡ê@_>ï^‹)zºº`^q¿¶µÛ›),¼èç×Wiii}ý{{àXw°w€ÅM/Ýè¢Û-VÙDa]¶æÊÁºê ]±u;O×ÞS`µS_Zæ‹8ñ覹”FKé6-œƒËÜÖ5ŒÓƒ}@òg&# S˜‰ÐܳHL…IÉmp_àµîƒ¢Pžéè>Õ=g|¸,.ŸM’Ȧý ÈùýŸï‚`WýœRÛ«¾ÅEùè?"Dˆ ¹¯ŒœÒ‹Åí\ìA©V´MÿåÓyCLt_¿UjÕ« öð°DüÐgØ C]—OåÞ rË5ôô‡Õׯ§6§ ¼ºøï?Jýê€RÕð°¡f캽떬€ÞqQó­¤-3¢×!tìäMø­òß gy9óÚ0°^˜ýB »öJQ"DT•dGæcžèá6 ÈÒ_ãlXР Š¢€œÍ;«Oá†,+ÙwV¤¡Þ¢]qÄ€ ÷`*¹‚gX€'øûûûøøÇV­Lw_c—ÓÄ£«^õ šaÑv¢ ÷uçÜÎ>a±Îî}uõw/]Nr}µ V{õ%VseæE ~ÔD´r Çþãæ~vd{˜÷d~Œd²çXßô-ˆ×k@¬”·;s"Li5X¯Áÿ{Ú[ùÀε2€ØZwšÉÙdz¼¦bzjƒ§„‰Ñ+;ËN‘ÔÆ´O„¿E<ÛKñr"Dˆ°Œ%¸/¬ƒûÚ˜”ûº¿·é°“ª*-Äî…¨èú£F¹âÝ6ˆÇêº{Fö€Ø rwlòâ¥Sb¢WûÏ]w>ãËRÇ'Y[ÚÄÌíüáö‚ ó?¶qÒ‡Ê[`âѱ áÏõÖûÄ=;fÌœ‹Ÿ;ÍC‚ø„½îK„y>MhPkÞóšQBmõZ ²Ú¤h) i%PxCŽdÉÉLÙ)<œ¦°›(¦“Ußobö¶œÓj» ¡ð•——çââ¢Pȱû2ñB¨)ÝÒUºÏûñ…£«û{…N侂ß9Tsûmµá1 çläà¢vŠB{/íæ™½Ìú’égÀÌò º.*>{#gVB?ùI[wêð֕ݦ¦ñü7ELÌ”–Ìÿ¯‰d baÑ5?ßžÐÄ%¯E#6'å¿ùP :ô é|þ—L21`È8=ëΊEÑ'ØÞS1=Æ| Aojƒ.A+·kÌeOmày^°ÿyY.K„±v¢¾~oäü£òÁ¬¢©£}_k_o„ûú3w6ÄöƒvBÌ<ÿ°A¡ø¸G?ÏVˆÆÌ˜ÄnÏšGÎâ6`©kc Ž]´ ±ñ å=\©ix"GÇ®éïÞG‹ÔŸÍ°_ºçÜ©€ÞìÎêne™»‡Dà@ˆHì™®BFè³È0ÃHJÜ1c6-Eˆ„`[ünö%B„\ŽÿS…¤nÀ1*U˜¼5¢Ä7Sb];Ûo𛸠Q«4µ¥¥©1i4Dᙼ\&s’#&@‡^c<i"ÔPyÇÎãàœ´šÚÚ   p_ÖÖÖµµµàÁ@AÈ/ t0iÆy0Ýæ铺ûÏDBpýxÌØ%9à¾Î%/¦­v.yö`G×{…º§ñÚé½–Ÿý?õ¥…ŽlÂõ%“Ï€™þ Uä%b»U’<ÜWú–•ÝÃ¡É ’Æø~é—p@ó·{öà»6'„!¥å¿»úŒd™Hã;>7ç®üÜ¢™c›—þƒ(,«ÑÃè<| ñ`$µ(¨üÕQ[ (µ†#n2}QôNÎ:…{¤Þ—6"Dˆ08÷å.9®F> B콈A¯½R#¯¯-)Øöø~Iþý “øÆZv6b~ÞÉíAàÁÀqÁWôþÛK§u@ÂÑ®Kg3ÈYBnA<·cPx¨DK=¬¯Ú—¿{Ÿ” û Th• š2©eûãqûØ×¦›{Ǫ»·p“p¦#Yfá^A4%n[Ÿ%B„\&—Ê«äR'¢äÞ½tЫw{$yjÃ~˜…X¡RÊ•J¹µ”®ØHûBó_(£÷uûömh‚õ‚XUUŽËÖήîaôº¹¹¨V©9@©ž1…é¾ €{#* ÇÕ£ÑPS*9_òc|S}éQááM‹Áð˜zÌ\Ð)ô²Ü5_UÔÔ’‡¸KPÝŒ\7ÿ,v€m‡vvvx@CCƒ‰î‹ø¨¤oB">^›I«ß'žŠd$}Á舥ÑÈBŠ´ò¤è¥xOh5ÒÔCd©/±Ÿkïlw!¥J1ú¿·dmè…Ç¿õ}Î^\3Á©.üµèÐd,·Ó¶4«Æ<»uüBÓõ.n}’3 @?~á ÇïËüÙÛgCd9fŠBtò*äE¡‹Oj³é:’ÚØ'yÜ©í…Õ£L÷`ìË"3A„±öMü/¶6ø°að};ª59Œ‰J­¿F¼ÖÕÔpšûÚyHðèèʲºX)ÿ[nA<·›pK)Z7.ÈëÁAˆ`±0‘ÕÝ'Ä©uÂõ#cÈ›a*œ7™¤§„ˆIhØΉ±ë7 NQ"DHi‚½5uè8±^^‹¢(ˆº ‰| ‡ÒR§NNR=ãA‡^Î ˜J®0d«„z0bên–•ám‡XÃ`  //Ó=¤¤ÕO-1KfX0Úȵ¢4 ™ày¬½³=0Tµ ,=x0|Ç&Wƒ§¼““8®ëäLãjLHÄ⯕3R?HŠYaú³zÙWúrß:x4·®¥s¬€ºÐÕ†ÍÜzjÏ;4G¢0Ç`EV`Ž$:­Éýp:„Ã:˜€Ây¿bp—*A©ý® Ph½Xa7K,S€sÛ-æs@„±öÓù2p_#xyº·ßõsÁïç„õS*µM§'(ìÁž6”+ö8hîË”3`–uµCÍ2g$´g)éYD½Ï2a@ø„sÉè%ÁÑ©õCY2+¾]/4E‰QSW^’…y§î£]}#'î[-Ôz£Ò¯Ÿ/æ/9a*Üï'8<0nµ¡ÞüÈ]s’Ù߃]}#æ ö¶z?ŽYk"î ¾à˜­­-.…ÁÕˆŒüüY±b…ÞŸò_g×8?®ò ¥ç£\±X¸ï'48€@ЂB'^Þ5aÚ’µû×|ØgVs€€¤¸oÜ„¹óS'D +ÏØßkz¦ gE@¾)ð`Ä}5À·?9t4áÙ×ZÓˆÕ³îå¦6R({î Dˆ!äR»UVÔªí« SM¿ðn÷%Ðz&QTî±Õ¡á_ðÿ40r ðee>ÆbÀ®”©!Þ½S×Ð{; ½Xw>¬ä,0‚¡ó" ¼„Þ²•&ÉYñÝÚX#R”à¸à‹4‰õ â²Xn8…†‚Ëbéå¾zžõãܱ[XÇ"Ö…BQtð×{Цíy4j!)[± 0rAáÁwýðíø¾sëÀ`´öo…ù´E yùþ„´~s² ‚ü!.îÅ„@44¦YlATé6EŒïû˜#µ‰!B<FÉ­5 ©çAœ3i@¡s4¢¼¾YY_«¬¯ñ¶: ñ9Æó Xo/+òi˨‚»Vy§*¿ hÉâQsÇš˜µÍ›¢DˆA<ØŸUUPø"Å.bÌ · rTÀþÞÈ‹53r➸´ Hâ¾ø>«O¿Ýr¿Éþ¡o–ûÇ6æÿã?%’Ý$m¥ä·ø_öî&´+ Ãè+G?8IkH‰c¹dÕÒÆ‹R§º IW¦‹dÕM骅BµKâ¸'MZ œUݲ(-ùÙ´–.œ–6]šD®)©¥umI¹Ø(×hy$<fæ9ÈæÎÌõÌXhæ›oîÕA::´„Ðæ @ ØíSû‡?˜’tqô˜³ðßo&û’Ñ÷AÍ™½ðݳªË¶€5fYñ:Î ±ó_|é]|°6 bµ`g*vÓž›}5È$Tnê„sŽÈ{ÿŠËЀ°\îAúu]9«ÄJ劳P“}ÉK6¿Šæ0ôæÄ=¤&?9yâ¸ÂèósçiøòÐ|WFØÔ ›ÜJ´aKº{åûeEÕ‡G …6Œ‚xçç;·®MêùvnuÛ1ËÙÑÙñÔȈÂâÌÙ³’BŸ€HfÃÖäõ¢¢äãá- mtA8d¶* #fÅeÕ¶ƒ­%-ŸŽ*°NOL„ 8a¬î™Ü¶ƒIÊNåj™c» m066&³ê·€9ï)Ê'8ÃX À˜e0ïÚ&@ˆ;¿4¦È€Ïãë@€CÌŠGvŒŒ;®·À ˆ!ê‚TVl¹¤à]-7ÏY[®¤äN"¶d+· ¸ÿ×Ã}Ý/)`¯£äÚ'™—²ç\>W·Þ5ž7ŽÜ¸|€æ“%gBKRRŠÉB°0ØÞI!’Íf2™¬B)µÃÐ÷ô¿¼kOw±”šË¯˜ß¦læ(ÚËýpïÞ·Ï^ýýýë'ÍRùmpUý þî^í>€°Î¾s ñD<=ÐóÂÎ…ÇÅùùÅ…GÅî¾ùÜŸàÁ¹xzzZ\»~SyoøüP(:÷îM$“’òù¼¤õ“f©¡ÓÎX-`‹…Ëmm]½ÉöíK%%Ú·wõv™9‹…'á»êeÿ74XµVö|œ­jj»vmîêûÿ9ñèÄ=¸ª‘Ê–—ï÷«jþÿõÿ¦¬ÑÄj“¡:Èþºæ%ÿ”Ke“n½öÊ¾ŽŽŽT*%iý¤Yª–UÎZÀffÿéK÷—+1U*Z£ö;ffr½;&öÐeÿ7rªeï÷ÇþyuÓ¶ìØ%7ÛµksQßÝúƒÇ¾ î+Gç6^½Ï˜÷uQ!Bm°^=0ôûÝŸË¥I÷geÙI³´‰[?OÙ¹v„ ºŠXYÙ{ í¬<€žÇ*•'ñ©<ƒ b!‚ˆ$¼‰3Ë0}Å’Ý7;ó2쇉`ýú´[àD`y8AtÁ Xr?èDŸ«[Š÷ÚËùD¶kØýñœºñéGî}ÿýd½ÝÐølBÝÞCØÒ0®®lyÛóªG-Ëà‡Q#…¬0û—2Cø½Ú[ýëë(›$õô÷?ß[Ï : ¯WK¼<@ôÝeO-gi\î:oÈû—+÷_çrrl™‡¼ µeǪ¯ÞÕ`eQ¤iše=çyž$I½K¬íƒ/”À Ÿ«¸jÕp¿4ÊP !ÎúÌU- @ñ72ä&š0|³w=½IAÜ×ú'”¶ á‚1ȽÕÔ›ß6ô‚ÞÚ¯@âÍàͤßÁ3‰\{ì¡ñ уWCP›ƒþX'n²~fÞnvɾÐù–ÝÙyðó²}³3»õøqs›k«¿G{µÊÛÚîn­²÷¤B%Qˆ¾L‹ß xkèÇ)]Î6‘'l"PÎÜ…XPyÔŠ* ßÈûRliÐMßkawùŒÝÑŽ;qÙöýŠÖ»øTº[Æ?:ÏŸý½ÜX»W,d³™oçg7¢+t,8ÑB~æÉ8x\ 'è”ú5P¾û…8ªÞ5tß½þ´Z¼É”ÓåËqº?£ÿºdÌü` @ 8:~ºÀ˜%&“1sõZͽ|¯\ˆ ¸«Š9êüµ‰œx8£¯$ôz‚8`Ù»{ߦ™8€ã×ÔU¡:PU´i $b ‚… ‰!ú00‚Ĉž¥ê‚‘@L,ì0 5ˆ^$Z©@SA•ˆ¤yœ&mS8QÉgqµ±¯åÐïG‘õsr½³Ý¼ø§ów̵är _<ìï¢Õ¨~oTwˬhîX’AØò'[&ƒìµÁ—ª¼×„Ny'Ö·3ࡈ~{üÛubŸvÃ>oP¿~ õúƒÏ¼ü¸ùÔì?'‡^‰×¸,}ôò^UÉÀÉ7¼ê×o|Ò*¯\ËéìÚÎ@/ý°è“pnù¹oùý°cï·]€ºßW¬zÀZ­–{Ö ¹t¯ÊW{øõUý‡Ã´ûö´Â†­„ßëOš­nºþèÈžÎ=›œœ”Áìû×âoÖ~öŠ`zºš²07Àe—c¹=àÍÉqS«ÿÞÁÇçâÒáÔ èHPçQÇOœö=7S'rù|þÞÛ"Y§\NMMMŒŸwþ|3nÇiÛÜÜ“B¡àÎǺ»»ÕL&“Í^hï0]ýR£6Ÿ\õ±r±Lç g—ÙÀ`¬—gi’P:r ˜Ì¯²YážQÎÌñ÷’Þ=Àà<ƒ]æ_ÞñȾ:ñ"×nÜaä?o÷Š*û2¥²¯øHÀ033#¯?”W \ƯL1•_[Ft0#òs"¶0Èœ*†=`fÙ×ý§³¢=0Ц²¯³‹¢Ó„»«XôÀ°‘#Ûn,|+U—íþÉ‘CÉäž…ù‚ˆ=`Ǿ>•O™õzùäcQõ}©äcV›yëz 0u§ÿNí¡±ô—ŲÕcMìß—¬ýo—J•rÕN¥K_? #ô€™å`Öà„Ь/Mo§ãËìrÄ«g³òá¬K‰Æêz}e­f7–íær}µ¾²zåbz7L‰ÌTϰf_×/¿]ânîŒOV©­l$ãC2n¶DÏÞ¾áѾùùb¥V; ¹“·6ƒñ·ÿy¼äùªz>:ªÝPûÂh0Ⱦb~üÔÀÆï0½òaÖ´sÉŸËÀë–¡îÂîœUUØÕŠÞ®µÁÛÒ+Ñ˄أNë{gÚDÅñ·T“Æ$Ö-Úˆ·Œ¦ÄƒXÅ“6j=•"ˆ·zRE{ð¤¼yñPÁCZ°z{Ó‚ž­A1Š1»›M“Ôõ%KØ’×ý«Ö÷#,/o&³“Ã$üç?3kgÌ_9ñâòµÆÜvÌh`g?å#;·ËUUUm&½`6»4à‡? ƒZEZ¤¯&¥ÿªÃߥ3púb†aØëð‡Î£V©ÖJ嚬T$¥‚WM°JõÒÉÝ`ªpô ™§â‡V6Ò0-Ñ3´Y‚Í{ÑÞ¶ä­¿‘[a†cxôèóñ›‰ÁÃáÆpŠáÛ‡/¯9°¿¤^èž{”†U c~À/€mØÑÒÍ"šoÆ6Í%ZͤRJ°è^J“NzN¦ˆÈÌi¬'­´“ ~Ô†avÀ¯6´þ;¦Æ‘öd°ý³3oOÌÌÖc-ñx<¿ð@ù8çÝ3NŽe2™¦Ö¯N^ïçü4êñü/³Î|´ŸK¦¯Þ>48Ö2ŒO%0ùdá Õ`Á€ÏS):ŸR¡ŽÐ0ÂdIÆ<€ö`G ¯Z¬ZläÑú–Ôš-½dÑÏ– mGïûšÜ‘ª##Õd“ù'÷Ã0 ðFOÚpõèö0T_ 4b-ÓÕWäÂäâã)HŽ@.ߥ,W‹¥å‚Xþ)–E¹<šÚå‚=ZÄ:³,m:éìX€áèME§7‡C÷&ߢª ÐÀçÛ€EOß_Ä XE¤¿O,{ƒ=‚ ªV;_wô÷¼¶a%Ön}wˆOG?ÎëóüÃ0 Ã{Àœ#@ uûkþΖDôìÞØtúF~þnüÈd2¾x÷AÐ h7Á G/J,“½X¡eßdÈï•$ùKîó¦P°g£W–J…bׯZÀ’ep ¬éâÃÿÎ_²È0 ð¶"xÁªü};HŸ¾Wr¯[£4âWOA¤˜Ÿ–A7/hÐ3Ù›Q®HÀàbÆEî4/S)0é´áBÌ`¤¤©tÓ‘\vð‹—m¨®[W¿A¾ž½ÚuyèÒ’E‘-Ñöúª¥=ýß5†ƒ‡ºí‰¾¨Û‚(å/“|ÉÑ#ÜÎî¬g2@À3`Î _¶#ÞIù‹U6[,qßèõãß|,Á×ÎüÒ=}Zâtf:>5lÜø¯¦@²‚³ÕL&$`TÀ\ŸÏ$Ò‰‡'î|ßߟÍf%öx<¾Â‚OI¡o2sÿÁ-ˆ P2®%HÚ´ÜQwö.nü­ÐÖÔ * °[ÇwVý×Ý»ÒýY´±²£½ Æ‹êN™ß*³÷hçTÀÜWY˜L'nßK\ûH(à/ÏÎÌH¼{ýË¥E¾“ÏŒOŒ–i…¯ö6›”¿l$N†@‹¯<÷àý“½sgi ˆ¢ð&¾"ñÂF‚ ¢ˆØlc#"„¥Ä"u ­ÄÞBñ_ØØh£¿A,‚‚­ >SŒàÆ]VÜÃ$ePä|„árwn7œ9wXƒ Xuûø¨^$:®£p‹H}\¿Éwð_ „Blú'‘AD\%Ù>³%‘pªw¢ö–íÎl/–'‡Æ—¬Âšµ±mÈèÒN„Ð#"tçQϨòaŠÔ«ƒØO˜‡â€"_§ŽÊF‹Ä »b)»(šÿU!„ÐÃsŸ‡á*Ù\X·÷JýéžÓýÒLqn4/2ƒóC?ð.o¯·ì ãÕ×Û6ftCÕ—JYÁ rLN•ëÄ·Ã~0Àþ ¼fûǘB¡÷Q¬æWŽÎN„ûîˆÝÁÞÎö”ëÕî«î‡óü"ÿM6§¾âŸÑâ|'`ŸìÛ? Â0ÇñÝœ„ÞÀA\ttqr) x oàè²ôºˆƒ‹ 8‚ îZ⟩ÃÏ!H¿Ÿ¡Ð¤d)”÷òKËá} Ù爆'ÊÑÄpÓ¥¬Ä 1›ҀÅ7Nï«[eZ}w?˜§1“ç~:¦½Ñg6 Pȃ<òyE!F0Ĩþe‚¤[G¬ðÊœŒHÀœs¿ô`ig8ËæçÛÕZë½Oš­Åd*²/ýV²ê¶ù2%ÿ PïöÕ;wl PÛX*Æp ¦`B*BÁL@¡…ÑÆä.cþ+¯8r ÉÁ‰º$âüÒ_‰úº—Ýð_M×}uÇñáÓÜ€õW^:cmÁùS¨6ó%/Í¿€lgçŒQaè—ôÿoð¾ä"Í`-GÍPJ¨ d©àH~ž¼Â‹÷öµ€´Ž|éÔ6{^û#ß@“ƒd­ºÑex#ï.‡:>Ø»{^ˆ‚(ŽÃÇK‹R%¢ÜH¸¢°½Ðj4"ÑH$j_` R!‘¨D§ º‚UYÙ¨jÅnµ áp‹scb3B±¿'™;››-$Çfçª/ Òë.€Œ¿ Τÿ+›÷3}Òï{K¬,L|H÷Ýb?R?R³á÷ߪG|0Ü€¹HÀì\Y²,ËÆžÚíémÚÑa>¹´}¹yt§M;ù$@PYÙ°›HÀìhYºÆüZùåV;µ¾‰¼£ÆG+ËHÀ@–N«/ Ô?Èï(ÀHÀDu_Vªîjö¥­yV³î±µX9(­îˆ(À€W$`)†fËš}iÓ½ˆ¢ [{ëbÌTApÏM§a¸6ì‡«Š‚%F<žÁ»¼œøB?8ëüùáäþB;§YfG¿6FßGª/N»5Ô–Ä<‰½Ìg/ HÀ¢«¯ýzunx@›G·6ò-ˆÚ)nA”$~åã_¾êó׿3.Kßæ‹ﯠÿ}»UY ˆâ8<ˆ`PË›ô jƒÙ(ì}l1l4Xö L6 6A£Õ$ø±lVƒÅâ x`â ³à ³¿9œ«gÿgÍ? ˜™¾Fíf2žI?Ý'ÇúgyYIÿ’O–Ùàk¥š°è9MÇhzPÔ!›­¥[S$Kº€Ì]•ÇûÙª5l/ýþz ;Šxß-‚y¯Þ,ýCú HÀàÞ. @æ®J<ˆÒÓÖ˜¹ôéõ,Ç"ƒßÝžžƒ ¼æýõdèZä¹¾äøÓÝ?oú¾cà˜GöeïŽQ"ˆ¡0/b#vÖÞÀB-ĶŠW±±síl<ŒÇ ±°°÷ b«H„7cv CØáûŠe&a2)÷ç%™ŽPûw»:?šh?H\Ý—sQjOåìT º*âÄÒ¬ÒEC>œ5 «°”ÁºüéZ³%¶ÇÛx]TišjiŒƒÇ–r¡Â&€!}*`³?h­ûÿ½PvC@l.Kœf8+ ¶¦ÖNAì0¤/@¬ÀP›`¨€uÝ2ÝÈÝÞáDœ‚¸)ûóco—½$ñ½yž`ø˜ ü ïm*`u;×Ëß·_Ë–RRü6qnI·¡7#¬þ®tkY¹}•J]m`¨€5Ø=9Þ¿¿ý¸¹û|~iX^Ké--±7]Œ-üãz°7_¬G[ °U~C~ÒWú}?»œ`{U½·!ÞTF«6nèil³sÇ6‚@Fs¸…¡b ×±#tP:¡p Ç€Àâ,®ø^q!¹.Gþ[ b · ü€}×zù-¸7Þ¿Ozý=ïjÎiŸK9Cߨ»c©0à£Çao£…¥`!âøZø¶×عvZlaãSØØÚX‹…XÚY(ˆ…,[éÀÂM`îöÛìdÉý~a.„L¶ËÇæK€ªÉL€ï€ÅòÊÜ}ýy÷>MdäØMcz q÷ϲq³ Û×j¹hÛñLœŽÃ{žŽ«óÁ•â;£À°‰›ÈÇgâæïá5y^ÙòÕ\ób ¢°«×õY KÙÌ0P€éÃÑÀ°v S°e) k 0ztà€µ˜ï€ÅÕ€ `ÄÕTûõ0P€1F¡ ½úø¾6ÿÖÖeÒ-ŸfN€,>JÀ|ÙT· KSÃD싟,º-K˱sþÌËùúÊ:ìêc˜ÇèB€¬ÁÕ{wo¼xöãéó¿?í—GÕ+Ëùr²$WÝA>VWîSq•I‡~ `ضË1%W_›ã·R¥¥ëQA7 &ð1j(À€ÅÇsäì+W_¿^¾¨9G÷ª fö1`R× €½þz=ãÉ­Ÿ³é‚˜WÙ×4o¡åÌÌ_†Q€•U° {|ówª¼ù~m6{ÀVËÅpï“}¯Ìã^=è§y `Ø6aGøîxË¿Á ºÓx?pzšpà;`sìÜVf#*(•ï26ïÅÎB`º JÀ¦W×?qÉ×>Kž¢;΃üÀ¡)À€ÅŽO©cµ\ì—ÞügÏŽMb0Œ^aç n`!‡c¸ŽØ¹šXnà ×k%¢Å4¿W\Š„”á?ž.ûW]yž{-tÖgwÖ´€ $`²Ô—Yß.MÇ ‰n®1ΛÊöÊwç[g§cÁ`+ûvh0DaÁÝ ¢©b aY‡1ª¢¢Û °$ !!ÿ'ž;qòòr €¬%EÉálÎ_?ã¿LÓ§zK¤úy³ï‚û“‰½;D¡ˆÂ(<ˆËp1¹€·]ŽíaÓèR¬³Ä`°¬»+ŸaDÏ&M¹ùÀ½Æ)PÀô{aÍ‹ üoUmA„‘•ìþXD$oÃ!fpL;†qùe{Û=a«»ƒ}ñoðsìdïŽQˆ‚0‹xAk;±0©,--E°òB¼€à!ÄV,--µ ‚ÞÀBl-l l±šY3¨Yâ÷Ëæ1»¼Ý*ß¼73HÀ ’U7RíríÍIs>Õªͱ{äKyM¼s&-îûΚ « ÖÕáˆãH^–_•L#Ô”çÖÃôÄù [HØ 4`øhÀ€IÀ@ “€ ˜ 4`0 hÀ€QÜy9VÆñ¹~Qõ;hÀ€õñ+þðòwúáG?>ÛÑh”LµÜÂÕïYï«;>篽ø6b€Åã?IÀΟ®Oo¯Ö—WvÖ«ÛµqsÛê”oÒ穆âüž=~ùÞÐ0$`¹£û³ç—Ç‹½ýÃá`|2þX aZ#5Ÿd/ù%ß Íéxœm{Ìš¢¦&žÇh(¿³ ó˜½ÀîGŽ3É3´Xçüû–ÞØ¹–vb0€ãUÄóhQT´þDí þ@\—..çÛ|â[ð%t­Ëo.¸ˆƒ]ÄA¨CÁIiOµG})§ÁĘrçðý !M.}’Ûž¦ßM¬ï–3&§•½Œ P³W¾=ö¢Raù)jû~©°T©×e0˜.þâ{jï³ýuV:ñY5¨Åö‹QjݹÌË»ÇQPFÌ/°‡GV_»þé$`µ£@r0}›q*`’ƒý¤ÍÄÖªû[›WáÝÇç¾Ì¿É±ƒ“j°SLþ_,¯„™3:÷oûR#Jþ/C4A÷c“«ƒæS¤\3æ`¯Œ#P3·ŸÍ䆯›­oðýSG2°‡çìáM!÷ ’:›äöäÉïVÉa»ý¿/á­ö÷¶67¿8:1ûy7a[ZéËHFܳ´½°Úh…ù¡lÞËNy9é4š÷2˜±ñÆÎ»4 Da<”d°ÖMÖ6Ð8©ƒˆ ³ƒ‹ :8‹ N‚““€“„¸ê ³ƒ ê"âZ¢ÆÁT"±V‘V3EȇùHGï7”ë{÷Ý{ï¦+¯wûZJŽì<=õ`ù˜RŽ6µyꀕMËvšº¡×­ê@©ßo¹®×|k ›–ûp¯qAA¹ÆÙ¨Ïo½>ŸÙ ÖÈËgûÒqt£©_’@K8-á׈‰HÀ @ÐDé¡ì J&°òq‹pYöœÊYÉ’d¯Ý‹<Âáùín¡P©•ƒñWG3úŠ•Z±Ñxòü-oMîŸK7ÛÊÖAfN‰ÄͼÓÍUø¢Næ:¿ŠAÑ‚9°{®T©GA;`)„»Sk{öÉæùéèàÐlulÕœËøV{Ä‚sÐE$ìõs2‡¬œ %º&œ‹ ‹‡Æqö $) ä ý—]sGhAôº`m!Ûè ¬µØZö{²µ…×ÐF,¬Shgme¡©&]üEÂ<L¢$Mæ9J¬€Ña|yÎ4/Y bX6¥½k’= à?àBW<üþ÷Þ `/'V þÒ†9²ö%–=Cèèi¨d_‚ VÀÄ0ébMʇQ5nCH$z˜Æ€€­ì± ƒ0†[''÷>Aéb·>€‹În¾DÀ7Ú¥oÐA—Ò¡oÑ¡C@!à…DÂppÿ$ßéÅK ~¸¸rÀ¾¿¸óÍM†—4™ø!ØoâYÁ)B<àC‹P~Y ­pYçÄ¢^t]-ÆÅ8ErtÍö1pýz|ÿPå„£¸Ø˜ÆÀ y 6š>Q3q¾éÀ(¤Åb±X,vÀè·^ P|Bé‡é/Ÿ7²wÆ8 ÃPv€ÒT†2”0 8B0ÀÊÆ%8a… p€@¡‘Z%q‘Q"ÞèÊ–õˆ¥ÿ¢§gëÙýÏö:`asfòc¸¹»Aiïד¹,òB¼;sŠ/ŨCcu‘:ŸAhçôž} ¬\2ÊÿKÕŠ–ëš"5¶ÉiòT‡Ùn§î‡ýþÏvÿfEÀc@­°N»•¥é|áĈ<¯·4[j·„|¶ØÑ—mµ©ðë¸o4¯Ëo±%4o¨—}/ÕQTÀcœ­²òúaÜ€=. ŒÔÝ‹~žËä¥7…Á¬/óá ŸM|5‘”ÿê€g‚:¯—(®œ®:H¶uÔ‚•kÑÆ6TÀÀ½úªä;`ý$î,.Dß}z½¾¼ïƽ(˜.2ƒ$v|a Ýå)ãìù¥ø²‡Šp꓊ h¾íº—*á4{ðXMÀ{¸½øáå mb( ‚ ˜ƒ0Ì@³`Î1d óœjM^Zs§þ¥ÿ~SÝÜûÞ×m!DQÕ£aVÛù%æìx@È0r)´?A¯¶8ÜáP%w_†O0<ƒyºÄ9?'hx"B;!ß ¹\óÊŸr/{ç[Eцá=P(¥¥¥{ÚJ ¶T,Ћ­¡‰‘[°P ¤‚QB¨‚FT”šèÿ´  ñ’ D.$ ( ˆV)T„P)Ô^,¥­¶çôz ´¥u`Ìp²_;ç¸[Îõ}²l¾}wvvÏ!Mûæ™Å(DàÏ«¾7\q+ý;ênx0Ö’íóóóÍŸ%þä5ù³ Ð_¶ÏRÝÛ¦à'WüXÙ6`<ì¶g˜k0ÅCÀ ߀)))úÜ—ó M½ÜnD"]”‹Žs{ɵùTq`ÀôÏs>’µã=°/`˜ýûU«_ûpã{n1õKÿpÄ]õ'6J3fƦ<1ÕY¿@Å¡Co ° ¢“ãðNüÐS@Ó*9<Îòž•ñÖ]ØâkØ·`QM{ÛÏ55ëw¼5ñI 9’õ^ètdûÒÉ’µ¯$ЍIoDwy€&`ÈÁ€Aá|VwÌÏçfV|Âõ›Ý¡~~Yñc¿,-eâÒÈŒ‡O|J¼ÜDép(¯ Xd\²âhÌ+p÷_Á ±¢HñDè4*ë7ƒÑ½bŦ¢‚7&?|©©A³‰á!ù' –fg8`,ŸÎ·ãÈ;!¡œV°Š¿¾R\@¬q¾âT`2÷ZtoMT@`•Éä;T Ll¹ÑÉDL±îý06ÚØRö‘ă)€ÌØärs“q˜¿Ñ×?Â7€å¦f&ºrÐgÿYï¿€YÊÒ“^þ‚y0å¦b)Mg"ßíQœ5 €çg®û¡ºfnl\CÇõ_jk}†0QO`E¼_D{Ó9ŒöFtOŒù.¶¿Òh ~jKÓöÜôÜ Íu#Ã"×<›““šÎ=˜Í9`è_qž²!-w[uÁ‹?~Ÿfœ>jü²˜™ŒüÖrEìyaç3h|6Qx 0`Ìw±}t˜ÿìÔ1·=XÞóµ5õ ï¬ßZ·rÉKÓny0¯MÀŽáEa™Yê/g¡¨ Ëöª¡;þ©¬oútü¶ß\¶OBTÁOi@ôlOKw”|.òñWy ˜~˜éb›ât´}À°µ9±mYF‚q¤ßŠG'0öXR”2ÌÑã³wíú†QôZ÷Å|ߨ! æŠm¼ŠÐ]ÍP»Å6«B;ö_n}GáDanµvˆþ«† vt‰:`˜OZÜ=|,â ;›ÙXD&ò9`Þf½hÆy­ÒÅ©þ EÒ^ÂJ–Å®R2˖г\—ꌡØ&ù3ó‚×’M4Ф=½/µ=´ mhHÅE‰®yÿ4µãµäãÜùÞâ‹U< ÑJ?´^iu¹4 °fK§¨ÏU5—70÷•·»¸·«ƒÍc¢Î£~IèL¤:WT‡ÖUfLÕžv¨y ŸðQ¼àŽ‹m¢¦ºU‡ú‡&ª\5\QZ7V™±>Û¬ fFJt^‹w"éŸí©1xzx@îÆ0Ž¡â_­UŠË ÞúåÄ®zB‡l<²ÅÜÞdnoºzFî S—â` ØÖ£ù°ð áÜ}m:Z4D)øöÈò•KúMÀ˜b¸õOÞfϨ1“4¦W‘ö:°^ñÂx‚$"ÓÜùãDu›-icêÙ´Œìå…“‘û. å%¿ä^Þ«¨ ÷À 0ý]í¯=yð»cÉ1££FE( Û”–k×Wl{}^ÚÌyQ“G`À˜ãâKq°…­WAüÿ«ËsRcJ.œê;3ð ïLƒ‹Óž€ˆb+"£‰™†øKÛË0==Ë¿"€/€÷$`Ô}}}ú@vÚ¤ä褀0ŸA>Ý=Ý Do?±G™ª8Ôƒ0CÎ'½»Ÿc Øù³ÃSŸæ‰SÌ}á=`Zæ¹ Üt¹àšŠ@2 R< mˆŒŽ™ê/†R¡^ÌîCö‹q:«\šwW]ìï&­,KWOÂ1 s-¶>ýW;Ì!"$`ìlÕ…êAQÖ§}o>èÎ~zKÙ­º­_‡fXêź9÷§‘ÈóvÁ»z>ôx§ ûcïþ]â8 ŸÐAPH¬âR\‰ƒ‚¢nuApAA\\ü;trœtqé¤à ‹CÅÁÁ_ ˆ‚B!*.J«/púE yŸ!¤ß»Wš¶Ÿ–K’€Y°ÄIÎxÇ`ý¸sTnnl:½VššYZ¿ô•S}R*PACií¤¼Ð­DÂ"*ÞÄ¢+´x‹±¯ŠÎG˜gÚ`Cî û€ÀÂ>`‰34y 6Õ7¶z°ùð\tKíN¡ruÖUhùîpzï)ÑK³hT¤Vsa³"_%õL¾ô•Ÿ#<¥òV0€Ù Ð^n½Ù⨪«©þåýáÎ61PlY©ì-ö¨ Ñ!XxL¾·òWOäÓLÀຟ·¦#Ô žka1[äÍ㣕h“üãl¡{Væ|ÂbúØë‡V>+Í×%ïúùÆÔ­fE×ù–@f•ï»w F¶fZåžÈ½³sö(Â0vp÷,Eð.ν„7röî.žÅÙA³=i@|‹-ø¾)„üt ˜ÔŒýÀzÙ瘙?éyàïüKüy¼ÒêTzïžñ¢:IJ=>Cj>~9qîÑdJâKU% „Ú€Ã2¶Õ5`;goÓParj!¡ ; &£  §@$N\ ±°diŸ´ŸÎs{Ö9xš‘ƒÛÍ®ݼ±ž°~õ•c§ó­þ ›5ÈÉpz®ö4ôMýëñ=e¶‡·Tüåp@ü0£l™(éq PÎí4÷¢ùÂËpiŠ} r¦~_ì?Î_âé´¿˜¹= Ã0쀆°õ ³V©”œEsŒ=z4ú똂¶ÈæÿŒ‚„¥RQꆾ\óPóŠ T‚+p0Œ8ŽÿCâkܬýy—<ß3sµÅµýù-GOyX¨84lÃO_åöåÕME¿Dçí©ÀoÀ¦ü|0,{ c‚§œvÍ_QsË`¼|-Tg=—ÁÃp,ùVr:ŠØòê¦íê»Û´4-Û&õÝòÍh¦çÓeo)Èú½‡,û·Ç+#êZÔ–·,± Åõ¤ …*¦¦Y&`ÁÑøR9eÈüXJ?ì=KÃP†©Æ’`AÁª›Õ¢`\A©¸8J7'Wwqsñˆ›.ÎEPã T¤ "íPÚÚAjÔM¡¡§¦—R[ßz8÷p?J:´oNÎ)2`€¿üoË×@‚ŠÄݯÝJÎQâÜëɇ‚¹ü÷€× ŽŸD£ /ŠÜðrÝ ÛÇe9ÙÚUŸÌ—T?BŒz[FK]À/õ8tªúâOÔ;ó`ÜJn#; ó™dq,KSƒý»—‘ðZ¹ÓuÝ0 wi!Ðö¹‰§5_:¼Bá_0ÀTVuÛÖ÷›l­Å­“­ï9•ö)=…‘E ,k~R«¯¥àqäiƒi0Vïíš_ªª”l+žzj4³Ð` .·Jû˜¶/¼¡Õè|“†fÑÏJï&ùk%ËéX:ãïUýŠ:¤häÄRo¬¨¾È’ß¼çî´e£ Ó_È€dÁåriÅöE7l|¾RxÙø$•|È€µ”­Ñ•ítââåu50–üÈ]Çãžn‚\}‘O¶”cÚƒ÷1vöøå”ͬ¥½ü¶!?ŸXq‰Ëû, ãg±xý@€ý°wö, Can »KÁEê$ôC èäààܥ⨤þˆRÜtqîà º´:¹õ8w¨·‰¼Hä…4Äç!ä½é!!åÂåÜ›“å0ÀóG~Ý^ögÛ—§zeût§qQ=ûÝF\µæîuûùû4‡Jï~_.2ÇâTÕ…‚ÒY¯¬¿ ¢±W:pÀpÀræ' ºÂögÓÒû²œ¬ ,ÖÌ»qQc±Ú£¨”OpÀÌŸ æ'û±–ô¯2_õ`­¶”âa°ÇŸ?è­â¤'7§EM¡Öw«u4þ‡Íä±–‘”æbï[&jL÷0I?cê¦5iEÑ SXýUÅhJ)óCy'þç"ðpÀ6/ö®%4Š ˆA¼xPü,ÁlŒ  xØ ¢4$|öBCù{Iãô”sç`»*0¨ø½ÂýDWñÛµ0^14TÚx)ýüÛŽÏ3´¬-ø£yÙœ‡_K›£ þá®åÇ¥Ç1Yè¸Ñí•9ÅÌŸCù\×Õ]öb„jÔ.ÕÀ‡¡½çšw¶íßÔºkÇ©}ª¬,ï¶Ò‡(`fÛÒt‡•îÎÒß™œµ%À?Â/j;5B%§(z@_úÓŸÚAÍ@ŽŸ.Ų Îl·hѱ @T9^Ôxh?Í•4Ú.åç÷“¦ˆæß$^<î:Ï<~Ì‹‚‡§ßœyè… ~F81ÆEÿêbPÚQÀlQuŽõvÝ~°ºrYjébÇQ‡ócâ×Áöcë·7¦²Îÿ(`¢€QcÈ]jíì+ø›¨XÍT€‡|  ,fòî0ßN«Œò1o8^Ü®iþÕú£­—òDý²7\ÅaÐW#;€ÜZ¶c’7wƸ°Ú-ÑbCyr9”‡1AaþÌ´Œ¸lC · r.¶;Ù}vejÑŠ%UÅÕ×½7]¯Ç^-_nÈ4U/¬yñ¾¿¶2uºçÂáÌ{ïE³¿Z#k0êƒáãTp0Dzã2à³0 Á½Ä$Çv úh)¿´ÝÞµªÊüÎ[wíÆÿ»Õx_[œ[° „›Ãüq΢ü¸ØãeQÀA°&‚0œß~~W{åósTùÝב‹}×¼Ñá«ý·Ž\jnÍýòé÷ŸÉãŸãß+,"á³(`Ù;c„a š‚›â .ú.În¾˜«.>„ƒŠƒsGA”"E0 T§#øë_“\’éø›~—Ki‡»p ¯€¥&(J¶Õ¶m‚Üûq¾(™yiù%l "á&Ø;á-}bëˆâëä:røÑ¯ð}ãðf|ßÂã¿2Aø®?mD¿„q¡.î÷Á/^â÷÷çBøÀñÉhâ÷ÄÖÉ'Häˆ(sßÈñ+p!G zÔ¸þß#4R,Æ!öKUžJs½›—}¬ÎÛ¢¨ëúe+¥r­³Lµu~3Bpê/%ËCãÇ Ä_Ì;WÈ:#¯Òx²wÿ mDqÀ×Q[°  M°ƒPPJÐA¡´´%X¢±‹R„ ­P$b\´’R‹:Ù¥uQƒŠM\[ mAqƒOLBlr7ÊkðÞɃæû!<.ÇÝã]à ÇïÝ÷ý+„ƒMÝ`Û áI ¿\‡$á6iü•Â!+Èòäx0ÖÕòDBš¦mî¸_ûšC­úgp~ôåçw“ßç?¬L#aîSØ=Qù÷Ìžh~Œù~ñt4“ãÂqA¤F €©þ@Z*`$¬ÖÛø£s¶58n”_T”øALM;®V y{ïܪn­÷¼zܸÿläãÉ›OНî‘è¨  ·09E¤âÄv%x$‹o„¹é$¸£¥¦ àß®·R°sç˜Î™ÖÐÿðyË[¿­ìZøË˜¿éé½Û.ýCDquÏ\rVÚ¢ÎðúLwµÈ¨¸/„°9ÆÉñk#ï€YLV×°¬À;`ç/¹«vº|³_£j2WGí×o–'Ó©ŽúöÓŒW¤ÑïLÖ²—Ó lº ôÌ@vœÜ'šl*`À"om?€ ˜¬ v›ÝMDsߢWŠ/o¤·H£î»þÀøf–²±}•H#Mñ¼ÿíqr§øŠ”ÂØð*ÁÕYóJ83ÚsˆÂØ{wÌ’PÆqø îÒ¤†‹4*D6¶Ù BÐ A@ÂÏáà7œli/t¨¡ÃÁ!ÄÑ@A0Ä)Ôˆ†sá…{†ˆ×Ãý=ÓáÜsœË]^ÿœs0€ií"+§O.Kõ§æd>½Ø+nÇ“Ýá{.¹e«ßñ̸ȒÆ6\ÃäUÇÆÇ `$` Ó·Z­"[ ããùF$` Ó×¾=0 Øfæû&r™ ‹)¼™_!øVX¯Âïj––ôÛœ~ ˜€iXeïŠm„ 0H Dc$Eêt,Á$mRÀÐ aƒD²tÅŸb[Ná"wÕÿýëlËn¬“l9`ñW/vÀ\êbãô­Œ§?ÍñÏdü‹¨¦ùõ]ŠÀ¯ldƒúàyîŒòPßMõ²ö.@¼?-Ö›c¡6O>‡$ þ'»ŒKÌóºò|Ã"‚ ì oöÎX'bÃbbá%Ø < °²±°°"2ñ ¬0€ÄÂÆ‚, „†RéŒâSþ¦áêPýŸ¢Êq;é©—«œæÞ^ï}XY;êªécÓ›`<œ»Ÿ«ÔzÑHUŒ#a®=ê‰SÕ„^d nÈ5þ‘Æ…á¸gn¿+}äH*À`¼Ÿc™x¹ ®Óã^ýs¹¾½kj‡àßQmÛfû”6ཟifró×ÖžÕ6åQÊ!Ñm5+‹Ê€ñÏI%'–0V­"{±€LÆÜåF?¨qá±/`¼:E†±¯ýçXÞÏ‚Xø¾HèkƒB˜«Ù<˜M€‘á²&±n±1ŽBøØ´Þ“jæSFo ôõƒ7BeoS½¶PVvåGûñÚcÓO|Ýð}!úš „¾V?åÓ‡4G§ EÁ¥’ ˜Ëc¥‘¦Ða®½ÉלAg$6ñbWÎ¥Iyö 4}B3`nŸ'ǺäOCB¤‰lRÉ+å!á$a¦Ý¦£À5J“e¡0öÍΤ QÔ…{"EÜÔc(âÚƒôĵH=†n¤”¤ë–ê¢øò!0›y«a’™4mhHºæ—p€SJµ­3„Xè!ˆñR+Þ„ê¾€ÁPÊ¥ÿMÚÆü?;@~±çVô“ùF«f+ˆ]"…™È2ß|G€<›aÚÖ'¾7®†¡??Žã8®€Ù§bÔŽöq7ËY°å‰< A‰"ûÅ@ú(é8Ë/{g¬‚0 „á”·"(øâ .ú:8»ù>Ž«.>„ƒ.â ®Nl­Æˆ›?4¡‡5Ãÿ ár¡õ¿š†óRÖ€Iª¼ÐChƒ [¾=%†Ð)ñã›´U<Úh í®ÿß Ëª‚.8a¨:Þ*ï#^ON$‹Ô’b0®ŠçBa ˜K«¾¸?M£/×O/h5Þ1ÿKþØWz¢ºÿ aŒIƒñú¯“B3`öÐI¦ÏI~<ÆV*jGÆãm³çÂ83Fˆå¡ ?›Xø\¿Ë¸!„» ÚI·8Ìš‘RéÕâP¥¹ãÿ÷!Ý5HÔþ6R.À^ìÝ?JÄ@à!Zz ]=†`çU¼† Xicã ,´ à¬ââ?R òˆÂÌB6Ì÷‘"yÌî› Û,¿ ™,@Væí½ßÞJû;ÃUÿSYÖ¼Ñ$n0ΕñÕá#…­£'¶ò-[#kA “€-?^Ï/VõìCüãÇ ÎC%´ùÚ0¾`uYa$`0 ØæÝUªVøLß:‡`ñ0$`ml·®oó«ù «IÀÒš€¥l& XK «IÀR$`© Ë`ñÛü_ –,ö¾|²òLB}8þž\f¨7÷ÊM îÏ„ XK ûbïìu¤†¡(ì0£ ix@ˆŸ Ñ!ÑÑÐÐR¦¤å¨@$i¡ ‹ÑRPQPlÅ 3ÂÙV.ös•<{>EÙ;ÇÎ3ö:±o&9ž0±Vâ.j‹Í³ý´f,ž4ûÿ}uº]Êj?®ñxC!„0V„0F¼r¶ÓaæÞ&áF<b–›„ ò/ßœ(G;Þ𑥫 Ütã’[…ºÌ¦Âò‹q²ÐÇn?¢úP=âòàz×|?ÂùØBk× ¦ þ®FœŒÓÏuºþðòù´¿.u]·k:ûäÙ{éu³1]þf ÃV"Í] ?ÛšãJ+çMÒ–IÝ‚upÍ€E‘Š«òèÛOlÃŽžó¯¯w$bÝ'é!ïÿ,ìEòëxñêuS8Ä^˜m¾Þpi×Ôuíg7GH·Ó¢/?L@î9_Š(Àg!á¿U¸ü0BàÔ¾µõ/å€aûMUÿš¹©fÒ›ÈïXõRáqÁð—µe +LE:ìKQþÚέ3ľòÊSØã˜Ieò˜Bø°²(å\ƒ’ð=`„hÞoûS!ÿ¨ ®‚¿³Ì ·‰þ¸b¿¶Ä`ûüœí?òôIá{À²X<¸/Ňr»b»–“°IOæJŸ Uœ|ÙÒJäX„>*¤Œ!²S‹¥j®ƒS]Þ£/ç$Ô{ð*™ºÝíG_* ðýŒ !„0Ìòð⛡ðñåóÿëÆcØžÒËã.÷;ŸÂVã½AÛh Œ€Þv˜¶eÏ›‘ ûGk'ü8]8—ºOr†õïö ý€ãRÜhí0&æ’œ"õ\ÿ‰¶IÑ굟°ÃZ–g÷ؾljVy¶fôEal“µéñë°[µßØOÕ™SVÉ ÒKEb “˜5j®–0F8Ü¢ÐQVðN󓤡>.¾Ãc0i˺2³>ú$õáÛnB¸ê½­¯wí÷3„FÀðZÐ,ÚoË/_«Î6fznÚ)FAúÖ>}$j[z]Â!2EÔ7ÚhÒ±+4¾bû¿óÕÏÝÉâôÔöD;»3_–ôh ¹GýO'J°ßìݱNÂP†áßFE˜tp ‚QŒšè¢×àâìæ­x&&Nº¸xº¨ƒ ›‘­‚ %æjrþ&`yŸ¦ýÛ_K»õ;=€É¸ ÊùZôÔ1Ž=>·Ï4:\•1I07ÏïÍé)Y_–ÍïJ+­é¶býQ±›‘®è[ ñ{moô•-ýwé­ƒ $`“pÜ*x9¿ž<"½ÿÑé©?|LÞ´u€€¬¹ócɀћQž&€‰;Q2 ž&“!@&F¦0 +-,ÍÌν´sÕ§–YšuS‘8 s€ç+ÕÇ l,VJÛ[kf„o¦bê$`.°ZýõÃóürq2_h´e"_ð˾©Ôêaæ~u*è|dè­þH®¯þê^ï9XóÝz„dÈ öTrõÁîŠ+¦è°Qx_ì-„0…íAÃæph.¦A¬®©Û5+º¦¡€¨¨ã'CÉûÒLšL2I3¢m&óæÄ ˜TŸ”1m濱ÚL«µ ãR}öû‚o+ÜyP¾ªoj¤^Ô{ê¹ð¾g]„½^úüÒÏîTÀ€»òÜ>ðSÐǧ—¡_Ø;{„ kc%öžÀBl´ó6Iam—Kx"vZ¬7°ˆÍbá-,r2ƒI„WM¾y 3Ù"?Í|kØí^ô[ãÖ½ÂY2|ÐmÿƧ—¼ïá2Ä‚#õÎ BüZ|ý¸€œóúºx$¸_÷©Í¼±Ïë# HFœÌÅý¤+7^‹YR¿Š²àüRÔiì9"y‰ú¤O~¾ÕÏ Àd2™L¶¬n•[‹¬ü¥¥JK1°i÷Öÿéùdïl^¢Š¢~ t,ǘBAÐ""¨µáÂöAš.j×"wn‚Úä*ìhUA_FS´ ¢" 2 ‹ŠÜÕ”éˆc:OÄÔ×Ísf<Ã=ï«7oÞùqyœ{æ¼sï{wôÝë9ïúáí«ÂÒ××ç®P³»GWÍÇ‘b¾x7üyjtjîÓJÍü9jÖƒqøQêyI¥.X‰«`\,”´§z¢P„¼LêqÌÄÜœÎoª´L_8Ë?V’ÝfÙ“ ]Rº¬M¡¨JP^㈻dã_ãëø oÚ>x!ùèñHÈô<Êu]Öq-Å]AÏýòš¼<ž^Ý«Ë?›õ)?ϲ¾€@<ô´&ÔOáâ+(~FÀ³33ÛêbJU¹Êõb^S3³»Êù¦*°‚˜˜Á…ìéÕDZ¡õ¬ÖùíÚÿƒn \[4xcÛÛ€ƒ`|B:Ž8å×}&ü„#ÿPA"`4Ù7ÝÍýZxv§»þàMë$¬ñªºÁ11ƒüéz»A?hðG†ËA©%d’‹½W…;iîLl´yì—« ‰×VçrNúûD}¼.¶¥ÚÉÍMgg7,/n­;ŽŠ[UÎ*ަDZW8±ŸÔ‚ÇĬçBæ¡.žáÁÿü}f|Ê¢ ò£ðXf¨«åDšOi¹¹íÜ“dWâÐ-ŀș¦¤A2•èˆ5~¥P¢Õ tø6 ±¼‘rävA̦S;¶ÇcÕc_LJ‡Þ¥&â±ÍZ3N©¨C¯¾ìw“ãê+i÷¿rëRð¡°àÇ~'zh™õýŒÔÞƒ‚ ² "},fr°£¥½Wå2‹“iiëMvZì!ÌÉÝ@ó~¢‰JÃþêà®÷™"‚0àÇø}LÔè²I©¥ùŸ“ó°î¨äM8R åBùsKÚƒ+Nú–F \½W5o–€ƒÔž%ÈT»øgÌÐGóiS4fÿ GJ 㺨M>¸Ë*/À•v¡P2G¾¬o~/(ËA‰€ÑÇb–]'§rYP-Õ-.,YohØ;‰ÀGž§Á킸JUEâ-/Za4X ¿ßXi/36.§œ2öÆ2¶ÛèÜþº°’^¡eQ%e;Ž´þ)¤Þ~¼< h¢ ‚¼†Ùyä^ràø±Sçóšäí+M­ÉrN8‡³*+ ÞÏTIþIÌçÕ— Bè2ØýAغhj½?p½ýäé Z¸Ñ¿§íå>^8·Â«z2ÛI±ƒlƒ5xMBä€P­cˆ> X6èÝ3ä= ßì7{góÚDðI´-­E©à¡1)¶R”j[Ñjï ~/ÞvÊ>Ùi:M'I?ÂðöÍÛÙ™ ìãí¼õŠ€u<‹sÝa7Ç‹?a#`c[1 âè™'îœáÀù§¸ûH6üš†6v^ÅÃÀk8Zhè–Æmܳ õî±´iŸ˜Ù²¤Z)öÞÊFèИF\/ù™­Aø€ßk ŸÑ "xDíšß&oˆØ·6À°€…€=`©ö- @͘m¦C² 6Ÿ®TÅ´PzL£ËîÛ?°go¹Ö³Pü-¥È¢1M:Îû"`ì“?s9+yØàÐȧ…ï‹Ë•á‘ì‰é )—‰Fô&`0ë}¥nNÈ/æƒÅN)-ýü“NgrƒÝ½}•šéêíËä2¢)--›æÆ¯× U µ¡:ì‹wjuœ"ø]ÔâѲǸ<šR«Å{¸[vßɘj~Ç­œTÊû¬ð08tdÊ¡Ñ)7oÔì³Þ×ÉÛ'§E)B”Ÿß1zå¿{À _¾ gËÕ(e¢èŸ²wç®Bás®ßl,pîÍUû\«ª¤L¨ ÕaÇX¤Ö±¹\ý³©ŠìѲǸü|$55¾ëĽÝŸð·r¨ùÕ}¹ƒ²ñ’€Xø¨Wøcâ9|xûb-Þ…˜­Ï'I8×§ÁXÏë‡R®¬(•}3o˜õ¾®Ë—D9;5&‡QþuÝ«Ff5ßJ?v›îg÷æV+gΞ}®?e\ÑŠy#"(½•×ø­ÍZPµ Gl­Vúô\ }µ«ŠÙëoØk{¥·UúºúéÜÚ;Ðík½­ò—®µ¶“ŸSç$ª*Çûd~õ}S+Mªöu?µ^JÏõ£W#“²]_þ¯#ç/J90yßtÚEi~ƒÚ1k&x_Bú/{×ÒâD„;>²Én¢ä`TÖ½xR||¼,,xР¨Ö‹7êIô$ˆxÿ€À“ø€õæÁ£‚+ˆQô´—]u¢’%3eö1¶–¤‡ùHw˜ž8ÔGÓTWWWÑéæKU'í&þ±¯›‡NïYvZM¥’j#K ÃýfeâÄÉ¿­RýÓKÔ ð¤K2’ÐÞ=„Q3:A ú¡a‡qIè0„= h¯žžÕ³µÒ(%èiJ·cèý£ž”öû"Kã›d¶9e8_ôl)iÏϹ1õ0ÔûW³—çý£ƒÁà XJìk¬zW6)Ä&'ÔH¦§4´0ÙÀÆàa\ÕFˆCçp•ÚBz nY£ç ˜ú¨gn—ÅÀŽ©÷³Ñ¹‘¹v$˜™®ÕjaõH¹ä4[ 9!2(çõ­áì*—„÷Y0,Jõôö).§´¯žBK,3K6®M™ »°¯îço“FoÏ=`º —hbg[jÊõ‡ gÀ˜ƒ}Ÿž?sYüš“òXåÒó©ÉÒáñhjHˆ(õ”¸$²0ÌvH6®"¹Ÿ³yF™ ˜ú¨·5+ebäX1Ÿu]oi~qK±Êzns¹îlX_Î=O¤̱øaÏ"þ߇c¨˜M,ؾ5’÷ßû’EƒÁ0c>ý3öaã¯/&ŽŸ½.Üù–f¼rõÙ“ê¶c“*3ç|p6!Ä%WHÏ€ÔÙýPhËRF¾¦û70¼V_šÙ>êz?¿|ZpÜæP~pg¹”Ëe,ÌnÎ XR˜¸½½C4KAþR V?Ò`SšØ}1ì_<&¼ÐÅY)ƒÁ°d¿W"®…}¾¿x®pëJµVXõ׺v[ “6f{êû$OEÑû%ÝÄì7{wÚDÇq| j •‚T|)Z(%mÀ$¶ÚbZT ”´ =©_N< }x΢‡‚xð¤Pl/ňIT¨X|A_õàÍ“àÁj¡‡B±:܇Î?dšn¿Ê2;™ÌìvsØá·™XVA´oý̧æZj»¹Ný…=ïûâüçÅy¯h0áÐ5æª –E;,kf©…îß%Ô²ô#Žë[¡\Ìœg¥G¿üÛb¿ì·÷ËæZf}á%qÜ?ß"¥K½Ëyy+‘á¿§ç_/ËçÓ¬©žë«û/íQRñ8ÍÏO)ý €Õ¬‡nd3ÇGÏú5Ùé -©là«bèöfžVF:}²”ËýoYáXQLÀ „….äöfK§—äör½<®.ÈÌeÌ]³Òl/7“Ç•‡vhìp^rd'_³RØ•TÛõ•ÿ™Î×KEh,¤g<…€Õ¸–ÔÍÌäàÈ‘1UÎL¤s¥MZü²õ%]c¶Q£})ÇPüôÅg=r½û×¢_3“S×;"sÇ“‡ÂÊì@XÌ @HÀ*ê§ÀœEóÓiUˆß*982ÊÆ®\£Ëö]³½<®ð®2œ‹@žJ»º<0R/wà–š{n®;°ªø0wzêå k¶¢B. ˜0Ç(¬"A§v« !—Ì«0$`ž 6Ó0ÀwÀ@¦æ`kÜÕÒ°_^n\qöêÜÂ×¹…o›êÏô}YòjHÀ@`WùOOOý_¿a9¶c[o4onRåScªÞ«=à;`  ª+5Ëʽ¸“ŠÇS±ä@¢¨c@m»ZcéÎ=“2Žs0€ €ŒL?y8óæ~¢£§½wh÷HOëî–¤Úë:‘lëÝŸÌ¿¼§ÚTÄoÌÔ}Fjë|ÖrËÚOÀ€Îß å@ÀØ­R€Ér+ó¬Æï^‰6mmÛÞz0Ò§vg?Ì\z0~ûmN•#[Ú7†ëÍM—Nq3£~×dVºZøõµUek™î§ª¬ûÉÞù«…QÜ ,ÞÄ a1{8eS²šLŠEŠE‘ÍàÏ$q)n‹í¦ç7úêl_ÝÛWç  <»Q—¾¬Ðö« u`ø×uã Ü~¦q”me‡.I]øY@6Bõ¼~j^yM}¿U)ˆ;g¬Â „ážÐwéPºèctéÜ­/Öµ]ú:(:gÄ"EBÌ")\8ÈR Þ7Èå/èþ[²’[:‘yÉ5m‡_R 5;91ø÷ Ÿ?³ì’6ê?ÎAA[?½¼û®éôgÔ¶®û¶TÊckˆ£¶zâ%|D¡ñÉ_,ð¡…7‡¦;æïQ¹×ôÕßO&§­œÙ9ŸÐ&‚(ŒÏªˆ`Kˆ’Ò¢‚ ‡ B{IZÚ)”OA„´m¥ÞzlÉ¡Á‹§{U‘Vˆ ^=(Hé¡=$=KþxhÓlMRR³ÛÂ.ô•¼eÇvYòýÃìäÍ›YȆyó½ÙÖQÀ}ÈI»}yì‘°.-VJ>©¯ ãǹ½ß €yA°=PÙ/w·e½ëj8ÐÖn†¬÷Ý‹^<áöµ›•úßlñ· ‰ª‹â‡o¡yIü|èWttçãÒ8³Õ€؉˜3A#^“.j9»¶Oèì €A£+’áb;§¥¢3x=›× ;[úþ^ç•3#W¾Ü uO>¯Ô«^-›¦¶8ýH”L¥YH ¢àùz±á™‹Q˜;UNP’öŽ:Bžg÷2ÁëG õq(`PÀh¶uNKÉôÃéD¨#üü&}:t'&?²½ ÿ‰½þé iBÄ“kÆïªÌê,Oݫχ¦ºð ¨õùõÝx "PÙ´ ; ÖG–®wƒx{uèl½€&¼ –×ã±±L.÷ks}.=?óivîkJ–¥Zé aôj¾\ý×0„TØiràÂjô~MHƒ(õU¥úTiÝ@L "q™Bh–=ëŠü¡8—µWßbñN @;eÅi4Ü/Ë¥Ÿé¶K—3õMaŠñÄÔ†!Œ­m]ÈkS{üv5ý2¢xôCÖ]al?Ì|¸»—¬pwÄß5s4®¥Î€²w7-mDQ‡¯¢Ý¸(Ò…©H!lÀD£‚F£è"¡ABAÈFŠí¢¸‘â¢4¿€RüÅ—•n( ¾UÒ.´4¥ Rºl@Aˆ«bôî" 9!\†qÂïY Ãpsîd1â™ÿÜIݯƒ|©X›¥ÊŸjÿȤÁ¼ Wµxa»¥û€5`æšÜƒM ¦V¾m\\]¦{_´?öäÿž<­åî÷¼¨â¿4zG&•’+‹c„žJžH8g£s3`™Â¸, À/]@æ`€vý¯øÊ›TÚŠ,|ó=U÷ļmãËùýù>åBßå8Ë+é¥1.XF7]\0GK•J·{ Ün¶ƒ5j“ÇØú5IÀ@æ|©ÃwýªŽ· €ÌþRRhPzÒ¼ôk5“ûøv{ñÃѲÞ×G”m€F“L=0$`–$` ª‚l!7·žiyT txb~ðY»Þóé½>®j€€‘€ Ý×ç_Á`"MvÇS¡¤Þ†}‰Þþµ£­z0€ €ŒL~òpç÷A¼;4ü<–ê™öy£z;žv¥#ÑìÏ]=Æuo>t  Ae½•ÇÔPÍ=ïØ»ƒÐ&‚0 À»FŒÐ…”†ÖŠZ+-zÐK£ JQ£ÅS!íŃTôÖƒˆ¥ Añ DéM‘¨D+ëEP¬A´ŠQ“Ð’&b71I“¦±Éúc &.»ëv‰Ô÷‘Nÿ.Óù衳V3$`:xäÉ< –/–î‘››íõ›6t¶tÑ—£Ÿž\}æ~ôÎCu‹­Õb®Ù¶Ö~}ìN•¶Olmô^ˆè_DÓdæ=ë<_ž]§ ‚æ_Gœ‚¨qå}O¦b93³˜9Q4Sýõ{`øÅ}*|!ÿÓ÷c¹…ÕÙùœ‰,Ícå °Û÷ÿ  a„T<&²óTGR3o‚Áñ@€^Ï?N¼}“¡p<&$Õ­%¥‹Ì¹B} ¹FzZSáûMë‚rsäæ—Ôî_úë  ã¹E#Òjl]WkMgÑÕÍk­–Z±P z÷–ަåë×§s³Ÿ£“*iKC#sEåø?ŽêѨ±5«rÁʦÊWØZ*ª  ÓÿS©`÷<ð05iªk0ñ|$6•̦šVÛœ§·®k;¼³ûÂÁ3ý]'ÎßJ_æ{vì×ÿSæb2¦µþ÷¢}>µÖô½Ì|•ÛW‚L3îdà0˜Œ…YÜyÈÉÔä쾓Ü.Û*ëÐã+®Žc{[ô¢ë‘ä7ǹÑöfÏq½C÷úÚ–äS[LbƤU ™˜Áïý/3Õó‘€Îá$`FãËk‘27ìuôøÃáñЇAïå‡GÜ4Æçâ?ób$™™Ndò…ÅÛçH7Ù™Z¢4G;åe}eŒÚãz>¤HÀ ˜±‰“È—öcG÷Ðèy嵬¬ñçBœÈõuºúo|)p…)!ISir÷µ·ÞS휒_ä›- … ^ˆâIÌ4/fÕkX,\ÉàÆ`ó'0“/½Àø¨ìÁnçaÿúxꎶ7Ô’®™æ<ÀúAî'yKÖJìÝ?K[QàsÅ]œªÅ%8*”(è (ØÍR(¸ˆCÁ âçpè7(tjw‹th‡H‡"Ž B@œÄÄ NºÜëá’?èó@rnçÞ“dº/¿ð&T€,Ö`½ÈÐbçÎØ9Ž5Øæâú—ão7w·õµ·c‹³Ù‰ñXý^7Sk¿îp©|Yù¥âqÒF ï°p¾â©u`òw’D†ß°ÞŸžÅ1üïþ²ù¹ö!äÃÒÞ¯ÕéÉÐe¹öæý~ãçÎ\H@Z¿Çâ5½½…–€¡ú$`ƒÒjµϯBϹe^Ê.ÕWJÀ€ £Ýùð’¡ "º ‚ì™ X2°IÀz $`@»`²T;Žíâs€IÀ@d“)ýâ²,ô °Áw¢îÛ.ùó€> 0$`í¥”Oqe|ÙýŸÅ¯¶Üb䉽;´„‚0LXA0í55†«î"Áph$ÿ—'ß—·S(ÃÿÛ@6î¶ÝâÖŽ£9`•½;6Â0ªà6b£µ;ˆ`ã<Îamã "Îá Ø]Œ×Dø)ŽË…Ôá/ò› 惀Ìòúªš^–ÆtËí|žzœ¿ µ«~ ö…`ï÷Fo?lH.öî˜5a ãø‹¸gqlÇ.:4]ì\IÇ(”¶8ˆ{»ùYôH‡ qnG»4œœºµè¡¤U{C9O9P Aþ?Âñd~y.c瀀sÀì¢QÝ»¸•ÏW•Ïü›Ç ^(ßoÐnélÞQù襤òRP–öë ŸþG#gͲhÀ@f_ÓÞ‡W^µ%qô{M#Ïo½ ¯Åàºîößø¥&1[‡¦vnü"óŽ1n4` ³¯iI2_Lc‰?D›9ßÉÌœ¾Îî&0 e§ö³w øÌtX齎8E}½öA¥¿rúR«Ê’mz„3K°=¬¿hÀ~Ø»c]†¢0àÕx14iB‚…É(±´HŒØŒÀH¼„`‘6ŒF1°`0yG:{nnêTz´ýý†æœÛÛ{º~ùŸïžl °$³ë—ݳööîawÏ­«Òê+ŒÃgiï*Œ;¾¢½…ß÷ö%F¢;ã–­_Šÿat}0=HvßÙ¯ Xr Öh__œ´Â ¹uSø*T\͹™ƒÍ»Þ4ŒÃ•ãÎ|?mWÓÒʧúçÉ=`ý/ÑÿZHÀ€¥ë•^±¯ì«hõ;Á’ëØRè¼Í©ILÀ€¥«¨µòÖ`¹£*òŸŸY$«ý3°Z0Æ X:ðD¼q¼€ @& ° @€,ß!ÈCxþ0VI… X~K?ô¦ O(â<ÉåõOvî@ èXÌ“Áh‹Ãb±x8³ÙY6xë&›‚-&¾Ç0 sƒá‡y6KÒ,Œâu·I—Y6Þ€Ýà¦NêÕëËœ|î©ýOq€ì™±jÂP†oƒÔµ‹R :9ˆv±C «XJ)vénû>€tqì 8up°{_@¡-:¹hA'K1*ÅÆ…›à§%G4óŸ?9'ñš(7ÿ0x˜Ç­{<‹Ä?zŸCcvß?ɦa=4¦à€/œ`†a†a8£Ì¾ôË;X@Ó-G¯’ziSuäLiU†;jsÄ÷>L@¬`iöµSIƒi¶^ÂG·Òÿ6…Áhò£iÑXôl.vƒ¡h,Ônw#C¬¦ž*ÿгגã.d¯ô7‰\\ïR"„‹ûM\øOIÙõØ3FÀŸ®Ú”l5 ˜WeJ‰ˆýk ßF6¸d貤èŸ2ç˜Nm!‰?Õî @ –¬£8;«kç®ì%œYûä ãñ)¥úÕ:1S]N—Ù/92`vÍ^ea ÃÑÁEAøvá[œ„ªàßÔÍÅEGñœ»N‚"œ\¼E°N¹¡…Ö¥Z5ƒœ('$BEòRJÎzrhåðT(Þ}+–iP×g¦Õ0Xx¥ÆÁ0;xÁI-ìù£i¶[ÌÏeäei¢Å¡òa¬†KjR!ž’¤RÖ6••Ç!'  „©$8K¾.þ£ &.“,-« ƒ7Œ÷N¹YxJðÈ[õ©}Äí4Ê,Á‘× ŸÏøç„ŸºŸ“–––&`êû³Âðr=$p¹eÏa„»¯fÞ^Òžã8äË¥¥ ؽûU;Æ?õ|¸XÈÌ{gÚDÅñ·UŠéÆd+é!~´x(”*¨=y)B›V¡zªÞzOžô"^DðX½‹z)M1ê±GLZ¿N^ŒVðdséúê€ ûϦÆÍú~,ÃÌË›éƒ%Ûýï{“Uy0ß”db`ϯFæÒäÔß#sy«e Û)âoyÑ?D¦Ó#q‚ÖQCÍ¿Ë3'mrPX? ,ÍF°C½¶Ú´_í:þ`Ô:éÜÁ!ú7Š¢ ìáàMžGÔÀªÅ!®g¸ ®/—GAdrdb9—}@ÉñG.»pxb¹¥úâ–ûdýÿ‰ÿïs7É€m©¯;iê?”{ÿ…|ô“uãŒ÷9ï{–0œNÕªÕI›Èòȳˆ¡ŸÕÚH:Eî7ÒF”XÿžFi°ˆªªÐ/m檹0TÁxÄ}ž6 žG\ÿíᆋS?B©?Aö€íÈÑóϲO¦g¯Üä~öé½ÑÌó–ê‹ûÜB,ðâß¾êÁWì€þj úw¸1 c{0‘E=€0þêz·‹ W!¾^š§&œx¬^wKß‹ƒNÒÞsëJ¹Ö·ù;w\—v ¢±ø°cL|¡!Ë¢.•±»ªÞ`$Hï>:A2`¡5Øèô‹ÅGîŒ]|éûˆר±‘ë^©!÷Ùré¸Îæ«ö¨"Ø”®Œö õ ò0þ³Ê jñ=`åRaøàcÇ6¾þx›ÿ°Q(:ö>¶TJ"K2°¿‘ØÍx^Ålª+ߺÎ"z©¥:Å w „*‚ ïÓ€¥ª/•õZÈm>ØB]G~Q¬ëoþ°w‡º A†©À× ªPˆ†¾Bˆj\Ußs9ÃƒÔ‚Ç 4 mBá ‚ŠK¦ÍÌö–æXòⲄ {ÉrÉNænÆý0™ÎÓ4Íou³³dÀLõÊáxºqðË0È@Q”¢zÚʬ“Q ¾ò;ú¼JJMyª*?ª/ðØE;ä+­¸‚2¯L]´¨†r²ò•rýz!3·ùËGKtë('›í _gHeqy Ѷ»ý]óÖÅ I’üG,Õ²,{ê?Ê>0˶­„ Xü‰€ä¶ò À¤ß—r4oN°ðNY/ÿ€>` còbù@æßL?º³"ú’Œ@<Ѫ ô³3`.¨föÜ`YPñúågÀ@ óÌ€¹0  "uzc˜Hf±Ï‰`-J¢úÅÞ»FDa|VìE°I(xAÐÊ"rBš‹‰hŒ v iÿƒˆÿ„h@C"žZjgLNÐÊÊN!&=MÎÁ•9n¿Ûy7ó.Œ ߰̾{ófgf7¹·ßl6©F!„B¨€¥ÿFŽv»E»EÑìå°ÿ·4ÞKÚTÍaèÇ*àÕÛî*>F!„Bø ˜Ìæ‡Ëv{ðÄ#ý³µh×£5³¢b2ð],{zT<}Ç«¨€B!„*`rö51»`l!Z©@­Æ Æõ¿t-ŽrK߀e»Î"VÁ RŠ  Ð… ‹0ÚŠv1XJ#xD0°(¦»š !„B¡&³ñn®~þ¦ùñÕ–'7^5ç|<­ìKBE¨ŽUä&ðÕÿ.åp[hWŽ_ðÉ·¢✣ÚÅŠòX)•7ýtÛ÷-S#B²ž“üÇñ^*1¤¡]ÐÇGv9ºu8rE´týÕC!TÀäm/ßW/Ö§æÍÖÆ¿ŸízcþÛê¬jµÚÿÿ­l¸IB޳@*¢8¨%ú@ÊÙŠ'‚_—K¿‚‘ Áûnˈè£?Kîy$'}0~SìßvE!TÀäm/íöng{ËlmÇÎßí̾Ύ.¾ür¥ÕjéïÄÁª? %û[¬¨¥õÑG@üÒëÊI¦Ù¯QÀÞ,_7Õ‡ Úît[·[ÐXQà¶ íâŠ8à/QåÒ.Þ…²8Añqú"FwÑ_”ø1!TŒ€lwŸÆÍ;ÆñøGõgJ†B¨€E¬B<|æIsefúÒmgi.Ý™lö;†’ƒUñ¾gÐz<ÁA]Kß…8ÿ¼ïÁ•ÓMŒèÕ \t빆'žÖ°[ˆ‹ãñ÷P¨.-’–sQlÔÄ·vÿ¬yòBd,ì‘‚‡‘#λæ}mÝdÅêG˜ ”BŸ“™|ºòpêÂÕ;¶¼²¸0ÚxÖ7û²å¨ ïñÉ·Ñ‚]9ßõ´ˆU\wƒuË–µn+ƒÇ÷t}Œ)ú„Ž•ÛU|¥QM·1?©€9¨tí­0­'´xmË) Òé˜,ï— è‡U%Mp;|,§+ØtŒò®§cL¦z#Šuòù“Äzšìz!„*`2£SÏ—î7lalæ…éÅf\cGÜš~ïÚ²µÜ[>†¿´í¶Ì‚Ýã)Ä‹PEª.øg`ôø7$;hb†• ºé§»J !âJ°a>U™eŠã Ñ”à<Ï þ‚êaµdF&±Ê8ŠÎB¯‡B¨€)ÀÔË’«^`; X… }€$"þD‚­f•m’KH‚¨RA ƒâ‹ «5Úâ+A”­§ß½¬è×;zªQY–>§ø’›½ûgMˆã8|”î.Û7`‡â¢³!«Zħîºeí ð ´¯ÀÉA!î]Ú%8ô¸)ºDø§ÍPï×# I!ÒÏC8Ž;ùq‹ÃñÍå z¸ÌÌíÚí¾Ø,¢~½Ñ{q»Õ‘ø5Ó¥£¦)m\e_?^Ji®©¨~¾¹\b_üC$` KnãV³;»éˆÀÿ~Ö¾Ýp–³ûŒ'£*G±Jî[ ’w$5ͳ^&ÔÖY ƒ[Dí­÷(þLÚ?? KnãÂðð¹Dð!¤}iîÓ‹’{°¨¯§CÙSi59š0°û€ìÔ\Ywü,Jeù¸ã§Kk’÷×)ÔÆ,÷ï êÕ²üR­ó$€}±wÿ*DQ€Ã’Ù"°`!iôlvÁV»<„>€ø‹ÚHþ{†Úˆ…Oc¡Rxs™ì~"7g27“æðËÜû_%`⯜ƒÅèÄx5øV_HÀ¶ëçÑÝâzz|rÖŒ7—£ÉCçž'-ûÞÒå-σšÏ­ß–fNõíaXIÀ–óÙ`û«\N,Æùɺ/€õÍhúxûwÒ ~ýy*g_¹’‹í×ö<-G —Ýá:c€}ÀúB‡–º¬”˜ùý!ج¢õŠîkwYQCæ0ºç]rm€QïÁþͨ ˜[Â6¸p" $`B­è©š¿¼GÔÓó `D=Xªâ/« €U X‘†­Æ]ç$`€¬Ì € €HÀ« `D@ Ûm @HÀ$`€ ǽ¿ 0¬$`Ëùl yèÛn`icè껋يóäI¢¸Ñ÷›ê¥—(~>õïUÝÀçÖQÞ¸<*Ql=¥~…ýHÀ€_ìÝ1€ †Qoã`ºà5œ=Çqö"º4 ÜÇ z†¡~o¥)!a€üC=0À^ÆÚˆH˜ ¦ŸË­O,"¢Íà{帣ªœ§gVóHÀ°=3Ć¡(‚Û ®@ã¸à X\† ¸¨†ô³’Pƒø_,ÙïϺnò‘€9D9ðøb)ò¶@N‚-î±P^JvýdÌÿzÓÿ¡-65‡’£©ÙÿE¦|ûsmü…PË@aK*—¹Vkê‹¢(0Š¢â“½óÇ! ¸ˆÛ(DÃ5jK8€ƒh)\BA# §Q°ÙÄ(æùd2/»Šß/[¬ñ|ï_ó&ßìÊ8`ç@œæÅy]ÄÅ)StZ<Ä 5 ú®‹#ô"¢}9.±–¡©YÜÏ7ªŸ¿Þ!þ»}Ó÷÷~%í£[±¹ÊËúVOhÁ¦Asµ÷ŸˆOäÄ·à€‘ƒà€ˆ¼+@Ò÷ÐÇzÌ—¢Uà*d.…¦–X‡Ê'ê&’´À8;Fär=pÀ  àlÔÃWEVL«t\+è_ÕÕïlI0ÌûriXçð?`À˧-â)¡“I‡®oÒiU~)ê7Ηü¹~ûGoz^Yˆdª­L±¹ãùc ìÅÎÛÃ@•h˜ƒ‚šA€A¨)˜ƒ†( pñQ^úÇ¢+˱N±“"Qbÿ|kÒD7ÏÀÝÛ¡G s¥ùàpqW¿ãT( ‘=Ÿ:̇ãýÈgÿ`–º»ƒùuOí“2?â+©ˆ«ªãâÚ0Áy°e`ºˆ+Œá™ì_ïÿß¾ìÝ1ŽEÐjÄ H|Ö \pb2çŽIf'!Þ ‘B°!°$€0 7X­Ðx¥–ªFþèÏÎÔØ]½zO£qOuÍŸ®•Wš¿¿ªº P¦?ÿ¹ìùñæ§Íf3ÿªŸq ؇ÓíÝî£26èØü#k÷ƒ2„'¯Âëþ}öÉÇe͸¸¸xÙ×¼aýv»ýêòËú=p>îøÚ´ ¨þZ¹X¼{ýCû0x^-’±ìX;¸`ÄáÀù7?ô³Š\ö$ѬTÀTÀ»  € *`€ €  € X° "Éí°-'¨€ôTÀîven>{óüÛRÊåoß<°gí|Ú@êqü6æV¿WÒ{ýìv¯ËûÂ4=+ 6lXæïÄ‹ÿy>æ]ýƒšŸg Ö:â…ÉÕPTÀ8¢¢²¦ÖC,‹Ka¹Ak«26¿lÇíTËHcû½'™Ÿcºåqòñ¶a ¨€ ‰–GÍÒ´ÆAµ³iœ&Ä9Z:1¾lyZÍyB{;µŸÒÔöƒ•·ÐrdüDǪsä¹¼9¶÷G¨€*`´bHgn6þìʼ¬”T¨òžýúãÇëŒã]|þ¡¤+¬ g»s¤ãíýƒÊ;·ƒ“>«½¬×`ôW½òþ=qúç"†y}Iÿõo>Ç;E°ûG=ÞÛ{²¯ü„Øïß[c†ÆÃ—£õçlµVÖÜ P#/UÝ'Ka‰WkßÏ©æ³õTÒ?–ÎBœ£´Í0b{LNâdŹ1¶çûj„·ÄÎí ýÜvýs‡¤J™\g2Þ)såE§8Ë. %ãA;N¤‘;kh1Z>Þ˜kµ«*`€5`æÎÁ’öüTÞwõ8u‚\¾¾+~K”¿¥¿sÞ¡?Nýq< ÑR±zÐ/ÏëIfòOw â®”éæÿ+åiÖ€*`Œ¿vˆ¤*ÕÃÿj‘*™Pwž_±eÉx‡6Ói*²/TÀ0äc}–!HÃjöž½x,dÁ\ TÀ0iU>0Û^æë£’³IÏÐ’ÉsÅÓ¢Í=k„0ŠòIP¨€wÕãö|Þ)…ùËüíù©–LÆáIüÞ1®¨€Oz*`å±°“~RkZ`›øõ–¿@ p0ò$j~œ•—õc»îv` Ûíw%S°³kÀàåÍõõåˤýƒÍfSÞ®®® 75[,dë?èP¬TÀÅÁZ¾¨ý]V¦åCNà E ° å¯å³/|ç¼-e÷h×Ö€½açŽq¤†¡0{VHƒ€ÓíÞ€‚*º-¶œrÓQRph¡à[!Í€§Ù,œQ¬<6ò*CÈ÷i4z“8δ¿ží?0D¸’ÁÆ®çz¬¨Ç^ŒïoÕãá¶½C“ž>Ïß——oFÎtÀ{ÀÐþÊ#?2˜¡Q%J•»uÑ?^/ÆÆ/”x“•Ó>U™-_)õ`dð®`d tÀ®ÿ}v¾{ýêeº)€”Õ²^q,%¦åƒ*w•´Ó4UÃÌ­€k.,ìº. †Ãí:ƒ–ÊwÉQ¹Z[S•™K1xu0²¾^¯þÛ*¡v€´·ª@+?K¤ âÍ üí¯2óX¬†U“70´¿êGÆözÕKsQÞrXçOpÇáTѲÆE85•¢Þ!v˜Ä‚XÕ²‰«=;Eñ tÀ })`|½\¬ëxüJ– Âõ[Iq«+Õí»T0¤¦Vމ‡1u•zR{-xEu79øü·Õ‚{§Ê÷¯Ÿ G<$–Æõ´©¦¿"¾Ob?䬕3ØrÓpÒÒKó N\Ò耰ÙÜ™á-€>ØÚÓØÀ~¿OóôÁ8i逥° @ {ÀØn·3oP€‹ôó"mRº®KK8Ññ3g0hL_œïÒøÅÞ¤6„Qöhí¯Ë.zÁ"Ñ€gü~ÁMÝX|ü1þ|ýO’¥NùüÁÌóü8‡Á$I’VÀŽŸaãïO‰4®‡®‹þ ØÀ0’$I섈4¨£°$¯«*I’äï°°$]°iš0±Û\]°Ô)Ço»#I’6`©sñ6•QÀÄlsQôTÀ’¬ìn0’$ÉíMÑe ØTFÛDlÀÓGËslÀH’¤ Ø:,`Sl±[Ǭ?I’¤ ØRÇLÄÌ3`çJ’$mÀ–:žñ ع¿‚hF’$mÀ–:~Qį ¶xØm7`$IÒl=â=`"ÞÖ¨€Ýç=`$I’^ÄÜcÄlÈ6þŒ$IRk‘Ø€eߌ½#I’üc¿©@ˆV#ÚÅC"èx0û f&Ž™¯[,äÈKVìž 4ûupAP;»Ò,ϧô£V ° ™—6ÀdVòÛ""""Ê)e€©@D¿g…œ¬ß;ìÛ=Hã`Àñ'U\ ·¸ºÕAˆ õz8HApèà.:éõðÜB7Q¿ÖN¢õ#ø"‡N"Znx§;äV·Zb(MÅúA“ÿo/á]ÏŸ‡Hó8m†ø‰Dl|ÄžísEp~V© @³8(¥t]—†¥”išR',:¤, À¼‚îèïího·Ù ò88¶¹ºØ˜–×Ä¡%Øêúál0D£Ñ·C&“)ýò3,¾À+{çÅyÅñ;»<äé‚°RAâ 䀈¨Ñ´!&¥ ‰ ÑXÛ˜Ú”T“jM(1 Õø,jŒh¨5§4mðQ•ZµA4*₺<¢‚÷1Ó‹ßqœìàÎìN6¢~?`¸sç~ß~»gæœûßûÍ7’i¥’Vò+` m,÷-¦zþµ¥1Ù ÐcH›óKblÊ_mÝ)ŸÍÅâLLy¬ öÌ–Ïþáeû£µýR$5Ø©/ ƒÛì‚Ñ£¢m½Öa4]œ}5n#Uo‚2N_º[”=D}õ|ð¬ÆÓ>77ן‘‘‡îÏ%¦\€™8†å€PyåzÚ¢¢Øá¡™1}`PXLñ{£’Þ*‡ï†a8ŽƒžDt¡Ü"zÈy@Õ…B¡P(›2 DœY*l%_€]j3ÀÝ ¨ÊyÀcƒÂ.ž¯ù?7]›7®Eãg/Ïã31;¦Pnú¸Pa&&ÔTÏçíû4ýIb£úzqðÐÔ¡¡O£ ƒÆì¤­¨/±3ÌË]ãä×WíÑËåf§¡å¦ñàÙ–KZI~Š4ØÌ'[_zeØò—£‚=ÕŽËàÏ|^}Ý¿KL¹33,Ë‘ê3ÿˆùäb¬:1Ί^âmI᤼¹Xª) S~ñ£ô"†Ãoú¢P( …Bá³@{aTjÿóž·×”ˆd< „õug­ÄàQaçBòL ¥1ì?aãG[•gbBMåbú†·uYKˆ ·ë`òï;}òõˆÈp.âäøa½ÝÔÀq ã†ûÎ8Ÿª»¦õÔ²í BæTÆ©Q}ð·á&gÓÄü‹{WV”…ûicƒ†Î "äŽD¹ãÕ—}p0ŒÒKL¹3Þ©€ ¥ k&g1YÆqÚ{°¯7 V¦¬zñ%/ !އ ¾( …B¡P)å XeV7ù÷ˆìãVŽ‚‚ëêωl‰WD›D*¡àã ©³fw›‰á!°…ü[”gbÊ v—ðó•í¯nkÃù‡$Lþ [6ï8ôûŸNx`FÞÜà–™sU3«*L~¾^{jÛSBÀ:©ŒÝÞy…FDoÇ•ÛüÝ]>Mœ®ko;¬Óáîû#R€ÇÞ‘P úz¹¸±F™Œ÷ûS~˜@(ÁÌqÀ1ÓU“¯¾ÐÏ+>ŒlEGe•­Äm¾O g·ƒ¿´äKà® FÕ…B¡P(%ßè÷Ì瀙š/|]œé“´T¥5üÝrÜ­Îú lÔ]àwÑ&¡ŸØDž‘òê|$ß\ØDà±Æ¶‚M)©i™:ÁÖçoþ®21 MEl¢¾>v2ÚAÙ lª€oùFw±=gß‚7Ÿ\Q‡½søªO/µ§« ¼]:[¾µ|åÁœlnn ˆŠâêìŠS±ö…êkvÜ@ÁÚºÝøº !!fS7·„!ŸÔÔ¬­+7 öŽÇ€#!1X‹S~Õˆƒ{è"Mÿû(.t€¡ºÀÌK-mÁ¼D`8Æ `¶ '+šÇ¾žeÖЈB““èê![nžB¡P( ]QT_$øÔ±c%û!¡Ÿ·¯4Ö =b@¿`´qkáqÐ[#¬]¿Q"S\ãµYVñ[+``6UTGõEÇþ˜½§ð]œ㳡¶½Í`pòb6Èz³_ìNWˆÍSãœt:Ý¡ÃUãÆF‘)ˆ ›5•‡Þ™8¾öë& 00L뻨쿼³{$‹¦yD—¡ïøê³àä·ë‹Ø—Ì,+` øcæTÊ'òÂÆZÅÌ‘ˆe›°:'Š‘€/ñà.Y“ãAQ_ …B¡PèsÀ¶¨~gÜ™•)¶öCò¯ 'náò2è1²•#‚ªU7( …B¡PHî7å'¼‘þ+08kïâ_$1“g‚ËŽ…‡‘ܼ$sÄÇ+ÔZÙ¶ç•”§Ä u×ðä`¢¾ˆ“œ‹ø•Á£ê’±®ù–gfÔNA¾.ÏFùŠ^fÓcµ: ¥{]½Æa *î© £ãþ&j®…#y˜.1é XC]mÿI?Vk½_™Ÿ¨Ö©œ]Ðó?Å“k¹£ÀÔ ÓCt1hõõöî-$ª5Œãð«#ÖMtØaѺè|"» ÚT›.¤‹¢$Ђº ‚ÚÚh ‘NÙ´Å«º(¨,5‰ˆ¢«Œ ;CB¡²ÙL©½ñPÖËþ´‘i5ã´rfñù{Y|¬%Ì‚÷ïÄK— jèŠÜÁ:VTŽè$frÔ®Â2ùŸf0©¹UY^<4ƒ‰ˆI_SOÑ$fÖ%ª¬ô³fŠÌLé{åC{Äkµb›>6gíoÑßÊåžË#±üDýòi-Á~]YÐTU!"E^\x-"ºRš/ž¤QÊÅG’½D$)é Pé2tÔ(²gw zZ#V ­HÀ$fÒ”&®œÍy™Ógµ´¾¼Z]õmfº/“¾jý ¹Á º.qp]<“|œÄŽS,v–‘¯?Š/À«À¬S~$”˜IìkÊÒÜ¥L;ÜöÇÀ=`&}™O¹‰..“xƒ9Ë0ý fK¸{Q|ê/E"æ@%{‹ Åj‡—'ršµÓ×׬¥=˜Ib*Ü€Ù‚SÌù!FkÛ_M÷ <ãg#wy2zFÃðXì÷‹uÊ‚ÁObæ îÛX„S,MÂz0eS #wæÂè3‰™MVÙWRbÁŸ|°´4Y“X pŠEmÀœÿ"6@ä\˜Ø9à3läRÅ&@¤9Þ4æ âI˜iÎ{¸pì·R%!i’„]G`)©©ò£Ðpñ:ï\6Z™Ø,5þ†ºÆk¹ b0Ÿ jë¯Øš»¨/ÀóÇ÷8Bg¨miîœ,Q-œðÏÜL}ªÏ_òlô@GWˆL?ÆyÑ…÷muâdÜ´âhÀšßý2û¿ÛUó磭7;[Óèñâ €ôÕÛ××ßÿ©£+·::{º{»uvXtaѪPÄÊ«;5˜Å•Áž>8-Ã3wÉÜÈ”¬YµßÍËX^e&ý}>_Qp|ÇaH÷1Ÿò ­Ûv˜S'9/Æï̹zG/|aï\££ªî>üßg.0¹L†Ìä6¹’4„Fh¬®â­]«R¢/tQtªõ‚®Ú•Š!¥ È%ÈEhõU\iuÁJšª1Ä57B2 ¹™! s9·þϘƙÌ%“„¡Ëý¬°×ÿÎ>aÖð…gý÷ÙÉÉÉÁ±®î3Ô-´¯ÜÜ—Ã>ˆÖé`‚À¢H€ˆ"€³u¸^;ØÓ×~(*i>/0×ß÷ކ·WNý髮ƚœÊ5ùjãc3¦Ý ¾3hûr­Aoûš»ìtEÙMcë`+JÖº%¯mÞøz_÷/`"§PJIvÖ@¤€ÁY¥RA®¢€¥¦O=ÛÜ#¡´´T–®Ý;·añó¥ËådÕªUA|ì]{ʯ‚}Q( …B¡P”Õµ}/ènÇäO>ùäã™3g¡q}ùå—ƒƒááXËyDxÄh:`œHö½ó)vÙìvÎÁr%‹ QÀ j°»÷ì‘èÔû 8Á1xð j Çg^8ðøÂÂ^¬Çœ&[á\ËWÿ®]¼xýgµÕ~{\ãýú¥’ým ! ƒnÁE†‡'ÄFÆéµs®3€õïs€Â²üÙ“¤Þ²B‡¬ž \} ½â[SžUM–•üöë%k¿åbÿÅ~ë¥K'Ê׉@ˆ(¢€‰vVºËƒ”´LWÝÖú5Œ„Q÷M¡zÉEпjçû®Ž}Q( …B¡PúÞ/Ï[¼¼PûƶŸ&ûUMMM~~~vv¶+Ç$J«•¯ '(xþ(O§ˆÀ  Ï]N.œxƒå•82<é°èp<°¡@üèݘ·¿VÏÕoªèÁq柊à`JáM*†¨•D!€>BiŒTdž«Òc&|R–uÏ£Çb;{×Ò£Âñ­ó²î88¶B¸DášñÝ‚( ¬J%-ÛðÄ/÷¼@‚奙(^%Öa:`I)ímM0Œ¨mµwÏŸ\ô~­ž_.^‚‘°cç›WÕ¾( …B¡P(6è+/÷ŒuE~Áå`ZÜmˆ¯ªª*½^o·Ûdû凚U_qœà`9›sµÂ-.D=ƒÀ˜¤OÅ‘ÎÀz#·¿ô:\&2èžR'¥––‘6Øôò’šê]ù`ÕsaÓ¡˜5ÄÃ`c¾ç°ñÔéË0–‹Ô†Çëµq†È 9‰q?©)ß$™vñ²ß,["äÞst 7¢¸L,0O½!<§R«°X»ñ]6û¥K—ú° f·ÙßÞ½VÒ3Ááv—1i²©½<À\.ðªkêJ|¯Á©ëºç>Ù¿wWñƒKÜì C e;v_Uû¢P( …B¡ôÙZûút6ðs¼È9Ý==³gÏFûR©T===è`˜èQºä«˜Œ¸!Æò žo»1“ˆîu‰Úè)‘Q Ñͳ³‚\(ÁR0ûv "ÖÕ•0rb³ÒcŒ±Ñ NÔ*³tª)ZeR„2»¼:Zú™¨¯§[2±Vÿx¸¢Ã6~5ewÜÂwÜ Œ¨W‹9ëÎy.¬-6+w׎0. #\ï*•”¬_y·ÀÕ ãŒð¬Û]ˆgoL1›ÚÜj·D}ß‚¿y˜Ü?Á¿îl[ÙÎÐØ…B¡P( Åæ[´üÛ×¹sçpŠê…£ÙlFãÒ„…õZ.áÕøøx 9–…ÂòJ­“ÿjÚ‹ž75!٨ϼ~®Ùd‚‹Ô›Onl5¿µ.㡌—„©;'àtJfFáÍ3Ài`Ý-0r:¿jînléä¢L:Mg\x—1";&LÚy¸ãS¸û†Mïøðá%àÆ8ôÁäõ~o‘‡3¨a(  ¿pLÛ½Py¡êuðNN^ ¡¾¶:ð͇x„Æ5r "«TJ®Â " ÀuNÁÙcñ.ß¿Ç3ÄÚ3‘…ªÓÜî÷\æ–{cAуnBœ/z«|/ÀÖm;Ba_ …B¡P(´S[[mØìò ¾µS¿ }áˆfÐëqDÝB ³Z­ÍÍÍQQQúh=˲¨d ¨a#„ãœsfN†OP<ÿì‹Å¢ÓéV®(ÙòjiWWWLLÌÒE À ¢é}ÁQ7óžƒX׿÷p³hϸù‘‰jË ,‚(-°ÁÓ·6«§­p ÷-7¬~ÐÁvÍ¿3¸Æ—çÔóo ðµÑ8ûæhÏ\nöÈÎá:ý Â3 5Ö (L=x ÌUÿO¾Œð¥Ry l/qþÛŒœ€4ÃAzæ½æ#ÄÚ3éî<…!6G¬½ß"_õÏý ¢n í*âTQÌ¿u|òÚÖí!´/ …B¡P(*aø3lŽq€ßSm6»!ZÚpßæt0¥R)wÃXN²¯”ää žc… @uí·:`9qÝÝÝÓ¦MÃ½Ž²:`ÝÐÐ^`ØÎóñ¬Â Ñ)8Îyªéär}Úœhc®‚!vúTÊxÉEÀΖ¬Äp×A9‹ê«÷`±n. õ/Áøãr0ö…ئ$ÎK@B®%ïâÂáEž™xq×âÇÁp nÏaè;`‰qÑïÖw=~Ã%_r„CR|¬Û]½Ý¢ q8ÑsÝîm[.ÿE|¿GÄâÞû†öHëlËk¯‡Ê¾( …B¡P(º>ü3QúñC¼êY«\ÇÍ;ÇdÜvNðhƒàìKî€ñ‚˜Ÿ›14ŒÑªþj0ÔÕÕåææ>·þé´´´3gÎ$$$€¾é¨±tÛzÎ7]8ûN•ꜶÖ5$¢€ÕAï:ìêU«WdDø¢zOe³eNz”iWÍÁ|ØâàòžCW÷ËõÁ"0 … ª{.:âÀØ—¼áðZ°·ž¾ÅU/øÍÉŽ ŒÒ%ïôõvé¢c†N‡&X«dn ¼Ýâ‘ûWÛcGá(óîïWÀ6oùcí‹B¡P( …bÃþTZšnâ0†9^€€ÌõHXsK ö¾X–••J… LžLŒW "œúçCÏ?üEQác+W=¹fuSS“Á`0™L‡“KÇðÖ²þC¿$Ñ?hüìDbú Md̬¼Ø÷¾È0Ï«þoÙýàäÍí‡aäôÛ5ZùüÌ•& ·dD6Y '›&Ї¾FoûBlWÌ Ã3À‘óÇĤ…=½+55U¡Pl.}Õ+99»aàžóÙ3uu_ãtzAC\ŒF HÆrdãäà»§ƒ°‰²Òˆˆ]ñÅë,ì£ê€a>†&fg ?$"#X˜î¿¢ñ^AÔQÅi„”10Ô'ŸX ßI^Ù¸ ÇkÁ¾( …B¡P(Ê’"CIŒìnaë¼ÙŒ¯ô!Í. ÑÁ°¥ÕÂù~ÁMžá ¥+==½±±133§¢(¶µµa^àyè兀ÓG,^ZŒÓ8½Ê>Љ᱊ú®o“â&•¾rFUŸúÿNT!ý— ÕÍG[—UjT9³nžhׄÙÉ]×P¹ÿó–*Ë ë¦0×>(¨hn!q{@­½Ã\]SûÔš'á»ÇK/¿"«×Ø»{•F¢ À×!`¹`%(Ëö"Š ni)ØXø>…»Ù,jü{_ÀÂF°Ë”Š Ú/¢`%XnçÀ-NtbdB2~_9in“âpæÜ Õ@ìÁb+zØ/î‹Ë¥2<ÿ;¹»<|õðûÜÚ·Ë!§à„ dËå‹\|Ì~þf³(òû×zø2vv÷*\|SVÁþ˂ÖtÌZ•'}å°|ö§^•¶Ýl†LùÑ ¾ÒvÖ©‹ùäo£ªesk«ŒÜˆ^ïÅ\Ö¹ (ìxb+Iè jŸZ(ñà ·¨C­ãß`°rNþlC ®„“-¶sUØ€}&ùtŸ¾Ò4šY= éþÝ¿V«z@-t-ÞN€ € 6`6`6`؀؀```€ € Iø00 €‘›«³Ð¼°ß6 Ãþš6p²³$ߢۿEµoÇ4 ÃÿÂ89„ÒÚXö«€xÀ8Î÷wfÂ.IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-12.png0000644000175000017500000005734510536106572024570 0ustar gregoagregoa‰PNG  IHDRâ<;µY7^¬IDATx^ìÅ¡@QîŒ+ˆF1†ð_y:]ò €GÚµìÄ!@°ïóI¾k1›Ø¯~g$Ù‡½{‰m£ŠÂ|Îõ¤…<;URP§„Š•G±@H]² Vl€ ¤nذè¦bÓRW…""AEE¨(›VHPh`‚¤]@[©U¥Ô·ž;“Øs9îTwÆ–'®+¹ÉÿõöúÌÆº#Ç“£ñ_Ëߘþý45EM À¢2;_ø”n3WÜ\~ 6Ë"Žî<òM›Ñ' C? v=Ch<ÞÌGg.8æÌk;qxæÑñFϼÆ3û]ìW­Ö«Ãıf^6Tå‰cÍ\pôØ£ãñg.ª¿ Ÿy¬#ŠýêDgÿ=gæ4ÇÙÀ0sœ p6ÀÙgƒ:=´n6”¦„½²ó]ŠçðÔ^ªÀ15=Xï_¦Õ¬Š9ÊÌŃLŠXI¯8Ad)‰¥'‹9Áì2˜þþìN!ø3ðÒc]ÛØØØkïMÖLS|ŠˆÉ+Å,`ÅÁå%?(µ€Ý£óåäñ”Ð*bbNnhßóâ®ýo?¿oü¹ÝOoßñÈàÐÖþdªµå.EÆO^è6°¨"¶Zê—ŸÙ²½/k禳ç®\wÑÕŽQE¶\/ÁÊtpÙÕ”üÙ¨L{æ ?ضã éåKe«Ä¿šÂêÕÑ‘ô=mv³‹Dl\×uGKÓÚvôU;«ÝÓÍÚ†^÷”kg>¤5ÈPH:â§&¡¥ž«)Š[7õP"± —ŒgÚZ­L&¹´¸èúÿJÍ]Èz —™j¹:÷ôÃoJŸ›-Å[Çs³¨L×È[«¾ô™Šd'Ò–7ëþz7nk_ÿùßúØô•3óÌëׯ˵Þoït»»½tJõõmx°Ÿ Ó-èz`\šÿýµŸbXºƒ¯Z S ‚ºkS˜,Côäüå¯þÑ ¶£µ4ÛÖŽ·µôv©/Ì£#ÏR ¨P¹µ)-t'€Ð‡>’©Ô›¦°•˹§R½©/YôŠÂóŠé$–&AÉù“ùhmŠŸ©T¨¢•8N¦¢ªŒZsr£Å|Ç̹_¿ùåÇ£?œœ8ñí'Ç'~}äÀ‘‰÷'íûø§/þ¬¸{µZ@Žª¨­'Ma¶Žžºt1ë<<œ~*“2^1¯m-M8%÷öfúÒ÷31…D2)žõ i¥~vÍÞQ€ªi¡‘ºïôI¡Cß]Øýxï¶Þ-›“ŸMN9¯QgkO÷Æýé"&Vå÷D3ág*¡%—äfæ›nóaZ °æN0€úKh‰‰ ;}…~Î2+¢Íƒ÷ °QÄL¤˜”ßãÆ_üþãý 5¾¿±iŠbËZ^áœI3‰³ò"iLUVlüÕ”ÃS{eÝcŠâp ¢Ë# Yñ¸iJS&€Ú”ÿÙ·ƒÔ†a ŒÂSô:ö…zž¤‹ê]÷g4U©› Шq߇1›˜,¬‡„š—ç'ûGº›£” S\ö‡€eYvvrQ²¨:zn.¯z{=ɔȴ¨úðŒWÙ‰›g €dŠ”‡<²¦ Ó2 ªÚ•i)m®¨²nN¦HVS’¬ñªÍSÖÍÊE•dÍXD©#Q&g `‹G6x•GZ7'S2m‹ìrÞ(3pŠçt[G=YÒš™™Øå‘¬ëdGÏþd×™‚u]ͬ”rGo;Œ×Þñl‹”ìêF9wøµù†¹„¢ãýw °ˆb§tu£ ‡Ë¿þãÉå“PJÙë>Ù9Ÿ×¨(Ž›l2ÛmÒºRk·´¢]Ø¥‚´VñT\© ‚^ý7ô_ðàPèÁ£ DŠ'J©¿²à¡VQ±‡JÛ5‰[GCé×dúš aá}ØCvæÍ{ßIy›y³2 ñ}¹—çÿ9J*!¬$?^Ãø÷.a+<°=ôíà!¾ËÐ’= “Pô(â"ê¸ñ³ŽšÈPÈÆ+ãœZãB¸—BˆâÑ>4F†ax¡Ç "rhO‚¥áÕ:˜e†Æ.lÌP·h™ÄmÖgL~]Òä“!0èx†a>~©/¾¿òúÃ×w^scGoùÈɱ‘ÃC“Sã§ ÃŒYè ¶m9Æ¿KIW³•z%#6’<èÓ“Ü>ëÙqqî¤Vÿøi_çÃ0 ïÁÙ Ö?[xù¤aü©.W+Ó3ýÝ=F«kËl¶Í6½æ÷ÕÏ+ËõoÍ>hLU.\>£¸H¹ ƒ]Y¥)êZì¿Îé¡éö(8¹&ûˆÅ+_0Î0 ³áÿIPæîV'Î^8Tv„ÈÙF>gË^aɬÂöZž<ö»¯p¬T®zµÆúÚ§ú«Û÷®…ÉÊöb”¨X^°¥c ¦¾‡JZ&þ’RV™†$ý‚ѳÞQôáHÔ'4ñI ⃾Á¨¡F[[$!‚T‹ri±{mµ•â@/s;gö^—o¹{çôÀaÚ2ãtûýVÖ¾­}æ¼Ì?ßÚgm,NŒ1–g‹GŸøþš?uùå×ö•{Jª# DøI =fB@£LÐuÅÚÛzWoûÿúåwcõ•gç‰øûö£{^}€ñ1¯¾:ûÏ3ÿ˜ÕeŒ1vÝu×áœÞ|ïÎÃÏ]ˇV|py©W‰8 D$QJ Á; À’à(ÓÈŒóÖg†ªFTS=5i¤KåèÔø‘¿O2|óÎ Åj¼oýY²oìlvÐì4ÑÛzÎ;œ8ú €ÍÛ~÷Ì3Ï(Ì€-ºíøkdŒ1¶õ©×3ÊêÁËJqQ‰8–I¤ÂQ(j:ou¦ eœ¤Öp*Q9<5 ô­Ûpà…'~ø³»¾}×ÏÑÂû³eîˆ<ÞAñ2¦øë Ÿ8›Õ×8wŒ1Æs=Ûwo[së—Vô-Ï3J}®'Ra(5•÷–7’ŠBS€:Pf|¤¤0™yG}§|Q`«nød^SÙôØ}-³?sË(Ž´äæõ«îpfÖX‡ÌZ)m¬W6,ÇÆF…€Çû/¦´½Ev¡Þ§¿ða¥yÚÅÏ7Œ1Ƙ€ø×ö‰·wUWE.‹3¨(ZÉ Ú™ŠÇ»‘"(†KBŠ¢O_ñÕ5ë¶üíGÇÓîÚ³vðŽþÎUä&«Eq@”ß=Ò×?ì!ÞwÕ”yýÇœXy-î¾ ¹Š1ÆÓiµ$dFZd2mmD6µZI9mÞ.ÓUÌ ”ñ’¨/²…Õ]…oÜôƒÇ÷ýdçëO?wè¡Õ½[Ý‹%@[Ñ™ d„ˆ’Š9Õ‡Uð SfQTh+ºÌ¦dÒ~fûÚÎ9Ïåν烷o6÷ä›ç¸dž¢ cŒ1f=Aæ3ÒJ‘Éi´°d ªxüdŠR˜óVÓtÅžÞqtSžQÒÔv®Zz“&k3t&£ˆYI¸(æS[ž˜ñÐ,™õο§fÎ”Øæ¯þÄcŒ9rUgJ™Ï Eª6k9êU©NÉ;´!ïR[©Òø¾S/lÝwÿñ“oÛsýàÅx¹&›­5Y€µ¦¨@J\ j¡ÉG˜Ý™Í¢Å;ÒÀ,n4çO¾ðcŒ1ã 2Òµ¾PÕhJ9o …pSY0Õ^M1”UÌØ©ìíGyþèãiê?¬Ë'zœÍ(dµ±ÖšLk¥B4xy¤äñ‘¶„1‡3ÛϹðËçþÉcŒ1¶²äHµ2Q JPèÔ¤b@Þ¤6LTt:›Š äÝy‹(Ý¥ÁÌÚÖŒ`¼:•i­…­ñ.§úG„x¯›ÒRÒ¸(Úï{icŒ1Æ’BeãÎö6++a4•3‘UŠ"iÉ›IJ•™D‡×nzÚN6‹(cãÙ•Ko_ѽÀ¤N-9ë\3£Tt–i ÀeYVì(ÕúaØy¦þW‰¡ÞyOWw:©yæ,Gk?Ô~‹ö=3Ðü3ÛOh^Û~ ÞÍÙ¹Û¹®:Žã¿{îÃܙݙÙÝwgw›Mc6$ilmkª”Hh苚B¬RŠ)4ˆ¾ôE}x§- ¾JU‚ñmÅB°ÆZQcÛ´ICC³i:ff³3;O÷áœã9ìdw‡%î&/²õ÷ýïÙáÎ]v_}9sï½)ˆˆˆfg>ñÖ;/‡ù‰f¾ÀsÚq”J;®)•HÅɳ_y2l:Z«$Prþtù¥çi6Qî›y$ëC¯ sžf£ vÐ6+{o¿ÛÂ-ùÜ”ÁKJ×z}p½Ö+ë8ríßµážíº×À+þWlÑžþøÚ‹W§¶ëPûžÛ¥’Tq,c)VšH #ÑŒ®~ýö gË'«Õ8¹gç–ûc%ëA @?Pú’œ­ÙjšF1¬zmv×a© ŸB»"""Úµín$šMUO¡èD¡kÛ€Äò€‚Ž uøzù¥ßœyþƒJEÅS{&ŽdÒ¹z§…žUIk4¦QÚaàg2Üòû»Ž¶46„™²¾Í•M‹ˆˆèžÝG^)ÿ%ší„Üš?’ 8VŽ%–ÇÊñçÍò?._F~øÞ3÷öÓÄXõ¨ÙX«$zª Õ$PГr•‘‘‰•¶i­‹™²&"""zø'_ýÑoãÛ†U½(rAÇY°ÃlÿrÚ~¬ çÏgOµ{¦tÓ%ƪ: •°P›7Å×ñ…³8|ñüáC_`Áúˆî¦˜üºá㉈ˆ¨0:õ™;9uéDcÚ E®•30–bEB0›([¶îƒ%L‘ô­ªóƤQ‹uÓ(²#aÜ3~ö®}ŸƒñÑÌë&ODDÄ LTPwu®*Ò©¨ÁJò…ÂÁ¼Ÿ–JB ™¶°M— n¨DJ6kË%“»ìæro%[)ë¸Ç‡úqC塃OþþÝã­ÛÛ¨ÃÊ ƒ1­†#éaI©ôIWئB®Í•¢¥d©-T;­– Ç[Ô¨LŒzsn-¸sïÃøß1Sˆˆˆèèá§ß}ÿ_ï\ú«ž™jcÎ8T¥¡Ô°VÄ€wíj•5˜¤ŠjW®˜M(˜˜±ýÚE¯\øÒS?–ÅLY"""Çžxî{?yláêŒÎ£1¹cÂÊ©0Àô €~² ’* šÍN«¥Å¶WÓÄÂä$ 7²O?þ³t*+µ¶˜)ëBDDD7÷µ/ÿø‡?ÿj8[u':ó@7Vô{Å$ Äíz½^ EwB,°ÖäôPwqrøó}»TÚ¶‘ëE™)DDD¤5n+íúþ±zü›—æßó÷.èÅ dX…[€ÑNc‰ ›Í@ ÇõËè‘*˦ ã#âô>ç?ñÅg·Ï܃ÁL!""¢±‘Ò7¾òÂ/~÷̹“KðsC¨ËËD«è •Æ’Ž …ƒ>Û¶#‡Ré©ÂxÊË\=Ý(Ém~ồS×ÁL!"""­û ‘N§=úìk§OüêÄs^1“Û·»4´¢N¶jQÅ7ÒÑü”‡%V<6ZŒóÃc@>¼P¯¾]MîúÔ]eü,6Œ™BDDÄF1Si­¤Œ•RRß±óoß÷ò©ç_åA1ãÏŒ‹3Et-†5¬”õò•ÅεÆÜ{{ïøìƒ?U,NˆãØ6€uÜãÃL!"""­µ”*–*Š")eÄaí@k±Ñþé£;ЇÎUþtñü™ ¯þÓË¥¦,ßÁJ•Ú\c®RÈnÙ¿ýþ»¥S¹Î|PnÎÙC"%2®ç [X¶#lǶ-K8Ú,fÊšˆˆˆHkK)­´Æ2®çFa”àpS…ý©£I¯¸T9S ÎÆ-•&¦gÇvO'u‚7å¢'i ÐZ\'Q˜)DDDdYp]Ǥë*?­¡¥ÒZI­µÐd$áØˆ#‰ñ-%à%–¶`ÙÑ›f×=fïIJ ,Ë$‘ùº!úÿ SˆˆˆHën@@˜]G#0|éÊè•WÚ^K SJ^Û‹™7•uýRØ„ˆˆˆh]¡¡Þ¸ lBDDD¤oÑà`¦‘ƦÄL!""âV 3…ˆˆˆ¸•ÂL!""¢[a…™BDDDìç¿ìÕ¡@ÄÀ/ï%‚FÓ!C ÌUwdà-#I’NÅ:ã÷(vëЂ‚½¾ÊŠîƒC°&Q7½›’dý0]·÷aï^C¬*»Ž¯½ÏÑ6–Cj©2ÓÉR›¦˜9“"&]Ì2gì‰Å †… ê‡?D4Pá}(ЈÔl*ºx*Œ9ƒåt¥4&ciæCÆËÌôÀ޽©u|Î>î9çl7ÿ‡Íó<³ö3æ,Öóì½Õ °7€4¦¦¤%¹€=|&10w[îàIK¢ÙlVb °­­µ2Õ”¹·6ŠÈÏ]RiÀÖ­[%ŽgÅÊ “pøŸð9ŠIPÌÇkVÞ£ÚIÒa‰Àrz¤9“¸ás]_±”[üîÅÂtuDÅÛæ %:Fª)ÖÜ%h籜Uprûœá¯Ä è}KåÿÕÕÕyC‡ym¿ëÿô?ƒœ|À Éz5'zÙCg3,A§#A×1m{ ¢ƒ“HSì5›(yO o;BÞB—Qµ Øk¨ÈŠ”d‚JŒÎxtµÆW‘•Œˆ ‹¤$æ€t˜ï’d|)ªï³¸€m™/è y¥ÎNôâŽ=8o=Æïú )•8—GޤÃ}Á]oÄï•(è‘âãƒ_æJT@|QP)êŽw=Û¨lUñEÏP€t˜¯ûˆÞù¡Gìû0]=Uø+Q1¸¼—ùLäè.ßTj;@ºt·r„ÉN@A%zr4Ê@¯õèÁÒ•š¨Áh@Ê¢û¢/ñD_! 9§Ž´8æýœÚŒz9aB€7$g³Ùx¾Ó0Æ9ë'!yÿ§¥ìÀ6”¸Û<7Üx i °­­Uä¬\†iûº¾„lÙ²Å,.Æðª$©€jJ6›•0@Å"–¾7Xô q—pVF®¦\9ÎýýÄ@ÏñþÞžÿWOIÅîô¹ª*µçÝ£]ß÷ù#®ë4.˜ºâ‘š¾?ÏE|Zyt1¼à–§ˆòjk§—£ø†‡G¾ýædÛ+'_=Vò©û·R¿œVÿ–ð'† SíJ€jÊ®·ôJ>'{NïÛóË‚ÅÓ‹xñ¬Ž©(}q¼f Ò” ƒçŽé·tøcÉÒëÿ)þÅoÁÊ‹?îÿHësõòMÐÐê}®Ž××cº–SÊ”Ê@š²óÓé"2¥¾F¬¶ïãñ¥Ýö¤Ä¾D'.:™Pm¯GÔü…O·_’)¤)íííMMMö£É<ìï6{PÄêÁ晳o¹fÔGt¦"¥Wù (¦˜,¤ÐÑ«¦LŸR/vOš_M‰J/£èb†Î'Ì1bÃR)‘ò€jŠX™Ìc ïô›Û«MÿkrRRþ¶•0 4 Ê* šBõäñ“&;uêŒ\ÄÌšê¼9ŠÞRjX¶ÁÚw°ês5ë„z$ ç÷º: 8W_R©@5E{¢e®y>ÊÐ…aQÆ]1fåê›Ïç/„XõRŽ.œÐr¢e†ˆòÜRWS wì˜ ›¦N«Òu3>xÞÀRM‘ІœÔª–Ú5ëjï{`Æü…Ó–5ݰî¹ÛVß9溎ë8)×I»nÊuÍ12]stS©MÀ“‹&HÙª)“g͘½°aÞ¢†Ûg2wgî\’¹÷þÌòe™G—7®jÎ<µ¢qÍC™µ7ˆ#eÅ3ï`oJ߯¿ýºó§¯:¿ÛŸË}™Ë~ÞñÅ'¹?Îíþ¨cW{ç[ûro¼ß¹co§%EðHz¤¤/°è3"â\b5e}ÍÞú¹7ŠÈËÛ½´ãõÍkŸÙðôL¯»úµ~XÏî•"­ïåÑiŠsé{S. ¹©Iæ®z“£˜£È€¹cÖu§ûû[^xoUó‚–{ær%ý8|¯á·uŒGÇè(ïHágç{ݲ€9µI„Ã?ä¤âÀsSΧ&VŸéîêm¸¶·¡¹JäHw—L¬œ¿þÅã½ýþ²“ “TRR\L˜x5¢Ú*²l£$æÛýÙç7mkkµ³wv1MdQ¿sï4Ô¦A(ˆÝZØÊG"-ݱƀ0†¤‰Ñ`öÝì²ÙM€hâÆ}ðA#}0ÆDL „H5˜ý`Q)KK/ ãuµ'Á8å±è»C‹ÅJÅf³!Ù@jØ@ Ü”•ãb€TžîÒ+QÿùSöp¯Çrü,Š„0á6$†ˆë—|ŒÞk‘ódùôÒP¸Ú“jœtÐw'zMßts‚ON΢‹~â|kÞÇòB¤üÄÙò‹CSî¾ÇS‘nJŒÃ¬”(›ãbˆ¬1PâÓ¨/Ý¿îöι½žTUrZrZ}Å7In¯$W{‰ö}A÷Àò±Q¶oËt O&²d¡Ð£6W* ôlŠ#¼yÞþ'³ž¹2CNc¥o}`¢˜¶ï]ËòŠl匠u–u(&(tZq™ò…^Ótl/$…™¡-æÿ(†âJ=bm¬®3þPÒíø¹ª°¸ Ó¨Q§³˜å‚ÜØì¨v}jÛ@Ú\©PôJÇ^“bîxù6I‡óÚ²oíô5›µ;ZÑš¤ ˜(kÀ>AÓu’³ŽÅJV+°*KTŠ¥"a„¹vÇäǹæB cBX†`–e1a @A),¸ºô3=ô—> {ûbú÷"‡A¡ø4jðQöM%¹¥{²+„zÉ˃§½þàâÝ¿îY eüÝ ùÕ>ÑñÓï­g޼[¬ýñFuW¥YîN{X£äi!"S’Ž@ ˆüó!H¸ ’ 1ßôÉ7™…|è‘IÌêÇXpS ’°›B0K‹ŒñRdüØ^”[lÊpÀùj&U“âç8?ß\0€f|Ò‰þÔM±¨E Ib$” ¿5çé6æ|²…×(÷GzžLoNßj5Tegä:ÆYº+ým ÆjÉ5 ( T ‰Ì•Šç9'o«Hh¨¸PhÑ…B $hÕÀY\ôä-ùZ@ D<§É@÷կ뾛Y¯´ÀŒ GÛµHŒË_:ªG2Ã182ÿÚË,©4LXvzL`áÁ˜eñ²‰Î¨›W(”Ø» &®<¾©ä ŠŠ`‘jkk9§‡ÜYí(rõƒiÑ‹Ÿµ¢¶SOïÎêÐÚ»NotÎó´µ½{7ãsŪ(z@¯ŠCµX[?°¥ê€BüÀð•’Ý$dûÏÙ öíf£+^~ÿýï³oß×þÞÿ}¤¥Ã¦SS,«ùjsíÎE œ5W—Uuy\ ÓŒËÚiáïBƒ‹³]®¾ÙЏç>áœ+ÂÙ©¦£'ûëü [í©;™0%ÓOe×èè0åmU¸û\}Õr}¢©ÀçPId?j¢Òñ?>JNƳÓ“Q{d.Ú–’u6Üá+Þº;šaé»dõ.óBúÐ"+½q—Ã< ãb³nš¨@ÑãâÉÉÝÃíŦÚT¡vw´üã×ÿH™ñNof˜ŽPf$gü™ž2:yõÒl$Wœ¯;: ·Ù¼­Hx©ySD#„¬í­M­LÍ€lio©¬«cYd…B¡ô ¿*4ð:d<”H¯¢•ç.ŽIy†sŸ£4œsôp–Êy gƆ3 ¼þݵëþCµïƒ ™Ò'Ò4MÎüe†Zp)ÙÔåöfÎY ¥†uÞ‚pJÎ;K}¹çÏBçÕrqè›ÀÇzŽm]üÆrà(LËŽ_^˜hš†ç‘”ð$fÃs9yGPct«fÑ!ÈH•?0FaRâoðªvÊëã•5@мOÜ•)|ðéп[ªCÞ”Bˆ‰4ܦÛìVŸ4Æt‘¬× ò’I ÃUÊýgÊZÛ›5j‹s_W§k(±ow>Ýu›’‚SrûÞ[ßÐ]Gž“‘O¿³ ¼ã{dcæÜãÿÄü )ó}C?v¹Æ}’§”ìøõŒY‹9ø…ÿ™¹÷žyµÿN”ú™¨ÖO[\#ÆKD΋ ÌM)ß·%÷­ßwã(yTOŒUJ<`«Ï²+,ëÚ9+?”©)#šlÕ«×ÇZt/úM’ÆYK(3"“”3T‰¤W@‘`\î#Ç«ÐoCrO6]¢êñ¡¤?¬ÌÞ”Çku™ü›¹…°æåe™¾møKé–×_œŸ>b<|@oq4îú¾ÐÝå:o®}/s5eëâPÁ¯à€ÙAc=cŸ‰µÝýš‚Æƒ8j"ƒóYäÃJlM€‘ô¨÷yPhŸ@ÓT˜F"%AFÍ,Ü¿?„ç^Ùáõcóµ¨ÀËX£ …ôy»Ë>›=tÂN‰iKd*¸ýëAsSÖ-Ïøß–yKV½8Êžâ&ÍŸ’âJã  ×ýá·¦õŸ€š¸˜Èò«£G%µu2ðAfp¸áócz5žT‰ÈWÙ* xÐŒ+}ܳH>|¼ ÉÝ€ôgþߧЂ…ÀZ$¬.#î½&ä ÙÈd…l0¿ Áciž;þ•⊃g§Å±9Þ8$\¥qºè›¶z'ã®kò½wNHÃðxCå9Ÿ+…ã"@PÐDZtVH|PˆEO†Ž,à‚¶æçæ=EÑ vŠÆÆ}ˆÑAA𸽥Ûfƒ0uÁß(–*ý|%ê•J)Hxê}ÃCà+%›r¦ç.De÷¾“­52Âùöq Ü¿\0MégŒÕ‚`Ôk‘F§ÕTßhQFF7ÚœYT„”OÉÙ&»0.WÉá J¡ XV®¹G›ÐJDGÈô…[]–0k7EÂBhîóz\0,ÿoþ‰çIR¨U³Ò ,9}P§ÑV»ÌhƃÇã½j¹™•: ÎÊÒLàSRû„S"ð}SîëËÛ‘Å^Bdx:o'üb|¯5úä·‰Ë .ÿÇ”˜¦PgÂÆ}ˆž°`#éÎ2ŸšC&Öi¡(JTòËRâ€_‚ʆ~.ëq›¯5š!2Ê2Þø˜¢i;ESD¨w–EF¨‘F£ ƒ.ÊukG½Õß?£¥!à sÉpÑž¬Éc‘\úÍ9ŸŒá«£•¤G~üi ø²±þ*¿¦®Á–»nï¼™ãr3žó+ÁLüÆö¸ë·AÀmpÔ›†çûñÃîžKˆT&ÄT²žŸ¼áà§M­6ð·y½Þø˜ÁÛ—®ëGyp¯ ä>8mVJ„ù5ûµü6÷zívWcµî¬_€Î<(<7å™GœÍTœˆe—›E;0=y"nÀ“³ÁåÖÓßÝ¿b¸ûÂÿBv ŽÒW;‚^»\Šä‘C q´zOM\ÿ¨ˆp•רu¹½ W)Ÿˆ W…õ’°æVt%’~­ôL··µÏ_ñWîpç¾²À"FpzIxØ>IS`u„à£ò…¬_”Š»­2##%bmÈöü߀kpcüò-„¥˜Hû¾`$¤-¼G…qáý?üÏÔÅ rdxÞs°áÕ.UÕ§mÂÛ0˜-;}ÍŽ©“~f¿Í°¬Â S•~}öÀ¦”³VXÚ’eQ9 rp* H¼»ä%é-¨r.ýae£)ðrÅ_ÕÜÚŸî!¬.ãîÁ/¹÷ÆH`Ø}AÃ…˜ÍƒEo÷{w[E`tŸ™¹‰&¤©>(C UñŠ”hýKÌ%iÄjШ„ `|ã¡Õ®„›SàÉ@Lk5 $¤¾IŒ© PLH‰ ikâ-½OÓM™2‡áÚanû­4;gNöü´÷†îî{†IÁ¤ÎÏ?¸û ù³èíý⢟õ䆽å§[×ÕÎXŸ¿û²™!ì=¶(ymç—?þr^Dî¹»ÁnÚIAu«zkå3  º…ñe+£»ËlôŒDŒ(ŒÒR®NM“£›QÔÌ4ܧò½ Z ð"ÖZ¥²sc“H“D¨Qª~+²6Eï.³10bë8ôC¿žØ\™–ž6TÒVWTP¦ø6úF"zOœ\QlìXU EŒhšsÁ¬®ÚÂã8Kl&áøv¬›±;˜rɯ얼,YÚ¢ƒ<Òë,—Ë\çìü ðê`V½|¼«õŒ)•J;¶wVW¦¸ï=v—)Íóë;7·ŠÈòõ6&”) U‚+M7Ýi:pgÆó»»vÑq-2R¥ãGË,`mÛJûÅ?Ø×ó•$ ¦ç9>zwYwW»Lv0á2²xBòš¶ ’3î^H>of>!ÐMÉpG·‚–\ºÖI– ›2ëÚ0€nÊ–½§<ÏxfâÑÊžo7mô|ÿ¿I›ðÒ“óP¦dÖM¹}ñ†;n«óÍÍ7§àÝRðæŽG37ðç.Mú¦à›÷>ýV²è¦ü~òçó§N{ÞD7ÅF?ðï{ïžñ<ïR4Îç¡Ä˜©3:éxº& eÏò\9tS:?Yðì‡âræãD¶ˆçCÕ_'gÙVŠúúæàûªµÒ覌V<nÒ™Ó¿lÚöѺ¶Ç7µuÒ¦M íÄÄ+žx·ÆñØ}ÐB¸‘0ÐM ELš].Žù6#– u>š4ÑéÂ(múþd×ä«ôc¢ML‘YÄ+¿øY£«¦Lu¢«í›ðr'¼¯RœÑÙL覘Ô;&ÇáQoââB#FT01c$JKýË@Ê}dÒop% ¥d,çZwO¨~ÒÇ‘æJ¶ñw_€µ)Î8RñmôÌUNFi)šíÕµësŒOF’ë|,åèÖd÷>Ö¦Tox4°10bë8t´_ŒD¢IMËp„NÖêžéX±Tå•Ä;4’ ›R}™âÛè‰øúĹ¡ÁÅÆŽUÅPĈ¦¹ÿfusBä<¦#sæ`}®V*³v‰1ÐMÑ2¥y~}çæVY¾ ÞFG™¢õAl36ãØ×qLÇÕ/mÖÊoêw¥˜\8&g&ì{ùºÝë®’c»ÇnË' ›ò÷hÐÝÕ.“t\ÿŒÂ4îB3ýf|>ý‰tìØ¥ŠoM9,‚€nÊš¶ ¢@%ËHtS€ Š®è¦díbX'×ÐM¹pv—\.”·$ÜU|îáÝ"²ûÅ­·þ!7 ›ÒÜúŽnŒI³'ódÜë¥G×ï-·,¼¯ý±usG%K€nJ%ôÆB1Ú`Dì¨J(ã†.Œ¼òÐr)Èó{Þ\Üpçû+·<#ÙtS*c^h‰Ø¯ïNž}µkÿ½w5|ðÆÓ"r|`ÈΆÆ<ҴȈ<±gcÏê­2Ù²eË¢A__ŸTA¥GË#ìëùJj”ËåãG‹’%K[ø±”J¥Û;ó×M©øcc"Æ„a¨“¡±ñ¯Ñ?ÅÎ9úÓok(õ¬^/Jë ­0ª¢G‹˜ÛJ½½½R›àj¿‰µp™•þeï\c£¨¢8~¦¥-µ å ´P¢+Å@¨HÀH‚ ¡¼„@#‚bMüÐLPÀ("" š"ÏÁFˆE-!‘mAäe´Òv»tgã-wénw¦Ìlì>þ¿´·çž9sgÓNºgÿ÷Ü;ì#hª).O”G#Ec§×ÛÐIŒwý³ªg‡Î_ÍZå¯6EW\Ù†°¥˜æ({ÂMƒáY¡ï§‡(šôá3u<^Õ(N¡ÿ‹uëÖù^)¤þõØl¶s7ݺ ¤¤„{úµ9žÐ7»®ì£o-ßä' °˜Å=9ýamù{†9®•íÍ—§‘Öp¡KÿðIŸm9më3ùJŸnÕµÔ…tá)ˆìá­~ŒÎ¤°p ˆQœâ.2BŠ´tËYOSø÷±Ô7(²¹yhP©}ðÏPx"ñ¿IM&EYQS [·»•GÓ¼^® øXõaÊé©9Å“&õ¨ÚPöGÞ’­Ã›]_‚³å„ƒC¿søYR°ä m@ÔÅÂÆ/2‚i ø15… Vú¶ª§KP|k}î2Úöîì1¹«w¼™¤¶³ íÞ³[¿ƒÝ 7?³vþ ÒAÊEÌÅȉ‹Þé! P.>9¹ ±{jO®–2‰(:ïÐPSX®Vj§€•>nO”ÛKå×*¾>v–{Ê˯ÜIÜûÎ̯}°:æïؤ„ØôÞþº]{àü{ÒrLTÅZœ‹ Ö  n³æq?XD hó^ïëºñ©ÛQ﨩»s»&>ÖùýÁïXš2qYáþS›|‡î4î 7n7vùQòƒl+#óB“G §ÚŠ»¾û¦ËÍ«g¯Ü¨>{ùÖØ¡)î÷·'ïŒpÛ<úKùÛ†$>¥¦:F'\~¸P¤)R5«˜âÑEŽ1Pö@ÜiÆé‹]må$KåݘÖß8ýFãüÕJ5EJGxW¼£ Œl«#‹øQS@.bíibPS¼ ’{uIZŸ=¯09q.µø€³gçÊKWªöç>ÿâ⣉ 鎶mÚ·•s#pÊ]çêÆíàŒÍóùŽŸHíE~X™5šÏ2cÑôŒ¦Ôë%FÎxdµ¦Ñ/E䆗hòNp ¨) û¦x¼¤(_FÊšô´wFµs–%>ØuËîŠ#+ûŒZz2-¹££¾ž,@µ#–Ôjj’ë;3GÎÌÙŸ÷Ø2IM±:#ûÑcxWRdsG–Oä£5yH™uC\MÓ:Âà¶5Å/^M9¼ïczü¬9‡¸£Õ„[Ýs·Äî[ûòû•ã§eºv²²ÅoÂûÛÚúRkˆ(« înz¬ibße›¦Ýu)ÄŽ¾•=DGM‘µa¿†ÈÄ˰~õWSr¾"{jʰaÏ‘„Óé.˜[Ìjf‹J¿ðx©õ¹YÅSWw›C¬É2^nfwÅ‘ë&3¶¿];ye×9ù3ÉÛ—îÒWS¸¿EWùŠALŸˆÚÔ3°‚Yöå³)0P§ÆËÎŒ±+½º|b½ÝE Th[–í_»ä ‹µ)Æs=²³W5 Ä«x ¦´8Ôhr×È>oá uÿªšBŠo¾Gì¶ÿÉÚ¢ËÒä•>òÜŠõ©Ã1›iâDùìá]n‡œšày‰ÈZLÍ É6ÔÓlbŒÓmË}vnv†ý¶JŠÆ R辂”­~Þ¾*E<㈄š¢S^*{šyHSÇÐÁpLÓ熓šž¯H# ¦”GUí9u¤±;°KŸñÒ €@‹vŸ$ÏXtuãú_È_®I&Žf»ÐŠ”+‚öMRŠèÊ~clG¨š’êí°hð”5§wÿvùÌ®Yù&‰,=JPtu6ã[N$"=èjJd>š'Õ€¤‘´@žÚñ(ãG;@Y1µ!ÚPTS€šxP›ÒqÇnŸ±à{ÑÎ ãRú\ÏH·°†ÈipÍZ ¦X?Ñö`î«Qßl´6 €PÏ! ¦TΞŸ³üñIãKëj)#½ý©Ó,G1¯¸ÈÓ@HP ¦`U@MÑo)èPS%–sY”Ú jŠaËØTvh`RïQmû“Yþcïꃫ:®û¾'>X¶DÕbš˜b·SÕ u'6­i,µr'èáÔЊ’Pݽßo.ËÞݳ_guï;÷ì9»‘€6eäL§‰×¶ö¨4ã"LnÊØN¯ãŸýø]Äæ’É«×N}[ÅhSD?ä·ν;4øÈª 1åÝ¡÷thÜ|bm Åà¡õí/\4·'¶ß»lËq•*Pÿ8Þ ]'2–^îk–Qd²4Š}´ÅÄöÄ@KK‹Š ЦÈ~ÈwÎ_xOÝâ+ ?¹qe¸ð³Ç|¬˜5yãõojÔOß,Œ,_Æ¿m˽s)L®• -mÊHg¾{ga¨Ç÷ü x^Sëš«ýašÚ¶DëW¨8B·¸‡‚;€¯9F—½è›†"ðâóϨÄž>ßjýúGß?üö÷ÔßÝýè–æ--¦/~â+×_3ûÔ³#¯¼«=ùæ0÷èÊ)4C²dЦԘʭБÜ•»•ØØÜaξ´­vz:Œ’·S~§Ã¡P\ÂLhݞѫn‹Ã/Ç †˜VH;C'‚›¾™DÚ´iŽé•ØŸpA¦EZ„jÅ*5M–Ì7))çmž yÈÓ¬Dœ,!w¶ž>Z4yàþ¥SÆÇTûj}ÝTÊÈ(±€mʨRþe&ÿÒÀµ†6YU.¾‘ ™EñÈ–`øÎèöß¶Û††,ÖÆˆw‚*ÂFCE ¦i‘KÌi?yÕ—Øœë4É|“ËŠ”D4·{‚¦3d±q²„Ü€3}hSÂ!M÷õ½ï™"}ûöN©¤®¡nðÈæb|Ù—_v\Ôí"™t¶¬\ÄD,j`àÚ ¹`J­•£7+QɆ‘$’6dªr‹a*œ @›iza¸`Ä”¾ƒ‡ó;ºT)xž÷½ÞWs·7š¬!ˆØî¡‚#J݆ã,ÃÀ%5C¦ÕЦ=û¼ê®ëoýÚ¢GñÀ6Å-è`RFy5¿uƒYÂð|¥e¢J!Úûô{^0šù*ô»¦³ápܽŸâç-¿3c¯¶é³éîNÆ”8vmŠ,£üæg>yôìOŸÞ|ò»/Ç/©°M1Ú”¾ÞÓùMë”ïSO刌"x¥Ñ JOŠ[¨ÓIA÷¥¹NJ¹ “ÅðJGË_Z!“bËfÊœ›9VÙi óSd¾Õ# oÉY<âÅJxˆ¹îxçÂ9UM ÛÆ$]›òÜß™xûo|²ÉÔÞ÷ÈWßù§›t<^a€6åÆðؤŒ²Z©’2J=¯G±M‘o­!×#z#[ÔÉF¸aQÖ±ÛŒ[ ïEhÕœì)c_‰‰»OI±nÅj,´'2}åŸ2û‡±Û”«ÿã©‹ô¿ýçèøÈ€Ž\»RLŠS @›Ò¼«ÿüŽ£ûO–ýké:¦€t?˜²#‚&ð€$jSžÞøó&þ¯¼×ùاŠñSÏ®[¾Qöw`œÍ„åO{?L÷w(UN&S`‚6… "0'LéXè÷}d͹ųÕ@›B·ÌýÂwB"Ëz-©hÁåÔ³…7­wxkT~“M±`j\í¡MW*£ ëòikââ–ù߸½Žœ»ôÎ×>¿Á(W´Œâ®J50)&be¶F‹Pz†@ì*I±è0´)-X­B›2ÃvE”!ï)騛±ØL3À6%ý‚È×~:BïÙ³G§kJV£6EË ¡÷xñºïŽ;?ñ½ÑFf+§ÁHbA÷¦±k$´)éÀîèî,EÙ¥˜®ÃjÔ¦aüï¦õ þü/µ?6psXŸ\áGÿõð¯G¬z‰e+Ïäïh mÊÈ™N¯míIµ_ üƒhnêØN_ Üs/â>tGªb¡·Z­B4.°M,~‹Ц Z¿jç9séÛ”þQÎx‹&Ò,å Çš- ËÒ|8m‘ Qûf+}%€>´ bd‘ââÎîILÙ·´Æ¶).žþ•»?õÈ]¿¬, lkh±Ó"Kæ¾1¥Ë>›ttñjV MéïÌwï, õøž?Ïkj]sµ¿3LSÛÖ“o^ÛCwKG`CÆÐÇÈÀªv&Ϩt‹>aµJQ(ÑAï‚}SŒò[çÞ|dÕ„˜òîÐ{:Ì]³xtmRÌ+X"¶ß˜Ò€4䲡d¢^UØ7¥ ÆTn…Žä–¨Ü­ÄÆæCpö¥mµÓ–ªé-µ¡6¡P\ÂLhÝžQÙÚªÛâð˱‚!¦†ÉøCü™chÓ´¹23.÷Çdñ-ò»@iTjš,™o SRÎKý—ù‰×¦,|ÀÓGôC¾sþÂ{ê_YPøÉ+Ã…Ÿ=þàcŬù˯ŸxS¦|úfadù2•0TãcÛ”Q¥üËLþ¥k m²}€øF&drñè—ù΄»ms¤œ<üð9Ž.rRgd·>¦i‘KÌi?yÕ—Øœë4É|“ËŠ”D4·{‚LÄýÌÚ¯¢]h¿Õúõ޾øí7î©¿»ûÑ-Ì[ZL_üÄW®¿þfö©gG^yW{þòÍaìé9Ó€6%Òt_©ð©È}ûöN©¤®¡nðÈæbœîcýºí"EéÙå4Áèl5änÈSj­l(Ý‘F¹«ýd~ÒÁÂ6%ìÔ£¯pJ8+lBkÖ†˜x훢E“î_:%q`|Lµ¯Ö×M¥¢‘QhSLHÓÍ ÉÅô¾ƒ‡ó;ºT)xž§Ï Ô‘™ñÛ’5±8©¥ÑÉÎü,ãË ƒ ÔÙ8¼d M˜ØÐ¯.mÊ—žþGÏf²5s²s²:¬™[£ƒš¹ú¿‰HV§Õd3Omø%fûhmSüÑ‚&e”Wó[7‘% ÏWÜ9ÉF{Ÿ~gcF3_å~×ò,»gܺ%‹“·ãdìz¼ñ]ÖnèoÄZÅÜšˆ¯"mÊ/6.]x_ÓÜšL®&›››]0/{ÇÜÉk^Íó² çÕ,Ô‰s2óçd_zù-Ud¢¶M1Ú”¾ÞÓùMë”ïSO刌"x¥Ñ JOŠ[¨ÓIA÷¥¹NJ¹ “ÅðJGË_Ñ­Ï…9Ì”97!s¬²Óæ§È|«G@ß’9²xbhSœ,jqBòÿÇûJ_“Èf35Z“¢ÿi=Êœš9úšŒd³:žÑºxúÜ›”QV+URF©çõ()v·2ÜÊh–\§qà†EYÇn3n5¼¡Us´ w÷@wŸ&’bÝŠÕXhO"}@àæOŠîß½ø™?< d¨û›.¥b[ôFž>Í»úÏè8ºÿdÙ?†®c H÷s'ë0¢l"þ— @›òáGYþÂü[šüñP^‚ÍLRÐý xg9FÜæmßÜ_šit“ƒ6… "0*LéXè÷}dÍ9ÕBÄhS>˜>²™[Ffn‰+™Ép2k죇 ²ê€Ê»W8!œfœ@@›òÁ‡õ÷žüÁ¡×¿?wΜ?øí¦mò;ŸßøÜwÿúÉý½ß9öŠdúöƒk¢Q#3ûBÒZVÜ\ÜÁ36QÚ”8ÐÒÒ¢ hSÆ&ê×2Ê—~ïÁ?ý£U[º_ùçóƒ-Ý÷ã‹?Õ2ÊÙWž\µñ9jšÑIÊéù— +rÎM¡‚_œ‘›˜Õ€6àÅçŸQ@,'$‹áè¤6åû¯<™QJK$‡¿¹ñuê‹ë¾öÍ×tb±ílfâ*RR1Â8§%ú(Úä'$§@ÖåÓ–ŽdíWyãí?ûr³nlñ¢Úí~kÑ ²Y•ÍÜSŠ”3lÉoDŠ îÎT„š-€6eäL§¹TJAÙðÏMÛi+îãŠàÕA$À¢3Œ˜òwû·R2êíWŸ,Fˆ6E>"w?€mÊà¡õí/\4·'¶ß»lËñ”þZ—;t—qˆ#ÄÑvõŽ«ÔéØbü=©SÌ¢O6£ ߞ˵M‰ÂÚT>|\Þ*”p;x&ЦŒôwæ»w†z|ÏŸ€ç5µ®¹Úߦ©mëI‹7¯í¡»¥‰ Õ,ÓÇÈÀjq&ˆ)7 óuX“ùøY}M=ºåæè|ñѵß$QÞŸQ¤¤ôbëRЦԘʭБÜ•»•ØØÜaξ´­vz"/½¥ÆÔá/n¡b¬ľQ¹ÜªÛâð˱‚!&r^{ŒÓŸé­~¨0½û.È´ÈìeP©i²b>ÓºøØHf2Í¥J)T[!·´‡»5%Ž_LÑ»¡ô<ýœÊdJ.§SÇÙ¥FŶ)£Jù—™üK×ÚdU¹øF&dÅ£Z‚‘½Õhÿm»mhhÁbmŒxgñ=#u†ŠLÓ"—˜Ò~òª/±9×i’ù&—)‰h.Ïm‹g²åŒËsÁ®öØ6&~1åñõ-IÖW•êÚ”pHÓ}¥Â§"÷íÛ;¥’º†ºÁ#›‹q}¸û¢>ÿ&u6.§ Fg+*wC.˜Ò]ü5%,©gPíg¯·c$•ôÿ`Ñ'ý M1!M7'$ÓûÎïèR¥àyž>ƒ1)ÆÝ_¾ Ù¹‚#JµÝ†û,ÃÀ%™ó˜ÖÁ!°oŠ?Zо&d”­”ïÑKC8'9ýŸÈ¼õü®5["-}Íî Š ÷v]ÜB»Ú”€mŠÑ¦ôõžÎoZ§|Ÿx*WNF¡Û%—K¡ ô¤¸Å™t_š‘ë´¡” 2Y ¯Â¹Œr9=æ0SæÜ„̱ÊNS˜Ÿ"ó­Fb0‰Žž˜L®EW“ ˆ)OŸÃc“2Êj¥JÊ(õ’EN±»µ„…3šPV®SŒ8pᬛ³@R,š~hí+1qÇi’k¶÷…´í€‘NŒÈ¢ãS'$§@Ëb„˜ð­Ž›ô’”á,ZbJ| MI?¨¨A¥b¤¥\Ä€6Å@qB-`*))Á`ÑÇm €ÑŽÄJ6‘ÐíÝÚ”‘3æJ‘_Œ>È\Jì–hâ¸bç¹#¨Ó¤àI4ZÎÈ^¡Â׿6 M<´¾ý…‹æöÄö{—m9žÞ_kzè.sºž%v‡\³ì“,“¥Úš¶O–?ñr‰Šúš¦Ñ+¡”i’"¦´)#ýùî…¡ßó'àyM­k®öw†ijÛzÒâÍk{ènibH5Ëô120-pû7r½¥élD®6q¶)mJA©Ü É-Q¹[‰Í†àìKÛj§§Ã ·ô°øpÈåàY±o†Æ¤[u[~9V0Ä´BC&žÚÏ;@›¦Í•™q¹?&‹oQ<_©RÓdÅ|¦uñ°‘ÌdšK#”R¬–r†ÆkfKÅ‘Ôî›°MUÊ¿Ìä_¸ÖÐ&«ÊÅ72!³(ý íL¹ŸÛnZ°XÍ*wŒ‹þ†ŠLÓ"—˜Ò~òª/±9×i’ù&—)‰h.Ïm‹g²åŒËs'Î-ž3Û*ßÞ Æ•Ê¤N›iº¯ï}ÏéÛ·wJ%u uƒG6ãúp÷E}þM*êl\NŒÎ0Pî†\0¥»økJXRG ö» kz‹e¸Y&¦@&ÚÒtsBr1½ïàáüŽ.U žçé3s·œ¬!ˆx5½‚#JµÝ†û,ÃÀ%™óXIÖpH`›2sýÑ‚ô5!£lÝ |^Â9ÉéÿDæ­àwMÙâ>÷"î5Gé&N‰FyŽóv9pø‡6%‰`›b´)}½§ó›Ö)ß§žÊ…_ÑÐa¹ JOŠ[¼‘IA÷¥¹NJ¹ “ÅðJGË_R!i‚Á˜ÀqÊL®ˆÛ`ue§)ÌO‘ùV•Dɼö»Ê€ã’Œ×N}[Ý6 ¦<}n MÊ(«•*)£ÔKz9ÅþV†ØŠýQ½rbÄe%2¾Â² sHŠMsò­}%&î>M&Å¡J&wžIt¦äFíÙ.Ô,¡¥¥E¹b @›Ò¼«ÿüŽ£ûO–ýë:¦€ÙµÉ"h¢ wTßå‹Ï?£l@L M¡‚6žJéXè÷}tÍÙ“±jZÚwÀ¸Š1àécȨ*@LhSئ°M‰MŸ}LÐîN¼)±,¦´)#g:M¼¶µ'ÕpÄ ¹©c»ñ‘NÞì˧¹×9›þÎß¹pNU/ämcd1 M<´¾ý…‹æöÄö{—m9®Òz4®¹eN×Ó Ä®`jv(YŠÅ>Ú"M‡È `Ñ MéïÌwï, õøž?Ïkj]sµ¿3LSÛÖ“·IÛCwK;@ªY¦‘Éj`B ðô)¨1•[¡¯Ü’•õÍKV¬mlîøÜûÌ¥ øÏÐ"Ê݆)Ã!_ÜbënWÐ:å¾™ˆe·åá—Ìâ‰iŸigèDPbòM›æ˜çûc²Äù¿·JM“óíûc²ìG$3™æ²ùiåÇÈ €6Åu“ƒŒ5}U¶)£Jù—™üK×Ú8U9½5q¦”Eñ—`øÎèöß¶Û††4Í2)â˜Î0djQÊ\bHûÉ«¾Äæ\§Iæ›\V¤Ô YÂ,жx&ÛθÖ/,Ñ.R´;q9M0ºãsånÈSj­½YIò—#gd1ÑÞ —ÞºÌÝT ìö&€˜@›bBšnNH.¦÷<œßÑ¥JÁó<}!câö–5Û=TpD©¶ÛpŸe¸$vu8ûÜj¾¸ö ä6Ͷ)Û´ }MÈ([7(ߣ—Nò¬ùD.§™W“‘ni@Ž\$ޚ݇L z¢QÞ˜83ŒÑŒE[ÉÛ©ÅÜB›’b°M1Ú”¾ÞÓùMë”ïSO匌¯hè°\ ¥'Å-ÞȤ ûÒŒ\§ ¥\ÉbxEh†€6áÂfÊœ›9VÙi óSd¾Õ#ÀH &‘çM±ç€ÜÕ*Ù¹D+WR&¦öM¹1<6)£¬Vª¤ŒR/éQäû[b+öGõÊuŠn8”•Èø ™…’bÑœüCk_‰‰»OI±nÅn,´'öºöEäá»p2E¶´»wï.FöìÙ£%•4‰)mJó®þó:Žî?Yö#¬ë˜š]À¾ºTtˆ¸ x‹Ño†k–L<É€˜@›â.ˆÀ‚2þ±ÐïûÈšs"£Ÿæž>&´´)´)€’#€±ÕÖ'Ô`V'„ M‰@R1NÈÆ$ŘКˆ)mJ  ‚ˆÑ¦¤K§’51€6eäL§¹Rä£2—»%š8®xyn¸Ù+×ýÊîC«[Ò¤MhS­oᢹ=±ýÞe[ާ÷×Úì[en™Óõ4(±;äšeŸd™,ÍîÐ´Åø{R=îëЯ¤FLhSFú;óÝ; C=¾çOÀóšZ×\íï ÓÔ¶õ¤Å7ÒöÐÝÒÄj–écd`²ZÀ=8$Îô)¨1•[¡¯Ü’•õÍKV¬mlîøÜûÌ¥ Då¼F¹Û0e8ä‹[l6ï Z§Ü7±ì¶<ü’Y<1í3í JlB¾iÓ3ã|L–Ø"ÿ÷V©i²c¾}JÎBTó%ÿÕñ‘"„jÔ¦lSF•ò/3ù—®5´qjgzkâL)‹â.ÁðÑ!í¿m· -h$šeRÄ!0aÈÔ¢”¹Ä ö“W}‰Í¹N“Ì7¹¬H©Ί`¾h ‰Xµ(ϵ|¤b Û”pHÓ}}ï{¦Hß¾½S*©k¨<²¹ׇû¸/óoFÑîÄå4ÁèLånÈSj¡)aI´c„™Ö‘”ÞÚVÛÒÒ¢xShSLHÓÍ ÉÅô¾ƒ‡ó;ºT)xž§Ï dÌAÜÞ²† â•û Ž(å–ò,Çß= ‚y¿-V¿øü3ʰMئø£èkBFÙºAù½4øs’Óý‰LÕ$~ך-‘ ‡‰·f÷!Sƒžd*{L<œßhSئ(£Méë=ß´Nù>%ðTÎÈ(üІË¥PPzRÜâ K º/ÍÈuÚPÊ™,†Wô×…Öih.Ìa¦Ì¹ ™c•¦0?Eæ[=Œ á<_2?­ø`54ŠÿgïnB¤¸Â0Œ¾W»gt\„€‰.”ĸ‰Œ3„€”ü ê@0¸p¥Á‘8ŠfHfe@& é(˜ 1B~\ªI6j Y&Ì"+EœŸž¶§ºIeÚ"UcÕTßîÔ”Ýé~΢¬®¾}«Û^ÌÛ_Ý[wáSî›21U~”Q^•æÍ(OÙê(ö#õ?´³ž¥þ¥zí}Zwüo$x­­™¥ÃøÂ~p$žý µ{'¡ýÄ_SÐ8ÁYêù,Ñw’þ÷e;…ýMÚûI1 šòÊûßßþä­‹#ß(Æ‹ï~©à »¢Ñ!ýS$ü°h·b2¨¦$ "Œ lüg±W>R:…½\ÄÝ„ßWóónKß®‚éN–¡ÄÄPMnTŸ†ôn³H3}ìLH¨¦¸èƦlà¶@5 š šª)Aã*©åÎã“n^U…Û¿¹¤r¡X˜œ~8>Y˜È_»ý´cº¶õVŸ$ZÛ/n4O¸qb–žÌ¶653•y=þ€YS@5ÅÖÞ_òN¦¼|ó@Ÿ£G²K´t™3¥Å޼üÎÍùqGÆ; E®‘q?=s#÷Ájk Š>´ÎF®µÏ莽{Ÿ ^Û`B£eýÐÁ#¦€jJòÒËçC+ß~﯑RŒ/>Z©”þõ®RR¥|s$hZq¦àJ¦…ƦAäµ±´2 “b)ÅšQÚ¯š˜ÆUSÍ™HXzŒMQ*Ä€j €‹>`¦Ï¢?/ùû?û†ší˜ª)æKÏïÒ¿~ýúˆ»úM-”èÂ{Ì `TÅW—T› ¦€ñ(Ajq%óïO˜ݼ:ª ·ÿs¥»Ÿ• ÅÂäôÃñÉ¥3×®\ÕcL×¶^ëê€Éca@ww·Ú1Q‚øb$y:•w2åå›ú=’]¢¥ËäY³E¾¡\Gæî Í'¼Úpbpæô‡juÄÀzwö\8]Î*Uull÷žžZî%ï¯\ 1’¢Ï†Þ¤¿~Ub 0Qè3aoS›¸Øámë*À´l@b ¨£„ ÁÜŸm¯{¥2È›4UÌÊ™”Ô7Ôi\IFrU1w•žÌé‘[ÆÕÁk<»åÙvÄ z=%¶ÚæK*Ý“”;4µã䊽§v)FîèEYÔ:œÖžWÄ`Úɪ”—Ô{bݾãÛ‹ù’Œ‰ÜÐÀ=7xyx`½õZí ¬{á%ILwò†·uLkãœÅ*»Žmê?¼uúãI®ä]î1’tvxtdp­"BãaýÈAOðlÜ‘èqoçö‘" Àð78(-?é Ê;‰tœù\KM PY.@¹Š Yt'AuMŠ@ueÄ¥â"]þ?€‚&‡¢Å!(k<8»«½Øcïó(‰íÍÄö5“÷f7»10ÀùÙi O~Ú˜f .åSE¤›Û‹¿F{_}ðɧïÿùÇ«HÕü)Q¥HÕ“é/?|ýNû Ê·çÛŒ_O ¸t~ZóÙEë:®"^U±›:Œÿ¹ŠRÿ«l`§Î<›æoüæÞÇ_üþýw¿ÆOß‹! •ñT)ÕO²›:Ïeód <}üv¬® È€{gíoöN ÿ¥þòÅóö?• îûÒý_+ÿ©Í N„úW{é/m§Xe¹þX¶%¿?ÿ0"òïÞÞ+ËÇ7¿Vv¿¹m«) QÖ9ê-ÙBH>8»“ìòÒõku\€±Ó‡nç¤*€(©¯g³€h–?U×÷³Ú#de )ÊÀͲG¾1Óu•¢Çøæµ–A›ÔG‡ôÿS å‘ÑÜùxg¡nŽA¹¾3Ÿ& oüïày·7ÿV›gk¬«…w¸‘™ä;wnÙžmÉî7>ì¾=Ø8¾¬Ch§§Ëëd™X r-àÒƒ2 ”cS€£ãgQ™ìïïGd 0=<ˆaql Sd €Ld €Ld TQ$d ¤xý@¦2@¦2@¦2@¦È¨êÛê2ú«ª¨b=Žc˜vb;@š»E)ź<²š²Ù™BuõÑ`§+ڀՙș S™ S™ S™ Sd Sd Sd €Ld €Ld €Ld €L)€L)€LX?€ëL)2)2)2@¦2@¦2@¦ìDaàÍt­}öù—ÓÃè2iÜ÷½ó³Ó6_MG‹d Ìf‡ha2™Ôã·PE¤«Ï˜¹ˆØžòI£S£ÌîdooÉ3‡LÙqGãÓKûRäôâØ”ªÇø C£ ”LIÇý‡±B€Õ”B'"™°šRìt$S@£VSÊŸ”d hÀjJ>5!Sàå‹çQÀjJ)S“L¥XM)tR’) T«)åOG2” `5¥ü‰H¦€cS)à,´ìDy`2™ôßàš>‹Ó 2—Y¿»ñíå?Ó 2¦‡qÇ«)-¿Ö32Æãql/d UDŠ™ËˆÑÕgôTýó„){…®Ž#>Œx«é¿8Û ™B]£ëÏÞRŠ×âQÜ1üA2¤Ø,șș S™ S™ S™ Sd Sd Sd €Ld €Ld €L؉bÀÑñ³h2ÏÏNcÅ)prrËMb]°Ó¾].VâoöÍ`µaÃnéãì°ãÞÿ´ã{Ÿ-`ˆM")U[¥åûÅŽ#ý²(ØUÜÏ/{t¹òžóOÖãgitŸ¦[ïØ¦è¢Ø¯G ýþ|/Wý¢[¿|úYêm¶&µðÒ ~QlïˆÌë¦@5¨¯èµÛ?uT»ê9âÓ–¾2QÅ]áùÁëX>KÃÖŽ<’4_n¿„ …s{T¨¦üµv:Ôïõ¾lôö\_™ÛrGR®ô±&xŠ~ nTvW‡T}¯ùÜ5LÄÐr”3$nȤí¼¶)§V‰¿Æo•4Ôê1‘Ôòµ_¥gä &ù2¢õ‡Q€m €SÒxaü¹ôQa”šÖv>ÉI“|Hù8 ¾'ÀÙ›ø&&/”1)þçT š_ðÆi½£èóBÂJ¤7‚™]ÙB[uTKJwÉ’+ô`Ì:è\§uswþÏÞëF avyš ….´î()x·tP𔔔ГK‘n"²‹.rnnïûtŠœµOh¬üÙoö\mÿ÷®onïwÏ;—o[‚v÷Ô‚—WwñUÔW†ø’{ÿîíÑo÷Lu}n;“Fì0žNÍS°®kŵ¿IXôÓ$Jêÿ‹¸í …@LS1@LÄ1Slï†Ý‘§jS`Y–© Ĉ?1uô¦ˆ)b ¦ˆ)€˜ ¦Ìÿ±ÅÅÝT ¦¬ë:ˆ)ÿœN®on‡ÿû!ÛÂÅ–<Àfù¿3ùwX•<| -àI1`Ö¸¤q©&˜5.)ù1¼zýæÏ¯ÓÞð¤2Çö1bǸ5n¢ÒqML"D¶¨O -–o¶×vp¹5FãéøÌäJsEùš|ö4³)`â!ŒÑÒqÿš‡ƒ}ГÀýÌácý1,Ò`£¢í8~-´Q ªz—ö‹/¤õ‹ñ¿Ù&BÒ`ÿÑ›"tÇòg1¾9o¯§L¨œ× P{®¥±t‰$ç›’oY„Ü|PV¿Ø¨±Y{Œ4ÞÀë#yd˜µªíÕ­+_“Ï>ÿm™ öõ ݉Ò?n}­²ñiãçq£Çv˜JcðˆOÇŽ)yBå±Y©¸r”ÀÞÏg+ÐÚ2À\K¯[Ö.´ùÖŒ«;Év‚;@{*%Ÿ‚Ÿ¼/êõõÄtËÃã³^ë©?­fSú=;ƒ5d5kÌã1Òèx1e—DÒ>nœkq§ß½%À\»¯§Ÿì76€/_¿)YLÑ×S®v–eQ²˜R|þôAÉuÕÒ@L,úh\ªÄKE€˜¢qi| 7@LÄ1ÐBû};$ ¸x“b"Ä›X Äú¿äÅȸ?»uHAïÏ79±>h(€¹KqoS’¬¦ëjÊaïŽq†¡ [UoÓJíFWߎ‘c002z¤•Òó¤C$Z9òVô¢§ïªº˜Å¿Ì‹èÞøGfS™ S™ Sd Sd Sd €Ld €Ld €Lx.¯ï%»év-¼¼íJjµÖãaŸ!S`žçÄvk­¬|}–¤NçK‚Óè¶íüöã™M)€L)€‡§ŒÐ`ŸžnWë'S Û­—-“‘5Y³ÀËýáÀìò×m¤I÷r|}½á«–)˜Ÿß’‘)_$¡d €/}àt¾”­A¦@­U–m‘L€Öš,‹'SÀS9ÇþtŒÐșșș S™ S™ S?=øÃÀ0 šõ8ŸPÝ€oŽi`€MÚü«"¸àhë'^˜)äç#@IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-demo-pluginbrowser-tool.png0000644000175000017500000004125610536106572027533 0ustar gregoagregoa‰PNG  IHDRi¬±bÀzñPLTEŒŠ„‚„tŒDÂŒ$B„‚äBüþDF$”Ò¤DbœŒò¦ôL¦¬´ìî¤Ôr”DÂD|¢ÌTr¤d‚´||Œ²ÜÆìœÂì4RŒlŽÄÌÚ\4Ä$Þ$ÜÞ &l|–\ füôrt6tt’”tf”|zD„’ôlò´DÔÒÔtšÄþ”¤¢¤œîôþD„ªÔ\z¬´ºì„üJLj¤¤údޤ”ºäÞÜ.t¤¢\dbdäæäd†œL¬,J„$þÄÂÄäÜútvt¼¾ Tr¬ÌÎürô$>|”’””lœšÌ´²´4îtîäT¤4´ŽÜVüþLf¤¤ê¾ôü*´r´„¢Ô\Z\lм”¶ä¤Êì4R”t–Äþ,*tôŠt6|df¤ÔÚÜtšÌö´Œ®Ü<^œüfljlìîì,JŒüôúœšœ&$ü¢ŒŽŒ|Úœþ|z Dfœ¦üdâŒÄ¾DüüªœrÄDÂlä²dþdDº¤œž ôžtìîtvÜÜŽôl޼ôüŒ‚œTþ$zü´î¬®¬D²´üVÄr¤¤T<¼þ<¼þ4.$DœdÂDþTîônô¼º¼Îäæä–ä´òþ¼„nlL^d^üd”dfœ¤r¼ìêìFüdv¤d†¼\z´´ödú¬LŒt þ4þ þL4þîì¤Êôü,F„LJ$”¶Ü¤Æìl’Ä *lŒ®ÔLn¤œ¾ä2tTv¬4V”:|ÜÞÜ|žÌ,NŒüþ„†„d†´<^”d’¤dfddŠœvô”–”´¶´„¦Ô\^\üjœžœªü\~´„¢Ì”²ÜŒªÔœºä\¤ÜÚÜ|šÌD^œüúLfœlfœt’Ä*lTn¤2t\v¬85Ÿ–8³mŸ‰ƒaIe ƒ@ÇI¼"B¨L2éç 3S‘†¦àÜI„ 3òdt?AëXªcüSFŒ÷«”Ö–R£v'·bîèüžµÖ»ß·ìœ8k­½«ª;Çg­½·ƒß‰¥Á¥¥Á£¥ÇGKeò¨\^j”Gå†ò¤|Ò8)?i<9i<¹©R>¹¹þÄrýL©­¬®W*=ë•ÑJOe´§ÒS·êé©÷ÔëõžZ½^«³ÝSÕ´ÎïÕÎÙÞ¿;W•ÎÏÏK¥G^Ê·§oOK§#¥}޼9UŽŒPï-¯j»z ôxp¨53óàpærlæÁØØÌØáØØØÊØØ±¶••±ã•ã±ñã•ñ•ñ^rm|M[ïøÇñkÃk׿×ÖÖæ‡ç‡U;–ó;Šù¾”}}sV“}ss}“sÊ-Ÿ““³Ôìììd[ÛÙöl[õfvj¶=õfªÝ~ÚžÒÚŸjïMíOííSÚ7ö7ò¸¶1q­ymâÚöµ‰íkÛŠæömÕöí]mÛÛÓÛÓ»·U»Ó»ÓËÓÓZË­éþéV«¿¿¥õðuë¡¶×_ßaÝQí©”«–{««w®¯®^·\\]¼¾¨Ò7íU}_¬’ÕËK±@-¤â·ÿ£ú{æ´ê—‹‹o`v4øxpéñà㥥Çʲg¹|Ôh” ÜNXbM¼Á¹®e¬â9ª­§R5Ò)ÓV·"œ·{âÌP« ÊX¤³c ʈg§¢,±¦‚2Xó8¼:ó@¥<„°%a  ²qJŒ­k#Ç 6Ñfa¬ ϯ ù£êîcË0›Û™c'·&E›ö¹9Ar³s7&'oLÞ˜½19ËÖ6•âM[Y*DÙS%¬‘°¶°M¨‹ÜV¥ØeM ¸ÛÛÓ·-—A­_kýÆš({mœigª='Ô2vçúžÒI£œ6VU-,ª”Uò;ñ-/9í?þøóßþ•Ó¦´#sÕ8j€v"æ0šRˆÝ„5é ©a4p“Ò*@–aÆV¯ÔÃi¬ÜiuAfF;GlpöHË0£ø"Ðä´‘’8KJ·aöLK>SiÓJ¨]Eh–¡³C•PCj¤¤–Œ†ÓÆaí§ñµpš>æ×’Ó` £í$£%§mÍ!5!l &›™Ö¤´ÄV{cRÃhSb Öàì©9m(œ¶ß §57À §5å³kZÁÙ´™ ΰ¨yöã4P{(ÚZX-œÆÂhZäuxn{æ´ÿ‚50K‰ÔÜiPÔéŽ/Å#¿«Õtžôø²Pý\tÚ­ç›Wž?uëÖ7½†Ö”GÚ¼w‚YÙÛ§8Ãhn5…8s©…ÓX8 Úz 66šY橨åN«¡58£d4mç >c!4Ç ¥YûfpÆvÕ´–ÅrfÆas§‰2‚Ö¹R;¦€-ëŸMiâL´Á™V8­o¾Eû„4³š¡¦”ÓÀL i9k7H!6kœEuÈBibMý3eN“ÔˆæDî´&Ísb›6Q¦ö©šÞg·—½yýpf¨›ÒFJgª×«æ4ÕuцÍÜj‹Ví“ÀiNZqÚ—«þ¿ð›.¹¸Ðé:]|Y¬œö·Ÿ67ŸlÞ¿rëŠ{êûì1NÓv$ÔèœJƒ2òÄšgpÂÖ<¥´3mg–£cNkBM¼1¨l F5’9ÍÒ|¦5%˜¥tÚœdÚLiJ3§eÝóàPÛ fÑ=)âØ•ÆJ;3N[³9M>s© ¯!4JÓÚvÆ”s¹ÓæÜitM•%NÓ†ÛèŸá´Ù7¬6´Yî#5¶€mÃÖeaFˤfFkÞŽîÉ'š¶¼¶´µ–§ƒ3­×`Ö‚3¬&©á4 Ÿ±Ljž‹jŸÉkRÚ‚;Í£qAúý§,DNKœ)ø/‹…9íâþÀ‹_7rÛ&^ûÔd#ÀL”Á™6H“Ò:„r%­³kæ4YM¬­wˆÊº–œ¦Eá4ª§Ó §)k¢†Ó”*ŸÔÞ¹Ò0ZÉ:§ ­¹™E0¦u:œ©´¥N‹DhbmŽfsÚ J‹ìEjP¶eÎZÞ;Iú':c©Í±ÃZ8m ©ÍA˜Ïi³8 Æ&•íF›±Øe4}ÙW™”¦ò1Íc‚BišÚ'a¬íâ4|æNCiJ…(RŒ™Õœ4UH §IhØ,?˜YU1ZŒi°Gf¬OÒ ªjNã»ï—œöëÍÍw!íþ€Ö+œjc·s§Öã²ÊœÆ.ÚÔ;IùL”5”8M¬iP£}v:,9íl4i£Æ™;- ­.ìjZP†Ò”P!Æš ´¼{v:§ÉiÑ;EZÌiî´8æ‰ÑXF[Ó´™ÔzS÷Äi*(bÌiÚ‚³y Úò1 ÖRóLNÛŠ9 ©ù˜ÆÙ“k$'‚üì)Ê5R%ØHš£Öt©y:nÑ>ÁÌĆÑàŒÏiøÌYdýMJ£¦QmUu§à4”dÙ ´{N3¢Âi°X¿ÿ–œ¦7ßÜçKNüï—·^¼×6Y]¤qöD’švQ–9­Qö%•µÖ8õź§J´ 1–œ&Þ|Éiö«NHh,ªf‚;¯iY=:çw©ÄþHûiGÇ•Œ¦KŽŽâ™˜Ó”é<¬‰2wJ‹)Í0c±±töŒi‚lÔ\i]NcJKœQ¨mlð–·O`KgOsšÊg›MémdÜr µÍ4«5·'ò£'#°M£5„¦¥L¬µTd‹þ™Æ´‡Ò™±a®´;>¤yïd‘PæCšŠädyÙi½5wn09Ÿî¸?8mðʯ·.^üúâ®@ÛäšH³miI¨‰:TN#Ê'®6©Ì'›qÆœöŸá4« ¤©DœA%¾R÷äÃqƒ±B=Ò ¦ý˜)Þrø4§›Ö3}¼f>§QÝ÷iqþtØPš™íð¸Ûicã½Yó$?öú6cQÎN›·{Žm.j“*%GB2ËŸíìð)ÎTÖ?§ ³!”–’îY¼åÀh1¨5ã>M!ÈÂi»ù%ÕÏœ&© ±à,¿PCfÚV6ÕžˆÛ[í’ZAiá´|N#ùôîi_qÝÓ­ ÔÿKî4HÛ¸{qkà×/ï?ÿF´ MGQ椕—´ºœ&Ä|)Õ´Kjüâ>O´–œ&´*F˜mPƪõœv™Ý+b2³8z§JX¤BS…Ѻ»ç!J#Mi‚ ù†ÐV|P“ÓØaÍÖJ£}BY8TôÍç×ių' Κv”fGO–S¦Æ b¾Ô?YqË‘œ¦Ê&Îä5@kÚœæ^KsšjË»xÍ@kYûŒ9í¡7O•Ïi i‚ŒIã€i«¹ÓÀ Îøˆ1¬*;Égy÷üÍÄTö=§mn<¿÷î]^þ½ËiG Úô‘œÆbá5c wÚÎÑ=¹áp§…ÚY¥Þå4¼ilÖ:#Þy÷TiNZ~ô|[t2“×Òœ†Ör§*íìY¼åXIoÈÌzhêžjŸÚi¡î´¸çàì™ jM åN#4&´ä4"æ´¶Pƒ´8|NqôäÔ©¥"cJ#-›Ó¼w†Óà,¨±šK-{#X†³,%4¥Xµä´hŸ·W8¨Xfµª÷Ð4§‘½_å´ß аÿŒƢ¿^¾O»"²xþ÷‚ÓŽ´%§±¾á4TVÖWsí“AíŒîiwj]Nc骣ž;MJ«ÝÚÞiñ@à2ãH`NSÙéHî´ƒ‚Óð™™J7j~"°æ©Íooí~ƒó§Í6Gåƒ^óû´ÜhóJ8óGŒ¦ÌÏžî4-`3©ñå°…Ô°¨lÚæ´¡\jph>§5•1§qa» j$˜âLË0“Ò8yf˜Ù¶§$8ØÁ*å3>¦Qq•N#“…Ó„™œöÈ>ëì©øúáeNÚ_‹N[Bjò^ ­-ÅœÖ@hÑ@¬pö4­©‡®WÎ\hD|à´Jæ4–x#€­n¨Ñ@¡-ÝSŒñ‰ÓÄÚÛ•à âì#îÓȘÓg(--=p6nsŸ`Iûì3uNNËrçß8mK‹9͉3Æ4ÑkmmJ¤k–p¦¸ì48Û÷ƒ§@KNk†Òv ›p¢Íœf‰Ñú³{[“š5ÐHamtN=ð±ÚýµˆÑàŒQuÒ$1 Þß»o9>'§å7j_ÓÙ҈߼øù¹qö Éá´»¹]ŒG‚xõ,7Tþð© µmŒié> «Åûº¢’_¦‚—·ÏôîiÁÅ­Þ¢”µ{Z5¿¸Õ*“¼·_qË‘.ÔàLï—ç´Cݧ‘lÁ3œ6.ÊüÉsEFË^ص›Ï†õQ|÷¤vÜhž iYB˜Y͇4? ¸Ó˜ÕlNÓ"º_=ÛIiæ´§8DhdöF°ÖD[šÓâ}]œŽž°Ö?½¨ñ<`[Ëç4:gÌiÑ?¯c´ü6Ío8Ø<\jœh›iá4ÿAÄÙ3þÄÈ÷¢ÓñçÿýðáåÀËW~à×'…¿D‘â,û[½|6xùd;5¿Pã/9âÀúgàfsš¶Ñ3?qšFÁÙ¥wOÜx÷$5Š¢lPcIfÚTdÉh{/ÐÀ,”–.n=fTéŽÃ1 «™Î(»Oƒ3;˜Ó~’Ò,å3¼–Þ=ça¬à4EzûœÄk1ª…Ò‚¶6壬¡4`Ký39|ú—¡üæÖ¬–Xp–³¶‹Ñ´˜Òâæ–{ÛeõÎÔ|Nó#A<|ÊiPf©Ð–9ÍÞ×ó³gD4Ñ…O_‹ù¥Óõ“û´Oú’ §ýßEî4÷šþÍ7ÙxŠ2§•IÁ†ÓȣĚf4ÃL÷iñîiÙ‰Ðh¡a´KïžX §yäN;=wÐTŠÒˆ +Ä l~øT%§Åé“9Me7ö¼nu¬3£±[ëüIœi‘œ<‡?Îw5Ï€m'G-|ÝŤ–¤¦-{&ÀkmuÏKNã–ÃXóΉӚ|F4Å™=Hj1¦5í.M Τµ¢Ô`-uO hñ• 0^sÚÌh^hͧ5­¼qú%GõËwâÿ¢zÙiÄ/ÿ(üHJh*…¶ÀìȲFsÔHíŒÆITXž)ÀL€UÂfޏ‰Ñxó¼ç)ÎX¤Œ•,G  ­¥p±™ÒÞ;ß§öIÙMÇœ–?{*Ñ™eÒ™méî4:'×*¡Æ‰ /QFyl9nè Æ.;Íš':Kcé¤åFsÐ,ÄZáâ«59LL€YÄÀlB̾µZ-Ôw·þ—-®9öîíí­2«©ш˜Ó~Ÿ×¶lÁ-ô?ˆ*sÚá´ï„h;bâ$KÊÂI+ÆÙÍ›m•›M[wÔUd°–h‹pÎ(¢¤Êã4rÖ²@íýˆH{Ÿþ’HZKñàPR#©c*¢÷¸·W¸Å¡àãO4Ð,†# Îß>YLk°–hÛ’ÕxôÔRæ´Í’ÁgÚR M Éh*写-‡"&šbM^SÀ›Ç29 m)tPe±GÊjbN)#Š×jñ•âŸÄ›K ! C=koÚ#Õ…Ÿ S JqaòŠ ÍÖ…TQ ¥\÷æ²×N×aÓÈùGö* vÜ‘9¶ĘLãFøPÑÇ·ýž¶¨·‚܆A Øk^Õû–žì ojßÃKeÒÖ§¢Ò¨£V¶%PÈÌÖË®²2—(Ø(08 ø8¼w»çKú²”öß((Ê&îÆóäè»!§C¿£áš†ø•Š¢Í„ÞG&vV¨ó"LùG›µÙ–ÎíÈxAhšVŠZ´¢Ù€ '¹ÿÕþ¯è€Bí«†Γwn&ƒ^%ßHëÍCva¼ °”צi-—_¬6Ÿ£Ñüh *óTˆ­lì‹}M—Ûìˆ3˘ÒÇ%,]RõÓ;ˆfPš½4‡¶*Ð×ôAmö"…‚ÌÁXÃ*ÖµÚº½(™òôhð¦Í'4{s>IÓÆª˵ðKšFæ›åøNÃ…`æ5×öÉQõ7‘4Ûäa•‡%Ò‚X…í)B´’!Êlò€ ·Ed‘Ÿb„GЃ”(K‚¼4ƒ 0\¶›²—À÷‰¿À–˜P£IñÄHˆ×2ݰñ§nçTÕxüïŒMUwÝÎ9UG®3¿:UÝm!s‘›$/êª®à‚¸TCÈ”&9Ö°…,ƒvb@q,bÝ_X#Bž\bh~†wsÄ Ü:ºÐXÕ¤Ë|%ÈS¥$Ä ‰4³%(`Ý ç†ií,LƒgñPш†”þÍ›ŒÉn·[rÞô¥ 56àîb\C×ÜfcM… †MÚ¢KIk6‰rºBI¢Ñ¬I“Ç¢ˆ¥hmö:=.˜RwÇõa„ÓH3,Ò‚”%ÉABy” D™;ªùgzç#ÚŽ6µmk’óVõáXÄ!LM*W¼`åHÕª•‚•»À4B‡Ín,=6™Ôô|!ÌŠÆfZI–:¢ÞVAk'µ7é•oûË{^zé}7nÜøô/ÿyæÌ™oŽÀÒdÌSp#•I®ddô¸İ`ÚüA ŸĈ¦”‚íŒmt7ºœó†÷8'Z{”qÝšŸÒb¼‹æZ½4®u¡®ËºîˆÀ|fã–l ;EZ0w`t(w45ƒÖ~}{ ,íÛwÿ퉟½îâÅ;þtákoÞzà‹Æ´}Í4l#K‘Õ‹†D5P‚Ö6_L›rÔìŽòњ훣¦i8çÝ ÁkšÛ_Í©à<0M…?Ë¢È0š‹Õ…Â…ØL ôI.=P9nD‰< (ªJ+›¤˜;úP¡ÔÞ6XÚù»ŸxãG|ñŽo\ØÚúðõ_µ`iЩ:Ã!›v1q‹¨DF`aÚÜQ On•†¶ÝŒä¨ä¼ìJeÓcD|udnÑYùª }ÛBÿ‰RÎX•íŽkEB‚G$»JìÑJc©Ôº_Hq]XdÉÁŠo0íüùó<ñ׋Ÿ½°õÀõë'?¡1ÍÐQ U‘¾5ˆ†Â‘“MÛ ­BLŸ3¦©ÄÒ”;åhTˆi¼¹¯ß”ÝQÙå6ôæôÀcΞÈÌäKeîu½Å_v%ª¢•¨+¦7Ÿ댋².Üâf™ød4´iŒ\8/™¸hÉ6tÎP$&FÝÊ¡BCÙ› F_þÐÿÿôü#_ÿÅ…­¿¿æäï?ð¶'wœe1M"ÞROá yDG…#(KbOµÂ-Æü1-y—ý´Ó`Z;é6\¨É.œä¦)´(,‘¥™Ûcñ’pœÙp“P|r‹NK!‡ "Œ‹*SuÆÓ4Ià|‰‹pG“9Ò©k1¨ t¤ˆÝf!òxî…Èe¶¸Ô~ÚÓ/~ìÎ7þ¹Ë?ú„¯hKC“y2.)Ó“ÁòT«ü­‚iíÔyZê§éÕ³íC ç°x2>é#¦µ¦QF–âÒ.̬„—¢Õ3îy–Ÿ–çW¹psÁ:Ê™Y]+;g˜¸É¢bDðð Í“ŒØ ¢‡tÜ”¡k§'ÕœÝ{Žîºó ÿ÷Û?ôçË—/?ê-Í#qNãÛÞ¦é§t|4ðþZ!¤˜¶T#LÛ] ÷ž÷µzõìò¦±™4 ý4)9$ŠkRKÀ ÑÕ\J(èMO¥Ä{O<5Ò«çH”£qqz\Ô|-ãu¶Vdzõ$w‹°HP‘ùÔ"qFebÊNNOÈMd [„í§Ýõàææ~óUmi¿ –¦÷ž’¼¨° ‘r)=äô|„´3´²:ã깘·¼Óâó´ïCh6žéq$o Ó|ž"Ot*ôÓ »»-§1*21—)”:Óp—UQr&ªåTD hY]U*r·¨H·st`!cA/9¢²‡n“Œ2:âò;³÷Œ~¸¹ùöwÿÚÒ` 1MLc"™LéÉ`¨•{D;S+g‰ëˆhsG5@2ùi'œu»Ýgž¹Ò€›Æ˜Tä§a/… WUs»4À4S0¶²;y’J‰‡ ]Ú‚«ÔªLE)ŠºX³1Wšè~¹ͣb] l Þyª42qwb =¦‰t‡ZL¶Ã0Ùn­Ÿ–Q#R.O逜ÓZªÄw9æÒ½§{ìIÖÌþ½oyáJà6é'˜6 ;æ§5¸Ì © J¥»Iì·½´d1‹1mU¡óS5R¢¬³RŸ¨Yvš­¬ˆª@wK³¡Û%má-„¹¥ ä·6åj¶·œ¤\»´-ÒòAÁ]æO®ð<Ísêó´A3èõü5øü“¯K“F6·ý ‡ðš ÑkåÏR­r™øióÉwSï¦õÀÂî¿zõ…w6ú¤CMnGJ=͇þ6'öÓý &JÁD],ŸZ¼`§ªjEä+Yò ÏÑç"|˜Ö„ן²70«ç¢•š?¤ÑôÑ3[Z ­5¦v¥ÛÕ§¬ijý¥ÉÁ!9åð×OßsÏ=pgÅòr¶lÏn—Oå2ˆü8äÃÕó±rg¿ ©4ùi ûÒÈøiŠü4Š ,š€j°€Þ v~Úa>¬9ô§9Ó§ÒžÜvßUú}Û¬*²êôJ™Ÿ*áxäpãê Ž^¯'Ž‚„¦½E+çü´E„ø;‚ÔOÓÇpÝL ¬®Çõ­àa?6 ý4|Ù¡ CUímU¶²’Ž>§w9L‹WW}×ÖJ‘/\i¿z.(Ÿ–bZ{;cöÒ¾äÝC~,¨%§y ÈŠ0T·U§ ËTnŽÑ ×°¾.à…ýz»÷ð+6¾²¾¶:€&±x¥ôê¹°€˜¦wû¿ÍÓ¿ ëç῾UâCEOœGj¤v9DÅwõΠdËű‹î<ÍÕ:mqÀ|ØØº¥sJµjaÁ|G@'·ûÄäþ[òýó-_mgþñê¢Æ·ÓŽY¶XÞ`û^G¡T{˜Ö€Ÿ¦'}ŽÿÑá–ˆ·ë*ÿ ÇRëuµ°àßîþ/;gŒ0ÃÀþ,_â¯~ •pÛ¡Šhº$¨•ržöŽ_¼Ií’|à§Pä4T„*Eó§Ab§É;ü O£ 'æ4Ð.¹åcñ»¼¶¢%þé EN;Nì4’;MÞáxE>JÅçiªÿívSjÈA>äi¢¢”Ó` ‰WéÂxºÎ¢]ž¾!À¾sam&ÁFÀ.†4_UÜ*ö8ìi´ãV'xh•¼öÑîPÉÓ ò1OÓÌÓÐi™Åñà —ªšý-Öe Y«ñµe ”XKó²€–íñgÏ”Ó\)§›§‰ºfN (sÚ §)sZ$wïY¹©Å‹¼¸ž/äQ_2I¦äë J¡Ó†= µÁÙ³âiÀäi´aÏieNÛ(ï£ÓÓÔ9¨4µBÍ„Ë|Em‰à|Ò q#²7 LgO–Ó8–³'mØsZD!Go Os%´ó4¹Ó¼ÌD'tÛ6^^üŸ>FzΞB§rZD#ÿ€Hj4È‹hçi¼¬¼è¼'yßëA‰«å4xZè4!§¶§­¼Ó̱D¿§ÕJî2Øä6"-‹íMs²¾Ns8 µ#é4Â6‹ŸÚF–Ë23ÜÓkG㺗¹Ylß÷„N{×: ±-œF8ÀyL†§¨;Hë óF0;}öƒ׋=:íËkÒ„¨<ˆž=–OÒžÁ">Ò¬ç?! Õ*§½àûžj}Z“Ó”IÛè ù4 »S¶ìÊ-VS s*3!©œ]©$Ùö¸.ïr8˜Yµ7ï`9…å9^uðÆî÷±gÿ,à€ð:Íp‘. ¡^Œ `!Ë@㊖ÅP£Vfxu3ÛÚ¾sR¼)“ÙϧßÒ÷=e”°¶NK&M¤ej¸Õ€¡ÆªåÃpÒCšv€Ñ,à@ªö·èà!mƒNS±g Í˧FÏC*]H“&ÒFÐD»ÒO›êëÓ,ÒNˆ>_§‰†‘¸Hß<i,½Há¤yù´[=ö ¤ù:ÍršÔÀ'Î8KU§qvµÆÒ (Ú¬ª±ÉýHóužËÑÁiX‡{"F«Íb©0) *öDÔ˜*:öÄ´—«ˆyt(®k¯ö„Í£š5£X\‘Ds}š{ßÓGš¿÷lëÓ„y¦…÷±×§A§©çܶcOîÉ×§þ7ÆÇ·ë´Û6Nó×áúÉ\"ås»ÀAÛ: ´¿Nëßà óÍ’'ýÃÞ$¹q#Á|>À躼Ì7tÛ‹Å/øŠð&\.{wo+ÎN¡“A5ÐYžthr‘%PYU¯iŒ`Ïöž%žVÖá–“š#†åèÓ¬O+ï=©Ã½Ø-}+Ƨ õ·Hƒi„s‘§×rãªáý«/õªð—/°™½«ßëÓž¸¦1‚}—ÅF•ÎÓ’÷b?Ó᪰ƒ³gÞr˜Sò&ŸDX°WfjC­Ñ÷)Òîý:,?Ïíùò{–¸˜^Š4x…>- …¨Šå¶“ê(³Lœ«HËц4l°hž¦õÎ÷­iÖ§ âTÙÍ‘|O%Axiʉ—¹¦´Aýšf}&þB.\ZÁ“ M¯Â¿ž½ Mõiê÷4Ò*x‘ ¡iq¿§‘VŽ÷$UÊ Â{«Eýžé’xOkn+â@Ž6?Ÿá]=ÒYþê’§qE³æ6—ƒ"î,b%uòi6o(ÒG=¹%¸Ó[ _–›çVó§Ysû¿'°¶:ì£hn9ˆØi¤-ôiÀÊê°“xÏî4·Š´A{èÓ`mu£ýkn'  ¯Eöy|ÿq}šë°k=‚þ4·xL_;›¨*$ÎÓG0ˆæ6¢¯eù²tÅõi®Ã.õºÔÜôµ©¿€´ Osö±4·õúZvæi®Ã.çi½in9€‡ôµ|k‚Z™§=KŸ6€æ6ß{Öèkõ¯‘àÑ4"çi0_äy›õåë­Ã.õ:ÐܶÒQ¢Êï©uŠ`vB‘†×aïYsÛhÂÓ H+9°îxϲߓ}Ö§ñä-ÏÝyÅ)O£{Ùh(¾ƬÃ^½¦YŸF¤É¥z YV Ñ"HCÖa¯×§9Ž iÓ$H£éf{<žfÍm½>^Ô‘&j²ù6†8OS}Ú¹æ<ÍynŸŽ4=XĨuØ­¹­Ž÷L¸Ñ 7ƧL°-HcÿxuØ©O³æö.žFòNu6Ò=E·f¢òy†«Ã>‚æV ¥î8O‹‹jQìÛÊõºÐÜÆ‘Ö>Ž(Œ¢; 9Ï-;哳¡ì y‹êó´¸|@ap¼:ìR KÍ­ÎâSþ 3à:쯎÷ìZs+còm·¾0ÌÓle¿ç^órôª¹•É Hã ×#hÏÓ†ÑÜêdR¨²‹×#°¥ó´/‹§ÙvY¼çÁš[ó´vú4ú=ëëÌ<Íy9¬¹mržæ5í°g¶!ÆF9Ï­yZó8knÍÓšÖaW}Z#Í­yšór8Ï-ßltžæ:ìR7jynùfžfž&~Ïç¹E±„Ö<Íú´ç¹ÍßhÌÓÌÓÖ›çìkužæ:ìÜ{®6Ïm>hÃÓì÷tž[Qáš§5‰÷tžÛWñ4ó4ç¹-í=ãçi>OÛ¸÷tžÛvçiŽ#°æöUq>OclT£<·ö{ZŸv¨¨Bšõi>OÛ36ÊynŸÏÓÌÓŸ§œçv±<ÍçiÎs2çå°æ¶…>Íy9´nTó<·æiΟvìEs; Osݨ4·æi=Õ# — >Ï-‘¶Í­|/Úž§q€ü!æM×õuu£¨¹MÏ‹ÌsËÛv<…+b^/)ŠB½ÐÅ™óÜNhÈÓÚ!튡{ž&u£Ês{±–Ïí«xÚŤ¨z¸‰4ν6§¢¶:ò{n¨ï ,<Ï-o_ÀÓ2ÜBø\GPDšö£#¿ç¾ªn‘æ<·\¬ ë™^a+s*F¨ê÷šÛQôiµHK·¼ÿ0so½Ð4½ŸºQßœçöáúž˜­ëù/€¨âo¾Œ|ïɾÔ=ݘ4ØyZiÖ§Ùïù­"/G }Ö§YŸv(ì=£H³>Íú´Ëµ«¨ÐáZŸf}Z 6*¦ÃŸ§Ù®ó´cE¼g×<Íu£q5:\¢¯¤j¨(ïÙßóó}uØC:\<[ƒNxšyZ½ß3¤Ãñ¹Ö–O³~‘:øæi}ø=+êFÅt¸iPô±|ÒþéÚ dsÍÓúÒ§ïЧÅt¸ï¦Hc#*A’»¥Ÿ§yM“ºQÇsÙïÖáþLk T!oÇÓïÓá¦AYÅx[4¾5O³ß3¬ÃUž¦" 2£žfÛUç¹#íÝ’J¢µ…ÞAöž²g|žÖ…>mÿVïÔá¶?73O_ŸÖpmA÷~Oó´/·ò§©>í4œßÓO;H=‚&kšìEß’»Š–ßNãñ4Ÿ§µÑÜjÒñ¸¦åFÔ½TÀíK]=‚8Òµ7|Ø67 ÆÓÌÓ ynÛ!mþæi„YŽ´ÁÎÓGð-«ï)~ÏH#Ôˆ4l°§9Ž  O‹!m ®i›l͈<Í~OÆ<ßïÉiÙš&Hž§¡œ0ž#w:c)¶•ß³¼¦)Ò†?OÊä­ŠS°@¿ç¥-èÓâHfM#O k=H›v~O¯i!ž–‹A?n%}ož‚œIÀ'`–Û˜!Mãfµ¦í?xÚú´¬Ák×´Íxo už¦HK0K7üá8{˜’“ˆ#Ξd í÷lÏÓNÓôþs"Ò®ÙPçi¹ª kÀ›dà#2àÆæb [ÓX‡ý ú´s›5ÖÒ”§E‘¤äÉZ…xiYìyZû½' ¤ÊÓ„<œUEù\HãšvàÎSë´Ïs[FšyøÈ¦€46Å{Æ‘vÛ†:O2ܱìò­g^&‚3|g ùÈô2ú¨GàÜÝ¿Ìï‰ò(çiÃéÓ\ÀHÓ8‚äåˆø=•ý»A( #à÷ì nT$fÀõGÀ(öB=‚pÌ€yšã6R@öžÑ˜ó4ëÓv3}Ú±pžˆd‰ï™§ÙÚó49LBQÝëÓG°¯¨ïˆd‰`ž°‘ýžªªË¯ý#ò´áõÝš?­X 3ÈqyÚøª[#8ˆ>Möž!Õc$K<€ÞÏÓ€u"õ$ZÁï@Z$Kü„~yšî¹1§¢ÀÔDß=vözž¦öc}ZOÂ…ÐѱôÝš?Mõiçç®i‘,ñzæiª¹%¢ Tb@}÷¾æ<-3 ÖýyZiQÒ¾;ïù\žFõx¥Ý‚´õÝïùü½' X…ß3Ž4Œ§ïæyZ¼nTÙ¬Ox‡t½[&ÊPßÏ˳ñõiVÝ*O;\«ß{:ŽÀHSžæ5­O³¾[ã‚yni»O»Ýî“yš­tžÜ{^pölSÀÆÖ§9Ž`¨«\-æùön0O³]åi›jž†Ýw§Ó»%ÄÝÅuÉ3*é1¤ïê –ÄÓ¼¦ÑKÀب²ßŸÞ¶ß_Ƽöæp¨Ø_u€´(O³í®…ÝØi8iÍužþ¥D x´˜FnIhR ©ÂΞ­çâ6³yúyh~žæ=wô{26ªÈÓði Lùš¶™# íÔäù3o9Ì)Y#“c~BÖOÙ]jðzž†{‡ÐLý]o^ç»·ï}oHJnœXcl3GÚ ŒLbSBšvä¦ çA˜x5O+€»YÎå¸!ç–~Ïšó4p‹Iž–ì¤xi¼j6Píj{¿'mp¤éš¶yÄï©§8ƇG‘†j¤É·6>Oã–\¹é\êSÙÙàÃêoŽAž&ËÅu﹞v§ß˜¦š5­ÌÓØÄyšÎÑ‹ÍKõiJy¯2np‘ìÞùXþÄID^T.®q‡m¡nT5ÒtïÉM!÷üó¡jî¼çν'nî='¾Ïg6žÕÜrK.ºÙÄÕßP=¹B).×úžs}šò´2Òf&³ó*`Ť'T!-®þVƒY;”Þ4Îs_ÌB10Ž>-˜Q™Ï5H‹«¿õOžÒyn¿ˆ>ÍšÛ¦< ÊÓˆ ¤^dƒM²{£€4i–ï©f}ÝC½üÅØãy?ð ú×?‹ð—ç‚\<ªO;Çë{ÆÍú4´ÑäÆ ­e}š‘ÆüiÕú´æ:\ëÓ4PÇ @0Ú¦Æï¹f®õiÑó´} nT:\ëÓÊËQÖáVfTŽ«(] ƒºQe¿g½·MFetÀÓl‘xÏzn £²ÎÈå@'<Íqñ¼en £òtm²¹ãñ4Ç{Æt¸õ•U‚$w§·]è¶ã–xë°êFu¸‘ŒÊ-$ÐOëUM÷{VÄF…t¸åŒÊ5Hã[ø=CZ<Ú±ïÕáÖgTVž¦wÝÕa¦uÛíãâH dT¾º÷An/ú´•.uÛñ8‚}´{Y‡²®ëF©æ–w½é¶ã<íð¿gõÝù=ËHëE·79O“ºQV 5ài‚´tÛAÛõiÖ§EÖn;nYž[úâõ=µÏùӮɨ;ÔmÇyÚ¡bïè³>­O5m|M;0Ž BŸèC2ŒÍÓŒ´x¼g¤~×#èM·ÏŸ¶«¨GZj00O³•ýž­y¶©Åjxš­ O;·ZÓ5R·H·­O{9Ok¿¦iênÖ÷yš‘ÆíÏlïÙ˜§åPÃÌY¬¢oHÓ3OsÁ׆{ÏrmöÛânö³é§™§ýy¹Ò$Zi[ iê„ö³³+žf¤ÑZñ4ZiÔ¯ˆè[Ò w{žf¤qïñ{ªEþõ¼µ´õÅÓlûKº þ|ý…kš23ÈS·<Íöõ·?~ûág^7êøª5 ye`õ¼hï{âi¶þq>ò¿ó×ylÔç&kÚišÞN[¬FŸæ5íG +êFEFÃjüž^Ó~DÚñ5<¬Æïé5-ûד±QÎsÛš§™§Gð¢ó4ó´¸ß³lÎskžv ú=Ëæ8ó4©ÕQînó4ó4ÍÝízæi¹>íÜ&w·yšyZ¹»Gái>O; Ok™»{<ÍÉÀúÎÓ¦–¹»í÷´ß“6Lînû=Ûó´‚ß3Ž´ÔÀqÖ§5]ÓR‹5Ç{ZŸÖ˜§iîn)WÃán0bŒÎÓì÷œêsw+Ò*±íBO<Íú´Æk¡–%K#ÒÞûrñšT/O#2`ž6¨ß“VŸ»[@²+Ǥ¬ó­—Ä{:Þ3Pß“VŸ»[ ˆƒRQU}A‘†~xšór4ó{–‘FäÒ${wiæiãêÓÚ#M÷Š´5ò4û=iõÍ~O5ç¹5O ÔŠ˜yšëFµ²>Íu£è÷lŸ§Û<Íçi­ót›§ù<<­}žnó4û=yºËY@ú ¯°wÎìä<Íu£ByºË²ìöHëš§YŸÆ<Ý»‘ÿ1aˆP¨F4…'ˆ¬;MÌåß:@<Íu£dï©yº/öÓ<ÝyN°¼#æ-‡9%kdnÎì„§ÙïËÓ­B3EØ‘¦:3ut|žf}Z9Ow=Ò<Œ4+ËÆ2O³ßSótƇG‘Q~ói¹<íwíH7«ú¨w»õè¿nTÍšVæilVÁÓr`(Dj ö{ú‘o-/‡"-Û)RÀ‡Cöž¼ØsßÞóúL,æƒß4‹üƒx°iŒ–„Ý—ð•“9mØ´o”uZ-¦ÙÁ.¦†i„¯œœå˜@ê´ýpæ‡ðl¦iPÂXNøÊ¹™Û ÙØ³´î)3\§‘Ó¬{Q§iìZcšnÉOJË _9sõŒ(ç4Ü‘GÄuÚ.ä£8Mßth—=qO¡§;¦çcyŒ¯|+>Ý™6ƒ¨s+/o¸NÛ 4v+uAêÊX~ù:¦(ßïiL‹­øýž<ôL›p¯—äQØ7 ™fT³²eåyPêš+íê´Át, 4vÛU@7ÆòK~Hè4`Ä9˜;Ò®N‰œæö‡ûFÅœ–ûuÂ;ïDn½I¼ÚÖituÇžøÒ\NÆ‹{n™ÚD±µ}£†rN /+LƒRë6!AW·YGÿóižÓâjìõÓrÚ dè´¼1¢™ƒe¡‘uÚu æÓ<§e«QË: L['ˆ¬0Mdʼn'DÔiÔØÓsš­F­îÅ3­œÓJwªàQ{:íÊ=]§Iăúi<ÓÄšU¦YÔ ÷ÚÖi8ŸÆ»j»®ÓÍë4™÷FÝvç4ók?ÊiyººÁÙݘNã×=Ñ‚Ýwn^§ÉàO+è´×¦¿×ùûÙ0éo`_»øÒyn^§‰Œ…}£€i)ºÕéºçþšá uºùù´jì™âŸ\÷ŒdckBæö ¾ëtó:-Âüi°îéXÖi–óéŠÊý×éæušsš3íÑ|Úí¦õ[§›×i¹kh¼ý€ûGë´Þët󸌿ٻc@€>Ù¿ö%Œº9(J§Î¹þ „L…Æ«¡Øi°Hȉ7ÕýÈKüo˜´ò~$tŒ ñNc•\öÎä` †é¿=W"÷ø…À’ô ²:Ðì.Ÿ ðï´Žpöi•BÖÛi²ôŒP’äwÝm9jŒïöàØ„aXþ?·‹ÃÖ+`²Tò¦ëmÂéE‹Ž ð#™›IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-06.png0000644000175000017500000007205710536106572024570 0ustar gregoagregoa‰PNG  IHDRâ<;µY7söIDATx^ìÅ¡@QîŒ+ˆF1†ð_y:]ò €GÚµìÄ!@°ïóI¾k1›Ø¯~g$Ù‡½» £ Ãü~g&mÍo³1›¨´1?5¶ZA«(‚"ôÒ A¯¼Q#‚7ÞxÑ›‚xӪЫjÅ€‹,¶7-‚VEIZPÛ‚RH׸íÎOº»ã·nÈngv™Í&¡‘¼OΞýæ„Î0ìáãì™ ˜úé,Ö""""ƒu‰ˆˆˆÈF™=O}€‘Š›Kï¥Í²H¢/½Ë ›á…ÞÃÿDv(j¯­çJ¢=WRcÏãŽîy´}µ{³”Ô~ÖâÎŽ@jêyYSõÇ÷\IôØ£íµ÷\U? kÑóø#Š?;±=ÿNÅô<ÜÎÑ€£GŽõ»gÓL(M {nϨ͑É}ØXˆ(Xˆ”ùú&n‰ˆìŠ9ÊôŸ‡b´6b¶ÑXkØ"–H1ÐFkd`èËó³Ø@ˆÈB<áËDôÌm¨Ùèèè oNĦ)EcD4Pb¤lziñ%ˆ """ZÖ5:ŸLœ@%¦J«@$±µùµ§>ðê“ûÇžØûè®Ý÷õìèMt66l1ŠÉ Ö‘ŠÄn°ÌëÏ>¶}WOÊÉÍN¥.\Ëúþ‚ïzɉíç-1A‹@°™óï¢LóàKXD‚ÿ"¢» 7•­ÞRûlŠ˜çG†“·69YI-ø¾ïyž«ÅuϽê¤\?-‘±²iàÅb‚ríÜ;X_(ÀMBDD¤éH15‰ÍQâgSŒ4ôßÖËšw¯ù ©ÑL\_Xð‹…âϧòó—q®Î¾  eèeéѺc,=seÚ†_Áš#ñTÞÔÙÎ61SÑìDËÒfÝ·w“¦æÍýrjzîç9÷ï͛ҷdš[ýöö|²Óôôl½»`ÚîÓàŸ_` bÄþ1S õ̦ìxdîò§¸óŽçºZÇõœŒ£±ãêl6¸øqÜHW¨Dצ…~ôÑL¥Þ4EìtÚ?ÓÙÕÙ‘Oäò9•Ïç²Zi¬Eƒ‚‹§3ѵ)š© :"""â*ZkÉTL•V{öRz$—i™¾ðýçß}}ì«Óã§¾xÿÄġώ<:þÖøáýï}óñ/?^m -1G ­¨­s6娙¿Ú[·Ü;”ô;ùÃo×q <×ó|Ï»½{°'y§@ *e*š¦hÑ@Ïê*Z-œ˜²#ÍEþ›òüôOwà«ùþÈ”ð£þc`¿ßë¶ØÊæcÔŽæ·×—M¦ü1€*eó{T¦£Yž)¶"åHGV+ Ó2 ›³¹Je¯álV7'Slµr¤mIŠæ5Êêfe @¤³@‡(neuS3pÅc ÑYêæd @•Ö¬²ºM£ÌÉ[‘Ûk÷d)uó2pËcë›uŒê37)8’–e¹¢ÕcÙ7ü®¶Ö,[g7ÊO» í7ì%ÕßC—‡(ÚòÙ2ìNÿõ3§oÀ²,WùP°ô ßáƒëym"ˆÂîfwÒtÓš¢µ)­h R­âIŒB© ‡ zôßС‡þ‚‡ñ R<©PŠ?ðP«¨˜ƒ’`w×ÄÑ`Rú¹3¾n¶Û–÷‘ÃöÍ7ï}3³0oßÎVN’ç5êç( a…yxm](ë.í&$«=Ê<-‹64‰±6!˜ªÈš…À %Õꇯ•+«¾C‚5·%yÎ9Ýa0xû7ôþœÇûù7E@Šb¸°£ã~)›ØÛ~À€ÝƒB£ÄGaTÁ=š¸}\õ¨ƒF24²qeΩg\÷’"(qÎË`0xûç=®£€= ¬KëH‹¿øMhŒ_Ý-I'Ç4côptç˜ aǃÁ`0Þ*-½^x»òòÝç7nmuCkîÐɱ‘ãÃC'&Žž6 SQó×}rŒÿ.¥³š-jQŽðXF™7=?ÊÑ1âŸ@¬!í‚Ic0ü Κ_yðèÎâó‡UãûèHþ`®?;ÕßÝcÔ»f­I[skßÊW–KO_Ý¿}·:‘Ÿ¼|áZfïö…6mIšb,ˆò霚ÎGÁ¡õ0âŸ@<¼² Œ3 ƪ÷;AYXœ,ŒŸ»¸ÿ@Î"aÉ„-[…%³ Û­»òÚóí¾Ô‘lv¸à«•¯J/nÎ]i%+ë£ÅrýFC0cxð%zÿƒm²SÆ!ãÒ{Eß=¼çØWNÔîl0 ~ÅsköêÒòãâ¥ëg¦fÆËîëΤ{û“=édRþD"%i»O˜Â]é”pÑëÔ2…SÅóÓ7Êþ™¬0/ªËcìºë®Ã¬~üÞ]G_ÜxÓçW¿Ui¹qˆ(H¢ ”"@ƒw€% ÀQ¦‘ç­Ï U¨¦zrÂH—ʑɱc»~›døúŠ%Ôxßú³dߨÙì Ùi¢wõw9uü5oûÍóÏ?¯0vÉ­hÇ_#cŒ±'žýa=£¬¸¬•ˆc™D* …B¡&¡ó&PÓm(ã,€ˆ %@°.€S‘ˆÊá™  Ç¨hóm‡^~úû?¹ë›wý-¼?—QŽÈá]/c:Ç_Ì}âl^_ãÂ1ÆÏõlß³mýÍ_XÝ»*Ï(õ¹žH…Q Ôd6ÖSXÕH* Mê@™ñ‘’ÀDæõBžñE ¬½þãyMå±'ïk™ýYXFñpä‰j­‡÷ÿׯäÅ×ùkdŒ1~f6e`ó§»–—‹Ëê?çITGˆHR©øxåÉã\ÙsG)ì"ï#Ô‘p”…$á­F¬l¨lYiJcz ý¼q׋¿êß¹þæMwxHûŸg8òÞ9ï9ï1;‰KcŒ1Æ~üžòðÆþ•ƒ]År(±LI‰Š#Upèìî#þ}r€@*ÔHIµÍX ä” Q#Q Ó²!¤Øp˯ÿé±"Ç‘÷Æym}š‘6dmëäΈ)Œ1ÆO÷Ld£+× ÷v%¨Q"@^" ¤ HÝÔë“'v¾¾íÕ‘G&ìi´±ÒG$"ÔÕ:*@®ÜÑ]~æ…‡æ2Ýã=,ùÌP¦½¶Þµ]²$b cŒ1ÆòéžÂ57,/–ÑÂ8B›|5QÉÞS;ž:rïŸO=‡"Ù7h¥¤D ,ºr×ÁgÇÇG03GµÚ‰!cÚ 'K-¦0Æc\JA”t”»Je䔊¤Ú¢Á‘uÎÐÖt„Ý×÷îêÞÏŒg㯜|쉿}ç­ôõÖjJ+K„&²–œTQ^PÙþÒ‰<ÚXçÓzí¤åèÒ)Œ1ÆÛþÒÏËk¯êNJ¨©šjæ¬uN;cœà¼Õ¾RÕ@ ¢žp`¸{Óm—}£7::¾oëÁo¿öæ6K –L[þ€Èj…¾¡?îÙ¦³ Þ{m)ÕÞºé>ê8¦0Æ<–2ÆNŸ=ybäP²bMTv¦/*UÓ,„LYmœsÞj;ªPËáÊñÐdž¾róà—l?ñËŸíÿÖÑÑ}Æ‘v¦YG±äÐ÷SòUɸ¯\³çà3R¼P2ã‰p!(\ÒcL`)cìбÝyhˆ@“›r©32”Ò±d ¥¨C4EÕÔWQÅ@†‘- wG«JƒùCµ»ßøÃÖÃ÷]Ó}ÓÕ}Ÿ–ˆš5íÎ%C60FÆ…BWïÉ7¤ú³ävScŒ1†ü…;A¹[&VS ¢ Ël96–LjŒ’ ©MÑB‰0U U$ yYe°kÃÓG|uäÙý§vmé¿seyÈÕË3ÖkòÆ:“’ )4]}ûÿé6ÚqLá•ÝcŒ1xø·FO:;½"ÔLÚª´a¬ÂÔ%MjR4èTTMŠ"Š¡Œ#[XßSÈË*;Ž<ùÂ?·þbÿ=Xvã–µ·; 3k¬Cf-€”Œ6Ö+Š££#BÀãâ‹)mo‘]¬÷é/~Xižö¿Ï7Œ1Ƙ€øÇ¿ˆÕ·vUWE.‹3•¨(ZÉ Ú™ŠÃùHÃe!Å Ñ'¯øòúþÍ[ÿòƒ“éŽGwïÛ0p{_çZòF“Õ΢Æ8 JŠoëíò]5å‚þÇœXùZÜ}QrcŒ1¦ÓjIÈŒ´ *ÈdÊÚˆljµ’rÊ ¼S¦«˜A(ãeQod ëº _»á{OøÑ®7ž{ñÈCë–d]ßM–mlEg*q"J*æL/Ö À/zL™GQ¡­è2Ÿ’Iû™í7j?göË̾g–ÁÛ7›{òÍY.¹@Q†1Ƴž€ ói¥HŽäZX2UÂüÎl-Þ•æq£òÅÇcŒç‘‘®õ-€ªFS¢Èyk(„›Ì‚ÉöjŠ¡¬bFÏdon?öÈKÇŸJSÿ¾ds>Ñà\F!«µÖdZ+¢Á{\@jQiK 8³ýœ¹_¾ðO¾¨cŒ±5}ÃǪ•ñJPP€B§n$ëò&µa¢¢³Ùd\è ïÞ³ˆÒ]ȬmÍ(ƪ“™ÖZøØï"1~¦¿oXˆ‹xÝ”–’Ƽ,ü¾KcŒ1–:(svy³²AóW9ãY5¡(’–¼™ T™ Ôxxí¦¦ìD³ˆ2:–]¹âÖÕÝ[LèÔ’³Î53JEg™Ö\–eÅŽR­†¸ÀÔ+1Ô;ÿÑUs™NªŸ9¿Ñڵߢ}Ï,#4ÿ™í'Ô;ç½çóovî-4ŽëŽãøoÎ\vvµI»•VR$ǵ|ÁvܤIê´LJԴд„Ð@ Ä”ö¥Ð>¤—·6¡…¾BÚBÁ”@¡ô¥†6) ˜¦nš’ÖIëÄŽ‰‰å8[ïÊÚÕÞærÎé켑´(Bê~ÐÑÑH;Hzúòß™ù¯ ""šŸûØ?ßz1,L¶ užÓ‰£TÚqM©D*N6žíøÊ“aËñÐZ%Ò”‹g*/œ¼ðs3D¹g_ U¼&PÌyZÍ€NØE_تî»õN 7äsS†/)]ïøð~Ý#ÿäÆ¿Ã–O8|¶ ÿ®¡#[þWlÑÞÿÊóצwèPûžÛ¥’Tq,¾A¬´‘Ê"ÑŠ–®ùæsç*§jµ8¹g×ì½±’  `(ƒFIÎÖj·L£V£>¿ûˆT‚O¡]íÞ~'­–j¤P t£Ðµm@bå@AW:|µò¯Î>û^µªâ齓G3é|£ÛFßš@‰¤Œµ ZMÓ(0ð3nåÝÝGØ[ÂLÙÜpå¦EDDtמ£/UþŒÌwÃn݃I‰„@+Ç+cåÄëßúGåµ+WPÈÞ½kîîAšk5k•DOm©– úR##n³:::ù‘òv­5`1SÖEDDDÞ÷øË?øu|KV5J"t%;Ì .§Ä úþxît§9¹wú~71Qb¬©RIKõEÓ(QÜu_8ËÙKŽþ* §)†ˆˆˆŠcÓŸºý¡Ó—O6g ­Pä‹Q%ƒ¾A¬HHfˆ2»m?,aŠd`M˜&Ò\n˜F ãN˜ñswìÿ 6ÄL!""â@“U4\¯‰t*êd°š…B±x¨à§¥’HV[ئK†*‘’­åúÊFÉ䝸cùü_ÛÉ(e÷ø0Sˆˆˆ8PyàÐã¿}ûDûÖ° ïé`\«l$=\W.ܶ©•뀩ôÕ—jÝvÛŠã-kÔG'Ǽ…÷·•Þ¾ïA lˆ™BDDDÇŽ<ùö»ëòŸõÜbTw& ªM¥²Ze oðÖI)UT¿zÕ QL h`rÎöë—¼Jñ O|OX3eˆˆˆHì™ïüè‘¥k1¶ˆæbäŽ +¯ÂÓ+É2Lª(hµºí¶WØ^]KSS€ÞÈ=ùèOÒ©œÔÚb¦l eÜüW¾øÃïÿôËá|Íè.½X0è“,wF€½b €í´§fFz›SÙÏ>ðÍòÔv6‰™BDDDZã–òîïþÇ'¾~yñß2€~¬@†5¸E4®“a«ô¹~}R…ò¹tqbT¼ŸÖçýÇ>ÿôŽÙ»ðŸ`¦Ñøhùk_zîg¿yêü©¿¤úù4ä•."„5ô…J㺮 …ƒÛ¶#GRééâDÊË\;Ó,ËíîÛSÓÕ[ÁL!"""­‘N§?üô+gNþâä3^)“ß¿§<´£n¶ëQÕ7ÒÕü”‡ë¬x|¬²ã@!¼Ø¨½YKîúÄdü¶Œ™BDDÄF1«ÒZI+¥¤¾m×}ߘ¸çÅÓϾúÒï‚RÆŸ+•æJèYëX-ç4«ËÝ7êÍ…wöÝöéû}¢TšDZ%l›¸Ç‡™BDDDZk)U,UERÊ0ˆÃ0:€ör3 ¢3Çv–Ÿ¯þáÒ…³_þ›—OM[¾=ŠÕªõ…æBµ˜›=°ãÞ{§SùîbPi-Ø#"%2®ç [X¶#lǶ-K8Ú,fʺˆˆˆHkK)­´Æ ®çFa”àpSÅ©cI¯¸\=[ ÎÅmÕ&gæÇ÷Ì$u‚>7å¢/i ÑZl(Ì"""²,¸®ãÒu•‚ŸÖÐRi­¤ÖZè 2’plÄ‘ÄÄl8 @I…„-X¶@ôW35AŸ™X„e™$2`¦‘Ö½€€0SGp`øþõ+W W_i;H ˜òPzøjÜÁKÌúÿ&p"""¢M„†záÿ3…ˆˆˆô Ì"""Ò¸y1Sˆˆˆ8Ja¦G)Ì"""Ò7"f ý›Ý:´a(z‚áN"X´‚#Œ@ª ½óolIopj¬Ãg+vëЂ‚½¾ÊŠîƒ… 0‰½îIÖ?ÓõlÊa×( ÞdÒ÷5DžE"è':0d×þžøŸál€o €Ld €L¸ã\ð´ 3×?ͨªØ/ûv1 „aØ'EÜíÓ9E•Î)ö2ÛÅ ?¡äE¼KÍ*Š!…†‘õýõyO7åýã±ý|þþLw–e™zxMIo%‡}Êk”­@Ù>>>ªî‘xdÀ•SƒÃ*4ià¦Ô(Ò_I´[l¸›¦y‹e~jÍò'Ñ9Ó`à¦Ö.G3‰ßÊ.žX³êI,ß è{K×ÿæyöÁº®>¶¡}»Kz:y|À…d=Íio{h5ô±¡ÏøØ2B&(Sò=›–º§ÃkGˆ6º¶Œ}»j&Þr»Šub´âÑnåefÀ•ì%clвŸõéc>êAžÅÒÃìäh?ƆDf&\áoCŸ±a]¡ ™úùöGKžD&ô‹†JÕw]íWU,¨^áW²hF‡G3éŽ}~¨KÕ?IÈãŸóÙÌ£ŽoîX!àλÊQR€†J{q‚«è©&ÛÜIÛO<Ù”,Ùþ?öî>4Ž" àðìnRJLµÁ4ÚV0Ö4VÛ¿rJS¢Öhmµ`‰•J(•*(ÅБ X1B…Tü£B+bRcTüB¼ªTÑZµµ‘ i½)áòq©#wd ³Ý=ï®·—ä÷†Ýé»{Û#½¾÷ÎìNbC<É9žÓ:Ò @“ô+K¼æâ„³ X!Y.=˜™kú²µQ3 ±úÏi¦¡dj± ÀsSÀǦû[š…3 Ë~\_Ähll”ƒ‹xUb¶ª)röŠˆ¨Xd¤Y>7ô‰ã. `T¤º M¹Wäíïôt?hæGºVV¾¤öáâÁ¿Ç’}Zyê¹@OO啿`4G™29yáÛoú[öu\9Ï: ˜.…‹ÓÚ¼\bƦl» ª)‡ß:1 +ý}Ãí¿–¯/LxáY×ëòf䂺¦L„ÇzN†lüÇþÚPuÝùð…Ä~“=æŠnæ)ÁÊ®Õ𹡞PíQUãÕë‘»6‡¤)•€4åÐ'…²]\Z,lµvéѪ^›¤Äq.ˆš¸¨É„²mG·9ƒÚ£«‡8¿D Méì쬮®¶oeæqÌ×+ç [Ô­¸ùª”ލ™ŠH×' @š"³‡6VM)\\*ìuõ˳š’$uE-f¨ù„lSUÆP+%"ý š"lÉÌchpøÍÖŸ„­=Ï—E4C\æ´§šYV€jг¼‚‹åœ=;".¢¨8Ï2GQ§”J6Ó`íg°*Ç:Sâ•%R.U 0U.)] šbz¬~•|>JdbR(r.ËÞ²õÆð¸u!ĦSʱ,Ø÷Øhs†$/ ÎCH\ÐS^MQéó²öz–,ÍUë(²?<® €žL5EÄ-¢uõ%Ûw–Ü{ÿ²5k—n¬¾~çÓ·Õ>rÓȘkÏXS9×Bf˜›¢Z˜Ÿ+„;Õ÷æ¦ÌP€;}v¿}J×5]Ó ]ËÒuC×e›eÈ]Ùê†ë”ÛÖ-i¨¦,_¶b­gõ:Ïíë½Þ»¼¼÷ÜçÝ´Ñ»ySY]÷ñÚ²ízw<äšH+žysSû½çëàñ¯‚ßù/G?óþqàƒmúwvÞx/xàHÐ&Eˆ);é Ü鳫øHéªäÆË­§^:ðúÞO6Ÿoöÿ^ñ/ŽZ`òÕÇv,bT½Ð~Í|qtßsmþ?äXOųMb:Cû/L8Qr‘øcÌ]Ù*‘q™#µ¾ «_[ݺNÞäÜÁ®m²-¸ã ÷ü^ñÎdf-Ðý¹)£YÑD¤²¡©RÄüÜúòxÿôjJb—aTâ NIiD}EüËÞùÇ´Q†qü¹¥;¥²ÂÉ ¥ÇÍæ†#ޤa6nÊ4بɶøÿ4º?4ú‡¿’1#ÛœŒe*CHÜÂd  NŠ0 ág‘Zz½ó9Î\Øšr°bZàýäòð½ç^roï®}¿÷ðöXvâÖi?®?9îœw:¢#"c"cŽì~Y=î ÊmëJü¼ GÀ~µ(÷p3ІR³~[ÈuEŽLh¼@t*!47ÅÍ1’¹ƒÚÆ®ÇDnææcù™R3Å ³•¼…rŽøfdí¯?ËnYç~­ù¡!+qc¼A€ LNϼòÕ[ÙyOoÈE@ x½þmʃîøy(²tr³»þŘô¿ªÜ E`-—âQª[¾ß›“•`ÔicYšåx®gä†~}tyÓ·ð8„¸S!4Gsa”¹ò¦+ ‚‡—„ÙQ(0&sG{3(̽lMOhéì_é–Ÿ¯š¡ÂYZ£¢µ*:BŒTËD¨æ’ ¥b¨U-°öx¿´‰aD‹†VaѺ±,K3,Ã"˜P¡Ä…¶îH‚ÅC¾é3ͱß}tüPw{7·N‹u”'¦í©;v¥ì–óÛ7í¼Ô]ëág/´ÖY2sÅ¿þ•›û*/^.{÷Ì£èS…–Çò͉°¶=Jš#˜j ô\z# ÌØçü o›Ë<ðÄ7Kr ²V°¡a€Ð£¬‚‚ >tô†¦åj FF¬¦0´8ÓMÓs‘‚µÇÖGRsL^΋؇†£uQŽóàõÍñ^/[¿–©¦Xž*‚$4 $„*M‹Û|ÿ&É£Ô_¯éìLŽ}Ð’¹7å¾ÔÛ5cbügåGÖ {t$p;˜Á<Š5îT½ìRY%(¯‡·x€f1îÙW\<ýžÂ¼ZëÒ 5Á"ÊŠ6(òA_¯ÐƒŸãSGNÜ´›U¹™0‡FëbU·ÂÂ=í¯E%VŠ•$½£±Ì5Šå 쉬}OŸO^™”=•ÕåÏì?$d_8[šf9sÛ¼Ú“f}N™ÂÁQê¶ofñ¯Ë7ãûëÏS Áê‘âAï‰P{œ“¨;>7”øk>(\3Áv¥ïÑdLy³Ø*é«ôl3&ƒœ¨ZüY&Õ”%C ŒMM O¸']nÔCS£m6› ¨)ŠR±,ÃPÝ@àoѶö®-¦‡äò‰.R#W0[a_:¹=ÚXuÄõýòwȨÅE‚®¢’\.—Â)ð7f£ð4¥YNWÚoµZJ8_u>}ïYL\y!ïPàù‡¢„]kë¿ÌÛðè×°|û)EŸáÇo{ÿí—nPäy*·ÓTýÅKůö ‡tõÈÃ3ºõ‚ZVQK"=Å`ˆ‹A¡Ñ„aLNjå~k¯ÄûrÛŸ4Oÿ§…ˆ˜üßnŒTS„˜uÑ·\“vÇê:C´vÀó¨ç Sk­˜ѨÃÀÿ²s=0m”QüªP -¥”?nŒNdÙ¦Îé4“aŒÂœ" sNR)³:ͦ¨Sƒ™ºÄlÉœºM¶˜˜Å p0j(A7æþEç¶€Ûpl–¿µtum¯¥õ•/é‘>ÊwÇy)ÙúÒ|y÷îÝñ}¹ï¸ß÷{ß{þ%ìÄ6Ø’‘k ÜÙ]݆¶¤Ð¡ éV&âAŽ;Otêúþÿ]Á·m/(îüÛ‰±Êú±„0î²heÝþý«AY¼ªÚK¥–Õzœ#€QÈ70·¤¦å뢹9{…®ƒ‘…‚T°¿t¡V‚aÖÚ›d;3¤ÊgxžExâ+’‚RŸ·Ä«"Ç"ªvmz¦|'è`ÌX²°ÐÜÕmñøPˬxÕÒ[µÁÏ‹>úp°Eü È[Üûæ½ãèÙœŒ;°Ï¡Ã'ùc:(~°3ŸM©¨þ“gvYÙCšðG:,º„Ù=[Mæ>«ãªN“ò~áëN6ÏKN[“ñä¨Ãúýq£2J‘¢½ s†ÚÜm^/‘øP 8YW[çi2o¡}2Ÿ1Aó™:(ñƒ 1›r}e—…¾˜[XÞ^±®`ÇÚ䏸•k,Í]˜ ?°›¬Õ¿Ö¹ÆØßz/¼[ðc¶ñ!T¤YÂr‘ëYvg²y<ú0…ă8h"ò+Q¤#’Ií>ÅáS î!‘HÁƧ§ùô4ë½vÃxÝnÏüµüç| :œ5TÚë+ ëߘ€Q*„àxúÀENB\4I£zï5ýÖOkAKJBlûyÛÝ‹ÒG¯9áGÜàpÛžŽžJ¥u‰N¸JõJ '››uÑ[;OƒŽ\À~üFßB µˆÈ.£Ö^/¸ ›x°‚ݦoÂâ6 g¯jèj²Ú¯™¬Ÿ¤jçDËvÖqÙ|Åît]ô¥f#K½„]â”J!X„ð(d#-9˧?¤•(f,ô; z¤ª¢uʳqjÆÑoa(îCë†äÅT¦È È+v ;3ÇèˆEG"roJ{ívCyÂ(’ ÿáàR[Úd%(Z’XTJEwßpdlÜ€ÅîwSÇD‚‚ŠL$d›]œ,ÛØÚÅÈdŒ×«ŒV‚>©O8Ó'Ž ø‚²ËtO×04髃÷Á† ¶}ê²ô—€„¥H— mãÑ&•BÙÍö2ã'¬}Ï›.fäÃÙï‰#ÁBŸøÄ¿nJCâ„á€ûÚ¿º²ƒ¾Ñ‡N[W{î+}Z¦Z•¾Y-­t¥i½Î!™Ì§ð|@©ÐÝ„[Ä3I„;ñïMÙ²aù•%/lÜL0Ê· Ç)ÝÌ„@Ð$¤Á”¤˜¨oêZbc¢ˆE!€%Ê¥Û•n}2'AF10bæ×ëÃÂ:Ü…yˈnØ™·8-v ›è>$É)ÐÂY ƒðGqß$ÚŽ)?ßqûj¯Áx¥ñãÕOž%¥¦þ—¼²­ÔÇYlá9ëøÏ+\ô¯sF¢ß>7>%I©q÷¤$ªc¢å­’uyÀ.¼I-HTK—s‹û/þZñšeôjé«ù÷Ö·L¯c”Ç$b°’ÔÿØ9c–F¢ ŽÏ3¯áà>€’XÑÎN\RHîE°ÑF±Hggq(‘OpíÝâI-µRˆˆˆÈZ¤E£(jb\GÞ±³a†'{”ùÛáŸÌË’}™Ý¼ÙÿÔ]†V)@”CqTW5-ãñ%æ^ï ¾ÿrг)|X‘ÌŒ‚¶Fá¯S‰7‚†?þ1är¯Ëˆ ©^UŽ6¶AŸÁŽŽi”¢ˆ½uÏæ€L(Jó;]#Õkç±fŸœÚ8«ðerÙ`žÌÙdâš“É C#î–MÏýL%û+·Ž£>¶GóÅëûÜÌ™3ó÷éƒ8 ÉN ø…dW•@>lÓʺ@?ÕÔûãµØ]ææp(ob7¢e¯Ë‹×’&$øt‚N“Køt-¬ý×.B:û{:V+YÕ(oìèÁ¢d6—?°ÏÑíîü„.ÁYOÞîcZܨu‰×êî2´îYµÌpwª‰†\mIi ŸNš!.?{­…oõho»RÉÇâ  ªF‘õDö¦`wÚVÈ^ù¢X*SbÕ({·Rxñ»¿ "‚°º8†¶<‚ eJmD¦°¹V¹L&b3©„ <2vÃ,Z®¶à5lÄÿþî˜\ŸáÚªŸÙ»›Ð*®0Ãß9g®Ñ`!„´ k6¸h{±$ØØvQo!  4 -m¥XH·."]Ü–l.tᮋ‚µ¶Ý‰BqÙÒE[ú³Qt!)ÅŠI7!?÷fzîµÌ„{.÷##™¹^ß9œùøÎ0I¼äË73œgÍË{'’I—_gµZíÎëä;À‡ˆÿW|âžÖ/0P©TÎË^¦„ïg+SÆvΘ‘ñáA?*eв}q õ´t¢g†ùÊòŽKxÓç_”Ípdê ÿ×3Ÿ àê·×¥£hK÷ñYªE×ÎÌ´o*—±õ;$ž:.]Hï…ØÞÜ!ÐMÉia‹1âݪ×ÔœôI¨dV¤+­Å}òÜ!9¿…Æ$ÓΉ“bº)§.Þ±ÖX“l­lý9ã£uîÿ Oøè­É  ›òÂèÈЮçûœÙÙí%»³dû£é\©t¦äÌßü$ytSܾûðÎ=k“nŠ]äŒs6r.²ÆZÛºJ¸af¸÷¬²»f¡Ð][®覜ÜóõðÑK¢¹å}‘S’Ê‘p³YeóÕ09?ЋÅâKÝ”ZÝúqh›$îýýhzöò±©7§'ËiЧm‰´V?&ghÿ¢–@7e©];3Ó¼©\€Rªi™"éD/:tSO—& Ð†€nŠ4W²¯ÐM)ÞZÜ'ž ÐMYþë¼lËgŸ/¿ûÚ…9¹ðÁçÏý+ÅtSÆ&OKb]Ƭ HÃ'•×?¼XyiæcÛj’'@7¥ÛõXŒÄ~0"~V%–†ÅåÕ÷KIÞûêÓÑ¡¿<8ûpá¾<3Àì pe–ÇOß¼xÉCb‚PMˆ ŠÁe™  “QÁrÖÁ™’*‡BÝUdÙufY­uÄ‚ ÀZ˜•‡ËÈ n@^Q<€„äæ>zOÒ±oŠ“t··s_áÿ«æóôéïëîkÝâþù÷ù¾±›âñ:T†ˆ·ýGN?ùú§7Ý¿r^ª¬æ¬ª(£† VˆÆ¬˜U8é¥+†§¥¥iÁÈÄ©ÄÙ °¶p3µ7ð /*ÞK-vëH " ##cé‹ÃÏMñDy½DŠÂZÅ—TnkÝ5ÚJm_wvê-…“!ë ]a؇ϦK–°U*`ÇŽÔ~@[¿Žšp !ø'hèÝ—ÇáQIQÒñzy‡â;»¶ý­òÆkVÏxÅJmŠ4Wtµ¡Ç²õÊL¨<ðúë¯SpIM½ÿÛ‹Š*©c€“Z 6Ååe7…Ô&Ûä ™Â…gúô½Pv©ÊmÏ1ïc]å˜g"Pµ?Û^é«(bà°ã¦˜¶nw´GU½^Mš4óÊ$œ6w_vv¿Ê¥G¾^øü²QÖëK4tµÁ±$8 ¡E&‚ûrï}|7oÐÕ ÀM1m<Ñ,Pšçú4‘‘úo3ÇÍ_¼üéĆ©·Ýpcß”¼áîgß¾}É“_‘B‹ø×G £á ðx¼äº ràöR«ÀL·ÇáöÒÑÊÖî<¬eŽ-­‹_·`zÞ/ßXs26±klúÀ›ŽW_Zÿ¿pÈ\?ªbm>‹ ó:€¿f~æ'”™Pä7ͺ|)Ý6…[…H­+£&7åû¦L¿qùd€aõï÷DºF/^åד‰ÝvnJS mRŸÄ?Ìáž*‘òÕ·ƒ÷­wÞ˜Pq¢´²pþ}ÿ0o[|×ôËÝ˺õì.5‡aF&å®ùXÓ³‰8¬—÷çyÏ)jÝin˜:TúôãE~×Õ²^‘ Ff´]yT?ÄÖt³¨-dgq!“ˉLh€Ð¯›âñ’¢¨«Ä¨éCþ¼ÒÑÃy$>-þúwÖ”}ñ/ƒÆþnÿ½/×דmHº¿`ý‡MΙ¥O.Û°æäI뵺ÚqOìá`Û²Q½o_mA”ø<=–cFÛ•G­ŸDÞ•ìlp!£O™‹¥Ý^7Å«*› þëŠäË}5÷Í®ço˜ÿNlÁ¼Ø_¼V‘ùðÀàp¹ô/aË–“É“ VMÎÊÊRµ° 0eòN–ïž6~ÖVÕu‘EsÆÌ-Ÿ¿;>áÎÛý¡h Y÷ìFö——‹8¥êÄöc ¸)#GÞC§Ó½hö>®™ÝR²Âã¥NßÎØ7-~qßG “9YæÓÍ4RÜŸŸÉÁЬܞٙ3á±Õ^gk•ºoúª-L½þîµÔ~È=V¤ ÇÁ®n‘÷y•€›bÌòÖS{€.P4Ü.ï¦?Mã`â#$•6­øµJ¤RG|Ø0{Ä}v@pS"ú7Mó9ñY–Zw†Hu»½I ¬Ô¦pk1czHêãK[Ÿ)mp!FÞêgpSÀÒ)æÈÅTX¦(äq©â ‘°–1?dý´¦=E,Ó«G ¥Õ‚Y=©gì7娣2¿ø }÷æ>ƒ2¯K'‚hÚy<^ÕyNQŠP*I3ðNË ö^ûÜðöž:ô›{ò,j”´Ñb9õC":_­ÀVQUR©%<åg]~AþÚHA ¸0'¹åF¡µ)ú«Œêg…Å ®6"€ÐX)¨Mé½|MsðÔ¬š-;œß‹KtztºËiHM£@µù• ÄÀ¢¢JÒ7¥bfNç¹/öÊÎ,©½D£Ó{dbÃq¯„@›‚Yi€ÚÃ6ôLù±ÿmØùl¯â n)‚¸)¦-óÖ‘M7'Û}(E&nJõžÜžCûpK·n§Šô#í#ßLnçÆ´¶O ÀÚÂÍt•ƒÚž‡¼µdï7g3”ˆ¾9{œÛNUn 5µ)Ö©>ÁM™f«¯K4ý1%SF¯%ÒC )Äp±(äµìë ßIü€ŒŒ ¨MáyÈ×Äué×#¡¼³óû å—œ—¿#“šˆKNªZ·‘ S×:k’ÿ½oð·¿Dï¬w3ÀMI{ó쉗Ñ1ΨØêNÝê£cjc;»Š~8ð«Ä¤ÜÕ†JRŸê¹4r»é¯¦,™Ò“Á´1Âm~œ,uáÇ`é‹ ÀMa>øÙ³m(}o߆~=ŒŸ="¶¿–O˜óDUþFÇÂ%5£GuÏžTV{Iþuf=£Çâ'ÁnJâ©]'O‘No¤1…åõLª¯¯§ÖiïWÉ_q-’Èà½nz ¬µ(;ô›aH Ï UÀL–&#†÷¿"Y¢º){"oµDB£7eóâ)~ùhÉåDÕ'ªÛ|î£Ø¨ÒÐÅ„eÇE62–óó9°huÈfGÍ‘ŸÔàTòCZ£)»ƒ x§€›bÜÑásesGÝF‚ßïù_~îs¢0·OjϲÂ\º»Š„c‹úÀ—"8e%m7l·D&”> P¬BTÜÓVW$Ôì (õÄÔׇ ÀS>è rq‰´7Úë„P"dP`ÀMùh×Å_Œé^µ5­×ø@x?üíç†G{t§ú²jª7šïcÿgUŽ•Éû ö?¬ì)?`@• ÃnIÁS«¸l92ÜÖ(wÝrÃG»~xõ±‚¿¼¥ÂÂÀs_®íçÝÔ¥»w&=¹úÛ÷s“Fuâ6îáí—‘%¨²§Ì[ŸøÆii‹é ­j'ä§nõT©p¨x/ ,QînÊkŸ¹õ8ûδ@é–2öéC^:ŒãЊ7ÅY]Ýp¶¤e¡¨MG¥ƒ"´…Á®iaŠù39Êô8°q‡æ£¬96æñ™}^ûP›rî|5ùèEDO6¨5%T–k©P.» à¦4\¨>º}/iºDÕrÚ)Š/sbO=?Œ.HÀ«†¨Myuz¼Ï_yü—™µ¸pIVòôV|iÓIr]mc“9pâF®7þ‚ nÊ€E[É ~ÖqK®…ä†è‚Ø?nŠ\2?¿ø‹’%‡• —Â%ã…F±9]Â|uZû²@”"CyÀM7…—Ìnxο\³÷Ô¡f¼LUnÍ\Å–ñ+׳òÃÉ0­vÔût°R±h´¨hЛ’šz-E&EE•¶ÖM‘ CÏz‰yiëJHkgbÃM©ÚŸÇm¯ôUQ0fêCè1pØù§­IÛ½—¯Ñ¶”®×ôýŸýp´R>FJëí_5€¶¾r֨ؗ{ïã»yã€"xáGtÉb¸)&mTÌÌé<÷Å^Ù™%µ—htzÏ⃧G§Íz ò@y† <è›âñxÉuAåÀí¥ˆ€¥\ØMa¥ÂmK—Eßm5hÃŒ›ì×ÓÖ·‘Lq«jÃyrVp@–Q”b×OxlËZÃ8À:¹šÑ-=/?ÍÔ¦¼udÓ͉ÇvJ†X_vÓúŒaT˜w–ûÈÊwâ›Þ0Lë*¹tÛ”æåNêʨÉMù¾)Óo\>U=i bE³Xtá¢;(/½ô·W˜1bfúÎCÞZ²÷›³ÇÆŽJDßœ=Îm§*w€Ö©Ôï-7ílðVXyiÿV&»Ëûó¼ç‰µî4·LG*}úñ";uµš½¡ ¹ËÖZ9‰>POêÃ[¶òB"sµ¼­%‹ÀM‘ó¯‰ëÒ¯GBygç÷Ê/9/?~G&5—œTµn#¦ ®uÖ$¢°Bz9‘Hº¿`ý‡MΙ¥¿~Úw’'­×êjÇ=±‡ƒmËFõ¾}5Y@W!rWeŸ¶$…È­õ 陎 @¯;‘øL”–±ß`Ý”~öì_JßÛ·¡_ÏÄãgˆí¯åæ'>ËRëΩn·7iB©‘u¬Wôñ£fV^Îø¨Át`€›$Á7å̉Râ­ ‡C‰b'…ÿ°Í[Sàpp¬°×Br…[e™B y\ªkb-#wÍGÉX2)ò@è Ü”ŽÜ2í-²Àן@bEÞ…€§ü¬ÓëjÀMq5‰‡&Jt}¢4ªÒ,Z·7ʦ“ÁŨMN²F©ii–ºQÿœÖq>8YP´GV­ÒUÜ—'šÛå{–å=eܰ_=zß=Ó_ûËŠgÞ\þÅê-ÅÔïºÀ×qT<­qëÁR3qj‡ÈÛ¤6F%„$…ÏB7ƒ z©œkŸBûÙ{†¿`Ø£)N¦/9ÜZõ8„Ñ”ô—è…“g$K¾×ZYí•à d$1SÌÉËÛuÍu+œ’½Í¢)E^‚ÁIçoç,Ô3vt¼åmBϊЃâ‰<~ µ`õS`/¼ï÷Ìh §'xDMeÊžíõ&ô±éÁ…¹ÜSr¿Ç’åbŽŠHKw,b¹Ë“®¦¾lY™3 -Ùßú‹"šRè=ÛCf‰gô·QúÑÑgà#*”Jqï*DÑB˜›BHèŨ~ŸZ<“Ô{é;<¶­kÁîãÍR€¾?nB4¥8Iè!('ر„7ƒÑß O\®šTÔz,7…ž›B1ÌrIÅíOß•;Ú›’ñTÒH' çÛý¤zÝî8XUôé\½v ¥!ȰJpàBOØÏM!„ÑBHÂŒJ:¹®£fß‘MÆGÓŠH$“åmYéUOöv.Ç>¸¶âi*½¥‡ŽØ„5˜ÆëÚ€½~8•= ZñjógÑ<Àè ¡YÜh !”)„ððÙñT´º}ýÞÖÚø°)k"É;'!åRÏÓ¾‹óž›¢{AÇ}úT\(8ï”>~CG$]úwûùlÖ~#ô©þ¾CqW­\¼ qâV¼„T4:Y"‹>ü³)uWçÚÿÞ³Sb€^Öq=éÙS²)ÁåÁ­­=sÝáÓQýóf­G Œ,H̪ÇTj¶e¦dS¾?;$†D»÷Ü[ûd6?Ÿ˜úçêÄÚU3çÎ~c”]ƒgîL|ë­ëoÛsݸwYj°/Ÿ™Í%f¤Ï0€HÅ6ÊI„¨‘Éc–c6 ›’ WÎÞÞ¸¿=´ÝÌY{‹X÷=)Ư£ãK‡#¶ëþ¢»#šìÁsæÅ|Øâ ÷Ÿ*BÕM8® Ó²èMii{êä‰o%Ü$1ºÛ›Í3>"²ï…F¹)\&FG<:[3w\LÈ‚$~Š¢§J ®¢@üqÿ)£ \%ñuSö¦\˯’ðšõû§mM»Úš°=ý4²ÿŒ“±]×P#ËY_hg+zJÏìºü÷À¦dSJœœÎH8!"í=«ƒÈþ«¹Ü|ðñuï’×;$žÎ=ØFÅaM2ÿÛЦa @6%ñc®°Z ŠÈÀ“­Ýw¾üÎ.‰1ðÖg)lò°3¤9I&K¦ÔM™ 3RȉHËÁͯ¾½c:W P»£ºÎÙ¿Eü$¯õèƒ)¨Í‡z¦ìMɇ+dvú‰ï~óé©¿Ã(@l”"Q$A ƇG†ŽvÝ_ÎÚŠÿÒLâœåŒ¬àB}JÑÛxêVp—¥0 ›2SXñHç¶W:sWC "»!E®Ûr¬ÿ»wë—Ht7ñiärçÔä’çô¸¶ú€ææfYòS²)Ç{6¾¸oôèû?HŒÏo”Ãú`_ƒ·ô¦dSt r—,cþ1 ¦€"˜¼!€Œ,ªb$¨“xÙMÁb¯ÕM6%úcà¯ß¾åÖ»Ÿ îh—ta ÀÞÍÄ(Û_» ³“Q8…cŽ™†éž:y[…)6?ü˜¤‹G«úû¥¦dStÖäË÷"q¥ñméü =Ë3;ÜvÊ_Ýæ+¦ _šG‰š:Y{SÖo9ð㺶¾ôóìQh×Õïמ£sdå¸BU­´–œ^ñƒe7”š”¸Vj 5¤·äÁä¡Phhꇼ^05~ÌK ¡?‚!OIKèmbRLCÉCCü¢¯M\LJMÀRœD®s,iÎìYwÙ4¹ZdzF3ÒŒÎÑÿÇxسöÞkïÙs’YZ³öÞGO~xüù+GO^–ôÅæY‘ïwdYm…]\%ÔYTK³]%O1 >úoJÛ½ýÎåçNi6\àØ3εšC"yíÂüá{Gy Ó’sŢP/Ñ«·ŒÖè”[sy{3€™>À›rõÚ©Éqç(ÜPà59S͹À‘È%×ü;Û¼4ä†Â´2šžUÒ5'±ë&¤ß{÷œuýþœØ:%‘kðm/Hz:+½°­DßÝààMÞ”k KÎÞÏL>–ƒCO‘$XÚ3Þzwþ“CSVPEïx9'—–¦0âȳÈ%—hbÛÆZVþ ň1v[Ì»Ac¹Ñ3v7;¾Ì<|ø’¬)§%™¼)æ¹Ë­Û«õúPy¢ÀÇs3E>=‹\r©ìÐ I ÛÖrÒ½ÍU¥´0‘/-"g1>r× †¡cÛ¹±) 6¥Õn/¯DžW;|;ôr¬Èщ;‘¹äb#ž>ð(³©´níĘè‰Éb•‡7%+ 6eÏøèrû‹æ®á˜ÙyGŽˆ™ïþ¹ä’BGf?ÁdÑ  XJ‰.“½KÅ‹ÙÕ‹ ®žM§]2WEÕû7³.×üX¦Jnø¬“$ºi]lC »ç¯VüêeϬì…w™V¡žë´Æ÷6ÚáH‡ëDq=è´†W®·$7åe]êDo¹©0©«ÐJRb0µD+×Út]{(,r(1n_‘õ¡Ølëjar. í-Émú$N—^Yú+Ϻ;Ñ›¼)NO\ºòѱGn†»¾ ýPÌAÄZÔüùë+3û÷/ Âêm¶Ía×År¨ Ð~ŽìA*9Œ§e¦oÊ(/ÍìèÔ¹FêÎ9&’Ã1»å?qä`Ÿ®í–Û-QÐPÓ÷’÷¹$Î’"¦€Q¥pEý hÀÍàMÑ–ÊSM“†—hаʽQÕg&»«Ê¢JI„™¼) ­-)¨JÒ)YZÒ½Ôò÷ÑxSxáÜßê¹s²›|†€6´\I´ÜÖ™»®YR§ÍLÞ±QŽ={‘¢[~Æá"…‹’Ë¿]xål¦ÀD޲9£<Ø¢HXíÝdo ð¦h¯É/Î2‘#bGŽIÒr±ïàO(ÉDß&’`BNg1àª\Rþ›âµZ° ­06sú½Ñ³‡ž~ÿèÉ?åèÉË’¾Ø<+rËÑ$[ÐUŠ¢·üMHr•PgQa,Ív•<Åt.`À¼)À›Òvco¿sù¹Gš 8öLs­æH^»0øÀÞQ^ªt“[aÊNÅr.yë]­¹¼wæMÞ”«×nLMŽ;GAà†רəjÎŽD.¹Ô‹†°îR µÛCÎ%¬LoèTÓÞí5ÉèIoBg¥Öã •¨»ë7€7xS®-,=:{?3ùX=E’`9hÏxëÝùOMM¤½Úm†]%IlÍ´Ùלíy/ºŸªdVͺbW[Ï,­Ù"=¶ƒøãŸþBýÌ0Ó'ýLwYü¼½»ÕìxªELD5O>¦0âȳÈ%—h¢„-s=ç l¿Wâ^¾v7Š·ÀÜÜõ;0S€7źÜþ¢¹k8fvÞ‘#bæ»ÿD.¹9¾qƒµ««H»ÛÙtÚ%sTÔYZÒ½\—k~,S%û`¦€Uh§'Ç:í…ñ½v8Òá:ÇQ\:­á•ëíÉÍòê5/í*6¶’ûÛ:uÂÖ`ë,XW “óÀ>úoʃÓÿ¾¾ò­Ñ›ìþtß}‹Ó÷->°{ñÛ_ûô›£K"—Üâ«Áê*À¼)À›2ÊK3û:uºsމäpÌn¹ÃO9h®í&‰"ñ¡5Íw/Õ ~õ€ßù• ¦VIØryf ð¦hKå©Ç¦IÃK´ýüëŸiÛƒ%j23}úÀGàMá…s7>~«çÎÉnòP•7xSÄF9öìÅc?ÿëöêã'~ûøO=wüWs?zZäT!3xSÄkòÆ‹³~éož}òÍ—yþ•Óç_}éüë/‹œ6‚¹õ `µŠÇA§+1`¦oÊØÌé÷FÏzúý£'?<þü•£'/Kúbó¬È7þŽOvÔÛjKBgo+eçgIh¡Î¢ÂXší*ÅŠÙ¹Ì<|Ø”€!* ð¦´ÝØÛï\~îÄ‘fÃŽ=Sà\«9$’×.Ì>°×˜“ÜgSym…ÆÎÏåîK¬5—¼-€-réï©ÞÕHÔeRFo ð¦\½vcjrÜ9 7¸FMÎTs.p$rÉ¥^¤x’\….™]ÒSUÏ*kÛšeûmºcúÒ¸kËϑބÎJ/¬ÇA+Éœã˜)òqèYä’»C´ÛÀèI ¯>LDW¬llj¶T›bSZÍáöòJäyµÃ·C/ÇŠ¸y‘K.¦ç0›´° €ÄY²–Ø…:~%‘tK›bS$et¹ýEs×pÌì¼#GÄÌwÿ‰\ró~Ù±KÊ9»DÃ`Sªëv‹šÉ¦Ó.™«¢=¶ÝËu¹æÇ2Ur0Ú½±¥ »v‰œ×I´sE§ÜL;$OOŽuÚ ã{íp¤ÃuŽ¢¸tZÃ+×Û ’KF`¦’+¡-1•˜ ¿ -ÑY¶N°5Ø: ÖÕÂä €2”$¬¶Tþ¿Šð¦oʃÓ—®|tì‘›á®/C?sq£5þúÊÌþ}jŸäŠç}`âÉV úCŒ–+‰’—†P×ÕéÁ7S€7e”—fö?têÜ#uçÉá˜Ýr‡Ÿ8rÐ\ÛMÛgm7„šÊ½”P×, €ö»`Ú€7ŰTžzlš4ÊF±Û.Áž>`¦O¿ð¦o /œ»ññ[=wNv“ÏPU¼)À›"6ʱg/ûù_ø³W?ñÛÇúë¹ã¿šûÑÓ"§ xS€7E¼&o¼8ËDŽˆ9&IËžƒ?¡\¨•N¶ï¤Ý ¦éôv1ðÇ?ý…˜)`¦flæô®þøO~ÿë»#u·Ü‰?ûoç÷¯ÿýÐÌwo~úãÅ–C¾ ½ðÚe’Ûk‹.\[³=,v±¾3àÀÜÜí`¦oJÛ½ýÎåçNi6\àØ3εšC"yíÂüá{9Éý7ÿÖVhlþ\îfÂZs¥{ UøÝo^ bS@lÊÕk7¦&Ç£ pCkÔäL5çG"—Ü{ý©-ÜM$¨Ü-Wµ”Dɳk[ë[Öõæ‹¡uêŽéKãö-ÿJz:+µ°‡Þú“’%¼)À›rmaéÑÙû™ÉÇrpè)’ËA{Æ[ïÎrhj"ýMœÝåý`ÆFl¨ªbÙŸ`Rnä«Ý³nßÖ¬+vµ™ƒ¬o¡T/0S@lJú™î²øy{w«ÙñT‹˜ˆjž|LaÄ‘g‘K.ÑĦ„zliŠþûÞØE¯À†‚¥ìNlw£÷Ff ð¦˜ç.·n¯ÖëCaä‰ÎqÌù8ô,rÉ­*¾A‹H:‹Ó"EUUý¯JI;?€™fú´šÃíå• 9ÂÌï#bŠböq,rÉ¥ªÑÑrÙ“{µ°0˜w |ç{T.˜Z%aËÕ˜) 6eÏøèrû‹æ®á˜ÙyGŽˆ™ïþ¹äü²£M Iè°%1”kÍm ÝâŸf²é´Kæ«hr÷r]®ù±L•¬ð¯^¤rÁ5Õ˜)À›2=9Öi/Œïm´Ã‘×9ˆâzÐi ¯\o/H.YQ™*+I›zìbvll%ÙoÍÖi$ª`]-LÎU&$oʃÓÿ¾¾ò­Ñ›ìþtß}‹Ó÷->°{ñÛ_ûô›£K"—Üj>"àC†ĦoÊ(/ÍìèÔ¹FêÎ9&’Ã1»å?qä ¹¶[eoDÝ4–2³ïÅ®[ñˆ3xS´¥òÔcÓ¤á%*ÀG° -Ì<|ØTÕ% ¼)À›Â çn|üVÏ“Ýä3Ô·[äÒ?Þ+h4$JT‘—`¸H+‰D]&eÕL;$‹rìÙ‹Ýâð3)\”„\þíÂ+ߨ‘f @^ü•w@LºŒ²™ÎLÞñš¼ñâ,9"vä˜$-ûþ“Y¶3ÆFH;lÄ€vu$‰\ßz´B­\Û_m·{ÖnU>ßÙn˜A0S€7elæô®þøO~ÿë»#u·Ü‰?ûoç÷¯ÿýÐÌwo~úëY½‘¡7ïÕ í¯vÑ…‹ck¶‡Å.fä`ÙZ’þ²—óW-msètJI-ÙÜÛo ð¦´ÝØÛï\~îÄ‘fÃŽ=Sà\«9$’×.Ì>°×˜“\Ñì_­Ðر¹Üíµæjwÿ)ÀGŸu6Šé˜1}›¿¢,•˜éfú\½vcjrÜ9 7¸FMÎTs.p$rɽ×_íÂ:·Ášd”ŠÂºbZ᦮ŽoëÔÓ—‰\eeñ¯¤7¡³Ò ëqÐJÔÝ < q–¬%Ê1kÖŽ,=T…óÜ‘ÖЕtK‚7xS®-,=:{?3ùX=E’`9hÏxëÝùOMM¤¼Ô»‰µ³åHH*êbª|iŸ`ì€9ë~ª’Y5ëŠ]m=³zŽa_Îà´w ³.ÜÄ,Væé^u%º?:]¥™bSÒÏt—ÅÏÛ»[ÍŽ§ZÄDTóäc #Ž<‹\r‰&2nÝ—×zH0ö½+°`îŽiŠt£´ÖèùÉFKRÚHÒkÕ“´²'ŒÎ ƒÕ U7¶±7xSÌs—[·Wëõ¡0òDç8fŠ|z¹ä–3K¥@°…]¥D ÕÇî ¿ƒhù½$FI¥ÐjÔ®›óÒÚ=é3Ìôi5‡ÛË+As„™;Þ;GÄÅìãXä’›ÑàèÓ(º‡Zˆyײ`‹Ì›²g|t¹ýEs×pÌì¼#GÄÌwÿ‰\r3¾JKÅþRS<¨3iÎhËBWϦÓ.™£¢ÎÒ’µK5ìö}õ™Ý°ÚÌàM™žë´Æ÷6ÚáH‡ëDq=è´†W®·$×|ãšÛ&k‰êK[‰m*eÕ©¶[gÁºZ˜œ0!xSœžø÷õ•oÞ|`÷§ûî[œ¾oñÝ‹ßþÚ§ß]¹änÉÚnÀ¼)À›2ÊK3û:uºsމäpÌn¹ÃO9h¯ífgÙ¹55îŪ;8#ÌàMÑ–ÊSM“†—hûøãŸþB`¦ÀtÆñrù½)`nnŽªÀLÀÑr%xSxáÜßê¹s²›|†¶€ßýæTB öôшrìÙ‹Ç~þ×þìÕÇOüöñŸþzîø¯æ~ô´È©Bf ˆM¯É/Îþù¥¼yöÉ7_þåùWNŸõ¥ó¯¿,ò¾XÐ]÷ ó†Œt¿Œ0S€7elæô{£g=ýþÑ“þÊÑ“—%}±yVä%¼;•pSÐ;'$¹J¨³¨05«’F±Á1à@l ð¦´ÝØÛï\~îÄ‘fÃŽ=Sà\«9$’×.Ì>°WÍIÎo£Ø ”m*zI\½rnÉ; kÍåm0Ôw3¬›rõÚ©Éqç(ÜPà5GÌ5çÇ"—ÜCSCXl>‘$ÂdUû¤@R^ %­«gy©«bÅé½ €¾Lú¯†Å4àÌ&zf¥ÖãÐSŸ® |ç{T.˜Z%aËÕ˜)À›rmaéÑÙû™ÉÇrpè)’ËA{Æ[ïÎrhjÂZ;5I¯“¬ÉSvóÑÂu:“Ä–Åpd·'´?F÷S•̪YWìj3†Ú¸×Ӏýó"U –¨)n¦oJú™î²øy{w«ÙñT‹˜ˆjž|LaÄ‘g‘K.ÑDqkÀx5ZÆÖzv,%D×îÆà†ÀLÎõô¦˜ç.·n¯ÖëCaä‰ÎqÌù8ô,rÉ-3C» LµšÜUJ üø@@ç Îôi5‡ÛË+‘çÕß½+rtâNäE.¹;p ±6›*è6Ü*À›bSöŒ.·¿hw䈘ùî?‘K®^ªC2‹‡¬¬®;VüÓL6vÉ­¡NÂfÍØX¥GÑ3Ìô™žë´Æ÷6ÚáH‡ëDq=è´†W®·$—*®Be›„œ#24‡-ÑY¶N°5Ø: ÖÕÂä\f>|éï•ÖÐŽ6S€7åÁé‰KW>:öÈÍp×—¡Š9‚¸Q‹?}efÿ>â¥B~û3Š‚ê‡À‘sÅV¼)À›2ÊK3û:uºsމäpÌn¹ÃO9(¹Ýù<(Xʬø½HÝþ1`¦oжTžzlš4¼D;ðY'ItÓºŒ.ß•¬»\“¤”Q`¦oŠ h{¥7ë -éžSlõ ÁLÞ^8wãã·zîœì&ŸI¯Jähçc¢¸aaW™¼)b£{ö"E·8üŒÃE %!—»ðÊ7RÌ&rŽ<+çN·Ég¯(åXÞ xS”×ägÿüÒÞ<ûä›/ÿòü+§Ï¿úÒù×_9¥³ºZÞ’eÅkWË;nž‘‘[Js›ÞŠ@Š3ÌÄÛeí>9Wî)Y;²8T¨†eóðÿùj–Jº7xSÆfNÿáêñä÷¿¾»1RwËø³ÿv~ÿúßÍ|÷æ§ÿ¡{ðȬ=W¶ø¼å*'ñê®ÎÿÚ­0myU¸‚Míaa"gÓUÊ"EZ´{rƹ2{r†YZì»O<¹ËœQeºéu—½•üãÉÎüè¼)m7öö;—Ÿ;q¤ÙpcÏ8×j‰äµ ó‡ìÕs’‹¿wõ~¿j—"•6Þ‘FÇr¿'´9¢zžÖ¢.,œYå3ÃêMl͹†%G㮄iÕƒ>)=Œi¸¶m-}©åJ˜vyFIUl‰N÷ÁG@‘=}®^»159î \£&gª98¹äšžsItÑèë2½ß"LI™ÙÙ5±¤E°®ºxq„õ•¦3´jvlíRÛ(ö‚ýŽr uþßóIÇœKúÉœÈÕ-düX *Ï+¥p·Ï‰PU4wÒ«^Ž®Þ”´n.åñYýI²îUFW1‡E_f|L)ƒf¸¦ëêZUŦèCyG@)ÞàM¹¶°ôèìýÌäc98ôI‚å =ã­wç?945aí>cÿY¯Ë¨ËÞ^ íÒX—HlGghøLJÇTë%}‚±=I½ï.)É]IVͺ‰®¶žYZóF¢}ƒ)n>*猣”rƒúqÊÙl.ßcJ²ìq³ëJº+­Æ›bq† 3Ħ¤Ÿé.‹Ÿ·w·šOµˆ‰¨æÉÇFy¹äMP*úUÔóÁå‡,èF­ø ìJ¸µ±¢®P7tÅ>Ý @JÈNÔf ð¦˜ç.·n¯ÖëCaä‰ÎqÌù8ô,rÉÝo K%,ŽÝh7Ÿ]¥ ZIŸÆmhY ½ê˘ bSZÍáöòJäyµÃ·C/ÇŠ¸y‘K.eF;TÊœŒÓ‡›V?÷µ¿­ûvì*j¶ð¦€Ø”=ã£Ëí/š»†cfç9"f¾ûOä’›52Ô.cÇsèZ*Wc7š»ºŽr(>ï:›N»dŽŠ:KKº—ërõ\'­PIòŽœu?ó5‘c¨ >¦”Ÿ±9øºçL½ùãŸþB;˜)`Ý”éɱN{a|o£Žt¸Îq@׃Nkxåz{ArÉÀÜñؾÔo¾Œ -7ÍFîžY†N•05Ø:‹×µ‹¥ꇥ%jN7Qðw¨ÓÅ“HŠ´’{Ycsss´C€™¼)NO\ºòѱGn†»¾ ýPÌAÄZÔüùë+3û÷/Ÿ0ªc{v âL‡2›üßÀï~óí`¦oÊ(/ÍìèÔ¹FêÎ9&’Ã1»å?qä ¹¶[„="‚²Ð½hÏG Íå-¦}€™¼)ÚRyê±iÒð•`¦˜éÓg¼)À›Â çn|üVÏ“Ýä3T3ì,6ʱg/Rt‹ÃÏ8\¤pQrù· ¯|c›™)€ßù•©U¶\™™¼)â5yãÅY&rDìÈ1IZ.öü õBÏ5->ÓÄ.o³;¦WñÇ$£ÆAçöÕ°ëUõOÿ_ÿ¼H¥d‰šŠcS@lÊØÌé÷FÏzúý£'?<þü•£'/Kúbó¬ÈÓÿ§,tÓ•/ª;Viô†º I®ª¬­ê’Pí:­é´[4~T%÷à£ð¦´ÝØÛï\~îÄ‘fÃŽ=Sà\«9$’×.Ì>°÷^s’‹/›6x3™µB{«^.œ[³]¾Â'Ò×-Pa€7åêµS“ãÎQ¸¡À5jr¦šs#‘KnúŸæ’XwÖ¾-)P+![Ç¡éf0ú¹%ËóÛ:uÇôeÊ ¥`Ž¿JÛFõ9A·+èÖõï*½iiÎü™ýI²ŒÓ}f›û˜TÖŽÞàM¹¶°ôèìýÌäc98ôI‚å =ã­wç?945AŠôÕ?»‰uB%1j%’R6=Nq{l],KÆ>§ ©î§*™U³®(¨¡Z±nÁêŒýp¦QJûeÿ ÈÙîsñǤïz€-˜)`¦Oú™î²øy{w«ÙñT‹˜ˆjž|LaÄ‘g‘K.ÑecI‘½–ù-giö”˜ÑbÞmöÊ‹W°»aWìÓµÿUÉjÂJÀÌÇå|éïe,,%ÙLÞóÜåÖíÕz}(ŒºÜþ¢¹k8fvÞ‘#bæ»ÿD.¹¤Èê‘HÌZºŠ.½EW×·_üÓL6vÉu––t/×åê¹NZ¡’ä9ë~nÂê|ƒŸ±«\ØÕ‘¼ž•d݇Õµ}cë"‹4J°C2X…V›9ýÞèÙCO¿ôä‡ÇŸ¿rôäeI_lžy¦Íu `nt,äË¥MCïs›ä*¡ÊÚª. •/ŸZ\gY-&»*VÞo ð¦´ÝØÛï\~îÄ‘fÃŽ=Sà\«9$’×.Ì>°WÏI¶çm·QÔþ±Fîf÷­§B{].œ[³]¾Ÿæ6cf8€7xS®^»159î \£&gª98¹äR/´/A{”¤„mðŒþ ¢«æÛ:uÇô¥1€–Ù—Þ„ÎJ)¬úœ Ûír¯ÂkçžMëæŒÇ§šÐCa¶h¸è6é1å|¸aàMÞ”k KÎÞÏL>–ƒCO‘$XÚ3Þzwþ“CSÙwíùj:‘”9a÷-IlAO +ÊòÉY÷S•̪YWÔCQ­X·`uÆÞh:¥is”RnpC¿9›Í}Lö¸Ùu%-"êÅÿôêw`¦€™>égºËâçíÝ­fÇS-b"ªyò1…GžE.¹DÅ-‰M_ =ûkÛðĨ^åÞý®¼x»vÅ>VV%wbXÉÜÜõ;0S€7Å»JéŠ5«ý ¡ Àåw¿yvˆM±)­æp{y%ò¼ÚáÛ¡—cEŽN܉¼È%— ÃKaäjÅ®[=F·+íR[öíØUªÒlàM±){ÆG—Û_4w ÇÌÎ;rDÌ|÷ŸÈ%7cXhýúUBåf/±cAЇÁêêVOltõl:í’9*ê,-é^®ËÕs´B%É?8rÖý,Ü„=Ôù?cWõM¥×9ÓÎf X…vzr¬Ó^ßÛh‡#®sÅõ Ó^¹Þ^\JE¿±T–YÑVeF`ØB}ic+Ñ#ËЩ¦[gñºv±ô Q½a²’äy3æ)».þ˜D’»•D¸Ã]20S€7åÁé‰KW>:öÈÍp×—¡Š9‚¸Q‹?}efÿ>⥠…†`Y ‹2Jhbf ð¦ŒòÒÌþ‡Nû`¤îœc"9³[îðGZÛ­ú@,Vü^´ç£ŒæòÓNŽþÀLÞm©<õØ4ix‰J0ÓÌôé3ÞàMá…s7>~‹²s²›|†ªàMÞ±QŽ={ñØÏÿúß½úø‰ß>þÓ_ÏÿÕÜž9UÀLÞñš¼ñâìŸ_úÁ›gŸ|óå_žåôùW_:ÿúË"/iJèÃ!ÅÓ,¾P¡ €™¼)c3§ß={èé÷žüðøóWŽž¼,é‹Í³"Ç»¼XE[U³--ÿ*¬µj£·N0ïBÉ ahÞ®£›¼)Ôvco¿sù¹Gš 8öLs­æH^»0øÀÞQÌ÷ÙšYÊÆ¶ºö>DI±¦ø+{³b.œ[³]¾¼)À›rõÚ©Éqç(ÜPà59S͹À‘È%7ã_Éú•©ÿh6þœUú –NS’Þ„²Œ*ƽ[/?£€aëØhŒ|ŽÑØÌ læÃxú–$½‰ ý¢tŸUEû#€7xS®-,=:{?3ùX=E’`9hÏxëÝùOMM¤ÿ¡¼.‘ò5v-¶«$iS¢k©j%IÚÞlHWW˜e¶hs`Ý®!·n-I#ßÞLæ/A÷S•̪YW\–Œ¿¨ÜþÝ 60SÀ*´égºËâçíÝ­fÇS-b"ªyò1…GžE.¹Dz;æ~O¬i¨<úÄÞ2&‘Û÷ž~›EŒ©ev²øÐiµjѼýRž©ÝR£OÌàM1Ï]nÝ^­×‡ÂÈ>œã˜)òqèYä’»YÑ v BõA$¶ž|n!cª¼Y»ÛZ´«”£A+)¡"Ðj·—W"Ï«¾z9VäèÄÈ‹\riƒÎð%«ïÝîU‘‰¬ª¡œBlÄü/ À›Ø3>ºÜþ¢¹k8fvÞ‘#bæ»ÿD.¹›ê`·C,u„Š™ÐØJRÔæh"ÇhÌFUHDënç«®ï®ø-dÓi—Ì^1ï/*ÉÕs´Â{JÌÀôäX§½0¾·ÑG:\ç8 ŠëA§5¼r½½ ¹æ´Ùb6ìï ‰Ð¾”´–èb¶e‘½ç£‡9rmµö(JŒ[ȦÓHdœÜ›»Ûöf àÁé‰KW>:öÈÍp×—¡Š9‚¸Q‹?}efÿ>ì“lOÖàÖ0,Žf `”—fö?têÜ#uçÉá˜Ýr‡Ÿ8rPrÿ{wlƒ Pôa°b&°*+÷` KG°´p)+tZ*-)Ôä‚1æœÚ@buy÷'¬IXgÃ¦ÚÆý˜¦È@¦È™È™2 SdÊ#~ S²x)2)NHÆq¦‘l8^Χøx²w‡º CQ€/ oÉæ6Û÷™˜œ­Ãub@ε²s%)ÏW"¡¢Ü³ñ}⢊”“?‡ÂÍ·\Û¶‡ýïêùµHÊ”ýÏšrüO×’‡QºA]×—ëç—[NW(žFÄPSüˆ<‰&_ %”Í«y<›€®P6S@¨)°~yó&`›"ƒÔt°M‘AGj : ئȠƒ5lSd qšãП_ƒmŠ :.PSÐTÀ6E¨)h*`›"54• °M‘A‡j €mŠL¨)ئøZœé sÀ¶)²ðG5åO¾þa`›"«ªJƒÅ8ô×¾íÛî~º®kšæÄÞëF ƒqOQx`ƒµ[Ç}¢Û:vèc0022Ò }˜N`ÉŽø®V[µ9;÷ûéT¥ŽOêwBø_çK:TÁë“»‡_3^ÎŒÿä.ÎφgÐTS 1i\_]ÞwjšÓ4 ÀE8ª_wp§ ¦ðçß«=à¢'Ãá€Ý1Sô¦ày>CkS Ñ] ¦@~(ò 7@LS1@LÄ1`|À#.bÊ4MCƒ1åöçÍp8ðæÝ‡ÍÿýtáâKîòaùgÞðßaUòæ[hwúˆ)£Æ%Km€Qã’’¨üÏyq~6¼4\ô@æH¯Ýk̯¶~ÑSÀ³X¦äÓ”¤lÑÍç&¦àòÍ4M»Ý.n<Ü7’ÇÃqÓnÝÌ= 9[ÄJcEqÎòlúÜ^°v1û(ÿ-ÞÓ¬l<Ä‘òÞpÜ]D+uŊœòÆyæ|jåÚÇáxûþãï߇&xÊmYª÷ޤ¥z·Û¥¯]tÔæí¢ô£†¾œPBEyN©}š¦üäƒ5+¯ÍékZž7¶TÇ“\©øÐÂvB^¿ó =^9û¼l¥Ä¶ÐúÌ|knzå5»ëJs!ËŠ*ïÝ~ m=¸OÃJoà“°ÅFâFBL=躢ñPkvee¹‰RŽ;Ë© ÆñÕî ¾•Ç7X{$¦ÄȲ±FÑe9ÕãxI«|2 ¦Ä:×göq'|»Bí ¦¬ÐmZY³=n»Êm±JStÔ¶S;§§§JSZ×W—Ç\2¯†‡SF]<” bŠÆ¥F€˜¢qiÛ@o €˜ˆ)b Àø—};$ ¸x“b"Ä›X Äú¿çÅȸ?»uHAïÏ79±>h(€¹KqoS’¬¦ëjÊaïŽq†¡ [UoÓJíFWߎ‘c002z¤•Òó¤C$Z9òVô¢§ïªº˜Å¿Ì‹èÞøGfS™ S™ Sd Sd Sd €Ld €Ld €Lx.¯ï%»év-¼¼íJjµÖãaŸ!S`žçÄvk­¬|}–¤NçK‚Óè¶íüöã™M)€L)€‡§ŒÐ`ŸžnWë'S Û­—-“‘5Y³ÀËýáÀìò×m¤I÷r|}½á«–)˜Ÿß’‘)_$¡d €/}àt¾”­A¦@­U–m‘L€Öš,‹'SÀS9ÇþtŒÐșșș S™ S™ S?=øÃÀ0 šõ8ŸPÝ€oŽi`€MÚü«"¸àhë'p—¢fÕ™hIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-03.png0000644000175000017500000001016310536106572024553 0ustar gregoagregoa‰PNG  IHDRµµW¿ö>:IDATx^ìÅ¡@QîŒ+ˆFQíð_y:]ò<Ò®eG @ ºÁøó±¹&§àžü’$×eçL ¢8Ò8þUÏ༠"Šw”G¼¯¼œ»&¨‰GTâ}³&ÊjbŒàˆ$ë‹ÌÊ «Mˆ÷eÍz±Ï¬‘™žQ ó5…e§{&`ý(?¿ª®²èÃÿ«ª¯»ô4“uî(àp8Žžy=^Þ •€Â…[þ·lXžàÏC‡buXŽÕ¡Q6)ƒ¨›Øèˆ5Õþ®¬"ë×FG,ÿ1ÖT[Çj¿š#ZOÛš5f'nõYÍŠ^y±¬ª‰·ØÆI1ßê-Ö^UEoV¯ž¦Žµ+Ï\ûiN\óühúµÿÜڿŬËZnmÝbûÏ­ý´åmvD=õ¯ìÀ-¶ýÜRû{ |ê"ÓG5ãzDBÅH8¾ª9¿‡£×ŠcöÍX­@tXG@-è ÑB,Ô…¶ó;t9ª%‡3ª{#¨0ƒaÒêd•>jH@P :AO5©’Su…Ãáp ®|‘œ KEqmì<÷/½×Í1høŸ:vjÛ®}3W÷úuê QÕ„šÅÕÌåW¾U/üpð]L Ãápô …èëè„E£CZwôÊ7–ädå_¿Wl6ß7‹&I(!zs©ŽRÜ»´4l?ÿ;¶´|n T=Y©‹@AÇ!+œùç<´]F~rdWÚç^Q•g~6 mðkààßÛ& ôfͦnvÈäP»àp:÷B‹o|kKÐGá¡þMœŒÅ$ÿ>‘Ìf³© Q&Ñh4Õ$§ºn¬IÑå h}§³8àã§E¯Ålö_Õd¥-F08Šžïù} 1]5ŸÁ“âéý«ep8¨ƒ(ˆ˜ÐQ‰£CúX§ms7Ðé ÄR©äT_ïëëúàþ}3ý‘“¹ ¿´à{üœÍüÆþo£½›õ1Z×€YhóϯEë8;ïûÐiÒiÎí³kÜ;ÏEÿ§3l´ž]æ¡ýñSðê¾ìqýðûÌ÷~Guô¿ßü4\Έd¾_Ø{h/XŠöÙ+²÷/ñ¸ìñ}Ê´†­F{vï|´A#> ‡N%ŸW×çלÚ3tq-Úã»g¢íñ’|qŽ~!_¨^¯D?EÎ@ÛûÏ1`“o§2¿ïØÍÔÉH˜Ä ÷¢=ÿ+0q;óÓ¶ÒQd¼rüø¯Øq¬Â°©;ÑîÝ8Œœž5—H–›`âä\÷ó«bJÖôì¼óyâݺOֺȹ¡ÙÅ¥ÔÃ]ðòjÜ¡H(Š)6¦_rbh¶ðb4ÚFÏF4*SÆ‚ÿ¬›ä[CÛgeqô š‡‰ŠãÿOÉŠóL×Ït“èæ “ÙÜ£+s¬ÀÄıUŸ¥Þ}de¼–ù(¸R&ŽmB–µ }W%޾ý–ûõ“+ç|Í$P¡ÒàüºËókX¶Û aBçÄ?fMp~]Aq ÛwL,:wNF›Qfû…oÁDÅé?~›œ&lCÿö‰´Î¯QAÁ¾Íáh‡NI:5”McÙ¡Ó1¡óÕúס¦Áá©r?ÐK}òn}yM,Àé´ˆÉhMÆ"£ˆÖ(Ûâb©›kâÔnb?TÆG×éøÑöü‡U=¿¾” püH#÷5:~|‚ápØà‘N´×G¢/,4v÷tw+u-)-AJKKŠÑ  ™EÀ ‹,PS5àø‘½k_EàøQõ1Amâëø7éˆ{¢…’ÃC4èÛ•HÁR‘>'·0´¤¨Aöõ“{O|·;3#)}ߎÔäØ=»¢w%}˜äïhÛ‡Ãáâ¨TI‡Ç»ÿèÒ°^'?”¤¾R$E“h2a$»ES_/6ˆ2~­y¹m.Abˆ†Åg!.fbˆ&ÿÂZ°†hp òÖ™X|¦i×ù¸YñM«ÞKq òúwï[ŒÏø„,Ã%HUˆ¦a9.A*ç×íûcsËt´CØR)ßï!„[…!šs)óA†h🡅'¿œÍâ342ƒ!L¿]yŒÆW|¬Åg2?F×7†ŒÞ„K‡§°ø 0ŒÝŒKé;&±øLØø­8„TM±¾‡¯ø°ø +Ç .Abˆ†ÅgjÁ€šÃWµ%ŽÆ¯u A\Zîðžž>ž­½]“_º! (yõÝ\š6mæá@€ÊõGíwþ48ƒVµ,è0S5‡m8›ÖaxÍeuØäÚÚ´·yÏÅ´•Dªö§hÉê`pFµ‰•HÕwþT"-êB‡ÁQXª=Š©Ý'ƒ3ªª48Ãz£©ýü%RÛ𨠚}"%RÙ/­i·… ‹Ï¨¶ ÉrìýœQv„ ë–9=Щ]p8öã3@$’rìÍ'²z·méC$‘õ„r[½áp8üpðÔGè% »@ ˜!z!u0pbª‡c0 èµ[–á®< …¨¤:oÞÃáp8t?žÊëc­R=‡Ãù•;´ˆ(Ú†C"ÐLˆ@"«o)Hq „¼'šNðEEŸ¼?–mg[¾„¡Nô@ô@ô@ô@ô@ô€±óßä2O w33ª_VàbïÜq­†0Ìb1 Á©` ”läì‚ –AAII Õ ƒ(ÀÂÅDù…ç8seG£ïÓ••8~Æ7sÆÎã¯,]Æñó?Þ®¨1Ÿ>Ÿ¨IHi‡åŒFÛ¬‡&´€õÇb7»ïß½i\ÀÓ3ÀB™Lxùë͵»ºpz¿Íq`érÍ8®øýçÑÏï_« ©ò‰õïF£pœ `>®¡9˜›]=ÔLl&U³ÜR”[õ&™3Ãõ³[šºá¤÷* ô]F$÷¯ã“YÛ°Hs3õP ž¦&Ðøÿ¾)MŽvx»Z¸›±7}#£lû}oÔ §£]̶ágÜQW¼ðôΔö.b°öÏårÑ%ȇw¿ÊâcY‚ ¬'F2Zz›qï+\}®Œ±†¬?–[ÕÅnŒã@'~ñóÔ‹õÝÀ¼Ý…¬7©×®¢Ätزõì»qHcêî:£S”W¯Ÿ^6´ZÞÈØ™Þ?“ûú®À]¹Nlvìc6±bÃ$¸W£¿PŸhìðÅ&b,€õGnÐeìc°ØGì#öû€}ÔO™ÅCBB£Ãû3èsðªïÏÄõ¹t8€W Ðçò‡3.G•X!K³ŒÆ™SH›Jç??ès©~@ìŸÆä¨¤¨< YZþt㢒Îv[B#+`‚Òœÿ½¨ÃÓ>}®óù\ÂëõºÖç*áf˜ãƒj%HL>˜åégßb‚$,YÓä_Ä4ãh}>×íjY*æ¥1)²ô3æ‰1”ÝmÖœÒzÚvïæLkÔ]ç¬NQš³ÆÏw à4Ø Pá­FL@+•B–fé—óõÑœêÿ´û'*2ßßݰê©Ð”ÔæòøØÇ:­¶ùµ/ºo»•²B'MëònøÞ™Ú”éo^wæ+Íå¿>—YFÑçr‡“÷÷¾¬Ò-ø€~¹ÅN.!®4Çú#ú\ñŸMÉã·D]Ècö«¶-ÁLÙô‚ÐçÒ5憖+Åå.ÀçSÈRëoa¼Í;†C³K² 9ð³k]˜ 4gÆ=©ÿˆ>W|ŒymK—ÿÓÀë€L¥Ñç 0˜ Ç|F“ï÷&¯µÊ³5ùáœó„ÙX`ùË΀@H÷1ÿd48S¼£0‰À"ï§R²8£?.{wˆÃ0 C4ªz›‚Áâœ,t¬=FAáàèàÀS6 „Mš’Eï è«¶å¸ì?è?á7Ô×ò@>0€r¤k1Æü°·|¾[éx6]ïÿ±ü”†)¥ji¨¾Î÷›ä2³ùX\õjp†`~ ä㛽3ØM†Áp:Mâʃì°rÚq¶GÛq'Øa²7`ˆŠ¥êG‡dànó/®ãÄv*~™paCÄå/KôGhß]õŽ[á¿?‡æàÁžLzÔïŽðŽÄø?·áåL‘Á’ü=Ý,qù׿߃:ì“+²±LãAÏÆ–ßõÐÄâÙ§ÔÚØnû~C6¹e‚sŒ3Yp,bε-¹ó2~{?éNIå>õ›“f{ÐäË¢Üo‚ÀËá…¶?v›u€£öÄr|¦´^6?>C£ßsŒ)Và:’v)ÐE7⯎³Fº› {Û¥UΖæ¾Ùs Ë#8ÄŒÊ÷“–Ô¨»¹™ñ¨s¯F`_É3´˜5š 'fÚmÄ:~­© µÅÑa ˰lØÞÍ}¾4íëè’/&ÍDA²M~ÌåØ ÿ¦cÓUr€S²%>ïæä’.h°|Dã¹±<-éåI9žÏ\·*l¬€Wnv³ìT5“¥ fŒ¯ø¤ŒÚ‹pâ©Åiz~B# 8 ºkwAè,ôÜòP–j.-ç¶‹Ÿ²ioY~/¨dÀ…ñ{Qdà,'ša&5”ÿ?êÒ@?‘àÇ+jÊÝé'à‹P.ÏWï@µ—ò\(SYw©Ó©XP,Qlš´Öbqôð¥4î úÈ*ÆúÈ¿X ÐG}ÐG}ÐG}@ô@ô@ô@ô@ô@ô}ÐG}ÐG}ÐG}ÐG}ÐG}ÐGô@ô@ô@ô@ô@ô€ó".¯o£wÛÍ:¾¹¸º‰®µÖîOÐG`·Ûu\Ša¢x{}ŽNý_=fýÔ^(g€>è#€>.'˜{Áßü×OŽ”íyÏë—Spý#ˆãv³®ÛedžóJú‘Ïíé,Ž9ž3ÍÝ©)»ö°þÚKÉñƒ‹k}œ]©‡è#‹©^ßiýùó°Üë{@¿ÙÁ¼N•×%®A"s»›UdÎ+wsdò¨rÈBÏÏãY,۽ͫN³ Nìþ¿ÐG}ÐGŸ/„Îoµ>­5¯#ô†ÁëÁ$}'ö¯|÷)ÎÏè#€>è#€>è#€>è#€>è#€>pìÈ1 àYó½'ÕßÓÀ ›´ùWEø‘ÐÖ/áºÒdÖixIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/favicon.ico0000644000175000017500000000030610536106572023561 0ustar gregoagregoa°( ÿÿÿÿÿÿããÝݦ®º¦º"ÝÝâãú/úoýßþ?ÿÿÿÿlibjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-08.png0000644000175000017500000002461310536106572024740 0ustar gregoagregoa‰PNG  IHDRö\BÞ)RIDATx^ìű Aã*”FT* ÄòלN—<à‘v-;qL ¬~:0¢ïƒ.ò«ß Iöaï|ƒãªÊ0þ¼{ïn6›&ib+©-Õþ¡ %Áòg˜Q¨ø‘ÑqÆqÆ/Ž£òOÒ¦­ÐÚ”Týàø­ãq>ˆ"Vt”E±-¶Ð¦ƒ@Zjhš6éîÞ½¾ëIß½½+aw›mIæùÍ;gÞsæîÝs73wžœ÷9÷ú®³ï.L!„B˜vB!„øˆpÕ­;pÖˆÈÿíF†Ï±ÊÏ ®±nÙ9šà+ÊO""eãçpþÑ3X¿œøücãõŸ¿u«š¿}$~òjç_ûߺöùÛ8jŸ¿ËäÜÌ_bãµü­ë?Kx¯¨lþ¼Wð^Á{Eí,K°ÜÇ»³sÇñ^Üø¥Ÿâ}!„Bˆ?¾iìËH·wää¡imK77766½}ø¦•+v>Õ;¹*‡B!ä W¶¢bV­Zõ•íW$qTß\t¬/çCÙ¡·Ú:$B@Œ %0:4ðÕ[W_Ò"¨„B!î…úÅãOVºŠ£úfþ©¾|„‚̬Ž|ßÇ OüšZÛò'‡>÷ùÕ¾@’˜2B!„…ªþŸ|ùÔ‰p$'A(‰FijL¤›Äó?…cxg8--He`œ8ô#D˜±ð¨˜c/ÿÀÌ%w 2޾ô=XöÍØø‘=ßE„Ù]w£Î <ß`ÎÕÝ®û¯ç¶˜{ÍzLÿøãý–/XµéÐ6"¢68øôDX|ãwp&¯ü®–|ºS‹B5›ÿ Á´¿?!]+ØÃŠ£#UoŸ9[:ø »’—_“ì\žœ3ß›1S<¹BË3/¤10ˆM ¾îÄÍHßQ1­KîÐÀ$1»ë[NÜÙó0Î-¾º[“ÊGWÞ¯\xÃ&˜¸YôÉÍNßÄ ²Ù¢àå§ÖMç‡"˜6ð÷'ĤŒÊš˜¾©eç‚Î È"—-ä$aBZæ…™…2<¾ýóðð`xl$Ä„8¡Ó¼è¶ãkY|€á•”Í¥·ÛŽ­â¼£ÝÓ´uÞé’ÿìû¾ ¶_vWt-g–®åLÈáݸ`ù=ƒ»ÒÀàßÂi.¼b €7_܆]yŸKÞøËƒ6xñ'Öx}×Vóu¯ï꙳  <·Åé›è*Nÿ³&50ïÚ .ùç3›mð’ë6âœ!g,á¨ÄÑXzS€ýO®-‰â›·øûoîC„eŸÙöү׌ç·lsÉÞ'>»u†BUŽ* ëÖøß±ŸñCñB$CI 혵B2 äÕ½…?ÿ8´¿P8¦• ú€é›–Å·k8öÊ£lýÆôMÛÒ;5 í{ÄôM{ç]*nL߸B•Ó7• ú€é›Ž+îÕˆ‰› ?¾FÃ)k?tÕZ 7Õ7–»B•†uMß̽v½€ön6}3ïº *nê¡oþ~ƒÆëQ1û»ÀÒ›·jØ‘;—­~P€êU9Åü‰5¦o.¿e»7{~¥ÝºC!„*Ç’Ú½8 Â<šgÐ47‘K vƒ‡ÂìhØ‚çAr0Ì‘óâ¸U"¨¡ý &Ì‘c^ûR·~Sÿ~a+ÊÐUœJ®¨¿7^32¡“8¯þéË?rý·ñ^ô=½Ñ¼8ÑB•=4)*t.ýÔL€-ä¼_!„Bb…*U95J$€1x)HÈÝ ½†#hnF—?”{qDg‡[ÂQ 5zq&±ì–p”.Ë-á€[¿±BÕkÏlŠªœù*kª™´3âØÉrÇq%·„#˜B¡ãXsS9UªDÄkƒ×ÂX0ü|öÄ y ‡éf4#“FS¾‡”dBLåh༢.œ©¸©ŠBõMÌ}\S¡ª=Ì cû‚ì‘ÐË"•AB‰Q$ÜÇ|HÕ¢Žcµã x4j7v˜ãXí8®PeŽcuá¨GÃìÆêÂQ¯±ÙQ |ìµã¼õâö¨ÝØñæ_·™ÝصjDZB•9Ž£¨ãX÷›ÝØÆÕq¬vW¨2ÇqÌk\õŽñ•@äìÄMwlÓ¸:ŽÕŽwOˆsá¨GÃìÆA!„BŽQ{¡*x- %€Ÿ€ R'4" hÏ÷ À;£D…æÈ‘˜Ê‰½‹«\唿îKUN´kÅ‘òU\~·tLåÄ^­gvc«ì˜Ö±®ˆ©‰ym²N刈S9Ä Uö¥•ï·Ø£qâ?sä&@í8‘H¬Ju.cËEĶSEUŽMcÊ@!„þ ÇB¯aâ'‘oF‘ÊhŽl£IôüòÙ³|A•m×}UB!„‰ÞÌ`Ôn7ÖH$QÈ)øY ?‡B JÐ/?›}ãÄ Î#V®œw!„boÖœüU.;wôbBº¿†:½`œB!Dß^BÕÔ–/„B!þÙ»ƒ•†a0àQò6 zÓ§ñ/>‡Á·ØÁ£Ç ÔS}‰,I‹´C~?Æh¿~KwÛŸ,mï«‹PŸ• ü‹Çˆ8"€ˆ â"€ˆ âˆ8"€ˆˆ8ǧçéÕjÝúGˆÛŽ÷ñ9ÌhçÓÄòM®§8’*i·ut­ìI'Jïíqr¥üz±{¢%g Z%ooTª=Å©qÚbçr™é£±©9NƒÒv/@Ä)ge²þäÑ'MötpEÕúï¡e¯*—òô˜ÅÉ)'ï¦JÑ“¦z5'•=Y»ç×|…£“³·—ð–½`uÿ0 C s™m º›_À3ªD@Ä,7ŸÂހ˫ëéÛ@ÜþG%츻½ Ýq²qÃÒà‹½3X"°³,ìËxpo9ñ"x |/ ø:J|A„\o›CŽ¢g Ñ{Æ!ÓÃ|¤«fÊNwÚ*–¥»¦¦êïªîÞÚšf7ÃoNâöbAÚí¢[.~þW].§¡ÊDsO†aŸù‡SôvDµå“ŸÅqò„füºM¦¨v±òñ“ÆÑa°DîÅÝËÒ>üê—R‘ƒå4…sÇ”Êíª ôx¸„ý§ÿœœîø§&ù¥„2÷kDõÅh ¡¦Ç¥†Áú0©Ü®Šœ,Û¬Wq "'/í ]ð#òd’£/N#ƒ‰£%5Hx‰ú)¯·¢O}È_`”Œ%p;J&1.–H‰]ð¡Sí:Z™P :4²'aÌ'ãŽFÌÐÌÈÊ;˜yŠõ+Ž”úë¯â4MÓ7Ú¶MoÍɉuùa¹¨D8Åù8‡W•¨Düò„#ø*BQü´kÿo;R:Yt—à(^‰!.&m¨hF\$h­,]²Þ«òÜÓÏÈ 8-Û8¦ÛóõÈ­_HÊ2u¦8Í ½ÿp¶Z5××í³§OÚÒÜ»ÝnûÆn·“dõÚd…N~YØ‚Ñ4¤GK`ö‡JzëÿÊîâ Ì5$†8·í>,ÙZB“Ú}m.ØO*8,HIn”©6ÅùxöéÕË£®ýåë·×oNžH)NHDBjbÎo<­q?NV~Œ mÞm‚†Dh) ùzpЄÝÉ |ΣE¹}˜ßc‘ •OâŒ*¡=Д©ó,N_¿9>zѵ¿ÿøùëòrÿñþéÛwYšÒÓÐ_‚Œ]ax‡<ºàÔJ~ÀŠ% ¤Y–BNꯃ+ k'€$ž"òrNýظ:¸R*.ç–sÕUœÕªéó›«?¿7›Íz½î9 UQ%Q&ð;Τ8$) —(ÃÛÇ©ø½’iÊø™¼]p¨!pz;ZÁ.8²!?íò$)]'&4¡w2® ÚLõQ§œWðmú¹$;“«@?=¬2²]ÙoœTeÁI2ŒH»` -rûúá‘I™¿ìO‹GÀµÃBò5’ÓLNæ°H.#C–ø""x5ÇÜÌ!ÉÕÁ…‚½­qWÛeÌ)ˆ'e%xR‰ã30ö¤Ü­fžS¯§jº{§òû±4Õ5ÕU¯ºf·Þ¾zU¯V:¦½…ÍqøþætãqGÿ]¹råÈ‘#U®e+ÎÕÕ›G~Úë=1úM¿ßÿ«×»¾zã«/?Wת¤2!i¤n!ËHäSÕsFÌÚ¹Zs|”éàpÄžwå-©GlVEµŒ‹’„9>Xzpäd)§:šaAì ›9+ÎÛï~]SÍðÏÝ9~Ôä/²þ€šeµ$g¡6,½áWÀ(`Åi ~x|ôéúj”’½F|ãUà‹“ÀÌ$CºüéÖì/ –Ä¿µ•`éñ¦°™+N§Ó)Ÿßùá÷N6ÔJºÄÇÙ–å•èÓ(5‹}´‰€pÄžnêѰ}èᬠ0ز#à{ð­øF €ØHãñtvX¹–ÛU&*çpÕÝØøâ˜ÚÞNež¶µ…U8õÖëS>\Í¥´ôʼnq7&Ò8žL©uоi]Än­ri/çÏŸÿaß?aü±u«¦9I©Y“§y©ôbzô^ÔÿNÚo(öÕ5*N°~³r-·ú̓‡÷z‹‡—úÙDåT´¡Ó˜´Í‘zMì–Ùyî-oÒé§OŸvªœ¿ÛEÊ3û(½hóè’7ß5XqÌ”Õož>6??Ÿe™É©õ…†swÐo&SÝd#þ³WÆ$ìÕ}*ÊËO+Îåž:ßX­”9L*QLé¸%^þ€1QMÊ×é¶5îquô§(€¬VÿZúÀŠc´õ*5¡¢ÞÙÞîõžý¦ßï“Ó@‡›MûÿcV'K“PrăZy™ÖyãîQ*÷B–׫’WfeM~Y`Ò1’H ƒ†@—Ü?ú#Í)}h\aµZÙw¬8úµÄp8<üÉÇÝî²YŸÊ²ýƒÁËõKÇ‹¢¨»Ã€–c®ŠƒÎe%ÀåsdUŸw2UµY¾±…ÒÓØâ‘ß$`³‘H©ªÄüZÖ¾8NË1þÅÆÿƬOÅÐè7}ǸÝT@Õoçù´þ©^ÿ¤-šÛrzäV¯¡VÚo]bõ#]rikÑË»GRðãàtc£ÐEaü‹—¾8f®&-TE˱˜´Ìt9¥Ûò#JùtaS•K‡ÒÀNi9SLiÌpí ±>vñ´^-V]щó#–™º»±’“4h9b•¾IØ^U÷R[F™íDŽMÈú-Oa™/ERdÖ¤ ˜È+.Љ^ÇVe¯a#¢¤ºäeç€* TmútÌ—~áÀAÿÑ®ùÍ“§Îlmmì¨jÄÖ³`s}Í|Ç}cvþšßÞºU>Ý8ÏsZóV§oßÈ-eÆEþâ$€ýËŸ%£ ó |ÿÝ·â|¿–Ý3Ò6®£*=þT€ Ŭ»pâvÊp@âV€âkV€¶ Zˆ4®€ •-!l[H§30;£ 8Y*NøâÄyž7Ù°Iv6¬8NG=0þ,™_!ÄŸ ð{ç²Ò0…áLˆÌÃ(´]ÕE)nw">ƒPJEnó$Š‚ wîº)èªtÕ’®«Ð´º „ê!A<ÐNŠÌtäÿáp’¹0™‡afþ 9Ê4Zm NT‰„»ûNªQEªœ_ *y»íÆD.Â{Rl–ªŽ¾ïÛ±GñÐéž6É£ó‹KRåTWâd© û@ Ô@\ða͉ªtýæ¤yLöøí}†µzTÇÉ¿újJf§ÏŒ_r› ^UrðoVè ¯ƒÊÞ–ê2. #ÁÅ#}­†‹Ð0V¼BÌãÝ0?Íp¢ÊuEšßÌ>?¤”žç%%òÚà…6нx†{Xqk{k4Ûf}rÇxtp?$í4KÖðqÀ|Žýó‡òÊrŸNÚ3‚0œJ)£(Šã˜<ú3ªáOŠ# nHm±v!!9üc-à~³wí8Ã@Ç¡€Ž’‰!ñn@AÉ()8ÀJHmA§à£½`mÊ[û9¶°4£•åÏÌxlO´“™I‚j†•W¾¾~ò‹'“ÛÙìõý͕ӇéÙÉ¡ë/o§7Æ´ã³{š9?š:J§f¿¹¸?[€¾‚ñ&¤ù®›Š/Ì„>hæn0}œå, ò`H­(~?å‰0KÂÈm^Wãí®®¦â,´$(yè¦ø—áÅ) °r\~±Ë¿iž¨‚}3B@–ÓùX(cJWq ­Ät@C´¢„ý$nr-1û)Ö5T0Ьô jò¿{çÍܦAÏ(M§Çó¸ÕgjxŠ!…£­œ|ƒ˜ŽO`ˆ' ¥i|£¨Ù2·|ÎåS(þ÷«.K°˜$ÌüZ +öÍèL: §«:aúШ&¤:‘ ZÍsü`6“bg €}-$…Öeé#¶XgZÃMŠ–´r\Y9ÇÀÀžÕʦU@³EgýnÔ圿dN˜Èç9,K¢¦˜èc…¾Á¾Éôâ|³o…HÂ0Œ!Àíÿ ‚!*z—ܵ#±ëºdË`bw” ÑŒû}‚3 棜ÀÚ`6È[+Ì0i¾>-#­¥àQáKt¼\f@·j0cmÌ„ê‹W,×6 4’×_oçÓ3ÐgÀ“<g ²“‡½;Ömãž"xš ¦°öyŠ*¤.lV663ð Œ,•®U+Á„‘àaºÉR\åk}kbÇü~ªªÚ½|ç¨'çßËÙ­“õm¾XößU0]Ýœ_4M3Ü^_®Gc±.€ì“ÆSJu]—¬äÈ.e¥pÝwA…‚‡ : €1÷?£*ä¾Îz‚§mŸm™™Å –ë– “+Ç*þƒ»¿“2aFÁÈ ÷§œÈ­ÿ«€÷·4²äÅ•’KBãÂN‡ÀÑõ²Z­&q nî'â{¿ðá® à2²ˆPUÕ `bkqF{iÀ³Ùˆ8" âˆ8"€ˆ âˆ8€ˆ âˆ8"ðòÕ› ôRÀ'#üj¾=Uµ‚‚#í=vꀈ]hÃÁh_øË{ÀU˜Ôi¿6›÷Ú”l¿Çâq3Ìç›l‘°Ùþœï4{³Q0‹ƒI²mºý[o{u BãPb›øðݦjb‘ØKOûž=·9Kt7`+m”$¤¨¦ä ©|‘¸™¯7¢  â@È1ù6‡™UŠ+‡ÚŸwxR±H¨™«0)€µ8 úÃ^-g› ÃÓ4¯$0‹ƒ+ÆcPˆ;c›X-Œ{¢Ø>>üþfö8ãþV¶f昻=mƒcp²>‹ÍËß?¿÷4JW7gçMÓ̆·×—ëÑøØˆÅÅ矿|M)Á,È%Yó à* <ÍL3ˆ8˜¨œ=€ªªâûãÑ|±œí§§§Ÿ>~ø¯#¤”fe«iŸ­ôï«Y¨ëzVànö/p_@Ä?ìAnÄ E«ªÇé¢ìzÿUw颪T$Lógl &š÷#Çu~  ¨ ”¥‚«[dL\œŽ=Jà¼)\8ŶËÐPTdàXjvböçЛ€ãwü”TÄišVŠ›íÞŽ}-DÔž@µ‹—O?¬Øâw"ûøeïŒu¤†0Ì!$$ ‚ö:J Þgµ%AAÉ#@Hð0W-‘FGþ“LrI|—ïÓ)k{gÇ“\ók<Ž‘8sJ¹ç§â´g5#]jh®ª“űÅ]m·)q¨ùˆBÍßlly„­s‰TÜÞà­}HHjšC‰¡§Oà²ß¼ Ãw)?j@nÚ˜÷¦×xžpcö€,Åà<ÎÆ}ªÛå´K7c³ àë·ïÍH}ÜöÒÄzÆu^ OÍt|¥`œf¸½½}r8œ RfðícK™ígó|ùüiç€ZͬøxG¿­Ý13ñ¹wz`F˜:QËÊùàÙ°ÀÛ´Š_Èâ/½åz©Šçcª†XÞÏZF*0µÌÞ¸•MA©¥]e$ôPü q€…ª‰(è- F ÔCã:rýYœüt€Ä@mä6opÈ‚'ÍiP‹ É€ŒqÓwÁÿ€, h4Ùàu!^óaíÙ‡T»Oq’Æ=8¡OµÔÀô‡-ç=»NçrG­ðâÕÛm&bs¾l^CâëM™ãÁµê6l(êdö²Ô•k@0uò™Ç#±ï¶À¿??÷›œ—+²Pù ˜£ÔâPYg2Ú#›³ sB¼÷8HvTPûñÃû'$œN'kœÏgW9,TðÊœF}ªÛ墶ŽÄ>óÁÅ?ï`¿z÷g¯çñìŽýi׃–ÕWbÓdqôÕyoNÖ㻽„×À~l5Óñ¼g¸ñÏõV¯ºtŽÉKíX²Çºö•5ÔÒt’¿ãÇ,ʼnpˆã“âكú{2jÖì3“Z‹cI—)ÖöL5l¼4æÐÕzsû†@⨼ÃE”HWÍ ñ¹ÂúÔäÀÔR³îuK÷é6:…w§8Q?æ­8ù“•4Å¢zÈ»:î#÷u„–†‘ L-³7î_eRPñOVÒ7Ôât—jÉÔ‰'cRT®Ä[“ q€…ª‰(Ûè­ÔQ—Xûúr³5,ðÕ%“;>è UJeé OᨠUTð$ܦ ÚG³P+®K* b OÀ¸™6*Ku«6dqš¨ÅIs@f›ñ€îå¶DŽhë ±—n qâb—~i­WxÛ RkOîSœ¤qNà3°-…-Õ,ÿ€æWT  $°Þ¤ƒ:®U·aCQ'³—¥Ö̯™‡w6y`;5ÃÛ€E=ýÉöî7j °r JêíR¦È},w)Sä”\ Qp˜-Ð2ä…k†ÅZ9kçû´ÚŒí—‘h¢Ÿç»[!@Ä+‹§B«ýǶžóñB"€µ8@ìlÚØï÷ÝÆˆ8ÀÃý]·-Öâˆ8"€ˆ âpíáüiëÃå‰8`³zuø’sÎ'â}ßý–ۛ몣“0U³§©™•ñq–9ñãNÿ(Ç5yÜÔLëCÔ¯ã鯻n×­¤¤2 Cú®BO<‡0‡›¨‰dS­Ý)õS¢&×o¾‹sx¾w$ýì^Àêó D昬Wö#ÞQõWWÏ÷ޤ·Ý™€hÌLj›=‘u¢µ#â\4p×ðz¬¸uU¥Ÿ¸K-œ¶&Ÿ_ªf׋8‹w-Í›8SRK•~ªú¶¦½ò­ñgh­hÞ”3y0Q¢fò×_ϦqÐZ°ÜGÄ9vk:F"ŽÿnTˆ8‹ì¨â —["âûý¾Ûx¸¿ë^kqD@ÄD;ª€÷>v‹°9?6¯­?âÀñØívÝËüýYÁ‹*=\q•7ª ä˜qDÀŽ*°Ìööæº>œ?mˆÙ^˜.Ø—‡³õDÜYŽˆD†!Z/¹ã‡ñɇãKUÍ©½î铿ˆü1Y3®ìGž§‡4ŸUÀ¹ûžÚfOdÜÚiÅ¥ÉîQÏ$âUX©ÂG•~báp´pÚš|>´—Ú9C\­Çó‰8 yÓž‰h’ÓO[ßÖ´ç«KM}™0Û“q~±wÇ(qF³¯º­‹¼€)=Ê÷m]Ü€C®@âH‰H‰°d8€Ä(8@â2"@âHð]$ø®@âH@âH‰ q$ q$€Ä8@â:‡ì€Ä8€Ä8@âH‰H‰ q$€Ä$€Ä8@âK8d0@ ‡H‰ q$€Ä$€Ä8@â@â`¢;H݉ q$ q$€Ä88@âH0ð‰ƒ‡ q‰€Cþ€Ä88@âH‰ q‰ q$€Ä8€Ä8@âH‰H‰ q$€Ä$€Ä8›Ø&q$€Ä`YqÏ%»€²âž›¬@âH‰H‰ q$€Ä˜ò3÷wé œOÇöî¥ Àè ¹‚vÚîylìÒ¦L‘c¤H™n[Ó0‡±S~d' kDØ™¼GŠÍb~öc™hJé($Îýãsª ÌçóT€Ä9ìw©à÷€‹Ô‰H‰ q$€Ä$€Ä8@âH@âH‰ q$ q$€Ä8`–~ž^RVËEúáòú6կ뺆çúßÄ€¾ïk¿_¦cû]ªÙz³m{®Lˆ»fí÷Ëö9‹ q$€Ä®nîZضÄÀýû+Ùõ¤7¯3I®Q“ú»8è›÷·×ü:[™ðæ‘8PH„¯ëX©±ob=Ɖ·±RþL]Á”o;Ÿ·‘ÄH‰–¯ F«¢ê"\Æl;[o"q@œµw¾xÐd'n[â@<í¨úhÑ Qò¶}£ S>šSÇæs¾.î)*'®ëz–›·±2~äÁÛªpQ<ŽÀñ²É®«Ü|>Ká3“9ßÞøõšp€ºÜ1hãXñø;n qféT°ÞlSK8Ðun3—ÄÝ6í¹$¬– s™kâÇ$€Ä8@â@âH‰ qÿiü“8 a†õ9ÇÇÓV·àÛ`F³*F ö×ÏÇ rõ‡¼>IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-04.png0000644000175000017500000004376710536106572024574 0ustar gregoagregoa‰PNG  IHDRvÈäLªG¾IDATx^ìÜ[LeÇáwj—‘ÂZ¤²šnM++Zéɘ‘ï<Ä £šckå1^H/¼Ðô¢‰½Q mÕvEÓˆ`6ÚH¨Ò`¨”Ý–Z(µÌÎÌŽ¯~é4™‘ÍÌÎèæÿ¤iÞ™]&Üì/ßΩ±±±¼vy à|ô€ @¶1m¼ã7òÀ@b½|´`?1Ðv¼£2Fbno0~âþ·çbÜ€Éë²1çù—/Á¾ìØ7ÔÙ¤t½¾çmšßÇ>ÈðÄ>ÞüÁ^¬CñO=ZSclþØÝíUeúÿP(¥Ð=Ëlö…ÜáˆpeZZZLûD_261€¾òt͆‚5C­ÑÙY™ã’H(/ÕG®^ýóÒòÂßß4ÌÉØœƒ»ïÈB—ãÛßìäá‡vpes#Ö–äóÌ}±“ Þì˵<ÿ ›ŸóØø9EÕdYá9¡(ÇŽ´––oïñä‹ÒºUéßÝ»íµƒÆÕ6ƒ>3,~µëËZ‰TæÂʼn@q.yI¬_V¤—ªªÊ2EQyx r}¶®¸‹q䣴q;Zß‹Åsï4‹áÈûû6¾ÒAVH  2\¯û²ÜÍïüTiÏü¿Ë‡Äóñ˜.[ 2p0b«/H  2KêP¢2ä)¾¿.JžKÝ—ÌO ªg<p[õ‰ŽK†ÿI*¨62؆– $€ìعC+¢‚Y<³˜U'2€xˆ‹wÅò,|3ìÝAKAàW“ê'ä©.„í°ÐÍŒìf‹ · <ú'ü ÙUE„‚ö¸§Ø`Oæ5›¨,XÈ®Í( ,kBPíE|æû¾½¿ÌÌeÃ0"¢¾Ïƒmâ }³Ô©\Q!"^÷:¥òÕò».e‹'ÉçÆ=þ‰ˆ¸‹±Ú&â€ÀàâöæÅs'¾;œ¹ãäÌ;÷:„ d 9¬Òu]Žã¨:hƒ¿+íBĈi¾]ÓÚéÁaRìÇâTÕ"¿ÐëÚOÖ{¦e=J­š¨z«c…ˆS¯7îZ¾VÁ~0z³ëµ3#æ·ÜÏ]ßX’˜Ç°.!1ýØÃŸ¬ž6#fÁ®E CAþ-ÛGB ¡©Ä1u¹BZp0C)pœ%ëdt‡Ç’c¿àÍH¼ÙÕhYß÷mÛ.Oàu¨½ßQÂŽÄŒÑñâ+,éÈ׊ˆVLÛ¶æÞÆ¿@*p³†¸Âð/ŠˆR –M¨}ˆ,ÊI‡oDD)ÆöÊ8F"ÀT0£f*£Í¥?–a›ÜD*pŽ”`@Øß_™µ(Õ›‰(Å\œ¯ïïžþä3±ˆ(ÅÜ\—°FDÄŽvб‰ˆ8°S ¿¡iš«ÛÇ<¿nÎNò[¯&ÇK¤èºîƒë ‰"ã³çd–ˆ ÝƒVž%§Ò¸‡ÄB‚|°¬#ƒº£2(HˆŠN+ ,ŠÌ‚º¼Š/óÁH"0òO¾dD„—š„Vt×q{ê)l³- K³în7‚±~?–ñ›™ofÎùÝo¾owrËN`+ÏòIÝ•bòÞüà=288HrIKsŽ¢ÅàSG ² 8’j.×çYŘFýäÒtæ?Þ€o"Ù^È(é7â/Ü}‰Tß>>-¬©ÄâEeuŠÁ<ˆ £0k)mÆéíèB"„ªÃö™ïͳѩh˜Ÿ …“§Ÿw<ó³Öß~~âêJßþ^2éH6©’^ÅŸ}Ê™,3ã!ÄS¿¶ üà`Ö¢mê‰Ä̳EgÜ1©jY‚’Ò„Ü­b94þC]ÅÈ©„TÉjT[ä´3gVòŠaÆ6Wéƒû¯P,{.‡‹îèÅÆ©½EŠ*†DÑlE«$ÒNyjpæ-»TœAÅ€bôƒb?•û¾4W~‚LùŽ'¢}çÖ¡à€or¸3)§,Ýé>PÕŒ 9ã?wW‡mq:^½QUÅÐ*@›VØsUq| –»C,C8Eû Ì/¶JÏç¶ Èé®8·ÍßÙCÚ6L&a±À4/ÏÔ»¯®Øä¨È/Àe°ûZ¹Í4ÅÏNñ3¸”]35<'óYµ†þ„û-Øu;‹™œxbuü±ûqɇ¦EâÆíË]Mµk錽aßÎhΩÇ3ŽtÝ"9/&€Ì£¸Š¸~.&m¼mÙòoÉÖì@ϋܢRþë±¶'Ô YÆÛØã«Ï"CÈ;Jb,Æ`ÈšG‡› ‹À 2Ãqq¾]Iu„ÆÃž+/½vgªmu¤ÿ]Ó½>¹KkC–Ÿî¥ùeac1€:$Ô!°QšZ¹¥$!#¥êØ®„ŒL“%·´6dêY]†Q1¿,dF ðñ o”ZBøz/&ú|½õ…ò ·è(± ”¿Ø;ÛÐ8Š0ŽOÂI/_ôü`LA’T3ö¬üTJýP½àK ¢~0 ý`•Zá(1ÖJ¡T¬bCB©m”¶"5š#BÀV0DA*h©µÒØÒ4ieIC»WCâ–ÞÔ<—}Òao²Éý Ãìsóº³÷ÜÜÜîÿ†–x^…Ü‹èbÌ¡š‡ŠàbJUÁ€\ÀÜÅXËk}óuµœÈ*5£`f6, Å*f²¿!è0“Nzá¾²‹¹ôBÿ©ÖkÕ®Pª$ýÄmt d6Ø@·îÅVµPÐB= Rà•‹ìqÎv¼¸iÿ¹ÃóÃ}§»ý3|ú‹Öî­mÛ)ÑþþîÀ¯` ¿ãðCÛ“ðàbd¡ÎdoC]ãöì¥6×qgqœ»ªž#;¹•± —OŸ»ì%TÐØyáç(]ܵnVM©h‚B´âÉØªu‰ö¾µƒì´~iÞßM‰¦ô¾îo_†Õ¯aíêtÞÌ7c ¯–æó—|š`]ZT Ÿ¾ñCßœùk[1èÏ<³/÷ߨÂ3“%¼*Lº4d¹!ÜÀÕTù;§ÿ½5îè7·†©kíÚ°òƵ¾ÑæÍk×x ²ä½­fNšbn7Í©í>Íù¼ª‘{‘GÁûÆíþ# ä\‰`y„¦E‹ñ5 L%3÷yÅ‹äGëH¡Ö/:Á…ftì’Õur{>ý˜âx¼<Óø%6<¡(áYÎ~žª~õ`ض*ìo£¨pC'DŸ@ÛC–ûƪ•§RŽÔv‘#…ÛwàsÃ…f²W³9ÓÓþYÝÖ-*ŽãüØyÄÎ;„yFlè„ȼZ;×f°T-*î,EfýËæW”ëðàù¾„ ÿeM—¦Aë5¿¤8´¿"ój z=`9YÜ7ª·Šééü®®~£r]ÅpTÔÇ¿Ð<ñ¶ô%Î,"”/Äx%ž1&8ò(ä²rW½ËéWVÊ©OÿºÄó³âòÅJÄ3 ¿ªG!Y˜w©·øÃY÷Åÿ Y¹ª¼®þ•GÅüý‹0O¥m‚Í*¡»ohinI/fqŸKZ÷nïPëˇ[ºæï-GUXøô?—”(RCñø‰}+ª ½^'d\°Š1äú…Ÿî¬ˆßL*Âu‹S/z1>™!ã¢Ávï|ðÌç2é+ÇSî©';ÖR|åûÔH&íë0:¼çضլœÁΜPÊBd4®àÔa»×蹤‰?cñçüDÓ‡?tJÜ­ÔoÇÎx–1%Àv¯¾ Æ'ÃXtuYòÐÿ,BAЋ1(€^Œå‚o<­Â ²¤W1NæµRw*wX½2:ñU}îp:‰={@ÙCßoN!û´@ä?vÎ%¤ Œã]µW‹Š¢l¡ ¾PñŠ5žÄ^ÄKïCé!=ˆ<‰"(êE̡ћ|”ÄB{ˆE‹!*M#Búˆ›lü–…°°°Âvÿ¿Ãì|»3Iö°Ë—og¼j1…‹fˆ¢ôèzg±SÿgDÝ׬íèÌeþ†s¡¾ÎN†YLᢙoÛátFú²r”e¯+{¢æà‹Ñ‡M4ãuV}~L€‡Ö÷ìÜ1 Q ˜À.°!Âbww"Àɤ°Ã1n¸¤-&6š¡¥%¨Ÿ;$a(Š@@z`ÈHj‘‚Hÿè‹Ù= Í`b†3Va†¢h#ÅÅѹK !S¡[:—~C «K¡Ðÿ(tvt!Ÿà ‹“àÒ¥k÷FÛÉA  Zðž-ÂÛ^òF·˜é+>¤ø™¯¼ûbf‹1_QÕÄ?§°L‚J ƒ]`ÍÓbTCú¡í¸¶oŸ €Å \4ónH»é!¾Ä5Qÿ¦éºæ®ëGæ;Y`ùaïüU"‚0þÍ!– ‚*±²ñŠ v>€XYØø¾€…½>ƒ ¥¥¢•ÚÈYˆ…•`%VBngÆb œèMŒÅ|9ÂËÜ5÷å›]ö—ÿ™bšÍ&@„¨Ñ…è>¬4úïÍ+T«fœìþâò3J-w=%Qˆ"¢„Á ô„ŒþR#-%Nø\ïQF‚Œå+àryŠ©KÌ` åêPRB`ªÖ¼Äqÿ Ž+W¶ä x&È—¬s\.ßQ*?“M ™é©ìñ$ͼd¥î D¥Ì`1)´”?;øíñËx·F?—ËSL_d°‚fXŪ¤P(k§ÞßÖÊZ‰ÅGÜk\¾Ó,hflxðøò)vOATX³`À2´±9^Ü_râò“”*€f.®»ùŽõîÖ*‹‚¥ ÀÅJKIÄÊ$’1Sç¤ËåóÅΫ0a¸…n:8¡ –.޾‚/âàâàâеCŸ Qè8¹98»¨ â&^l„.]B -îƒ d¸ýòçøäÌbþ&š¹%±g…n+`5Ã^ôáóõ•¯†ù̘ØÉíÓÜ N1¿͸:÷¼Š²ßk àÃòïÝ!ÈaeçQ(‚0»®ŠÁ²IñÞ@Ð`°ò®`3y “wÐþ‚Á;Ø^{ðà‹ÅKè€6ˆÿfa0L˜ùu£´.¿ N¸p«ºäÂ×M‹~¦6;7î¨ÒC8c÷ ÖVØ_pi-4ó²#M`йšQ -æ`çþQ 8Ž#YŒf %“²1Ëbqeµ(pe6Z¤ÁÀbR‹ÕîßÞ ˜ä÷Yß^½Þ—@/°Å €^̯z1Oþ Ql1èÅÐòíµ˜Nß|~ôb À_ì1 ÂP †ß+^Á+8ŠŽ‚›ð^Á xOà <‚(®:º(ˆK}I,…i ©Ã{ üßÐáÑ&BÒÂ×|1ñ6É×v-b{4À _Lk.Åtµ4 AG§L[ åÿL1] |1vWò½&Æ~Ð0D5Å€.F½p%µwÐkÅ‹³ Bìó§/†„™E}1©WD¨ÕG«I”¤À£%Ɖ+ð†/&½Ø¦˜üQJKžDÎg)‹ÑéÉyñâò¢¦D–Þ|1J.‘+8.×û­£/¦1k(Ý>‹èIóf3ˆžü–) Ä¼Ù¹c–ƒ¢8ãç %#IÊBIec0IoYø(«EŒ&û;+³Ñ"å#XLÊb±š¹çºe0œAgò/ÏoºwºÛéœ{ïÿù™^Ì›çicT&ŸôêÁí‡^Œµ„Ù×Ι»öâ^QŠèÅØF? ‹©„RÚ¡#¸ #å0£d|=Ÿýi­^‰‡^Œà‚Œ”õ`ÒºÓýWø/F°‹¡ð.†^ ÀA‰^Ìw†3v1ôbœ¾àv"OvÎÞ#( ×XÁ J¡”è `+XÀ<&0„(´”Ñøï¾Fqs¿ˆ(ž§º9¼yÏMÎ#TÀóT:/À¢„/æÏ#éû±‹*@‹Á#WºüÞˆ]ÔZ ¾˜¯‹]h1øb»ƒ/F vy bðÅÈUîÄ.@Ä\ìÝ? Â0ÆáT]¤cEJOPœú@ÈæØÞ ½†S²¹;{ ô@ý£ƒà¢ð ¢ù=S†ñåK†7 úb´ÖuÃïŠ]¦úb¸ˆ¡/&â… bè‹Àóºá‹™€)Æ9gÞ !|’‰h½ÓÓçyB%r1:L1:c­},¼÷7ˆüßK0°¸³o'€@è‚j’fº‘Ú@'h$ ‚h‚u">Žû*~ü³Å¸'’['ÍL­³zÅíç"éÍ| D‹ì[Á ! ³àB7ÝÀ•t¤Û 8’rrŠPЇ?MôÑghisáÃ,mlù8„¿î˜wýlÀ_ŒHõ—Üt¬L´ô—1Ðå¼¢;è8Ò©‹ØÂÎÝ Ä0Ô‡Xˆ ²#5‰ ©µèG$*å@ˆ8?]£*ý´\Wõ°.† ܽñxò)ýê–þ¦ømúÇìŒÊbêùìbfÄ=x73U·!Ṡʤ‹Y§µÍ ıǽL‘¨ºE¹˜’:‹!Tw|‰õHu÷š…»Ñ³Dïßj‡)àãfÄò!Ôz—_¬s¾ª2ŸlŽJ” ñ¿"$1»vl@PrWb%GpGBMì).¡8þk`„BŠ1³·Y$†Ó8?P1sNñ|Œš¤¿v£ª@ÝìKH_€§¸­þ®Ä ú[‹ ܘ´hî$/ô‚ I(nÌ…„½iÓ¦HIzYX;KÑ@\´ÉEÝJPd!1È\êÈÀéâÏæçqî8ÞïcÎ=s^3gîñ8ï¦`ÃÓúÜ´N™á x.¦çâ'"À,fa¼Ù.æãpGƒ¿ìÞùÕ†yÂMSù†¨ ˆ_7w™j-<ɵ9sÑGœ™‡§Ou}´?O™uÇàÓSÓÏ{†Z{ÛM ïÆíTÿ̈¬1ù–¤ °Xp¹W %ÁCÏÂhs¶³=÷­×s½\÷¿ÿ™x3¬|ÿ2?ýiÞ$~Ý7ù¶ñRá3Ïœ³ì”Õ˜¥¬òpyU]e͉;m—M¼™¿tw ™ÀÕŽGcCþuY¾EÖ›–‰íÚ"‹•ó妀*DS•A@ÛäÇ€”Qˆ’WM)|ˆ=R²Ü0gÔzYßG½…¼šoxïšer#0¥Ù°)|U¼düZ­7÷*Y^œ½Y¿kiqln¢»éH­01ù¹dùvš ãC§´ñÕlµè-´" Rj%G?V²÷HäÐG@)VdÑæõf/%üQÅ|ñ3ñÍ_¤ÉÍR&í™XϵGîß5ëêêŠáÎK&PÈ1?fæÙù}çžl¶K6%—$…Ço#ËÔ»LÔ+?ªÅÊŒÑ[ÈUäLLç™íª`ŸKîgÎ1#}³­-ÎZ¸®û®ÿ…?É8.¹ ?šu"']¶ÝIo)gVfY_šÎ:ž+|1S˜t}“í™5Kü%GGN(D½±OšlXu's\`:“Ið‹jg1#ýo²'Ïs®S&Æå­eéd‘1ë·›€‘ÕE¯B¢ï…žWoª)ƒòª)å·=>ÛŽÜZPSå°¨e”1ú‘7ðbýŠ{C› Ø1[üçbÞÞjØSU‘m<ꬅë”/J·…ÈGòz¤ýA!øðk¯YOÞË$û^RÝ•ÑÉž3ÿÙý-/ÓbiÑÿN*pÓ:ì l(ּ͛i ü0Ä0‹|1€/_ ¾˜„ÑûBßøbðÅO0á‹Á)ì)Àƒ/_Œzd”vbœQÀƒ/_ŒÒSJ;1Îà‹QÀƒ/&úy‚q_ ¾|1ñŸ'gðÅà‹Á£FF?O0Îà‹Áƒ/F¢%Y>Æ|1øbâ} ÝŠ/_ 0Xà‹Ù*¾À 1Ìb_ à‹Áƒ/f ÝœB%ƒ/_ ¾|1i_ ¾|1-”é•*d碒Áƒ/_ŒE-°Ð*JS%ƒ/_Œ¾™XÖ¢ì)*|1øbðÅÄ}ª ’Áƒ/F_Œ(_?UPÉà‹Áƒ/F!\T2øbðÅ@”nÕS¦·ÇñÅà‹ÀS’¾À“Z_ à‹†|1øb•œ` 1V øbðÅðÛ#€/_ (GðÅà‹ÁC%ç—I—_ ¾|1zÉ›Ê/“J ¾|1øbÒá—Aƒ/_ Dïw0øbðÅà‹)ž_L |1øbðÅÄÐ_ øePÀ„ñÅüaçnY ¢8Ÿí†E›¨AذA?÷*‚ »›Ä°»ˆAÐä³ Zƒ/Ida·l°´‹Y0Ø ãtãá÷¤™©†3çO^ y1÷e©^|Ò!/†¼دÈ‹±y1˜´ÀŒ’ý.F¿O‡?¹ñË«pE¼@cî—lm­þg>fn©ï¾·œBÃÉ}šsñ]ŒéV~º)-¢D´¥Å¬Í&òòú¸²üWöΦµ‰ ŒãóL’m»!¥Tу/ÁŒ‚A(ôäŃüü Bñà·Ðƒ^<("‚( 9xQ¨TÅ¢Pc’CÄÄ6Ñfw³³³BdpMæ Ëúü˜,›ÿ33äv†É/ÿÔcX¨¯ÞÝ<{éÂòžyo®¡J¿~S×ï=?Q?5ìµùÌÈ´†}1†,&ò›ü¯0ì‹1\»ñäÙZ§Ý zÃh'ˆÂñø{0¦ûV/ œªÙFg9ˆ»é]&qö¡ìЖ’†ÞYÏf¹ôËu—/[£ùš¯´ˆ †1F é>ÑH9Usx¶=gŽ2û“ðŠa_Ì.ôÌR©”ãD !u*0E‘è4ÖH9Us+!òµ[Ì‹#†}165fF‰Æ±Â ÖÔ"j*U‰¦œª¬†šv“‹aØcØ·X GÛþìLŠˆ?_”Sõï¸6&™Áî=‰ƒÅ¡§éVpÞîý=£n=xù¨Ñhw?n´º¯?õ×›[ëÍþ»V·ÓmRNÕW [Öí0Ö ‹ Ãzp÷_W9´÷íûgNãÙX—S”R¦^)ñ¤~ø9ª/8(ŒýÄNXCÃðBÉñ¤ï„ß8UÔ—Ž^¹ùf®(5@„PṕãT-ÞÉ:J\ÆÚ¥|Ã0?Ø·c` ¢ 醤 ÿ p#É"n»õG©+ã*oºÜ bïìBì¸ê>wïͦIMšÖÅ]hZ¶*¨‹–VcKµ¢(øA ºŠ"Tª}P裴䡾øó µ U¡Tm°ø‹Ó*I¥i 5_„ìvû±I»{ïîÝ»Çs;°gvþ™üçΙÜ9™ýý¸fÎ× ™Ι3çwñž˜ð|1þ¾˜?Ðøbt[ŠL׳_ŒÏ¬­^ðÅÈöUÍ ‚–AF§gçßuÍ6c¢Þªý˜åžY±;¦ÿ±é6W펫–rV l @ˆ1Õùbê/XàYL£_Lx‚ÀãDL´ÁÀ“_ãâ/XiDÅ€VK“®ßÑ]˜½æÚÑ…å-]³É¬ŽDÑꦑî¶Í™…Y››'d¨‡z•²€Ë×£O¯øbl°ðt¯øøb_Lí|1€/&h_Lù3J€/Æì3øb*Ažà‹IVS°ÏøÐ ÄsË _L”ôÅ8tfjç˜þëÑÉ‘Kœ"%íV¦è­é'àv1å÷_Ä3W÷¾or›òÅ4WŒ=löú±f½/f¬”{b—Íÿë1áûbô[û ¾˜p ˆà‹É_Òns¦d5î lHðÅèâ˜|)ØgðÅ”ö|1U@|À¬´®#€/ðÅ à‹)ÎðÅø‡ ¾˜°”1€/&¿)F¦£ŒÑÀ£šbä~õÊz1²‘.¥¶)_ŒuÄ´»¦½l:]“ôÅøŸŒÅ³‘_D|À3ÀåˆÖPÆà‹)5nÖ7ˆà‹YŽ¢ÑþŸb¾˜”ùE5ÅhçWƼýºe)Š6G¡€/f´ÿÇÇ#Í/j;z1ýQLíâ ¾”1þà‹©â ¾ÀS5€/èŘKç‹z1²}1øb*›l|1¾_L2Qdª’¼ÀH ¾ë…IøbLÒcsÕWïÖBC21&Î’e±@ÇP ”d7A8ºÝû¾ÉmÊÓ\1ö°ÙëÇšõ¾˜1uàS,4d Àã‡.y|1)3fgC€/F/ÉáÒÀ’À“_ã%yñðÅ䮸b´,=Wøb_L]|1@/Æßôbü}1L ЋùM6Q á‹9xåÞ©¯½ýþ>ûo¿ÿ˜Ýfë^›^úâ)¹/_ŒG|QÞÄÛ à‹1™â‹LÉR4¸,|1 Ä—¤ó%•’,#{+¡{d1ªÎ’.¥¶)_ŒuÄ´»¦½l:]“ôÅ”{JùË[”1à‹Ý<2øbJ‚ €/FUj®íû[`ðÈà‹ÑÕ0…&ªñÈà‹ÑÑ•wîi‹L¬øbb/LN_Œÿm£½wÀ¥Fx¾ÀôbðžÀS>þ½´†Ós‘Gúb~ýògî½ûÖwnµóJíîêkç»?~üS¸ùÜÜ©Òoo}n›ßQÀã_ÄÚ%j0ÿ €/f ½KŒ,#¢€®žIe¥ÊàÉ ˆ/æ–'¾˜(é‹9pèÌÔÎ1mu’Þ‘eÄ¡(#$2.K´£œ˜VK€#;ñm–|ß7¹Mùbš+Æ6{ýX³Þ36¨43¾“U-ƒ+0¬®\Øñ_Œ®wÑË '¾àh…ã‹ÙºÅÓíõý‰k;V2½ÕÕ¢¾ב)<éÃ,¾M ”Q¼™®–Ë­¿w_Œ§óE±Ì¸}}'ÞÖÀ;€/&ÐI@'€/FRØÂmô‰°F)P_ à‹ Àøb€ãï‹ùížO<¹÷î'¹oߣíûåž}?bÓÕŸ…õ_–©—׋é'úJH|1rn¸Z›T-3øbôyb½³ÝøbÔ’Ø W‹Hñ¨åPOLškµÌà‹‘dý¢cÖ0J¤(µDIQÀ£?ºe_Œ$ò×ò|D"¢C ,3øb´Ó(ñZDƒúwa™ dzÒ3K]³¸Ü³ŸŽýtW»+=ç‹ñ»i|ZÀãÿhÃ¥¨µdQ ÷i„o™À£ê]ò bük‰Ñ“ÞBð–|1åƒe_Lðënøb€•Ö5ðž ãï‹1ÑÛïÄ4¢†‰LÔ?¸þƒŸÞ à‹‘AÄ3”ˆêúÊ#™[À/Æïva¢€òJæÖi_Œ¬èŸ %+"Q Äc½0 _ŒIúblnžÉåÝk‡"¥\\ûê¹Å:QE€£8ß,ÉáRj›òÅXGL»kÚ˦Ó5ë|1~(= •LL ÆPøbáKéb— *À#ÿ#$1Ø©©ü_Œ¬¸GMô¯¨;qôï’eu¥Àcà‹›PqâÈÊ9ˆbjy½X8¾ËÚ¾üÞli‹C]!}¨·©¤1ËèUܾ·.ǣߑu9Ž áÙÝ»wÿâÙyû9\¶µ¤œ%•žÅÃ?ùã_>5·8w®óÖb§½´dWWÛý“s‹6ÝæŠ®}¹o³RòP«”’" È–‹_»¬¢”È/Rkéä™èg¨_šË ˆ£Š½ñ[—²ÿâ É÷}“Û”/¦¹bìa³×wS­÷ÅŒ 4ˆN_·ïñT¢¼®œŽþƒÿ.]¿ö¬Ë”ò ¡–hÙÿ¯.ü1à‹‘Ê˜á<mú·£ßÞz×Tµ¾gðÅèÿ òîŒßµëg¥$j ÁÒ:,aøbüçeu‡‹”Å(î˜|d5[ì+»=W÷é”5îqiÀãÞlgó³ßýë©§Ÿ>uöÇNž=zâÕ#Ç_?rüÕçOž=}ö¸M·¹²ŠúÒ£d•Ôô´¹4÷†ï‹"¼8Ë¥¾}Œæ_ —øb€•Ö@ˆ)¿&@/æ†-³W¹Ãn£Òz1ó§w¼oÂnk?=t‰šñi!Þê͆à‹‘ÌŸ°›™¸;s¼=®¾Ü%~8Mwšˆ*þSªzõ¡MÐÊïò_F”j$t_̇4û‘ñÅ¥Ö¦¥æèüïè´6-Œné>wæð·Ç'§ëwd&'æÿ:}tžñbÑ£nZªý­\56ÌËhUûÕø©¿ŸL8í6÷?1÷ØžKãD´c²ÓéTðÞ—üo?y˜Ê’‡Ébõ+ìNžÜ|!ó,qaDd ÄøóÔ÷ïùÚ=2=Nüy¸4ïÆJ¥Š#ía§¤¸¥Ý~* ˆêJCVTr‹®÷‘M‰ôÒ–;Tï‹967óÀ®›"ÁþÛŽ•N<1=ñ¡3OLGŸÞ_$š¸}ýÞ.Ð;Îc”¬\q¾„jÖ|1.šD¢?VêD–N§‚‡‘rp$s‡4ª§ ÎC õ.ë¼vÓì‹ÉÐÜ´÷’@‰‰)%²ô¤Î‹@‰‘ ™ìób☙ˆëi2·ÍÏ>/F23^4ãÀU€#Ú 30ƒ­¼wª @‰Ñ5E|«måŘÿG°P²Ÿ­¡” JŒé²Ï‹‘…CõŒ‹Q2%&~Soöy1f _²¾8°ÖÂŽÞÔy1vðCe8i휴@ãt1È‹±Jy1ÿÇb€¼˜¸ú€¼ ï ßÍ×ø sjû‹lÛ«È‹‘¥D’E'æ/„õÅÊóú±Ÿ'~ºð`¬¼î¹ŽÍ­ÝÃ2Ë‹á2 @^L(¬/[ß>:þåqÕÚY^ É2 ¥B¡0qíÓ'^jé|~ÛůM\;±ù•ƒÁ³É‹!Y /æÁÝÑ [ZÆ#*äû±y1ËŸ¨–BθD /füÊáüSëÃÁñv„ù'×ÿyåpCc\^Œ¬b)d̤˜q@^ÌÔïõ-Û¼¿¦Ž~òý¹æÖú­M3#¿öý’AÔí @^ÌÝ;7w¼º¦aûïw­ixú‘G gtMIµc¯À¥g^;82p"<®Ôo_E3÷UÐÅÜϽ°®ãó‡f”€¼ë“òbì&@^LzÈ‹‘[u£qͧâmÉ6Ë /ÆŒMMY4ït@^ŒÎúžZP:u2Q^Œù,y1Át KLéìùäy1rÕ€…’_ ‡j}*îÛ­ËMâ¼SÚu1¥«Å=:)fÙ¼y7ëyN]äÅÌ›œž­Ö—Q/£%È‹‘Ù1q÷äÅHm½åëgv ö]VBò¼œ´Ž/"v—o8i €“ÖX(ý˾›Ä`"6–ÖV6¶– –Î7r;áVpÁæÖS®°á{ „òùcÊ“¬ÄYŒ_ÓÏ·É2u«Ñ·[YÌæ·Ÿä¬«‘8Ió¢²Fÿû1 <Ø9—F‚(Ž¿]ÔÆ2ÿ•ÕAÔB K Q+++ mb•°¢ 4D *Y, !1QA%à;õNÄòàlµ³3d33ÎFv! Þ,²K4¼Ëcx3ù¾­†oÞ°óz1UªRë¹ëˆ^ ,¦‚;”1¾Å´¶û::{ÿ'Ýÿ~Ê{ĺyÁ^ŒAB`b´‡(À€Pð}›†w÷}à=M{pŽ èb ªP}÷f#û3–:‹$µxq.º7³˜# ¢À;ø->¥lìŒ9⬨,U27@t1D!„u+ ê ”Dux_ ÒŒõ+¹š0uäµìX÷ÿo+AÐÅH¢…ATBYjÿ·žÿ•Èœ/o|OW ðÚ£|•4~ QÁ¹ ‡ ºI´¨P¥Jal° êa„š³MÙd×ÛÆÇÍ~ ‚`/¦BTJ![ü“.\%sk©ÓèæáÂê~0š¯õbTOz.ëý‚'J” øA€ç-#¿ù…Gç>pxŒ¨ã°ºXW\/6¢iÚöÕ3n݆+;\9?ÛÿðTŽ¥/#z)?š ïM…2/ÿ̧Ìgo½ÜZ ÈÛ®¢išéb^Ù¹cc ŠãïÄ„2€•`aå6lbiHᮑÆÔœ-,ì¾Bÿ_ÞÇ w¿Ÿb¼O1ÛõÊ$—^os©¿Ïéb°£ÔšÉÝef’Kê¹Gûߦv]ÌþpÒxp/SL­Uß„4îÅÄIš¢>”RrÎ)% ÀâÉÞÝ0a›.ÔÜ ÝGja‹î!éHV"&—бú}!xà㟻CöâÝ+Ö(œ•Ie–|ÞVV¶ï=”O ½˜Lß›oz¦9ªÌ‰å‰—e1Eb¼ŸUflÌc¬=¹3 Ó­’ÅX‡÷IhDŒsm6ç@yµèõ…ÊÞ™›?€%{–rIëËo‡EÅŸE¿J›¶T\cv~1šÎˆÄ§H³KS($fTq“_L!UI"9—$¦Sñ‚%3 ¹)³õÅÉ`áxЋñ>·xÓB*—šübêuP½S³b¹víà`£ðp?çk¶è ¥#Ùc@ƒ„RÊûޝ ~çwïø¾•™$c5Œô¤§ÝÑòVÌߘ&Ùîså-@bl‹‘»ëw”‡};8 x¦(ÛH­V˜€_¿âÇ*Žƒÿbêêñ¤h”LKøìÜ! €@…áQÄb4š4[<Éì=ç0ÞÄf“=‡Å²·×-±mÐð0°L˜¸åÁûE¢dÊ›¢$¥nX›mw£¡¿ úbÎ?÷CÒ,/«Úýª·!ü2€øbïìU"ˆ8ƒÚXÞ ˆh%ˆZ؈…•`c­ 6¾ˆ…Xø·…œ‚œ_œ¸§ž_¨(Ü©ïán2s&ˆœØÈAðÿƒ]²™™ív6Éþ‚^Œ&É-±Y¾[®–‹çK§Üj™ÓÕSèí|;Z•˜Â§-Ð R‰Ùéa»ÖĿĢ0´ði}lL‰Üð/F±M,‡µ¦Öœ*ýžè$UI¢Íx~nBѯÎ:Y®Oö{Úž¾XÇßÎÿБÛT1$‰Z“cŽ‚qËX3NeÈÇxgÜÿ»§;öÄ:«GŒ&@/&%Ûpö¤þR©5öªOQ徸{½]¬lŸ™ycyù"@Th1PÅxî_¤$5‹ñÑ~w0±µzÎCå¹û?Š¿`EI±dñíkµÞ<ˆŸËÇ¥ý›­ËõRL,4Ëð;ƒÄ”7b4UÌ;÷ïš0Åü.ÇŽN¶‹ƒ]\:u—.Bÿ¡];ö@èd—vsœºˆ‹“¢ƒƒBÞPh\„vë¦ø#çÅH2ŽÒ4åÀð ¹ïÝñŒ¨Å¸²pqξÙ'J–&õbýúüE¿mÿ®=M˜"…±ç(ʽBˆöäK úkBú™Ú}Éù\¶ºÔx¾´Çõæè±Ñw>ïÞXª·ô/cdGX°éÈø!„!÷b¼ro1ŸñO”ü§«¦ÈÍ–³hŽ¢£®åÌ ¸³u­æS…1)%ãüpr­â}¨&gq"¢Hk €ZÌõÍ‹p¢d>@¿_ÚèÃÙô‹1ÿX;vÎ[E¡ úè6–¾€ˆV¢6VV‚µï`ã‹l#baÀŠŠqwQ1ç0¾ˆîA§˜ÅâÿuggÊÃ3|¯â‹yî¢üøbðl RÌÿ}1?•y²0 çF¾TÏiZU³»¸Ûs_ =A(¨%{B!9µ.n8ë¾:ÀCwÇ0%ÕCüøbnr¾°]rä½ä/Àóˆ¯ý„ÝIøb®Š3ÔECŽÜMþRÌ‘ûeA 0®"£Ùd1 ‚íb‹E°ì6£ÂÁ%M6‹`0YÄ" ƒ ~AÃm6åÎÝ;X(ƒç×¶ðƱò>¦õbÔ혯£rIÚ?ø @/æЋùôbЋ1z1øÅ8RÞ'K£>ôbÊ­¿s”Bû•@/æÜ‹I¥ Žæ&D>ì=KÃ@Ç[©.Ž~''Á—A?B‡R\:9‰898Õ) TŠÅ@+*¥- "•#&CtPT|qô›ø’˜”6Ð;›ƒ^ÃIùÿ†’'ÏeÉñä ÷Ë¿ðÅØž/¦¤=攫ô¶±"Õ}_ÌøÄ܇µ‚öEÀ %jtà‹‰º¾˜¥…Ù–™×éðż½Ï÷ë +š9:ðÅ(ÇOåÆÝŽz«žoìZëòÉÚ¦FûbhD0.Ýlþ©à«Ü-ƒ†Î@afà¬Qr«g11Óƒ/†ö¼Gˆ˜àß]©¨¶ƒ& ƒϾy~€/†X©šÏŠ~_<¼É×.²ÅS©`¤·Ž¼)†o]>„úF3Õ†ÈÀˆ±M|1vôÛŽ¤âÓûbl®)†®5D5YØñ´Å†Ћùüñ|1 ëåÀx¨j·ûê¥\9Ëì™’¬7{1Cá蟖,|€*æ—ûGA†ÂnÄé\ApП¸÷A·¸)îÝWW7'ÁÅԵݺµôO4]ªb+!Fáûm}º=ä3ä¥õ¸ß©Î‹áD>)æYQòÚêûE?†ÎÔõ|ûÔy1 §{ âõö¼tOtstØaF÷e^Œ8½ª?($* Í€¼˜{1Å {íê¼N4#KÛàçÄeƒº¼˜?eƒëÙÔš»˜ÉtÕ°4ìÙ1 ðãÏ¥ ‹¢Ÿ"R¶G P1eçQ‚( Ï‚XŒF“fï`2{Á=Œ7±ÙdÏaÐâ-dGܪmƒÿ—æïós8+oŠf”xØ‹iûå¹³;›2h1§¯jÂ+IEÂ!i–—U½ý9e${çó’LÇáM¢K‡ý‘u ¢‚ºDPt‚èÜ¥¿ CºA§ ƒ'½(‘V°R¡ý2Ò´ÖJ+ûZÔµn½§^ugmö²l¸²#¸ÂçEg–]OÃÇ™ù>c…#Õã ¦rùB.'ç òìôbhW[{WúxÎ>ºb¸–idÚ™¯†×0ù J«¿:†˜á߰з»×Fˆ05Þ£F…¾~ùb2ci…K[Ÿ+JÚøÂé‹9Œg÷bé­Èãúþ­g;éÜÀ ÌÀ·ñRž"G$RPô½ÂEŠ+O¾³ãK)ýÑÔ»}³û>/fJÑݽ¯÷æz9 Ï‹©$`¦ÒÍïbŽg“Ũ˜@E)Þƒâc¸‹QU!çœRê­€,&¢š%’’̃ ³{ÛÖDRe kèÐÈbúŠ»§”Ê(¿@_Œ™IÄ݇;e,¿‡¿„¯ÇN¾ÀöÃÞÃ@4'.äÙÀ‘GrGŠJéEýª–{´ÿÇõé«.¦”$_Ï#•ƒè\ßžžüB¸/¦À]Ìö  þŒCF>!”˜û}1¥…‰Øª‹xj+‡»KFÚƒN”ÌU5óÔ¶0$"„YÌÊÎãÂ`¥„ q¯ä•¼7ðH¿ 0Êá{SY:6-Žs#ÉÌjðaæŸu¼>Ãô«^^”h&œ¾¸t1gº@ÓóOº˜ÕÆñfÏŽi`†í.eXýl‘²>J€Š){÷«‚P …üÓ«·¬CÁ—­fA°˜}m>‡M & 6ƒX\,ƒ ˆZ&Xnw¼ ±-ˆðýàÀ8ëcÛ9p~\QJ´Â7…rለ¥z£ÿ‘9¬z7­xÊñ¡z‹1.r>…4Þ ÄB–Ì9Ñ !Ø’GÄ¿csÎcºÜç»ál;˜lœ÷±y!‹æt½¬€ˆ8 2²Võ5bÁÃ:ÈJ÷¹{T#ü'"Ê>Ø;w†a( Hy`E*Hˆ‰€¹ÏÅÔ‰\¥V•k«‚zIpG\ Ò8'v“.,2YBŠÿoˆûÌ¿~'ÿùW£%F] †§Ý¯zûmïì¹rxW>¸ÞÜîÅ’"öþ>Ýè§±®Éþ¯Úxu EùÀňÔŨµåùÉ”6s¦uÁn^Œ¹bcnN~È‹\ˆ¥º ~šƒï“Î{­ù²{|¿U»)ï÷S‰a/CDnñ“ýÔ.f†%­.Ι.>–é.YCk“+¹™ #Ø“’üÇßN0lùË×êùÃÎÑm¥êë^ŒíËiwÄÜ(¥¥¥…YÒ½[y1fXL¾_÷FìIE½àsr(¢0dqi}EQÂT²k?/&»Ø"@bÆìœÁ €0 ›¶Ã0/–`L¼øv5pÚ”°A’Orä "G–2?Åh‚Öm]¼Qò©¦nêƒC‰Â¤ã,þñNäk®Í¿ÖÃ!„+¦±k$À DÝ0‡QL00« ] A{)>ü_1ÏMÚ¡È^À£´Y Ÿ½;¸a„¡0üTu¡nÀ‰ç‘Ø€ 2RzE µÉ!ÿwðÁ 9FŽøÂ*¦”²p¤z1)%Í©Öj»{ª˜¹”ªfìås ÏYu=€^̾gÉmÔ·¸é  Š±Õ‰ÛmÔ°/&笙ˆøö«ÒÆ.ßmØ—Ÿ*ßyüü˜á¤%ðü°wF' Ã0õ•.Ô ºAGRŒl„òwÈI8-5ÓºVX_ãÆÎþË/Æâ± üXp’!ô‹ñ—&‘}k=çöašÐ‹;õ <"Bèc*Ó©ªmÝLmÚVDÏõˆ $Äñ!äR–ADýO‘Ͷé_‚¾ßòÔBØÅ䣪,(L ¢ùþ¤ÇQ%Ô´àÍγ4 „þÌÎÒº89¸è 89;:dóÏøœtqrr(â$NÒÅE„.A'ÅÍ­´JQÈÐŒ¡´r=yž) I^îH¸H$¦!.3¬ÓpyóiõîÔ÷L$¦[‰¹$fÞÿÔ3û$ðE @b‰$@b‰$@b‰$@b‰$@b‰$@b‰@b‰@b‰@b‰@b‰@b‰@b$@b$@b$@b$@b$@b$€b²õô½¹ŒbŠø_x¾>Ž…‚ÄŒ†_‘9^oO¢²»½¹Ú^‰?Ó¹º)ö#Œžú]T‰åš>îÎÊ’äš>Î3. &Jo÷öN ‰ÁãEîqÁ(¦>¾×?\*–{ý÷­VDt×O#Æ/—¹ ^à—]« ‰ê‰£+Æ>$>Eb%ôõõPH%…Ñ”=ÔSPÙ—‰°.¸eø ‰,%]²o°z¨žú ¡¢ˆŒ2£ŒÀ ¢Â‚þºÛÚØ‰ã6£3÷îÕ]­{ÆsÏï7¿ïÝ{˜ÙßÓ7ŒÅP‡#9ÿU<Í÷-)­h­¬€®‡‹û% 9y5Ñ’»nˆ¹¸pQT\ª‰Ö×U9饮bB’ ô¼lyñö[G¾¯óÝçÓù¾HèÿÞLä;ÅÑ‚ì ës¨­­­ßï_¼åˆ ¯¤‚{n ?4 ¿Ì_ý¼-17?ñ³uÁϧ|>ô²µÝ›‘ƒ¿™=s…¿ì9l ”¾*¿Î·ÜÓÿ‹%yŠƒ÷@~ÜôA ]Eaõ]û××¥Fê ñŸ17·L< X>ZQJG¾Œ E—A€õÛ €cŽÅ.H3æ“#GôºÊÑjtÎÓîbäkûYú ·{é2©óvé»gMîtê/‰ßO1ï=“{þ9¸?½Kñt|Ê]ž¶®ºŠ'JÆŸê© 9Škw_h>³C´j¾^A/͘ƒV3%‹C³ ë›jÞÙy pc÷¥Óº¬û‹æ{s°`‹˜ÿññ÷§w¡$ó‰’ª¯Ì;ÕÒ¸7: …QˆÌTóTC!gM‰#¢¾,ÿ}Ô¼c?}«H¢ï¾bV7üÅîËF.‰RH U8)¨ó ülçÞUÂ(Ÿ… !V‚Ö!BD”ÅÆr“f±ˆ¤°K—BH|‚-­$ÂÎ>h!VIK‚°EìRD°RP,b IHdAÖ&ç«¶Xø9ó37•qÊp]·q¿Š½Í×voÊhÕNöóÕˆ‘ÏN>ò…O%ÌÐ)û˜s"¤ù†íîæ°sx޹VUÎö›f÷ˆLQÓ€í-CI[Ù³èG“/g x¹Q¿~laDI›ÓÕGIèøàS×p!2Ee[HþecˆÿE{Iãæ…ØÂˆÂ6LRæâöÑ£¢_„×0‰ù2Þ´þ™2*W/ˆ•ŽÚ' 1\nÖÌúO^ÇŸah"¢ðôù¡7¬Iý’üIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-02.png0000644000175000017500000004642710536106572024741 0ustar gregoagregoa‰PNG  IHDRÙALÞIDATx^ìÅ¡@QîŒ+ˆF±…ò_y:]òÀ#íZvà„}—ïߌ¨mÓùpì{ÕÆ¿;Ý;»;Ë.,b²’D" B,%Æ$&£!©Ê?)ƒ‚€ Êû òV“Tþ£ˆQóT^F)Ë ˆRˆ‚Â’ It]Y]f¦§sfîrn3ÍN½ `íùÕ­»çÞš~ìôöÖWç|·{îܹl=Ø»û5\tAA"¸t‚ ‚ Øð0hô:´¥Ô9‡üÓ;äHù7Wºã¡ù€AûWP¾Í}óÁ§M(úg6o鏿Äü››ïiÍûOÛ̘é€ãò¾ÿàë•óºð~‚¿pdøþN›P¾ë0Ÿ5 ºŽÍÓA×Ñì8×õòïß?)î£à/œƒBßG!ÿNü׫°÷‘ÙkÀ}x¿Í·òÿm«ï#þ|¸ûÈì±Ð÷ÿÿ¸ð÷‘ÙÀüÅ¿‚oÿðôîãØFËl\7AÜþƒõ‹ ‚ ‚Cˆ´¯«;(éX•p5$€XûÊ’òòÒÒÒúcGî1xãK5mVŽ‚ ‚pßÀöÈ›‘#Gþhé†-ÂB¤óñÚ„ ¥¯ÿ ¸²J9€ (8'ꋊÑXøÑ£®©Ph ‚ÿ ˜ßnx18/ÂB¤ÛéÚd à*Ä:U%Ø6ÚYÊŽ¢¬}eòTý˜{GÙ ª¡ö•YzÜ6mAAj4‡~ùÃÓ'Ý å¸*RªÊJ#%eʲ<“Mø¸ÁU6**9y`-€²îêá‰Ú§Úõx­ ~Ïwì3 ˆv.…‡«nzyóŸ×øÂàiÈ÷jæè:l&òæ¯ÎðÅs¼:@÷s‘û6΀‡ë¿¼ðܺõoÓô¾s1|¼ý×ÇÜ0êq=|ë/è{ׄeç†É:¸éž•h™¿›`зŸ€í¿™CƬA[~ý €a÷¯Å¹Ø´þÇnûsA¡O¿ÁÌcTý3ùk‘W*ÕÙŠD#ÑRåB%ãh<íÆO¹)¸ªúG:O5ÅÝÃu`X‘°i%•}&²"¹àT ˜¢ Þß¹äý7–ä/G>ó4¥PPH… ,=o_ÛØÜûŽEÈïèûÕ%P¸T°üÕ>#}.†Ý·6üi ‚ („F­9H|P£ @ˆj‘Ïö‰"¥ÉF$â©„ƒˆ‚Q]ÝXÕÐä{Î=Rç?á" _Fä“ýk8®è9@þÕÚ_?áø»™ ×ÃÇßy@‡^#'½½ŠãN}'8öÖÊt|ã#޾¹À•ý~’‰—›ß¥ÿO)>ö¿×§Àw,öH©œá¼Èám&÷põé:8´uOv:Sïm™àša³p†ƒ›çèV=ûহ®­žýOÜ:‡ó"ÈМ9Ï[©!®»m>ròÎKÓôúÊÂL Έp|­Ž•â4,GxžŸrfѨl§ˆ†ý"<£S#J™5½T£QžÏ³(á!¯é%תw Ÿ»VýŠdÀ7VðÇøù" jà=«ø´É¾ªÄ jxÈÿ÷¯«|Ú,GükzÙ»šµ9É~××e ‚<ëÌmr­b¸ ( 8…d)ЈhŒbÄKYôû­mçe4æAgK^ÐÛ&Aøáî^‹ B ‘"¤@v(‚@* Â)†Á¬gÛá5½JAðæE.Ï,ôˆ…B"‚ ðëî.|^„ÆÆu5ÈÉôq×ó ‚ ÏcÞ»[ˆÖ‚ BÁ…ˆ öÿÙ»{Æ(  C¥AûTAÚ û4û„)¶Ü2%P HµÒ¤Ùµdé:ÊÅ ØXáçEÈsO¦ÂŸfÆ¢ì¹Yý*ŸÿRóAÙ.ËÛÅvSž³2YEd@EY@d@EY@dàüÇÏæS&À¼¼ÞÅÙ·²çöïcSi/Ê+Aû¤¸»Šf\¿ó O1Z}pYd¢ØDâ,…²ÈXS⺕+Q|²'âHÛ½÷^äÖ.\.ÔÆþ×ð˯¿=??“†xUÆn  ›ìÊsMæÕìü†/ø"0ÃK1ð”Y×ôô«{ðNTÛpåø"¶·©muZŠ)»¤û  ¯ÄO%£OjtR抑yªÇÇ׬ڢ¾]WjížâEêóãûïô‘vkì—ýÙ_§¯ÇGäU‰éñ Pyk7@çˆè$‡)/¶Ê;o4±Žˆº#²TQ½~¤:§d&ˆ]ÕWBfÝÞX£Q7bÄ̽¥½¬EŽrö~Øl’ï·ˆ“s9Ö⥹ñÈäÆÖh €výá«=q<þéÇø"ÌL~µràt:¥ ‡,*Æàï‹@»Jº^ãÀ~úoÖht“xm©U Àù|^­íðvf|}Ýt”ƒ£œµ¤Rÿ]¤ì€/2ñ5«ªL½%óœc¢êè\•5Ul¦‡¬š>*SlŒo@·­™oU*”˜½?àp8è PÏ_îñ§dü‰ m‘î“OŸ¨ŒF½ 5{»¼{ÿ¡Ýp¯^ƒ”×êm\.GÒŽN`@«<•»ªcL=6veÖðEä™:þM`"Ü﹞¿8°Æ;6þ¯>‡UÍõ‰2Vö+‹½Î*ç<*“èêŠR½÷ †¥òN~ Ø}(-Ž@[íîXí²–Û[ý€TîÚÕ{ЪŠ%Dçøó:à SIðÇF”s κòØUm\?5k"ý^­’) ÛÏͦ7žó[!µøJ–ì‚ $뤅:.Vµ‚ô*2O-T3î2ì†$¸?ÌÔϰ² Gޱ4ÅÅñãEL¹êü¡uGT¾òZ¥j*¿˜Ž÷çztÔÃЖàT³Á *0‘aàÿîRœŸpZÝÂ>+&üFóQôh¾cÂíî÷õuÖh~Š~ ¨S?¢f¢LLm½@4 ë2æÐ¬ý^æWâ_åUá@â  ˜ë—ûG1°+hy±«ÀšhûéWÓ_Ð;°³‰’0ê2ú¡¦ûieëâ ’¦³2z´ÓÐáë. Î8æŒrŽ’Å­)m.ã”?ðóÛ§U¼ùôâ%Oo›/›¦*´Sûj{)ðõÃk÷õ1±Ý n’8ОÐIŽmŒ¥åƒ*û‹°Ã˜ŸŽ˜ÝÉS­î«íñcið¨.L¢zF³€|4«›xˆÍׯþÀÿ멯÷öÀ±œm“ÎhÊ›Tîÿ½’ת k‹ÙàÊ× 힤wVœN§‚^ø"#gZÉzŽ *ãwWüŒ¸ªÇOüë ŽË—„©ÕÂÚ ªß¼:7²FæER!*O¯HŠmÃgA\Ô×rq Ì.P{à [$p<£Ð,<ê¢Ø<ÿN6ø¹iyíð½œÈüÍ6àq´ hԤعÓÅÓl)0 Y‚» yzµEQyéµ{¿Ý—÷5(*\¬VE¿<£{ÀÀä{ÀCüœk4€ Crãíí½! ×Ô6`ÓÂ{©ƒ[¼/í*iäé€7uY£!š•˜Y8ŸÏ+µÆÊ'MT¾YýŒMÆrvü€&,`ÓTÅgý:;<.m]#}ºjÿÈÔ+´¿*¯Umñ‘¬©ZÙ?©cä†y÷þƒÓ²U‡C€Îµ¦AÊù^ÚReü@°°R‘ìFeæÌúë(q𕤪#ï·èÑU{íÎ{_’±CÕÚT§¶z—ËÅ‘´£Ð*Oå®ê˜@ÅXû؈/2_zX F¹™?*믯¹L‰U} ÛÄn3ßÐÆ—Eu†ÿ€WŸÃªö¤Wó¸n!c#k4ó…\¤O±Ìèó4ݧ«ú "¾Á¢Dtú¶ÈìMNÄ0 …±å¬@âg÷_Á† Vƒ €¨d[|S7“ŽHÞŠìÔy}Ã"iÏ$y0Ûz¬súËy¼³%›¹M¶ò\ÅÍ¢Mw. œ«Aå a䉗¼‡ñÆ&ªºƒ p>äL‘t»Áiu‘&;+ ¥†äìºr‘ qW©H<øçÉhÃ#•sxòæÑ$eœÁ¤lÏpDƒ£êäQ!eì%Œ‘ H” 7ùw Bws#§)7¢Mð*nuæPõ"É‘¼ùšÝäÔ_ ÎuÎ ^äL5;'d(Y½ÝÓ~+'Y†– Æ5; ØJù§?ˆô A¨SòH‹Ÿ@wÀïô²g=;éVŒEO½[¢³œ³²‡E¬CCàâÚ€¶< =Að$ñd[»‰zAÚ׋Ô·G{a,A¡Ì8K‡D;Oñ²²„¶~^ÿþÏ=Q/û x•< ròò»›[õÜ\°¥4ÚB Ò8A²'¸º—p2’Â(;Æçl„q°S#¨–Ž“[) öão)Wwï¯_ìݱrÔº`çÐð(aRA»Ý-oq^„'pK ã§<¥K¨3äQ(–êî°3ÒNþFÚØ»‘×|ß@F¶eÉ1`ÿµñnáçËëîtàÅû®½ú³ÕV¯²†áÈ÷ÑL¼}Æ}ãú©üÔx~µM7вTm­âÅ-¼8°Tyã"xžÒ õ¸ÜyFƒÇ¥vYã4Õú¾«þ fàr·|æ®ÆE€_ÏS· :E€¾ï»Vd LªVþé’® YØl6]K²˜†ÏѲ€,È"² ‹²€,È"² ‹üAYEd@EY@dYEd@EY@WoÞí~­à»‹—w>ÃŽËÈ"3o{û¯ß¿~ÞýêH§ez2ÈçsMù#°\Õ<ëZÃýr~z?NyŠœ@A: ·Š´r|Í>Ф•iMŒ;qßGuû-Ô,ôX訠|âb’ … …d8*<ÙŽQbi:[%&ŒùÎÀgz1²2mhdf§©°žOù˜R¹°)® ÓNgç’Øé<³gæé¨qM½ÍX³€«ÝõôúõÛýk¾¼îN^ü¸?ßÌÖ¼§w†Ë} ðüj›n Ì¹6A$ïÞ` žÑ`¢ëbbæ®ÆE€O?tݶADzÐ÷}× €,œzî=€ù"² ‹È"€¹«Àõë·ÝŸd³Ù|úøá²x CwှïüL\¬æâÖ>‹Ã0t ü¸ÂKç pÉïé¶Ý阻 ‹²ðêÍ»‘5ÜÜÜ4h³E³íæ‹àÆÿýëç#w 5+Õbw±Ç…¤»»»BÍ´õ´ºÞ—Óbáðšׯùdˆ §‡zýÙݵ×þ3G^ÌÑgyù\ÏÏ3üo }Ýö¿Òâè¦RåšØÎ‘íÇC=÷XÅÍ/¹<¾8^-´9Wì·z`…šs€kc¹P¸ròã•\Håݯ]atSZ“¤ÅÂÈghg¼<º5N˜<º‚8h0òb.„šS/a<ŒGØhM ^¬ŠWž\ŽâÖú޲þ½=vâÈùŸÑÄckõ–« #®i<5C.Ä Ox`àM^þcÍéá îØàP×9Ë$6;¿B{@GIås]ÇÌÁÈJÛÏ1_dBåZŸ8çrýu.”ÊÆEð¯+• ›âš´¸+Lè"­¯ÖŒN1!#KS+ÒœÓTλ…š©Ír#u©…¤Üæñ5pÁ™r9*_'»e¸ÚÊõë·û÷þ|yݼøq¾™­+x•å0 Õ÷ÑÌšÚ÷ë§ž_mÓ ´,U[«xq /,Un0.Õ٠̓€K®¹«˜¸Z¯¿~ñÁÍü}Í0—\sWÚ‹¿ž§nt ‹}ßw­È"@˜T¬üÓ%]²°Ùlº–d09ìù ‹È"€, ‹²€,È"² ‹È"€÷Ñ€wWð×ÿþ{1Yú¾ïÖ€ûo_Ö™Eð÷µ=ÌdYEd@EY@dYEd@EYàY·ð÷?ÿv5}ßßûÒ² ÃPØúéã‡î¬Eàöö¶û­m¼zó.•¿ý}™™ý°±ûÿÚFLÏôtÛ®*I$°L0“•¢)YUeUù}Leñ*Q:Á§d&Ó #âX˜± >Âb%µ÷¸œÀèµàŸ:“_îÍ9VîpÀ7\uS¤€‹¾ 4Â7xÌjâ$°5å±åÔN-GFïpÀ¯z_¯<|ij§¶œ{\ð<ˆÀ×_ÏóHß·U™Ñ.8¿ˆ/~N3¿ãÊPfº+ÀE "w÷g"[Þ³¾MŒŒîpÀe ˜Ì~FAøõëTøå>šéN‹ðu!þµcœDUJ½¾‚E&ênˆðâáW <ðÚµ/?߃€‹!âŠBøzàsC„ØkuæjØ‘;\A¦ó…ìeüƒ/"„_yÜÎÍ= ¸Î:bóàÝ>Üê xF„Oø†÷«¯¾ ÀEIÉÅØÙ]Û§7Ôa¾®ƒ_X—ºüî\Ýê¯\4e¤Ôzjó×5 —z3Â-L•¡ØÕQ ^?‰ù:åa¡_¸o•—Ã|u®Öxjùª ÿôQæ•ûeºÀEP²jì+ÏþÏkþQZ‡ý4+õ}<¥úŠy[ “Üà"ÙlAD–__]·Õ®4ËÃë‚øŸ%qÂ?8ö×ÄÍ6LJo ¸`&Îí5ÀV*?s³– áFx¯>g1å×v˜¦†¬aû$Úý'½%à"€Ç–äk—ÅEj˜¸zO¾RAŒØÛr9WŸ¼*á­ûÇ†í¡±Y.çÍáY…Å «Ö.7žyDÝ;—kåX.«5?Û¤ž-g­—oÄ?†Å6¬5BÇÿêñàÀEP,’á‹/œÌ…WûÎÄGÔ–R¿qV€™³À,g‡x)¢²¶Ñ-“ÈùRXq“¡·\"Þ^1ÙZR$|Ââ(sü bÇåÕ;2±Ÿë¶GiسVlúbökù.‚AŽ&¸yöÝ¥ W;çYãêT¡‚TîRÛΨ d i#ºejÙDÜ@dí¦£7\sà ‡,Î^kDöoYèâ•ÿX>¿n$¯Ù¼ Äâ3ã„âd-kÃÖ ±µþ-ÎÎ×Äõ±beå ‹Ü:;.¯ŸI¾prÉ-ÙЇ” &§lX]lb$B QK}²6!c&i‰E¬áxÎÃKß5à"€«VyµF•ÏîŸy†ÌÄ7ŽÍCNò5qVÙ6.#‚Pý¥š‘+ˆwíGE62´$B\¯Ç÷Rzêõé@{¥^ÉÜBÔÈ(»)1½à"@ˆ$‚"|.ËaKÊÈñÉLßf¾¼e’ÑBjxqš ªnS9ȳBJ’N"bž*ºbJ¯¸&âsÝg,þžÙiÇç "“äXnói'ŽÂ<“ˆ ›×‚ôBÔ«êñ¸'2¶¹4d+Ô6D¼0§^u÷‡ƒ>õ´¥®Ï¹U2òöœ‚¨Ñë.‚ì̈vz”é˫˼ï.Ä4ºÆeÿ„$ ÑÆ´!íMGQ`&)r#¾ÞȰȃ÷”a!;7ÉU.õÔés—,¤· Q2K )éÄè­ÁøfӓܬžÇ¿ì´“ËÅlRŒü‡f"«þâ܆5l†…{!Õ^‰©×¬2ÙWŠ/5IDd+´mˆ¥žj/à¨KÕ¯{ÚõÔ•tLï¢FE!3ÅÒ7ü\%«¡ Õ» "Â$õÌ»"2"±¿Š]¸NlD겾מl!"L$¥m„6Lßò‰x1Î+©þã@»Î¤/ƒ…dÉ_È(xC¡ !"KÔ""uv†Irœ#¯H„Hêб¥@H²£®×=G€¦ŒþZêXZ‘­ÈCC$'ͱ9MÓë×=’tF}O½¦…¬äbN¢ ¿&."(R0"^±å!E8J`½‰Ì³5âóÅ´¬Âtèµ/'K å¸HCzhDš…¡M8$"YÈž;:”@H¯¹:uÀ,,DíN\%«'á «E¤B–}…c%22a–MecÉBØÜB²vDN‡%{I3Šˆ/ ofYú@#§ïõ›ÇBJQHXˆ™Vå öK-\DRÄ95’™Ž¡#Þð™œÏiF¦e…L»~úè8™‹—°·Âiñpo’˜¬[Èsï¥!c7Ýs¢FtW.‚’Õô:Æf§8 s±„mÔz“à¢8í°Xß2TÕ¬4R'|œ— áFêOˆêÚ¾£ïŽ²ï¨‹ÒT2_î..JØ!5óCµnF °…ŽÌƒ"¥5jØ6¤-e ±üˆØIU 2.-çp óÑÕLéÛ.YȾ£¡íOÆ ±;„€‹áâ 5¶<ŽˆÍÇT H(`¢†hË}XÈñøòF,ãi³Ž»Í$"B[ám›+vRÄÂÄFßúx ý˜”)Bæ­£vŸ .„$÷©J?Ì_¹)ªU&gYD¶¤¯áˆXˆÅe^Bâ»KR¦ô—nŽó矻?зƒ>÷YDTÓÒ—Xˆѽ[¸DD¨`l<®d[0ÿwn¨wæØôõÛÐ8•u}„Of×Òl'çXˆ»ˆÐ6ˆPÓ,¼»Ò×½>v´–žú~n!q·qçËöv€‹a¢1+:2(ó(#V=Ê-汫iˆ„thUiGÔHuVøG~!oKP¤ˆˆPÑsGßJ^æÐ ÑY dÙ<î@DÀE€I#'zaUB¦†óaæê).i±Æ…¦×ü)#\=ì%ïÌ Âì·4ŠH³("]oû6ÎïßçTM£"¤âD\Ä7: "Ò ©Ž/R¢™˜°TãœÙÜHlq‡"1R¢¾†1™OòR9Mñ‘‘*bß9äC´9í~†·ë\ä3ÑŽhOtâÕNUé˜Ù–èxbL*“…"’3î~Z ¨ôÅ0Fâ#áØê2 ç¶ñeÃ."Â4G{úî"ò}"bçr1›Ç|úÒP†]Š'ñRÙ‹ïX¦û;]¸È¶<…Ÿ!"DÚý-šH©V5+=_LB,Bb²¤Ø<—3OÐ0Ÿ /¥oëÙ™¶Ïöƒ‚tömO©@äÃ!¦íg‘RuœߔYˆÊf=†[ÜY¾ýUÔè6 ."$šÓ;"¥ß¥«Ð\ùa2jÔ°‘ð(™Á¹ÍKãv"âÙ_Nfæ{>¤)v¿îèiGÍFÚ-'ˆYÒ•ªÁ‘ Rûá7¶âbtF?¸È_þž¿Ò·].PØu‘%„HÏ ñØcVHhNˆÈ¬XÕʾD8¤ÄHÉÙ™M“Ü$Pý¾§îè±#ãvóGCÂB\ÙÆåcº‡¬Pg&JÄW‡Ý $à"Ìôå_h»£ïßÒ³M>pùˆÐEh%²â+ê/_Ñq¥~Ö‡—®€Q²*4+i]DD¦»WëéÛžþñLÏ*Ô¶Ú4äèš*Ô˜ÍoN‰öJ‘ø±· ˆ€‹Øž¬¡fCùWzx¦~'Ò(ùø*¢¤ùhÿˆÖ›TKPÄH™¤~`ó‰—ÄŽÖEdl}Þ»vªÞ0Ò4|ýçõÒêC×/Ì³Ž‘¥ªJô¬Ô _­vƒ’€‹ˆvdц>Ñ¿?Ð÷ïô§Z>¢‹Ž¢k§ë:’ðÕ%ÂEòß²G?ÞÖÛü.>dÈ÷ýí™´ÝhÓDñIíË{êÃ."¦;#VÚòÁ{Ñ ¸H“ZëI÷¤L²¡?þLŸ>Ñ·ÇT‘ðôQÊGDf¥W!t„i‘¬ÄDzi½ñÖ]ÄßLjÌEdOÛK·ÝÇÕf³‹ÙefQ™ÞèÙÒYŸe®ÏËD„é: .ÂDš^¤é3Y›Œä¯¡/úïGúÇžö.""¯¬#QàQ—ŒDÔ$öN¦Ä¾4L· %5z<$9l¶ÄgœÃ,Þ[W£"¾[™ÑÞH•>ÍF¼»>4à"ÔO}7ˆ´§¾£®#i¨} ÿ+ýiGÿ5IG ¥×¥ÓRçQ3…$8·Ntå•áròÓ9d1;Ÿ‚Qòµ.»¹ˆ4Ô¦6ûæ.ÂBæ-õe(Ñž¸§þ~ ‡ú_ô×gúÛ=vï¾jUéÐx„:p˜GÁOcËòÁ–#"Âùà¾K‘}»!:#"Zù^ØÏvoÔ§#&FÛ—ðû9U€¸ˆÄ IGb.…JúH}KÍ–¾|¢ÿó@;ú'zîèý"o¥#sàe¸ZIXLí+FÒ”àÍÃTÿïYvífšçæTD쌂Ø-Â\DÔ²1=ø»ÚmI3úYÀEJ,ÄW¸'óSXHzêˆú¡}¤n“äÿ>Ð×gúû³ ²3k:¢\¢MÞBøxŠÜX®ÝŽR’ÿx¦CÓš?ëg•"!"±rÑŒ¼½‹H¾Ò<;s,4öÚ!pö¶!Rb%k²…§C-y¾F©ßÑî@͆šúËgúÓ'ú>Ô‘¼Ã‰¼q¦¦'i+™Ú±Ó7³Þ¼ìŠï=òFgÃ’Tâëµ…Ä6Çit0ê-rHLÔR`7Œ#r›œ€‹8â[ê¼&fWñ`‰ŸÕQ÷DÝÔn’Žüñ@ß÷©¯ÍcwçòègjÆ:Ö¦ú½K^Æ4ߢŒ"RªXÕè?;éX¬ê/"²`!jñau^&®Øø§Ú|â å\$tÄæå#D\:›²Òá@R·'ÙÒf0’úcKOû”µù¾G\d!S#Ô Í˜Í-³/DÛÓNZrŠDõm»ÐBÔEÄ,“¢Xd©p¤Àu[*EÄϲ&„eRö¶DH,®&µjœù‘Þè'N×Ó&k΢a¯$(à"u9GùSîÖ¡cåc›Ö¹£FéYé©§§†¶zØ$)ùŸ¦ýL_wÉHöúu¢YwšŽði,"‚"ßÓ…²ÅÂT+ᦚƒQgÄó±M";c/3 ˆÝØ›r4–Wr«1{,[Ly£”•OJ‡´¸‘hÛF’Úýƒþú™¾ï“‘< #‰N©±‘³??‡3|WQÉÛF-í,;c¬t-•ªBN\æÙ™ ƒoh!£‰R ñdM]>’2§V4-{¥ÇžžôÉudÓæâÖ}G_½”¤Óß³d$è½OMƈùxnšHÓæáä^f bá“κ3–>#"‰öü§×BÂBÔ—k©u$ŠXiaô‘ãg"“t1~9u]2’MG­ÇHjúógúÓç&ù¾K^²×·«W•»Ñ‘¾Ïj8/F=³)WÝ[,:96ÿª{%5÷Ä8""FmuÕ-°?G5­_Ô‹,•Q>¢eô‘ÉEüµíIÆ’£ƒÝõtè©=äèÈÖ¤mé_7ô×/´;¤ÄÍ“çn~ŸèH§´µèPùh“õ&aV¼…9ŸWÐ3eªZTÒÈj“ø)±¥±å‹…XYT¯ø)ÀE®Ó›•˜ù‘Ò¿†…¨#âCÎÚ°åÓwD¦e×QÓÐvXÚ´Ò }ÚÒçê5IÉãkK‰é݌ĺ¨1o»žb UOŒÙèzfõa%Mf@‹ù—ÈÎØ- â¨+H?m¾”…@Ÿ^»¬sú¾(qZ’žxCÜ¥•ÆhŸNImçÏ/íèÐ%óØ´Ô6¾ÈÐ&#ùòDdŸ¤$°ï_þñ/B¤w ٴĵX®¹Ù©0±dѳz²˜zøPÇ:·Ò\‘ˆ)ÍB:&B#7X¸È:bQ>’WÔw7Ñ¡F§÷æd$?«Äˆv”9Œc¶25®#É^Ò)éö®,O^S¢J/ÆèˆPú¦L9®`F<Ù^K´M_Ù¸ ›¨çàµØKF“,ÚÀŒ6?51wÉn~H•:ºp‘ëu„i$ªY-ê¤\Âa%ñ…)ò5ZÞ£7êÇ0‰P#§RòiCŸ·©¦¤ëSrçyŸÚ®#½54òëuD„äH¤ñÂÞ 5­vKý~ÖÍ&:ↈd¤C¿z¯iÖæ×5:ƒVÝt_*).r»ŽDùH †FÜçS´!°‘Pv”ý|@¯&™KIIßHã›> Ÿu{É!¼ïHoБ„Ò/¡!nˆ·%F"y¹„ΫI¬ØGQ_J^æBŒ¨Y x é˜×²p‘[uÄæ:b%ïÐø“U\Jüs¸Og‰E•èž2¼&%^åšZá<ØléOæ^Ò»‘ô)•ÓõiÑ‹u„($oæM›ãÛ†¤-£œéLÊjøGÕ–2U5º³$"œ%¦b5óö¥!à"Á5Ñ‘"¬q"ûGõej1:XÞˆ“ÍwªKɾóG¸D‰«)a¦¶MËg¿F5ëÈa\ºt¹)銑d„fè‹da$+TÛ¦Öc!óþ»6³X2¥Æ,y+½ÙAã?À:FÙ™¢wLð‹JCÀEB>ÖÆ±Ó±YËÎ'ó˜¸áÜ¿†ËóÑû×õw!%$®#äÜMÃ$â^âËfCÛMä4T©÷k{w”ÞÒ¦ï G¹]>Ä_­ß›{’·¾pí8_µR׸ Ùi^Æ"r¹ˆEP„.LÇÜGR\d]P¸êA*ѹ†…¨'¡¨]í"_CïÙûòá±"%äR"B G¼$K@î[®â¬>†ÅŒzuÄ[·Ëa’弇yòuÎËbÜ!båÞøÜè &yË”¶L¬fwŸnº3õS$žø"áÎg%b÷i!à"Ld«:â­†Ž•§eã;˜¬'?.‘¯a MÙ-ÌÓWß‚jî>"TDDH8Ì¥Zeò’ÜdhÅc2û»Û¹ojK°ðr×W«N®Oa*½¤]”´Ï¢ûQ­zU?bÖ›êüvÖˆs䬵”(HOÁý•†€‹¬;J¬Ë© °Í«Y•¬ÍQf_Ò9¾”Hº•IýÚý…—ÏVxŠa”TQ¤Hœ0#[P/˯Ú0b-I•ãŠ.ÐlóôæIsúž6DÖ÷} æ„Õ^³l!™Ý}Q¥EÔ|¡»\¤¦®fµHÖ79Lb1ŠHÉ×4½iºç)¬xI2û Eç8«Â¾TÖ‚²<6‡ýp´t³J­ÌÛ8D6ݼÿ“j„•Ž{,åõ*rÄÕ£v¶§JÇÜOR\Ä–ÊGWüc]G$­Çä5Êy"_—’q"8#‰ò‘Ëò5?ö 5!ñ–gå¾?ßSÑ9ÿ0çì [ðpÆýq4¼Ä”ΚK´ó•Æ-jÃÖ±Ù%y³…;Š’U­Ò1w”€¸ˆy{C5I5‚i Oæ:â[îi ÷óY#_Ý}×ó5먿ªÎÃùLÝ|æñš`Ž ‰#ÔaL¤•fØh$±‚R¾ +±©¥&wX˜vf=I5llÆÊRVé”Þû,ÿ£a"[öžëˆäòiÈfcDwßõò‘X¿š0†òGé)÷›¾'Ú‹VçûÍf×I97ü†gã¡m¼pÕˆ¶~²ºÀ\ýõ´únï»4\äv±›•¢Þ×)Îd¡¤"¥»/çëVó5/fM‰Í۱К©Çž†©•Hª ˆ©qS¦ÎóCë’E$>ã=•†@½¿¨šðÂÐ#Þ××´TiLjÚR>â‹Ähñ+À¾ „æÙï#£…ð¬6¶cÚò™\•Ô{ÌõC-.¹ûÒp‘W1’:RÂy½ìˆùkDHÇXˆ5¹nÇMº¼|ä®áJD²3Œƒ¶qœÁœ³+fô™éÙlò·3µÂV&Ò‹#önKC .Â+}j®£îgÉšˆŽæÀ€£ô.ì­®>Bï$@ÂDRýÔâ""óÙÊÖmBÍ;ÈׄˆÈD„Ç&ûÇÁyq51¦O”öèÒÏé0é»¶pSb®ŒdÄ΄IþY# )[¾‡²¾ôõÕt›MŸÏg&šÍJ÷«#Qo+ž—áó'øË²BÄþùybªÔ,øtï×B .Ò“‰?ïë E˜$!ë×vEIÛ‚Ž4y.½žüh™ÏvOkÝ}©Ž„ˆœõ±²hŸWø¬ˆø¡&5Óù.Rf .¢êÏ5#9®¥ ÂTr{Ë\z¾mèH‘„ŽeحĽÄd¥»ï¯©f展rÃ|úƒ©¥…–*zÓxÏÞ‘žœÊñsj§ô¾éHšë‚$¥gÃ!uúæ"Œ‚ºp„cGwäDG8&ËåÎ[¿«Ñâ™HØ[_™èÌ\2Ü·~€F®ŒüÛk—v°”\Ãk”Þ;à"}O¦ÄBBUçÛ:qS÷ µYBçÁM¶„æ# è©°œ²±•Iä2˜ÌŠ Qöõu_<ÓÔпµž…ñë--ÿð.Ü÷©›î×§”‘±° êt³ˆÌ;,¯…CÔ-¤›,$¤fjJweʈGPzõ[ýíY“ø"!%ÔîI¼š¤!—’Râ:À€9â Ä‘²¹´¦Õ¬>3p×!‹Ùm¶-ýáþÑ´$ì_A“ˆ0ÓöKº·NéŸOÉB÷ÙBXê:ÓŒ”"oÖ"-„ò8r¬ÄÊÔ[:I{%.r6L²sÙuEJ%QÒãÞ¿¾."ÙE8 —õùµhÍ_Fs¬\.Ô²‚l¨isÔÄÈÛ±÷ìC:ÔiR¿?†…ˆÌ'Λ‰pˆTªa´Hç"¢å͈áì öFÝô\D)#·†I<@âíTM¢ž‘Ò˜sn‚µx ¹—DgÝåÐyÕˆ…¤”u‹Ùjš-Iëö#d~(DÄH¶ÔnH¾>Ó}£ï{R*iºÂc^©*IŸEs*'t¥¿.Å›/"ÑgÏ“Qïºl"à"Q± /`$”¥¤ŒMâK?Ö‘xîF˜XÜF ab`‰•âãP ®$V áÆgõkc˜Ò""ä‹ú9[R¦ïÏôßßè랺ª,¤Ö ñ…¥:³:_ó ¹4dr!Q#¢,ÑåGéƒ.RGn2’Dõ­%eS¥¤§¦)."$ShD£Ž$!Ë3ØY^Œóøô<.ù‚Posò¥ùD&ô¼£oßRjçwøã}±šrŸ±?î¢û÷æ2¡WYH>_sÇc™Æ±ß«+/Œ»ú2Fa’&¤$µ2zIŸVØÒŠæ>ÀñÔàRvʾQÃBQ:wã:¢Þ±×vØÓã7z~;$'4VjJuˆ·á%õe¾ˆoïvJúsáÉwb$ÇßÚ~C€ÚU½5kRÒ•0IC´-ߎ{Ô‰–šP!ê‹—T¥#,~NëKsê(f¬0*"Òz7™=ý“öOñ…zo­´¡#U™jÚ‘6£R5·YVz¥§žº(P½-w&óAàíwìÊ .RבÝ‚•¥ógl[’#1p¶.)¶˜vN¼;n»)‰0ŠõÈËXÂôí¾Òî©x“”Ó4.#®,DÓ-EHÃ!\òÔGRæZ©Ј9Àï©S6ŽÜb$™ƒK‰Dq« Š‘øþÆÈ4­7’üc»¡v“;ÅWjª®4ã!kH{ÚKy³\‡adx¾ˆ·:?8‹HCQÂ"ñÑù´gM‹[ÈÕÕ!«˜‘ö`|‘—‘D¤¤/Д{jŒ6‚¬`ÑŠ)¹p¯Ô©jò‚`(W?Á£®¥LL<þ 2û¥e£ì_ý·\D.}¶‹ ˆ05MjY˜—û¢ZµneÃì´FUÕTu16!·Ç˜*ÑýzŒ~oÀEtÅT$µÞ0—ÉýÙêÁÙk*ÿŒÔ(Ç%Ê?º93¶1§%,ä2#‚4à"—)MØEú„…Xjó~$·ëH¼SiمĈ¬HÏ]ÀE¤üaʉ˜Eìì[<첈…,©ÄíA>ÞeFô+JCÐ^¥ $,Ñ/–Ì—E¬^´\ÄVv/fdÞ>)cï7€öbùå™:B°Lj˜>:P»Z[ˆ·o‰[QO`ú€€‹˜·wc!±¢DæíûíÝfdê¤LB?ˆ…àÿ³[‡FE˦ËîTí¿)Þq‘p“g]¹.2ìÆ!@°ï_ê4AŸw4Àmj+É;0]ûÏÞëF±ƒQ^¡¼ HÐqÛé()x Š[Ò­Ò¥L‘Ç  ¤Û:à}i¤£=Ù­‚V¶ù>­¢Ç…ÏîœØžä&¾pÝí—EY@dYEd@EY@dYEn²àåë·»QLÓôp÷¸äãÿŸv©Þ 9v£ôNï.Ï"¿~ßõïó—¯O–‡1>îÇ»¡z§wI„­î?îǃý"² ‹€e#d€WoþÛ]‘0ñøµ/¢<žq}j|ã{WÁâ×o}µ|isn¶?jöa¿ßg¼È}¾Þ¿«r—_ òª‹Óm²0þgbÞÎýdÂ(gGæR%uPå···uêŽ,´3‘°]s©œ%-ÜKª1'mȦV…:®:™É¢¼ &*OÌósàØï÷U¡Ê—ãZ—Éj‘¾ ÍY§ß™•l|özð,H!ùi˜3%Ë×.~©Íä1¿²ËAФÒÖMÅ‹œ/YÒIVÈjuܦŽWcŽxû±c³ñÙëÁ³`éáÌ´A³ëOÞœVê¬Ë •Žþ \Mœ,³#Ëq—¹yÐͪq•ÖÁÀk4¹ôpùÔÂzh³¿W[ÌjvsÉœBæÙ‘š,éB^{ÏñŽÊøÏôÔRÅüú˧ْüÕs³µU³Vvz¸ñI‘OóŽ?/K¹_$oURÇ ÎŽdS³¿ÕÚ˜(jká)×\²dùš%µFS$Y­µÁÊÄ|ÑLj÷d¥ñQ>PȇGÖêdI_Ûv“Vª­÷ºÙyŽ“,²l©M$uœåY­Í«ñ9×§]¼ï.(>‹v¶¶|K¦æ9"^ôÇ­“÷š,Ø:ÇøÉÃm»òø{WdÀ €pÈ"€[õ4MÆî)z§w²àV±Ó;YàáþNïz¤wzgï*€,È"² ‹È"€, ‹²€,È"€ÿÓû‡8&€a4ëq>½ º9€oŽi`€MÚü«"¨àiëw¡V/©¾ûIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-09.png0000644000175000017500000004467210536106572024575 0ustar gregoagregoa‰PNG  IHDRâ<;µY7IIDATx^ìÅ¡@QîŒ+ˆF1†ð_y:]ò €GÚµìÄ!@°ïóI¾k1›Ø¯~g$Ù‡½» £Šâ~ÎÙ´&iÒlÌ&$*5&›«VÐ(Š.Áú胂 O¾¨Á_|èKA|iUèSµb@‹ÅÛ—A«"ŠÖ$-¨mA)¤1n²ó‘îÎõ,C’Ý™,³Ýͺ»ñÿËeöÌ ;{vfv8ÌÞÙ1ý™ó?£F ¨!˜T`쩨j̼áìêcÁlAÄ᧯?rÑlpAÇàü§—îÎ\p8sÁefõÞ‰ƒ™GõWŸyĈIpù[-jë0qY™Óªˆý'"sÁá÷î/?sQz+Ô"óèw½u"3þLEdèÇÑG p4¨Â=-³2%è¹±7¨qRù—>Š ÒtäÔ•}öîì½}WüÃ©é —mEÔÑÚÝÕ×7$bbUøuOøœŠO*•À-—äbæ¢Ë|˜ÊBKL¤ùĹkôí³"Ú5tÛ kEÌDŠI­N"~3ËŦִv‡s&E̬%RÌʈ¤1”¸›àæŸM9:½?5™iSd ”e£tÌÀ]<·Û:ªÉ’VõËÀ.dU%»zÖ3‡ÎœÏg3»\.;ºÚ¦]ö?+€dS¤d«eé´Ñ|Ã\BQµñÏÿKõ8ìà»,¢Ø-­n”æôý_ÿvæþd¬êÚa1^ñ¦|°w=¯MQØÝìNšnúC#Z›ÒŠ6  Õ*žÄ(H=xô*è¿¡ÿ‚ÿÁƒGA<ˆO*”âσ<Ô¶¨ØƒÒ`7kâšH"ýÜyÎ.#ñ}ä°™ùæ½oföíÌ›$ Bêõf£ù÷%ŽÎërçBºîÒ­B2a!Hî”®•øèk ‚Uõ™˜¼P-Ý}R6άüQ ðHÜ–êcNO(ƒÁ`ðqžúß! nÅåÅ&’àŸ—!ðáå];P"€Í£\c¹ …Ñ]F(è!ü"h¿ò^Gõd²qf%ÆUs\î%h¾å1— ,ƒÁ`ðFDÄ(P®'Áõ|¤™ßqÀ*,4¯Gß,ÍT'1øšˆq †zo5…Á`0–>Væß̾[|õþÓ[¿¶¶¡¶°÷Èäø¡±ÑÃÓŽY–-Ùè þ8rŒ?—¯f'öÜI,Ô° «'^~’½c˜@\CêAc0|g=X}øøÎÜ‹GUëÛÄxqO¡T<13Ü?`5úšv­M[÷k_W>,.Tž½~pû^uºxæüé+¹í£ä†V™ SèZ¬ÂÄ‚$ßÎi×ú|¬­‡a~1y¥Æ c­þ+@™»;1Rš:yv×î‚'DʵÒ)7¬NU¸~ïë;”ÙŸÏ•üruõËrååõ[—6+íd”(_~ÐL¢ ¶é_ÚÂT ÿȓҀ`ð«ßJ¿y–Ï2dÔöøÂ oñܸyy~áIùÜÕã3'÷ÌïèÏe‡ÓÙt:üˆT&üdÝ!a Oôe3ÂóÄ ×Ù™+-Ÿºpm%ø+OŸßo'£1J2pÈ5p8û ÀÄrlÒ¾&|)ìkðQg‡@ÖÖƒ~j…mqõç…) Vº— \aŽ6²w·1rUeÀÿçÜs_ff§ûÒm·n·ëVJ–ò"µ@lQHŒŠ(1&&~¨Ÿø ‰Ÿ4á#Aü _ˆÆ`HÔ€Q*E"H°ÕRZ,ƶ”ØV[).ôeßföÞóòïÞa‡ÁaÛºí2lx~Ùœœ¹÷ιÓùÒžsî,mLàýб<[<ôÄ÷×_ó©‹/¾²¿ÚWQ]a ‚ÀHé1"e‚€žK6ÞØ7´nëî}åðK_¾õÌ£±óì"ß»ó²+?ºï¥çóî«çøy:òyS]Æc6lÀ=ðÈ]»?wÕõ_^ýÁU•åJÄa ¢ ‰‚PŠs¼“,YŽ2Ì8o}f¨nD=ÕÓSFºTŽMOÙýû$Ã7o»·T® à}ëcÉ~î`³ƒf§‰Þ~ÖhvÞîÄÑ<²õwÏ<óŒÂüØÒZ À_#cŒ±GŸúq#£¬º¨—•ˆc™D* …B¡ˆÐy¨Ù6 ”q@D XÀ©HDÕðÔÐgT´éæƒ;ŸøáÏnÿöí?G ry¢%ò›>/¼·OœûÄØ‚¾ÆóÇc<׳mïÖõ7|iuÿª<£4æz"FRPÓÙD_i Ph ÐÊŒ”¦2ï¨ò”/ LaíÕŸÌk*?vwËìÏùeGž¨h=¼?ãÚ¶Ô“Œ1Ækfóõ(C›>3ܳ¼Z^Öxœ'Q]!"IQ¤â£µÇŽÖpiß­•°‡¼CŽÐ@BBÂQ’„·±°¡²qd¥©Lè ~øºÝÏýfp×ú®¹ÕCÚÿ?£xÀ9÷ÎyGÈy3“xw0ÆcðX$ìG^5¸r¸§\ –‰ Y„•8R%OïÙ5vß?§÷6©R¡ %/c%S2DA¢@¦U)BH5´ñÆßþñž“cD sDÞçµõiFÚµm“;)Œ1Ƙ O÷Leã+׌ö÷$(( ¯R¤næÕéc»^ÝúÂØƒSö$ÚXé#ŠŽ «võ–‡GŸ|öþs™îñ–|f(Ó^[ïÚÞò¾ˆ)Œ1Æ˧{JW\»¼\E ãm>>ôõD%/Øþø¡»þzâiˆ$ J •’-4°|äÒÝ/?599†ù9*j'†Œi+œ¼ßb cŒ1Æ¥DIWµ§REN©@ª-æ8²Î9Úš®°÷êÁ/\Þÿ¹Élòùã?úq¾ÚZMie‰ÐDÖ’“*Ê *Ûvü”È£u>mÔNÈãBKzÓHÆcŒmÛñËêÚËz“ uSÏœµÎigŒ3œ·Ú×êZDÔö^sóEßêOFOîÛòòw_|}«%‹9–L[þ€Èj¥‘?ïݪ³s¼÷ÚRª½u³}\8rénÉcŒ±“§;˜¬XU!ƒB­nš…«sÎ[mǵñJaµ;\¹"ùÄÈ×nþ €mÇ~ý‹ýß9<¾Ï8ÒÎ4ë(– ~J¾®3—â•kö¾ü¤o”Ìx",…%‹1ÆcìÉCC(šÜŒK‘¡”†Œ%c(E¢ª§¾ŽB”F¶4Ú­ª ç‹j÷¼ö§-¯Ü}Eïõ—|V"jÖT´k&²12.•zú¿v ÕŸ§ùžÞâ˜ÂcŒ±üw‚j¯L¬¦ @DA–Ùjl,™Ô% æ¤6E % TT‘(åe•ážOºï…±§öŸØ½yð¶•ÕKÔ(ÏX¯Éë\`LJ&¤Ðô ìå/7 ÐŽc ïìÎcŒÁÿ1~¬ÔÝí¡0mëÒ†± Sk”4©I1G§¢nR´qPeÙÒú¾R^VÙ~è±gÿ½åWûïüвë6¯½ÅQ˜Yc2k¤d´±^Ù°TxÒö+²ú=ý·•æeï~¾aŒ1ÆÄ¿þs@¬¾©¨»:rY˜™DEÐJ˜£©¹ ¼)‚r¸,¤X!úô%_]?¸iËß~t<ÝþО}‡nè^KÞh²ÚYŒs¢¤üÆØ‘þñž«¦,æÌÅàÅÈKhs÷Žä*ÆcL§õŠiAT’ÉŒµÙÔj%åŒx»L×1PÆË¢þÈ–Öõ”¾qí?ð“ݯ=ýÜ¡û×-ÿغë-9ÚØšÎT ã D”ÔÌ©~¬€ïxLY@Q¡­è²’Iû•í7j»æ,opæ#g¼ýeóHþò oY¤(ÃcŒYO@ù „´V¦@Gr-,™’*?™"„æá¼Õ4S³§·}8Ï(iꇺ7¯¸V“µÎšÍ(bGVÞ ‹©-OÌ{jƒ,øFg?RXÀ€ó%¶Å«?1ÆcŽ\Ý™ Dæ3C€ºÍZÎúDE@@ªSòmÈ»ÔÖê4qàÔÎGÜsüäëÂö]5tK9^¥É¦FkgMV`­©*ïÕ™å#Å »²Y´øŸ4°ð-ü“wcŒ1fœDFºè[u¦D‘óÖP7ÓíÕCYÍŒŸÊ^ßväÁGOSÿdS>Ñà­ŒBVk­É´V*Äï!°ˆTG–´%Œ…_Ù~Í9žZœO¾ô1¿”vdŒ±5£GêµÉZPR€B·žK*Ö9äMjÃDE§³é¸ÔEÞµˆÒ[ʬmÍ(&êÓ™ÖZøØï"1yjp`Tˆ÷ð¾)-%EБû2&°„0ÆXRê¢lÂÙåÍÊJͧr&³zBQ$-y3E©2S(xxíffìT³ˆ2>‘]ºâ¦Õ½›LéÔ’³Î53JMg™Ö\–eå®JÑÃ.,2u¡C£ó½ë¬ÓIÍ+8Zû©ö[´™„æ?³ý‚Fçß‚wò_öî.D®³Žãøï<çeÎÌîÌìîLwgw›mÓl^HÒØÚÖT))¡i 5…*X¥ Rh½ô¢¾Üi‹‚7B© B‚ ÞÐV,k¬5¶M›444›¦cf6;³sfæ¼<Ïã™}Øé¾à†Y¢$å÷üyvιúòß3g¯ ""¢Ù™O¼õÎËQq"(6xN'‰3YÇ5¥«$=x¶ã+OFã!¥µJ¥%çOU_:~îf‰rïÌ#y¿©dM ˜ë­&€NÔÅ’(¨í¹õ. ×åsSÖßRºñ¿›óÆà+7ø^^pã«™iWùæÿ+6ˆˆh÷öýxíÅ+SÛt¤}ÏJìЉ3iª8–€±+A(2ÃHñÂåðü¯Þ~áLõD½ž¤çÙ±å¾DÉfØÐ”~£¤W ÚiÃj6fw’ Bð)´ÿíÜzRA š”#Ý8rmXù °+H½^}é×§Ÿÿ VSÉÔî‰Ã¹l¡ÙmcÉš@‰¥L´ ƒ–i”Nú¹·úþÎÇlMa¦ ¶\¹aݽëð+Õ?‡C³Ý(„ÛðàÇR"%$ʱÄÊX9ö¯o¿Yýû¥K(ß³cæž~šk5›h•FO}¡ž –d††ÜVmddâ¦ÊV­5`1Sþ+"""zø'_ýáo’›‡U³, a×Y°£|ÿvÚ~¬`ɟΜì´&vO=èfs&JŒ5u@* `¡1o%Nº®ã gqøÂ¹C¿À‚ÅmÊFˆˆˆ¨4:õ™;9yñxkÚŠD¡Ws0–cEB0K”-·ì…%L‘ô­©ó´QZ‹MÓ(ò#QÒ‰r~þνŸàý1Sˆˆˆ¸PÁD MWê"›‰;9¬f¡X*(úY©$Òi ÛtÉú…J¬d°ØXÙ(¹Â%´Pø[;]¥ ðf *xòwïkßÚAVñŽi5KË*•OºÂ6²b®/'Kc¡Þm·M 8Þ¢FcdbÔ›ûð–Êþ;ö<<À;c¦Ñ‘CO¿ûþ?ß¹ø=37Æœq¨ZK©a­†C ¯ÿ Ÿ»/Uܸ|Ù,QL h`bÆö¼jé‹O}_X3eDDD$Ž>ñÜwüØÂ•óGk>vÇ„UPQ€éýdYOª8 ‚n»­Åe¶×ÐÄÂä$ 7òO?þÓl&/µ¶˜)!""¢œ[øê—~ôƒŸ}%š­»“Ýy +ú½b’ë$f³Ù EoB,°öäôPïpbøs}«2y 3…ˆˆˆ$`ÃØ˜Ö¸¹²ó{G_üɱo\œÏß³`)V £:ÜŒNËd¡0gׯšƒT€B>[fõYÿ‰/<»mæn¬ÂL!"""©|ýË/üü·Ïœ=ñ×ì~¿0„¦¼ÔEŒ¨Ž%‘ÒXÖ•‘pÐ'ÛväP&;UÏx¹+§Z¹õÑÏgrê6­±Ì"""ÒºÙlöè£Ï¾vêø/?ç•s…½»*#a;î†Q»×|(] ÀÏxXf%c£å¤8<£óÍúÛõôÓCŸºó±œŸÇ¦1SˆˆˆØ(f*­•”‰RJêÛw<ðÍñ{_>ùüë¯ü>,çü™Ñry¦ŒžÅ¨Õò^@«¶Ø}£Ñš{oÏí÷?øøSåò€$I,aà3>Ì"""ÒZK©©â8–RFaEIØ ´[qï›>²½|ðlíÎ>ÿê?¼ÂXfÊòí¬Vk̵æj¥ü–}ÛîÛ¾ë`6Sè·Õ`Αs=WØÂ²a;¶mYÂÑ–°`1S6@DDÄL±”ÒJk¬àznÅia.7SÚ—9’ö €‹µÓõðLÒXmbzvl×tZ'Xâf\sHëh-`}Œ·)×âW*‘eÁu®«ü¬†–Jk%µÖ@'T±„c#‰%Æ·T€ƒ”TXAØ€e;ÄÒ4[,1»Ë‚°,“DæÏÇ4S,\+DDD¤u/ Ì–ÃÑH ß_¾szõ¶ýÔ€)¥×ßÛ‰™ÿo7 """( 4ôšþ¯0SˆˆˆH_§ÁÁL!"""3…ˆˆˆ«f q•ÂL!""¢ëa‰ÂL!"""öóvëЄa ‚áí†XØ€;ò®¤sH²cÀ«XWƺ)Í€ ²ùªûYÁN5–½»­¢Ê8|fî…,J#  QD¨¸‚ ½B(Qq‘]6Äh‚A ‘1Cl"†š° ?ì&` ­‹¨ñ-&½j0½ JQ ¨ ÕŠi ¶&Òm=fÌLð?{fn¦sïuø=¹™œ9ýÏaÒ[zÿýŸ33äDš"¾L€µ)¤)€4€4 ­’ h~ó}UÂú*cÃG‘õC¹ÅÝõ 󭎈xÓ˜áÏDƨ€jŠ1wñÚ¾=†£7þLÜþ¹n©ðïѬY³œÆþýû¶»ë}õÂN‡N>à‚d9›½ì!³&Œ Óo×éÑm¯G’ÁI¤)Á5›(yO ^vßB—îïšì4DdQJ2^%Ff<²ZãöËH3@:ÌgI2>ÅçY©€ašÏÝy1¾›rrÇì[qw݆O¤ îÞÛuzÜݼÙ“¼÷†9Pº(¨äuÅ»mX–ª¸¼Gˆ æãÄÜ#W~ÈsÅ>pW•×™ˆüµ§ùtäðNßk3@:¾K9Âd'  =¹ñ…"gmdgt€tŒ‹ dg4 e‘“}ѧx¢Ï…SFæ CJYê¢ÀÒ¿èoªÌˆ‡&xBr6›-ÍgúFXýnâû <­ ,C)Õb€û¦€  M¶66(Õ¯þ‚ió¼¾ ظq£ž\,Á³RITS²Ù¬ T,JRÂ׆“>WIq̪`+Ò”KGÛ?ëí<ÚÓÕùkù˜”*:À•>—•¥š_?ÜþE·ÛcÛVõÜIKÿYÑýËÙˆw+®OØ…)¢¼ÔÐæä(®ÁÁ¡Ï>=Þ¸yß„ËGú'Šûá´ò_ `È0Ñ.6¨¦ìüïÁÞž>åçxç©ÝÍßÎ]09Ïʘ¸E?yHÑ@šr¾ïìáC=†€Ö½?/\tÝ龡üüæÍ¼¸ýî—D°z×|ˆƒT€t¬O1ÝñÞd½8»BmÛ­´‡u˜“óZ™¸ÈdB´Md¼ìãn>%Ñ“?HSöìÙS[[ë³}ËkëÌcoK‡^ƒ¢Œî­›:ýæ+†}rDf**~Å_€iŠÎB‚¶N5eòÄÙÊlßqýr«)QÉiYÌù„ÞF,c*%ªð š¢ŒtæÑÛ}êÕm_*£õÏVX)wÙJàMª PM V>aÌøñ£Oœ8£ÂÔŠrßE.)Õ Ë`Í+XűÁd¼ìqÈñ]à+O)nPM‘®Ÿ¡ï2p~P £/ñàŠûÎùB r*GH4h!â „<„Ä;îjŠf±vCÕ¤«ÊdE÷÷³”`G©¦¨Ð¬ÔòúÊ•«+ïþÇ”9ó®Z\{ýê'o]úÀßΜ-Ú=Ö¤àZH2ÀÚiì¸2ýR¨¦”>ÀÚ”Ò¸ÒgÝkGlÛ²-+e[iÛNÙ¶Þ¦SzWoíTêNðÈü±ª`Õ” Ó¦LŸW5s~Õm 2™;35 3¿'³dqfÙ’êåu™G—V¯¼/³êþ*e©‚âž÷°6¥û»ïÒöÕÇmŸ·ärå²´~ønî­wrMo·îÜÓöŸÝ¹Wþ×¶ý6CŠàPÈI_àJµ¦âÙ3nзyaû¿7¬z|ícSÝ/ïpÃ:›Tjé¹<à °6åü€­3šds½UªW÷Ü>íÚS==õÏïZ^7·þ®™Çl‚¼¾ÓpÛ2Æ!cdäÛxï|#¸©2£áàœ*:PM97˜W~¦£½«êÊ®ªº2¥u´«qå}sÖl:ÚÕãN;é0‚HJò Ž=¢-" 9Jb>ÝŸxjýÖÆ7PM1oûÏÛ:²å›“'[G-«.kj=­sÝ“²”K·°@¾ós·"&‚!¥¬‹}1 êσ"gò¿¼;T jjjt¦ÒÒÒ¢`ø©æ8z5ż=;Zô\óÕ£Tvó3M­?蹞š§7© ¥¬ßÃT‘‹„ñvõVDú± u—DãOCù×^üçÉw€w'bNß°ëG§±þ_×x•,~ªcïlCšŠÂ8~î9g¨CL§ÙZj‘ù¹¹ò¥Ahæ !ŒL‚0ú`QF T úXÔ—¨AŠH½`ôbj¦‚ÕŒŠT°D#Ó†Úœ0,ݽ[ϼtIEîÊÞóãòðððÀ9w\vÿûßsÏÄ ­µ)³<…HÑÙKE‹½£ÎÎO£ Ý” §!Y)6¯ˆ5"¸z02«‹¼ÞqÇéžrº]1ڨبØêâãaN·"¿öBíû‚}KçÆÈÙžhï eÉÂ`W5œ ¨TBhmÊ,OD!²ˆ¶®þ ×T¡1µ¶Ô(¶É.˜…(§-ä{dGYZ‘òåæ³â’…ñ`ômë³Î̤͆=Bp é™_'ëÏïÏ*9¸)ƒ1Þsb|v=R QÖ€:©m pGЪ‚ ö¦¼LÙ™ »r¦’¬DÔôCQ¦gù6) ¾s`¥Åþ´,+73Ѥ‹Œ£˜ò^~hbP¿.¦±û>ÚƒB\©0Â].[E´¥ùûïh¤Ž7•…'ltÖYô»К¤ ˜(kÀ>Aã ëÃAq¸Gj°Ö9-%ZÍ|‘pÂÝ~dGêãr]7!~‰†1!”#˜RŠ %€‚R8pyþ8ìMŸž>¼Vƒ–¡}á4 xÖ>Ê>“9/-oJ±TÏK.xù¹Íã{ü®Ýj,Ÿþ(ÈsÛ·æ'¯.þ·Xyán…uw©EíN»_£¤ë!"s+RAð"Ï´Þ‹ÔBðëT2Ì)ïý`C ;‚Nc,¹) %!˜B1‡1žR9Ùi¹æ Çñ]´‡ç=p}ó^A€àgxÄþ æ¦XT¢$4 ÆÕué† ©“EÒ1ÐÚ?Ö·5n›ÕX–Ÿfî1%nv5Ö˜Ê×( HÕ¡uHT®T\_!8D[EACEà}¾¹Iäã AòÈßÅeoÞ " iÊBº[n«:54.3®²ÀŽ §›ôHŽGU#•aï˜þéææU&”ŽM`‚ "SŠ—¼ÂÜ”…Á˜üÃÞÕ5qåñæ  DPÄÁZñƒv,ÒZí(R=dDZµ)¢UQÛÑêÝyvhíÇLG§ž=­w7£íŒwNk+ `kÅA¬h‹Šd”ª"Š1!„H6É’íÙÎJy°›Í’ÙÁæ7™çÿû¾Ý·ïíïýÞG¬&µ#IØ·Û_(㪾®´¶ÜA8ÀÆíc—½G .r8˜írݽvš‹0ò #®@ gÿ‚!4…=·¼!þKwò>sBX—]*³—›•j\*{$÷sÖ4×nÔDëò(A%:Ü\®ÃOqvß!'ŒâçFÙ z¹ikéá+®Æϸ¤oª â Oh²2GqXô#­7ÚÔ)öêOÆîöïÁ݃AUþ §µì_~ø<~Ñ»…!>ögFxˆ_èñSc·®K§íÊk 3¦Æ 1»òxª}j _øàƒ±³ýA»½·ƒmè|XÝØH’$؉DF ¿J”ð:´˜¯¢Õ57žŸÄÈ'Ú@%#®€ÎbK¦ƒa⩱¡'aM?ÝiÂ(¨TPP=¦‰Æqcú2CZp‹©ÛéJ}}<5¤í>¤ –¼‹‘؉#Ÿ¸;¯–ÉÃÐ:ÖS^¸oÍ›£ØÞ8zâú] Zœ¤„åF!1,_çÞTäO*HúlÚˆ‹Œ C©”C]å\µ‡â »¢ºškØï6ÊGýãm6æSS|ð!$ øÞÑb6‚=V¬ ].°×Î]é'—«*mïlS*äì-NŸ®K×PHß‚ÜÙŸs™’‚Rîö} ¾) ·Íà7XZs~Îwv;®éÞOÝŠ™¬î*hã%½Gv豞“BM=£?@Sèñ †šˆ >ó¹Xáj00’~ý”‚‚SŽcRŒDÈ ‰[œìØ0¦¼RiÓùÌ—Wå¹ìFà($F!iynéWËÆÌ>,ðÞr24Þ{c=Ìܔ퓿ۻ|í–hŽr¤èÊÜÌ0Àïé²Ò‘õÕíøOà‰ 8{Û:5.¦£Ë: w~sþãW#ùV"Tp­ònw$ÍœLÛeµ`#!à¯ú³O¡…k¶º ÝiM8Ð Ù„“4Ìc~ãah˘õJQåI‹­Ë`Ù©í'WÚø=S³Íîl|@å½'„aBdpu %¥0\ |ÀCŸu'?LÊdO¬Ž,{ Ae—±ž Äð3†#ã>œÙ$0…át•XFÖŠÿb$VòÍfªW*ìABï|Üš»í}¾Rü¯% ³VÒ%·à¼U;xŒ0Ú>êAÆ£_w›¦ ׆ªÀÐj ¥ V)ëî>”µšmLX ¿ œ‰‰Ñ&»ØŽâ²JL"ÁHRå§»ßßJ„ްÒX]µ4ãÂÝ|hî³û]0,þoþñçIB¨•Ë¢!-¾|R­TÕ9ôôÏ@„ë¶á^ZB œ¥™@§¤Ðò ã¤=îï›Ò§ÿ-zGÂxeƒèzõü¬kôÅ£×çÝúR¨„T­CÆ}8•°ÁFLÏ2ŸúS:ÒfÀ0ž¨ØùyBò€~9 Ã’pêï´ê!3ß—&¿ùoÎüs;ÿC^4e¤¿âëüÒíQÊ¥ÐEi2Z›V<ˆœBh„+ÌÃiófÐvɹÊFpº¼Z„K¦ºll„cÐØbÊÚ~tùâ™YÉS;!ŒÿÆö¨tÆÐ@cP4‡å½–¯pRSI›6oçÉýÚM ·¹\®ÈQ×má«£xéµÁÈ'`ð˜6+,èÇÍ~-{Œç½^³ÙÑZ×ûѤÎr((,ÿ)Ë<âÁÙLÅf€\v;I^´ñsÏ@DXJvp¹õÂ÷Žmšà¼þý·PG:è"¤wn•ÐöÄ1Á#U¢>bD ¿ŸÜ¥U9œ.ðËeÃýäÒÞ[s‹Ö áß^èæŽÎÌMŸ2‡‡ J=Ë»è%äb½NS~cçìYš ‚8¾óä!Zˆ øDÄÑÎNH,$ja£ XZ)vv)DÉ'°ôCÄ"Zj¥ ˆˆHšT hÔxŽì±›°ã†#$a~Ű;oî-{âÌùŠî.C p´_:Á]Õd!Jìcèxï-úÏ•ŸNaÀ "Yš.sÑÅû™çù‘wéb v†n ñ>4ú`‰`K>žówÇgîëIé“ =™Ówâ 'ÄÿWÓ:…ÀïÀöý}Ï+óø{CnÜö'ããÅ`«¨+b±I5V"«eG–6£‘ÁükÁq ­%˜JŸ'W§ÄÛ½ÅÙ&ÆWÇþ|-Yžöoå¡ïs_¶ú2E?zGµîý)µØ]¦r8  4±ò€À°Êò¢GYSEüOÇ0¦:©=ºâ‚Bþ¯§¦À–Ÿ]UWÛ¸ì¯Í -Š;zP”,&R7™œöt´ãÂ^Oê÷…1ÿ},Ô@]RjewZU B£2̲:Õ6§ÊêHèt SóUx ¾ˆõ¨T³!!BBâ—Fáõ„kS°»ì7ä*û˜¾ÌêÄPfƒùƒŠ­ºbUÁ0 Ã0,Sh $G'×¹üS$ܽ ˺FÌ¢¥´Cf1=æöÕXMÍ(ÙVýÃÞ݃FDŸ=£Á"ÑB’F0%),$‚` -ÄB!u Ó¤La“N ;{¿íDA, ?ƒ)$ *1•sñœ,z2fžÙÉz÷ÿ†½—7{{ܽ{·Ç´›½ûúrçÄÄD‚ãäàÑáÕ åñ¬ö70044tåòäúÊù·Çr™2ÐS­¹ÁÞª#eJ¤JÒüE9ÍoÈ™a¾0=:…_ú¼}õLµ1§†¹?^ pëÞ•mè:>ßëÙKVE# À É'†Ï©’‘{!åLk® è¦$œ(«èyUJ •tSÚ® 覌_›2FÝ\ZÙ¸1³Ú.ÆÚßA—pþH—”)ɺ);÷ìîÞµ£Ãêm™ÙZ1Û+¦siÔ™í¬äA«+V_½û\¥è¦|~ÿáëÔ´1ÍnŠmfµµ&³63Ú“Z\%\0ÓG|P^]WBO]éÝ”±¾Û½§¯+ÉÇ›g”WÈ¢êÂâ«arB+Å4u@úÛõ—&@7¥¾hÜØ½ÅG¦?ÍŽ\¼qvøðH­ß]š×PÅÌ)Õµ"ä;1aÅvk„e÷A ¡•*` ›²ðÓºQkåè†ZNë<¢•jäiž.üÑVL^­“_ôa¦Z„•_x'ûQª)×tE«Í<ÜáóªÀ5ÊíÀtSâã|Ý4®¡•V^ÖŒhåÒ ¼Ïù@lHÒo‹’H)äüëôHõ³ÖýiR²7¹ûtSÄñÇ¢u£ÑaŸdy0O(J„=”ߌÄë|-%tkÒ?€nJqóõÌ™VΛ™ÙǯgT®ôi Ï“ðÁ„PªÓwY ÍôoTj@7¥x™bÝhµÊ©‡OÞ}™ûv´¿oìx~^ŠO“?³ÊäoˆÄ} ™­ƒós}¥Rö›tS”)=ÕÉÑšÛì­ºQ(S|}\ "Â\aŸÂ† ò©Í¾ò #¡0?^8Æ3#s—Ÿ·+–¹Â¡qî/öî6вø3Û ,‚å&-¶…£-X,DS ŠÈ)÷.õ«‰!(P0Bi D ›ˆ µ\_¸,ä‹ÁzÕð%X¯iA¤J*B/¶Ë³ó:í4³›¾®ï²»î¶åÿK3yçéÌn!MxøÏ3³A€4Å,‡Ï]Ñ¢ø¥àço?pFØhz·ËÕ½y#}-8Å—?š¾à‹A€4ååÉ IÈW‚>F HSДà§@švAž¤)–ÛäŠÑbCg<½/‡ˆöÍÙøxµ?CþjØʸÔ9ÈiJâøm¤S(Ñ@OP£·SŸ™039fðŠ”¹jd $@šâ`…‘DLÝh·ÏdĨQ­Å¶tT…Ѭýëûî}aÓÝšJz4ÂÄKÁOSŠ©ˆÑ…òÛËsÿ3(Êx`Í"*«®%FL’FÇÇIDc÷/.œ°±Åé Ú¢´´”¼À½”àÕ‚ Žž¢¶ 33³ìâ9r1dx2þZRSS¿miŠ#DQˆ$‰1æ,2‰ˆd“ö¤¶Kן>,µpÂ|â¨ý„Þax‡5í[m§ÅÅÅÔ6ìÜžCEk\ð_ÐV—¦Ø#‰©H§(;ÆŽöoþ_յǿçmΦðáŠk·¡¯ùc<A¾¬ rss)°v:9 ½¡üÃ@n¯™R¨½+µ!˜M±+i kŠMZ´)j¢ÞéÓ§®ê~ì[">Æó.G\i@í‹ûW÷˶UßQøë_ÒáV–CŒ)ŠÖš4ÛüAìå+K¦NíW½³üÒúµ{F“g4.݆ºæ qJ5ÚYÜÁ\¥mÃÃú‰¨ÙùU0Þi #’œiŠpks„* k¾×§Iêˆm Æeä¼ÙÓÖeÄȾQ}Î*¯Ú5jëòóäß‹xw ߸No›@º~xØ´l}÷â± ;S˜¦kJÖ'‰Æá¶8sjôà §ëm ?J¢m… ŒøùJP€ø7Mܾ˜l¡r1kÙ¨IXêØ•4Ÿ#]v~xè3|š¢-¸®Â_üŸ¦zŸ>M Ÿé#7ÐöïÕsGú$-Ñ;5®ä„5ªÇ½›•Õ…Ï¿´æcd’¹sU§':ó=‡ Â¹]ñ¹ÂWãÖÁâÐ+mú¸}ÿ%[ú[÷nÞœ¿`i\Òr¡ß’£}W/ò}´µë.ßëpg!MhÏMq($IŒˆ©XRüw ]¬åÆcïÝGª¾Þóܺ ñÑÝÌ ù  ÎN¶:á1Φ¸k;ôŠ €áÞÅ¿i ಎ¾Ð‹üaHSÜR˜tê³Z³_™—(‡Ø"ïöÍØþÙšð9ïß›83Üp½9KO¶ô_B×í}KÙê‰hQv„Ä´ËÝÌ9Ÿ§}p…nÏûAbôVz"—¦ˆîÊWÌÿi ߯ð•¦$'?K«UÎ^R¢ÎÌ]ÛïP¨ÃÕy%3Œ9}ÀÍ£nÜÞnf²Gý"Êçþ´M½fÍ%7òפ)Óêë61›€4EL˜U¿š×ä ¶0²›ˆ(mã¥&[Lv’$îNG¶;³pëÚ§øÙ¾ÿUNSô°DpfS ©ˆ˜m!$[RÖ^¶j|CI$#—Ï馷åeÆó³)ü<¬¶à‹*þ»|…¯k ßÓ­/ÑÛï® ñk¤)^<:EÌj‘1vIúS­$æ:BLR+{vžÉßK:—4Å]R¢ÕE»âþé禭_á*"HS* ÕÇ.~­ïî3±{ø;´û4;zöê_óv|OnÚíóShƒÿÜ@GÂíòuq…_?¢iJœÒuõÐW·\>rîVÙÁyY^|$r‹ñI}—?…;øÑ‡¶ô#Ïp³)ã{šx(;`6EБ`6%`÷wøq|ÀÝàH ·ž§)€‡²º#ÁlJ·‚#Í‹7›ŠŠ­×oDÄÆüÉÞýÇVUžϹ·-m¡Ðm– iÖ±6\+µJ‰éæºUƒU”@–mh0%Á˜,b „% J.*ÚÉ4léÐ’Œ®ÃÖäv¡*¢´þ¨[{IZ ×§÷MϽ޷—ÃÝ ÷{¿Ÿœ¾>çñ=·ýƒä>yîû¾÷ÓªÊÿã8 ³¦q' ¸V·¡‘tÊŸ€nÊ—ëó·¶7Ô‡ÂêªrN÷9§FIUüwO§³í€í¥›â2f  ›’tŒèxÂÁ¾7°¦h‰ÊJ¼Úö–Ê,Ö¦´ÈåÄÖD¬÷!·‡:{Î×T/‘ÛÞ~õ6Ÿl@mm­Ê º)±}}º.IŒeò¬¼‚ù³KóG?ùïàðèå +êUT^Ù‚¡×N¨ªÊÛã#e·]7²³I8“õ´  üÇ«þ¦|Œ>/®ÙvvìÂá3oÌŸ3w{ÝÆŠÜR/Ù¼ièø {Çž‘ªUE ÷_ ›¥FJ§šI2ÙØé#¥IÅÒÒ„d(2®ÖÊVJ×(Ó=™?Ú„>é(Sø†dÀ)´Ç:þ÷puÑPûòâº.5}Pþ£•2²Ýiÿ¾Ýi-S¼Ô(?Yv뱎‹­¿~ê…i^©ÐÓÝɱ1¾î¦ì}{܉î¼UÖÌE5Oôü}¹Ä+ 3ݔϿøZÅËϹÆ"#! ¾Ô©´s¾(›ÀNŸÖ¦8סýN¾mÏ/ÊšºäJVFh:63™“ÍW‹× ñRxÍ4€nŠ™¼ûd\ÉÒøÌÑ~©WÚöÔ•5¹&›â[¸ûé´Þû(ò ûÿ·j ›¢Ìzi£÷lY½N7WdÔ5ŠfÓ Ríd˜;¦œŸr¿dR²Œ{D<ÌÏ«V馤KƒDbïkVtì¥7cNбùˆsë`y˜ÿÝPˆüêûÌÐ;w̔1»).cß?òоΚ÷J cÚÖÌj©ÖÞµ˜¯àåÕx6Žy:‹®]t^Æl즸ŒI|¹¾1kKqC}(<¬ª*çtŸû´ªR¥…§õ(ÞLÙ;ñø5ÎNd1[,æ­´UtÕÂÚ¸·U¼W?Hñ!…ˆS‹èwžJ8wêŽ kSö½yÇÜ…5EK¼¼Ë{¹oü ^O6¦¹L63Þ™/(±Š¨å±[ãö½HDY–Ê4àCŸ„¶Š":0IžïôI܇Üêì8_S½Dn{úeœ14žú§$îë1•ÇÝ''Ô+Æ/27“æ­åòçùž¥|8†ŸoHv݇<+¯`þì’Áüѳc†G/oXQ¯¢òÊ ½vbbNxtFÙmÊWÌŶÓU °EÈŒ³nmÊ‹k¶Õ-^uøÌ ôo¯ÛXK¥Î—lÞ4³jeáŽ=#E ÷+ÿ隤üC/€µ)ré²NF9âòæ—6›qÖ›R‘[Z±´4!ŠŒ«†µr…•ºVn@o`n6Nø(!)· “õs‚޳kmŠx¤õ¯Nl[v hm99òŸ‰À–\À¶v¬[¬n˜²kb®VÑ·NàgW7å‡ J •ç¬{FŽŸkæD¯Ü@a®](dÐÊ ÚϿЮRÝ””ë vúhŸ}xAÉeÛV@:)ò#}”` (W4°m‰-Û²`›OÚº)ÛÚ·ìÁƒêüûåß*µXùÌ´ÝéÝ”«×loÉ›\鉅š¥gºØ_4˜±yD›ùj:“Š•$ž/@7åJ´ø°-¥éúD~t±¢£š0~-౓!“Sz*¥Wöô€£J|ˆnÊ•«A¼þÞŽŸÎ yOùï»wuÓÞSl>pääŸÞéVQr{åj ß$jR²Œf>bÞ&4l\ÉšRP[[«|ŠnÊxPF©QùيߺmŒ“>€½)2)ç )2\VSŸÎ‘Lwj©OçÏ}SÀË»å[™2#@Û¶uÐuÝìJÅIp3Üò˜ùi ™È{S€ºC¶ëº¼a¶LÚB{| TÖwŸÔý(mÛnÌLI¦}D @‘a5å k*2hb<ÀúÊÖ”‘)p±Œ±"þéãMú‘¿¡%2–±ƒËòhÎy €‹°š¾µxd °X,b†d p{ssgo €Ld @Ÿ†ûéwŸ>2ÀÞ€& ÷ÓäG™ԻԻܩl%>ÑL7ªwÛ{S[hd Sd ÀUì èݺü{?ò4ï–ocŒ»ˆåYe ÐÄQþ½·m[]×*•¥“>nÊR¥QV‹+eP«§yPÿ\=dÊäÀoKs”di•ñjþÉA[Õ#@¦€X©K,ë]Ró¥ëºø¯tä1È/‡Î™ÔÅ’xJ]D©¯ãI¹Ò(ͱj‘z®§ Ö'7Î¥ñd PÓd}—Iš¯“C¯ ã<ùRd ®%‚#/–”™4N“S)`5åhÁ!S€#‰+}d à¤0Ç[ÑË`±XD†L¢ï£i÷ñ¦‰Ãno®#ÃÞ š&ª&^U£2@¦ÈÀZ ÞÏÞåNi+ñ)g ¸¥½ÛÆ\ÄÁÈ@¦È@¦¾.±<ÆüÚ.HW¾¼[¾ÿSåàé>:V¹”züeJåà®ëÊOv¦mÛÖAþÕ¾=R4LõÑã?+ÿÔÉŸô7S)ú«}µ†QQ¤™uœ_ªƒüê–.òäñ#?+‡Ÿ:ùLòy–öQoÌÔ”YóÁ«ãó«±Õsǯn~µÎ§ñðS§zÒèº.o)°Þõi^ɧWêÁ¥êù­êd¶å£×?+¿:â–»'›)`oJ•ÚÃ䚺4RŽ¿Ó6½ÕXùø¼v¨«×}A2Pw‡t]—w”Éòçê˜]¿¿0¿Õ–þs|m©ò8£oHJ(Ô\¨É’ÖQ†C«òÁñ_ù­Ö #¿”¯§uò»å™<_2åkÑGMa‘saµj’Ÿ®Ž|òÕüžë¯æù—Ƽۖ™züÆßP¦|9u|€3>éé–ù4“ÆÛŸŽœó4_ü\ë$ý'ŒòkÄO295-€þŒþ¯•WrŒÏ”ûi3hÎn5h~Wú¸ à*¦¾ynd °X,b†d p{sk°7)2)2èû¨úˆ/12hš¨šˆ7—qd2@¦2ú8YÈ|‹9È@¦È@¦Ø½ È»·™È™È™ S™ S™ S™ Sd Sèw?>v|ŸþññêÀU¼ šÝÏãKßb_€Õ@¦È@¦È@¦È™È™È™ S™ S™ S™ Sd Sd Sd €Ld €Ld €L€óÅÉd Sd €Ld €Ld €L)€L ï£]W15š&N XM)€L)€Lp¥ÜÞ\G|‰Y@¦@Û¶±d ôMLàó§±ìM&ö2)2)2@¦2@¦2@¦2@¦È@¦È@¦È™È™È™p³ïï>ÄÿiÛöó§q`ȸ¿¿çÝÞ\DZà¤üö¼8ˆÙ7ƒUa ŠJéçtÑåûÿU—]¼ªÐЋ3£Ë9HILfîd($íãùŽ—ï9ŸyM4K­{˜îù΀c €nŠíÚ[èÿý¯ÃÖeLsñ³ÔÚM® }üMqøEd]?´ª)@}EïLÝö©£ÚUÏŸ±ô—‰*® / ^†òÀü,õ¶q䕤¥r$Âɹs šÿ^oÛFk÷õ•¾-w¤!5€âPàJ§ B¦˜ÇFwuHÕך÷ÝÀD #çE¹@bC&cçƒS’=~©¤¡VûDrþK¾ñ2{E¹P`â‡dˆÚ“}€c @RÒ¸0ùZÚ¨ÒàZÛO²iâ‡äÇyÂ÷x7€Í¦~ˆñ…“Cÿ9åTSÜ ¯[Eï(:_0¬Dz!˜ÞU,8ìG[W%ü,¥BEÁª‹ÎuùÑ4'uçöîX7j °ƒÌÓ)t¡uGIÁû¸¥ƒ‚Ç  ¤¤„$x˜tXŠti”]t‘ss{ß§Sä¬}Bc…äÏîx³7àjû¿w}s{¿ûxÞ¹|Û´»§¼¼º‹¯¢ž¸2Ä—Üûwo~»gªësÛœ4b‡ñtjžÊ€u]+®•øMÀ¢Ô˜&‰PRÿ_Äm-´b €˜ˆ)b ¦ˆ)€˜`{7ìŽ[ €Ö–æZzݲv¡Í·f\ÝI¶ÜÚS)yüüä}Q¯¯'¦[ŸõZOýi0›ÒïÙ¬!«Yc‘FLj)»$’öqãìX‹;ýî-éæÚ}=ý`w¸±|ùúMÉbоžrµ°,‹’Å”Šàó§J®«þ“>b `ÑGãRE ¦h\* ÄKã½)b ¦ˆ)€ÚìÛ!0ÁÅ›D$ÞÄJ îÔ—ø%/.@ÆýñØ­C@€z¾É‰õACÌ]Š{›’dý0]WS{wŒÓ0 `ÔB€{€¬¾ÇêØ¡Çè±£GØ@‚{ôeˆ„K­ ˆ­_ï (M³˜ÅŸ’?êŸ/̦È@¦È™È™È™2]}ý*™òzõõCŽcf ÀÝx™`„)2à6 ž^Rt_oéÌýãs -ç¼Ûn"d œN§Àv)%5¾?ßSPûéãn Ôm;憽.³)2)2ðò”ZìÓõeàþ¬W¦@Ý­ç-ÊpÓ¥S–Õ3 È”K÷ hK%­L¦@}¨Ñð?™{6œ’àbÅÒ¤GϹ›¿3Q“¥nÏ·³í2e%H“æãÒùö8þz»¯Z¦`~¶ÿ–ŒL€þE‚Z@¦xèûéFƒL€œ³,‘L€RŠ,ëO¦€·rvÛMº`„@¦È@¦È@¦È™È™È™øéÁvà˜†aЬÇùlô€ê–|;pLƒlÒæ_ÁG[? av:ÆÏg^IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-08.png0000644000175000017500000005007310536106572024564 0ustar gregoagregoa‰PNG  IHDRâ<;µY7PIDATx^ìÅ¡@QîŒ+ˆF1†ð_y:]ò €GÚµìÄ!@°ïóI¾k1›Ø¯~g$Ù‡½»‹¢Šâ~ÎÝ)ýî–n›M©ýÀ ˆ‰¢Á`Óø`Lxô|òE­1ñ…x!1¾5á ÅØˆ„’@„  Tc4ZÛB¢‰†¤,eaçΔݽžÍÎvf7»³­±ÿ¯·wÏÜf&w2éÍÉÝ;3–·1ùËZI­HØöÆW´dÌ\tsáÓß,ˆ8¼»ÿÉ‹6Ãò?ñw!Ü^¾ç‚Ã=\aÏË;q°çáöåîy™#{UÅW­ÜÕaâŠz^ÐTúÀå{.8tîöh=¥¯Â²÷¼¢3ŠpuüÝ£ÿO•ï¹+c40̼RFŒ 0D·eÕt M Ú³í#ªÌá‰}T„!bZàñ».L °Šæ(SdRÄJjÅ1"KI,5YÌ1f/ÆØPßÀ…k3&0|ì~¡‰*6<<üöÇãeÓ"b2ÄJ1K X±?½äùéoÆÏDXB«ˆ‰9Þ\ÿá®í£¼¾äµ;6o}®·ocW¼­¶f"ã%/ô°¨(¶jbjlØÜ™´³3“Éë÷3®;ïjǨ,[n.ÆÊ4pÁlJúÚçT ¾ÿ]/Ø´õ%©å¡²¥Z¢Ì¦°zkh0±®ÎÎpržˆëºŽãh)ZÛŽ¾g'µ›bbZ¬®ï/A¹õ3^:â¥&Á%úlŠâšÞõ­‹Íé&gêj­þþøƒùy×ûÉw.™›»ÅTν™O¥nxOêÔt>nÜ8’š>@šß§G2ÉN¤,lVýx7®«_}äO}zòö¹©Ù_gõÕ«RµkÓõnKK.Ѧ:;›Ÿé"ôMOH‘àîï£ô@¦âU¯Ma² Ñ˳·Nü¥çlGk)¶­;mk©í|ɘç_%Ÿ¿B%°6 ð¥d*Õ¦)l¥Rîå¶ö¶Ö\<›ËŠ\.›‘Jb)äÝ8Ÿ¯Mñ2•R«h%®$SQ%Z­™›©¡lºaêú§~¸tüâù±sß~yfüàÉcŽ}2vhÿßý­èÐr”ðŠÚè³)Ç/ÿÓÒ¸æÙ„CÙ³?ý‘Ö¶Îs´ã¸ŽóDGgâ)&&Q,S‘4EвxVVÑJÁÀª”@KuwúÄÈС³7w¾Ø¾©§}Cwüëñ‰«7´"j¬mméèèJô1±*üº§ÔsS$S ¼rInöa^t›@eKh‰‰ Ÿ¾r›¾O2+¢îÞ'{Ø(b&RLêa á)ø¾ªgS,chá çLŠ˜ÙH¤˜•Ia(ñ6ÁåŸM9<±OÞ{La DøõÈ@Þx¼œiÊÒ“€Ù·ƒÔ†a ŒÂ³ô:ö…zž¤‹ê]÷g4]©PZ„D©û>ŒÚÄd=$ç*ï¦øãí-?ÐÚ€Ã; í#eÂ|dKèÄEÄq9Qš`D!+Ëq.[ã"q/Áð®çœ3±AtÐc»mrhWÁqkÍ¢ßüÇ.lŒ^º[õ(hñŒa¸àœc2=AÄòZiáãìç¥÷_¾~²«•]½Ù#§'ÇOŽ¥OŽŸÕ4sÐãîxåÿ\J°šÀ+±QÁƒªž`íÃüvDôˆ{H}½AôΦ»ñüå£ù·/ÊÚωñÜál>w~zd`Póúkzµa¶iW¬¯.-–^xöðI¹»|íÒíÔ¾´ð@»¢JSÄ%´Ø……a>‹C«Û£`u=DôˆÅ+½_0NQq~'(³ó'FóS®<”µ‹™Z¸ÙLVv£´‹e»µ¾У~ð{˜ªó?Í£à('G…?\Ýsä« µ½ AtÄsïþ­…ŹâÕ™sÓ7&žÈìH%‡FâƒÉxÜÿ°XÂÿ$Ía¦3‹õ'̲ØåHåÏ/^¿³î~ó“•Wož6ŠQö GA á8¼û a‰í8¤q͉%úW±GM¾`u=7¤Q8WP}]P˜”`©{ Ú%Öh—ñ/öî-Æ®ªŒø­½öÞç2§sé´S§Óq*%C¹ˆ-J£"JŒ‰‰õ‰M|ÒÄG‚ø /Dc0$jÀ(•" ¤ µU.-c[Jl«­z™Û9³×í[îžáœ8Ì0Ìdr¨ý~+kßwÏKÿó­uÖÁù‰1Æòlñàã?Øxí§.¾øÊþJ_YuÅ‘ˆ¢¡É€¹À*Åô\²éƾ¡ ÛÿxÏ+G^úò­ßÅ+Ï. ñ}Ï^våG÷¿ôR^}uïÓ‘æEucŒ]uÕU˜×ýß¹çÈΫ·~qxí×”W*‘Æ‘H¢BÅRDh^päxÒÚúà‚¶T³¢–™é)+}&Ǧ'ŽîùCAã›·ÝS,•QBë×’Ccg³ƒf§‰Þz4htÞæä±<¼ý÷O?ý´ÂÜØù5A?FÆc<ù“ÙŒ²aè¢rZR"Me!QqŒ$ u‘ˆ}°‘:ÛÆ‘²ÞHRç#x•ˆ¤Ÿžú¬J6ß|èÙÇôóÛ¿}û/Ð"„seéˆÞFñ2¦ üöÇÂÀõ1.cŒñXÏŽ}Û7Þð¥µýkòŒ2;Ö“¨8‰”‚šÖ}Å5¤¢Ð5:¤mH”¦tðÔy:”¦°þšOæ5•‡½«eôgi%ÀS ª·!ü_ÿô /¾Î#cŒñœÙ|>ÊÐæÏ ÷¬¬”V¤Q   ºb$’’D¥Çª«âÒ¾[Ëqa O:Ž$‰à R%àbåÒÄI[ž0üðõ{vþvðù7\{k€tï=£À{PÞOÈ…€ùIœÿcŒ1vÿÃwTF¯\=ÜSª¤‘Ê‚ Y+i¢ŠÙûüؽÿšÞ'E ’ uRR}3U9%cÔIȬ"E ©†6Ýø»?Ý}jbŒ°@‚õÁ¸i2–œkܹb cŒ1ÆÃ=Sz|õºÑþžê”HPP‘H"©"Ä2?óêôñç_ÝþÂØSîÚ¸ fÕ;*B®ÒÕ[}â™û2ÜmI›`\ðm—\1…1ÆcùpOñŠëV–*ha=¡ÍLJ¾^P…—Nîzìð;ùêˆd#Ü •’- °räÒ=/?999†¹yª×N,YÛV8¹Ðb cŒ1Æ¥$…®JO¹‚œR €Ì84xrÞ{ÆÙ®¸÷šÁ/\Þÿ¹I=ù܉‡ùç÷ßÈ^m­¦´rDh"çÈK•ä•»FÐÆùÍÖNZŽ^¸1…1Æc;vÿª²þ²ÞBu5[ÓÞ9ï·Ö[>8ª5#D"鋇F{¯½ù¢oõFŽLîßöò÷^|}»#‡G¶-Àä €âÀÈ_öm7:CCÁ8ÊLpþlËg,á=_ÒYŒ1ÆN9q|ìPaÕº¤âm#^Tk¶Y™qÆzïƒ3nÜØ WºãÕ«Ò‘OŒ|í†á¯Øqü7¿<ð#ãû­'ãm³ŽâÈ£!ïgjFË´˜®^·ïå'¤x3 hˆ–u±|ÆÄb.é,Æc‡ŽîÍCC)†üŒÏ¼•±”–¬#k)Û’ªe¡†º4*E2N\q´7YSÎ'Õî}íÏÛ^¹ëŠÞ­—|V"iÖTŒ?—x,¹ÈZ™‹=ý'^;˜™ÏÓ\ârLaŒ1ÆXþƒ;Q¥Wœ! ¡HkWI­#›Y«¤ECæ2´P"ŽbI•ˆb^VîÙôøá{_{òÀÉ=[o[]qD–, 뼬ÍÈÆÛž¯üõfÚqLá•ÝcŒ1„7Æ»»ƒ"ÔM»štqªâÌY%mf34˜LÔl†"J±LWÜØWÌË*»?ú̶ýúÀZqý–õ·xе³ÎC; #k¬ ÊÅÅÒøø˜xÿÅ”¶_‘íÔïéw>¬4Okë/;ÆcL@üû¿ÅÚ›ºš¯!§“ÈÎT £d„ãmÕOàH•â1¥ ɧ/ùêÆÁÍÛþþãÙ®÷îß4tË@÷z Ö3Þ¡Îz )”Þ;Ú?0 ÞwÕ”åû¹yóüÎçÑâîÉUŒ1ƘÉje!5AT”…çr™3JÊ'ðVÚÔ0‡X¦+’þÄ7ô¿qÝ;øÓ=¯=µóð}V~lÃÀVG€±®j´ŠdÅH U{ºë:SQTh+º,¦dÒ~fûƒÚÏ™ÿróï™çæí›Í=ùæ<—,S”aŒ1Æ\ ÒAƒUK™DΠ…#[T¥§2Ä"Â|p†fªîÌ®cå%ËÂP÷–áU×rÎ{K®ª5RONÚt8¦,½è2Ï¡…ßd‰ZàžÜ"n8Wb[¾úcŒ1æÉ×¼-Cè -%jN· •5™É(x´¡à3W­ÑÄÁÓÏ>rðî§^®ïê¡[JéC.³Æxgu ÎÙ* ");S–úH~‡ÅÙ,Z¼- ,âAK~óÎcŒ1Ƭ÷€Ðdê} fÐTP䃳ÃOëhº½šbIWíøiýúŽ£ì>öX–…6ç=ÎerÆ:ç¬6F© !@`©ŽLiKK8³ýœ…_¾ô7ï(ÆclÝÀèÑZu²• ÐmIÅy€‚Í\\PÉ=»(øw-¢ô–‡´s­ÀDmZcDH >“§F…x¯›ÒRÒX”¥?÷ÂÆcŒŠ]¤'¼[Ù¬¬ÄQÔüVΤ®(I¤£`§(Sv uÁø™7Õ,¢ŒOèKWÝ´¶w €)“9òÎûfF©­àµÖ¥®r½Ç]ôY\b˜í¼§«0œÔ8sQwk?Ôþˆö=óÜ¡ùÏl?¡ymû%x'ÿcçnCäºê8ŽÿϹsïìÎÌîÎtwv·Ù4Í&²ilmkª”HhÈ‹šBl¥ ¢4ˆ¾ôE}x§- ¾JU‚ñM´ ÁkEÖ´ICC³i2ff³ópgæ>œs;A—z¯ºxǽŒ¶äç¦l¼¤tóÛÓó&· zäàïa˜üjƒÿ\é[†ÿ«¸u{wøí/]›Ù©åØ,2|3ÌèT1§ž~¬x>ÏŒ’æ…«Wý ¿xûų•“µZ¤ßγ{Ûƒ‘ ¿MDý@é7Š~5¯í%’`úüÂa!‰s| íMÀÂŽ{Ió<ÙÈP)Ðc7 ,à N$(ý ¿+ô)Tðfå•_žyáƒjUF3{§ŽdÝ|£Û¦ž%"RÒ÷ZI£tßÉfõ`UÞ_8rØà¤è–!SïBþgÜ·çÈk•?ø#óÝÀ'«n“ A§(’&ãéX9ñ÷o¾UùËåËT½÷Üýé4Ñnø¨ÙHI=µÕšêÉŒŒX­êØØÔmåJ)"†L¹)xä¡§_ÿþ¯¢ÛGe£Äó~×\5‚\ÿrÚ~¬PÏïÏžê´¦öÎPþ„’£¡°iM¹üQ‹I…¤Ï´p-Yꫵn»Ši7ÕǦÆíå+ÛËî^|„úB¦À±ÃϼûþßÞ¹ôG5·Ö'ÌI’Õ–”£:V|AœìëW«Ü\(„aýêÕd‰bZMÅêŠhjÎpV/ÚWŠO|黜1dÊ€s:þÔóßþáã«×.Ðø µVBk‚³¼ D”ôŠúɲ‘¡ïyz‰¢xœ)† ñÕéi"AôVî™'ìfrB)†L d­ü—?÷ƒïýä Á|ÍšæÔ]!Šc…ˆú½’$ muF]ŠÇ'ñU}f{zv$NŽ~úè7ÊÓ;ôÌhHÈPŠn//|çøK?:ñµK+ï9‹MÒâX!ÔÈ*R¢ãÒxžÏ“Ùr*É d Ï|Î-NŽñ+®:ç<õÙçvÎÝG›A¦€"b©a€‰±òW?ÿâO_~öÜÉ?¹œü5Äå.…Ô¨'ŠÖtEÀMê‘a˜b$ãÎ'3vöÚéVYìxì3ßšž¹S)Ú2XjHPª?p×u?öܧ—~¾ô¼]Êæ÷í)ùí°ëízXu(Öí*}:›Ö°hb¼F'ˆ Á…Fííš~÷ÐÇîy<ëäèV SÐ(ú”JI!")¥Pwí~è듼zê…7_û_Ê:sã¥Ò\‰bÍ Nëåì‚>[Õf÷õÖò{‹w}òá'¿X*ÍQEŒzâ=>ÈPJ !#!Ã0B~‘ßñ‰¨Ýl…~¸öخҡsÕß]<æÂëµó™æc´^µ¾ÜZ®sÛöï|pמCn&ß]ñ+Þ²1Â3™aÆsïL¶&Ô“ìN#ÎX’Dɯ) TÄ“-‡©RÿÃ;ÎÚ•+¤Ö_i{=5’ò©»Ö•¾ðå¿S TzÜú† Ejã·>N1`éqëP[48) èÀLµ5ÿ¥V)È`C?þÃX¥ S`Ë/Q)*õUý¿6&úÆü7{uh1ðË{‰ ÑtˆÀP3dÕ]™xËH’¤S±Îø=ŠÝ:4„ †`²¢ûà,€IÔpï¦$YÿL×íÃÞ݆XQ…?3÷ê[Ë%µÔ™éf©m»ws“^Ì2wí3ŠE AÔᇈ*ÜÀ@£‘šmEon…±w±Ü^D)Í…ÍXVÚ Y_víÀÄ úLÏÎ2wvîÞýÿ¸ ç<÷Ìq@Øûðœ33YñEIìM M¤)¤)YSº€=~nŠÀÞe¬ÜÁ“5% hii1E °­©1jÊÜ[kìñ—öV“6`ëÖ­¦Î•%áð?Ñs› Ø×.TÞ#Ú¥ d£$&åôXs–:àFÏQd}E)·øÝÐa¡Õ1^›3ú•È1¦@5EÍ]‚vhD9+Âäڜѯħú¾¥áÿ?š?¾×8tè×ö»þ·—=bpénH–«9ñË2›aÁ2 º^Ķƒˆ$@š¢×lâä=ExÛB ]6"þׂÁ^CŒL¥$TbdÆ#«5~\ŽÔ²Q~KJãGQù=K´e¾ ,ä%ÈÅ}ph=Æïú‘*@6Ú|Ðõ#j}BŸGF¢þÑ(W"/ *Cºã]ÎV­*~cÈ3$òs¢GäÎÑ+özW™J¿eŒèe>;²°Ë7iÍ d“»•#Jv *ñ“› ‘0¹Ö£ãdÜd ƒñ€”E.öÅ_≿BqN9Rpìú9•9ñrÂÞÜÒÒRœïôŒqÎúIHèð¬v`J±Û<7Üx i °­©Ñ˜³fdõu} °eË»¸X„WeJPM±»WL bQ”J|o8°èá. à¬)4\“¨‹¦(Òç’Þ•ãÜ?Nôvïéêü»||Ƥp§ÏUe™=ïmÿ¡Û¸®SS;uÅ#Ý‹õ´òD¤À5ɳE”×Û¼Å70pñ»oO6½zpòÕcÓ€K%ýrZý_ÑOŒ8L´ÓÕ”]ïîíé3aNvžÞ·ç×ÚÅÓ£¼xV“ýôSRiÊ…¾sGô(Zü¹déõÿô]ú‹ß‚•/.¿ò#¢º|4ä„2"Ï•ãåõØ®~JI¤);?›nSª*Œjû>c=¾´COJô½ 2q‘É„hkäxeQN×.ID†Ò”æææºº:ýh3û;ì£z°~æì[®)øâˆÌTLòÒ߀iŠÍB;zÕ”éSªŒîàIûñ«)qÉeYÌù„=Æ,c(•’B>‡ÆÊ`£ŒOvžô¨¦•ÍÀÞ” p§ÏÆw¹®ã:NÆu²®›q]{Ìfl×ÝLæ¿ ðä¢ fت)“g͘½°zÞ¢êÛçrwçî\’»÷þÜòe¹G—׬ªÏ=µ¢fÍC¹µWÇ +žy{Sºûýè7m?Ýöýþ|þ«|Ë­_~šÿè“üî[w5·½½/ÿæm;ö¶))‚ÇÄ '$}€;}ÌúнUso´W¶{yÇ›×>³áé™^wõë;ýa»W³Q{/Oaö¦\èwmFbS“Ü]U6G±GczmäŽY×îéixñýUõµ ÷Ì;Ñïšäãð½†ß–c¨‡$ÆãsAˆ èÀ¿¦Òá¾íÔ<˦çJ}#ãÙ.YpGÐ"Ë㫨Lj^GŒ:bHXÁÀ¨A— RAG…Ï¿ñAîñAÛ5JJ™@ cŒPF‚ºx†­OAúð7}ŠìÜÇ-°ýó›ÁáDLF¬£ì°;¶”o}¹l›ß²Îuõ§¾hlîÂÍ~·­V~ú£ßzï¹ø}Ç{ûào4½óe£ûÅz§r›„F©0£G/¨ÁÝ«ûÑ ñÙ$«)þdäéºÓËR ²¯ ´!€P£dƒ:QÞ4xÇOˆ\MAK(%ŒRFBHÒ {lª.¯qTJ¢„~¿_`ÊŠbÇ·“$4 üãX¼šâÞÝšD›ÎGßµUXÖ¬_».¥Q®ŒõŽNŽÁ8:9®TB¿  ¤Ê*ªT¤h̽ï$€ŸD»sïqˆÃůÞWXW« 4 J,¢dµ@‘w=Òe%>=h†Ã746óGXHª4B›œ"”PaÄHáîË:Zp—µÁ<ƒz¯9.¤“ð’O(Ì* î% ð¶W4T®×Fê³(A%2Ô\¬ÇâÏpÊP£Í7I#zNVþá׿.\ÅüdŸÊþvlò‰­«ý.>4î ZlÔÿ^¨}\‚u*îW8OUû(íÖvÀüüMìÜ\eC|Âú ÚâƒÿŒ½iM*KoÔL™…æÙy —+{ÔÁæ1;ÚšÛˆvœlèh-¯­%I°L&“SáW™ †C‰0ñ¯hyÅÍI±ãùDç§bÄðÃ]lÁD`0L~*6ôØYHý¯wëÙK%õ¡-G¦Äqœ£ \Ù€E6ÓØäã¹™ SSSI™—›“’ ΆKËW%홌œ±¼°è`âðç30!†–“N‘áÇeþþ=èÝvJo»¿åš·jšµzG}êü}H%I_¦ALtxxH •JiTd™Sô«ý_°KÊ« 9‡üƒ1”Q>êÔlÌ£¦xÌc¾ðöF³ðH]x€Æ—t:¯ž¹Ü[!?YVØÖÑ¢R*0ׯŒLêjÊ @ÌÜ‚ îì;vY’ÂAM˜  ÷%Z)ÀháiÌ9¿´3øs;’—ìGý´3ƒ ý˜Ý÷‹™—}òäãçç@ZqéK+²œ„8 =&,É,<´hÄô£BçÁˆ‡ƒ© ù¥ ýÐdÅG±Yꂬ7[4I‚jÚ§£2ØE% Ž!!y·WÆÞͯoØ œq±c›M¥U£“b-¡šÉ#uZÁíÅ]îê ñ/ os8º§NЦñÅ«·¦Ç=…æ¹pù:ŽÂ­НìàWSÒýÉswÙŠµžAÚcêÿ²L÷,xG„6ìÓ”÷r¯Ÿ¹,.µ·œ*+P+Uaº'!§ÈI0‡_È"•u‹€©ôY’¡¦ðã.œ£š+¢ƒVŠÛ#Ünµ4~?õïºr â>uyúÐXmcž›3À…´â# @Pì°; ,¢šiÙ׉Ù@ ã£íB_2¸Ï%÷7H`h¬§8wïª7×G!Zožøé÷ú$´#q’þ=–ÿã¨ÁQŸÁ~j™7`ŽÑj²\i"“¦ÇkTrðXqûæ|ëî·£T]5|ú ï’°x½Dâ_@FØìçJ*é~ )à‡åéÔŸ9+%¾²nVS¯Ýeî?ÌÍcÎ^›¼ke°Àç{V¾°4aÌ4ø€ß`i:ö[¶½Ûv£®æãäM˜ÉÊGP‘f ËFvèXÏ”qÁ¦žèÐ:ÄPw‰ÏPY‰"å(#y¨ŸRPp à8æ%œ‘H¡ÆGõló©>£'» F:ÎèÙYýGHáê× 9Cå|Ξ´uï÷â(éBxñÇ=KVoÜBs”ãy×f.Ý‚¹Ã5(Д åáìB_%íQ)¼`ŠRo´6ÙùÉð@ 8ÅЈÁ^j6Ü‘2k .TP±³ÅåRWÙý4E¼¡ÛƆ*XOm£)më‰%ó¦¦%ŽgMøÁö¨táJ€Aó È•ÇÕ÷£—}›~á¤2¦’2qÖöÓûšÛL ·9ÎðÀa×lª£H#³ò %ØÑãrÎ-ôYÀýåA3ó6Âl¶5Uõ@šI²€¤îR ÿZ6‰–ãÁ–Ÿ˜uµ‘¡|%ÿ˯¤-§9JfÎ¥Y+¶q6ªú ž½Ž¿BO½{»€ÆcG„©µŽê°¡~>Þ §Nm³;Á¯ñóVx õ“nÏ-Z~ñÏŠ—ÐÌíKßù‚¹<šS8°‚q4“ˆÊJNSþfçŒY‰‚8>ÏH¼B„ƒûrHbaD;;!pEH!¹klÁFÅ"Å¡G>ÁµwŠK$E´ÔJ!"""k‘B¢¨‰qyÇΆ=žìmPæW o†2/KöevófÿSwZ¥QÅuPý]Õ´ŒÇ_”˜kx½?‚ø"üË)Φð!`E2?0 ^Ø…¿N%þÝüdøÇlË ¼.#6¤zU9ÚØ};:¦PŠ"öÖ=s˜0¡(ÍïtT¯Çš}rjã¬Â—Éeƒy2g“‰kN&3 8¸[6=÷3•ì¯Ü>8ŽúØÍw¬ï#pwl0gfÌÌß§â4$;1à’]Uù°M+Sè~ýTSï×bw™›ÃQ ¼‰Ýˆ”½./F\KšàÓ B8M.áÓµ°ô_O¸éìïéX­dýQT£¼Y°£‹’Ù\þÀ>G·»óºd=y»Œi p£Ö%^«»ËкdÔ2ÃÝ©&rµ%¥)|:Ahþ…¸ ü8ìµ¾Õ£@¼íJ%7ˆƒ&¨EÖÙ›‚Ýeh[ {å‹b©L‰U£ìU4ÞJáÅïþ.ˆ ÂêâÚ:ð‚”)´šÂæþYå2™ˆÍ¤€òÈØ ³h¹Ú‚×°Yüÿû»cr}P„k«~fïnB«8£ Ÿïûæ66XKìš  Û‹å†6¶]È.Xš…[)ìÖE¤àÂÅUÜ\è !JÛÚvW*H—-]´¥?›J³±bì&s“ñË`gh¾á2’¹·79œ&‰—œœ;—o£yuÏhºèñûlµZ½yŸ|xñÿŠWÜÿõ 4K'Š·)ág‹µ)õíÕ‰M®ú¨µ)ù]‚V–êeÙB¯ ë•Ó;žÂ'}~ÿåY;‡Æø}ó >ÿJyˆ-Z×}|æÛÑÍ ã«’·ro£L€’Ž“¤ÏBºØþÜ!0M)ñD]Å,HOZŒ¤L0MÙpcÀ4åÔÔk5éÖÊÖÇÈ·­sÏ’¾àã}[Ц”6Myy玡m[œy1²›*vsÅ®D3¹ÁJ’t¦âÌå/”2¦)÷ÿüëÁikÓiŠ.rÆ99Yc­M¢Q÷C 7Ì ÷žUv×ì*ôÖ–ë¦)'w}1|øºhf>û@䔤‚v$ÜlVÙ|5,.ôf±û­ €iJ{Éú8ô‚¤¦ï=<~îÆÑ±wŽ7kYÒ—­‹lv<á´FÙvýÔ:˜¦,.;ÏÄ’J’IƈÄ+e%ü½î‹sç1éaºÈ«ÔéèQò[@½} ëÃŒ>~Ûh€iJç¸Ð¶éÍÅFŒd¢4c$) é¿Þü¢`[Ó}ìE6…Y²C}‡ ÝI˜¦¨ñÉ’ó1}@ÖH&K>+S¨MI WP h³¨v*a=?w`šò¼Ú‘‘ï·Ù‡·•DšLËÊy"L–%ïšl½êP¿€iJÑ6ÅùèŒ$äÛïþøûÑÜþÚ®“ïÖb#Y™þN‡H½f~%Š>¶¼ÖSryž˜¦”ЦԷW'N4Edd¸ê£Ú¦ä> ›QÎU®©,(Øv„yõùÙ° ¸Bþµt¦)óíèæ…ñUÉ[Êý÷(M¡ZV(“-ô¦À4åàØ1I]x˜¦èÀp¥øY¦)Ý·ø¨LSßô1ˉ'kï¿yuBD®~xö¥¤;Ó”z󼤖¥neK²ü´ñÖGS­Ñ»Çß>ºi®-eLS–b»‹‘Ø#âW­XbYñèñ“OÞ‘Š¹vzçÐ+Wœ{07#xÊÞ½ÇFQ}q?·`Ñ`@aåmAÚPÁ-…¯…ˆhå±X*•‡X Æ`ü‡D ê*ê/þŠJLD AÀRÚ"¬ÒÔðRÒ@AJQ  iyJÙîÌ\o;ÍŒé­s»ZfõûI3¹sæÎÝ4éé™3Ó\MÑ.q¢ŠãgäíçÛ˜ ¢#uE”36>1Ý¿!«(-ØâôäädspàÀrÁZÊ^Í“`kÑ.êh999G*÷‘îJü~ÿª•¹Þ«¦è] ƒˆ1ι䌈þЮ’ˆ1:tâ·ôQþ¢´¹$ù„•a¸c¯f.èÙLÊÊʨãüÝOG3qéøÔ£Õ”°£sb\ ‹a4îøn —~_×«Ïæ9ËzSŠ+V¶a¥9,(GnT òòò¨s%%õÂûÁƒuôï¢VzSÂFc5…'b-Ò‘£ˆ'}\ª¹rAsQQ̉4ËQG¢\¨È$¢ÛS6QÔ€7ÕåVӺ꜆™š4[þAüáŒEå3f ª[uüÐÒ%kÇSÛ$7³³ 1–I˜Ì³¤ÉR$ŠAmù¬‡ŸÝ+¾Ä€þ›PMQnô®†Á›ŸõiâOúß¼ ‹s׿Է¡gÒØq†eŽÔ^Y=îûÉ”‹´oŽœ¸(NN ë…/q1Ð jàIMÑ ªúµf랣f¤ªªºÞ·íõÙ™/¬Ì½éTlßî±)w ÿùâ•âÞ–¸¨]±.ïÅxî†ÈE»Èo;êç ç‰31 6cl°5æüTÛÏ’&«µëªì “ç¨ã2ô¦˜Ý³Õç.=}~ÒØxí²öeEý}ÚžÕ f–­ãÝpÍ?xÄ»>·Ò¹•ľÅãHž£^PŽxÈßiêô¥ºôI"bD¼¾†šª)¿4EM( 3 ðàøv_I´ç(x@&}údi·¡šÒÔB;¤_ß÷Š™œˆí?–P^ŠëS{²º®hñÄdzK}ÝS®õ¨¹õ¶rΡˆHAiW}®r5iìi ‡'2—1^Fl'§g§[V¨újÕÅ ÎO9GÄ®tÔ>$æÖašq$O–>HñqRÄ£@¼ßE<8-íF+/¾7E7ˆ1NDœž’øíƘž¡ã¾d_ÿ5ù5»ßúÐk‰ƒ{_»~\òhañ§Ó§Î̲.Ûž¿&>­Øì«ðüwDTºv|ïq›•II‹šŠ9–#Î5sW>É"öU)O—WPü+<*Cï q[\A5ÅàlWáG-‚Ëæï_ôá­KC÷ó¯‰-ÌŽ}úÿµSžZH7ì¤*—õMø×-ŧnš8ãE…Eæn'¢s{3Éúš‡/3ÆýóJ¾Y÷HŸ{·tìMʼnR&áâÞz¾|UQÙ¶£»Qe+/Õ5Á`ÐU¦‚jJjêƒ$ …´Ï•‹žÙ’7èÝ|lNy†/wÀ3 x&Ký¸™iØ´íSˆèîÀDtvÏÌIó7¡ZÆ8§Fgo*ù$½ÿ[©ãÈ7z”©Œ9îìîù:= 89¼B×Åm TSTDìøjSG°“6v~œADÍ}Ÿ8íÜð2'bô°DÈKä ɾN/F® šâ}w6=æsò«¯?KÄ5Í2©PÙ›bnÛQRä1ÒG+{få•G[ïó@5Å%À«SÜÓ5Þ˜¦0ÒÃ\qgDª#êC‘-«žiåúÓ=DßI0”fÍ qÕ”ª˜º‚ÊÝÖîˆ~C§Ü‘BX´Óuƒ‡~g¬q@Q©ˆî“-)9KsˆÙrÕ”£×«#g¾}8ßé#ŸÍYéŸD–ß6kíʧؓ= :¿€'ùÙfõÕz‚º¼ '"Á7ƒdº¡5ô¦ØÊ8²S•E_m4ÔWF¥ usHe\AoJïõù̓³®–”…NüÔ-~èŸì påÙÇßÝsNn˜&(‰ ÆAF.¨ ŠA@)…B  ^Pk륭ƒ3Ú~¥:SÅ2•±­Õi­QÅ@;T¢R¹Må"Šm¨‚D4 bäœëÛçdËî)O²»d9Wþ¿Ù¼>ûÞvž÷yÞ÷‹òQ¶Ó04n@µÀ›bsà®]_‹>ú Æ¢Þ”#7Ueß÷`ŸÊ)õÞã¢|Tþî=L£Ø%úLcìmoJ:e¥På_X”‰ åÇùoãÀì¦>»+¨)À›bYOí[IáÀ±yƒEjàMiÝZ?¸?•â[Eúâ8ðÜ:ÞÉ‹i¥£ià‡ãœå 6…òëê·ímút예LÙÛ´ŸJ–æ“@bS¬i=@E£æVÙß^h'+­ËEI“Xo6$¶’Â$o.ðg9ׯ$=€ŠŠ ›Byȹ™9E½ š³}Ÿm>î;1oô­)³´¤eõ: L¹Èëk+½Ðü{ßäÛŸ£w¶ÿ àMñdÓèÂ>·ÇçÊhÍ:§ÃíñfdvÚyWaIõʈC¥¤ëß«ÅåÍÿÖ4 ™"#žnŒdËã¡î üø<ñø£À›B<7þþþ†g·¯-Ê/\0á¶‘ÅZ}ÁÝ··Ô¬S.n+/Ë«œÜè=οÎì×D«Öd €7¥ðà¦Ï ÌÈ¥1ƒ<(Ê‘_ÒÑÑ‘€õî~ˆ¾5i²£×-A†V{²ÃxgB0øüñPudú49¬ø”Êz•“èò Á4J¼ð¦üíÑ7oþ­`h•Ë"K?­lÝÇy”†!&ì{\¸Ã†ÛЪÕþIM¦â*Í5 gúxSÌKêöñáÆûʾ-mý­û¨­îi~cmµ¸ncÏ Ù6õA¼ñ +鮕½°Ó™tö£v@98!À›b^ŠDtEdݧC ðä =¼5ÎëPgjB“ÈI‹s0@*hoÊ‹›Ž}L^K݈>ð’Âwìù{ß0mí':[E‡Ùºó¿VùX^™pƒóË{òS¥€vž_¯sˆM9üU«0èC?{>ó˶z2¾nÖª¹í&€7Å´õß· M—H¡¡‰E1jlí Ž^˜G ›²hN?Ýþùòý?œ2P³kO/³ÓŽ_ÚfR€Iºs­ÇJÜðýF“_0Á›òÍGê„´Ö“r[®%ä…cèq>Þ¾e~Íî7£$K).µ‹'0â0]ÂzwZç²€äRCyÀ›ÞÚ2ÿaU¿Þ³jÛÁ^œû+ÑÔœ+L£8Âãûi’í`ÇO³5xÖáô"Í6;ð¦xŸHM2S¤û¦ðþ© À¾)Laœáe²í?Ú¾ÒÊØ9±áMiy6•}F­I@Á>+¹03§]¯Û@uòO[‹²Î]¶J»õÊ=ÿ½÷É 2n¡|—ö:4býÊÙãÈöêkæm¡‹ ‘ À/O¢K§À›bQvÑ›ª²ï{°Oå”zïqQ>*÷ž/ÊG%mX"èp†8,ôÀ› …Eà¨$#)[¹7…” •Ñ^ý¶K£;g ¼)Ö' GàÕî1“)A)ý_ ß2„m†^ZÆn¶§Š¾,ÇëØ'W“ º‹E¯çF1ˆMyjßúK ŽÍìü8Y›Q«öϯçysø„üL|ˆžJnxk†¶–-Û;õJøóΚ¢q5"¾|¸k«óˆr±D ݃òÐCQyŠ3†B¦ir]ý¶½MŸŽ‘){›öS™ÕŒÑ>•dë¥ýá&Mæ§ÂòG;ØÁS¯q ÂßýB(²ý *¯Ÿù3!Åk/=â$®–Üтߒ¡•Ö“J}xtÉÄjÎv€¯E+…MàMáyȹ™9E½ š³}Ÿm>î;1oô­)³´¤eõ: L¹Èëk+½09—fRQ=€’ëÖ¼úü´©U·êékWý¹tò«Z\í¸Û·’ñÖ3eç^¶RØ@W!ìÖ°yŸî$H¥ýé5i Àˆ;áN”h»Ç`ß”çÆß¿ÃßðìöµEù… &Ü62£X«/¸ûö–šuêÂÅmåey•“)–6iHBuøª\ô/atI•¥“k׬˜:}út©ÈÚ5µƒ¦®¥Êæ-³&ÜZ'ÇEVÜ´á¿L(¸â¥+¾Lã|íÆDè°7IC¤9t-¢­Ú]ÉW‚ »Ç`ß’&#‡ŸRY/ƒ¢r]^!˜FÀ–j4I.ô½µ55SÈ<}•_¾[5ñ–•aßE‘RD¸vΊ ÏÍ<ïªWì©cuF+ÝÂß$MÒ„E™èõz¥¡W ›WÚÞ”¹‹ÞÒmUQ]nÕ­Réò¸¨pyè?C¥:—ª,œ}±8  ` ¼þéYdLºñwBŠõ/ü„mki­âìÛàbo’V€…º¸vÑÔ Ï[æ6¯´Þ”óJŠs ñ¸”,—šåQ³3Ô^žÎ+ÃÕ+CÍÉpåP¥[Ét«XZ'bÅi>^Ÿ.Û¿Bƒá’‰k,µc=¥ObfùãÌ[MÞ$Þ”8 xS¾<Ð èêDUyRè‡ü(n—›®NCUÉVTEÄr‡žPPFdŠ"Biâ5±WÃo­Gq›¼’Õ§ €Ä+xSLÜ7|ÖS¼|§ɵè“f§ãTäP(,}‡%bð¦„Â*•ßÈ’i÷ü©¹¥íÞ¯Q…(èsÎg_U·éc•n¤&SÈÐzÆPOè¥s7Ÿ$” ¼)ä5Y÷ØH#|J ²éæ‚aS…mìÇn#Í9æÁõéù'dŠst™òÚ“w %b5ŠØ¾b¾ ˜7…Áó} ÛþúTbS,ɺpÕ'“~PY~n^F¶Gi„ <½ú½áC/;zø }ÅÀëí79?/Ó4ôʨ$b2ÅgŽAb“I)!·æ/1 [¶¤B4¾àœ­óóXý–w £Ë!"é7Å«ä¿ùöÇwκ:'CQ’BU”Ü7Õ¼¼aGÙ½dk²¥ƒq9b;Åáàpf»Ow> 2ÅëˤҥËyR©(F‚²†×Ÿió‹†ê¹Íkx%¿%ÃNOÞß|¸ùf'ð¦|ÒðUQa_Eªª¸U%Ã¥)]JD²P=µ/r›,ëpmÝʆt-,ìdž³nN±™§Æ¹}9N=-Ñe“Ig}BËì<Öóì°écR«(l9édJ0ìúã¢%BQX‹µÒÐ..‘h¼) M­WŽì/¥…é’þ’!#WAßÜÍ; /ê×õ_íÖ> ûC ƒˆïŒužOÖÓîÌ| 6[—M&©v|9‰`szlQ“x™2¯ªB$Ö¾ôÞ^r_Kó×޼ܜ@H¸‚’n]¡ˆ^ñe0$©žZ…èSõÀí»+,‡áàÅ1x 6€EŸôë¬4îk9~Âçñ¸ýÁj(¬*Š K …ý!IõÔë,•xn…œ¼a"| û¦rs2½íÁôä ˆ®ºá@0DõÔê\”¤Dro‚_›?o   o¯voKNVfXJ%¤:%eçÕSkÖ8섬:ŒxužSƇۜÓ~Oûy“Iªyl,›?e£h€Læ¼M}dxýÙé‘aUˆ°G äfv4z›¨ÕÖR…í[û}>×2ÙæœfÃ~2ñ¼Ò(Ó S¥Åý>üWýøGýYmþ;,UU g¸‚jè¯C/¾@ÈVÇ›‰!ñÄ,™/3§]/ì™è%[‡^<èÿ—îÉö(Š"µÌy)•ö€œrõ0jý{w¬ÛÆr¶xx¬ E®!W`#V*»I±]Ê)r5¿àNUè2T¨TéÒªbÖ}ü­ÂÌúŽw(®v5ä>žÙáì’Kâ{f>.SPTßț̌ŸËô7ypñùÊa>|xBRS@Rù×ßþœ¢’Q¦Ø nyý—wÿ¹/³,eŠew3·K ‰#wŠ»û¦ÏA€Í/.~* #oæ‡JY®«[ÚqLÙ ¯õìLuôe"d7väövÒ%oæFî/›¹§,åtVÆ1μ,@™&ÉÙ"ˆ¡s‚ÝŽöÝlÊ€ÚÎ|”ÚÒ9Ô—1…üï?½,+>q³4b ln”œ2²~Ø£"¦ÐtF N‡då1Lº¬Ûoi €˜`ÑZ¼„¬ÎuS€o_>—`‘ÛõñûSúŸ÷›´6P²EiL\ë)ÇÉ÷»;înþîCû^QL)ˆy%ö}J;'˜²“Í„yš¦c °üì @œç(úއ„§ö‰)0}v LlL‰e—™vŒk@kù¦(€-·LK{¾Ô¸Kl¯o6¥ßùŸÔ?ÓÑæ4'á —‰Äž)‡Ê푇bOÞŒý}F'Ò_È$<ÄèûCOì¯s¾µ‘±]¨M殄³;fSfæofØK -€˜Ò{ým1eãõ!P›7·w©5ˆ)Ðu]jb \_]¦uQ› ¦b €˜ „?‹“Úäÿb ô}ŸA×uŸ>}2›òððõ>µÈeôÔ¦JhÛ€R•YîÝO¶Ù–´¼~û.O|ʼnšíbÒÇÓ(øÃæ{ùWTF6üOú”6-êGJ¯&=©?P%—ô}¿íÌíPÝ9 ñûVy“ã£å¢Àñ!³)Ó®¼þÛ÷•Cí>þ#oîíÕó¿~–Ï(%*Å_§š­„@œÙ”v}lŒˣ̦Ìw𜄦ìžPzâfsjùOm fSZ~mÛ[uL¾åÈb6̦ì{äÒ˜¸Ö¸ç4Lù¯í˜fSb^‰=‹¯öóŸE̦ûëÏ·œ J§Ú0›R¹KiÌqÀX¿RzòÈãÎb fSæ @å6÷c m˜\ùE[m ¨M a"ôÔË`ëÏ÷¥§Ú1+8 1±?ô„þÊf¥3îÛfSÀlÊ!ùiúë\Íl ˜M‘Ÿ|Ó–¯qï’[‚_HüBrÛüBòYZ+|‚¦Ö 6º®K BL€í‚BBL_¢aÙoúˆ)€˜ ¦(¡€xÉ´ º®Ë×p«S ¥KкŒ^û‹>b ¦ˆ)€˜¼9{xI«ùB2È"ù€&††r8&÷Ï÷ú˳—ž¸Yƈ)à—{10Å1!3µS€8ÕQ×zÊqâÁcžØ}ÞrƒÅîøÃÎ(ŠGn=¦1gÄžñûœ6Ê}̱=22öÌpš«™M‹>%£ìY[ó˜¡~eŸ¤"¦@ÿó~“–P&KÂÇvµ,qöåà3Šõ+a5*ò…dØUF¡O§s!å–žIYô©[øŒ½ª8¹Ri7<›°ŠL ñ³<öÄ´—{J»ì^Úeðž/fzl|…adž}@YI¬c-bOed8`íIëû¸Y﬿’c)@½B1\ím!Jh1@LP›7·w©5ˆ)Ðu]jb \_]¦Q›àºû€˜¸î> ¦ˆ)JhàõÛwiAt]·oÙ²˜_ïÓR\¢fõ‹>€Ú1SÄàÍùû—|"1d‘½Sb àòn`*åÛ—Ï¥Q:ã˜8>÷<Ú,=#c€*1ˆyå—Ø“ïG²Nx¢1ˆ‰db°xò.b ˜8É÷a£ⰼ®„å¶Ï„ÊsÅ£êC±}̳)Ч´IÏÀÏs)íG›ù~%%´pHFHâfiÄÁÕÍÒ®©÷Äöºb ¨M©Ä‘US°¾Ü÷i³ÉIÿíÓ7m̦ „ëË›M9HÎ(+!¦ˆ)jSàæö.µ1º®K BL€ë«Ë´"jSÄ@LS”ÐÀë·ïÒ‚èºnß²e1¾Þ§¦¹DE@m €˜ˆ)b ðæüýö¶ÿ`_H>n?Ô¿}ù¼ÿ^yðLO=ý¹â^1Á„aÇØ?71â§uù$>±§ŽÏ8aÇ6}À,K¾ýª'¶ËfnÄGÇCÀÈøêsÅvY=Í‘§ ÷•wf®Ù .p”vé)Êfqd4r´Ý½jG«¯é5 @L6ib €Ú¸¹½K­AL€®ëRƒSàúê2Í µ)€˜ ¦ˆ)€˜ ¦b €˜ˆ)Ð?qpŸšQ^®B‹_Þ¬ág0› ¦b €˜ˆ)b ¦ˆ)b ¦ˆ)€˜ ¦ˆ)€˜ ¦b €˜ ¦b ð4,SÄ@LS1@LS1@LÄ1@LÄ1SÄ@LSÄ@LS1@LS1@LÄ1à,µ®¯.Súžš€˜©Aˆ)ððõ>­jS1@LÄ1S|!nnïRkS ëºÔ(Ä\ Ô¦ˆ)b ¦ˆ)€˜ ¦œíq‰‹ï©)€˜rqq‘ˆ)_ïÓË€×oßüï‡l.Ö{Êí_,ÖùÿÌ7·wNùäKhßôSÎ.)\:2ˆ) —.ðæüý·/ŸÓÜðMdŽ”Rާ|ŽY>Ó⚘”tr|SAJh°|³½m¥'ßFzJh™x¦ñŒâ˜øèË̦€‰‡ØsJ-´ëcv;[\ôAMy¦Ü·ÿ‚Eî;£8¦…:ž³…߸TÕ.Í_(ëkøc[&BBg}ÇUÔ¦ÝÃòg3üq.·)*Ç54>×2²´Ò/$Ç7%NOå±q¼“„ñ³Ø_zFö`Žõ‘Øs2kU¹1~^qL|tù·å¬Áºž“®D©·+#'P*[6G>GjlOèLKg}s]%´qBåW³Reä)öØ_Ù«%J[Ž~®eÿjYW¡]ÊFu’mñw€úTJì_žOÞ߬ë)“(»í£^ëiZ̦ÔkvN¬ kücé©T<€˜2ÓSlWFžÚâN½zK:€³fg#ê À/[®ÀÍíSSÔõ4wît]ç”Å”ÀõÕåšO™ßÒ4b `ÑGáR‹@LQ¸Ô(S.>P› ¦b €˜(¡ýûvH @pñ&ÄD ‰7±ˆ;õ%~É‹ q%#S< @Ã"Á ­¡@¦È€)úór5rwd ¤”ŒÜ#™—óÉÈvSd €Ld €Ld €L)€L)€L)€ŸŒvà˜†aЬÇùlô€ê–|;pLƒlÒæ_ÁG[? ±i è ûîIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-05.png0000644000175000017500000005427210536106572024741 0ustar gregoagregoa‰PNG  IHDRÙAXIDATx^ìÅ¡@QîŒ+ˆF±…ò_y:]òÀ#íZvà„}—ïߌ¨mÓùpì}pTÕÆŸ³w³I6$ˆm¤­ DˆE0Fpl•ZÛÚR¬–v¦ÿt, ¶(ßß ß bÛé µj?¤Ó/«Œcùe…ÐRiÚj‰@ÂîÞ½}wOxÏe/ٻܸ'ïoΜ¼çÌÞìÍÍ<ó¾Ï¹wþüùÂzp`ß«¸è‚ ‚ „Ðq‚ ‚ „ábØØ h7J©óù§{È‘òn®tÇCó3"üö¯ <›{æýO›P<ôÏlÞÖq͉y773îÓö›÷ž¶™1Ó>Çå=ø|ÿþ×+ëuáýøáHãóýûœ6¡<×Ëg>cèw[§ý®£Ùq¶ëåÝ¿w¾#î#ÿ/œƒ|ßGÿN¼×+¿÷‘Ù«Ï}ä{¿øÍ·óÿm»ï#þ|°ûÈì1ß÷ÿþ8ÿ÷‘Ù¿Ï|ÜG¾·pFzµˆlÞ0~ÜöƒŠ ‚ B8‹éZ_³QTQ·‘5Äh×ò¢ÒÒâââ†ÇnU½ùÅíVŽ‚ ‚pïЮșѣGÿhù&-ÂB¤Gcm< ¥kx¿°¼RÙ€(Ø' ÑÜPwÿØ1W•)tbAAÈ}Ìo7½àŸa!ÒûLm¢Pp¢Ý+6Âat±T8‚’®å‰Ó ãîVP¸8µ/ÏÐ÷Öè ‚ R£9úËž9圌+ÛQ¡bUR**Q–…ÄœjÁGMŽ £¬ ‘(˜S‡×(é󀞬}²KßÑö?ÎqEÕ|B¼¿g9\\qÃ#È™ÿ¼ºÀªg 7Þݾ@¯‘³‘3ÿxe€/Žšwø•¹úŒš8¸y\\ûåÅç×­›`ÀKáá­¿> àº1éá›yÀÀ;—!({6MÕÁ w¯FÛìþÝdþý8<ìúÍ$¸>nüØö댼o=ÎÇ–?pËøŸ#?‚ Uƒª˜Ç¨zgr×"Ý.Wª‡Š„"ÅÊJÄÐ|Ɖvš“p,TukL¶Äœºz0¬HX‚´“òªÉ¬H>q*‡LSPïíYöÞëËr—#Ÿ¿q†RÈ+¤B”~·-Ênlpûäö üê2(t,Dª¿³Öc¤ÏÆÈ{×wài ‚ ¤9H|P£ÀGˆøj‘ÏVET¶D3â±dÜFHÁ ©²^N´¯jjqN<ë«wO:ÈÀ“ùøÐ:ŽËúMÐtp-€®×Nj|'ô¨ñí'tëÿ²òá[k8î>p*€o®NÅ×? àø«\>è'éx¥ù]ÿ~"Ðcè£ÿ{í1êüw÷R—™ÎI΋Ôí4¹‡+‡ÏÔÁÑ‹x²×ˆÙ:xwÛBWœƒ³Ùº@ïš¹G¶ÌpuÍÜêà–yœAšÖìÈèîJ qÍ­ ‘•·_œ  ÿW§ãZˆ¸ó"û_˜Ž4œáì ΋ìûó4¸ôµå:ØûÇŸÂÅ—¾¾.öüáaC¾¹š²#¯??U§F^{~ “ 1Ù‘Ç>?v<;‘ãß}rû3ê€2"$D8/²íi 5ß{Šã¿o¼À¨ïç7;"‚ r„‡Ÿu.R*ì(ËA£” …è^­¢}Ô‘}É­¿H|p4™üØ)R`2 4î ôš‰ÔÒ*dÚAÅuS¨]Æ*¤mH‘|fpª¨ß»¹ABÄ|nØtji²T'Ep–º]ébÍð™Ôü{çb"=GÌÒ it†A5"Ú/¢UÈ¡—gŸ·RCí—fÂi!RuÇRj,DŠIˆÀÃõw.×*ä?MKõi!2ø®Ôp ýÖj¬?X—h!âÍŽì|.ÕôpçsÜtÏ:j¤?p­H¼Ü|ßSZ…lùÕž¤ 5äA‘#÷‹„”ãD`'¢8Š’ž¡x$yì]·×®?ìÄšÂ, *†åˆ6Ž0œi?œqgGH”œØ·ê¬yPœñqxü":#’#œ¹tàΈPj„€ôp M»áÔk‘K ªÎ¸ý"$G²øEH—(¥pÉ ‚ ®åEx:+‚p%"½ÑüQ¢þ¥ø‡»ÎNi).+U…aX(´à%Ã/Ây*ÐPãI] !¨@“»á¼H[°Ñy‘,~‘+†n->…‚ ˆ}•-#µˆRÊ*‡U‰d‹Ý´+vjwMNQ]J-BIa ’#|åî‘I´e„6‹€Ì"&)ò)¡÷ÍshË™Eh³à硌[F.Ð oYD7tVAd Ë‘@5š 'Þd·ì·cÇ+†H!„jFHo† Á%dá _d.襌¥F¨Á2‹PjäØÞ•›Xµ}•½«¶¯’eÄ]£éyÓ,jd9º}{W©Ñ²^ö®^¨S„Œ«ì]Íue/¯éÍÊq•zJ°wYt× ²Œ°}5ì!ã{WÛ^лPT¦!ËÛWµe$ [Ÿž`¼«JÕŒÿ-ëÍ·wUAœ"Þ™ ZÄþWÌ>î(áP; D9 »EÂX^ãªQ!\ ñ¾»‡‰êu4zÖMù€ÉüN ·wÕû."Nд[Žx_nÄÕ¸`׈Þ-C®U>í¶ 4Þw‘Á¹Çe×*ŸgD8¾ZÇJñ –#<ÏO93‹hT¦SDÃ~žÑ©¥Ìš^ªÑ(×çY”ð×ô’kÕ½ˆ†Ï‡]«^E2䫸cü|5ôî5|Úd_Õâ5<ä÷ûׯU>m–#Þ5½ì]ÍØœä¿ëë’FAžuæ´8V!œ8”œF¢hF$J1bÅF‹,ùýŽÎó2ó 3%/è픂 üp÷O^‹ D ¡$ã@áP€pÉ»VsžéDB„×ô*Á¹4°Ð#Fò‰ ‚À¯»ûäó"¤06oØŽ¬Ìœy=¯ ‚ ôÞÝ|Ôh|t† ‚ ÂÿÙ»cݦ0ॊºT<S*Q±Ð§á ;02f™x Ô¥ X²œ/êgÝ¥Ž#ÛÉï'—ËÏN¥úßó¹9Éz‘ÎÿÒË™Ay¾]_nž¶åp}5 YEY@dYEd@EY@dàîþ¡Ùæv Q¹«}>¼{»ÿòÇŸ¿MM[°7xqáüýóël‡žþÀd‘Ñc‚ÈÄ×Úvôn:¡-Ï‚È"ƒcJWn嚨ìiÙAFÉY!—÷ ñV§·fÀè…Ê”¨j}‡XnŸß­w©bóÈ" "=D9‡’fk˹2Z"y¤ëeš®¨wŽú®²ØCtÉ{ÎCTûvë–?–rûW Ñßf)Yd Z‘3B¼å¾Oq•í »KRíCÔ’PÔÔ”ÓÏá݇װ!êó:sÈ"yþ£Þ¬žlR¬¹ä0Å‹ú —ºzßúÐSœ{dÁ‚ðLoÄ‘ÅFˆØ±èS˜0‚¼i~­ßÜþúÖ¼x¾]x 7ê‹+UsÍÙ/\åæi;ìáÕÃW€–o‘ä PXMjKMóÐQ®ö~`Ñ~ظù°§]¸ ðøùËf³IYäd, ‘EÈ!@Y]Pž~àäYÄ-;ø¿«0^¾¼ðoNðØjÁÓ˜0À3½² ‹È"€, ‹²€,È"² ‹È"€,â{€€ëéCìj·šM1\tYJŠâîþ¡Ù^Õ~¬ýG}ª9'#ž£ÅÏÈIñŸ}3H†¡h)³í1ºë¢tÕû¯º*]t×cô0XüËÐ'˜Œ"Éò·c+ž¤àqz"òùó[sÚ\«s6ä„Àrâ®G·‡R~}ÜVîø_}v†ê¬e@:z&òŽ+çîq²5žý'·YÅC‰È®¼VÔ)Q £”»~>ʉC |ЉyHE*?9 Xs{aý[,‘¹Èiû’%x%ªàÌŠÔ°&^XéÀ,$³™M¸+) Mšd?Ý15òlVlÈÖ˜¡Eèð£jÊ„g•!Ë¥Š1"3Õ„øQsö¶-Á<6 ·¶ÈR“ÎÁ0ꔆDƃ)/Çp"s‘84QÝ̰“yo„ä#šNº„4$øôÖPãºLS•ù|ÿªžª¼QEC"WAŽ<„ 4Ÿ¬ã§¨Aì!s$_MLÙG/ ràýûÁ㔡¦¼Ãq$2Ñ¿HJÙPÔ2 çÒ‘âÔrÞkq¼–û#œÐŠhÕ¬‰½¦Þ"Ô™þà÷8›túT'Kun°‹2|ad.Âo~ðÒ†]!¶Ií#ó•ËÕÅu×z`-ŸG É:L]<ìxä–Q±¾™`ÁÛ¬] ¡90¹ˆÓVWíôß®&59ñq°^¤¹Õ T†6‰3«>z5ì¸ÛmW»õÆFd÷¸-pE¡Þ˜|`3ÃohÝ¥ßD·Ò­wŒ‘C»U é.¬'Qaؤ'"2µ7”+r–£úî`“šˆÄEˆ01Œ¸øîàÜKDŠÐ/P–ˆ .â/ºôóÕì©ë8ê[VGE" ºÌ6ˆ6 zã½ñ€Þx糊 X/@.ä"ðÖ;ï'xT ÷Ñ$ 7«Ä58?˜ï»ÅÔ3wä`Ä@.uñï ö“?ÇNx,ºM"2å”ÜùJð;Ûü€>½¡)þI~ó^*%eæ.yÃn»ÿÚ××·ÇúRIßo]ß@ä5Í`¶rúô:‰NЪ¦©1¯ŒÚTý²!Qµ5ïÅ£u‚0ó¨TD'Ø]Ìr}…úÝv€$.‡”G™Õ'ÐÏœfYãÆ¼”OD§¥yoÑYþu“Šfg§¡ ¢HT~ …Ý`V“0ùÕJr)d^1Ó‹9×dpÀMS´J%%¥z¡ú/)ÇÕ…DÜÓ›9[oš³"Õj÷ºÛÖ{h lgŒB‚{!i‚L³R¿Y7ÀÚU.çšÈ¨u-ϬÀžÆ ½eâW‰¢ú²{±,Ööäª[å&³ò«uä"§ï7[é;n>~ØNï?ÿypÇgÿ1?”tDõͱ ›÷êquÿ¾ûfQØ;®g¯¬æzŠ UÒðÖô¥Ûý !yüèA”èÓ ôé5Öcο&@ŸÞM–{€üù›Càðwßÿ0‡0>úðƒPçãO>U¡_|þÙ’r€ß~ÿ#7€/¿úz»\!äöö¶ò[¸¼¼\j]øÈr ÌǦ•¬…õÆ50;›ƒ óYÀÿm`îÌÎýéдP~¬MåšÀ(í¢xM¸§×ù ®²ë e;9r5î×Eòïé×®vëEäJít÷”v×hJu6Z»Ú)×5OY»jÜÓëWDlã%WÐméy+;Š¤Í» E?î²k¶³K×êúªÓ€šUÍ]HÇ~àu=¥Of•$œÌ‰u+{Ð +kGçòEÏâåÏ—P)ÑOÃò«H¿¬ÞßÓ©\':¤<ÒlÚu=ëT’p2§ÕEòÐEý ¾"Tw,I¤B#uËú+q  °]¤.\ª ñ'Z¬ë¿Ê¢º6í¨òOæüºˆ¢S²iAå*t$¾÷èØã}uî7ߨ%!ÿ>¦+_ûô _ /^æ:Çu‘RŸ]V’0ùu~S=»,šþ ¤#Æ—?ß,PQµÝOnæTêö|ë"à—H2TÒmïÉU?¶ ʆY§žÞ 'óúÖ‹™G ‰l×ôåãµ%Y$h†ç¹qÖ%œÌÁÿA…ºÀBËÀzòæù"ÐøtÚl/ù°¤¨‹0uÎs»ÈŠ #°%yûë€>½ôéõ¿ˆÇ6ÓøÞUòx¾/ ìÓ{uu5}„óíÓKŸ^¿OžNº¢ã,¯j\}©$Nb#ÚOõUR r‰\^^.(Z`Æ=¡5ظÃI‘Ì#ÖéËÃÌãÐá¨~%q1jÐKE¿"Ö_&×××)~nnnö݉\DçÑÇ[ ¡u Õé0gå1% ã#ò–"@.’„$±Î¤)‹Æ«±YxJ\\\Üßß'´½t¯âHÂHÕ„ÜAÈ XSÞG×xÛª.ãÐú›å€7±%zÔ)¶#'’õÔEtY†Á`3ÞŠ;}«ÖÔ JFšîÞÆy(àÐfs‘,!ƒùŸ½sבd)Â0‡GÁ@sì±X¯×؇@Hµ¡WåWÐ7¿ðE€úrv$ÉQ)§\5¾e—©UùÆ'ðE"ÌPÒìgzt™¶<±Ã›Êµô,ñÀ¾@ÜRY*Ä¢MÖÓܹÑ3Yg÷2­=KþUñ¼”ö~ã"zäP·¨(éSXwÖ©lB0£hh뻪ƒÊÛÉØÈcÒ’^ÙN&ka{¢³×Ñp@w;)OZ‰B)i3gžCéQ¢U~¼~ú­¨˜ï¼µå³‚ís¿­Å| ‚²¬ "ÿø"ÀûÊ^°5Ô/¦A‚‡ƒÓ»€/ð´Û‘ç=ß½}ƒ/²À7»€ãñX§Óiw_àp8ì}ˆÀo!ÿ´p}‹II—xI –Œ²%]Ê/JžWió §w} |ˆãgªQ²¥ª–‹d¼–­¦Uƃ/0Ç›¯–éöÀºÝ0ÖËuÃK© ×_txSáoÅ€kûõî&øt: .BaTwäô™âOÔðIÉÖDÍÖ’AIi E÷hîøõšjqýžÌ ÀÓœ *\Û¯÷x^¤x$Å«ˆÂN"R†¶™À ÝEàíò%ž1\Ï #¼ÑÈH•ÑÆ=€ç3F壴 ×kEÕÆËÂ¥ªfÒUc1 –h6‘TD‰oë%uæßÿ¾ÍÚÅ2µfÑíãj›O@Ï¥žß¸¹vWE%kaÜʹQqÿ¶¨ ÉDC¹:%‘Ö„šmoªD-ªÂk¸Ø •´óvK[+9 U:¢Ä´²UbËÔ6ôÙÿ©øæüQ¶ø%QCUL#IU«2[ôE8J"’†Ý«waÍ!kߵƱh44÷pJ¸B¢Q§aȺD4_|€3”4Ç\ö3d¯Öÿ=¬?X¨'±k8/ìÓÓû&ëjž>d=o±Âdö«õÛppUÿñÞÕM|}7öB)iW7¤v² ÁŒ¢¡­ïª*o›KŽN±Ô´ÚÍM'M¬?¾6¬u³î¶·»_`h6?­Y³!&%‰9›µûœÏj•¯Ÿn+McÑžxùþ?'MÙéýñYÀ"(Kšà¡ |àTGÏ}Î1©âg1gfïû/ ¾¼¼¼0 ø"À7»Wàã‡÷û¾ÀápÐB~ =ðûEðE€‡e6©Ð[X·Æz¹Î®3Jx³>à‹^Ë2ã«rl½]¾OlòŒ(gW؆ù2»—ò‹ô¥ÝZ¥èWÚÕÄ¢6ÉoaŒ,VÍ׺ªzD‰ik%uæÛGä'Yk5¡’‰Z·Ê~Œyyé;”/ØYxò98º/_@w>E÷Dƒê1.Ž$ÔÄÈ Q%åjû¬¸¶%«¤·[ÚZIÙ˜ý*¨-3Ém+î×®µanÎ7 ÿÛ¹¼ _ cÏ(’õИÓ2··?R³F­4ìíaÿ’¾@„JzÇ\XÇríhÈ’pv`ã[¾ct4YOs?¢»ó†aFisVfÖ?$ÄE€¯ïÆ^(% ÏO8Jíd‚EC[ßUTÞÖJª[ v›Ï®vÍ€ïêEÍ*––ø™—æ»_@w»ó„V%qû(i7gvÓ%ZåÇëg ÛJÓX´'F¾¡Ä«WO—|v€“žïÞ¾‘ìTµ¡D²÷hž ñc}QóØŽìê:‰‹A/<«!3›^€sÁÇãñt: q‹½¨ÏÄÖÄP8Šm”´ÈŠð5yâ"„FÊ5¼ãg†tȜɋŒ§yâ"|³ ¢%42òNÊ{ÕªRdF’áŸÈ»wµ©<¾Àápxèñ¿…¼sá"Yâ:³’Åõ{þë6‡hIu/ÂMy•Ѫ‚ÜÓ ùµÁà\ß"°R@8DK"¡µšÕÇwËÕ6¸Gð|ƨ|”Váz­¨Úx¥·TÕlbBºj,&ÔÍ&’Š(1m­¤Î|Ljü$¿¾Jm)s:.«V{¨éþ¿?Kq5Íç <ë«pvÕü„5÷¢6$ åê”DZjb´W©µ¨ ¯uàb7TÒÎÛ-m­ä€T™UP[Ù$õÕå¾=%³gÖά”_‹&Ó¾•o>'@¸åþž£à(‰‘|¼o½¦þ\¿ÎŽš5jÛðŽEÿ9 €/Zjà}GXÇrO¿©ê€E༰“-ÆÐ&ëjž>d=<±H&Òçµs>”ë¿@´ÿ¨q½µ/ £¤KaìpR;Ù„`FÑÐÖwU•·µ’êä#RZÒ7~PŠŸ%ÿw¢†Ò¿vÒüná+ÿ{_@w»ó„V%qû(i7gvÓ%ZåÇëg ßŠŠùÎ'…Ötk“–áûlkÏ'Êgïxyy‘2À"(K™àõb¼àã‡÷L¾pªÃ û¶b&`s‡ðGÅ!Sή¾Ù ø"‡ÃAÊø-Ä=â"ÀCÛT¨ÈcƦ;ø†¾ê\s¤ëÏÛþò~ O>ÇGø"€×²¨E-ç±U¾9Ç»à¸G<ºéáO΋<Ÿ1*¥U¸^+ª6^È-U5›˜®‹ÉµD³‰¤"JL[+©3ß>"?ÉZ›% iÃ|Œ*oMÈpüŸPj%®¦ùòp^@_»îÎ[„d¢Aô¨’HkBM膤JÔ¢*¼Ö‹ÝPI;o·´µ’ReVAm™In\q¿vBbôv}½Ê[ùæ;€¸ÈëÙÿß>ànÙì—íÿžã´fhó4«‹ÖqŸÃ Mú‡¿û¸q‘§³ÿ¿·ãqBò›¸¤÷qÌ…u,×YMô6ñð÷À¡ÎwoßHv²ÚBh#.°Ã-¿ÿw󺚧YOH,†¥uíA–&[bbeb÷¡ž –ìTŽÿ#ü’é¾¾«át)éP;ЀÔN6!˜Q4´õ]ÕAåm­¤ºùˆT§–tÌ€ïj'ÞDîÄ$M¬•—æ;Ôi8NCôbpÊuÛ K¶$"-2Ÿ4®š¯éÔ„„UðE€†d#!UIÜ>JÚ͙ݴG‰Vùñúè·¢b¾óI¡5Ý×Ä¿&ÃÓjú›8^Ÿ} @¹VŸ HЧRdŠ{QÒC¹Ê(*¯:k¢ödð†´ÑlÀ"(Ëšh?Î ±‡Ñ–/žG8£ÉðOå•ù=Ú*­ðE€ ˆžÕŠ™€ÍÞàïÍG;<ÞQðá“*y<gˆÊ<Ìyh=–q-zÁ¡TÙxL¤ñEøf7ðQ›âÔtMDPDdjyA«D§Äcjº€/p8v;6à·PøZ>D¸)"¯2Z>ªRù¢PM?Ðs4„C´$F^eâL«z9¹95­iï:^ß¾Ù÷ƒ ¬Û c½\gмŠ^,œ>9 )™â"úíz×ï ë@¸åž¿À[Þùt³ø"ÏgŒÊGi®×Šª·nKUÍ&&¤«Æb2@-Ñl"©ˆÛÖKêÌ/¿^º(Z« 3·¯¯UÌÿUø9‰«o¾}¸G ïçVô;ruJ"­ 51Ú½T‰ZT…×:p±*içí–¶Vr@ªæ]/-‘D“E¿Ö­ ss¾y¾GIF’œš Gd=ë‰ß©Y§Vö÷Pìî>ýø"-›D„âóØë^®= –^^^˜|€Î÷‹…X´Ézšû17z6¶‰t²î¦ÿÒPáÑ!øøáýC_øú®n QÒ¥0v¬©lB0£hh뻪ƒÊÛZIÝæç^/ÕÙ5c~h5«XZâWêÆÀÓ7ùC}#ý~ø£/¨àÿþ»•ùô»ßÿí›üì翈ÝnÍX…—×€qî=<@Ü‚wÀǵÞÒÁá›OŸ>í .DP41}ßb½6ÌÙ»{ £ƒx›´3E )S¦ÈáB ‡ðV!…÷I¹]@va ß+ýÁÂÂYQÀ Þ7¬8x˹u‡•]õOV÷Ë{Ä@æ"X¯Dhüg2ZÀ €´€´€´€|ë Ã)0çë)0ëå¼~—Øs-h-h-h-h-h-h-Çñ”xŲeßúH?öî^ʼn( p±ñQ"¬ÝZš·³´°Á7°°´K íw}+È19™l²'?ßDzܜœËä̽w&+Æ7?¾mó–Kyê$ýÒ@-ñ™åÅ>RE¶–c9j –äòb¥vY¶wΓZÖÆ/ä˜ARNÖäâ,íØÞJ7µÔS0é#yðD•'^*ãçí¼o*ŒôöÔ.Ò¦€Zz×xî> ’å´u|©juÚ7&`Ž32v¯ €Zf_¾ŽŽÀ«—/ʘñÕuÃd2yûæõ)Õ"ðëæ÷¨À»÷K'Ke˜% §:.‚³À¨ à"~:Ž0G=—€‹x<ë P‹¨E›éû±N­ÖI¬|—PãÄ>´øzˆά<È®ã úê<R-P?S?o‰ÚeCüBŽÙarڹܥŠ*ˆ.zV¥¡3_^-)ÉgÃx©ŒŸ·ó™}ÃI9½=µ‹´Ñ¸3¨{]„6tæ ¨E£ õ ºŽ¯c"Õ‰|k#4tæ ©EgÏâ²/_ðÕññ–#žž‡ŸèZ>Uÿ;÷ôärä@·w¥E¯^þ´WEycÑ>Óq@‘[–í•í9¾ÎÁÒî”ÝûH:ó?öî¹q ãøû@{“»$3I—´êR¦È}<Ûm¹Å#EÊ!é’™ä{½HFø$‚EK¦ÿ¿ñÈRœ±=þæ„V’E0A;cOl‡ñ­p¦_@X$ÛÙLÿ­»É/sûo0"‹å àšËQ©‹KJþ’P~ýíw» YØl6v+²ðéã» ˆK€".YPÄå>@ ‹²Yp øæ»lî|>uÃY²#~ÐãaØI>â-ü ![ø÷ï?mö‚»}ÌÜ–¢‹Fêz'WmpYšqÔ¬JdhDiD3rLsâ¤òVäñóS;1¹½n²´èašy4vj'¦œ{ ‹@ÇEM?^Ç•Ýwªr·é€õž¿üüYd9T>”cÿOK¯xe¨d£žžžrãýû÷‹Å²Ad$éwôÄžv+¹MÜ-\v1ÉíR/Ééäðinçþ“#_Ї¿±,å¯ã.÷K"ˆ–_§¢±#»Z@Í»\RŠ%¹|’Ÿæ—r#ެæYƬ)‹¸™fž[³n•YDÓJ&ºõ'²=í±?MÙX€œzE‹Gv_%OävN9j”þ^ò0³Ã˜ϖǯ(‹èJ‡k½ADv†+<èJ—Åv#VM¨œjç¥BL g{+s4Hfš±(D­ÞH§¶ñ¥R¦Â¶#Ö‹ìje¥tÖ5•S?YdÅEYæÏ_æ×ɽEˆì2š2N¥})@™Xɹ¤t–9š¨7²4JQ$ŽYÉM’r1?.øU·[•]¦–O4ã|sÔÑË ¹QJeXlôFÆÓÆ1o .å Y¬ƒhpët©=ÿÒ¦i7ø¸Ic²ËÐÙ.u<`‚&<­¸ø´4r¥Œlžö-­A'“™ÇvÉ=>mÂ%>•J¡%$Ÿ\ÕP{4-ò(Ùl€X؈bÈ`¯3$ÛÛê|yC“ïXQh©<* ¢‹_•×+[`zæ ‹°dÕõÜýéÿjåöøH¦Z&Q¼Žê¥pÄÑ :Þ(“@¹õÎf1ˆh`óõfÛGßJSŒÚ‚(Ô[âÁnR=L­•%lk/ @dÊÃ1ÀCOx¢Á™æíð®Ø©8L{ÃL’uæüë´í’}¶— ‹@ùQCYÀkk\]$’)œS#ˆ›']¤ðÎðQ$Ùƒy'”Õ¹œvðùþ÷‰,‚ZÑÑ ‹#Zã„z9¢Êoª9Î/«õ|u)~ZNë.ßZÿ°ÎüQÛ¯:ï’r­s?xØl6öjEX,’iô%¹¨yïŒJGL)ñ|ùåd$勘ҹÈöÑü¡Û¾“¥tz)lÚ·e«Ÿ>~°»F!…$3é½È:u˜'¼¾*ÕïUíQ=<œQ&·x¸d~¾ŽÒÉ;÷‡äÚ¾K&™d¦{Ü@aŽ&tNÏû:{{£04•ž²KL;9‚˜w¶íÒ¾ò OI2Sj]tåödüÇÞù+IŽ$éÝÝdv÷ììÜÞÒŒ÷G³£vhFŽvâ ÷(Rkmµ]aÍø(R\‘ÔH3òhv{·œé®?™@¸3Â#žÈÈ,TvuuWÖøoQQ €De¯¾ùÜÃcž8ChÂàìêµÆÚülŽÚA;‚RÆ· •ž,JÄ>ÓDªþé‘“B@€DÐë(6:·h×[Gjç â8Žã¸q-òÔÕqñ°# x"ø‚mÈ¥|4U}h&‡¹"uGÚd"èzI… "QH$•[•yÏÚ7,{xvÇq×" i{föˆè1”Å®äÎùÉ*T YFð¨»Pé.$<ˆ9|"„¾¸ Ü#€°jêãnG@Ô&¶®'¥NAî&™ÃÁqÇq-â ngÅ^Ý•Úbs‡´CG7ÇÜXþ‡i‚f‰œ AB³¥#êz„¡ÄFM­%† ÀýÄwL A@&W†ã8Ž.M·ŽÏ|Ö G_P‹¸)b1Éíù⪦BÚÂîçæßÎ…cNØ–£‚=°Há B• ¡îDx·ÄÝ©' ¥üU‹Ö˜&¾ °›€‚n©/Žã8¾:ׂ{~-â`ShWsTñäñ…Π…)gÑÆÓQ¼ÆFÕ}ÁZ: š”**A$?µž%(¶@ Øöíïb¸ |7ž!0ˆª(ZÇqçù´ˆCq3S¤OE9ä\Y:Œ€Ë@ êÎÂ5Árl™bt$ƒ„¥aaV…ÔTˆP±Gjž]æ~˜øf‚]€1À$ÅaÖVGq½OÏ„ã8ŽãZÄ¡*a#²tMÐî´ÌÁº‹Ë|²ƒ¹iÛ•R5n,È òcÖË{Ê*¤ƒW¡YDš$¥ƒÜ«22L < ÐN$û"Ïã8ŽãZÄ!,–6.ˆýnÊáX‚Šy!8‹Émv¤QpY!~@Ñ\@™ëžPnKjȆ ïðá5õ*ãÈwöqc˜B‰Å0§̧% Ã=_Ÿñ”ÕãY3ÆI!‚@íÊ»hB$Cv¼ñ.TN Ä„$ù¬˜AªmG0 l;}d<[vÞê¼2ÿ8ÂnR j±*D"" `P@ ?ªR“BL…€p“"Ö>Žã8ž5²nŸèHõ9~vóh Š(G‚ƒh!GÚÈ…Ý£‰ùGdzT/džÂüÑ6«.ÁjŠf;‡×UÈ}ÐÔ(D6Àƒæp˜"v™e‡è…”)óeûm<,:û>Ž|ŠaN[¨^À+W!Žã8Ž9%­^¹-âB„ "(˜;óúµr²Ô;¢íj¿EÈKÙÉö‰‡ÅA,^ˆj‚ Á¶ƒ®;sw†{¾`·!,Uˆ=­n† ™×]8ÄqÇ=˜+ðEB€ê‰ˆ€"f[((Õ1ô¬Ø:v-ZŒcË »¸KÍ(Óå>ÚVS¤ ‚û >Ö¸Ì8UÂrZy¸qÇq^€qˆ€::’ÒdZ°œFlÞâ”6éTÐ.Ÿ’Á2Ì zë|¢â‹lº³Bd r;ÊǼ¾(T…-#¤á« ÇqÇév&0\ˆPOÀœ€Â©©s&KE"³ ¡Ô Ua‚ ž~Ý#´Žˆæˆ˜#ÒÚ!r…ÈX ‡p°5í>±Îóâ8Žã¸y °؃“í 䉙áÅqh‹Ê€6hÁÕ:¬*¡*ŒŒ]"@hG¬¬*ai;ÝT!RFàF…ÈÍ^ ‡d!"§b1b»‡¼y×AÄjT„gÓ^á¦?Â+Äq_åÿùp-²©oá{"< < ׆…¨f«ŠäßB&,€*žÉ2–³ Ð —„§:ƒ·×èLßåÆ~”›I>îávŒýb‡6o‰°Ü±Ü‘ò®-ËgØ“åÇ_‡^7Žã8ßÿ=òú¥—³­ÿa­6+0WSD€¨}aã‘.±#h­ ‘Ü" ýœ½!À©|üÃêyÛÛõ¬Óx69U•áÅòBž IÇq×"DÀÈ0Àö üùnnàÇ»Wš>Âg5 ¯ 3ÖåHB»ç0-R~×ÐæñöÚ–»hÉ›þpÜj‡”KÐí‘ö´ á2lðæ‡|VÄqÇq-Ò¥Vðøæ[xó>Þ¦Œ„»×’>B´0<ž“#€i3ÈÒKýNÛ¬E(§Š ‘=üaOÓf´«E–‹È㘈¹2Aà^Ò¨·‡bB.˘ÃtŽã8Žû"Àéx¾éøî—ðn„ÿw ?îaÿêzf9b mʈ¹&vtVJ¨[‡Ði›‡²À현È8lOh»7¯º"z˜óð `/À oðÄ%ž2â8Ž£kË­ã3Ÿ/špÔÃ!]-ñ‰©ÃÂÓÔA¿…?ÿ~±ƒŒŠd‚×Ãó2qÍóh™- ,­bSy©ú"XßEGd,BDät†AwÖ¦ì¢Bdä4¨O,òüÊÃqÇ——óZp­AÑB-%„1m¸…íþé¾»‡?ÜÁítõY« _6Ãäšò¨è0”,>´SJœ•“û)9"û~8!D¸ÑüÈy¶{Î l>‡þ—*Žã8Χù"d%A!uÙ I¾…ÐC·woàŸoáv÷\/ôeäˆUBƒl: ±¥}I€: Z^Ô¦ú¿÷´ë‡y›c!"'$ˆ<¬"$Çe¤(¦­ÞUž”OÅqÇq-R½í`Ñ!H@&€Û[˜†¢Hþb îá÷ªH<:³&G«Û¤MÅÎΔÜBK%ùû{»^ô]¿È1!bG­ÈTˆ”+%GgÀîÙ Ïm8Žã8®EPÛ€¤+*D0êAã5 a»ºº-üò-üâ ÜÄ<’+ôHè GjPß‘¹Í“n°[ÌæE5*n&¸ÅeI¢ýV…Ø>Ú0‚X z0äÉuD> ÇqǵˆBºÇúÊëô–tÔÓL#Œ[è‡$G¾ÙÂÍ>͵¹®¦ÄáHMÎcíšï»Æe„Ë#R"5‹•þa¢ IÚù2zˆÏ«û°6.cW ú©òžxºøpÇñ¤Î¿ûÛ¿ivŸ~[Eïöz´ˆÉY¦`lŠ ãôÚÀɾÙÀÝ>Emnö‰Ôô +äY‹¨Ä|UØQJU 6_†u_©BX…ˆˆé  ›[ˆ%|> â8Žã³‚m&Ží>‰÷ï߃òÃ?¨¹j-ÒÊàeú§‹¨# ö#ììö°ÙÀÐÛ-ü³ ì&øñ>e“°'‹œK©`ÛÖLÒñwÒ™`É0j[±«¥©3Ÿ £ œ¯‡!ïÉBC\ 8Žã|ŠhÈr!š¹=ò6âÁ¼›;ÖoÆœœi<ßùÜ=ÛÎK°UZpÞ¬ö'bê uÐu@=t}Ÿ¶-Ááî~º…w°I”ü“oá/~ö6/úŠZ$4*dáE˜)ùãF$0@äY1ÂRïqÄ(°—ãÚ&x R¶sØY‘s÷tÇqk¤¶¦6Þ+±ocÆ7cVîÿÀ=ÛŽŽ²‘/ F#Ë—$ÇÖâ5¢mĪÔΆQ·»w#lzØ©ýÕ7ðÝ[¸Ù'ävü9Îém™:)ÖüúÑ¤Ä SÙ(pmÑA†SpÍT%ÈØe$Ð=ÙäX_‹ÏqÇ1ïÁ")m¤Fûs´åÈ ‰ÛJdçü=óµ±=ù:Ò®z1K “#¬iÓG¬Tkl‰Ó¶g¸ p?•#C_’[÷|ÐT’‰ž)#FÐ95QIgn†…iî&˜¨3!’„FQè²É™‚Åe€N]6| b·5‚@ÇqgE(¬Ùu¤&…<»­¶/1_ÄÀVŽœI‘P`KB@I»ÃO“q:Ø 0tI”üÙ·ð'!ÕIû¸ƒ»éçi˜5Ò“I CÊ1Äøb …3E2x4YwÁ(iÃB$ÑŸþtãr#ÄTëf8Žã8—¥eœs/Ì,iȧÖüë¿l-brÄ’X mõ‘y|vG&«_ŽÓ”É0Á¶W¤ƒ¾ƒocU’·É&¹Ù%]²ç/—¯J/FŽ„ ZÄ’s"å4UcžHƒíăö ,ªí´ 蛫žb„˜ Ñ1Ìk¾ˆã8Ž/jc*aîÏ3Eš1åx¥=u4¾ñc¬ÿ"çôʹôÃÒG¸V©cP6(§DŒzv` ÐÅÙ¨"é{øÕß½ƒÝ˜7w»ùù¸#ÃF€ð(ÕÜ&`JB¤êÄ2®ÂmšêÄUJÊ©:ðŸ$Dä\mùªB¤nÌÀÐà8ŽãvH{Ä4„É”f|;¦=n§N·Z¿9ø"|‘u9"‡é#V¨‚ò+’& KÔ¥ ßLœ¶Ý]›¸õ©Ó¼ÙÀÛ-N¢äö¹E ð‹©Äzƨm§VhUc’µžH{©’‘!ÀÙø‹Egä)Da• aÞ]U!Žã8n‡´G¬Óž=·{éñ9wµ­½¦Ãì’¯¯EÖå.³YÀÒG”(€SêD:}’ÚIß_<Á8%å1ôÐwºQl“"y·…‰a¯¢$؇Ïÿú'àa =`« ¤äÜ옊Гv±˜¶|/O¡õ­×]ˆ©ÍépŒ /U…8Žã8f“¬K™¯¯EÖåˆXúHé°îlB Ï÷FÀ &HÃHÏŽjdÆ\³¡S92PÑ%]%A`¯’åNsJ˜á³ñäAúKН 8«½`{ÁÎÔD»¯ØQ˜äØMk kDTKNËSÌ0ÁÕá8Žã®Ì•ä®¶»–ÓºÌfËO z ª‚ ¤‚Åk¸Þ#„l“tt,JÞ ðv“rJ¦‚;÷ûÔNðS­‘¯/Gˆ€dušØ;@×ëg÷ö€M1YÉq™°ú¬æˆtkëë œ€›iº”qÇqžK‹\.G,}ÄŠ¡†2„;ÀIû’β_4Ñl’¥(©áÒΠ‹ð‰À4©.Óàýü9ò«ÁwD€à¦z$TŠÈ%x™M"U}HÙÕ­Æe‰tg –6óü*ÄqÇq-r¹Ñ#M6kèôÍJ*Jôs0¤Q$–%º‡®ˆ’’åÚé=û† üBT—U$vcì§Ÿ7 f|1ýÑõÅÿØt@}­rÆ A`]ÓM›ÓTYà‘ˆ@'€+EÜWÂ1_45ÄqÇq-b\âŽT¡lQ?* `ë+åøhJÀ‹d%ûI_ád)®TE bYç­^Ã\äȘ·)]. ¼¢H  ø³Da¨H¨¾O­z!Ëù»²PÅX"†NÄNik 2²ý¬#€Y¡ÎŽiñÔÇqœ/^®Ôµˆ‰µº#r\›U°À2ãRKAÔ÷£Î¯1ÚO&J€TŽtTb7‘ê݆6ƒÅ4˜!èµA5J\¶…ŸRH>?n]§­n@@غÇõUÛJe0€ €ÇeÄìÇ 3Eà¢pŒe Çqœï¿ÿ¾2î‹´r¤-=bI©Í È<ÔŸ,^Ùëö€à‘*J@E th~Iel½ ‹Dðx’制ªZ¤Ú$,p4åAh%U´“·³¾ƒyõÙðTu¡²' d¶§‡ 0 ë*Æ>JˆàƒkàI5Bä!â8Žãüî·¿†¯ƒkU9¢-/ÊÆ—·e§$ž'‹× ›LÙY§¯}æ2}„  ‘Ø¢ˆ5[eÖ%¹©: 'õdÔ»‹}Œ!ç`ÁóS_¥Ü0Á”ö(àP&E‡,­3“ž ¼|œ5l T-Õ `\Ajˆã8Žã¾H#G¬OÇe™ÍÊ }qMuKct«H¦ƒ¤ývý¦Kœ=Œ*²ÉâQgáÜDi}ŽÅ9£HÚ Hé,ÃC\Í  !T3ÇP«kΫ3EO_%ÃYXtƒ—Šã8ŽãZ¤ }Z°»b“˜°ÈB¤Æk:É»‰iEóTVt‰%"j,ˆsUAÝ5Õcå|my°ZºH#­$ïÚ)™^¿Š ¹aÅÈጥÒoœ#lÎô‹#M8æåeÇq×"r.}tE¬ËJ}A[¼†1/ä«§0/'@MúÈJ¼æa]&M€´ÅEz‡/Pe þKt¥5<”|ÜΚ.†“ÊÅÚe§S5 L(ò˜¸Ù™'²”UnÂ1/:(ã8Žã¸/"Ÿ©1°­`j¥âATŽ€:"AÇ#[¼Æ¦û®ÇkÖaýi&—_4OóYú%D0ƒhšÕ!xü”R“?Äú&P¤þŠul—kNnÜv"¨)k»Ö9UÍH9õ¯òï8ŽãxŒä¼^À¥¡’>BÈ¢‰M÷]O±þ'"ºå_ ÇP}&ÛÕ#Ö¶ˆµ¼<.²¸ŽêXÓ7¸¨‡6hâªlt0«€¹øÏãæo»îÔÇqǵÈÓåˆXmVì‚öÁF"AÈ2€ª;BëñšÏ›ZÉ»ODz=2&uÐŽt=YP%B‚]]:OO­«"Dì3®)5ÄqÇñ|ü¬ÒÏ”ѹ¾Â5KcžPÓ×ôÝȪů€½  ÄÅ÷CY…à"7vBØà‰XµGDå‹]Œxu©!Žã8Žû"¦HžÁ)ÁÒ¯lý"àì…@!Ì»pAúÈK!R4C.Ú†6±DWDà-½ȬßNä K]HÏÎÈÕ¦†8Žã8î‹àÊœšËhç™Z°ÆÜàb H®>T| ¶¼^}®Ä Aj¾jR!BË/Yê— Óèׄm,FDG/0ùv…©!Žã8Žû"&Ö^î ´Š„SYÏÒ"o´(ËfÕë®3^ƒíU!8 6Y ’êLPÂ4–¾ÂÀ"©…†ëN qÇq\‹06Vƒ².Jä’ı]ĺ¼ ,åˆÝÓ¯‰Åk®CŽ´&Bžµ{Ú²9úq Ó”ñDÛæ/%6SäjSCÇqÑXKŠyr«ÍõU9ÂzeÍ» &„¾Cëu»ëIA(XPÆ”#V –E…D`†Žáaä„%׸ʿã8ŽãuW€kŸeеhîˆ%uP"@sHTµ,žóÊÒGr³Õ´VK0uA:I×ΕY¸Ñ^ŠØQ¼Ú Œã8Žã1š-T‚õbå³.§Çº'¬‘H@Ì@Ù/éÊbÜ,}º+ˆ×˜¡„æ¦èQ¿yRi"o ás_§6„ÀW­BÇq×"€Ø(’Œœ°I üTEbr¤îéì@BëËé1»PÆ#,k³ÂË•#–o› ÆÓôGŠ„°ãËq$ÌЫønLW©Bþò¯þÇq×"@òJumŒÌ&IÐúÂõ†\RrFŽte-½z¶®g»‡µé¾_UŽ˜9uJêÆ¡tð¤ÑS[á嬢L®Ùùÿé?CÄqÇq-¹˜š"9Ì¥4L©Xûikéµé#&G,‰Ää&U„¬KT‚¬L÷ý:Ù¬˜[ªŒÇ_KÚŒFBÙlÙ»࣡h_'O WÈ¿ý7ÿúÿü¯ÿ¡]ÇqǵÈÔY­ {•ž´CÚðÍ£0ÚÄ´¥îÈ‘©'mÙ>üEU‹GBmµ3$nP™9[¬,õ;ý'À¹ ›®a¸vÇq×"!€0 A3ù¶ Ü´3huäZ‰<Ö2A49"`Á “_Î}D[}å¥T)_cÕ"dΛÑvûW`„7C¨ßÿœ·*ª#¯ÇqǵÈ4i%P©Š„ÈÜ)Šä¼Mòô÷¼T¬SäH¬A A°W³rZŽÀsÇkؾ• ¥”ˆˆ…c’ KÁ„vKmuë‰:AɧLã¼Çq×"ã ë€Ô{Ày•L›PÕÐæ·>]”4‰#é—käPŽ{KWÝ"0•+ |áx kK}C~o!ÔüVAh©_¾*Âo&– ^‰)â8Žã¸Ù1ô Ì@¦H±´@E€¶­MÒ¦¸>DÙƒ º;û Ýr©9)uI{±'ê¦/ G¸Ú6›†z„)À@&K\} rfåŠAÀìŽpší~=¦ˆã8ŽãZDßÜ=CDZ5E"0v$gŒ6íœÈc•ÇIylÄšiAfÉPî[kr„òg>£±ØÈ¦‡í6y!‘1ÀÝx^mŸ´„aÚKõ³`ˆýæ^Žã8Žk‘;Ý´˜i0D·ÚÁãÀM“ßÚä½^ðΗsÖˆEjDR×ć6v9¢**¦¬.í›O– Øl C`Ýv#0gµf_ÈE_‚A”v'=PROf °ÃëÁqÇq_d¯BdØz$YŽHQ$(@Y‘€Ž†…MbÕQÀÚ¦I‹\RÍdˆ~QY`$=öTÓMde®oÛ_Åô=¼’Òg#d‚›ŒcÖ(&D”OÌ¥!½,4jIÀä‹j‘kÆqÇqúVLú ÝúØ2CWWT¡.õ‘»b,m’Ô¶¢$!O1H³FЉդQ²™'C¨Á„ÂÀË3Bz‚w[x»Mv"ýw{ØïmR±Ø©Ö>È*¹K)ôBdŠn<ï¾&SÄqÇq-Ò*ΊDû°‰mÎ#Ñ×<õMR^Å¥mE‰Éc¹+M%±üY©¬$&Gy¬iK¬/í[.Û¾}—T°À`·O*dÜ«L¡EÚ.Õ?á2HÛP—”éz:¾‰ÔïEµÈ«ÃqÇq-b°nÙ#éµÓi§ÏI®ªŠ¤#ÀšßÉ6Éü~FíHÙ-á•uÄ~Ÿ­¬ˆ&¹#Aê²y]ýD©£Ä‚5ë¡“Açż{“6$ ã÷#Üi^H-úa¬"ÔÁÇ,þ&Ö»ÒRºµ7da†W‹ã8ŽãZ¤ÚìÕéJà¦DmhAhò[-›Ä‚)Úê&¢X‘&òØY6¶Š ’kT—p]Èg׃5¢[fCiÛv°`³ê!0ì'¸ßÃíîM…˜±VÁÚÊšÜÁz|dØ3!Ç.[_°)âü—ÿúßàªpçýû÷/sm,×"†è¶ƒ2­£¯ ÕüÖŽRŸz@íkȦf“ ™(QjG›41. ÖÌ‘š Gjq0! .7'Ôk¸Ù¼éáMBGÐo Ô«˜àVUÈ®Fd€LFœpDU ߆“XÞ+ƒÑ^>20³ŽÁ8¿ÿýïáJpçw¿ý5¼l\‹Rc#Uƒdʺ„µ4Ö ù­€U”¨¨¢Á5ÎB°áR&wD´_R>u< —x ‰ý]̓y×ÁÛ> ‘MW%4$!"XTÈÇ{¸Û›¢X¦*·BdÝʱÔ=› QôždGŒ*®£¾™ó›ßü¾Žã ¸ƒGóïþý€«ÁµH3›#`Q$–JB 6 ›MBêO`WTB±x$&#T·ldÅ2±X‚HUBPt k_74uð§=l‡"A‚”ÒòÛmºpÒ4Ýw)"#¦B ËÓ-Bd9ayÍaU!Ó¬BLÔÌM® R%±¬˜"Žã8Î_þÕ_Ã#øá‡àŠp-²n“èF&J ßi6I*JjŠkÑ&£ù €MÈf5§UäTõ¨Ÿ"b«ÛlzøFõG×a:" A͛ͻôlÃOwI…Üî‹ AjóL T“`´Y‡$«(uä Z«ÄŠ$ âÀ°†ã8Žó*ó?\‹¬Û$;•#›þèÕ#!>œý«}Ó"T´6ÆÂÊœ_±VôG`‰ÔË zÔDº¾¸&ÚæÙ³Ûtjâ$Aþxk*„h¹p®=ŒÙ!ÔH ³L9(So~+gß±˜^@Ñwç_üËõ¿ÿç‡gÁqǵCžj“ TÛ®æ·bìS Œ%6l‹¶¨.QªYRÀóñ)BD©}±Õjº–BÉö†ž2!"@è`÷ðáf 5¬Ófx,3U -èsV9ÕS¯!ZµO¬Å¢ó(Ë»‰àÿ³w6KNÃ0—ítáa8°7ŠG#ŠÛràA¶Ð6[[4’UeW6ëÂÐŒþãÉ(®š“£g«;ˆh™_FÜÞÞ²qwwWm9=:[e'í•õ‚W-—Ëå,¢ åDJdo™ëH(wîf ŠKPŠK0(j A9 RHHÄn´ÍIa¯B>7PüØÂ·5Ü÷5–'²$â¢ñ4þ…¤4¤ ™!©)!jËOñ0ÃI¹aA¦AäÄÅ"—Ëå,bƒ#MD2(k}«¤ldD†’ ) ‹DˆlÐC„qhD¿o„u`¨ûÓòA>ÖäKz a»ƒõz¨QÝÓN/ôB5òœ:¯O!Òù &Ê< aÿR™Ëè.Ko嵑Æå±ÇDZ¿=m¼‘ñ1ÕÆ(§""êóär¹´Mæš›x}ßÕˉ†IÒJ¢¤oRŒ€ƒQj°®úÀÊrÀˆà`±¹DŽ‹3í×öÐÃÏ5l·Ü<¨¨a%Õ!tT.±[–шtÞ#ì怈ú„8~k\"‰0RLÁD@Åúœþû´ç|Ÿv)ˆÌ” ·¸\.‹„#× "^»ZZ³6 %{ “$€¹}Ç3…~âOËww! —˜Ò‘ɧ£‘hÖV“Ôˆˆ€HGm2°ùýF_(Óå¨8bÊT;ÅŽáT+UåȰ’ l2ì¥@u®Šcçÿ!û3ƒf\.Ç‘«g[G¡E(cOkl'É‘'n$éDr7µpD*F©·[I"&Œ«FÔÖ¼ 2M@ÞÃîvš˜ 7©WeÃPH¡GŠòê)( ³kÈ&kRf.‚XD¡Þ`FPÄÕ4ÍÌÑž¯ùkr¹G®DœElʆ­&"a=p÷¯·  DšOX;Å?nVЭjS ÓPcZiø'LP2ôë!/ƒXë0µA&<±R…?B‘ZÂõÖÕí mQÈìê“B„’¡]ÞÛž¯1§Íy™ù8Ânj,F.—oôî,òÏc$)ÉÂIž)!¬ nIs1š‚a©‰ü«˜r†ýöüʳÔÁ'£ÑÝ3ju‡Cª 24‚Ø}M‘6œØŽ cÔÂ!D@õ^|C¯VØ+ëoÿ>Ö´§½—õi¯ç°3S8"þ:oüö/öîeËqZ‹ã°$» ºáQ0ä¡0dÖ‹C<Œ€µàIÎêæt%Þi[*9Q¹[çV¿¯ÕŠí¤’Ô¨þkëbw×E–§µJdœSâÝ×]Úõíƒ{èjD-lï>¦[{°æ—ˆ¸Õ7¬œJ.fHŽ)Ö¢nÊ[ë½S{}_vV:ßDû¶ï×±OÂ1ù£%e¬Ï¿Î+O±‹í•CO—ßö°ÏZŽ&mDP7·R¦=^¼BÀ¾«'K$R×|Ñ»¯¬=vv³ßIÉüötzl½¨ÕBV±å…¾™ÚiýÚùÅfòö>‡‹4¥:ÒM«8¥|ò¯¤¶\:4IÔwkGC;SÕ™w3€,röD"ö?Øj‘7{Û»7}ª‚ô>/ZWGO*mÎÊVõàVëT ‰º\i 0ªÎÔ…¸âZìðugÕf¯3‹)ÿÜûçA™ùß. ‡Æˆà2îÊ{ÚÌ}ÀMïÈ"•”‡ðÉDRöÛ°4–?¾ìÝcÙ}5ä‘”šBjï··[µãAž†T‘uýùô÷œ†’rÏš±óc_O_j$Õý/~œÚ³møh‰;–ý&Àþf÷,Ò<œ 5äRñãqlÁ–¨”õ©ß¾ /²Q K!«Á}\§ ¢âºò#~ò&a¦L>LOÇJL™Òו™ªRÚàÜMSCžìjCN®~ŠÜpaÆþGw^X2C©¤>䘜Bú: 3>/Zrƒ(¦A¤Òz’¦òaíV’ç|ôe%Ž·c¿¹)YWrÉtE®¸<¡d(›°­œ‘xš y`¹G90ìnÞ½{ç. È"Ûä!Ø©O-SëʲØ`½×¢j‡e½ŒÚ­nŸK!¶süc^ˆ› .“rúTGsb+t{ÂJd/Q¨UÄÙL”ËÖ&ÄÝüó×ïîB€,b™Ãú.¸¾Ës/ÔÂÁ'‚,ÐÚ•t(ÎâÖ"’rAõT' ìý¼Îk)·vÞ ÕØ.:mÔÛ¯þªÈ"a׿íÁHð®ëRïƒ÷ókQµ9Ör¢º=GUDEd¶6ޝx×IÜå©{ÝdYH*!õ‘uÞ—›û{m7goÍå;u¹.Qþ¹àŽÜ”·æü$ˆHt ##4²ÈnÄGÁ=ÓÜÍhª ís¢šúdcÉñq¤¾Çt±°uNKè¹JEBù|l.ÄÌÒ¯èìÓV‰œÖZÈ\”8¾(â'—,]bjè÷Š .ø0Y«Öfi{\I³yªˆºAs‘…ÊÆq꺙H%rÁ úÅâƒÍÅÎ.Vú©ü!î“tsDFRÛc|D¬úxé©! Ÿ‹ ® Ä8çë®êzô*}®ƒØ‘”8`Ýg%Îçs*µ ä®d‘ÐçýÈÊ”ÎBæ‚|zÖˆªÛ°œBN^ñöB Uª"×™B PyÈû¤ëžUÝå’ªõ60RÈ4NŸH|½¡^õ2£ñ'Þ˜«FÔDL!LhõÖjæÀðúÒ¹Nw-«)äŒÂ¦È":?±Aucªˆê9RHx±¢©‰» Eäð{£èön"b)DÏR íyþÜÛu]zN§gm 9c >õr£ƒ2EtŸ0¢Í±hlg Óo_Àݨ‹èÒ3m-ä)ÄÇæëÄ”»YD.ÏŽÈœPFo·ú#ÈÅGdÚrˆ{=)æ®¶)Äús ÓâÜàîdµþjRH=çÔúÛú«‘ie±vûÀìÖ¡@QÁr†°„)DÁÀ²;UûoŠw\$Üä@W®‹ »qHìû—:DÐç p›ÚJòŽL×þ³w÷ºMQ€ÊÛ wI»o—2EÃ…Kw´Ð„߇H–F‚¸£Ì¿OVd¯§˜›q2'w×Î]<ÐárŒ©²€,È"² ‹È"€, ‹²€,È"wïfÀnÿp ež¿~^¬"ôE}´ 4~’,°ûx¿L-Û¶=?=.\Ý'k7*Õ]•EÎß¾,PÅáxR]ªSݔ׋®]EY@øàýœÖK½&¿nlTí6ãÌã—xmÒJÛ-JX¤´õR<¼ÝÏ„ï?W{ØžòM.Y1Ì7œQ³ Wß¶«zdGúï%m2¿Ì!§Ú´ûmLnðq|è]¼UšÅ¶§òáÈA$§š5ÕÍ&'ŸU/žE)$f§äòuŠ?j3y¼Ü¢Š¢¯0N")6§X©Ù[_9ÕòÕ˜…;ÊÉgÕ‹gÀ©‡WÛ³t×_ÝœŠ1…h¨ŒQ檧?ræK^¬švgés4õ©‡ºµP$€!ëýom¤áMÔݹîµW×;õb­ÿž^€vªâåö¿#N9“üÓ³œmy\ì6¹.¯ïæÕÖØœŠ‹=c“hGÚý»#9Õ¬·Í6Eë¼­£2QÉÄüWK+>¬¥ÿ"Ê"@ÿw‡æÁ<’÷;(¦T««î¯^Ž,-ç°1K»fùòá?wåñê‹®l}›-kd^GYpUÖÈ"æ`×®þ7€,ø4‡ãIu}¨Nu²À¶mªëFuª“EžŸU7ýƒµëLu²»–Hn®]Ðà<ð§“¾ ‹È"€, ‹²€,È"€Ï:ûÁÀ0 šõ8Ÿ‹^PÝÀ·Ç40À&mþUTð´õ;–Áb„Áš7IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-demo-diagram.png0000644000175000017500000000273110536106572025255 0ustar gregoagregoa‰PNG  IHDRŠ@ßcÓQ PLTEêêêÿÿÿßßßÙ¤ˆIDATx^ìÔ=Š1 †áÔ |Á¶_ýµ¹Š`вC`IŠ€Ì[¨ôƒ0òíˆwg_g\†'3ÄÎÖàšeÆZ†Ýq‡Plè'ŒÆ[ÃéÆ)1mH¯2’ šE¸@D¼©¹¨šÑ½êΉe§!ªæÀ2¤Æ(A±Œ–~2Ë :pîËPlCµÜ°}V†Ÿ}½Ì²Œd#ÉùgìwutR`Œ…FË'v#_mþ32Ù·—Ç( Ào=ô«x“M'“~ŠCmRèfSB‹zUFÞkH[g8hÕÌ^M`6bÀ‰¦¢R,§;º”•:U“6õC#}”%Kö_-˜ŒÖÃ+n³µù奱ia&²¤2îpÎ`’02£™7"c³d”cC ³È³gQ6ç 6aÔy‘’/7°O_ͨë?²üC}ÈTñ%?îëƒ:¨ã‡¢˜5Þ.÷ÓÆÓ>Ë:J=©}^tó< 4ô±Û¦Ê̦3¥TnVTgyM7ŽÌ‡nÓ‡ÎÐÆ8ÐÃ8²ZuK³òäÃØ£îŒöG¡²Y£YoÌqÕ¿WÙé¸Ú«#™1DM|2ˆ ÀȾLî†=¤F4*ºÝx5@ r`×`$(ôghÝ•Ç}Þë02$­SÆ}ÀØ‘’õ†n” cà\²)œ¯vŒmcâÜ^0vŒmcs2öúâ׿uÆx& žÿyµ±s7ÞÚŒïF—2€± `l›õÆúßÎec·ÚXßel {'³Yo¬ï–Ž«õÙΆ½ëûn½±¾³¬GÓØ¯ ó·l˜èÙœ»×bl€8¯7vÃÞ!ßæK³Œc<4•[5eTŒ=‚ø@cdõ¤ÁS RÅÄ>ï ÉŒ|d£%4TöûÈ Gvœ4RR#oGjöHj¨Áx}ˆ =epZc?e°†ÔÈ~&´Æû+38˜ˆáâq^p`d†6{&ÎK|MJ–òF`ËšVtë`àgà?¡ 3°ªn.}³RA»E<tô›¯zƒç/¡!OkŸ’ÔÀ“Á=Ž£öGÚÃþ 5Òêt\=¦B2fŽ+‰ŸI  øèÂú'½ŒÖàS´ºþs{4¢h8ô»ëŒuùúÆo[ÿÆÝ§ë0nÊWlXª% ãn¶%0lï=™ñæÂÈŒÆR…S8o¼#260Ÿ‰Œ7  mèËóoã[XHùÌÀqa5Nÿ<»Va!ïÖшF4¢ÁÍ4z68T¡þk|é×è¿™|OmhxÙwGâ}/ ݇ÔàÀÀï8˜1,ûƒÐ°W²=¢/7 =öχ`çu®ç» !Rd¼ñlTÈîÏmg 2ÎГ!À«Î`àÏÆÁ½UoFÒ¤½¡¯×Zô=dž¼‚ï>ä¿Õ¢aï^…aïdÜ {·änØ;2wÃÞõ9öÎÒݰw¯î†½C&1ì¡7¢ ÷~×מ:шF4¢ }y^óõ<шF4¢hDÃeÒ’9H{Gf7@¸w}ö9H×ÎÒ>™ s÷jŸƒ®²}„§.\Àh¾u…ëÜ„}R¢cúŸ+†¼Îÿ³ŒF4¢ ¡Ù‚nÍ ½Èƒk1$´1ÄýçµwÇ4€PÅ„,°àIø H` †žî·¼ãÏþßý¬‰Ä`0 ƒÁxÒ o×WV5$4úÐ÷ÖIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-05.png0000644000175000017500000004454010536106572024563 0ustar gregoagregoa‰PNG  IHDRâ<;µY7I'IDATx^ìÅ¡@QîŒ+ˆF1†ð_y:]ò €GÚµìÄ)E1ú äûçhxóHû /•öaïþBã(â8€s›¶æo“z—hicþ5¶µE¥ÒÆP¡¨y°¨ ((>R¾øÒ‡¾Ä—V…>U+´XŒ`±}©ZmQ4&iA­¥žñÚÛ?ir뤳—Û;g{M 6ßO&³¿°Ë,K–ßÍÍîZ¸jè‡ÓXLˆˆˆˆ%"""" 9º}×MD ®Î.ƒÕœH›K™³ÞQ°ÌûK°yh¡vsÏ5 ÷\“ˆ=7;$ÔóPû|÷ܰ4‰~ÖLgG ‘zžÓT|Çæžk>öp{ôžkÅÏÂBôÜ|Dæ³cì¹ùÊÐóP;¯¼ðjÀ«AÉ6.)˜¦žîÚƒhîÅ """² æ(Ã(ˆÒµ’`)ë–HL$èÆXwkûçgG1Ñ[jYOOÏs¯ Ó”,|ˆR":ÐDIÎðÒ̯ """¢è÷è|8p…¨"­‘º••¯<¾uÿËìëÛÙ»mæÍ-­Muñò² ~6yÁ!"""²PXe1õêSÛ×nhLÚS£CÉs—'=oÂs\_M‰åeb¢ü*à_é³o!GeÛ Ù€ˆˆˆhý¦{è‡Êo‰>š"ê™îÎÄÍö¤$'ñ=Ïs]×ÑÅql×¹d'/%ÌUѺ;› \>ó&ˆˆˆˆ€ÙtD§&ÆÅ<𢤬å–UˆÅÆ+~Ư(·ÚÚê®LLxÙŸéâ'3ã&—FßPÕþ"€ÔˆŽQÝÑ—9€5/áFGDDÄLEg'ºÌ®–üx7©¨\þþ¯Î±¡‹'‡Ç~sþZ¾,U~Sº²Ú«­Í$⪱qåíMðסf]Ÿ.þþy?þ¿ˆ|ñz1S ‚’ç¦,¸wìÂG¿9ã¶ë8ºØ¶ãÚi[Ƕ=]ONúwuî@ ˜¡²´æ¦ n,þBQÞ—>¥¦ˆX©”w*^¿suóÖ–ŽûÖmܹyKo׶ǶïxòþŸ}h×ó»Ùý°@…ç¦`‰#Ê€øi’ˆ›þcm0OÅDiµFϧº§ÒUÃç¾ýä›/~ñYÿÉOß9>pðã#Žô¿ÞhßÛ_}ðSÁÍ—úZ"ÅËœûOÄ;}"f*V±Ñ”£§þ¬­^qG{ÂÅÔ‰ï~I;¶3Íu\×sÝ[Ú· @ÁLE§)ºè@OžÕ³huÁFDDÄù³Æ–èwúÄàãЉó½wׯo®_»¦î½Á3¿; ¨._UÛÐДh¢Â_÷„ç¦èL%ï•Kúf‘9·ùˆˆˆˆ¢M¡…¾;}_'E°¦eu³ø "€¨™šˆˆˆÈü|³è£)–ïcö çñ¢DT6ty›àü¦ÜÛÝÚŽ0 @Á×#é7ÏsšÂ䃈ÈüPd1õgÌG\°8ýÃÞ½ä´a.¤HlÇÞ+d% ȳ⪮S gÉÊí$÷|²"Ë[ØGÕy\å³)o¯/öèn~xdŠëÙn˜¦É‹dÑtò\\Þôùñ¾É” Ó¢éË3BÞd¥)’y(RòÈ–Ö Ë€hЦLKiqE“•1™ YKyH²•7-ž²2*S<­J¢¨¥¬ ÍÀ¬ó&´2&S2m‰LYÙ4ʘLÌc»¬£J–´2.S«<’•";yÖ‘‡ÎÌólfÇãñŽ®¶ë—ýÀï@52‘lw£œ;\ëy󄢪ý›î™=Ù~ÀŶ´¿QÊáò»?BX\›®½Õ“îjÀ7{çóÚDÅñîfwÒtÓÑš”V´©Fñ$FA*èÁƒ W¡þú/xðgûOŠ‚@AEÑ…œä/}ðÇÚ[~ <´‡wÚGÊ…ùÈ –Ð#ˆ‹ˆãr¢4Áˆ C W–ã\¶ÆEâ^‚á]Ï9gb ‚ è ÇvÛä(Ю‚âÖ:šE¿ù]ؽu·êQÐ8âÃpÁ9Çd z‚ ˆåµÒÂÇÙÏKï¿|ýdW+»z³GNOŽŸKŸ*?«i:ç ÇÝñÊ1þ¹”`5W2b£‚U=ÁÚ‡ùíˆè'÷úz‚ èœMwãùËGóo_”µŸã¹ÃÙ|îüôÈÀ æõ×ôjÃlÓ®þX_]Z,½þðìá“r!wùÚ¥Û©}iávE•¦ˆKh± Â|:‡V·GÁêzˆè'‹Wz¿`œ ¢âüNPfçOŒæ§.\9x(k13µxÌô{™ág¦íÙþµãšÃ‰c™ÌXÞ.–7¾¯”ÞÝ}p³™¬ì,FiËvk}! Gýà+ö0UçšGÁQN&Ž ¸ºçÈW*j{‚ èˆçÞý[ ‹sÅ«3ç¦oL=‘Ù?JÄ“ñ¸ÿa±„ÿIšÃLgëO&˜e±!Ë=ÊŸ)^¼~gÝýæ'+¯Þæ·¯^âó,ÈóKucŒÝtÓMhéÑ'ï>²ãæ­_ì_ýÁUÅåJÄa ¢ ¡j¼“,YŽRÔ8o}j¨bD%Ñ“FºDŽLŽþC.Å7ïy(_(¢Ê{4¬ùÚ`½ƒz§ŽÞzÔ¨uÞæì±×<9ôû_|Q¡¶¨6(ð¯‘1ÆØSÏÿd&£¬ë»ª”ˆc™‹T" …BU BçM ¦Û0PÆYAJ€`]§"•Âó@—QѦ;¾üì~~ï·ïýx_Í(ï"O„·QüÓÖïPo^‰ÈF.ùYË_ã¢Æ˜ÄÏÓŒñZÏö=CëoûÒêîUYF™Yë‰TJAM¦c]ùUµ¤¢PÔ:”))L¤ÞQ7äy_˜ÀÚ[>™ÕTžxú†ÕŸw—Q<y¢jëáý¥ïMabžÉƒ-¡Ç˜¸Âæaï™Íö£ômúLÇòRaY„rª-D$)ŠT|¬üô±2®íº»vwÈfp”†$á­F¬l¨lYiŠcz ½¾uxÇo{_]ÛÆ»=¤u~™Ü9÷ÎyGÈxÖ$?ÆcŒ=úä}¥Á›{WöwJq Ä2'HVÃJ©<€ƒv¿:òð¿&÷H¤B•”Tý+Œ’!ª$òdR’"„T}nÿÝŸ<76Bò¸Dä½q^[Ÿ¤¤ YÛ¸¸³b cŒ1ÆË=éèÊ5ƒÝ9T) ¯R$nêÄäñWO ½6òØ„=‡&ÖCú€D„ÕŽ )µuúŸ{é‘KYîñ–|j(Õ^[ïš.Y1…1ÆcÙrOþ†-Ë %40ŽÐäã}_Ï©Ügw>søþ¿}UD²nÐHI‰X>píðçÇÇGpqŽªµCÆ4N–ZLaŒ1Ƹ”‚(×Vê(–Q*h‹GÖ9@[ÓvÞÒû…ë»?7žŽ¿rò‰§þùý3ɉÆjJ#K„:²–œTQVPÙ¾ëgDM¬óÉLídöèŽ)Œ1ÆÛ¾ëW¥µ×u抨ª˜Jê¬uN;cœà¼Õ¾\Ñ@ ¢®°o°sãW}«;7pd|ï¶ß{ýô%‹K¦)@d5€|ÏÀ_ö é4A÷^[J´·nºª¥ScŒ1vîÂÉã#s+ÖD%gjñ¢\1õBÈ”ÕÆ9ç­¶£Úxù°Ô®\|bàk·õÀöã¿ùå¾ïÝkigêuK5Y?!_Ñ©ŒóñÊ5{<'Å›%5ž—ƒÂ¢ÅcŒ±ƒGwg¡! MnÊ%ÎÈPJCÆ’1”àMÑU_AUF6?Ø­*ög›jwŸúó¶CÜйõúžÏJDõšŠv³‰Ç Œ‘q>ßÑ}òÔþDž<à1Ž)Œ1Æ˾p'(uʜՔˆ(HS[Š%“£¤AMb4P" BH‰|VVéïØðìá‡_y~ßÙáͽ÷¬, X"C€õš¼±ÎÆ$dB MGϾC½“9pLá7»3ÆcþÌèñ|{»W„ªI[‘6ŒU˜X£¤IL‚ˆŠIÐ@@ÄA!”qdóë»òYYeçá§_ú϶_ï»ïCËnݼö.GajuH­ÑÆzeÃ|attDx\y1¥é[dêûô>¬ÔO{ÿó cŒ1& þýßýbõí@ÅUI£ÀLåT­d€íLÙa.R…pYH±Bôék¾º¾wÓ¶¿ÿød²óñÝ{7ôÝÕÓ¾–¼Ñdµ³¨2Έr…3#G»{<ÄWM¹|˜ë“g3/¢—»/H®bŒ1ÆtR) ™’Dy™›²6"›X­¤œ²o•ê ."”ñ²¨;²ùuùolùá3û:|ê…‡Y·ücëz¶Zr´±eª@ÆAˆ(W6ç»±V~ÁcÊ<Š -Š.­K&­Ïl¾Qó9­/Ðz¤ÅäÍë#ÙÇ—\¦(ÃcŒYO@ú„¤\ @Gr ,™¼*œ<— „.Ây«iªl/ì<öD–Q’Ä÷µoî_±E“µÎšÎ(bGVÞ —SSžhqh“ÌçF—4Rsé¶Nl—¯þÄcŒ9rgŠ©O E*6m8ês**whBÞ%¶\¡±ýç_~jÿƒ'Ï¶ëæ¾» ñ*M61Z;kÒ kMP”x?¨…Ú>’Í0¿3ëE‹·¥ùßhþO¾ðcŒ1ã RÒÕ¾PѨË)rÞ á&Ó`²¹šb(-›ÑóééíGÛuì™$ñÈmÊzÌf²ÚXkMªµR!j¼‡Àe¤dûHS˜癭Ïi}è½yòÅcŒ­éÿ>2Ã&¹ùòßsÎuADD4?÷á¾ñbT˜jê<§“Ä~ÆqM©Ä*IžíÊ“QËñÒZ¥Ò”‹§+/œ8ÿS³D¹gîá\PŠT²!PÌç´š ¨‹Q«ºï–;-ÜÏM¼¤t³×Ï›¾2üOÿ¶òÃ?ÍLsúö­ýS\'DDD{wüí+Ï_Ù¡#xVb‡Nì§©âXÆj¬´Bá"ÕŠ—®„~þúsg+'kµ$½g×¶{%a@?Pú’~Z«Ý2bXúüîÃRA>…vDDD´{ûHµZªá£èÆ‘kÛ€ÄÚ…] @êèÕÊ ¿8óì;ÕªJföNÉfòn+6J,e¢UØjšFéDaÍp+oï>rØи®˜)×+7>""Ò€ƒîÚsä¥Ê‘ùn­{b)‘HåXbm¬ÿû7þQùËåË(ŒÞ½kîî~š5›h•FOm©– Vø##n³:66õ¡òv­ÿ˜)DDDúè¡ûŸxù{¿LnU’ȇ]gÉŽrýËiû±‚¿?{ªÓœÚ;ó€›Éš(16Ô ©$€¥ú¢i”8éºN œåÑ‹çú ·)ÿ Çg>~ûç.hÎB[‘ÈãJÆj¬HHf‰²íæý°„)’¾ ubÞ˜6Js¹a@n,J:Q6Èݱÿ“芙BDDÄ… ¦ªh¸:_?îd±ž…B±x_!ÈH%!N[ئK*±’­åúÚFÉæ/ãùüŸÛé*e ÷ø0Sˆˆˆ¸Pyð¾'~ýæñö-4`ÞÑá„V£±ô°ª\þˆ+lS!׿zñj²Ô—jÝvÛŠã-kÔǦƽ…wo.¼}ßC芙BDDDG?õæÛ{ãÒõÜb\Ÿp&¡ªM¥Fµ %¼kW«l.–Rª¸~åŠY¢˜@ÑÀÔœÔ/z•âgŸüް,fÊ‘8öø3ßúÁ£KW/`|ÍÅØV^E¦Wô“eTqØjuÛm-®°½º –¦§ ¼–{ê±eüœÔÚb¦l eÝü?÷ýïþø Ñ|Íè.½XÐï“,tF€½ ±ÀvÚÓ³#½ÃÉÑO=øµòô­,l3…ˆˆˆ´ÆMåÝß>öüåÒâ[Á¾e+±Õàat2X%£V+æìs*ÏeŠ“câÝŒ><þ™§wÌÝ…÷‚™BDDDcå/þ¹ŸüêëçNþ)s0È !/w#ªaE¤4Vue$ôÉĶ9âgfŠ“¾—½zºY–Ûùô7§gnÕ¤L!"â#T% BX>Þ3"­û‘ÉdŽ=òô+§OüìÄ3^)›ß¿§<¶ãnµëq50ÒÕßÃ*+™/%…Ñ  ]hÔ^¯¥w}ôŽG³AÆ SˆˆÈ‚aðq=ÅL¥µ’2QJI}Û®û¿:yÏ‹§ž}õ¥ß„¥l07^*͕гÕ±^Î+hV—»¯Õ› oí»í<öd©4 IKضp3…ˆˆˆ´ÖRªDª8Ž¥”Q˜DQvBíåfÆfî,:WýÝÅóg.¼üW/?áÏX=†õªõ…æBµ˜Ûv`ǽ;÷ÊøùîbXi-Ø#ÂY×s…-,Û¶cÛ–%m 3eSDDD¤µ¥”VZc ×sã(N p¸~ñ€4í—ªgjáÙ¤-°ÞÔìüÄžÙ´N°Âõ]sðE´C…™BDDD–×u\@º®R2Z*­•ÔZKPAÆŽ$–˜ÜVPRa a –í+ÓlM°ÂìN, ²L™_C0SˆˆˆHë^@@˜-‡£‘A°zå ôú+m¯¥†)¥¯Æí¿ÅÌÿ7÷!"""ÚR@hè7þo0SˆˆˆHß ÁÁL!"""÷%f W)Ì"""â*…™BDDD7Â…™BDDDìçßìÕ¡@ÄÀ/ï%‚FÓ!C ÌUwdà-#I’NÅ:ã÷(vëЂ‚½¾ÊŠîƒC°&Q7½›’dý0]·{wbU`ø;ûœñÂÆrH-õ"3,µÉbæLŠ˜ôc–ÍŒý@bF1ˆaA!ˆz^D4Pá]hDj6ýx*Œ9ƒåô#JiLÆ0ÒŒ`Èè83-8²D¿í:g³çœÙ³y‡µ¾³örƒ0ûã[kïR?Ä`o i M MHI|»?ýJ" `ï2vÜÁ“’X2™ŒD`ksÓÈTSæÜY+"¿··ÊH¶lÙ"Q8'N^! ‡ýž£˜Å|ríáÊ{T;Î@ª„CBpjθ^€EÕWåÛõæ[QãÌé8=F ðºó¡! àN»Ø¶oÄqTÞÉs:è}K¥ø?JˆaÍ›7/×8tèP®m»ö×+‚9zpü7$ëÕœðeͰ`ŽØn.’kÛˆ¦Ç¦¸k6aòžÞvßB—‰Ø_¯èêŒÉ­Tl%Fg<ºZcãz¤ Uȵ$Eu=‹ ¸—ùl×.ä;;Ñ‹;îÁ¾õÛµ Ÿ‘N€TxÛÍEl7X¢ #ÁÇÛ´3Q¢‹‚J ;Þõlœ®pØFàJHSô@GôÎqWìóvõTÎDÁè^æ3#‡y«Jø¢Ø›¢/3îìTÂ'7%]ËÓk=:]@šb ¤,z±/üOø¢çÔ#Ý ó‡~vUÚ¾œ0fÀ’3™L4ßé(Kœ³Iˆïð””؆Õb€ç¦€ M¶67‰œ“Qr¯ëKa€Í›7›ÅÅž•ÄPMÉd2RP±ˆ¤˜ï }òÞ%cUOHS®ëý}¢·óxOWçéŠqIq€;}®+OîþèhûÏÝ6ây‰ÚS–?QÙýïùO+/‚'¼ÒQÞjjËå(ÖààÐ?œl~óà¤ëLjŸy—+öËiÕ¿àÀÃl;  š²óƒÃ½=}âçd白»ÿX°xZ€Ïê1¥þ"Qƒ€4åBßù£GzZü³déÍÿõ }ñ›Ø7ºéŸlDuý—olCO¨#úX=^Ÿé:)Q*iÊŽ/§‰ÈäêJqÚ¶WŒ§—v¸“÷^¸èdBµ]ôxQóç?Ü}J*¤)---õõõîo“yØßaö ˆÓ£ 3fÝqð/ŽèLEŠoä7 @šb²|ß¹jÊ´ÉÕâvð¤ùØjJXzE3t>a¾C–1•)=¨¦ˆ“ÉÊÀ…AQÆ^S¶bÕm}ýþ…GP/åøHÜÇŽŸÀšÙ}ˆmG×€HRŠ ¯xÕËS¶~SÍ”©åºŽbâ}ý ‰·„ÄNRŠ/L5E f–uV6V­^[õÐ#Óç/œº¬þ–µ/ݵü©ÛÏž/ù3ÖÜÜŘx€½)Úø åæ#ÅÀi‘ñbjJD r°7eTÜé³áÃcž—ð‰¤—Hy^ÒóRæ“4]óí%“ƒfÀ³‹J˜ª)“fNŸµ°f»§Ó÷§ï]’~ðátݲô“uµ+ÒÏ-¯]ýXzÍã5’’â™÷°7¥ûÏ¿Ž~ßöÛwm?íÏf¿Íf¾nýæ‹ì¾Ï³»>kÝÙÒöþÞ컟´mßÓæHr$=alÒXôIˆR_W'9ý"©I$EYW¹§zέ"òƶc¯ogÓšÖ??#×]õö;¬s× ‘ î÷òh€4%!~Zöí»¸îSvÕç}]ðLFbR“ô}Õ&G1ß"½&rÏÌ›Îôô4¾úñʆÌ=1à}z½~½ŸÏ3ò-5F'@¾‘¼Ïηݠ0»*-£Áá_²KÀsSú“*Îv´wÕÜØUÓP.r¤£]&TôÍ_÷Úñ®»ìd†ITRtLþñ*âh‡JPÈQFËåÿÅ—7nmn’ÒüÏÞÙ…¶U†qüy?b²f›v5Ö¶ŠsëÀ¦«v«ÙŒm‡Ê>“‰ü¸R؆‚¢^8Ü…¢²+´Œ²²V‹âGífÛ](ÑÔ/ìs™«]C“¦)‹]OrNŽÏéöXOÚ£M“¼?Ïyx ïsáŸÿ9yóßüÒçߣ$SDüŽ^g¯?Ž+Œ€æz›)ÿøg~F4zòàYZ¡Q$—ó½3Fã³Ñx¬¤h}éúÒC-ÏØ£qXu|>*•ááa(<ðmJw¿ÄÚÄÈbqe¬h]¦˜?¦‚*Ä4&ÖúF_¥FÞ~­×ÿÞëñ½tn†­ Ì0Ñ"f=xªÇ̽–lm–/øhòû/†¶Vß]QéÀææ¯?ßùêî†]ûïj·~VÙI2”¥X›Y "®Œõÿg™B–·oŠ$s]ˆ4¿|´t`l2:ôëäÍn ‡aX)6[¶FÌ%Žu„Fù$ðùž†Æ­Uu.g§\NÉ—ÂÝ·—œ8Û‚¦T«ë$á'¦X›Y "®Œõu¥²†žM‘d¦ ‘[9ŽÍ6y6iõèm¦Ìb4Óæ=¦¯’^1ò¥Öc´YG ¹œè£<^W¿£fçc›ZŒú޾¯/ &S‰O8ÝæiÊäî@0=ú4Æòmï;uEO^y¢r™#Ýîúœo¬Ø…Ö\¦è@áñVÇYÆ4‰F)cœ0Ê9§Œ3Ž`Á†)tßÎ{ sÄ/}æeþñ»‡a N[X†À| à6í4‡ˆÄ£N;¨ªóß׺¿í×äàå ƒc# 9ù‚”˜™Ÿ‚%¨­÷bûÙŸ~šÞ©ÕWÊ—þ+=Ÿ}Óõæ“pí¯Ÿ<ØöH«· M£lqc„úÈŠ’‚䜊‰œ‚5J*¸#häbRÃMÁÈ8#ŒQΧ„Rº Û·Õ4Ö×*²‚„¦¦K\ÅIYN*rJN) àD–…pSÚö¶Ãš$o `‡œcæÚìô¬4· a>u-òc0¨ª*æ„猷ý%É`ë Ü V°ŽI+•Øe !ÝVÉ¢¡¢Èªšˆ€J0 d®k³ø*(MÐDÉibìúB·Ìxÿ©À!(0£ãs3qB Ńq~5LexèPÊ95ùb*Ü‹¥³w-0M]o¼0Z -¥yˆEƒ:ñÁŒÃnNE¦cDÄ¡«ˆLEÝ¢›Ûœ Æýÿf‹fÎÍG¶Dgâf&*TÁÎA˜ 'HœSÅòZj¥On÷•³´è±÷áQ\¿Ãw¿óÝË9=çÞûëïûÎ! è±³EÛú™tÕ#¤ãlÎCà—Âw0VR±99½rnGÆ{èG뮸OÌLUñ¾wfÍ]â Àäÿ82ùÐCyµ?)Âã÷Ò 3 „[8±Däc‡~Xq…Q̺Æý•vq›«áýÂg >c ;b²z‡‰ùÝ>9;ÖÍ_µ t0ÆÇhiÓTÕ©;(;j O"“rf‰˜;ÂÜÜB~²«µ{Òø¤Ÿ>uJü‹¸Ï©³YÏjæÙKÞÙ~À¦dçþÍruÙ¢×¥ž—´G¬êöôÉsŠªŽé ]jݹlŸ@h0okš &Ë6{-×ÕÈøƒ «'JRY‘žHå‘”ŒMáÐNö ¦:½«˜-Üåj{Ë§Š ¸}ë¹ ÷i,R†ÇI[Š”¼™O˜HKòΙ|°0onjjªÍËVTX›’Ææ3 —·Yt^^¶©™eå{½šCHË¡’æeÀi,ÇÅU¬çdáŽ%ï­Œbº{åÐÑ?§*“ðN1‚ö3–ýé¸ÀVŸ¡Á‘—è @9|Xä]î\«-iŠB,äƒEo´¬+Öoû Zhh`3gØ´ïóÀ‘߀Åd¶TT^FË$ ýq>Ýœî/ÆN‘wÖÍlÊs·ºÌý›¹yd^¤ÊâóÇÄBQ¹­]²Z©ëêÛ)ñIPën×ÙA±ž‰£B5=Ñ€)ŽxMú¦Ùœ 9 ˆä±v;ƒb´+÷ñ!@$$HììüÇÓ@3§Ê¦Óo,RQ¦À((¢° ¯lï¼ÁS~¶ŒH÷ïË=TNlÏZñI/Œ’Í~ÌX¢nš¬>!Rñÿ>RnüN X"‚N\×îì2ÁrƒÃMûOù¶œ©IÌék}v’‹ÑdN˜4éå•—AÇ\À^ý_O¡…%j!_]†ï´F.ø†lä`w#Ç7¤’2nú¦c;Ûîi`†P%¸gÙjö< Í—Er.ª©µS)‹ %Ò¢Z–O1( PÜÁ¹SÐ9Ùå´µž±EË3²ûàŒ1¹ €‚Äj¡JvϳÖÂïû–ì_eÀd´þé=rHHì‘禜PmÎZ•a!„Ì;‚ÊBE È¤"d‹„u·îò[µ‡›ÄŸF*òúNÜŸìb2›‹Ë«`Ý#Ïfù‰@¬g¥‚#lá ¬.‹œ›ÇxÍ[ùð¸Ïv±`ØÝÿó;N"‡VDò…"ó!“FÏòé€[ð*²eJ ¢OFda¿oÊ#߿ݰ € ÉY»D¾2Ùå}ö·¨åªk?+£B(ÅÊRN€òY<å£{–ùÔ—*m5PæÀÏÅÌP‘´?å)Âb’XÊMÙ°2ñ—í –®^0ÊÁ¢ Ó2ÖC­»—•1Ôß}ùeþ¾È"ø@À·©CßÜá| ƒ‘F¸a…9±˜Ö”é‘^rªÖ®crüd A—û!L!´ll€Ài¹Ñ¢ÉÚphÁìIY‰cœFpã¾±=N]¸"`p¹²Ð\?ìMØÐœÒß¡ŒG} cÚ,ýƒY¸ž :îÌZLZ­¹µÎ¹§ Sjš?J“Güt6S1¨¡•Ý'ØÙ™3qú‘å)â•âoÓÞÊÊD%¯àÌôE‡o'na9ëØÏ+|GЛ×J>rpPDˆHj­ ñ÷P2‘ÙB]À÷–ø |HžÝš[¼ýäç’º¶ó~Ƈß8”=YƉìƒ"‡)ÿ°s=-mDAü=‚ ýEJ,hDoÞ $‡¢öЋEèE/Ї|‚JK¡äxôX\”¢G{RˆˆˆÈzÈA"…b“_'¾eGÙÃäín!&ó; o~üvßÛMò2ìÎ̪.+¥H…¼&¥³«i oPb®¡õ^àaèÑ'§è0èG;taºÔ]â(cToʧ;¿ö$JsÚR"cïý%îqCÂoM«*%)ÓϨù•û`ÂÍˉToÕ}Í>¿°áPiRÜöOA ã×·i°uRÇ`p -¤mƒHÇÍí•Ê×ÉD|a,¡ß« ŒJ˜KÅ´†œÅËxÏïŽÑõ`€ UVý½»"ˆ8>{ž 9¢…$` æ£P°Á+´ …Ô)L“òrؤ3…½‚Ÿ±±T,Tüh ¦€¨D+áÌ%ëÜéígáaÖå–ãÿ# “¹·Çn.pïÞÎñŠîå®ÚŽN¿êZ­VœË/þ¹qɼvüeä LLL\]˜Ï–¦Èß=–Ó”±Êüô¤›ŒVÜ(¥)éY‚æ•ÃüDŽ ã…Ã¥Cü¼Øp¦zÂý¼}õLýo€Û‹Â&¶(×>>?šÑÝ+—Ôf„ÓÈ Cò©ê%ù}O¤¾Ðj÷èhÊJW½l—X€¡C²XÌ_| š"–ÚÛU²(é†*¤µ¸¬<¡°ÔMPÍ!¾ø@5E>P«TS¼8VZ«¶ÙëKÆh£“ÖÊÆ‘Õ¶5kÿ,º€‹Çv)@š’s5E'Ó=û÷õïÝ]¶zGd¶—ÌÎ’ékº/²}¥ö¢Õ%«¯Ý{®ò¨¦„>¿ÿðuiÙ˜¤šâFYm­‰¬´6nb´ HiÄãû¤w: ;”þ[wMÄ ¥ËÁ¢ê ª)’™¡;ƒgo(ÉÇ[甚U›MÕ¥æ«apåü·eïϾ‚r˜ @5¥¹nÜØ¿M%–?­N]¾y¾ztjrØ/®›|Þ&}%&ÌxÂjÐv¿÷è8׬${™ãK š²¶a“Í*:V^k±ó.·ÂòühîƒSë1_ý$%²7é‚´&SÉÔ‡„`Š+@5%GÒÖM“œ\¬•V^”¬hÕ …ïR~âÉÏÐ%4wp-uÄ 2L“BWø_RUJYjµZЭØÕ?ÎÍ…ë?×­Nùðî;aÙ‹ÿŹ}€°fòŸ-§›Ù³LÿœáùäüMõÞQ¯×‹UMɮьÜiå¼YY}üzÅŸ±Þ–÷=a12î,É¢| |2½Ø›’=M±n´ZýöðÉ»/ß¿š99ÜN4}˜|‹G&ß!ŸSˆìÈY&™(°7eëiÊØ@e~zÒMÆ+nÓiÛ_ŽžS˜är‚>®„_×r~±w/ÀQUgÇϽòÒÊK$ ()J4Tº*N-¥U*(‚¯ÁaÚbÇ:*SÆ©Å)±-•ѱUQðÁSq*•ÁAÅP¤€A TÔ("† I6»=ÉÕ›t?س˲{7»ÿ߬ÇsÏ=÷ìÙÏïžsÏIȦ d­(ûMXãZÃý§9cìïµò” ›òãënS@„i°†x‚g7@6Å; ›bî ›’:êC9*€lÊñ}‹Â–ƒÏR¡EƒÇ}z®>zúæÒŽG”7Ù”ÂQ)WPÚª‹jô[ÿe·,)ÖoÐóªÑ‚•4€lJCȆ”¥Bºp^o_R!Õè«ãuw^Z¤Ú(²) A;¤)¥?[vï›Röò…}rßw½>U~ø+ݲ¬›–N³”zgמU£KÃ./ø.ŲuëV;9”-yÈ¿x˜Jk~¿ÁÃs[O6¥Á *eY:Vin Yº¬ uÞÔ¶ý?n¸È¿jô-JÐñ„aÄÉÍ0ÎH¶à{µ¶²lJ}ƒÝRVHS®`°ñ ·]ýkïîsf·ç&Ín[P&2¹âFn]ô‰a@ÙâAlS €m‘´lJ}°1›jJ›„…):FÑ+}zÙ_]ˆ#bèk”cnñÖ¯_¯ZÏ>àE6%rd5„œI³Íé”ÙÉÛ1þ™o{k/ØU¾ýÏ›·?8ùݘ²)n´¡[ÜRô1D0²³hI-(++S­Ô*o‘M1–u Y:wòíZŸ&þ!Ýz匹‹îê^×yÈ%=ûô0apàžÇ.7e³ŠHÆ"æ>&º³árï;žlŠ2 4Ø ÚU¹ö³ë—½ùnÙ³§ò›í+fNœð¯#ÛË?ùâÃêCEç_8¢oßwýQÅ®9•+’(07Å™=[yðÈŸ~yÍ%y¯ÿØòÍå7›rÓõü½0÷âºþÇüç šµæ…Ÿœa*‰.Á„ìcP¶¤û­²IYÂWúš¦Ðö=§ûŸ¦êž!¥¬ÍößôbmŸn‡>®<¼jÆU?ºïµÜEÇ:í?£K'sZD£84_kMÔ½wÊ5Yr&Sâ^¢ÏÈ"hè–Q¶\eË÷„¿7¥!¨,ËC*øúb»síîÜ‚Üs_ºÝïûüÝ–çuìøq @.A—«´ýøG6ö€–ÁŠS¶L·¸‡¢"zŠÃLϦCÖš•†5>pûæé|u¾ì9ãñì•÷eß<ÿИ§*/€XG®ü’‡ºî¶‹ž†,ˆñ+Nx*Rç @Æ"1çZäYyaFgS† »B µµ'oÒsf_­x¦!¨Ú~8iӸܹ=nSàÅ#˜ïÑqÝŠèíÈòB7’§äÈ(}tSÆÅ!™›b¦'ÌêÏ·uu:©*n%Ö<¸Ä,7ù Çu˜›âðøÆ“ä Éÿvp“(-ëag•ËðIÔ3)›â=@>‘‘©sK˜›"ƒqÖ<ÈI/$›²Ç>¼|Û:÷pÐ9ýÆœ]¤Nðˆ'þG3²Q2÷ŒýByJ¶h2…@„ÐÄØAÔE7S‹¬gD6¥ðÌ{ûÃŽ¥?-_2éX·D–3 CÊôÃôRÓjä(Ç4TâxO×f€TŠçAsSÌ/ÆHïüà‘$-(aO³³-u>:tìñÖ]Ñ¥Š]A nKËSÊ@kŽª€lÊ¡[ǵ›>«ëØ15Õª¸¨Ë¶ûŠ‹NïK?zÚÀ‚‡çƶ+:€=}"—êtJJJTLdSŒ¥¶p÷+ƒºŸ?²ÓêTåÛ6ª´ËV­Qðj¥\‡¼¶bãÎѦì<°W—b™OFÀï÷+17E®Cî˜Ó¾WçnÛÕ~vä`uí±;†ŽQMròúV­X­Š‹ú×ÔÍë§„¯‘ˆòÍ¢›×L³K)ìéóÔÕ÷¼WWùĦ—zué>sÔäÂìÞN{·©wV-_mß?ïhñðNcGﯩ–¡FL-ºÛF*€•>:4)Ü;¬±"Pc¯ÕŸ¥DŒâ À{SÌlvHnȦ,Ùðµ.«Ö(æ¦Èåò‹z.ÙðùœÛW¾ñdA×Q[ÝS@ii©J +}BJYª¥ùÿ ¸õ±—õt*ÖFÞUþú‚|]OJ°Þ6 ›b©0_|ù•jÖU)µã“ºÐÑ ]9|ÐiJåýi!ÃÐtyÛ,€¹)s&溟GWïuÛWÍ»>oâVý‰¼²S—/“dg9šgpcìÐRÌc¦>KµV²)ò•ùË·­k²Œ›±x¯ŽWVÍ•7Ñð2YãO¸¼$Æí”Íä Æ)šª€lŠ|eþ½ƒÇéÊÆOËï¾b‚“\Ñ¥ˆQŒÌ ·k&C^î’ýE3ÙYÞ¹¦²) Ñ9”®ÇøÕæuÝ)Åh§ dS åIœµh©óСc·¶èŠ.UR8Dˆý…ñu2æ£@6ÅPžÄ¡[ǵ›>«ëØ15Õª¸¨Ë¶ûŠ‹’–zIÚ…ryèý6ΰÒ2‰âe€sSî~eP÷óGvº žŸsý[î”QþÀ»E7CgÙ?9 ®Gø§KHào¡•ë×VlÜy࣑#Ôöê²mU Ƨ$æ–°ßû¨/7wvã yJ~µìf<-‰Ù¹¹cNû^»lWûÙ‘ƒÕµÇî:F5ÉÉë[µbµ*.ê_S{4¯Ÿò”9—“f ›¢=uõ=ïÕU>±é¥^]ºÏ5¹0»·ÓÞmêUËWÛ÷Ï;Z<¼ÓØÑûkª•×¼Êm Èp•aPþïwU*À{SthR8¸wXcE( Æ^«?5Jy£²)“æ¼æÖmËöeÙY¶.}m|ºðµÑk¬ØºÍg[÷O¨’üï5Hž ›rnßÞíä·ñYm}vÛ6v»l»C›¦O¶¯C¶Ý>Û×^7fY9Yö_Ÿ\«M‘Ûüÿ÷ãJ¥?MlÛòéLŠþKçQ²|YúÓT±m]·lËV^¾7døû“˲)–[›yÍî‹Æ/TQØþÂ/”¨RIªírL0¡K'ž‡±‡æ¦4m]žó]ôjQjºâ°œž†¶¶ d]¾¢MŽæ´'(X‘·¤¼€¨bsSꛂÛúÿ§AÖ·•ÕTªF /ÎL†îœ ø@ èÙzfâ'Sâ–nú¤e€vV.òÙ([ÄakdSäÔUßÐ8þ¢•ïþmùÛm²²~veþ/o»êЉóßxfÚ#‹Ö=÷ê6ÕDÖ7ø’ðø&¬âž=Y‹C^"Ã6ÆKÜ––°lÕ%ÜpÝ£IŸ¸бÝ94ŽcºJÞ°ò3òÏ @IIIù¶©‘M±”«>Ð8¾ŽQ&ýdèÏo1yæâw¶~ä6àýÝŸëeÃâi#&Î×¥îS§{šöÁqZdÿ¾Çî ²Å%[dgy‰ù+þSkÑÿeË„ŠHÄIŽcŽoäÝšaÖ¬LûsPZZêY6%rY×”My{ñ´…ÏoÐÉÛK¦]~óü‰c.½{ö2ݨO¹„tOc‘Š/ÔO#nIįÈqœC·v(n5*ÈåÏ ìx²)ÆÒÉ‘\w×cO¿´é×·üÀVª[×3~5áû];¶³m'@i,m§g‚ã ]º•ÓõÉ¡Ò3då×yõí€n˜òò#S”Ãjª»-–Úôì4§"²)‚XïãÖ£¼0³ Ì«=åKt]6fÄüY Lq‚ÛR®æµ=î’7 ‰¸9ÑÛ Ë–ÈseœCÙÁ½V^¢N’(2Âíº4^+ÇÉ < ¦ÔÔæèÒgµX¤Yú¾&¨¦.ǰ¦W´Ë>²E6†…Æž²¿ñÛ —ˆ:bžßô L }Ι¯,ë„«–uk¨9vñ©¤SR„)wŒó«dN¥xØ €0€007%: ÿâa*­ùýþÏMƒ0öIÏíc SÀÎÉi€’¶FZ„)ÀúõëU뇒Œù· ˆgi0(++S­ 2æ_%P«Ò+}S`s´Œ SÈm·=-})z §t½9² zt‡Ôÿ³ˆQ2q×UÂ@ÿîfÈ=È/MààÁŽ`d‹Ü8¥8+.OÂqzÝß]§”™y¡ÛMâv“}¢ÉOÇÑÜ[#þ1ch1GB±–DœhC† a¹Ñ"*.Ù9SÈŠŒ$Z†ÑfdóYó Ÿòøº4¶¸Wƒ’Fó€‡ 2¿"¯â¡O:rdÄpÂ_kå5ú!ˆÌ¯° 9Ý€”Œ#ª>é«‹å8²ž*Ù€Õ=2¡bÊó[Íœ¥:ˆ; Åm-‚쟄)€œ_"ÏF9Hœ}ÄmÈ«ÌãD?¾.£oÑ•Œæ€ç;¢Q´˜eÝÜ!„) R ? )e)Óº—¹1Bdì,¯’ gäP†AD£¡%£%€´žK˜X†$‡gAä-e¼ÿ±wÿºMqÀDŸ&He+k6FÞÇÙÊÀc002z„ èÃtÃRPTå+÷lÙµ÷óQ%¶ïŸ¸_Ï—s%Âüê'vMWJùàí¦À—ÏŸ6sWt®v[ù(a Ôu]mûë›ja ÜÿùYmûÿÂ×oß«µ¦‡Ã¡Z)a ˜fÇ4‹åMýÛwÿ'.ÜÞî«.M0š÷¿<ž_×õóÿ £)FS°ÌÀ2Ã0S iš•þÆ}à®Û47L~L¯—‘u¸ÜÊd>嬜y¦Àú»ŠãcþrurS53“´·¶o—vÂh;³ãóåŽÏaÛ²™ª S0²rv]&·äëB OoûìTt–8 òyfB¹ ic¾Í kṴ+ÉÓÛ‹íz®†žÿ 0…ƒ+§ ÇçžWÎúª³¬z–xzQØEGGµ:ËÍ-]oËióEwezV²xV³ÐB’ØÉ U-ž«BÓ" Låg*œuQ¹·PPGÇ–á˜Êgž™¶ÔŠåƒÑñ“`žé«²îH„)`REÒtèúÓ?vM_ù,.ÒF+Ö'+9"ÉØ¢ó”ÆÌMI»Àù Êþìñ Ê ëYóŒOPŽ>_0š9•$»öÓëÜXÚRî`â°Ì$u”—yö¬¦VŒ*+ŽnK9·©“”¿NC?P`×þóØ_ßWÏÊ›¦)®W»‡øuÊ#óÖƒ¹ýã‡÷½²Ý63uÈÿÛ3Ò8­$ž»^W«u]WË™yÒ(—4̸胯þ,N2` - L¦Sa €0¦X7+V%±Äá,¦@Ó4U·XhyF¸èwÝf¹×qù˜ñ Ëù ,_™ÌgHVÎ<S`x7Ó>.±ƒ<>ëäælfÞò°};žSp_˜öyÞ—ÏÇ­s²™ªº: LìšA Â@ EE<Ž —ÞåÒ…rQÒØÿB´‹÷’“þL¦ÐgÕYY~¢ÝòÕŽYEhé‘ðMÒ…0ò¸p)œsRÊÒ–Š›ì#wî~™:{Ô§wD«Tó:,¡š+ÑÏ_®;›ÿa§‘°•–P‘0ÄsÄr1S„á“ÓO¯WÏ·Þ·ž7¤X‘P.ñ¹ÒÒ €2€³ ù]œ•è›)eêZ¢Ri¥kžPï‚x'U}@™ÀY‡úCæEEó`«ÓÐŽF.®"ò!æÓë]úÒ9¥½ àl m•yÑ~M”•mîO€Oé± º)ù(Iþâ†ÝH8z¬º˜³y~ŒÔE=“ ôrf±u-ëØ_ËÔŽÔßÛœÒÕ훽»×i›‹8üwëªkïƒJtã]Ù3p? \ƒGFíÖJ}ïƒ5CåVXò£ƒ%ÈDZý< ’㓈ý°OŽcV ú÷®=;¿fOg(ïºnrî,øTm“wQVnËá-7ÌyŸ®¿Þ\½q·ypè¡@ú·=-q&ñô¡:ŠMÓĬ”0ü“c7œôw&1g~5´›( †ÐÀl™È )Èp¾I¦È@¦˜7nnnd f›=d f›ÀØ™ S™ S™ S™ Sd Sd S\!Û§˜Ò4Í .¤ €L®ë"ïáþ6N™www‘µÀØøúí¿ñ6Ü}ó~öø”GSÐ(¿~}ösØ] SÐ.C+ŒËéÝaMZ<¯o0®DúPvW« S`¬1vê!]NÖìÈlTÈô>Óõk S ˆ(0 €LãcŠïŸôp4Ò!±;ã[ÇåÜp×}ŽY™é<³Û÷ô7Äš}4]Ÿ~or7³0¹«™)Ð4M‰#[)\SpaÓ¬`- Sd Sd €LdJÿò5ØFôr›`Þ”êåkð9">æ6ÛठSd Sd Sd €Ld À³LÑ'Ë'_dʈ*YÞpÒ‡¾Ìç2…Êó™€L)2)2)2@¦2@¦2¥¹íeûÞµf&õ/øRísW+ަșșș S™ S™BE™B‹2@¦2@¦2@¦È@¦È@¦È™È™È™Èʬ:S™ S™ S™ Sd Sd Sd €Ld €Ld €Ld €L)€L)ÐF<ÇPǼÀ&æ GS™ S™ Sd Sd Sd €Ld €Ld €Ld €L)€L)€L)2)2)ÐgV–™‚N©âÔ)PU±@șșș S™ S™ Sê8:xlŸ¢4ȸ¼¼Œ Sàáþ62ÀØ@¦´2e}²x°‘)¨’ÅÃ'}™ Sêé).bEdJÓ4Q @¦üÿëGœœ_,þú!÷·ë}ÉåO–ëüŸù±}ò’?„ðI™P¸dàR™ 6pÉKà•¿œ×›«Ø“>ð—;Öq"zBù ƒ6%ÿƒ®£¤à3((ùè@‚ÿÁ’Åx•ÙÛUàØ³}ï):9³Ž”Ùfæ&Nî½ç(Y¿9Æ£¯tµ)à·XÞý½Å÷M›€oJñ¾½½Íƒ‡»"OëÞl¦<–½EÎ4g”÷,¯–ûösצ`ŽÅ;r$Ïb=h‹yåŒòžxaÝY/œûéæ!ðìÅ«Ÿß¿ÞÐÁàaYªW#¥T—YBù;ĉÚÅ[IɲAÉŞȽô%qCbq¤ÓÁµ¹üò<_©Ž‹ÈTûÐÃ8!êw]\ÛmD厑LÏgSjŽñV#¸™Ñúž”ìÈm }öaD Ž~ÕI‹¨Œ2"Êo¸ÛW¬sFyONÇ—ð\¼K$®Ö§ë‹qäd#ÇíÜ#²ò*þ¹xo>’#ë§[Ÿé”Ç2¯e±Î{¢‹«uñ¸¦)QÈc=õI”ýõÖUþ¶`ç§1b‰&&Gbg­÷ÃeMI]D^›cÏêÕziæ6%TÊÓõÒ;9îÇóÕû`”’Ž…î쌯æ–GÔì¡3D–m¼vâ#´û&žäs¼‡;`Ä’#yjö†ÎèôP5{c‚²¢´õh"`Žó vG)9>yîA›’[–™†9œãj<"uqÜmJÔÚ¼ÞÞ9߇;ñt?wЦt{Út»fÏÿëp~™­RÖ¦(ÏËÜ8ŸÏRÖ¦ô>~xÿ˜SæÉ{´)'§xI´).u ´).ÍœMЦÚm àíoöí€àâM"ˆ‰@ob%wêKü’ ãþxìÖ! @½?ßäÄú ¡æ.ŽMI²þ˜®«)‡½;ÆM†0lU½M+µ]};FŽÁÀÈè‘nTJÏ“‘håÈ[Ñ‹ž¾o¨Bèbÿ2/¢{ã˜Md €Ld €L)€L)€L)2)2)2à¹l¼¾”ì¦Ûµüñò¶+©ÕZ‡}†L€yžoØ­µ²òýõY’:/ NS Û¶óoØg6@¦2@¦ž2B €}zº]­7žL€n·^¶ð¬¥’`2úí|¹î!R4Jÿn·ºîN÷R¦€C— ,[îŒÿA¦<ŒÎ X—J SpL2؆}&ËudÃy º ¤IDÏ9M€ûLFÖdÌ/÷‡³Ë_#´&ÝËñýõuþõ†¯Z¦`~6~KF¦@|‘`„)¾ô€ÓùR¶™µVY¶E2Zk²,žLOåûÒ1B Sd Sd Sd €Ld €Ld €Lüôà;pLÃ0hÖã|6z@uK¾8¦€A6ió¯Šà‚£­Ÿî4Ë÷ùº·IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-02.png0000644000175000017500000004523310536106572024560 0ustar gregoagregoa‰PNG  IHDRô9Ø*_*JbIDATx^ìű Aã*”FT* ÄòלN—<ðH»–8&†Æ×Wç ƒk†ô¤^$÷²s¦±QUQ¿çͰؖB§t¡Ò¶@‘5le@A>úAýäeÙ*h1jÂ'\"‰‰5‘., HY%RÚRY Ö”¡tÞ¼Ò™çy½Ía¸>Ûaf@…óëÍyÿûz'÷6yùçôÜ;Ï);Õ'«ÄƒÃ0 £‰†aÆÚûôÇ" DSϺH-/@#e KÇoCFRçΑò–Ò j7µ¼ªS“PI⎩éÓaO-oÒÛ5Ø/R]I—SSGYC×SدÄ~j›5Рð§¶_ êÓgíŸÄvjõi¤ø?xPùAå5R†w¯UÌ]åù±¥"<>:\&þc0 Ã0N[g¯¹²„&@è‡i¨1 '€@ ¼é(ÉÉÛW_'bÃ0 óì˜Þ"lÜn÷‹ë*»4wªÅƒ0h P)ÿ”X-Ö0 Ã0áŸsù¼rç]l¨j€«OÂÂg&lœÿTÅœ™³&+™“ŸéJ‰ëÖS¦´|ñŸ‡a†Ë28»9´%ÏM<,Ãã ÔU{n¶F«¡ûM-N#èÍì!™{Kýûr_–Ýuï&æÏQÐtòmÒ©#ŠÑppuhwФ"lê÷”bÌV&£z×RŒ…OVˆHa†)*‘¾pjw'üÌ´J RûÆûÚÀÓ*˜†aøý~›®ûüú ŸG7¼dîÄÍ3ï‰ÑwÄ‚”ââÞ0pârl(.ì_%Â&Ç]FÎ~`†!GCWœ=’Ì]ƒnÙý“…ÃѬß2ƒf|œ37×u«µÕ?V3š=ÁæFiSþŽxk7‘î]0cóé“ ç]?µ…«h¾çÔ;(’‡¿":¥ñÄ[¤ÓG½Šñê±µû^ŒñÊ‘71fŽ]‚ñrU0~©èŠóûË0fM.=÷cYÖ”×QŸýá úmöÔ•ë÷Z÷)s¯Û½‚ä?¾ZŠšo—ÑÍ‚åRTï´–TEþÎ0 û;z:6êFü%&ˆOèñéy}GõµÝ5M¿4é×{t÷Æ=Ò’h$%SS´ŒŒ>…™Ây:åïÞÚw1&æÏé=tŠ?ÑÖ£ mä"«=¶õïÇÖu2²ÿ¸%íͲõK‡ÊEx ³wˆvgR²Š_÷Z1gj‡Ý“³çM_… EíwËÉÙ f¬ÁFÎ.Ë2Ñ;;Ã0ìï$"¯¹ƒpšBLljüâ‚ÞŒU›Ï§û}->£ÏŠmmæè‚é8Xñwrv%yÊ܉~£cò~õèZÙÍóPæÞ V+5w™¹Ó ¡îûâÞÃ0 £”eÐß#5wpz½ÆÁ”´”ä + Á`  jl(,.îi*ª¿ËÌ@(¾y½zƒ²&Ó%œX/“w¢ñ8¹¼ ¿®É»p¹ªüŸjîô¶ˆ‘i;ˆûÃ0¼§ŠZñ÷»: 鬻ä- ´ôªi8úÕ‘Û÷ïÙºûëwVnþrÛ¦m[×oÝRñÁOŸR?®ÖgìéS0WФ¢yؤv ›/" î”¶‹†aØÙC->ÂÌ}ûÁ«I‰=Gä¥úE`×ñs-ºO·°Ì~ÿ€ôÜŒÔ!]æ½xËîÊžêÝžƒL)^`†Ää*3€{ª˜¼Se&pOËîg÷­¤ Uå/Í›¶ Ëî²,C{ªCŸXƒe÷Óß,£ Õ™åx2&ª Ãpµˆ¼,£C˜bË®K³Æ¥e¥ äú¤ò𙋺†~—œ”žž™š%Ðè#ñ9/…(zåÍè¨É(oØ‘GeBž–‘Z92hCUy%ïØS6T•·',ÿûtƒ'•*#‡à™P?®ø;­„n¢¿Óši7•:1a&ª UËLØQuMò€e⃲ÍSkw; „Öè(ä½>çÎ0 C¹kà4M@›ŽvÀD¥hRਇ(%•G!÷†a·ÛËÌÞâ‹ïz´ÍçI1%$Ã0 ƒoyŒ¡¹ÿû–Í0 ÃüÅÞýÄFUíqÿž;Ó™;ýcK¶àŸ݈^Š ¢[ Á¾—¼ï-Œš·n\»aeb\]ix &ÆÀBIL^^LŒTH0ÁZ#¤ÕþÎôÞs~ž™+=ÞNqîÔ~?™Î=sæÜ²ùöä×ÛÓäkîg?<†¿""’XÿÂp$‹{Ñðð0î9"ÐFBÑZ®ž‹…{K!"¢PKaÁØ—6°R¬– w""ŠöéóE„‚˜V w""A¨%(ïÖCë­îDD$‚ 4cP Œm­Öw""V`D "AXŠx8­îDD$‚B`D`#Å@l  uȈE  LkY¢ ¬÷p'""–‹b]îRGWë>܉ˆHV«ÃT$;–b¸ïÙ³ÀÈÈÖ"b¬+@bÏ8'»“®%%­&f¥»‹»QÙݲiND,Ÿ ;*-¢$*d,g]ø&¬zR7Óë3剈ÞûdäúÕ 88vèÑþþ¥*’ÝUg÷º¶ó±€v—Uæ7°£wƒî.ñ‘jøWUm}7’"¢÷O}92:>ÐwÊžÞ±¹¿»dO2Üݶ:ê»Ë$æÇC6þYkÙ[±‘j_ƒ[¤Ú·Ÿøx‚ùND,Èlß60ôÀ&ÚȎ샭]²¯e¸»äMn¾‹ææí—ë_Ðe:“=YD4ŸÏGÉŽJZ»gÛÿ´{•€®º)®+|£uâo>÷iÞOh‰ˆ´‘rkpWŠ6pÖ>ÜãÁÝø|åëâG£®(Ô”² Qe²#Ú q^â™Ø¼D¶‹7yY×g¦'…ˆD`ŒT&»j4Cº®§b\}¼&n~-•ê÷rã±ec“kÈåøü¥™ž`õŸˆHR¨ t¹Ûš†»‹¶ø`"óãs¸—q}ש:§©… "¢P‹1ð¼X²7Ï–iv1ˆH]Nö¸P›DÖŠõRbûh÷=†{•ZPBˆˆÂPD,èr k-F¸s¯­°CDtõòé;7¾A ¶Ø2t Ú™1AõdŸÍ¡1¨‡1ÐF¢ %RsY†ˆˆ>?ù*€y:ão@%mT»ð_û:ðÜ[ €(¨Õ“ÝéloC™Ö«2¥@w…—z1܉ˆpþÌqÕÖ·ÿÈëJH(f–„¨bËàÃ_|üƵ˧ÿv¸¶dw;÷ÅXB §â`ûŠÖ©#×îDDÓ“ÓÓ“¿,-È~ù̬1yÔfß¡WN½óbªc7V’Íu¸~6ÓÞÙ/us*íÜu¬2#]Êt±P†;Ñí[wnŒÿàҥѹ™,"“Ÿ>¾÷°§æ$ QR)ÿ±ƒ¯ýèè­ìk¨ÔÝÓ×Û«ülfÃ}¹¬ý'gú2éѱ‰+c7‡w-Kv#? êÇp'"úêü9”Âû1ùÁ¶ÞïççgÃî}ÿ–˜‹Áü€™©iªXjæ¢v Àøì\zî§_ ³öSÓ? ¬ãq8È庺Úvä¼oÏôýóÝŸíjO妜<óuwW‡ŸËj#wëïÙP@І;щ¹½ÃÃ;w ž8qaëþžÜß«ç¯S(¤ü¶NÀ¦®^F–3è)ƈ‚' KÙÑ6x)¥Òª­G¥|åµ+/ó¿³ãWÆÞ¶Ì毰Ǹw÷ö”uø™‚yAƒîDDGŸF©ÊÜ3b Vf4JTJ`O©¬Jeáùå1*£{óùÀ¿x}*õصۆÚÜ×Ý=°1g´H¥(((Ä„r«‘áô1Œî†^sg»é»u'ŸÊ6»…cD¦'â\l.ëõagow=h¬t¾ Ñ Ñü/ÅkŠ4«8"Pp‰œ¢®™å¶Ø)†‚‚Âþ­1·žZË&¢©ÉÂF%aLc¤áI`<"'ÇOÞ®ZFÅ¿î&X×ËÞ–²ƒÒ¥Š#Âæ½Ä{Bà_(`ŠÔÊ ,Ÿ^8õe¿îš†FÙœ;óúE˜ááD|pº{ Þ¼kó¶Ý³MÎXuÆìòÏ–_í¸‚Ù€,8Ä\D1.dæ\Ù‚p4»ŒpGôŸëª5ùÃÞݼÆUFq?÷¹/3wÒ™$fª)µ¶M ÑJ4‹ÒE .tå²{Á"‚Á.\ˆà¿ ø7(®×"´Ð¦…b՚Ъi'm¦Ód^ž·ãsç¶“j˜!™»Ifî}ÈÌ “Í—ÃroW jå÷¿L¾s~n4çý¯é[ [kr‹)•Þðz̤¤ùýú½‹ÎS6‚!žéýuèÞŸìó.Øû<°÷÷ûÿ´ý;øëý—ö~©Ë©T k[7kòܱQò|zli­ÔàŽ=Çb÷Ö ~P·Ú2 k{ué–Ûã¼ Æå`ÿ®žGåRD)Y¥hŒˆ¾þ¡xö½©‰¢OmnZÿ«ª y”mhøc;âŽ;Á€›Ü)á§}¿òG\õŽÏÏŽ ÈYß2›;†LæµúueÃí…¼`Ä=†Ú¾ùiêíw§Ê‡’ÖÿVQ÷ë–²¡¤b6×.W>½pš²ƒ¸¤cû鹉ñX¬WÔÝš¡l°Öʨ›76^ž94ù\Žq*€–Tä°IÇö³o8:l5ìÚVfe7¦ÕjѵK÷?ûxÞZKDl™Ú bKm–=q`lß4ÇÞ|}" Åõµ†1L0†­n(enߨ¼úÚèX̲%©Ïg"~?‰GܬÜtcû⹩òˆ¿V‘õ¦¥ 0³lîheˆèòÒƒ/.œÒJQwA˜ô“{ŸVÖ"7¶ÏÌŒåBZù[RØXÙÜVÚÑŸ+ÕÙS¥R̬5=f¾Om^´w¾çˆûSxXoÑ·?VϽr²­þ#³8!c ·ˆH¶-¯V?ÿà¤5Æ=h4ñA”íÄ3#îO`ýVãçeûþbñ¡æÚ¶¡¡2Úh­d³E¤Œb%å½ ýÆIUФVÔ!D6ÝÏå‚0Aè ÑÖw€¯¾»sfáÄKGò7o7Û™‰ØZ÷ÐÖ5Æ-Ò¬“ÛI™ŽíÏ—•4ÔF~:­QƱ˺‚i0ˆ;@Óij Çë5¥¤îóJ`ÌÖRÛ£¦‘µ "z2ëÛÍ­Vµ8w´^,ŒkÝ ‚\:³»¬'{”ÂÀóÅqèa(|ŸiiGÜŒÖVê/?š^]ß6ÒPOÌL=Y¦ý˜>âÇ#… ŠÒ¬ûÏLCƒ¸aP-”ŠSÓÜ®³GlÝvoÍ™¹KÇÛGY»÷%k©ÃðŽõ<âÇÛ}cÄ}¿<|÷$/©-¹§Ü º×-îÌ» á Ÿäx¼û›LL$ˆ™;ïï/ÖýŸôL`"ËL â`-ÓA‚¸0“ð<Äýà`èØì!0#î Ó³"ø—:$ˆ AÑoˆ… °s+°’ìxµ¸ÊXsovãÐ`Ÿï>$‚$ü@²ª ~’$uåfØ»{–F¢0 À×Ýn§}`‹`ea©eÓS-’_ ,„¤ÝBØt’]ÅFbeÈ–±H«],,4¤RkJq„)ÒéæƒLž§¸¼ÃLsárfÞf&’Þ€{îw„;Âá Üîw„;£ý‡êêÚz¢ÞÓîQ²'&w÷*…$HÍ[²Ç²Ùl”ïívû“Ÿ ]øèñnG¦ßcMvhg…»Õœ°v$>›ãjgñ@µVÚ L°ùŸì3;ë' Á•ûóU)®—7k—å­÷:ý-Äu¡Úc½ó\4f¶[a$@¸ßŸ ¿»ñf¿ÓŠÆJãì©óP?ú[:ÞŠ“ŸaF¼öšqý5“‰–^ ®,m\ô_–Â,ëÖsùêcT4ËßWŠsšï𫢈ÂoÓ»öšiŒšhz‰I®‘ <(‚­?)Ábƒ9l¤¨AšJ”ÖH)ž©U"MT¡BÚ¶šÆŠ–h#QcÀBDÔ¤ èQZÙþ]w÷ögºæîèìvn»ö®’ýÒNÞüìݼ™7ß¾÷öîþKr¿ÕV˜µs›xã À í¿h¶O´XŸxÞ6C°XGâýç¯_Ü’dw7çÝžÌwºÁÕΚ]=…]¨ÉÀ%€F½Š ÿã¡ \4¿C×”b;²gEÛU4ß„IîùçƒÕ¶}U¸t8f}¶³ O-,(-?7¼úȺƒXg¯L*ŸÀFµ¨G¯g­I?RÿHv˜ý==/祃t¼otydöµ¯¯^ UÈŸ‚•Ø[—{ É.(0>í(+aíö½ý—kŠ÷‚ÆÊ7ØOYÙ6{Än2&Ì´Ì$÷¶CµY…›A <Ïw54áDú*†¿£¾xØc"F$á…j—ÎÁlœyoå ]¥±$gøÈ33ê±õe‡\“Ónþ掣ž'r‹Šƒß;¶§raÁw8÷=ÎÌô´¸“IÞ7<Ý®i5Ù½ ÅubaÁ™O*W¼¸uâÐѪýN˜ýr}æsïv#ÿ Ç¡UžîæÒ´¹y§ öö)¥–‚ÌUÒÖš} ¡ï:Ú/ÈÞ6L˜ž{[ÃçYëVƒZlσͳG/½8ìOÿM,Ô åxîÏ{'4P·ã83o«7ù>JÑ<j Þº@A0jã¸[«—c\;LèõU+°°x+aöKµ™9ž/o‹ý‡d—wž,[îxé´a/­ =Ìø’Ò±ÅÔz<&Lr’ǘýUfO¢™6}Ú7Qm¡A§.#’üÃXxr·cCy¶0쎣~}¼«¥jGªócèÂÉ…Õý ouLØ;ó¼<ìÌÌä²*n0i ÐºYF'J—cáù]M€àÄÛn²‘Ñ Ùë0ýaÂ$÷̲æo«óŽW7ƒ½VÏ8!‘y+úªúá“â@–”¹ò‹3GnIˆNÉÈ( Rš÷OÕ”ÛcjPw;6dßȃ‹ üþÍWöM—ëÜv— —3Üí1Œ±BÚü±Êüðaý ɘ¿‰´ÐPÍcLÏÏŸ0RX†`Â$w6}³ÁŽmcÑç,]úÊ–ôa^…'Ú0=:¼¿ëXÅÀ;¼˜¨K;™tP"ò¼tãJèùA˜€H/Û[§ß—n¤•Ò»&líô³‰;éßzûëÀ> AN'ÓöÃÞíiÿÃÞ³4 DOÄѵàv…tk;ÆÉÑ¡ƒßB§®ÉV颂ô8tÊàààTÇÖMA7‡î]tk ­F8ÈérÉñÿÑ!…înx½÷î…¸†àN§×xôú‹ÑåÔûF: [þ°x¢Ÿ]Ékõ-æ¶Yp_-|ÿëB£´­ýƒuPªtmžéºàŽtØø‡Ä~.¿?¸õTd5ÆüQûä)ëµ$É/´úÖðY…D@@àž7fl ŒDÖa"Ô«Ý6U;Ãbñe 9ýCÅ¢lï1[ø~Ù«“¡~ËvtcFÚjöûÏÀìYiФ)„þâºhö,Å%<ï^,wœ÷¸]à^¦§ÿvÞ‚…û>Ý“5c:jv˜}þ/æÑ¶ 5»{Ø×ì&fžý±[O‰Ž/>_^[[I<†ÿ4üuk6 ¦¾[ýí‡Ê{ø]@@Àd+¹))Ý_N”"™<±+ôZQ¹sSÇ'ˆìÞ ¬,$E\½–#~"òì8….þþ{¬¨ƒ‹NB.¦ œ“3î™}À„Ìͦ*B2y¿{rÈܹ/ó‡¸AÆçö¿™/Ëÿóñnyr€þâúì™2Ò|þÓ9ü ~?½1Q>ûÈ üªµ7! †ßé]I¢ãªìäªË]¾!w?H¼¨äjÿÊ=,$0U-M“uC¯w¥'äÏÙ>“]0-ÙjKþzk!òO)#}myI¿Mô^[¹Cßîý£íð P¬m­×­¬ßô™³›ŒÍänº»»õ7;=ššR'uÒí®B’åWðjœCìÙ÷8† pïÆ—ÞXs`ïÆÙÛ¿âlÒ±B8®³ ë³¹‡Olž7ßM†ßC³ Ó5zmb¤wŸîš™³*&¤« Gèüûý?c³X}-,ùYÚ]z ¿oÞÚÕíííb±8çíÜùÛZZZd2Ùâ×~NÃõ[aöóÕMÓRGnË~¥y¯…t>ïè¼-sðPA˜L–œ”xñJÍo‹FŒñÌäIFC¹ÞTavÛ2ð/¿­¯Ñd½0ÁU­—í{P³Óf/üø\ù7Ýc§Õ44Ž }lÝÈWlEòȶß%,âÍîÐï™Ù8edU§ljÅCaö 2 R(Š’8û£Ã›¢—õeYr¶ì®Ê=9>Ü`0`þ­µµÏ‰Dˆ«ªªˆ0éØÖa  @DÌŽõ#jvIRßÐŒ§y“Ü©²ùV»Û5ê”N' •`Z&55µ¢²’ãXÖj¥W-,GÍîáä]þMÇKy0±ÝZ³#~iå¡Ý[Ç`{ÝȬüÓî5‹2†CþЦUcÞ8Aœñ¸™]@øÏðʺªÑº°KQ—Õ£FCÃFSÏÙÒÊÌ ™[>þ„0"r‚¬^™Í‡ rG[æ)u|ÿ¤,è‰#RiEE…Z­^÷þâââ*++#""ˆc0ì¸xF:¹£ò÷Nî m1q¤Xkô²ï–¸ñ°ucV²¬¬L*=øeVĨ⑄Ýñ°3»G/>à¥<ȇ؃>;_³oÛüô’ßnh1õþfÕ†ß/z«…;øÁJ{³ Ül«—´r·F„¶˜®•hÊT$Ù¦Ž€!dUî2¸ûþ=w\ÿ®øÊÉ¢ÊÂÓ¥_;·¯à‡Û »Ð?1UVVDÊåÂіA¦ñ†Á‰ÐÝsôCœƒÙ˜×ÿV„>û¾]yûvæY´,O4vږ왽&p|WfªÓµMÕ0;ÝôÜQ¹¿³|©µ†y'gÉöüÝS&¦°œÏéÃ韑ˣRRRáôØØX__ßíÛò¡õèèhTñ8.Þ1ÆŽòœ~ýÀðaþHÞê4CëHzÙרUëüÖ`v4dlB—>Ì—Âàâ¼äø¿3fLóóÍ_òþç»×Ãì(çeâñzgrPD*dÊJ/Žc ñ¹ š2)1qÀÓøèÕŽ®ö…BqõêÕ„„l9Žkhh@†Ü›¾ûÏ·ÓjýËåiÞüÅaÔï³ÛÅËìˆ÷ç|½åù'ÄÒÅkwBëXm5{à¦Oà[!ÿËÞÝ„FqÆa&ÙMÌEA¤ ˆ‘µ%bw{‰Cc¡"E\!¡QÄšŠ ôbó¡4Ybƒz2 ñ ±Ñb ¡…l¼´â±Ÿ' XJzŠ jÑM61™M;fàß6“™0Ì~¼>?6á¯w—ž}óßwßùoÉžÀ¤“I?l;Ü¿d ÈõÈ£H‘ÞPJêÒV“÷øÝ¬°Ã„:»ã'Ù‰ˆÊÔ¾Éìo¿ò%"b¸Ȉ"ùì”jåVÌ/Œˆî‰DaŠÅbo¶]ú}¸Ýüª*Ð×'4…_EµyøvìDWcccÈá>ŠÅãPÕ¾U’É$„bá^ö`TÚ¿þ”@Däs^œšá®ÝÝÚ4 ›ßv5-±X *º{犀"ÖÜK¥R¥yÐÿBe9€ŸÆoÁÚuä“Ù'_,ÌÎÍNͼ|1UU1{ü{3Ü÷õŽŽ%ÝFññx\nKm·eSŽ.ÚisœTžÍKäLïÓBEˆî9CÜ-ô5ØÉnÊè‘…×ê{ZuX¢+Pµ¶MïÀôÇäŸÈÁâ²)9è¯Î“Ø3#›ˆ”*Ëìj~÷Ëë?@߀ú[wšódtî¯G8dÔï|Ÿpþg ûgzŒ¸=ŸbÉCn'—&"’û£•T¸X®ôlô4–ôèFsÃÁæ†7äö¡I$…cÙ”†ãL¿=;/´{s’gQiŒOÄdÏC¾G«W:‹ÝRœI$ö¦Rã‰DÂj'¦ç¢Ð§´Tj†Ý…ùdK»jÖ. šãoCx•à—Ÿ†Òƒ·^†\¨,"&{~Æï‘P ¹Êñ‹~g²•È>0rrº©íá3‘ÃÈ©¯Â.^KauÂâ;“=ü| ÌèQd3v%k?îÛ7—ÉB“û[ ãJïØùž-Ô@ 75Eý‰1D$9žAÑ}V/ÇÂÜö϶ùô½™çº¡Aƒí0 +çËço õnöSý^<ñìÓÏ™þ/t9äÜ#›Ì}"Ês¸k2ë1§4°ÒŠmË|¶<Ö½£­£>óB‡fØ…vü§Ð>|ñÇ‘Ïkr¥Ë¦ç8ŒWq=÷2Fî™ÛGåàf×ûöc]Õciæ{ÿÒm˜â–¢]Ï@ÖÌÉó“†}¡ÿ~ˆþaçŒY†‚œ‡lv̦?!ÝÝ Zƒ›:d"…]º¦RP²‹opÈp5sAÐA !ƒC…ö•Ð<ÌAPžÂ}„ãrïåîÂAxy\rc{îB~Y › cùºq.õÉ8p=ÛdKãÊçë›ÐÎEð±mÞˆ‰4êÚ$¢pÅ vü¡˜µŸZ¼³¢0ú% ‹¥·®·ßúÞÚOñ‹wgŠH-HA\~[Fü›u,}I²ÊY©<”«ŠúüÞës»m²ƒqåE9lžì¿ÿ)Gö#Nþ“)Ð-\硌 U$¢ÈÈ žfÌ<å’#ŸÕÇóÏmb!£Hѱ[N%r9A~Ø»~–b(Ä¡ŸÀе“àäp¸A::Tœ—N "AÜDqQÐJ:K9ô 8WèÖÁÙI.¹›ú4Ž{òó•ÊÑÔ÷ã!÷þ’ãGHŽ5rcÜ{qà¤ß=m®ûÝbö«ç³ïm™;YE—%á ïÀ‚o…eâA…w§àž)äîoëÔó·Ý_%à .â&t d€Édá·ò˜ñ§"R %w¾^f…à7‹­£QgƒbzyNm£±28: ÎÆš¡Žy{Ø©·îçmKZ.ùONùÿV2Ž ˜ÅL=­£<§U(¹³å$*Ÿ}fÜÓ›nÒÞ3?ÁZûÒëW¹ïk‘ƒÅK›Å߃ΠB÷Ü¥pyF =_̾»eœågvZ¶GG(D 3ªToY|Ólÿ&ŠÍRFÕûU(–ã]s…•{Ú{J¶›Æ9.`M3;®_$>‚Áo²ÆeâgwÁ³ÀºòP}‡I"],Y: }î»*#ÓNØg)ƒ˜å)OØ»c—„¢0ŒÃ§h¨©Æ†Àè/°­±µ Ah±ÅAZª¡!¢‚—Ö¢((TDݢ‚hµµæ‚ (¢ˆ(t( îò)'¾Ãårà÷LÞ«x/ï«ñwK¼ðÑøþKö1cZ&{_ìºÞvùTk2þš–C‘Š7]{êƒ3ê«(>‹X‰åõÚ3öïDqÆz<ÈtˆûZw}ŸÌèêéÕÎtyûд1<[5Ždà†Ã> z€k²Ó-£oÝãEx 9NÂçíD€nïá.7ß½ü-€É``r}2^&wúÜésçÞ€>wwÑ·¨G¿„;}î?°@·L8}î¿ìܯ ÂP€ñ! >`5 &_À`£ab,&ƒ Dµ±±¢à4˜Ed¾€YÁf0›D°L“ñÆá9\¾ïœv8á§‹çŽçO®KgÖ‰ðÜñÜñÜ“‘ë2˜u"á²z2ëDxîxîxîjÌ:q¹ËÏÏý+rýŸÌú‡{UA 0:+ÚMFëפq¢—0ƒE»a² ¢U jÔ"Æ)šÁ}«M0l›1(‹àwêþyþ>ñïfB¿T‰®gñŽcl³;*¥’箇|!÷ê¹ GÏý“­kðÕ³D&´ýHµÖRÊv«fû:„S<ù¯=w`-CÏÝX†Ý ã=ⵇT¹P¥ T! Á?Ù¹šª‚(Ÿ¯Éðô¸ç9ß»ÌõÎÓw>†aæÜ3÷œ9çÞñÜ3㫌õèL}öµÔRK-µl¨:ÀÈÃFjG÷_7l¨¾™>q]Óª²†@ ¼¼}Ô“– gC5#÷/×ì8óŽŠî*„áOW”äÜi ŠÙkÛÎ&¾wöwÄûÚ¿=m[»÷&¦ÅPXqB… ú£¢ËL—Å>Oª<2rðâ\=6ÄàÖÚTç ëé&§eì.ŽUMÕ*R2R¯iHgè¹ØH¹röÊÚÔ†+¾æ1\üŒ†S4)š Í‘(|âŒÙw Ö°œ$ºÖD ‹»³È01Yxä®sîôϳgš/â|ކ™f|gÌïЀ.% rZfb2¥Æg.CºÖ<<6áKŒnÝÃIŸÆÔ .àgr= œ‡Ó¹8 Ù[n¸¶¼kÔÇòfüd&·rOA3Õ@4‰ËÎS§C‰ŠsÚ» ßþÑåm¨?|`/°† >$rO$¦÷LhíŽèújÝh4͹û]é|E ŒÎâvÆ«Ô!IbÐP×\%Æ™íù@]˜˜4¨ÌLf'DC+&ÈõŸYHœ­›°ÝðXÈID·ôoOjs ô¦‚…äÜÍõøXòoxž‘ •Å­Ý'—/SŠçÜçîö {£ØÂAÐö ±x`R©à̵”tøér•Û`K*ز³\ßÕ,A"wX'’)•øICš”+‚š\WQªøÂûã§Aäžû t÷wp7>Ðýf†K­$q'‹?­¸7=]×ö”œûDJü+‡ï¬®¯[•^†%Ë*–l]_rîÑG›ÙI‘åÍ1/|æÇ­æÁj{º½³ý”ù{çö©)>WžäÜË›nÞíª_ZT¸¢´hè÷¦ñ$ç)Z^P³¹”Gîs¢‡ÂO¡`~.—Ñ œ€ßßp¬ƒ…¶x ¿Ä)ÔåŸüþŒìß8º ¬d+‚ÃþQÁª’=§i,ä$sqOq~¨¤_0"Wê/¿çîàœ;¡åFß±Ýeœ>Ov÷~}ÕÞD??PëA9w9<—²Ûh,x¡ÁŠà[| «Î·ŸȃÈ¡³¡êHgo:¥yg™®»žõßj©Ví,rÏGÈ»ŠãåEHÄ ÿPÅЋ8µ÷\z­sîÏûŸÚ¢ÀiÙ³šÛÈ<ý‚8Kfx|H /fÁvìX…ApûA¤H‡`wŸÀ¡tè38dŽ}ƒ¸äç¸é†‹EÖ®mªÉèHìQ”„ÿN¶¸áÊI.É+}vñÙÿ––Úš1­³?©,äœÏAPõöoy¢ëMÛ2jZ¤RJŒ±G\Óïñ ÞMÉÏÍýÍÞ«D aŽ¢øžM,ì-4•––B ¬­D‹p‹há¡…U°²Ô"`i©•Zøwi<_À"‰ {pÃ2GV¢GþYœÝÍbša2„XÏž;'|ò× à?1á“¿ö=÷z@Ï ‚ Š"cý^À<’{••{’$išêZ]qëÐu]ß÷Ñ€Ê2{pr¡Ã¨µ?šºížç½êy6)Îs|¿¾ÊÒ9=÷jÕºçžç9³ÓSôC¿E?Ô«#•{–e,׳U©†¥ÐQØ mÓ3*d«ú4ãÉ|†.Îô7ïWL{J?L@†Nå&P¹w¿¾UØétu8LåÎS³)Y«Qa«F|•_ÎgÄ–ß/ßBY°×¾çN(k·ÏÛ§—×*T™=¾¹ÓáQs[ÈìRÅ-Wú…c‰×Ýœ.Ï…ýììËàÂèü’ñvÎ@†¢G;8zqòžÕc8‰ƒ·I‹ƒð«D´Z:™7”6IC»„OýáîÀ:>vP)±„7©¦¦ŒÒ!ëûÇ+D ( ªvàHñè›;³=wPðÞ aÌ¥÷Rÿ>ÆK»L‚àW€]ćfØ÷nìܽjaàoE°ÔÂN‹ˆéRˆ•‘B¬Ò,V‰6)R©`a¡¢u°²ÔBð¬Ä"Wí¼Ùø3vÏ.›á [Ì7ÃóÂÎÏþTÃË7gÞÒ ¹›–Y¼¡:™L¦›q4ÑrO6³ó³ªùžö×±'¼éHîM3LY‘ä~mmmwg«Ì™ß\¿¾^– l.0½¦÷/¶ƒä.¹Çã´[¦Ž[Žñ¥|lƒwÓ2úÜ»HîÖÜó>÷7§šrc3”úÖÜõ¹·Õ'µ‹«$wÉ=ù?iªÁš>÷Ó¿¦ï÷´õw¶§9šÌÏôõN@r×ç ¹ësï+@r×çž7¶÷ `Î]Ÿ{^Ñ^÷ U@Ÿ»>÷ÕëÑ+HîúÜMΞPÕçÞ@r7- Ï]Ÿ;€ä®ÏÀœ»>÷³é×ýXÀ´Œ>÷èKöw0-£ÏÝ $`Í]Ÿ{j;'6kXs×çžöÒÄ[ªõ€ä®Ï½~€ä®ÏýO)£$w}îU®¤’»>÷Ñ?ö¹+̹ÇÒGc4¼>÷Ø“¼k0}îa4À>÷?©HîúÜãP¼$wO¨ês$wÓ2úÜ%wÉ]Ÿ;€9÷ÿ¤Ï]-0Hî¦eô¹w 0-£ÏÜ­¹ëso;³±¼Ùz&`ͽ+úÜÓ¯kûgþŒ3Î$÷èsÏ­žÇÉ]Ÿ{•dðHîÙ¹C$ (‘ º`^rnÇxQpŒ#‚òy·oZóî÷ÊS Ëý°w‡º €¯„„@N@ÀM,¨=ƒÅí Øù=ÃKx…©ebo°9^`a[×Tp(Nµ×-ß—Šk/SÍ/îþ¦és™úÜã¦^*`Ÿ{>úÜãm§~›úÜóÑçÞ @rÏOŸ; ¹;¡ªÏÜí–)ËP»eþWr/Š ¹ësð%¦¿Ôç~¢îsªÙЮY­³G–b?Zn ¹Kîé>÷ãB8½­fzEžé#«´ú²n ¹ësÏÜõ¹ÿ²sÆ*BQŽmpô ¢ÉLj^ )tœª½ƒæpê¢ÇhŠŸ F_ P :Û îÂù¾éÂŽÇI~ø·&Ï]$ë”îçoï8wþP%ÏýU}§×RùDImçNž;yî<Ùpîä¹³¸À¹ãÜÉsÿþÊÍ#¶ý7³pîìÜÉsתT¥¹×\©¾ÈùÁÞý³$…q?iƒiC‹wRk¤ÉW`¸H£K4m6µù|­5(-½…Àˆ†v‰µAíþ¹=Óƒã½Â‘Ûåû™|®D‡‡‡ÃÃOe ÀäN*$yîòdãOñþ]¸AÈs'Ï=40¹“ç€É<Þo¾fî.ƒ1‹ä—g—¤‹qÞëfE˜2æJž;òÜyñƒóü9 s‡æ.ö>Ñ™%ŽüÛrP•Æ÷Pg§q2^ä³)^¹šËnS¨þÌsçßšçn߈9ÐÜÁÜ_Ù+Ç»w|îåƒ(˜s¯än=æwyÝ©øš,_·TüT–ÝÞ6§}î@r'¹[§)ë (’-¹7Ÿ»Üñ¹;KEÞìì–AË$w|î$w’{dvJù§Éäž=Ê&Êu¨ÔÚdß™jWø?©Ú³?Ò‡cûo:ÿ¤°vËØ§e¿ŠMŒ‡/ey—LˆOuwó%™ÞŽh3Ñè¬/-;iBÇìs·¤eχBùÇhNÏ} ë­#b\¼ÐŸî3é›L©ãœí¿ 0çnýn^1—O4—§ßÝ9àñ­ÌÍ‹q‘ÙWÚè,ª íäÛùw¿‰wöΘ5a Šãgégð¸:ˆPü‚¥cÁIpqRpAé&Š‹‚Fì¥CKüÚR\œäÀåâbŸ !ñMrÃûs—#ÿ»ã<Â~ñÜA´ãLv[<[:ž)ðþ+Ððø„‘(ãF÷"þû ³e4ÖQµ»œè˜F÷!kWc ³—Oe™ŸJâv# pœ¨Ž“̓¦À3¹ žLœ'‘ív}Åâš;Ë^¸W0«¤c\ zÐ'“ñ÷f¹;{fû\Jgº•¤‘7™ÿk~üí~Ä—½f¤ŸPÿ±¸æ–Ý:XNr_Œ|µ"¼$¥\ÍÍ0OîŒÏ:ét±,R¡'9d,®¹¥ŽtÐΙ½ü(”t7;³Ãg{d94-2 óLoÛfêó©©=¼Ý7½m~}ûíÛÏ ïù;2¹ï-D¢M"Sdv‘%+»^ߨ÷§ëQjÍ“hǯ] 35¼þV}ýà¹>ú•7qÙÉݺ¾<ûç'z ûmÉ>IŠ÷¹;#u…Åy‘h­Pñ!ree7è½Ë| u_8(€þ[Ȱâ¾ê»mÛ-5Ê2ë8ÎÔĘÐ!G¦‡Ø'“ÕCû3m«Ó›>x]ë"ø PXà ¹ãs· Ê·¬¡¾›Ožó»ž;>w’;VÈP ÷’Äå˰Ãn’;Xî%É$¹“Üñ¹ÉŸ;>w|îÒá÷æÝ2øÜñ¹ÿHÜ2øÜS8#°3è¹ãsÿaçþYŠÂ8ŽŸëz ^€Õ ¥”7`0ÈhP&e1QÝ’’Md¡ü‰Áb )oÀ`B²Ì&) êÆrëËÍM÷âû«Ó­3ÜSçYNOO3ž;ž;žûÓéÆoÉî"—GùPó÷Ð/[MÇ:;Ó#w®_ €~ÝÙ’oó=—óñŸiotK{Þn6<ŠëyýcûÛ#¤½!µ÷•ÔO²/ïÂ=¢¶zH®ëóÀK»ˆ?è×KöHíÜXsR†¥“=â;:Ç;«Ñ-és5…£0,šìѧܞßPÍ»âù9Ó2¨Üo¶÷qrxò¨ÜTî[)” ý?%Aå€pîøœûþÕ•œN§§¯_ºÍîaÇîºÏŸ>v{`ZæáºykCNÏ–—›Ï»rKý¹\‡­sî‡ÃaõØÊg¬ëKž-°òÁçjïµýɾ[Â=Ò§ÞÆ9^ö>®¨Üß(ßëå{ïÍ-¹ÏÔafÿòIS{¹ç$ï*Ÿ+ɇ*]–òYòðU¯Cðáüûss{÷š…¦nÓ «—%/ËüüÓ¯¾ -ÍíÿC6"fÇqŒoû—z]•X7¦kQ;›!Ó2ûZLl½Åe,ù €p@¸0´yWb•;*÷ú r@¸0Ìýþk×á~<»Æ÷X°¦EæÜîw„;Â@¸ Üã&mçÇwÓ_æ5G{jÙ&€aVü¥Û°UÜrºbTÅÀèï6Ù€pLo/ LËDÊ_ ùóÆôÈSyï³n…‰‘òðè3mÌéòk.¿˜ë//}iCýTu.ç§ç¹Å~Þ›^8·ÿ•åí+{cc§á\ØÛªüÓåiö îå7WÛKùÇ7@_=ã‚ñ³oä‚ ó#,*Öi#5†Ø{¥%µÇAòÁóðc<–‹Ó}ƒéc1‚àî °_ƒÝë°ZßßW¥?ÆŽbð 1‹¹ÃC‡V`‘±õ¯vv)»CðŒ1q`8¹=_ yÏ8s§òá(†u)Rv§àùã™;­«º7¾ñÉÓú G×ÔJ¢7r‰O"mAþÚ4冽rAcLbèR€2ññaÍæHÜ«k2ÐtÍâ^Êso½×xŒ1˜ºÔ Ú—usaïm¢(о-l§:‹DP‰D‚(f5‚¿Ë9EÜ“ü·0À/#îü@…OàÊïÀðþ å)‹ î½÷Ìß§dL%‡dýÝÐ(>T1¥|^öÖZwÀ°ª±Äq@Üwq@ÜwÄq@ÜÄq@ÜwÄ@ÜwÄq@Üwq@ÜwÄqwÄq@ÜwÄ@ÜwÄq@ÜÄq@ÜwÄ`¦q@ÜÄq@ÜwÄ€ûqh@T0œ(S'(VðÞýt·ôNVËO€pÛvêЄa ‚½;Ñ}p6à.¯2AîÜ%ÅOwm{wŒã4FØB€{€´é(·à>Öv[n±Ç  ¤‹Kè@‚{pƒe$KÕþ9B 'ß§'ÎJÎŒ_&ã‰y^žè æÜîÀ¯i8wàÅÔ„;Â@¸ Üîw„;€‡ÁË×o§¡‡ãñ8ü1ÞÝÞL¼zónÝo_jO¿•· wÆ¿³Pnw:þ1V÷÷÷Çܲ,—Ù“…;°»À˜3ç€p@¸ Ü!+=Дއþ—B¢[gíÚ~¯à}¸zŸÍ”£Êžc4_Z°Õ<ÙŽ©³ÇZçõ$ÏfžÚé²ø$å3_µëЯ­¹±Û0½7„;b='ùæžI„ZÓá™6ÏóõõõšÈuM^«Ù)·We‡h›ù6°Óø«ÃÛ4Vžª›»LöÓG”š£5Üëµ£§¤HM¤²ÃÁ{â{ýUäšûí±Væ©V˜çùÉ%çë‰þÝMSÔFõ{[=„Í\ßáΘßdkGo…};Ngðž|o‡¹ÿ0Ù“æ)Dêñ­Ðs´]ÚÌF=¢ÿøáNÏ'ÿù2u\sêoö™ëxçøxÚêVðíÀ 0£Ù?£ûëç¸g¾äSO'IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-01.png0000644000175000017500000005003010536106572024721 0ustar gregoagregoa‰PNG  IHDRÙAOßIDATx^ìÅ¡@QîŒ+ˆF±…ò_y:]òÀ#íZvâ Ø÷y$ß5‡¨MìW¿[Iöaïîb£¨ú0€?ÿ™ÙÙ¯~°¥ÈB4* ˆXŠâ•ML ÷DcbL¼1FåÄÄÄË7Ê—(za¼#^hb —Æpg0~cJ¢!M––µ¥¥ewggwÈœ}wèìf·]ˆ<¿œLÏœìÎlw:Í“sÎÌ8¨8;ø=ÚŽˆˆˆÈÂíCDDDäÀÀ[Ž¡e"rËÕà§Y55Høíâ/̪yYêm_ ¡·‡Û£?¶OÌjhæísí×|°ðÛMKÍÇŽllÓbš#÷k¶ñý7x¼¢Ž‹ÙNý/‘ßôÇöIøxE·×¬FÇ EêG³áÈãÞ~¸½ýçQý/ÜTÚp5ów>^ {™­FŸGõÏ—zí-þ¿mù<2¯oê<2[\èóÈühêÿp{Î#³ýèööŸGõOÿ¬uÏ…³HN{õ<ýâ§h‘DºG†ò=Ù‚‡"Ê¥¤º3‰ÎÎd2™}æ©M'¾>yׯ"""z~c7600ðòþãÑYÄ‘åC"Èç.Ç3Yñ¼©\,Ž™Üð+[6?Ø%¸‹QãWÀ|qü«ºý"&ˆ¬¸1TŒ%Hõf‹¶8.ÒÝ™âõܳÏmvÃü#"""ŽÑ\üä¥Ójª ž+)餕H‹m£xÓ³øgR‰ƒ®.¸)¦/| ½ò5TL }رêu4+wö ôôíDîüzÀ=ý{И¿zÀòo¢DDDÔ·~sÕpKã×ô.Z"ٕΪõ±uOÆúúc÷­°;‰m£P‚²‘í·Ý+H`x†I$ó&Ó·ÃO!Wϼ‡†-Y¿G´éÌäè R¿_diŸ‹’xŠ3(äK–@YÒõ€J­’ÉY5ö¹QS 5B="×Î ê]«·˜<÷€î‡·MüQ©¬Ù>ñûû­ÙŽHW{Àâµ»ÆOî]» ÀØéÃUdwÐ)ô‹Œž:h~©Çö¢âòÏûƒÆeïCÅ¥ßi½w„ˆˆˆqDG]‚Õ&ïuæ$D%¶BL‰ˆÄ{лIR+åÏÁÒ7Ç/–J×TB¨ ©®t>´U—J 9Š–é  "½ëvëRI!‡="AYÚ¿W#¿‚HvÃË6ìÓ~ Ñ-#""b1•¦ç‹X¢” ¯ °RHßoÜÒèyoø”7rAågTÜ…mC qÄ ÓTw4%w戙/"Ðü~‚Fœ:€¶ ""¢š1šFâˆ3gwÉ,l’•µáâø —»¤Ô:;a9w”(!LÐý"šß/¾?@£éšˆù"AküNÚ‰ˆˆˆÓWu½‘8báVDÄÎÀ΢4ëM~—Ÿþ¡ˆI•pÑщT鮃X ·}M×êmü)#º0“EþˆˆˆDªISc4=ª0éÍžñòW”‡›‚%€kÊb!’é#1c4&ˆÌ=}UO$E43v§^ìÈ"ócG¤‡Ø %ÝW¿‹e$Ô*ºï3нÑaSòÐø ñZê‘„¨Ì ‹D€èEÎÈbØ&ç}`4‘LX†‰í©/º"Y$¯Ô‡Õ“MŠ5‹À`¹¢ÛúŠW~Ä$gÀ=½9ެAGžE, ]~Co,oÄ©–Ø]J‰Š Wƒ5Œtged -æÙꯒÕ_½þ‰b®XDé¼è~î^¿=ÜÝv;×»æt\ÂÕýÁ=Éÿ€›÷öûýËf; ˆÐ6+»ÔS0°q p½,Ï—n‚ð«Z{9ËXZÀ=½² ‹È"€, ‹²€,È"² ‹²€,Ÿüí|0ÐÎN K?³7æ ³&Üðâ/aöx ]þþ=£÷æˆ ±$S9žu’¯Þ¼‹íÏŸ>Žˆú<ËgC[.o­< hç½sWãÈò˜¯5¨L-æÊñ!)¢É蜱;õðä˜Í.{`R«D—^rkëEr܉÷øø>±õ<¬.F¦R˜8òHz1,Dr½ÿTžxtPÌ»ñ½:OTb*ýSoÑñÁºÚæÇ… Ë0±=õE×ä÷Ñ\‰íAetÌ X™§é9÷OßBÕÖïð ²H>gX*Á¢öèV—ø‰_ytA¾ÉóŒ”x ú0:!µÄòÕuÐ^ÎU¨ùzŽg‹´Î±ÊYùhò˜,©=ê=–Ê•Çý¬ëàE×ý»×ow·ÝÎÃõ®át§¥¸º?lx~μý€›÷öû}Û°Ñ•ªœðrµ—4МÑ]‚¸×®5O†æ\m<àszY ]úa1ËÀþ?›¯ ~úù—ÃÝí6Í þ}-Ï"ñŸ™–íÅиÍ׿ÿöë†Í þ}eíz÷ÀìML[†«à1AÚë‚\âÜäft£IÓŒ,Íø³ãÂP#ºPsM`ü DC ²2c¼ÂĈ ˜¨ q3vBu2I74,&â´Á8ÀX!^‚üvÏ7ÔLu§?»¾êªºé÷IyrΩsª¬~yë«ú¬388¨¬5Ÿ>}RÖˆââb%£À/ç»±?•üð›-ßO}þ·^*« ˆÉfSH|twuR%ÐÛ«8ðݺ"ƒÞøfM200 ¸ ×êkkkƒÃo|;ÿàÜ|·n„€©®þšŸ?²Ü éjÄëõ&È@ºý¿ Çžá¶ý¡n !RZzjdäüÀÀ/ËÛkÚ¨§µU¡]ñ›’E>Ð"X"²@I¨'ôð1 ÙÞŒ¨ôo0@rdrthËÌÜÔ‡GUµ‰°"#GcÞƒQ²1.#/ hº»»+**ÌKSG„•¢"Oa– Û›±€ÃU';Ú£‹[gg´É1OTÑ´qZœ³aŠ‚CCM½ ‡KZ@ˆPŬ4Á®!lÜX1ƈΊ’±€Çm 1ܯy"Qí×IOd©)ê“YýgnaîK EàRƒãº#¢ßmUEÖF¿Bˆ\½r9·¯«¡¥½n_™–)ZŒ4½ª*óÛ½³†ù"b¤*•\@è¬i?–÷ðÓu½Ésù% Ð"¾ˆ "QŽðn~cøÞ ¨ªš31ºTPt£ò@Ó“Àìô|~A ‘uáÇÂMm ¡‡u²¦<Œ*âH6^^¤0ÏÑh_„^q¦Ë^ZÇDL$kòèT«ÍLTT¿~÷~_σç«Îîñ}Yšßœ›§lPŽÞzÊèÍ2€ðE|>ÁÇv 9BÛÞÊCFOz¨ÙÕp E|‘µ¸àà¾øä(i €/¢¤%¼ûH%e¢1J´Às4«$>º»:©èíU¸G/âÅÅÅŠ¸ÖPO©z)I/¥ê%]B©z|_ÀÞx¶ºÇZ ^$ôÆo„²@¦ˆßï'S„¬2ERŠñþ…‚‹²ƒ7À=_D"ÕÕ_óóG–[¡å²Æõ”¡½÷ÌÏkÚGOd®é¯ëKBÄýˆTñ·ÎV`÷ÉlSÀðEHŽX)KJGÄM_$‹¹zårn_WCK{ݾ2-/R´iz1TUæ=¶{g óED_‹ ÖÉÆHƒy??5ošŒý¿¬âZ ^D,ƒÁF…á®Á ªjÎÄèRAÑÊMO³Óóùy$DrÔ… 7¹“DWv/äÁ¬_h ÄeËͬ4E´@¼ˆìˆÈ~2÷–³üò **_¿{¿¯çÁó‹Ug÷ø¾,ÍoÎÍS6(Go=Eò^ Ež£‰— ¼tí¶7bW!GhÛ÷*¨¸‰ZÀ1®w¿èr„•Ž.²m.>Ð"¾ˆÏ·ªÑs¼ûøSÉz’^¤êZÀYU‹Ý~?eÈ ôöR†<€÷‹¼_d5àZC= JÒKB¦Ð"¾ˆS™”3@‹_2Eü~?™"dèñ"vó:Ƈõ)·ñÁ)9ëgwžï—73A¼ðExÔ~ϨlÛå£òäÏu)6Ùw§ðecÜYƒ³ñîX³ø"¾H0èßÅm„ÈÂÛ—ïÇ?ïß>MBdcøáŽÂpË™#”6'¬'û럱nQðƒ'Ù% æë195§º~£4ù)‡¾°á3ÌJà‹ø"$>ª«¿æç,·BËeË  ªÍ=ýõ‡ÊßP¸ê«Ûz_ó…ÓwÚ:Ë/Ý”RõÊÆ†Cóƒ§rŒïäéº^Úóø¾f1)_ƒ•%™üT7Q!ÿ¬žÂg˜@‹¼_„„Hié©‘‘óñÔÓÚúgÚ•ð&Å.¨ôo0@rdrthËÌÜÔ‡GUµ‰°bþ•)|­Jy쨲¢á¥Î¿wùÄdÏâžì“gÉŸ!îA‹ø"^ï9©340ðš],„/7o©ø!pøG„ÿ¹Ð"¾ˆE!"~[ðÛ̼Ç$ÆÍ|¯YÓ¨§ @UÕœ‰Ñ¥‚¢•šžf§çó òHˆä¨ ?n²*!bZ¥‰¶çŠÑ©RE>,œPêðã ‹î· ‹±ß\—@‹ø"ºË’ÑÑK7oØ»…/襭Á **_¿{¿¯çÁó‹Ug÷ø¾,ÍoÎÍS6(Go=M‡ä½QZAs@‹ø"b 6* &DÒ/ìƒÇ»ée9BÛÞ¸W‰¸¢BÖ]ˆ~F-/";"îãð)ÇŒx>pñ€ˆá„—öƒUMt_³á›‡þ‡½óym"ˆâø‹xz<)žmÿ/B…®45Ú©F…Hm0Õ¥EÅ&©šªÅTðâ_á©Í1=yðäU=$»ãtCèKgv21©›ï‡a:yû2óvSx/ßNwé¿à‰q¬>]ßZ@i4*Ñ⽫u£ÕKýý Øüô™öàÜÙ3dâЉYJ.üþV_]@™œÒÿô°´¸@½¸qëŽw~Šc\‹è" l£ )•Kë…ë3D‚ˆÊ;ã,½y÷åˆä××Êá“>%€çô<§wô„"èöµ¬WxæVe“…HÐÃòƒ˜yºÓ’òU‹ÿw7îl5³1leçF5v¹bzÇK­;©¤]@=µ ºT¬Ñ÷?;"Ë‘ç%¿P¤`à’™ølVR„ÆÇ%[w‡Ê<#Ž ºÐEh¢R¥èW‹>ÑÎ@¶vàªmh¾ý+[‰‚O®™SãÌãÑ,×G̶ñ«ž­ÂŒ¬¤ÏÏg°úàX¯Ùè"@  1w¿Jþ½ŠìŸÌÏDØp?”ð4Ì) [Ôî\ô1+‹òéô=cˆ’æ,丯ëß{•î˜ylÊbž9ñ ¸¿ÈÖÖiê"›ý'»Gt‘—믗 Wn–k!ǵ¯f¦/ö§‹°´+­ò¼®ëÚóC“ì¹]GйLrZÛB$“ù“N7i‡í¨ÏüÖ¥´òyú|Õùv±(Ö®6.âJ%ÌiFM«u`ô±fuªÕ±—ÕÉíVgê4Ý¥„¬f¯÷SØëÜKÄ"à4ú’<ûší.ù’œ°Ó:_GܦoŽðçf®]Vçë=÷vë9ãËÜò§ÈÍ|>ÿôþ Cí"ÍFìˆE@^DÙHÜUßs¹õÌ÷Œ¸ñ8ú¹±Yûô·FbŽÍV¦x¿Z+Wt—~núyVóŒ÷ b9>6Sý·Ÿ¬‹€¼Wß ~È´väEŠ ˆE@^dOÄ" / È‹¨]Ï©ªaÑ2'ÔrˆE€Ð@äääÏÁÁl½5]·ã¼ú@,ò"ˆ½œÍ^-«‘óów«][O")þ—\#! !ˆôíLÉpøÊœÖõW‰xmŠb`2™¢,ËÂ0-<êÀL€X Ëå²Hþ’<ÏÛÝô yn—gé- $ y'­›¾ >Ú™yc¿=xPt0Xs­ mUQK^D¨z­” ÿ)bé ®ßQ@^X.—zfS¾ªmUz2"® ¥YôWÖµÓ*®ß/@^¨ã+EÒõêO:@^dGÂËTµŒ\ID•«§E¦u ‹ú÷][]Ÿ¹Œˆ´A7Sì;,žÎ_öîa Àð‹<ô Dpñ.‚‡r Æ¡Änn.B^-ßG( íáí÷;×™ Z¿ÄÇš9 €Zëâ^³«€Ð"€Ð"€Ð"€´€´€´€´€´€´€´€´€´€´€…`­-h-h-h-h-h@‹h@‹h@‹ÐæõŠ E(óÚuxh-h-h-h-h-h-h--ò E Z@‹Z@‹Zdñ-h-h-h-hZûì§)º-B)Ÿý0 E- E- E- E- E- E- E-h-h-h-h-h-h-h-h€-òO€~- E- E-°lp»^"8œ Eàx:Gp8A‹Àóq߀à æE´ E´ E´ E|_„7{wÌÜ4 †q\Ý´ÜñQÊt‚oו­ | FÆŽ0øܱ—$&yí(–-;‰“ÜÿwÁUI6 ä9Iv¬Vcf­¬Ç)¬VP8)²ü{úP4¨¥ö7¸¼pzdhD/Kw€ý"?g øå ¢xèĹ£3µ]м0΋Wo6¯àF ˜¬Û˜ÚM9•l ®le!߯Ÿ7¡*»A£e·¹|@|©ePøPmC¨N7UÙÀP²‰#‹ÂVnðoà½âãά“>K[¯óÏ.@þÿ êý=-ñÎP) ý×FÜ ®I„‰–.^¾èd‚HOÒdwôxM¿út0²=nûðppüe—3O$@Ö/§`6$‚èðûT´¿SkŸ À×PòÀ,BQÞ”‰¦}ƉïJ‰ËI¾‘E#–f•¾ä(.e±È"%>öb6e}fÙ§STîl®QË1õ̑ةº£A¤­Kê,Shñ_ðíË×?¿} !ü}~ö å®I™6ÔÑŪc£&C^þHÍšÌ~-˜Ì|øøéñññ*“"òbÕ}ä%GPT“O9íäå¼Ðp˜í¢ÖhPè±æäe>{,MaŸ>шñ2{+vf€,…P¬h,4H©¥©{ý¥›ònð± õÉ.©Ñ]êtd”ë'¥Zô]½¬±¬—ø­O·(D Ųg5ÔÝHÊ‹<*ÂDdai®öé eß±¢¨¤ÍQQÓ þTê¸^ Ù¸.àþþ¾º!æ²[VM«Bïßþ¯^ùéߥȧI_GA)îѼAÇÓ$ÙÃù¼÷ö”æEx²YD”xøzgÙ’·Ò¤SŒmäÅÐA*ž?”Ô/¶T˜‡¾ÂÙü9,)¨:¦c€E5Ñ%T4î ïŠ+7“úÞ0S(”ÁJÙ³b^áWà˜YªŽJeóR¿y‘˜‚¢1•A,¨¾è"Egî ž?®Vùc&»)-Ô†=Y>¢Æ‹óRö$†¶r„«Nªhµo«µêê _Sré»|}þcñ²™æ7¥•E¨3y”™€,Âf¯éEµ™uÞ;㧈SJs<ÿ¸5’VÕJ¬©m d> vUίŠb+½xܱ ’€,B )–Ǽg‘¥EÑpï€#OXN)4¹¥\¹}XKOHSëÌB±2.á±aÙ3ž˜SÑ‚øSìÉ'Lƒ!ÜÚPCéØÚvJí=wÔ‘qþƒ¿1ü!‘¬KP fã{hR™@k\n»8múgÉY³d!¾jQ[$Û›ÓfÊ}X?„l¾mh©$Y/Ô|4{*{«÷ßœ‰X¦x´ÍŽÓšF}Qy]­õn× tŸ÷ß+¹ºv·E”À4¢Ò䮿¥¾ÑC¼ÁYçÀªò˜ßT`Ž˜ b„ 8@>8ªE´hçl牃 ¬zéüsg:o"ÓÑA¡Û Ò¥ÔYùµìn.ÍJIÙÏ=¦zTÚþDÁ€ ÙóÆÞñÜŸ»WŽT‹¨R„m4”ËÛÁU…HÓö­ó·CÁæ¡þû¨@ È˜ºp B‚ îd¼CäsK¸=žÐœqÙ5µ¬jR2uÿîÌkg<—.ò±NôãÙÑs½®äxSŸ1'¹¨m’òéSÝ›„Ö­Mmߪ3o¬øyÌ}~ÿ”¤5g(¥À£Øh”@Z…¦*,ò'8ÇâPžËãÌ^ÃR|˜¦b,¸ä”Jd¡<ëôñŒ¡4ˆFÈ:¯Ë›g矯æâó±OG ‚˜ŒE¢˜]iïζù`÷Rõ>”‘œý¦±ÿ@RFj;vßçã¿(½LvË?8Q¥²RD,Y9HH±E†…ÁÀÔн9†%!óÆ(dBéLÎYCž|“:䜀Úadž’˜; u×ùoyuæêLGEâ}*“”ïû±æÍ´E7 ­+¬!,S9ß($$›lö$•3\9â†Î7õÜ~*ö™Ù´É!äæTš,“NÓRl=‰ÞguÛÍ †ŠCn݉[ð›k¯w=>ø>ïµWòMXïDìOðïþí—ßÿñ×ý=Ü\~÷ËÚvJhJ.ZÈ—iÑTkRú( d|€ÌÌ…H¶K%4j¸0BŸÆ)>²¹ù)T2 ±qúíÀñlQŠî /Irõ¦óiê!H¬iò=Ôýϯ¦EþË_?þÜÌÓ«±‰Ž¿'rùJ© g{“Ç'Ý«3¼PÁÔþ8™Í¤„PT ´ üS2i,‹Cu!Pê`(—YL`˜Fˆ?%_„÷~÷sY\CžÐœ¬1Pϩdz¿^ý³3—pyÓ¹b‹ñ çx/!«F¶“Òñ£™)))ѽÚßF£Ö™åˆïT Éä§ËÚ€ÈÇéÙ]Äit 2—3xKÞïÈg `°7˜êÃ…ŸÒI@CKInH`©çοt…8ʺ >âeB½Aè' ¤±’x&úJé쮯¸î•boÆ‘G‰DÿI³æH}Œ]Cˆ”‚”’QÃ9\àÐxï|`:_  ”æ/Y0£.äÉ@™j Ø/Õ¹D®˜cbç>{¤²SÈbù)®º))))))Q—U† 2Åî2ƒ2ó.0Ʉ̺‹'Îè­qÖsÞå§Ä@$Ha_Z4g0Ÿlš2Üô á8¯Þÿïj^»A\,¤‘² âvw† JJJJJŠE”0ˆHZ"(­3`‡J ˆxêÌŠŠˆBÈtÎ_À+hú详t•c§>!~²5øvHãü—«ù~ø£#ãœq>^†z[ÌL BG ê£úX^¥jãçÎ7&ó{|RR,¢ÄJ‘J6."¸˜!of—)¨‚™™eÀ”/æÁ\w½0Ž š¢±&©CÐ|²ˆv9´ ÓÍ(äb¾wæÚ+BœÏÞ©yŒB<íA/qîú®8Ð~yÛV…(mÊR«¤XD]Vgê Z"+5¼\a‹ £*HåL…%lèA(’¹©Í@$]Ÿ,ÀðªœÈÀ\½¿Š¬4˜h`l—‹rö®uùÖùŒB.éF®©¯#*BÚio¥<ÓÁç¶»zÓ¸Û¶T>]„Þ·„v.\Éiv²-si%ùjsbÛ&YÏ"[%—Í·fÏi/MŠíŸÑ÷ñI±ˆRQ;„B¨¦õe2:êÒv(ÉX ³ñ'SPõÊÖ‘| «C¤]†£«‘7__# ¹t&”n/„vQ„´C€oëä‰sÕ76?U~k²ØqÓK%Çú†wÊR«¤XD ‡ §’èv*@´Ä©âÂóŽQHn¥À,69¸k ‚æ áé£1K¥Ä€ÿvõ߯æ’2…D Ïæ˜Çñ9~â\îù޹ywY»ú:´êcÑ^”’b%4XÎÎךZ-?D5ŠVÈ“ñçäÃÁºâf0Â%Ùl”)çeNX~:îåj¾^ý‹+@Äûx92D½-æ`(Dú7<^â\©Ç~€¬ÅzÔE˜!Ž¹Ø¶j䯠«Q,¢@„±q³X£øo1Ô;ߦº$:›œÊŽ:7VŸŒå'Lèu!6”Qã˜Y{£wo¾\ü÷μ†Ëç¦(d<[ª¦lwÃ`Êg‰óF!Vm(ÑÛ¾Å5¦b¦€TÜT1\±þd3ÁEÐðÒ™¯½]æÚõ(Ä EH›¶‘§ÿnÈÓËê Mœ«‹Ý[)½=Rô‘ºî±²Ô*iž^%DƒüIßkA„AF”ÇâSãEÖP`8_FÉ,ÆÂ@c ’¦ Ò9ú~¥¯9¿¿ËT ÙAÄ~HÒĹJJRcñѤ±ã”þÏÞÙ49Ž$éÙ=2³ª§§wV«ƒd¶ú«sÕQý)d:è?Èlg·gº*?î‚;"à#™ ‹YY™Yï3ÁÈ Ô˜ámÿŠo£=Úè) ‘6‘Èô!!ZN•D—ŠDgA’l¤&D”„h( C™´xpô©t_ŸÅÝ›#B¤2‡èÝ(Dö¹pˆ ±¦Ý7‚¥wßÅà®×¯k®®;’~üÐ"ŸˆvDeÄ+½ˆÐ!‹­$ÓD Žw’ÒÂà!ô]9Âô l-H±žï]‹ø÷¨5"ý­Kýv£g«.L.ªç 0Õ°Ê Jj³>Š ½Ü/¦Ë»‰}Hz’GÒÖÉo¦Ï{úû=ý££îÃYDÒw–#àQ‡Œ„Õ$öÎJ‰½5L÷†(ÝïMˆì7[âZsj|·¬ZE|·0=Q§$B·D§¼^ hjJ‰O¶ 4ôÔ÷”joè_~£?íè?FEÒÓGBèûÒK‰ó¨™Mœ{'RyS±‹p™üÐÑßöYˆ¨>í‚ò3RvcÜíÅ&µöê?Dy@M"õž†RJt hØ[㺹¡ÿrC¿=Òßè¾÷Q«B¯„„Á#¤‡ò(ø4Ö,>lKœåƒ]o‘®ÝÕB„¤Òrfžm§4ØMJÛ—ÐúmRì")J‚šibåØAHîih©ÙÒç[ú׺ßÑ¿=ÐcOï—ô:r$*¡Ñ WC‹!JjÏ?•ðêfªÿ÷˜víf^çæXˆh-AHŸWêBD4+¦ÿV½Î)£Jß h‘b ñ¤6Å6Ó@=Ñ0ö÷Ôo²"ùo7ôå‘~4Eï̪.Ö&ëæe/iŽÝI¡$ÿöHû¦U×/"EBˆÄà¬y"åLuïÌ¡ ©Ðïm-ÂÞ7DB,¤MV!Êv¨%÷× ;Úí©ÙPsCþDº¥»1ŽäÚHÒ+{jJm%Dæ~Jºâf‘ÍËn¨¸ëéž7²(KR©×*$¶9¦Ñ^iÐð!1QK^]GDéÛ-oiå5¾ƒó|VOýõ{ÚßP»19òË Ýu–ksß¿›gòÊžš)޵©žwñËhɨI¥Ê±5Qú÷>õœ´Î—ñ]rZ…ˆÆÕ~™8c㿪Ïè‰W EBŽè2|„ˆK²) í÷Ô õ¥-mFErC¿lé¡3¯Í]»È OM¢6тŠyÑ3{#ú[G»Ô’SHäˈoë™*D\ˆ¨†¢¤¹ÄªÖyÇúŠ©4 Ej9¢D² ;)•b$Ã@Ýžví:ÚniÓÒí ý×-íz['åË# ‚ENޏîK¤HòùÚ„`™%{_,$g“hUg~bPÚÇÄù|Ú¡zÐÐï$P@‹Ôá á#L9­C¦ÈÇÖÆÜS#ô(ô0ÐCCÛ ÝlL”üç_é/ŸèËÎI'?Qͺ¡EàÛ"Â(2ò{G{NUžÊ©¬ë˜jöJ½/k›„wF_¦ ˆ^™M>̓ÜK¬ËKžDõ‘2¸Ú[sE²§mK7ëÿò ýö‰î:S$÷{È£j4›FÒ“ŸC3ÜI’”·•2Rú…wFYè)¤Dª&râ4÷ΜiäxE>šH!GÜYS‡äƒÌÖ'±Ö Ýô¸§[—#›6·v=}ñP’^~Α`𜚌óáÚ4á¦yè©OMë˜*Eá–3™ðˈßj}Úæ$HŒtù»]h‘€k9r"|D‹CA"Õ6{¡?zj[ºqÇͦ1QòŸ~¥¬NÚ×=ô?§$L#­?Éc4ïc i!A4Œ"|”¬»`¯Ö¸"d´Oÿzp¹!$TˆX»Ð"µ‰ V:Q}äðÈ”ú¨_ÎD}oŠdÓÓMë6’†Ú†~«’|23ÉÝÎtI'¯¯šÞŒ†œPùU( ÌII¸JoÑHr ty«¨ëÄ8B$)µÕY×BB…ø_Ä‹œ ©Ó}UJõ‘2‡ý³(M!J{?ºh?P»ÏÖ‘­+’¶¥¿lè·Ï´Û›ãæÁ|7?‘u¤Új$ÔpîÃÚ$D…’P-º…9Ï+Èaªb¸R yüMBDOÕ–/*DK¹àQ€¹LŽè"|DÕ”üND½§ûî³×†5Oßõbm×SÓÐvl­ ÚD·[útCƒ˜(¹QòêŠãõ+±ž0Ô¨÷ý@QhÕcÊ6ª‚C—A­{1e@'ý/áÑk$ˆ#.A†yó¥TäôêyÉ5âû"|Äi) ÄâÞ#RgS¬ïýý%=í{S›–ÚÆ[{S$ŸoLˆt&JlB7¼üë?Ù•¿‰Ý>ך@­±šzó š”…žÖ‹ÅÔåC„dyˆc£æGLéN¸cÂ4r… -rÑÉñÝM$ÔÈüÝ^}¤'›–üèžhG™ýT³•©q9²IY—4E” JK–)¡ã È‘Dv§LÙ® %›&/ ³µ[VnBMÔkðjì¥^­I} ‘;³^î]Ÿš&Jýòˆí¹Ð"—˦‰ˆfÕˆOHåvC %oLᯗÿÀžÌ$‰št,Jn7ôik1%ý`ÎÇÎú¾'¹Ö4òãåHJ”d@j<°wCMë¿ÝÒÐ-Òl"·‘ȫ٫בfm}]¥’*M÷¥œ2 E®—#>ÅЈ‡4oz+~™3Q¢æ¤Á£¢rÇ¼Š -r¹Ñ¥ÑâwhüÍš\”øïð`³’F”hG^%åj}b3l¶ô'u]2¸"Ì•ÓÖäü¸Q É«é¦ÍömC©-UÎ$ž$Å0ôGÕ—0UQ:U"œELŪ;æõCC@‹—XGŠÐ`‰‰ì?5°OÏõÕ¼J &«ï%]ï¯ð!®©ˆfj[kŸü‘,GöSëít’E’I´@^Ä “²„j[ëݲÌßÕã öˆjTã÷1T÷ÿë(qxgVˆì˜à…†€ ñ±VwDk³*—œ'óä¸áœ_Ãåýèù5AýÅ}ˆJ.Gš”}7 ÛžÄÄÞ6Ún§!BƒŸ;˜FqoƒäµF‘k ÉO×ã­i¼÷Fvmµµã¸¾j]©L‰6¤¬¤Ç~ sÈùBD)Œ"t¦;æm8e@‹¬ ®2HS$×pòÅkÂæaã>ü5ÔøžÎÚs‚G‹(!%þ²ç°—d`ËYœ%†—aQ¥A³±ÞU‹f3Éi¿‡òH%UlÛI»ƒêò!±õuuMyK…¶L,ªWoÝ«ø”Dì>Kˆð³kài1„èÛT! E˜HWåˆ÷²(Ÿß–ï`ÒÁö³m„¿†%dÊîÄ:}õ%ˆäô‘DEˆŒ=‡A‚¹D«Ìº$wY´Ém2û·ëSwª§`áÓ©¯ZM®'„`*YÒ.”dÈIÑÃ$­I~DuP‘åå¬sÒ“ª¥XA Þ^hh‘uãt,PX—ѬBÚf« ³7›ã­ éW $õ´û ]’x1àÙ†‘]Eá"Épé”ô„ôÒü©FìÑZ‘Ä0˜nYó`é'_­fC¤Ã0cN ZלV!aY\}‘ B'õFoÐ"5|\è3œ5ìÉ«2Ç_†Ÿ‚‹¿¦ÑȦéW4OaE—D)³(œ8‡^öÍ R=!PN׿Ðg«¥«VÒJ½C¤óÅû£è™DJV9ÌXÊãÊrÄÕ¥v±§rǼ§ h=>º¢?ÖåH²±r,^#LMôCL<-§”"|ä<Íóº„BšPòžá¾?_S‘)éégÀœ½3¬µÁÙöÇÑÐ%*ô¤r‰~9h\EmX{V=ÇovâŠ"dU*wÌ›vÊ€]D­»"š¤®`¥âI]Žøë–|>Køk"ÝwÝ_³ŽØ§J.Ҝ泴—¤D3ÌeàŸ¨ýÁÇW©%øCcEË :1ˆM)1¹ccÚ©”ªR°±ƒ^¥ü•NóÞWù éi½ÀK9’røHjH5H"Ýw=|$ÆßˆZË„ŽIåšbÓ÷D_£ÑËr¿êâ¼T憾áE=´®*Ñ6?9Uâ‹oOª{{ß¡! E®—#µY¹!|L1“™)龜Ï[õ×¼<’eJl^†¬1Bêpìi˜Ú4;UŒ¤¢Ü”¥óüк ÉB$~ã=…†@¼¿¨4á¥G<×W¥DiÌ 5m ñ–¢ZüJØwA¢€yñ|Ò¤BxÛ3m¹öUQª÷¨ËÑ8™‰øý„†€©ÉË[J8ËŽX¿&%’É¢D dð´I燼i¸"†OEÛ8f0gïŠ*}bzTõ[+¬ZÒ‹#únCCÀ.Â+95—Q癆³&¬#$Ù0 Sõ‘Á1{/ëÕGèÍHâÖ«G\ˆ¤åCÖòТ»iü1qí‹QõÙ B¾½Ãа‹è‰œÞ«E‰Q)VR±1KIŽ¸Ñ¢H"šÕZzŸþ®÷¸ áY°Ùg) }³§ì¦QkލZOï;4´ˆqej óD‰^8¢±É\–W¡¥‰ïŒÅküк¿Fßžáå¦gí>mŠœaoRÜ4yE<õ¾ºÓD$ay·¡!ࣉ>=+>ôê8ÖÈõu9"DÛòš5q.'ê™ÚR m_ÎÛ½Ÿð¦L8eò®Sr$JÁŠºD¨z­ Q¤ïq•¨»ÊDRü]Rl¢÷ó²äF¢T„ˆ ä1$®Z×ùÎÂGå fka­`ªniÔÎ+³H¥½½ün2à£1ÒB%Äx!V^t9=ñ- gz鑤$B©ÉÉ5†-ÂG¨yþš"é!ÂS—õÇÞŸ|ri¢L·d{ääãÔ\Yÿ]«Ð"*Ä\)’ ­Í$ñÕGtY•Õ÷pC:”\_±Ël†<Ÿ™hY›•Þ°akea&>1Á>š%Dì_ÎK*BÍ©ŠïqBÿ~UØER åÚGCa&1ÒúÂõ^RÁzBŽ4y-½ühY϶£µtß*GBˆ Eö{5ÇZ*)+ñ¼Ê?[ÓTôÕñ­×‹’*pÄþ„³FåÈoi’¢[”ú| ¯ì¯ë]1´´i¨ñç6 e¦U˜jÊÃwEø S/:Ђb-²j…D(…"!æÜSÊꄼ¯Í$uˆëõ0“Î6˜Á7}§Ñ,—šÓ\—´Õ¸¢–¨9"$Ål³mi³¡–©h?ö¸zzbåš4¶DOÖ4Íæ¡hs·^l¼ Eâ¹µ+"âÊqãƒ:Ž•ô¼‹Ó…˜]QÙ4g}i_C¿Y‚li»¥†I”v;Úíí¨«µx =¦ %ÛìýS=qŠ©H"ÍÀG"°‹tDË‘›CÉ$G4+VJl=“Ϧ…™$ª£*QôU=’½¤0ZÈ R¶qJy=R»ì¾„›èZ®oŒÏöÅ´-}Ú˜!¤ !=Ýíhï*„(„ˆñ­±4ÉO*µ¤rDÔµÈû´H .AÏCÙxkÇ^( 5eE•ÔØ˜q“ $K3‰õµ(1ô‰¦‘,AFR*A£)2O¡¡8k˜2=‘\,GÂÒ&ú|CŸnÌÂLƒR·§‡ŽºŽ$’ŠæÊIµöCQÉ]s¡—”âDõ&óæG2Š€©‰dEbãD´û)ŽÄ_ó©­Ì$åUì}-JNxò˜=7”$âgNy%9 9B,KgM”9ißìp¹ié×ϦBL÷(õí:S!ûÎ&PZ„í¦r³L—‘¼Ê’2-›úaZ åŠºùp€ ÄZ¶‘´>h|Њ š©¨+’&—øV¢l&™ßÏìõÞгk|­:m8ÊŠxK6$hY6¯a2ÂYc}·Re-Øx^Ìç[kœhsÇ<îéÁâB¢èG°Jˆœ_Ÿ'ñ'Ô‹kZJ·ú EEèÃZ¤öÚtni²ã&{mRgBd¨â[#š$œ)Þ{Sõ­H=7Ë&V±áäÎ×%ÒP3䣫ε–Ù&k7 Ýlh{C©5ÒõôØÑýŽC…„‰ÞáÒëšÜá²/Ô ¡Ç®XPDé£Z$Po;Êim±‘¤ßÚ$§–ØÇî²)Ñ$lóB”8>(û×R°Ö5³§fð=¥8˜ºB²e›Mí¬‘²ç&ÑmK· 5l·Ðn©Ùxh꽫]öÈx »Oe9«~LÛ+õq¯òl<ø^H(‰ØüŸÐ"µ"éüEžŠ¤Ÿt‰xß»¯Áã[Qâ: ˆ¦`(~–DëH.­bGÔÇ%ä“Ä6%Kö×$»hJÌç†>µ&D¶Mv”¤ å¬B¾>ÒC¶'"U¥"릜 é$TˆáI±'(BPèç¬oZ¤Êæp!áŠ$BIü­/Ö²™Ä:%Ýq%ÊÖ‡Œ¨pÚe£+&“ðe0©%DY—ˆ½¹§©¡nÝ ã6h.-sc'vƒ¥é~y0Œ† "N7 ‘eÂòš9D\…ô³ Q3w%]™2É-(%ñKýHüÏÿñ߉vd€¹ÆLâ-…(¡¶£äÑ$ ¹()!®#Ì‘ÌaO —͹1­ªOU¡ò+J¤±ºÍ¶¥_\4-%ö[Ôfn?ÛµõB<˜ ¹ï² áTÇ™fR ‚ñnD¤“ ¡\G.Hke{˜µI2} þú׿RZä:3ÉÎåȶ¸?Zr‰fÿú8´HÊZ„ðp^ίF¯þQZ¢åôD-{ Ȇš6[M”¼Ÿ²goìP/&A~¿’Òrá\oN˜CR%5”NÒg§LþòD9û†‚N©ÿˆEßÿïÿù_”-"”IךIÜ@âýM"îI%˜³o‚%máDɺ§C@—Q#ê½SÆ«Õ4[/…2™7üP¥´¥vC¢ôå‘þã+Ýu$y¹ÿ'#_f™¢4#1IˤLRbl™³k¦– =Ñ]?öFºZ!õ˜8ß-ò½‰”äš›–~±æ5ÚqHÊð"$Æ¥u[ÈÞšíáE ŠÆeçÉñõœÅ‡’ šbiVœl>ykëæ¡oUñÍb €yIE"þIÉÎøÔÐç–>µfi9'­…÷$Ðj«”r„úö½ÙBFš.†T͇"W˜ÔeGeժ֙˔Çîf§Ìé»3R\LŠ!Vå-²Ž”?é9Eõ6,ƒÆõÇmKÛR}5eOJ¨èù¸Üª³é3‡HçÈó×y(JÊš5SÇS›ÉNéË@úÑZ|Ô]A\%-r¡Áƒœú#KdÆíÔ’§¨GŒrd¦8!A8^êág„öíz"*Ô”S8¾¤EeÎ@û5p‰i5%RUr³ù÷j¡!]´+ôˆ_Ð""ñ';b² ià 3-ºA‰x!D)5 rßÓ^rÌG[2qØÇ¼,JÖd]²ÈÈÊ%C)¶/×Ü“1ä!Il,ƒ\¡?®v´Èå,%È&ù&[˨w%-6yϺ!ªÄù2J&>ºÁUÈ`§ls"®1PFÊfÞk=XñŽC M}²9*4üXÛ„-r¡ñ¾IÔ66æ”+ˆ 9d>©ØPˆ¡^DL] \ü¸–²<0±ÿ)¨Ží‡†²ßúO h‘tî»=%û$¦¦±žóé\T­ÆZ6T—”DTDNÚ&Òõ¶¦JˆˆA?¥ŸÐ"kµA“õ#Þ1—ÅýYëâì5•þ”D‰tV!QÇãJR]ÛŒˆÙZ¨·àIÈ -ržá‘D3z–üRUëeÉõr$¾ƒ©ôì‚D‰´ˆž7 -’Êÿ²#æ$úä=yØ !#¤a 9%%®7Šðá.U¢€ö" B‰SäÅ’Z;Öã@ªâ©"Jƒf"+–눼™ýq¡!È ÚU ‰ÇFcg;×Â*õ¼×¨.=2bí|ÿHž–® ìíG‡† =%A¨8bˆ8ªªëÕY:ÛAl‘¢Þ}W„8gU"êˆÞ´Hjs=²ÒYЕXç£Fôhöº yqëûD&.Î ¡·4`Ùä:éz¡ÕCÏÙU2wE„"A¦âå Ç‚6ú¦Ódøhø… s…±&z­ ¹< •½…æ# ¼ÖÛÞEÕ²P!¯Hú *€ÑÓ ª1GÕÚ+¨ô¤9D­ ½h¡gÑõô˜˜)®BôUl!©ÞŽß}ç°‹èÚ1]lU*ä…Hbëå:eh½DŒh5µöšž‘t8`¿ú°‹èÚ‘Úò#T#0åC@‹èÊîÌk:eôýšCО-A~¸G¦6‡ÐÏ£BÄ®Ö*Äû×$ª¢>.´ˆZ÷vTH „H­ÿ }³™Ú)cˆµþ?»uhPT°œ!,a Q0°ìNÕþ›â 7yЕë"Ãn„@ûþ¥N#ôyGܦ¶’¼cÓµÿìݽnÔLàån@‚ޝuGIÁeP|%]”.eŠ\%ݶÐ÷ƒ¥G–ßÝüh¥x<ù<ëÝg@ɲ´lTõ%-pTÏ«ÌQ3#ˆô"“Gå•å¡¶‘"©l#k”á2×´r]$§UÕºµ*_ŽÔø©Š÷;óäc|·Y -läõ”lTù[u¥“luhsG›ÓÉ9!Ä‚J÷Ÿ—oulÛ{\'òfÕ\ù¨Ñ®ÑœßœòWçT×n:}Å?C®‹ô/ƒK+P-–ìB®œYñ½”a³@6§Zö8u¿Hû·Fj|9'ãH'K#§[¬í›BòÆÕŽUEÜ ›O~ü,H$µìÑv—r0GJ}·Þ:\^jY6¿¸GµëN–‘¢RcŽTQª 9­Ãb5Uš'•8*¾'ùäKŒ’EòÝ¡ó#û\ÍɯÊí·s»ä¡œÓi';]£öcÏBäxNëó Åå;¶ÛŸ|’3‹ä‚Ç3·+ÔȧÁVàp¿`™5bã{TsòøŸ ‹®Ñø÷€,hÕÓ4©]§œÝÆd@«Fíœ,pw{ãìöÈÙ9;÷®È"€, ‹²€,È"² ‹È"€,ø;½Øc†A³çsÑ ª›øvà˜ؤͿ*‚ ž¶~ ÏEÆGøo7œIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-boot-diagram.png0000644000175000017500000000763310536106572025302 0ustar gregoagregoa‰PNG  IHDRåÆê3PLTEÿÿÿëëëMMM²²²ÇÇÇhhhééé|||ŒŒŒ½½½ÐÐÐÙÙÙ§§§šššáááððð l(ƒ#IDATx^ìÀ ‚0#Ø?-=ßý{g £* DÑ ( ®îýÿ¯}i–eÒ7Œh·ê9‰6íÔ2ñ¤QÁdïÜl° X,–%3%.©’ÐHôÝú+}ÛflÔK7$ô°lvHš¥é+·¬Dÿ"‡ƒN^J-ëëð3ÀÙ¬?[§æ§Òê`µÞQó@)4èòNõNCªÓ1…¹¬G}}…£/³ƒz³£Ìtô2ZžÍoÛµí¯lÐ9ë8 Ô©7©±^ݼl{¯l”O¶,G;-{%®Ëù#XޱQ—n®4úV³Üñ¨Q'uô°y4‚eåè^Ãͺå;ær¦ü¢A[šËÖJ2I­…¹ì϶œ‹½OóE׫¾V,úºy]ç‘uŸØ’F[Z—­“»HùºÜO½|”µìVwz”Ô,ZöS%Ö6Më¥êç>áÎMo¿b›¦ý˜¤ï̲Øèd56ÑJC7÷òQ|›Ÿgy©©Fú;qîKZi­‹®Ñˆå]3¹þÙ,OvX^i°,­DËõƒeW‰f,–ËU€eɰÌ\,–ËÀ¹¯r`øN ø~ø­ð»¯bðNà÷Øïÿ­þ'U?Xv0ŒeÀ2`°\,–Ë€eÀry° X,–Ë€åý`™ß`ù=À²}Še,Û›ƒe{MËXÖS1絓ÒSy®eIeç~ýIÕŸ‘Lõ}ø•¬Ö¤êÏh¿eY*Mêe3’©Ê³XR•IÕŸÑ~ËVU™Tíí·,+ŠªLªîŒö[–FÕ'UFXŽ`YVU™TíaËXƲìP•IÕŸ–±Œe,—GÞpý™e%v¿µXÎÑF•³ì]…e,oƒeù´žæg›[â%-'ò,Í·eM²½ˆ/·.§"KæËXöÂ{/x-lÙ‘oÓ Ý"ËÑ›f{’¢eoT¢”å„bËÑùZQðè«^˺kKÒ¦¯§YŽEhÉMgÙ¯gY¶Š í±§§ |nô®…ÏŠx–XÎÐd¨<*‘Q–%eEˆKã4²)2=e¯¹Í²ª³¬÷²׵倿xX·–Í„¶°?@k¼£åx(»,;Êt‘1P™e,KÚcÙ_ŠÍôë{OßÕ²öÍeÙJ€u¹"ËŠ–£¸Ðyky~æ1¶Vzú1¶BC–úÿàZÒÒ1vn9ïì/wÓ’m[vj±ì¼…åù8/iË*gY’ùa¯Æ¯s½¦É²·?ÂrØ–Ï)$b ¶¨nËSª,çk¾²jø:×k±}·å˜ÍúùXná;©ønyuå³¾,8x¤åEPk±ˆÞ ËŽ›–%-Zööï±}C’òöÐÓs”¼ÀrhÞ° y·‡Z[X>q¸5ɱ›uƒe•ÙcÇu9n9qãy#,Ç}¤Wã{ñGAÞû‰Çض²Çö@h©Ý2ÿ ÿ Á2–±Œeþóˆe,sÅ ®8åz,cË\Õ«ºaË/{µU®¶Ê•“¹r2WAç*èÜÑ ¾Œ>ôî$Ü„; q§!îÆ]àþ»TcË€eÀ2`° X~,X,–Ë€eÀòcÁ2`° X,– –Ë€eÀ2`°\,–Ë€eÀra°üÝ:Ja Ú½ÁÜÿ´ýPØJl…´±Ff–¤"Gh¸WvN9fe_§²Ê*«l*ïÊä9J´Ãr'ýûLåŒ_° °ÊÿIe¢ åFY¯ûªZnlFžQÇñ`¦³«Luµ£j÷í9rõGnœšÊ9¨r]åvÔú”Œv, ¬2@Zo€2°œ²Ê}ö7F ße~—Uæ£2iÈ𙥔UNÒ hÉÛoì`ôÝLÌVVùl®ö‚S™}•U΀¸‘²Ê¦²©l*›Ê3SÙT6•MeSùºTVYeSÙT6•Òʦ²Ì±ƒ²©,s¬¥Ì¥Å¹¸´[<OöÎhWV†¢½°þÿko2Ä”œí&v¨¡±ÑAL>½Næylî dÊß§LÉE9by°M(àæ*Pï<Ö;Z¨½j/‚—P.ÊE¹(×~_µßWQ.ʯ݇³öá¬=ukOÝÚ»öÇ®½îó)ªïVÔw+ƒæ?{wlÄ@Œß€ý§¥¢¢†è‘o·‘réƒÆ?)RùÏÙ3QNDY”EY”E9eQeQÎGY”EY”óQeQå|”÷JI”{G¹ Sþ#Êõ Y‹½3Êq†¡ {ƒ¹ÿi÷õ‰:(¢±oU vÙ1£”Ð4ö«¾uïoÝ{WÐx5œWÃyekg"¯R÷*ugœpƉþÙcœ=Æ™ œ Ê–mÙ‡Ó–»Ù²-; º³ Û²-Û²-çµoK,ÓÂr¤aÐ@wËbæ9–©°w´×Þ²@ye[UÔV'¯²L$ԲȲÊï _5þATí-sV¬´Âò¼ŒõJ˺6ãË#ªÞ–¿þ]­e–XŽR…÷dËŠ„>–PkY0|€Z[ŽXZXŽõ5 -;7Ïx’j_¡Rm™‘ežð©MÆØT÷º`ŒÜ &Œ±ßý 'Pµ’È–é•'²åÉO¨<‘-Û²gzAÙ²ïËOµšÒ³Êü`ŒÍ„% O=Q¹å¤Ï»Ÿ—™¶%#¢QÞ²-Û2ßÓvŸÓð5±¬Æ0› ûíüusÞ*¯TëÛØë²mûŸg\ÓÖOE¾ÝÆ…•ê ûŠÜ§4GPÓåUykëÖA?3&ʹžä7¯›ù¢y´2å,Ö¦óÚ£•íÙåöì¼Ø¡\2eÊ”)çñÊ”G’…ò¾mìz” ¯L9ç*Sž%”)ûÎ#eÊŽ8áˆý•)S¦ì¨nŽêF™rÿ£­:Úª#';r²£ ; zÿ38£Áùg'qvgr¦!g sÖ°þgåNQeQeQ¦L™2eÊ”)‹²(‹²(‹r=ʹ'GyüeÊãì(_¢Ly<:ÊÞ–)gv(4åÌNu¦œœÎL93ΔŸåäxfÊ fÊD9ÁLY”å3eQeQnšmlQeù[”)׃l_Q–}8elùnŧò=)mh*Ÿ‘(SeQeQeQeQ¦,Ê¢,Ê¢,Ê¢,Ê”OH¾5®?œwÆuR6¶IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-diagram.png0000644000175000017500000000362710536106572024340 0ustar gregoagregoa‰PNG  IHDRô$¤†+6 PLTEêêêÿÿÿiHôIIDATx^ìÔ1Ž! …á'W§°¶qÊ'WhOR8嚬R¤˜†PÄ? 4|rc´Ø—„~£Ð #iä|Í+^â'tÿ?À×èY5ÝE ì±SkM.’XÈ¥:‹’S×V)M\RRû1«Ž¥:ÜÐIv]a¤ U5+ÅŒe­žÝ2úyé­ë¹Ný\©›Ñ'‰—ÙeÎŽ©ûZÝI¿ôã©§¡÷Vë‰y MÊ¥ãÑõD³ÄÞ§6­îÜóºU—ºA¿Y衇z衇º´÷÷Jí}÷ô¿vî`ÇM ðÈ«ŽŸ"ºÒHܾÏ9³ÊÆQÉSx}÷FJWÞ0 <å-™¡.jàwœØîËY¥R~}€`çàöt½Ža¸èòç]ÒR¹ ýï¥8›ýeQ Òíb~u±œf€KZ¬:@§å ÑŸ—㼦Ã4íô°õK:N¿è6bëËë8ͱõ›ŽÒd.8¸õ›¾é›¾é›ÎƒµDD:V¯¦±ìGÊÞ¤“¶wí»¢–æ¥þCzË|"ý¸i¸;Ø#½qwÑwºRµ¦¶!Õvµ¶ýQÔ-ºjHw–ÛV©FÛ¶Vª ÑåO]wÔ¶TZVµ ÖÛ²R¤­efRZÓøo¤÷ïgzO‘?´¤ëP.Zÿ®s¯õ±åºã¬QW4ê‡nÔä´íoÔý¾? Þ÷Q÷ûNZ[¾Yo&½ÑºmëÐ#ÿüSï¦#ß]öņëvàÓ‡Î'­ûƾáœgîk}ÑùrÎ×ếD}ñíiõìÃmºšé|»®']Gè<ï@ô7ëµ}¨·_ØMßôMßô­o“Xßz•»Äå;äå§å'#å§Bå'bå§‹¯ŽÆ—ü lrRÝíªrº|Ú SLw?òU)]Žya éî’¯Êèò=/LÝ}䫺œòÂÐÝÏ|•_—>/LvÝý’¯rëò×¼0yuáfù*¯^ÍóÂdÓ½æóU6Ýc>/L6Ý[>_åÓ«ßóÂdѽ4ÏW¹ôêZ^˜,ºwæù*^]Ï —Cf!/sèÕbÞ¥×…YÌËôzµ’w©uiVò2µîVó.­.×ó2­î@Þ¥Ô%ÊË”ºƒy—N—8/Óé. ïRé2$/Óè_ž\PÞ%Ñw2,/“èÎæ] ýŸÐ¼L ‹spÞ‰õ']h^ óP}舨BóÎ=P½×`Âòò‘z?ocã¼8?NÿJ¾ÎAùaÎÒ¥%_ìpþë@D<¸‡èóa@ óƒýøæ9BGS òþûlî×»ÕÁÓnmnrŒÐÑÜÕ¬æûÙ¤&B¨okyymJ…õðé¯å»+[¯ 0/Ý­Ÿ¢l€üê¡ßñþ.Ý‚aï”_šñÖ÷èªwh>m’êh6¿_Ñ¿ìLİ}E_®×+ºb^4xé`[M¼nÑ;;¸­ûeýéü뾟±ƒÛú:Ñá·9ú݃gø‚ÅÛ„¾w‘F}çä~q‡¿½~ßæª~ìÕôª5ß­Ór]×5+ú¨zM· *ø=+¤bôØwÌì¤kÝXVÝtäÙëøòäè­åZ!}¾Ž¨î¼ón¡Î:­­eõùJ­¡kõïí­:=NÇûþL4[G4édbÞ§ëm¨î×qwŸþ2éu×üª¿.èóuD¤ ÏÁݯ#z¬nƒõû~¤[ônÔu„ý +ˆfëˆü_›lú|Q”Žï¬€®‹êµÓ#î¨á/ì¦ûÙ3¯G?Iá;+¯k&Ò@O‘ÉtüwGíuîúƒ¥Ó‘zî\ÛSV])Ýhê.+c¬u÷›:'1ORþ¬SZk²¶%¥ôIkëõ¨®~Šôº&î/ú`ûQ?v^í˜á'h¯«}'uM^ÇÝÂèͻގºöG>¾SŠ;'^çS3ê—s^ëÚz=¾KŒ»Fø/m|‡w̰?ÀÝB¬ãÉH|§ëx*ß%Æ:žˆEwÈ±Ž§ñÓ¬ãIhüdëx ?Â:ž€ÇOİŽ+|˜RÇ“Ð:š.ø)pj] `~ߊT¬ƒJ©?ÿx=®[ˆë«Ÿ)d×ÅåÚ:ÂÝèã’ý{ˆÑ™Õ!_œ ö>b:«¿rË‘d5.ºå Ú`=|*„KØ…{ü«qÑC›<ÿ7ïÂÉó ëÑ…Ç„œSïÀ9“Tàzy°Ž›IœOïÀåšTàOUu øóê¸j2éÜ$Õø…üt:îÇò§ÖÁÍ‘ùèvAßgÔ‡NOþ!¿nÕ4Pa²uÊ© štkßH줿fÖÛšT£KèC÷CgRZSvÝÒ¨G]•ÒiÔu!½¾è6£þd'ýhßF‡Ì×ûTL¾²ë\T§èÛïûv_·ÝÏ—y’*ÿ¹=¿—ï•ï–ï”–ï—í§ÀJ:•t*„+åD WÊi ®”“P\)§À¸RNÀS×ç×7}Ó7}Ó7}Ó7}Ó7}(Yÿ1£èjЕNkIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-01.png0000644000175000017500000003372710536106572024564 0ustar gregoagregoa‰PNG  IHDRô:^¾-„7žIDATx^ìÀ¡0CQº/Ɉ‘¨{pÿ½Xu g+Ög/Žm@®Æh nÄÖÈ_s)·ïI5°-éØ9³Ø(®% Ÿê–ØÆà1^°!€ñ†mÀ0ˆÍH$óH‘’§¼$‡°Øa‰Â’H<‘EAJPP)èBrÙ ˜5({pX âÈ Î€§§g:ÕÓVyÜ3ñ4=CØê›£ê:=5œjý*êœ>v öLx\`†a$ñØÁ0 ÃØƒ;%/~!¢‚|êiÝ×/@‘º¡KÇ·A‘Ôé©ß2tƒCC†¦ãÐä'IN—¡é×f‡¦?-42ìÐt IÄ¡©c˜Cä¡ÂÏ$üÐaæ@Aæ‡?r¨O¿ ÿ a‡6>d•T~P­2²g}xq'^-©æøüØJñÁ0 ÃØÃ*{Ýõ­ $Z l&¡VØlºƒ7m¥9yœ"v0 Ã0/ë+LSVVöúºêˆâNµxªI@ Œÿ)ÑZ¬a†aÌïsù¦z·™Uº ÀÑ/aáK7Í¡jî¬ÙSFÎÎÉÏt¤Äõè- U—|ñÐÃ0 Ãeì=lÒ’W¦‘áòøœµ®Æ;íŠÒ¦È^Uò]ñÛ@Rû@PæÞÚð Ú„Ü7õîmç–Äü9" šÏ|H~êè…"F4YÜ2y¹0MÃþ ´¹ÓÍ.3ÔîYжðù*a†a˜¢â hé…ÓpwÌgî ½VZÚ?ÞÓ®6!@UÅëõÊØdÙã•o{\²â&q'îœÿXĈþ£¤/÷‡Á“ʱ¡sùÐ*ašœ²•¤ìÿ Ã0$â(èe·’¹KÐ#{`²°ÙZ仪_³çæ:î¶µ)úGkJ‹ËßÒ ÑwÊßwýfòû¼…¶åÜ&´I…ónÝˆŽ£h¾ëìGè$|[tKÓéõä§yí“kÑ»íõã Í,Y‚öZMEš°TDâÒ!M²³¦T\üyeÖÔ÷пðÓûômö´hh÷)swî[NùϮֺ—ÑÍ‚™•ºS»[›RQù;Ã0¬ï¨éبkù%&ˆOèõÕ%yWíÍ}uÍ¿5Ë·zõtÇ=Õš¨$%ùSS¤ŒŒ~…™Bi:åïîú-hóçö>¿QÖ£ mô"­=³ý?O®ë&ràø%¦ÉúÕ£•¨ìN@Ù‡•®À†Îï4›3­CîIÙóf¬Â†NýÿËIÙ f®ÁFÊ®—e¢Wv†aXßɱ^saW…˜ÔÜôíe¹«026GözZ=2ZfÛÛÕ±30Ø ï¤ì†ä=z(s'ŒYŒÉûkõnƸw€2÷nh<¼:´æŽ™;½h`çÞåâþÃ0 c(Ë ¾[w°»ÝÊ‘”´”d¿Ãç÷!~¿¯ úØÐѸ²¿U ‘ô3waÐÍ[µuG«É˜à¯Óôä]€h:µ¾›È?ŽUéÉ»p­¦òßjîô ›eô´Ä#‡*Xˆð0 ¯©¢ªïæ·BÚWÝ¥¾Ö>u'¾?~xç¡ýÛ÷ýï³ÝÕ[¿Û±yÇö Û·U}úË×g?7ÖgÂÓ+ï’ŠæaÓ}LjùÂXp§´]˜„ ñ†ae–x‹™ûÎ#7’{ÊKõ ßžS[e¬¡m˜Q¼ÞA鹩Ã"潸Ëî†5Õ{Ý™R¼@Û ‰É;Ufº×T1y§ÊŒpMËî® UÃß4oú*,»;÷vYSþÜ,»Ÿûa-¨ΪÄÝ1YPe†«í„õ²Œ6¡Šm{®ÎŸV”•6tˆãËêcç¯Èêu\rRzzfjV ª!ÑOâsÞ.PôÉ›ÐQ“1œ°£o•¡|w˼2(hAÕp%ïØ3,¨N"O,nèä Cä0Ü3ÆŸôfB7QßiδšJXÁ0 c}AU$vÕÜG] ‰øì§³@•j':ì“m…ä}îLô+ cù\ÂrænWU@‹Žv@EOt£ž gVß ˆ¸0¼ÂÁ0tX,3w:ÅÏz¡€ÑAb~$$Ã0 ƒ§<ÆPܼd3 Ã0ÿ°w6±QUQ?÷Ít>úÁ”Ó‚bnDÁ%¬n1$7~$FÐ…Qã–k7¬LŒ+£+ &˜ %11ÆÄˆ@…¬5B@ŠPéçt¦ïÝ{¼·ÏÎL¹åÒçkófèÿ—Éå¾3çÍ<.áÇáÌ›Ûå﹟þâ0­FlÍï# wŸ³tŸýýýtßÁLRñlÀRò•¡3–Ü› äò¬Ò©H“òÌØ”rÖé3åLÍ$wÌHöçªõÀÒzóÉ u?P¾d¥¨â+=jš[î€ 31³Å“!¦Ü'óõB`¦²¯ô¨QŠ+>ë1þ—˜@‚Z  ÃÁ¼Ê¥äYþ åØP.Ô:sÝ¡ ^îØÙ‡©7;išKî`×®]z¤Õø,­{‰b›Ý–»[@!–‰’W›ûšPøW´bì‚2ë³TLñHG‘ˆ‰4¾S̆ßÀ¬B;>ùzðêåQªãðþÇ»»;…X`vÅL±IÇ©«g_{ÊNv¿BüÂÜ} Õ¹uhå;W œGZ™0èȉ°tMàÓ? ôׄ‡ÏôoÛÐ]ˆcöørw+Û6£¡*#;^¯?÷+ØVuäX¸ÎŠŸÆ­ÇÊX+à̱âÖÒ5 !³uKO߃ëÃ/(½vpÕ!¥Ûìñå]ôñÓâ¿iü³âÿÖÜq´q3¥’í–º”„Ádåîn}¸ƒîWˆ“à>Ëv¥£FNæcÒU 4»Tª –áQRrw74ì§¢IÓ~…è¯ÿ¬•= s@½Ù•2f_v¼äêÐä+Yû“Õäqÿ¨ 0ƒÛf ä ÿ˜=Gã¢>)ÓŽÛ§„ó¥¼—cél"åÇX™¨«W ÚKG hÂ0“´Pè\5» “»Ût1‚VÜñ”#ÓʉqÁ±òí´x¯}õ˜H4MHVŠ<Ï2{t’ß~`£J‡·6ªE¯(6<߬gƒžSk΃ܱ…@’÷ú®f^þÞ½4BïˆGåÞ(w¶àÞ˜F7;—/ž¼uíWZ›ú6ö Ð]ðïnö©’(EQPÊ8=ìðh˜—Ü–ðÃñwô¸ù‘g3¹µÖ‡¢>-døÜçú1ðÂÂiv›öÖ–p"¥"'ʽÖx‰ ätöÔQÑRÜ{ð]!qÀj–4Ð]ØØûð_½wåâÉÞG¸ÍnWîU­û$‹p`ý_'‚×!w˜›˜»]ß9ðÖ RSJ•hiìÙÿö‰ÞHµí¤ÅÈæÛjól¦µ½¼ÔõñRX¹K«3ÃÄÒ8TÔ:r€›7n]ù‹ˆ.\šžÌRÈØ7Oî>à‰iZLB¤rOì;rúËC7²Gh!…ÎbW—Èe3k×ä³ú—¼*fÒCã—†¯÷ïì»ÃìŠ9Ü~àZr€ŸÏž 'åàûlK×33“”§{^åò° *þÌ4MŽOèQTÌ8;Žãz™šNOÿ}»<¥Ïšý“æè^w”êÈç;:Z¶å½Í7'‹/}üÏþ­©|ϸOÇOýRèhËå³Rñ|ÿ=H%}bŠä·F§w÷÷oßÑ{ìØ¹M{_zo—œ¹LD¬ÊL‚R¹–ö­ïèÒ£bAõ°êõLD™'<&B¡£-䥄H‹–N‘Ê ¯Ux™ïN\þhãTéémÜ ]ÕM}Ûr™m=ký¦˜@îpè•ç„Xè=å“…¢ÅQ’ "Å&Å"+RYòrs±‰Œð¼ÐìDôýùßu©ÞÑYèè´w˜¡§¶o¥er€Ðìì»á‘—ÑNëôªÖÍ…'„Ósó´~L–§ˆç§íùÌËûS^uröNËÍøøSkÌ‚hª¢HÃ’8ŠÜ™È(¹DÞœÙEE¤²LIJl*wO /ÇŠ„Gš³¿´·çí®´»oÛÏ;s²bR“—»{OÄDlb혘°sÝiî #rLú“_‡•¸BP®Ì’H‘ò)2>)šS|Фvz–D ©2›B~ÂK·²©Ü½oß±äçÎ_÷9|å&õ=´¡X(ô¬Ë+Éì“']¹'ÿ×À½!{Rïë\ÜaMÀ¿ì]MOAÞÝ~l—R°|uµA>©!Æ+/$šxRÿœHôàÁ_`¼ûŒ‰1z31˜â1&|Dˆh± …l»Ý펃mêÊ”g™.¤ Ù÷0™Î¾3ïó¾}÷Ù™aéàm™Ç“ÒÂrÐÚ"û}û ‡s¡iTˆ’Ÿ"kÁF“¶+>:òo äõBOK”¶üJæ×—¿Mgük©Lz»Dì­ª÷ÆH·"K5&w<-–윴°úÓs¨iÅYXˆ`0x¬lÅV?¼&öŒ¼_8ÅâÄp¨1"<PæJ®„û¸N–Ñ®˜†V®o¥ -_Î5¼ßè½r­ôòHâ^2õ{iò ™ÐŠ_ªÀ®íQ£ ØÌ}Bk±‹‘7¦fV––Ñ΀Ú©ß3TÁmZð¯Iy59 AÊw8{ Œ\V DŒku˜@æÀ¥ÃúÊn” ‹ç$ÐÄ8 .§6Þ|pe'«Sж¶ÌØ1S©íçÓž±Û=шRÝn>¥}©ô°þ:Ín)Ó T‹21ÌÕDføT2³ZÝÚR»ûE±ÎÈ™²i©§ŠKX“¹{Ç«àº=P›q:ˆÙÀ…úÐ_gBd¯ïL]¥“+šaÒR4vŠSZ@Ð>n¤B]}½]ªÒàcYƒ”NáÈþåqÝô‚Õ©ØëõTrx°- '|N Û‘®: w,x®õ¹:bM¬SÓÐÚLÇîQàHÖ$,ƒsAN:ß-8 6~qEO—«O§ÕÑ›g›eq§ofÍtŽh¤ÔÂxÍ-t=_ø´ðóîxìˆÜçgÎ ]ZZx»ë#‘Ý·ªÝ™ÑqõÔWb±X™[ïÝŸ¼>Ú>Ð6¾>*=)¿4=|541qñLØSîò=KRÓ0Éá"!†9;·ÒlŠW/Ÿˆ@ŠTJkI˜–Ê‹…`@ZOÌÒÊ“g/âñøAg|÷‡»ém£ Ã0ú̼ïŒ?» q¥VÚ8 D…¢BUR%6¬XvD…Ø Á‚Bâ/€ø °b…ÄšM+•)ŠB‹i×MlÏûõðz†ÆEQ€Ú$ÜûÈžyO²ÈâÒ£I4 ¨V)£ZÏÑ'_T.¼VŸ«Jùmý—–±PŒ¥\×vO û×6ürþ¿¶ÛŠúDÖ÷k?–ZÁÉsK³Ó’¼ÆŽÝÞ³ÔÇ4nÆèïÖ·üÝör1dÄ=–RŸ~UåÕzmZøùû¦¾Ûq”­4³½~µùîå³”Ä [ÛÏž™›-…¦¾Ó¶”6F[}óÆÖ3‹ÓÇž(0#îc(MÛlm¿ðò©3r§ë6wr+»µIÒóÃõ+wßûœsÎÏì˜R–BbG)LJ¸°¶oÛ§^za.ŠÂo7»Ö2åÀZv¦«µ½u£ùÜóGfJ¬E‡ Q(†I<âàÔ¶_ÛW.ÖkSb³©:=G9`fÕÛ3Úúùêê½/Ÿ6ZÓádÔï;6÷!¬oÆ~m_\œ)D´þ«¢°uª·«õóOë­¥ÓÕj‰ÙzÀY A©@Êô$!÷Gp¿Ó#¢Ï¾l®\|v¾oü¦ò¸!ã,'Ý{~P‰&¢µÖoÌ;ký‹È/ãb˜&žqtŸ»_¯¹×W*÷ ·w-•5Ö­z ‘¶šµR¿o™çu5VFÓ¾0”YÓE¡ £(”Q†ÃgqøøóÛç—O=}¼xóVoÔµ™ˆó/ã,9kýeüI©lmïRM+K©(Ù¶.ã8*•|ÖÃ0d âг¥¥å“¶ÖÊ ù$0fç(õgÓýä\—ˆÎúno'iUΜèTʳÆ$R²Ýg½¿°ÇEÉ ˜™F¸´{µóËÕcUѸ“ ÷˜g õí7ݤMWûM÷ôžMDÛW®Ý~çÒìþÎ.£BT.Ë(Рŀˆi4ˆ;3íu;~X]k­®}C£„~ÀK9Z¡'–¥,Š…¸TŠü+ŠB!˜Æ‘vÄÀã”ùè­…Æ®U–þÖ?Þ*qLÿÆÂqQš*Ë8β.¤`¦±AÜd$+GªSÕJ}Ó:ÄÎÖÜχu¼½s?rŽöÙ¿\OA@üà8~ˆ;@ðo ˜) ÿüŸ spXÜ™C…‚ûÈ xð“û˜˜($f\Ÿbú¯„ôX`"ÇL“qpŽi‚ îÙ­’qŸÌ#}oþw@ܘ÷ÉÀô¸°S‡ „C"(ú ±Pvn6C’¯WkîÍ”€³ùU÷ga;ÕüÀ²wÿ¸QQ€7Èœ$Ø*’‚‹ä()8%¥K¨f;VÉOÊKìÕ ¶³Ë÷)ŠfÆÏªŸ&³›ñŸ_?"ÜÓ¬¹ Üîw„;€p@¸ Üîwá€p@¸ Üî¤ýÜùòõÛn{ñ¥xÓFK¸3 Ãî øüé㿜¹Ó÷ýn{‡ÿbÍá Üðm™—¯ßŒíß?¿ŸxJTV”mg¿ß—ÆÝÝ]iÝñè½Á"·ªºrœ•e— „{Êôˆãùúó!ÝÈÁÉrq­ö+‹l°,S?—/¿K£üD÷¡C³Å12Vt'*ãi×’gýûâ¡nŒçÊI¥fúùÐL1àŸ˜b <þ”<͇bdrŽï¬ÇG¢›¯Ÿîµæ"I?2÷/Ýh¤ÊS¯œO,WK‡â.æø Ü#Ê#v£qÚ‰Mâ:U•ñ¨íKðѨ¸BÖþíw¬¹¯{bÈ,}Ç4±Ýð q‘EN¬¹·ôúwÜâÖ±²í$ºéî€ÃÊJ÷Øž8”GJ·´goQñ0í«í‹'i0›¯¬81Ê#¥{î|àê˜w/^]Wì:V·òôw…†á÷–¹¼/°ϯ%Ÿ+r¬KãQnŸìHv [çCÑm“É~ÂÝʇÝ%„»—žì. ܉.Ö`Ë_„;€p@¸ Üîw„;€p@¸çWZϋʶzºËÛº€n…dÏ/ÔŽnŒDMé6Õ÷º7åÁ÷ïÞžøÑž©¬Ïyæ[ÕÖmhصܲnKÅÅ–à#ßã ÏÀíííÊ3÷ö4oyS.ŽUšôx¾-ÓÊ%dןÂ[mˆ™ûbùÝ22v'Ϊ©ÏÅÂ}¡|Ï#©íhTÔËtÿ¡ Üîw„;Â@¸ Üîw„;Â@¸`WÈ™7óÅ ù@·Z¬ÃPºKG<Ý É^b½ïûqðææ&^üº=òh·üeïŒq¬†¡(JÐÍb RA;%É hé `”””P H°˜¯)>‘r#]ǘēä"Çy¶_ÂÌý÷ûÁçÜ¥ì:ýðþ­×šáçߤê+i†Y~[€Ó a»”}Äýå:„í7OŸ‡ãÑ¢HÝÝRm€È½.ŸPåp ŒƒzScìUŸêʦxo½cIã¨ssS¦`ü4ÆæA™V€È½.MnRX…qÙ×Äe›cCÔÄ{Ûò×Kƽô –ÞÌøéëSOXλáVN[Le˜pUØ«ÆF|­·µ¾ðû§jNóÎ`w îšìØuÝ4í~Õœ•pÏz“û Iíí$ÐÇCü9ižùá¾ ç&Æ)”ÝKLI”ýCøHòT¶TœÞSà°Ú¨óþCx"wï!B…q®š<‰‰¯Ž%ljÓb{‹16˜&¦C{#ò¼@d'¹ú>ÿ™›Ç¾Є?<“1ss^A’ ÷¨áá^ÿQ^q€¥õsÐÜWt„²4¤eÀ‹¦·¯èoNð…* âˆ;âˆ; îP¾éâ§5Iˆ–NMeqOËzXÈFUÛ”x"w){/ëãý:º® G­vv´„ïæ¾P•²ë4ìàaìÍÐÕ·¯+Ü«oe÷> rÏÛeoÛ6ïîîÂñþrÂv-%¿‘ÕÃc[rµü^€È]Ê®‚°Ê®Êáõ¦ÆØ«^—Ü@¾Oo,TéÒé´3ÜÌÇ5õÁÜ‹yhI7òîôˆ°ž»D_…qÙ×Äe›Ù´uÜô’é9ªœyGÆãÛÔ“9Ž™{‰d7é†ÿ·K7߈{ÈÆ(-“")‹>¿l®f TÐgñ@ùH—Hs•ôfì7³ îšìØu]H»G²~Õœ•p/“Eiîvs"96+™¥ã{;ôOäÜÃĘ åãšÝ÷ ÂçBû}–; ¤Š×ÐºŠ¼õ€È]Á{ˆÐ£ ²Uãô]§Ó«º¤šØ¦/LíǘK¦¡õAƒô½å6‰’õCyzƒÆ1ÿùj{‹kfºmn¼h•I˜9Ž9¯ IÐ{Ô°"Äü&û§þý€WZ?}ñÈÝ:J·hZ£ÄUjÒ2¦`ÖGmêgÕë,ù €¸i™›cLbøµlÀ‰_z‚ -ˆ; /1ÀæöæUÊËîÄàr‘¶íŒÛÛÛ°LÚ®AÜóWä™o p³ðï h…¬Âe©Ð"w}l¦xÃ/Ì»>è÷rú-¢Ò´í’¿-pž¹,ë>ŽÌ–ˆöŽßÃq0³J˜T,îжm¥>e¼ÎXíÒ]Ô×D]~6ñ)õ›½³É‰†¡0 n3HÀ nÇ…X°ä°*Hp*£|ÅžÈÓf&¼§Qå$¶óSÉI_3Íysî8õ¤O¶cÌš¦ÉÑDéFµç«¦æŸËtŽJÇ„Vî 2:ÐízõûA¾ìtÁ@пvê ÐÓcMN¡0Ĺ·ê+(šL¦1çÎcïyQ=O1²%Vε<œep&3 5|ôlí¡+*³®ªÈ÷ÃÆ4ÕèhúžíŠ"ŠìZ¹—Ȱ×dàÞÿÜ€`šŽa~–y+$Ç“­ÿ@«>é\6š¼/µ¤ Ôdí4'èʔ݅-=ÕX)6uÜiŒ“cBþVŽ­Üó<p˜çÞ_Þv’ZiYÁœ8Žô§Jß7 µóžÙr“]«¶Ù×… Ý2¤bl†çÞ嶉©¯¢d‘ó­¢*$=³å‘• •{¶ü-W¥!Ùàȃsî— بҬ»û…ø­B™–ç›!ˆs§-Jc'Ž¡8÷ðE³{‘™S’&›òŠAŠá¦ÐÇ…³6ÙL<@Ó|¢vxv\!YÙ¢®&®Ãl‘Óhw$6dQl8:´r_ è¡dªÅ†”ÇçÜÙÐXÍ7&´]|›Y<2“ùŒ;ŽÐ^»Ép•z[àøñ5Wíx¾=ŠéâÜù?ís?rºÌZ‚v âÜ©œ‡ö¹[ø;÷CLÌÛÆ>ó&Þòÿ„!äoG¸n‚ËyÈv·ø~ü¥ùòeýÝÝã÷ÇÛ{w°Û4 ÇØÜy¢Â‰rå¶ã{Ÿ*}9ö7@ð"‘Pè0ý·µG›*S·µß§iŠÇÒô#sVû).–s}•€üœSQÎÁ¾ïÏu³Žå_«”´ÇwÞ^ò¶/éHHŸô¨Ø4 ›uŒÜ» &~fh£Ñt¶„;`/L„;`Éž¥; Üîw„;í}}x/á¾û™lLË ÜîÂ/T»®K­ÅЄûÎbè˜s@¸ ÜîÂá€p@¸ Üßø˜„û½äiþŠã(fåq¡¸j´É«ÙØ~„ûÍõÕ|>Ï©š¢É"aãÔªfÕ8gQWÅÙ1ŠQ¬-3zñ™>ýøö9'lî\ÉëÊíúˆé(FŸu}ÔÄåu?uûƒc¥3÷È»0<û&ÓÛI’®ënC|ú&B<É^<àç ceÊu?³n±S§Šn‹~êö›±ú”š\Y\rŠ©|€P‘‡GiÇ 9t©È¦(!>H4Ž9ô1NE}Ý2Ä<þžöÑa}Iœ¾è1Àé·ÍhGνŒù¿!„Çú†¨~«=̹Wú~;[S.USðQytè?OÅ£÷Á[­£|sÿîõëÇn±ˆšÈÖýù^¼ç̉ÅTØ ä=-£Ÿÿjšb¬(÷Yá¾yù«ÿ÷s:K?ûô¢‰GàˆÝ"1ËNÖâEèv1Z¦f}PÍ¢DË8ýD±>Þ~¡Z. ÜëÌY·)ŽëuMQ]Â=b}¹\_ä €?ì±1†M_ÇÁÑWptð}.·9:øŽŽ®Ž¾ÆÏ„ó8ICѤ„èµ@ËõçâB ¥ È~~Ð~·…Ÿ#óÅÒÛµò(s©ÿ˜£üÆÛw¿‹FÜÓ¿ûŸ{t¡2¢PùyQ?†T»®Ou;ÕàÏ¡æï‘Öµ¨°‡/±)ë½¹r#k^`Ók“9 7 àO¿R…Ïvp\¤öv½|¼{ :T3” ŸV¡D Nþ®¬/rJ®ñ*²dzr#+JÂuú44J5ŒPRù…ªÌTFú¾3…€,V)îtu8.F(6cQùy1 íÀ¦Œp±‘éª ›Ê¯ØXš„lB ‚×Ûð62á÷©D›¦¿<å@j VESº³wƸ Ã0-ŠÞ¦CÇ\¡c†#CÆlE·ŽzŒ{…ŽrŸ @ ~–?¢6ŒèD}‘4I4c ú~x®Wv=ˆdº„ä2mä(Ó4ÌŽÑ– QN»ô¹þõcB¾4=™¶³m`À]Ùž¿@J mœJò蹼߸šdr–T^³BUÒ¥š{fÝÇ«”¦Ëg#ö vI¶¶q*£U”š…uØò!ú@»ôÊŽ+›²¼uò]aõŽ$à[¶•c”D®=|"…”s¦áa èÉr9Gû«åãélewëV6&] ˜µmÁ7î:;[ûq[ûÌpå‘ ΃\ž³ÂI£ NÖÍ oôy2«‹½æŽWerKÝ‚ëOÄV±žXr ËW×}^ŒIÞa¬ “÷Öô̓Ðwöì#ûªÈ§ðy»lo5sgúS® —Èõïµ³è'ô›*NŸ$»6ɧÜ5åEW§ ¦öy)ëiZ޳¥s5tXx›ä“"ª.`‚Ÿ¬Ïôýuí6=”T+dÍõçÕË2ìݱ®ä4`@çn((¹J .ƒ‚’ÑQRp””SBÜ£ßúý­ò®ÇQ¬(›Õóèh•8ŽÉìy'ã3㜬Æ|7%³×ƒªÜKú¾Q’»gIµ¶¯~­æ Õ¨ñ\ÍFb„¡jVµl'ß{_åI׃`=¿óîFŽlžÈÙ`ö¸0œX˜œÕxÒ³d³A<^]?¤ýõka¾|²OÿùëÿYÛß÷j¯»™6nÝú ¼ï¯·{¼ù(„ûâ¯8ëÿuó FoÎl~¬­NåEÏèÇ×{eâ¯d÷ý#Ÿ–¹…Šòö{~ïïõÌç€pîw„;Âáàsîà;g}w„;<,¼`Sîpëœm7ø„ûÂ{íátpÕý²Ýá~,Öëö-#ÓpÏÉ'ë]v½ÿÝû—+sÿ_;C/ࣕìµZ%³a_›ª‹ÕÖ{ï·ükØ ÜÛe{åx¼Ynã¡+±zùlïó(<­÷º£i+¹øá_ÿ*;¯¼ÝhhbxWÕqÍ,ß4ò\hÿ¾è"7eÉæ¾Y'zŸ7Û–«ñ*Éçg)ß”gƒÑݨþ¼ë~¶¯Jö¬V‡®Ü/RC}t¢¯æoì‹M­¼oê-G›|¹)çYR˃cÎÞ÷4×ñL{Ìö{SmS–çIkíÚ©’Y×ÕÚ÷!‹ {Û©x5på^«­¤ZL75mµmj÷'ì…UyØfí8l9yÜû´ÙÜ1/ËcµÚ[åQ³äqfýé³°r¼žìù~¨žzÚgcbØ=“h>øÛG'úof¨+ñýŸ\žCvwä˜çÍ^oá”ÎÚIIºy¶3ß%;Âý²¯f.´_ËÍ•cþJŸq ãèîÈ1/4{<¥+gìŒÇ˜úû÷ZMvîý¢o3\P%Q¿.kuâ†ô±{xw¯ìw´5»Û4Õ+ÔŽqÌÙ{6›uRî8*T[83aÒu+ÈQày›ãˆ×°Ø%zŸ4ÛD|¿8Ô,ÏÕlg|f²»ù!½~ÊGùB ƒp??âTοÎÍßVÏ7ÍW+MrÓ|ßõ’ZÎ’ZXx€¹5§[÷´%Ç^æ%—á¾>¶1±’s5ž°àé#A¸ßzî§ld½þ…­%cÐw™î„;˜¢„;îÔ‘í\„;Ì¿wÜ[L€p@¸ Üîwá€p@¸ Üîæ–1M6€p¿õ¼}Âݼ}ÆÜîw„;€p@¸ Üî÷_û=Ê„û iÛöï²Ríó/¾<ý¥À•ûÿ·3+¿ùú« è³s|Þ€pÏÉgž?-+[Ä·û¥ýfõY97eÉs*ʶ\57LëD7ð¶2|‘à/ê·Ëógtöëô¶üüyn}料Wo¤ÏF™3—möm¯+½ZkZ'»¸0螉q·ËÛJ—yµÞ/~{àöÊ­Bäi_®+ëw£¶*D/%öÍWˆVžQ>zÛqõ䯕¥§‡{†à(÷£N-¤õ$­kü:ñ arcÀ°Ì¢Å0­ËíÝ2ÁŸ-ôáá~’ ܾœ›b½Jz…Ú1÷‡~v{EÂ=";J*¸ó?7eI[í[{ãU3Æjöµ_¢ á^¹™%¹Z|hßù°þèï±óŸs_¼ÒÏ^ghî«d¿GËÂá€p@¸w„;Âá€pî˜8láÎ|wžõ@¸g¬?»Nì`X&“ýñ?¿üüSÿi%5‘ú=å½[sS–Üò±Üÿ9šn]?oÑà*ø½³G‰ ¢°ˆ·10ô †ÃÀp³ÅÌÐÀcšx„G±ßNUQ»ÌÐP‘é×õ¿vowÌLpæ>&ôƒ¦Ž4·ùãû@öûýÒ•x0 žËü𓪥̺©°›×°Ñ¸\aÙ®yœÏã=:Dª¹Âåk„Þ2Û³…ë¹4œºéois4Wí¬5³I1+9.þ;vØE†¯W™JŒ¤¨ÇZ…\ü}-ÉPÃÈ“~©KPd&;ÖM)ƒFÿ+¤v¾ÚüªÉ׿WD¡#Ù\ð… ±R¹³…Ë  ÆS±Ã²ÄöY™:òÕö“­¤3;},ƒ™½8­èEÌøCå,“ZÞæJ¾x‡“uØŒçüe¡}V¦€RµÑ<9©Ñèc­†ì˜± åíZŒ7²$cí[S¶‹Æ—zióÀ”¤èïùânЬC2 2å\Æ¹Ž½°,™+2ûÍTÍA:³£Ñ“»=]µLæû@Âb¤K†{aéªé+†^øEåW¯xGÒ)E|˜#™r.eG/~Ó¯ ®Qv¨ûd*ºYøcïŽq†¡0Äm¹BÇܧkG†ƒ‘1#l µ÷i$KÞò†¿ñ}ÊdÅ–ð/ËQüº–`õ{¿Žì}GÊëµб5l£ŽÕÖ„É´å£M·ñj+Þôój$;`[&ï]æÏ_7Ùœç Üîw„;Âá ÜðST#©6i±Þ÷}W$D<€m™„Ù¥Lv½J‹#­_¨V¾¸ Ó<ýá×ë(OìzMËáøÄ†\ïªæŽ=}hZ€u²½æx ëzb×0!ƒ‰=©”ðüS]èCîê"½'rªÎþ³wö8Ã0®·a`ä Œ ÜqF®ÀÈÀ},ÙQ>â˜Tý‘ÈCjží—¤„XT)¢HþçTmíÿÁºÕgâÀ¢Ç`’¯€£séä‚¶©”HCÛNÞ¶Dì#–vYÈA¾Ú#ãF ³Ó±Úç) ·Ê¬`Òv¯þ($Îæ¢ŸîëõŽ¡E.ÉgL0ÇÏeÚ&U"ñµ1ñÝ ~31™oP˜¬ç bãFd:£4tÌ»Jê«ñ¨ýŽuîÜu×MFìk~,Øðåò™ùó;»!™ýB[yEYµÍ›Õ®ddëÔØ8c&2øÃdÇÁ¹L›G%k=Q‰´þ8ÀÂéMŽ úÊåçŠxëopf¡´$Ê;þ9ãòW™å3ã…;ü˜rŸÐ|gý»Ï»<0™Ë¯’í`"*Œ,œ&GlÂ6Ñ ‹§g»–ù°wÆ8Ã0‰Û0tä Œ ÜqÆŽŒ°÷!R¤õ)n?i•Åž¢Ï¯¿“Gv‹XÎø/ûÑr„ÆqÌþç!'Ⱥ¬³È „€cLvæHt][ÈöcsŒÀÈI‘?. ¼ÈÌIšê‰^&ÛEƒ'÷¼)œ#SŽûSVÜ¥Cü¢"©Ì'‡_ˆù#Ñu !2™.Á©ZüÔòž~³&θÁ,D¾¼¹±3Þ¾¤“ëu›¼ÿ³~?ïj‰š6­p•â¹}‹Ótót«Þ×Ò˾Dl?:v̘l ´÷‰ Ð7x|à÷j¾œ`Å’þÁÆöb·ÀT„“³}—d×+îSÏ b«i P {¶GXð´Ä´(/:Þ¡ €p@¸ ÜîÂá€p@¸ Ü„;Þ¡Úù%mL‰7U6Àô/žã €sîÂá€p@¸ ÜîÂáþüò¶©0Ž;JA#s£4ÿZÞ°‚(ž!Äeêæö¯ïûZÛ°M,˜(UÃ1>®çQÛUã^ÔýØ^YÊäãc”Ù ©]™ù®å–¯;$ªÎù¨Þ6%êÃý±`bcqqÐÙ/µÊ‡B_þff·6çëvïQT¯o¡5¸½³k;ÑÃ0ÄãpàÈûŸ8þ‡ÿ@ZÉZé3ÆCBTáÃ*ëºc{ì&i•‚;&jìöŠ–ZSzhæa܃PØw²ˆ¨£Kü«xt`&=žmïZSÑáÖ¦OÒòÀhL›ñŒ«3x.D?w©? çKRf8Œu{i<ÿøòUï·ßÒÔ¸þÚ{©NËXCiã›}ý26Ž•%5³@&Hß»-$·Ûhó]UŸ˜B¿ˆ‚§÷ÕÑ[»Kþ9§ç›ñv0~·—ÎÜE uu·1ôÆè3oßÄ?û+!Ó¡óõŒm¿îäî"Ì © :AxK“ÚpîšΫ³éâüÉÝgRk—¶ œ†Æ¹½/s޳Ðn”•†í!.Àgر>©°:yxÛ’Ré야µ8¾ê9wßmçlákY¶öGåôæ=d[¿SŸYˆpå»ÀaD&uƒžìmñ9QËvîõвÆÔ—¦ˆ³Š»Ñ³reScñød‰s•`[{ ¢283¶]3Á“¤"…I ÌÔ›DÛ÷…Èwö|?aûÂL +åñÓÇ{gŒ!CÑÌ=vA»ÝC[XZN©‚{=–Ã2eðKà½Êfà'_ƒD3ó^'+}ÍJŽÞ\ÀÍ^|êxƒ¦y©µºõK …0ÈÜ }`‡Ä†RÜ€âÞ±ôä×,“ú]SúIHM8qÍé6/ã©t}üª‘Ÿv-0°D4ŸYO)ôûÜ¡ùÒ$ðšå :\rI´)IiöÛÍà?vÎXWa†¢Oè}#ÿ?12ðALÍbšSûÖºÔb jmçÆ ‰Šz² Ð ¦Sºbs|C…Sj9¡ æm@A-ÍzƒÒ8/w#[¾DÞZN^M¦¥KD£¥4>…ÚñÒè¯ öðøöoØùé¢&#“:XTðNZ^ÔÇKó(“ªtz×°G Ä"F†Ý3Jè6¯0†&9)ðVžsÀŒ3àµs]RòãÕoþq#(ü™~5¹“\üÿï©ô.Ù #¨€ø ³²“Xƒƒ‰ˆpÔë¢g3@õºèvžÜ7b§j”®ch4%d‹B„VŠTµ/½+ÅBJá0òšvU.ç]»:Cæ’òê ™“–^uIH=|³sǬ Bq†íз)¨­>tCcccmõ}„~qÚó ¯¨q¯ð"jÿ±ÈƒÃ0@ÊL ‰›Ëà°eWòú¤à,»-ã;&í»ø¿á,û+ @ÜMà(SËt^@qƒ @Üâ¸æýóû#„½ÂdãjoË´NËk aûêY?ç~@Üÿ¬²ytTþ"~ îc¼•?wÎíð*äpFÄpøgàÊ=Œ Jsy>!l_=k¬ €ªyMü5oÐ/ç½ÂÓ×ÿ¸P:ĽåB>¡A>8€¸W@ÜwÄ@ÜwÄq@Üwq@ÜwÄqwÄq@ÜwÄ@ÜwÄq@ÜÄq@ÜwÄqwÄq@Ü2fwÄ@ÜwÄq@ÜÄq@ÜwÄqwÄq@Üwq@ÜwÄqàÅ~Z@ ' ÆDã Š¼w?Ý-½“Õò Ü6†:4aˆ`ï·Dt‚ ¸Ë«L;wIñÀ]ÛÃÞÝëF „Qõ"Þ$Ò%íòd.S¦ÈclAI·-t Áó,K3Šr3v ͌ϑ ÿ%òç±oÆ“•÷mlØ!cîw„;Âá Üîw„;ÂÀ‹Ãà݇ÛihÇãñ|>_ããÃ}µY/Ót(3ƒ—<~+/î üf¡xÝéø5î¦Y•lXÀ˜;Âá€p‡÷7wšÒyh<ÜqY—©ëòF¶¬½LQT;ðësîHóß¾LO”ÅØô¿\šTFùuÊrj%Dô·+³,1ç«»u'K¨_À«'dÖsg¤'ÙJvýw65,óâ=\ÝgMöy[޶½ldE›ýHá9Èð}Þ•$ÝÄ¡‰ÔKqÞ:—O$ÝËËu]ÔÞíG!¡ J\§ÿf´ )3:Æ£W#£ æLaŒˆŸûì¦lßëï½ç9Ècîy •5e>ûï-A^»öLE "ÛúÔy¾—Fü£‹áÙâPᎈÏÅXk*óMU”óµM+åw¡ÞRYl®ÏÝú*ù_: w¨ÿױDz ͇Ϲ£#¯„ýÕŽ¨ Üîp™F³1w¾žQƒP2Âò•êã×øñ¨Y6_§g%ë¹ÃãÃýÔ34뼇’¹w„;Âá€p@¸w„;Âá€pðVÈ_ìÀ Ã0¬Ï9>ž¶º|;p@‚ÌhöOŨÁþú9©$#h DIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-demo-codecolorer-tool.png0000644000175000017500000004120110536106572027117 0ustar gregoagregoa‰PNG  IHDRi¬±bÀzëPLTEŒŠ„‚„tŒDÂŒ$B„‚äBüþDF$”Ò¤DbœŒò¦ôL¦¬´Ôr”ìî¤DÂD|¢ÌTr¤d‚´||Œ²ÜÆì4RŒœÂìÌÚ\4ÄlŽÄ$Þ$ÜÞ &l|–\ füôrt6tt’”tf”|zDlò´D„’ôþ”¤¢¤œîôþD„ªÔ\z¬´ºì„üJLj¤¤údޤ”ºäÞÜ.t¤¢\dbdäæäd†œL¬,J„$þÄÂÄäÜútvt¼¾ Tr¬rô$>|”’””l´²´4îtîäT¤4´ŽÜVüþLf¤¤ê¾ôü*´r´„¢Ô\Z\lм”¶ä4R”¤Êìt–Äþ,*tôŠt6|df¤ö´Œ®Ü<^œÔÚÜtšÌüfljlìîì,JŒüôúœšœ&$ü¢ŒŽŒ|Úœþ|z Dfœ¦üDº¤üdâŒÄ¾DüªœrÄDÂlä²dþdœž ôžtìîtvÜÜŽôl޼ôüŒ‚œTþ$zü´î¬®¬D²´üVÄr¤¤T<¼þ<¼þ4.$DœdÂDþTîônô¼º¼Îäæä–ä´òþ¼„nlL^d^üd”dfœ¤r¼ìêìôòôFüdv¤d†¼\z´´ödú¬LŒt þ4þ þL4þîì¤Êôü,F„LJ$”¶Ü¤Æìl’Ä *lŒ®ÔLn¤œ¾ä2tTv¬4V”:|ÜÞÜ|žÌ,NŒüþ„†„d†´<^”d’¤dfddŠœvô”–”´¶´„¦Ô\^\üjœžœªü\~´„¢Ì”²ÜŒªÔœºä\¤D^œÜÚÜ|šÌüúLfœlfœt’Ä*lTn¤2t\v¬ý~oôxôxïøxïë=tãÆqƒå¹òùÌó™Æóh†%GµTZ¦*S-ªMõoMMmMýDm¯Ï©­×÷î)ÑGôúõ­·TY«hNµº:·»:G¬Î­x_™ûv%ëýrú Ûâ):Y\ü×Åœœû'¤õþä}ŠÙƒ÷7o¾Ÿ½‰öo"ò`ä`ŸÙ?Úq.,¿=Ò" ,/,.Hë,ë××£q¶ñõúx}\Y­W¥zµZ¿]­Þ¶6T·C Ä‚raáu-Þ„œ(¶þòìi ©¿_^~´Í;Í;&ÈšO&ZsB¬Õ&ŒÙY­ÆV[‚³³%bXÚ–.†/‚µ c6¶ _¹6œšiƒ1/h‰204J¬!8›G°g$œA›Qk·ã¶8C v¬”3737àLjÌ<7gÏ+¢¬%M=¨LZ«B‰5k‹Tœo߃²-6ƒöÐnA[fŒ\ýˆ L¨‰³¹` ÐVÈoçæ¾´¹•S%€š¶Ehk§0FÁÚ °²“(c ØÄÚûY0 A›!K ±,ï/ï‰3•âí¡P#!m`à1œ±jÎúº86¯ÞGÕ$@ƒ°ªA3ko66†’þ"Þ|å/×<í~øáç¿äŒ’¡[ÊÀ Ô”5|M~†– Þ–†kðagK(qÆfÓƲ¯05S®¦œT=]ÃÎ`­mlj¶4(CFMž&Kkƒ˜Aû^ }f£Mžv k´ìi H3Ö +²© 4²ß¨‰3ÚOSç°&õzÚ-Pû(ÚØ¬¡6·+Ö²§­"ìŒX¹fj@Æ"Kƒ2trjG³¾ô´ò&)ÐöåjÄ9h˶5´Œlj¤l ‡”¡°µqb}¼Ê^•HE=o’r²­´no|.F„ø¾ðÅ,lü^ö´»Ïv¾yöìÕÝ»_øÚª‰¡YÍ'îJÂÍ“¤}biˆgájêŸÂl O ÊPŸQ3c^-‡íé$ngTö´y¡6H”<í9ú.@{gÖèž”v(ÛfˆÍ‘=­¡Ìžbe­%S£Z`–=-Zç¹ÜŒòšL¤ƒÞJœy±¥Yæl—jÊäj25´ÂF˜P³ý²È°'§÷Õ<ž¦Õ†FBe5Ób#ð¶9ÂÒ‚³òmêžfÞ¹~(kËŽæöYUÊÓêVîžø™ E÷|ciù˜ïõòó²åP—Üx£“¿’òl”=íÇŸ‡vvž í<úæî7ákBU{ÓŽn›¢M½³Ûuû¬…p5Xf›ŽîÉ9åeO3k}Ý®@[ÓšcdÝ.Ž&Öìi¶´ìh”ÙÔÚ!l κ]¡–ãXÚ³|VËœ٠銳5φX£,xCS•þŠ= Ê„Z?f&Ô(<-s&åöiÎèœ%Oc¡ l 4{+¬©wbi¨IqLgxZùœf_£yÙÕRïÜ´ƒ8§mGh$yÚÛliÈíS–¶üذ¹ƒrF³°4ª‰¥¡âœ¶‘27Oùr÷„4cdA\ýK¥ÿ(`Œ¿”<íòÑЋ¡O;Þ¶#_û£{G‹Ö8¤™3H“«u0r0&A›X³§m³,XWfâÌ#A·ëÖ™<­«3×íꔆ§!ÓöÔ¦–Xë: ØÞ¡vrágâl4­§{6n„¥E>mŽˆç´â”¦‘WSëœ Ö$X˰Ùk‰5Ô(YÚî*ŽFîŠ6}+Êð³ÌÚ©,Í”•-Íç4ëþ•§!S6+Ñ>5pJƒ7¬Q:¬eW³©ÁÓ@qN³§²·NM€V_¯ÚÖ~¦ºjŸ¦ÌƦx£\S»Îѽ¤á`ò4>¬×=í»W;Ÿ^<i†¨WxšHË›Ú&°1ö4­5* c —†Ï -ÍžÛjŸÝ®ÏiÓyî„-º'!Þ`˳§--yÚS †fж´à¬=8¦ö4÷ÎìiÙÒH8+ŸÓ”5HŸx™ikñOkÙÓ Z†m Ú¶HͶ´ ~öÖð4ŸÓ®žE [³)  ÆX-Á¶¸g¿@ZÀ&C»Ÿ9ë=§9=³§yô,†‚eÒž–gO@óø m@&δz ½3F‚j´O”'Ïìh,ajahÑ=K½ýiO3uìúîÿ0d¿Qb¬wöü·—w_¼À×v(“öG&­ùäN³K@+”eO«M¸ˆ¥ ªFÙÓÜ=—†/–diêŸc¶68c•§Å a&ÍŒÉÏ¢XùÞévXÙ;ðÕ÷AOøY—Àδ&Okš;sû4ev6öë³§X6û)OƒµSƒ±¸æ8—¶,< Ì2k°žf7˚˵li+âl.ŽiáiajŽ˜=Ý?É¢{†§EÿÄÐJç´}\-".8¬8¥ £âœ¦îy(afp¦ñÓ k Ä’§jv4S櫬¥á³÷¦Ÿî‰%øJžF§ýš§ÝùæÓÐÝËø í0‚–=m³ÛݤM­3{¥QBŒFêÆÉbÎ<{ÊÓ<}”‘Óò4ÃÆÇìil.#©`ŒTéó`GÃ'» ¾HÁç42Åqž=¿êiÅì9“Ûg%iê꜖P“Îq4‚¶‰ÙÕ2h}Ÿ·¤Ä^œÓÜ9­lg.¦¤¥îé%<-(# [ó4€`-›ÚÁ,)S·}²˜=A¼°Äs¡¹sÀf,ñuhÐ ÖX<ÔK5œ2G ìi äH³§=Í*yZž=¯{ñç/ Òþ½ìiM™û¦·¦»'«‚Ë4mµ³TÃAžFzø$04¯i"˜Nw65ò–›h¬zóÌÝ“æ kƒê£65ö˜Ú£*+P²ò}ºŠçø3{š¢˜øÄš ² ­_˜Ñ9I{šUÜÛ–¤ŠÙ3½G•< Åkå£ /Q‹¥wÏÒ¬li‰³pVÌž(ϞжìkÌͨ!X;7 7#ƒ6 Quqæ™@lå'’-f‚oÈ4{‚”ÿѰ§åÐ÷<3°(ÃÓð¾âÝó÷_/~¶ó Î^ýíŽ=-‡ïnyó$Óû¦ïÑ”g*ÎgÜÝž çÙS††.p6 ]ŒM±üE"ßqÄ2ÉÎMÚZ‡•=.:æÃÓÚT<±·ÙÞ ú‰ýúÅ­`óãzÏ}Z=}R+yZ£Œáh¨’Ô_xÝÓc'›æ šÓŒy)Ôp2ƒæd™6½zÚÒB82hXËœ‘½ž†òìiÄf3eajºáˆñ½E1~¢€Ì¹^š Ì°¥û´*ëmwO³&%OCÙÓèžÅ}Ú?cµ§õ~ç ÷ÞëiŽ¿ýׯ¿¾zùê×ïôí‚hú…ýŽ) 5k ŸošÓœ¥û4XS^$o~$`´ë/Q³†›Q¬æìÂÐ$"^?áL eT(_¦•MÍç´òç(3gö´JñäÉÖª@V³–X³§ý„¥Yøuîþé™Y©}æX%‘Þ×ã¤V`†“¹üJÎiTˆ<é™&׳¥•gÏäiu<­ 6´š³ÂÓò»çŸ——¥ü|ý;,æ/±\÷ Ø.//{Ù3k›„MÍìMÁVc׃§X‹WOºçÙpz¢.Ø2fv3Rެ±ø°æ S›ô’- 9É`L%WÓžXKáÁ3ŸRö´†W O#q4I¬%OcÉ×i-·Ný`ˆBñBpþúZódƒµ2j«Å½í.næ«¦Ï ›jÊ|Nc%Rÿtô¼¤åà$?°—îÓé0fGakËÅD Œ[ޏâ Ý:ƒµ#¿®ÛÓ$ÒXØ ÔÒuúü±°ðå_ìi¿ÛÓrüýG:çWIk6Ÿø™ÊH"ÌLíS;â… ~6Dñƒ!¿¯#ÃvM3eÑ8YŽIhó#Õ!;^ÙÓæ•í¤ìhåØeJ¢ç˜Ö L®6cOs´¬Š²Õªô·®ìÌËy¼°[tN]s ¦‰º´3±KË´9哚)c‘­•{§3d|pÜW&?;PRLŸµr1ØÈ´Ä_XÙ²§‡®#)uF[\¯ãiŠ*…™!‘é¤ Ô¢{þÿÓÁž<í7yÚ_FSºŠ å™jbB1¬Ô¯†H ØH‡A#v6´F‰´é‚5Õ¤Ÿ=Yíi^·«h—Õkm{{þåPñ+µ+Öȸ) K“ZJDFô·úŽ{ëü'5Рaâ>¢[ÎÌeÜÄ›LM•]Í´qJ²-’R÷¥"ÌÙýèžâŒ*Çiáh)ÞJWqHZ fÒÌZ¼­W‘)»¤¤,‘ö¿¼[» ìWûÓ>)%ª±Ç ƒÕâ݉ t„AKÿ±–ÉF`þìQÙš„IÐཤœ²ÐI죙ÆMÀ ¶ÁîûÄ ö”å˜äÝ“xPoÉ Ã0°W^Õ¾(¹øMí‰Ïø%Û K{lFSEcHKŠLw=&Z II°g|€xçÅóŽ-eÀ|’Pö3¹ü`oLq—w¡Yn+ógü±P=€L¾Oض§ÝcmDkåðHäoÊ„Á›Ùô!T¢'è¦ÒÏž¯DÅ$ëûŒ(«4H™V…û¤<¯´®)]àZ“—…ȶ¾yú/ÜËû ôÉåìék³>4†ç:x›!ýкNo盵Á<.gOÐìŠeÕÉU3…aŸb è#Œ&6<¡¨Vk“ž‚(åmg£ìJ™çW†óôË1…v±‹¶Õ'§‰²®‡ƒaomÌÇyŒû—C>ˆ46gO‚_ä\Ý‹IwUÜmÑgÂB$Å`’!\D”Àè²7» eûq#ó$¢ÐìˆVå*d³ÄhãÄ6:Š®Žé6jðcýÀ¿`À Þµš»å“ âkõ¸×ÙGOݪ:§êÖÅ!àÜÉ`Õé:§ªNÕ=éœþÕ©êN¸T’s ¸Œl2/\…§\Yæj$Y™˜ ÆXÉr¸¨n6áÏøáÆÉVu !ꪮ€ /Ôu=ʺ80Kh™kG£Q'6›F ý®˜V·²ç¡ÝùÖêáKJ}ûÝ[]È[p™ìR+ç¿ ÎóÇpïé~Z¹[Ì7w;¬ßétTSæm·XI⦈kX"¡¤h¬•¦½6ô[EmÓÍó`j~1ªG5P”Y½íS[†&:ȉHRQi ²=l’8&´zÕ:Úøv·7I®„ ¼3˜ÿyËêœã4Ú uƒÁ΀í0ãky.yø {Qyhˆý |Êi ø8¦¤qóõPÓT.…,=ÒeSJVno×™@á… Ÿ',"¨öBÀ¨T„cñ,À辠ȇÑÓ¶zå[þò®^xÏÝ»w?ùó;vìë;xÚ\1ÞŒ TЃ­àE;Pëwò<ïAÎÝJêÉ)†2‰ð+|ÊÉù×T<%Ǥuð;¢^0‹&ʺÖn¥øå$š;òj/„]‘F4@řܢá*EŸOûæ#»ø“ל;÷àŸÎ~åë~¡OÛ‡Õs®çiæû4=‰Ó–uxŸ7wš¶mó¼ìô¤¶}%Þ»Ô­è†l¸J¨L`€A k8_‚qñ)}¯æ ±Ztqr 4ƒI#Ž?‰Úh6ç(ªØþiÓUÜ+ƒiHÑ÷mãig¹øúÿð܃_;»¾þÁ[¿ÿß`š‰Ó†š¢Y´e§lÊ<ï¨jÛ>AJb¤zðèÇK* "8¡‚ÖI¯GƒCÂèKƤ,e.eÎX•m×#­¤D£¨‰"G*ŒRb0ÖéV!ü¢a jJ¤¦9sæÉ‹=÷™³ëÞºuèc!¦ýÏ^¹Ý_qšÇ´á˜îoÓžÚ_kr•¬5y^ô® @–¥xÅ£º”ä9Ȉ0ˆCâÑDì³»8œ¨b•¨e%G•¬ªQU±îH”µ@ûpv‚Ë$Þ"ÝÍ&Óã?*b3*¦˜¶Ñ<ý?þøÌ“_ýÙÙõ¿¿êÐoß÷­qOyOKŽºïí(<®ÌÒÚ—ÕÓcÚ¿l˜FÏa+O™düL±ë³¢eö^ÚÅ çq Ü5*C^3€·d‡m.Çcð‚h‡ûQ±°À¤) -dº®Y]wq&É1ƒÌ½]î7‰)d‘ 꿚ïÇ z³qà4¦5ß»yóæ§~ð£÷®úöoŽ?þ†WO3Qô‹ªi¿¿PT# Û¸«§9N£½'x8Æ+mnü¬(ÚŽq5³€nµénª-€'!‘²ÓŒA2Õi¹RvÀT§i"Ž>ÅTÊØHtG™æn¹ÈÃIô1»w³¡´f“š°—Äi¯>yòäßöoܸvíÚ¥K—Þlâ4ô+¸Ú°†Ž¶ äɤMU2Çó42-8Oj\Ê­…¤Ú6jÚÂÆi‘§9hó"§v÷Lû«äÕq”›Š*Ü!NÒIá‰Óp±R7šåÛ¥–¹Öy%ò:+ÓlWbƒÄÉvïf+•tâz›ÄiÏ>÷ûç?þ»µÇ/¼xãçÏŸÿ„Á4t ‚.`@®–ôkìKK¯…sQçÜã4“Æcü·Q&NCèL“€i¼è´HSŠ.•ô(”@tí¶ÅV|?L ÔsÒ1jsD‚“½§%!™Ù@–Læ¬ÊÆuÆêL»y”)F.ìˆíà÷f6–ÊÙfC9§=ûüGzlí§Ÿ½|᩾”xš….C–iÛ“ök’  Y“:¡âÜã4“4½# 8MIÞ–§Nñ’êMvŸ,/ †¡˜$L#¦ “j<Žèlþ•AÅ—›ÍúQ¬MŒ6¢Ó¬²È·¹–šëœI­µu³•ZÛy¨@¿q"uÄv€´‹ÙrÚl%êS³1 Mâ´‡úü~ýÑÇÿ|ùòå§¼§5"Ž+bcÛ“öÒ„û&¯–Î5ÿ8m’‚8 ~—N‡ ¦µðÇÏ{­I[-ow(ø%0 ˜íÄš-ыȣ ;%ÓaJ©8Ž‚‹Xxü±:ƘM°nÙȲ‰£µ¨ó:ËGY-²®ä4O€¿’ÄÈt_Wq ™ªlY³q3>§=üØÚÚë~õeãi^O3{Oxøq '0£Ð>í4­^‚iñ\óÓLFïKéL©+¶Úþ•6‡Ô¨œL*Œ¾BEJáãœp[™ÌJ3Á¶uÜA¯Ód™3Y-~¨W2€µºª4ÎÍAbÐÚÁ1âB¼ÚÅlÚ«@ƒJ̦ýkŒiÍ÷×ÖÞúÎïþÃx, ˆiz6¦ùÖÝ1-TÚÓVç†hÑyxxðž®È¬šW®\mõ™âÅŽõBŠÜ#÷ši¦ÀÈÎv9m•<ÿ´‰KÁ!:OÓ¸$‰\wµäU&…(¥\[e£\C·›y("´%ŒO…—rÚì™°eh6ÓcZÓl†ikÓ¾#° 2 ªÁट$êL1ç§)NÃÕSóðôÖÌâÄ›î\m H›²`¶×ET  Ðf+&®|´4iTV÷i®FX=eÕ,HãB1û½§,ë¬4‡j"ËŽ²¥%^ \åÑ åüƒDßa9n#£ð-ð^F ^ÇE0Ž:¾‰Gçi¦€8m£Ýèõ­,v`©®tÒå夶n¼6ö5NË ˆîËàÇ¥­µGÓN£ o‹,0=ËLË0]Ÿö𭚨ÄHnUâ{þ(??eêœv[x›Lb©ÉÀ6 Ó÷iÙ BQ…!·Š*-F4Õ ¦`…™wuN« —ÅG”²@ä²Gœ’Ø.p—}Ú¸J$UaÊÜœ ³)LÅõâªzu%äIƒeÁ†ù|Ñ6NÏiÌC„û?MÌqfm—UšÉ”^æV:æ»ìA¸r¸ ÒZÏ.iYrÒ0ŸKâÏõM qº> Œy@I$#Öœ•Æd‘.vRz™­œª¢cí‚[ž4Ocq˜Ï’ˆ–q–œ&ÕgDe7Ftt›!dîÈi'×»â5¯q°låIç9_Jâ’(¸®(§Áõi³mª‘4¤Ã©Ò(ר¡êm]r<¡š­a21GÞb¬pš.)Å€ª2ÿÊiwP "¨’‰3àhGî"¼+öíic<Ó XÚ·òD)Ÿ‘-)ăkÊrŸ¶}›¨ã±ÂxÃÛ?Žqš£Œ\èà¶`ýJ+8Í~#[wŒT­zâ Ø}X¶DÿH&CÝJóõâ÷Ó4è­è`Ê ªKZxãÞÃ÷i7Q‡…Ïb5áÞ¥> ßìš± D£kíÿ¿$Ê<Ç…– *Ú|Êéìp8œ@Žp m²Y §§k›WÌñ^ßò"æ½Ë?-òOÍÍÐ`ïÊ’&Gy-Qoµž\À}ýÖß+‘øL’7™ê˜ñ”øa°]Õ‘¡:éØÜ8tòs/;wöüLô–6®ƒˆ`ÑO{ÜéFŸg“M ŠS4‹“ÔÓÔËÙãN•M{/©lkuh—æÏ$âž°iD7G·OôÚ»[±i¼bÒägø?Àž§®½(`u~äÝg“#Ù´iárèµ'‚M뤰iÕ4O|öÓ^]=·œr?÷@Š#ú'¼ýñ~¯†/øiXùïôÁÕCefÓ¸rÇÖì›´iïÁžœò¿g£‰içêÙÆžwr· ôö^û†MƒÅ‚àEmûü.?m'õÊãM-Å.O\~vQâ³%kÃ]\sÞOû?íc‹‡öìÉB×Жõ³M›cÏ£üø•ú;ÈpgeƒÎÁÏ›¿Ó^MÛòÓ>-Š=Y¨Pè ‰=7¸ßI|ªmÑ\ÃèßÏÄoS²Vø`Wít~?í+ØSû‚=k“&´º'°gÄeR«-Xâ?ÍáA²cE»Š­+8¦ÞÓãý«gè»bOÅžfBpWölùiFX°<Ä76íFd‚R…Þ„_XVÌð•³Óü§=^òÓ¾Ž={ £&_Éõqw;°'’‹ÊèØ#ÝÈÀO3A•Ê1ú‡ l1Ù`ŽÐ‚ŸæŽì§uÅžŠ=ya#M(°'lE{šyv‡Á@i ›VŒ2ÆÄžâMЀ\P“ZòÓ^ÚOû*öTìY»ahر•‘*`ÏÇúέA®mœ×gná§e›–ô-H¾ƒÀs‹6mQ4{{÷TìÉr[c+<Åv{? 6­ÌÍ›1Ò¦¥Fä–ï§`k­ c ÇüÅý´/bO{Š5Sê/™4Þ÷,4x¦Qu*7¨ímî§™ülòëò³ó.‡‰ýìÙ?î©Ø³½YËò”p'öÌlZq×\â±gñÓŠ¤;eÃÛ†8ÆÁý´þqOÅž\‹Ü©…”÷4 6m {›FÆÄµIŠM#aÓÂöØV€°g︧b϶ÑjZ5RÛ´ýgnŸÍˆ·qË™yŠ ót!Ž«'4þç%?í»ØS±'ÛÁ¸ð©òÓž¹m”áñw·m…³w™b챿VÜSÏܶ[ˉkœå8q!F°ÇG? ûiÿuŒ{jÜÓ²L%4mÆ=O^XÀ¶/"ÿãg‡$î§uÄžŠ=yÛ¨±´r¸çÙ+D£öµ{ÝŽh9gÿc+ò=¿„={6µ–¯†]Ž7ž¹%{²öÓbOÅží'ö÷ùiÓùv0‡üˆqOÅžxÂCî%öúú38öTì ›¶™G0ô…ZCÝò=5ßSF5¹ÝÎ÷ì÷Ô¸'tMÂO± ?íZ«§ó_Ž{ª,×å`t+&MÚ´Çð«gç3·Š=¹,–¸µ½´:Fú+ùi}ò={ kÆ‹Ûi\;r{^ÝOû’(ödq²V¨Ëý´áý4Ôîî÷Ô¸§LNaX1y¨ƒí¢Móïžý±§bOÞ4ÿ&œ‡Ús¹QtE?í»ØS±'Ë]cM~ml`Ü€=ü{‘ï©qO¨‡Þ$Õ2aLCu9F¾P»»[ÜSãžr3#kXT2Žƒ€ —‹{öÏ÷Tì)*ÚF5˃ÍO²f¤¯±çeÁO§|O{ÊP” ÍF_ Ã<¸®qÏã½bOYS*f1`íÄ~])î‰3·âžŠ=E!eSùjœÛÊ#¸öüÓùÌ­bO™ÚiгÑ2 ñ%ý4œ¹í—ï©un+üÉbY㞇E±§Ø'ÛjÀžtÁ¸çùžZç³M9=5î©un¡oÛMž¹½Š¦¹ÞùžZçV„Úr{jÜSëÜ&9â«á,Ç…ý´ØSëÜ !âg9>¸zþïä{*ö\/k+_}÷,‡[ýzæ|õç÷Ô¸g jÙ÷üˆI#Z3rt©¸§bOβÁ?Àød­¡£*µúxxÅOë€=5ßsµ¸->¾;î¹f J«ßƒ×¾„¦õÅžšïY„iì2ÿ6vZ±Phõ›ƒ×Rcyæv~OÅž¥çÕ‚Þo«5ä–}²Ô¡Õ6®z€¾Âˆ-=ßùÌ­bϦ.µ]5Ëo;˱»ÕFNΉҌRO£×—ßSûölG ˆï;së ÓË=šß¸’øŸ4Ã_(¶v~OÅžvݦáã±3·ëíqÿ@û;“»Fâ÷TìYán ƽØs«8¼+TëOÉìÅî¦!t‰qùƒb®DSPÙ¿n&î©qO˜ªÝÅ!¥ŸÖ´i›4 ïL¢0€‰]Cœ%²Ó¼c ~OÍ÷Üy2m5ßsg8) õt™jRs°Ï¹±7ÏÌŒn+û; ¿§bÏ*¨¾Ñøh{&ï1`ÆsTÙ´LñOX(+½ÃŒŠ¶áßJ=¯¢à4†ßSù=wµ£qO» å™(Ogôë±_ÌdöE¨Uœ¥çÚèÉ9Yûk¹²iÓ(qOåX©åV;÷Œše`Ù‚MËóUqñlj2©'¥‡<‰øíÍy\=3,àÄ•7¿§æ{nµ3ùž&ï&ÏBò)è×oÉf“ž eÂÿç4¾£8¸Ûêû¨i&5›¸ò†â÷Ô3·èvY5Þ÷,Ö,ªY]MŠM†R3·05i’ÊïÒtMÀ•ǥ܃§}~OÅž2ÞÙ–CqÏg#“%¡Uˆ ¾I¦¬(®8¿ ÷4¯žQѲM,ßS9VØîm➆(t•M#|ýºKã-[2а›Ü³ú§Ì §±)¿ÑNãÅ=µÎ-oÊѸ§)6- Ót%úõŒ) ìiòû츬 °'~# ÷Ô:·GLšà# ý´hÔòmò ôë¡SfÒ¤,¢v9Ÿdç…{ ~Zÿ|OÅžH~Ú+ç8VZôëØO ›––Kƒa¯÷‰ºãðÓÆˆ{j­¡c öÂU+Ç ~šÔ—컲ý‹±SÄž‚‡½_ÜSk •·q¬4×-s>òamÛOëˆ={’=y½£Ö¿·~à¹ËUg*CŒ@ð°÷É÷Ô¸§œ½îLäè%Ž•ÇÞÜîu[ðÓ]°§bÏûùVq¬œ´iöãm<ì]➊=SÊï8zey‰ceúBƒßS±gj|â&w ßSù={žoZçö˜h­!ÑSÌñæjüžˆôŠ{j¾'ò¢–u S|Ô:·'z=sÛH’‰w˜ î©üž¢"kwçž÷?ÞkÛc½öÚݰlx^/ÍÃÞ5î©üžP0Iއ÷m>‚ñ5mì©ùžh²x<ìÝOë=µÎ-|1 6…Iµ»ýè6m|Oå÷L]Û¨ÉùãRØ5!{Å={6@æèaß®‡=‡È÷Ô:·Ü ói%ƒò•yØ;æ{jÛÆr‰Wâ£ò{Åž,Òž¤QÃÇFíîëð°w‹{jÜqvµQŸ/÷ìæV±çFix–{¹²ÖÐuxØ;æ{j¾ç¾Ò|Ð3Ö¸ç™^±g6ÂbC—Ïò°+¿§bO Ä£<"y˜cE㞊=…Qk“®TvîqÍý4×+ßSãžm£Æ ìyÉ3·Ý㞊=Û†¬ =µ†z\ãó{ª4lŠe<Ãõâž±§bOìd¡VxÎ}95tÅ|OêÉï©qOÞà]R>w÷<,ʱÂIDnŠˆ‡‚¿äŠy=ëÜj[iÌÚüÿxàobÏwiZWì©Øs™Ø/ðˆûËØ“Þu–ãÿºò{*ö”¼­ ˜|{º×­šàÌ­Ö¹…´VQhÿöŒ¨û£`¾ÿƒßS±gÄáYÄÙ¿tævÞ\h%>óàà÷Ô¸g”|I· º…wß:s[W­W’лÿŸm$2 ¿§æ{J¤) ){¾èǯðùÇ'7Ñ…ò=5îÉÖY"@PF–*¶ÎܾêÊ?=£W1ú[¾Û6m~OÅž>6²b•¬´ ÝNŽ••ý‰eäk¢+ý™Î÷Ô^Ø4?=Û¯SrP)¹òŽ,r£¶9VŒÚ™ÝØDj ºÿð«ë|Û¦Åï©ØÓÿÆþù˜L›§0„;¿I/Éû?´›ßÓ¤–ôÌ‘Yڌŀk̃—.g§ù?`Ó.÷TìYvÇ&KqÓÜÛiò6èÙo¸Ã”žoÈÿZòSüºŸßtQ.}âŠoÒ‡ò„O5(™D•M.qÃÖî·ið{j¾'ÃO£Éú_"†ç=…1ºÇsT.ò†…ËãæÂlų7á{ʧ¢¢þN™ì3Ùb0úÇvØOëŠ=5îYü´çUnŠê”îlÍž³0_‘G°‰=MìÒÄ„»¼Æ›üõÃÂfbO£ÿ>›Ö›ßS¥æ,öaâ 4˜,4 ƒŸÊWÞ‰=±z†I1Uq}yC®|ÏŸf¤ÆÉ Ó?›ö Fÿ°Òt¥|O­s›´ªèù2å¬imœÛŸ…³nÕ¦9cÀZÇÒ‡oø?-s´ÇEßRÅèŸlÚ¥âžZç–ýd³QËîÚß4jÓ#§ùì ?m™‚(¾)Ã̦ep?-™´4±ÉËÅO»VÜSÏÜÚ)õáËcœå‘ÛøX¾îÏ÷4¹3å&,‘áM\þ–j?²I#ð¬#çÔNWÊ÷Ô¸§8Ï- ¨5t{:#±'¹ò&|Ø ›¡˜±ËNâ‹Ä=•czÖÐ1Ù¸ªÝáðeV>¦™ÐÒvÙ¦q¸È>.÷TìÙ6cèØVRöÓ^æ÷4›ˆ±R‚d‰­¥¹M»V[åXa‘CS'šˆ{~€Ø?šbŒ-ü†Ã~ZÏ|OŞРV&T-öµ† ¸ˆÂùÇízqOÅžyÀ”ñ°”xüvçïëŒþ»÷ÓºÇ=5îÙ(Æ'‚öOç{þ!»ÞvkÚ0qOåXY¬ L lÚWêÜNÛí¼ŸÖ{ê™ÛÕ] ^2j¬unöšï™¯ùÿÞuøúÆ={bml{ÿŒIƒ ¯Ÿ¦])î©gnŸ+Á™ïÙY•ÆÏ÷Ô¸'·ø=ÛÁ­s{¸Wì¹eÑd° ‘ï9¶¢õ{*ölûhí`´iÊï¹Ñ+ö\³hÍ`7➯ñó={n[4Y+þz+ý㞊=k| Y ŒËY<~¾§Æ=·_˜c¥SÜS{q–#Œ=cYç¶›¦ žï©RE£¶ š,®öиçž^{Áø¿)và}|÷Ô^œÚn\º…º÷lˆŠ»k"ëÞÖ¹QÊï¹Þ+öCÙÎVŸOƒƒæG·i]ãž÷$ž„9Û‹?e­¡‘/°c÷Š{*ö<Öæ;· M£kÄ={bOÅžlI.é§9ûÛ^ùžŠ=-Ûƒ 6í;gnß»Ÿöèˆ={òq!ÿµ3·˜¾ ü—ãžzæ6Û4²'¯¯Å=é=«gì©=ü4ÿ8y} {†F¯_à,î‘ï©gnéþBs߈{Ævõ¸§ž¹%N†‡ï(_É÷to2jˆt‰{ê™["">w3}!ß3µ/øiŸ=s{ºý~‡³ø]6 ~ZŸ|O=s FbQíë,bŸÄž¥½¾åæÇÀžšï™šœ±<˜†:·ŸÏ÷\³i«,¢M›F¾sÜSó=kKÆxÆËª}¾ÖLZÃÞa&HõHhÚØSó=…šÍŸsÈãÓ~Z£¹ÒCÁœËÁ îØOë€=5ßSÖQ.ÙÛ/å{‚í¿j}¦ÿ÷Oùñé•O—Ÿ†Ì÷Ô|OnÕFï {úû¡ö²Pþö_ÜÓõŒ{*ÇJMó…’K+&Çž Üa€‰&ågœüu —ï©ØS:û,&bU}o­¡–¦ÝàªÓ­ŒåíœÃNó¶D½‚3·ýò=µÎ-ÏÝ}aÒ$åwcÏŇì¨CË’1Î/+míT»VPû!ÎÜj[¡c-wÕ„Þª1#< <˜/,£°j7— 4—už—I~pæ¶[ÜS±§T(Ž"' (°gƒ DÅávbÏ•â<‘©ü4St+òþgÓÁcKbíïüÿÃ7VÏ®gn{ÖˆRÚ4LÐvç°gM‹âŒ‰³0æ!M()ÎMÆž7J²IÑ‚8˜6PäQú­?{ÎÜöÊ÷ÔZCÛ庫ÛölhZ&*.RnL“PõD@&Ü&hYlpÚp¹[ôÓØ¤ÚÏÑêÜ*ÇÊ6tî±QkÔÄEœÊÔÕ°z’¡¤lIªýH¦26¡µ¨Œ#è÷TìÙ.k[}ç#Øìý0VbˆÓÐð¡ÂžiÍ$“V9ÜY@ÏnŒíç`qOÅžÍí ¼¨Ÿø@MHãhM«ÿ0°ç¢% -Íò^GuƒÊ˜­)ÇLì4"¿§Æ=Y®’ò&»±§*ˆâ̲Ms•ÍC4Ê%›–Ô Ïåfq&够öiQì¹Ìö/P(æÜØOk’_›b©Œ©mn3³p{¦aõ¤ÅeÎÍ©ŒÙ2­ûi½âž÷l1±Cé$"=÷L¦k÷åË~š1±“Æ* 4(¾›~Zì©qOiµ¸88÷L~ÿ¾K*­IEÏN{¶Î§ÑüžŠ=£pÚx {¾ù‚lo4­aÓÌ÷TìÉËdÿ›~Ú{/yj¨}‘­ÎJÊAѪAêÜ*öäÆˆnaÏœOÛÙd*>-¯ž=±§bOnÆÔÙ6ËÜ~£v··/´©Qkh~O{JM6þ^¾çôRz;Æ™[{Jœ‰]5ˆà,V~Ïc¢ØSº]3i¬üž§{ÅžE¼"Χ)¿çÁ^±'/ÁKn˜4å÷<-÷\Þ©m4øiÊïy¨×¸çr,£ç±§ò{j¾gY,KuÈ<å÷¿§bϸVÚɲŸò”ŸCÒ»z{ÍË<‚þ×øüž÷ÄùiŠ/§Ùt OSeÒ.÷{ê™[Ø«r3^.VÀ}tˆ{^›ßS±'g‘-½šw{jÜS±'ÛÆÉ Ë­ƒ.~Úõù={²<Ô ZÁÇëÅ={ó{*ö…û*KwÉý´þüžÊïÙðÅXzp|YìÙ?î©qO‰/1-¼p¾g~Oå÷”+d­bÂÒ]1ß³3öTìÙf¾ã¥…•¯’ï9&¿§ò{²@ò‰_Þšï©+2ÀÒÀa—Ì÷ìÏï©qOn!n›4Í÷|±Wì‰m܆I»z¾g~OÅžQš ‡Éyì©qOÅž+ µ€ú±ó=‡å÷TìÙà,Yí—Äžýù={Îõk­š¨Óñ;î9¿§Æ=atX·5.<¨˜Æ=÷ôšï‰E±í²IŽ`ºWÏù=5ßsƒé‚1©ù‡m5îy¤WìÉÂGÃÓµkBöç÷TìɰWKát®'r?mPM“ßSÏÜ¢ñêÓÑë§ Â墳kœ¹Ý9ŸV°çðš6öÔ¸çÞ Û°çˆqÏù=5ßó¨I;=5î©Ø“í‰Æ6mLD0 ¿§Æ=9]G&ÖlÚuVÏŽØS±'Y²'„üž±ÅigÕŽßSãždéŒTvl«EvêxuF£ƒð{jý´“m¹ÖAµÎY¶úï”Éuù=U²¦tJþÜ8s›XúËÿÿÙ;·$7R н%/`~gý^Iª¬lõç/]¡z5”€ð½ @ëÇt’É…í0*¡BÚj⼚uÒfç¶CìÉÒÛœïó‚M{]ˆÜ‚ªÁäžäžg“HS?m'3“{Zñ¼'¹çåÉéoäžäž·hUVí÷d&÷„þîIîÙ'ö„xÞ“Üó”è²û=™É=Î=É=ÿLË=ß4#÷dì9÷\iÂóžäž2>÷ÜÐ|Ü“ÜSõ,#è`Ò Ù¸'¹§“֤ǧcÏmMÆ=É=Ææž;šê¼'¹gÐÈÜsW3qOÆžQïÜî«ÄOû=÷$÷„*ý4Äž¶X5¦#åý´AbOrOHOúi"Ø-A«]Ê(ã§éòû¶ô?ïIî™èÜê©afY‰¢Õ(åTâ§ýt=É=S±iúõx»ñßKÛ¤¬2ºü³È£7÷äyÏ• ý4_mßø¿34óåÛCòʬžcÄž<ï¹Rýê‰{ØÃ÷¯8Ø<+L$³qû?† i‰r;·–t>ïIŠÕóçív|œIhÛJTÓ™–©‚T¦ñ¹'¹ç–jŸ5´¾‡—®×ö•¨zK‡>ŒÛaÒQèœQ#èË=É=·UË=¿¾ƒ'˜Ø4\Ll_1 û0Ulª”ê´Ÿö©Lî¹£òØÿiŽu©$6 ãBâìuì{D‹Uá§õˆ=É=wUÇ=ýBäòjõ„á²ÙÊ}9úPaˆï‘ Í=É=÷U{&6 G˜Iï†Kž¾WèÓôVvßÄ¿¯Ò÷»sÛ“{’{)ã§­bÏà.w§Œ­ŒzÌÖÁv©÷¹ïó~tXYÑS©¹'¹ç¡ÊÏ{¦7þ‹Z_o¸Œ ]Ƶ4öÅŽØ4IO¥2ܳßyOrόʹç×$‹Ü¥›Fåžäž9Çž÷Wi7ì§-¹'¹g^¥Ü©«öÓnŸ=Y&ûiª=ïÙYûiýÎ{’{©„{"uWÆOë{’{–©êYCýµ¹ŸfmZ7îIîYªŠóž#hg?íÖ{’{«ü¼çÚÚOKý4ü,àÒø‹±gµý)=ï9ˆÆâžäž5*‹=GÑæ~Úmí§}$ö$÷¬S†{º4Œr¿OØ4%µÏÌàžµÊÇžã(÷û´çÏôº„e˜iÕÊ>-a$óœ[rÏzåbOÓ¨=mÚÏ÷¼$øb¹çsÏ¡tä§áÏãñíŒ|HMÛlG?픎bÏÁ”úi¢Ñ¦‰·iˆR“¯MÚlƒ{žÔ>÷N‰Ÿ–<Î¥;ð³Y›mpϳÚ=‡Sò‘ì§!ö ÜSÛ¿ø Üó¼v¸çxJiÔÖ½Qª»z.%&Yî­lLÛ€Jü4ì§ÁOùât¸6Ýåÿh‹{Ž)øiª°iÿ±s+Ä@E%?æÖï÷Kn·uíY ‚Pd‚Î@ï„Z6²y] U?{×z²ðîsÚ’zNëý4å*Y_´œ¶ò¡õœfÏi8 7sN[T»÷<{?í`{ˆžÓXVï§Í9mÑsÚÂÐQpÿ>]„W‰¬~h2Êùßóå6b²Á¡ÏÞOƒk'Q"î°Ïé-‡ÖV‘Z`›Ÿöë¼®¬?|’%Ì9Mxd¥R(Øç§ñíxp¥RHŸËQOññ‰¯_ì]½Î1 +úb]ûüúß1c!D8Eí¥SFÒ’-(™™ðâÌ»I Ë^aä r‘–“3kȲŠtf¼¾ËÁM_¹­pe‡äô&oMÌǹÞåîo$ŒÁZÑfvŠÍX<èÌÞ{ަå"×’¶X»ºýñPhîFùubýŽ€»FSÖ>È ªávŽš;Œ¦ÅÖ´=“=-ÿå¡ÛD…+ÕHÓ·9¨GF_ï=ùVмJ“´ÒwUÅh`õæî^Ó’ëã´M] ¤*@ü-Yˆ¯N…ˆ¹T{O̽'§ÈŒÅ„ÀêË¥¨¡¢ô½Sz4³ #ÿ¿÷܇¶ÄêA<„âPˆQ ;% 3×È9OËëÛ9åØ0ÄêY± uDtJÇŲ‘ÝÝî=ó~FÚÄDvÉ¥WÁ‰)I“z"mk³¤sÞ„œ“Û²;XÓ~VP>Cu,tê–-J’¼·%X.mšÎ˜Ü³\Ęâ7uHî3îä*IEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-netbeans-04.png0000644000175000017500000004653210536106572024740 0ustar gregoagregoa‰PNG  IHDRØí¬îžÑM!IDATx^ìÀ1ð›´9\ ûN’$©m’޽3ë«HÃð[çœ^'q„ ÁÌW¹3,Ng±ãì@Ä\s7š¿€4Ê‚?0#1}qö•@3‘‚F“‘E‘Î"㥻OŸU¨ªu*ݧ/1~•Jï©n×…¯}ßwìïï|‡B!$À"A!„Ùôù‘3˜k”RÝ|A>]R÷ó~ÞÏûy?ïçý¼?µ«óžˆx "‘‘t !„BHÔÈBVÞ+Çȯé¯Ä¨B*@qU_¾··P(Œ=~8´uÑ‘ËÖE!„200€–)•J2 š."b!ëžÞ«DP 屟r}ý*4 OŒer˜{ðçCÿ[©°Œ!„BHê+/© ‘o!¿Ÿ¹WÍ Z¡¸¶¿#а"TQ=«úª“cýi8RP, dxçf§Ï]ÃoB!lÍÜÿìã™gz¢¢b­‚‚ê)ù†¨ÎàÙ4~×*ÂÊ•Èa9tp—‘ûhrÇ|°Ðæ/ŸÃq`Ïv8pìÔE´Ì¾á€ã§/¡5öîÚ àäÙ+h™Ýƒ[œ¹jZ`׎MpàÌùëxCÛ78{á<·½`äâMï±CvlÝ`Â…+Í4yÛ–?¸xõvƒ—®}ƒ4¶nzÀåëßây l| À•ßa~ „²þ îþë–Òžˆ¬~I©ua ²¥¡ªeLÍèò¤žªA‡è3Xý´6]ÖFañü£[¾86budÎ9zò‚‘’ý»·µê"FAæcíãû‡UtŒ‚,&NPÚ˜Ê6 ²xBáó%Á³vDäåõYÔT£:…J¹V‰(è@­|M_WãÓúñßõÃQýtB).òá!›ÿqô¬=‘,Á‡Ø† hÊûûv&j$æäȉóîÝ‘ÈÎ9Ò1Õë%þ!åÿÑpâÌe[ñ÷ غHâD‚­$‚-ØŽŒmÐØ“´‰QW±ÁüBˆ ;KïÂs—¾2!q~þò-¿"‡¶üÑE$À9ôµi”6¿S_#‘GãR 1»}„ÅTA¶.B!tûØIk&Ê«¸¬€ TEй5èyEÍhüp§öïËñ“ûµZù 9„b4f·Áú‡,“;CäÉ,óècuĉ”=œ‹¤ëˆ ÖHÄ9D>dIð{4’Å?D;d·þa1ÂÑMÄ–¬ˆŽÈ’ìˇ_IíÑÈý©…ñ#²$Ë^ˆv°Rb¥‰‚ˆ Xç°"ÙïÈ4*(¥Äù øOw !„"ÿMwÎ[3 („BáŒÈ/ìݱnÓ@Àဢ.ÁTÄÄ#02𘠌ŒaA ‘‰Ç¨ºd –ùGý[wéÉ‘íúûÔÁ½úrNUÉ¿:Nu€9ÜÞmÆ7ûM¼ÜŒ@ˆB@ˆB@ˆB"B"B"B"À›·ïOs;†\€íæ‰Þ½~µ9óãÏýi¤ÛhX5ÿü¶‚¥› @ˆŒÞ¨‰O´Ýêý…„òõ DÚ¥ßîä‘س‡@É¡·Ï7âK½Á‘†Õ ƒ)§jsÛ,ZŸRÿŽÍ D¢"b;Éé£Û΃±'²c¸9âBEuz¾¾ÒðP9 º)ù‘óÕ¹Ý`áÀ ß–òþOZbxŸE„ÈÿzèDd ÆJ‘—{ˆSl¯íÅ‘ê”X¢–A1RSNŸË§·=¯¶%êWtf "ùÊG}·zÖ¤¦Y šOÿ#–Jýu–š¶¹yé)ž{„`Tà:Þ¾-²Øþ€hŽE?… ûàÅñxÜÿú~Ú:ÜÞ5¼w7Æ‹·¦æ‘g§*7û¶÷©^~Ëgù•‘\ …;HBíÞÒ¼tlWç¶Xìß¶n>ìiïTøüåën·K!rn"äÂ"ÛÍÕå \7D¼ò£Æ€¿¬ ãÅåÊÿ+ €ß¾¶3º°V¼}@ˆB@ˆB@ˆB@ˆB@ˆB@ˆBÄ÷þ²oÆ8rÃ0 Ûî1Òm±Ø*÷¯R)Òå{ @ä z´¨˜ž€† Ó$%~Éíñ4Ü’ÒsÕPMjÎ4Q-…·÷o÷ã~À¿¸RÉÿŽxŒEKQU¸åf!?~ö㜀{sÎ@NèX­ÚýXöÐÊ_?¿ßV^ûϧ®‚üŒ=@:uǵº{žŒ¯ÆSÿBáå¨lá¡,d(ï ­Iä”»ÑÊ¡Ÿ‰Ï‰ráÐîtb D‘ÊOîìF…´Q`“|*9í…¤~‰ ¥Î)‘ö¬ ݘ‚Tj"ËŸ ‡’–Ít¡IÆ¹Ž©‘g³bCþÆ ­‡?ª6eÉ´Ñ&D¹²‹@d¦›?jÎÞK0MÈG[diIçdØuJ ‘ù`Ê—c¸P‰Hš‹¨Ž¾Æ°JÞW õp¦kî >·MÔ¸-ÓTe®¯jEÐå“&&¹ rä!L ød?Eb™#ùjbÊ>za’'èßž'  Qˆ‡t†ã(T"¢¿Œ´r¢he? Îýc!¿éeÞwp¼‘û{˜E´iÖÄQSoêLó·œJz|R€ùƒŒâ¢ g£ð²ým„_Ã%‡Ø·”xã¨dåéÚb‡ú²z`#Ï#;É:L]¼Ûñž[:Åúf‚‚·ß;)ɤïÂp÷ÓÙ2_ˆóåÐÿL:|§×æù‹—«Õj¸`|_tza<5ƒy©ýËñá<8½Îp_&«D,ù ‘Ìb¹±œíG—\åq€9"³—q¡rŠ€¡W·_®:¾¤mÉ\]ƒ·]Hؽ©½Øo%C}]_Á ûö‚8â²½4ne Þ)…Œí~©A ‰Õ5G’Œ-ÀÐ7 ýúŒŠ>óOóÕC¿(¤=üÐ b…då«î$¢’˜1 ÑFDò³,óAI̹s¥ÜLEÛ%ÇŠJJÈ06¯6ÒXô‹Þ`Ñ»þoV̈à›o¿ïPcLðÔL'å™á˜’-pÿèì?üó×T”o@¾ ß}yþ1à|ÄoI¦œæ±ÄmQÈuöÇëº:Ô»ŸÁ€Õw›E%ÊOµ¤û’¼¢“Òm— ¡Û?/ä§×5’Rê­çÏ7 ¤×r6NÂ&À껉(§¶ ͼåv3‰eÆüe#´jÞ’¼!ÏÑ(=w3ìë¿cþæîÑÎg¤®±ü%¥Þ€µŒežTlÜ8@ÃÞƒXô.Oìà3Ëí.=póÌ[’·ä9.ùÛ%!gèì§TÅ@'3Å5.Äbc–¨¨€a^¼Ð­™|L“‰öv®.ù%ŽO´"’2nóWjér\ë& Aïvëª7f‡DÉiª›Ÿ_6bžLþ”Lb!{ÿhéä‹ #7G 0Y5&¾Ì­æ\–|ÃnƳ»¥×)QÌv¯‰%í¾=CvF ?»ØðWGˆ,±ŠleUÛfgœ[n·‹ìÌŸ9Wó–ä Žù6JLŒ)Ó?æëŠÛ•ü%H4 |œ|j™¬¾‹Õw0÷]~4Àê»C‡š¡{Øá¼âV¯ßÜÚ?9˜@Þøx«+€ßÿøs3K¡©™ÍÝ–ƒÁ¯€^U¾¾¿zõª[õDò/–í߆˜x úÉ|}?D‘…^‡š(mñª5l 0$úËCWˆïªAUgÕÆ€Eïš…Ç@!nWV²]I™S{µœÒžú¾É†5þ²KûŒueéŸN5Æèæ 9¶@$®‰Ÿ×ÁÍÝãøJ£¨öPDÙ%–«hî[šÚjX<-õü—ªb$,þòþŽ (mèš”ù‹ÙZ3Y¥‹M–ÓwŸw\™*:ÌoÅÛêÂ73ïšsvD$—Äî¿Ãd‹æ}––ľ¡a=Ž}{tD,B×áÇ”¸TòoÄ<3PÒ«97MÊDT¸ùR6jW]tüóÂý”c;òƒîÂË?_#‰¿ Ë_ç/)%sØqgÔ2–yZ±e#âUSnÎÅ<ìÓsª¥w¯$F;w,)!ŠjR/yg,ÒÚ·h5¬}hù*ºÎTÅøGû·s3È“Íî¿#Ü”‹9ˆÄþ8YBL‰™”|í­coï;þäá'vé|àWgå _üªó×jIX¸X(#cCwæ—ÜY¬dÊ4ñîP‰E_ûjz‹«úËŸ¾!Q%1níbð"Œ˜²Ù¾ó·K*™ÅfAóò>‹Y ô މ1%nWò‡ (3fÅÖs¶Aâªëp17þÖD` .Z¡m"!±"`‡Z˜CŠ‹–¡ãÚ°á‘Ô„Üó¨]j|ÀŸ}™¡Vïî¹í<ñò‘Žâx›²ò$ ,?cá±®˜ÒŽBÚ…Äõíbþ˜Riä!:==mg@ ²hÏÂŽ)yJz3ì;œ˜¿µ$jg-•ü•”‘üéÙÓ'íL†o"±]ô¥ï¡ó.yŠ\—Äi·f®jŽÈÎ%v+Õű´X`L™xhq÷íÍvŽ5¸Yf½Í%å(¸}~~~öîízë󽓒œ†Ç€ï~:kæY½~óþÃÇ_~úñV''÷¬nºÂkfæïjµê¶ú.@·@KõÀZÏ‚=\ÿY®|àç_»Òg=ÜÄióó¥.¹áXO:?i ,0•Ä ß†Ã>é€9"ÿ³w%àUWøœ·e3kµ Åbƒ,1$ @1d©µØ6µÕZZD) ¤*Q]©úIYj©µv³¶ýºa‚T‹,¦ ¡RùR—0¼Ü7=÷M:ïæNr/ðò–û2?“á̽3sgîú¿sÎÌDp‘Á¥› "0Ôÿ‚hÙÜÅÅÖÿó(øOll)$—rŠ„¨Õ° EZd@ÅÍuHm0ääФ¡Ë$¸ø^c›¥ãÊ}·È*Ðîà@9§\©ïLD—MI=’k<¼ýõ²ê²)iq½DNùr›ºlq\‘”wµJ1—Õ}bª¡ýn²Úß'ò£!rZÜ"iÿhˆ?éT›úcqQä«Ïx c—úOÄqÛ{RäGRî»ý£ÁxfÓ© ÛëeùhÈ—[¾(<¾Xø@CAMñ^¾é°Ã¨ ÏÈÿ.Œ—vÂèn,O JI´ßA×Ññýu~—ßlEDˆ…dÖT5iœ“ë× ôàHÍÌNNOOII©;vtLIqùæ â"ñõR` ÷rÁo¿‚‚Âmƒ2/hÀÂäe/c¡ 'êz #|© púÐS`@úU?ˆÈÌlr}ðÆc²{ñܨ½`Þ}¹Ì˜ì7fqœ¼+^¸Ç˜¼îv~¥âÖ›GÔ¡ E2¦MB©Bt #òVÈ/,¦¸rï.‹- e¯!Õ‘¡&ŠJò]\h3'%…"ç”ò8vønÖe˜›çéUèí?Ô›_äíÞÓ}I–NDü`nÈ-reuCH†ê0á’^÷P áÔÁGÿׯ‡o>Fñg?ÐíZ s)@ÔÑwô¢¾£ë´÷ïs!ž0ì›O^wÛS‚…„ t¸+%F Iêw7‹N ‰¯6%ÂÁÉGâ±5õWW)%aT“­‰DRl¡Jx)Q¡\›ƒ5"]ò}@MƒæFð7ü¸˜ 3®`©½°þ,;ö+v´†l``‰ú:Éè=ýä»k2ûL'ùÄ;Oˆ½Ùù?¤ø“ÊÕç\=óøþU$\Z0ëXP¸¬p6ŵ{W„ZU4‡âš·–‹-]Þö€ê× ¹ÇÐ)>Rñ(ÅW {ˆâ÷w¤ì³CÊH8²óQ°Äám ¹ðÞk: ù|É‚¼’…H>´užÎ?¾ð¾B<Æùc—Pàäí¿ÞOñþ¿è,¤à¦¥ýoZF Øôðåú5püÊ·¬¢@ò??K°Á_{œÏ#XHñ××P áõ_ëœO6Ðìøå´ÏO,dø·ž¦@ÂkÏM^ ²ßù … yVg!£&®§@Éòw‰]CƒtDÙéÐHpÒ8pÅE’…(®ÉGh#Åp!L0RmÎÕˆ¸1hÍà"9Òz¸ü¾ÀуZõ­ækjdI>p»ým˜f8!ÓLFo‹p"\„R„Žw/ƒ¶pù û¹u†ƒ¸ÈEøˆFĺ±·Xñw6—…|D…FÄ2 1iDl±ë7Ó­M3|Ö¦pPþÓ»@ÂÎIF#AyFC‚ï!v°§ˆŒ‹(Ÿ#)áîíù™šr A¨Cä<|»S‰¸Î‚Û˜­‘SÕÍÇ÷iu2Öééàò`’‡! £ðÉÛ«¹Àí2náJÂÑ=+¸i†kDLY ƒň@Jˆ ¸:DL¡(ûˆgü± R¹:Ä&ÂÕ!»_šek–æêľÑI"õ½³B™-0áOF¡ýrÙ/„äà" ‚=˜ˆŒú.Ë‚)§Eµ\v¶FÝÙ “¡¹V«ß¯ù€Á9Hö¤ž@𸡣“?“»‰|ª`Å-ž"ýg#·ËƒÚ}+:ÃÛ¿èæå¤!RŠ8ìG¤" rm”TðøÔ}b{§sy,®p2•%mS~‹¤cM39Ì_¯­Ôšj™» |©àB½W#¸x@.I>"bø."˜Ùw¹‰pUá¬j¡á¦ì2`¹‰M3]¯¹Ï4jF€FÍ ê#xÉM„üUCΪ=†=HþªïWXy›^yÃr!Uá¬JÜDŒ¦™Þ£lƒˆâŪœ>Цm?C¢?€×i÷…þ×"CÐîZ$ Šˆ€K./‚&^O€<~ø€ %Ûó^,$üǸC‡D²xyË[¿VB#Ò)]/c;5*Æq—ÑùÊQƒ×\ Ù.A¬c Šˆˆ•ýË7U€%ʦêÙ >qæz†¶E¢Ñþp+Řâ{jTùC`‡œdëd§×IaÌæ¹W«é*("bDtI*C¸2ƒ'„—"‹ûï4JIuŸ:ŸKý½;äiÃ|%ì¿@UÌâÜT%‰kæpEð3Hdå …ÂO!¨ÅÌ•²@{éóˆKÎ|sËÛï®ýZ×1™ r}F¨ Ï…¡“ "ÀÕåE ‡Y3Ã"‚ ˆ¸¬êu/Èóüë»Ñ‚eY†˜áz?ÐŒ¦kç%çæÿgxA„¢(B°•¼‡_9=;¸_×Ó霌7ˆ€'°ù|Ý ôðwG3€'°½éóã"  ˆ°\¦aE–…ªªôŠõsC‡jͯw.¸~…qAD ™ÍÞ&“×f÷ЬYš¦ýf¤º/O‹íÝé÷š$Mã_;"õçÂ%-"”‚ì]=’ÓLõ|õÝ ð:`@HÀ ! $³É [n@@È €{©Zjo³¢aVÝBÏ£gY?#kû•««§ÕÓ²¶,ûÕëÑlg™³³³ç××/«A‰\\|¬É$«Õx¼DhØ&”'ÁÙ‡~®…„ Fœh5NU~CéD´%³¥_Úiˤlؽ¬¡‘ü¬"©åò nw»¯½ÿîjÁì$c‚”ÂquµbõF íå,-™^‡ê!„NŠEøoB”ÅákÒu)˜3Ôt"’9ÛÉ[Ô› ÃüFOû·ßÁŸÈtË`û¹mîÔŠ ¡ül6Â'Ö!„H,AÚÃ1¾§TýIé&ßxP>á¢XˆnmŒ«#Áªª¡>äh²æûïÙ4’øÂfâ0fb…~´ä]i—i-¡„ÕFGaÍòÂÕrjeN‡6d"EÈ\šô1¿Õßs‘aï#úQß«ˆÐæŽ8Ñâ͹Hó-³Ù˜¶!HB%ÿ¦DŸLÏ ‡‹"j•j¬ÿBüjŽúÃ!™šïŠHÞNù9ýaY²íh˜NôíË8ÜÊ!úƒŠEÄÒÓiçâÛÀLgð(ŸK3p®¨åßÓü,ÿpÑEÚ>ÕXH‰½ºÈÑÍÎõöiìάY#„76àÕŽü[éDQ{+ê‹95iD^ßÍ¡ùNDòó•1»6Æ?ÌN®ábŒdÚÒzú4/¹²îŠH$!,´ÉŠÈ9mî$&õï¥53+ªáppf`Bˆfж1ϧföu9…äD~Þã˹ˆØ~ËÖHCŠRP*“²psñÖL:Èá"MkDŽÓÜ_…a$Úʹ»DĹdvÔBò=Ÿ‚SºW.`Ê` ýÎ5gúíFT—qÜÚ«Ëq"fÀ²S rXãæOßCÙš5ê«£ræh\!Ëš£À‰Hu¡œ¼ªC±TAþ6½‡®ó0ÄÈ6¥€"8Ý!o€fâQq ³i.Ë4Æ€ ̇éäæ ¤E1"‚à­™ø}ÿÑ—Dk¦˜‰"âp!Ä"Æ-Œ£`>æà¡ØÊ‘ˆ‘ÏÜòˆ ÑLj:-ÿ·\-"@³ 9 2¤Tƒ8Ÿ$ƒÃæ¶?K‹kƒí‡óR‡ÞÖˆ< ikFXa.ŠˆÃ…‹¨Còa¨‹XÕâtoÍœ¶²Ò] Y­v-Dþá{ˆ9Úk‡Ä¡ˆð§fnÖÂ78Ê!'"¾¡‚a+£›…ÖËÖÜ Òï£v2‰ÖÓ’:¨ª*† â¨À%%ƒÈ D@D¯f€'Éyä|yqÞƒ Ú1hø6ˆLVµ¼Meow'þÒ<~¿ÓQ9rÏ \“¡Ö÷á0®7ÄÎ÷B;¬=Ä¢zÉz‰¬‰I<€h%÷!"ÆBz±,ÄXH>]„ ¥WY´"@þGaÇãvЏƒ®¤ÜâÏc°GÄa!¥’¯uE%£Ó¹†5•€Ýݚʅˆx¦¹ÃK䤜CW}ÔXƒ;>0£r “Hø-Wcûž×zÎú¶J@¡P¨Õj*[$²¡¢À“¦ Vf‡ÿØ¡¬O Ĭa-0}Ó1qˆ¬1óŒ|+V/’Û‡ˆ8i«C«úÖ£[·®ðÙá~«¥*•ì¬ãðQ‰6iZkò Ëpy©ÀCG}FK3ÿ(õŠÊ=BäŒã(²^ÖÈùè[²žg†þh\5sªåÒf³¯"Aqp.g ¹U­V©Øùž˜šê«Ì -$)…xÂaÓ MkY0N‚ DÎpÇU/kì&V©8£~œè‹I7‘‚U ˜¡¶Z½Ûh,&;Ôîoí³…loo“uÚ½ã6T9ÏBÜðš‹Ê Dä°4€LDÎC) "VAl¤p÷8 êõ:YµZks²·èlú·IÝb¨@8wªr{RAæ¦s@DØBHA(QjÆ,l4 ~—ücnn޲­õÐ…ÔѺi|H´îœCômÇ5t·…P‡bË1 ãý~mm,dccCk¢Fª´˜žŽD$ŸŒ²n·K3½^Ï&"„¶.’2ÀËy‹Co”…ìííѤ­Ïu¥R3 õ®R‘ˆ¤~åO<ÍÿbƒDÄZ) vvvæçç}ß§¾QG“šÚ+;^$áÏå|<¨´³³³ê"ìQ%w‡ ¡vŸýƒäÆÏozŠ‘«3¡J…·_ï\þè·Çß_Ïr«”zðdF €«yÁW_®ª‹ D„oÂË1¬ l!Ô^ó›ÅßvPévàm=Ò”ˆ4aIésÑþôÍù‰pIå~Š-¤Ýn³…ð¾¿ÞX¡—ßT¥‹P.rô§ƒgC‘Ἰ³¼}=}¸®i¤@"Åz}‹:óóE¶……¶‰‰ jy¥Æ'šmJDÈHˆ0 ”Nÿò]ÎØB{Åb—úLJR.—×_}sI¥ $‘á÷!%Û ùØÜܤé# y¼7qybee%ŽI²* ëhìÇYGtšaÃ×?¥’ßíVTšiµÚJ­«Ÿ®.¥užp€ˆØÛ‘ÆÔÂB£úYU]R$4399¹óçuÌbq*à8$;{Dî,+Ï TœØd¨õý§9#I1 "…x(²±qƒ\dpM•okÆ{W)&ἄ„Ú°D>hâtï'b2íD€ˆh³ÕÔʹýktÄì¡«VAO®È¤œˆHÓb’<ýîï?šÜyí­`è;¦m]—‰ñäyÚêµT?7µd$¬ ¦FÜÙ=#‰ˆ$‘…DAjÇ ŸJüq™ˆHDlŸ¼wïæPM!ÌL–öˆ8~Ç„.’œh½ü¶‘{DˆˆÖå0ló†ŠH+‡Ég2˜ˆ¸-D®§p_rZGA"€ˆìîÖÊåš:jµZw"á=êÔÈ ‰ˆH ºB"bœC´Œs§*·£f$²>6Ì{""’$"Z7ÙEDëÎB’̼ðpœ<sð„Û¥ž,ƒûˆ€ˆ~ÖÌéï—Š;«äÍ€ˆwØÀ.r¦ ¬äú;𤋮À%u¾@G²Ü²*ýÇÎý³6ÆqÿH—®.ú:HÁ5c… ‚BßA+‚ÉIÈÝÖ±C}‚…Ç]­¯ÃE„.׫Ð<…» 1îó!„çOîB8¾ù=w·6UUuùíkD\mï%s[¿/ë}3Ûåcùy6›F£è¥ÏZ¾¨Ù—‹ï?~¾|õ:V`0DÄò'ç³Ó“Ø èþ}>ˆlÍ‚€»f¦ÓiÜ*Šbµ+w,¨ˆ·šP²i€Ç&çUýž#’VJŠ¢¸?ÒÒMiº²¦™gYô "é®JÓnFÒ4í–@é.~$ƒGý3@IöV’Áî£Vpûnr±ªÒ¨ˆl ‹%û5ÉHÒmYMí‘¶ð‘t“F2ÕÙMé°5C}‚€?3 ˆÅÿ8‡€  ˆ‚€ 2],êW‚ÈúSH<}e9þ”ÇÚ‚Èx'ÏÊ2Ž÷ßGÌç±À#ÞóqÜ7ŸÇ<Îßü‰%ìþš ÞUÃãl?jçNÝN=?œäy›\³w¯MdqÇc¥Ö³ÀÂö¸]|Á݃ ñ¸ÿ€@3‹‚Çú"œ ¹gÁ£‚Ð,ì!†¼â²qoü ôf"ÈøÒûâ¼ÎLÒl3¡ù~G2ŽOúÍofR"Ë)•c$=-Á¸Bz±ÔjÈ7—.õ‡ÃÚñêŠ%©«0%‰Ý«÷rS%Z+-’h)¸43®©Æ4Rk l…DɨBB¥Fû&"Ó³õ0C…¸YȆ­ÝÝÝÛJ×µj´V‘*$íÅÁ ³É ¹}E)Õ]”VZV´ÿú[ÊàæëRæ§Ÿ•2ØÚÚzòèáy‘‰YH0û,ÄUˆÖÚ¬½xÔ"²z-ÿöÿ“Bxš<{ûÏk™Bñih=q~&"þ™½½=ë¯Öµµ»vâWH¶ED¯ÚÆÀÿ²’ïûûû.ÍVˆ³½½-ž~s#âV³¡Žê²H°€?mÜ”ÿíC<ßÁS3'Þ*Ž_!Qn…\µ2vëÁ»êþÕø"g¼ ™@ˆ˜o-óï O³yòI]+; 9pòþ𓜑@‘Epw§®÷E>‹§ÓéØ IÓXŽxWd\…ü°yYª´&¨ýò›¤‚M|<¾ë?##Ò•ïEQ‡‰­á°!‰HA…˜•/•j£ÿ¦3o©ØM†ñŸÔõ5ÂØžÐ”#yb×î,9àI=T„ˆ_!þ ƒÁÀô‡™…ØÕND ¿BªšˆCVÆ!¦$Ü‹ù/¦¸“]£”n;ùw°+!R"S!yb+Ä®âøRýD¿Hfj”LF¼ÎûÝi+„)­ÛÞDÄ«•›ˆ¸4ã"f®Ý˜ˆÈ÷²²þ]‹,S…à&ÞÐbé#†Çwý 1²³Ï™‰ÈÒU€yÆñ¯Ê“È?˜÷zÕ'"w>^O嘻ÿt²Büuš yõáG©î>ÿȬܾžrÛ™3ˆK3A"i(“Oäv»]¿?ü{Dü ‘Ôî8ê%Z@sxo½ãÞïø¼Û–¿õ_"q¨‚D§áwß r´4ErÖ¼çuƒñ”%´ûT €e¿ÿ”Q®E”m‘VKJe+D\…$Z+)ßoFˆh­%T®EîE¿K!{BA…ÈT!¢Å°õD:•ˆVW•>(ú÷â QZV ´ž¿€9…oõ ÌDI+­ç¬-+Úí¶„ÈbÙ¹Èd…¤ï§®¯ìÝ=$ÕàSÍØ€% ‡DÎ38°DÄddðÉÉæ&ëîl,‰…ý XDÚ’wpàÔÑæ½`vÚ5Uò½EŸ™©ÞÙþ¨ž}Õ–nU®IV»ïœ{«úððóö’ r‹‰™.;ôƒšE~óæ¿bàoÖöõ}!¿lï²¥Õ©pvvwž ²è¶øÝ¯ã¿½%A¤õÕW_Å.=zô(AdAð¥w€  ˆÖˆ?ÿůbr.m3ˆÿüÇ_c«¼ðmÇo>Ÿ`jf‹‘b¹\Þú&ÏôY@©ùCžAäð‰¤d‘vcJnœ¬ÕçÏnÔt‘/긜Ée9¯¤ñD›.XàùÉÇ "ù:âƒC¬ɱãx#ä6ÿFYDùà Gª<ÿRÛ$Ç —·•tãÚ)é£Éð°—È’+‡—òǽYu#×Í¿ÜNÊÕ£5@Ì;%C”ÃöR9Ÿ*ë»×Ê8ÕX#²Y{ª ò‚Ó²H©_vFºÀž­íŠšEÚm&úÆIéš”óýa©,S<}þÈw+õ• ’’A:?~XÇùLªŸ¨‹ JD('om˜QFî&ˆ€5"m÷¢,V-'ë:g4¼U¾› ²oÓo‡@™OéCI9Y¦f²µÊ2(í\cjfc¬"š¸»¨éa-(ôƒÒÌ(ey°V™o›ktD6@/ó2é°òjÓ2èÛ'¥rü¶›D€ÜÒ(ö0Ð8¹sfq‘·ß^Ä5îßå³Ï> @ÙQ ¹woñû¸Ú§÷ï?E@Ù ‰{÷¾Ü[€­Q 'ÓN!ÿ))ä°YÎÎÎbÛ8™l yï½{çç÷7yÅO[ùðáï#±ÇsÙ8/7ãáçâÅ¡#rzúå.Š›¦Y,qŒ¤‘E»í/ùÿ!nç<â݈¦œOÆ£G÷Þÿ8çqÀ{DLþçiÚûÁ`üM´ÞyçIÜðB³Ulè4í[ß âÈy½züV‚ÈÄæBolŠœÖKEÀbÕçUCFÝç¶G*¸-è¾snœ‡œËãEw9ˆÔÀñnê¤ýZ"™|휾͎´R5å0-))ä\ 1þŠƒ5"Û‘Ö|”„qžÎ—ÁóÎÎ`üAä<%’2H4%‹ Ç·"5jä}äPrZggAäùz!§y_Ãhr‡:"«UÜ9–v¶[:ÜÂmÓ¡ ²Ý^HÔqÞ×å uP®íÒ1€¦‰»ÌSÁõpb÷ÌLÍÔ)˜ütn¤âi,ð«óù|¹\ö}‹O>þpØÆè·r8¼”jF”â ë‘ÜöH‡y±H£©õ¹r‚üª£)Rö%”Ì;íxXSÆ©fܼµy½7«æå ¹ÿQùyÝ.b­W'Ú<±\.ÛýZ4é^žV#H_Óç´¦¤Ô(5¥þø‚È¢Ûz_G|°çW¹G ùÒpÐIW'Æ“Am„”Êù|;0ý Rì4…¤Ì‘¢F=7¥éG4EbLiŠäGi“l‘©™š3Æ;y‚&¦þÔ.äH1œ¬)ã2(í\SΗK9å ë‘Û}¿n:YÏŒ¤“I&4Bò™š-†%×çš|©—¦rJýõ‘óóO¯|MH>ÜüÌ$ ’ÏÔA¾šG+kG$Ç LyüxñÅ‹Ø>ZÄ]¹G’Ê ²÷¸º/^hæÅˆÀ,΋@9 €­y5âÛˆï¢öô•ú‚Èÿß!yc Àêð3¼œÅéˆÌbv³ˆ¦k\D…5 €cxøùƒØkD^+^{9^ŽËíÕ}.‘¦‰Ÿ¼o½¯Ä+]Ù@Y}ÿ—~¯¿o¾v9S³'€ 2k‡ßÇêÛX]Ä˯ÄOߊ}±˜‘—.·¦k<ýv;ÿqÎ;épä#EHùÑ“Xh°Jã»N†‘&ââòO\|OâP–Ëe e à‘™2>º/ç!çgz¼è$Š®2‹hš.‘<ÝZªèòDÝFßüÙ¾,Ç”Z–n¸võºsMþѱøÞ8/|KA¤™ÅªÛÇÓ˜5Ó Ý9g”3£•R™?XÆãgvÀ»Ìà$ŠY4eö±Í"/ÅVäŽEn“Lv Èþ²€%f"ÑD<¦4Oã®J©b¼¸ÎÔl€žÌ¢hºí¥®5Ò vúÿ&íRpØÖÈî#€ž:"Í0œDs‡’‡®->ÍgÊáˆôÁkrñí`ç'˜·³8´Üí¸ƒH5Ûa#$u;rÁæ·?̃\9ò©-ÀÀå¹›r¸ÅßÞ-‹äÄÑ ¶YÛ}´oc”ÄÐö[9^Ê5Y›fÚ­½çuõWú}ÙDrÙ:«.Ð)ûJæv<¬)ã\“Ô—{¦A[S*¿Xµ³“ŽÐæƒ~%Ï×´[?n¯æÆI;^v†I"Ë÷Ì¡'7Rå¡§fúÁ„°ZÅÝb¥ÈhͰr>°~ÌdœDÖLì™uš&Ž›?Û’']"©m’,_ʘáxrA$g‘_XS#B—A›*úvH®)ç{ùÒZ}îÄÔñœ¤ðQŸÕÿØ»ÿتÊ4àß{[*P£mÀm{g´…M´C4óvÐq%Ë áf%™5™¦É8ç$fˆ$Ì òOËj2’¤&î9Y³&…I˜lµ.0d4eïc0w&£%Z‚?ÒJ–-µwŸsÞÞÛÛ^ 7•rOé÷ÓÃÃ{Þž{õ¬_žó¾çNZ{xêíí4ÆÃ·&â&ID±¢3ù"?£^_xMá¼ýÖD×çÞpt\8Y åQh„´£º»ßèèH#"fÜ#Ž¿ó“Ÿ}vwñð"’EˆˆˆÂ\ýúÂÓâçó7ë>`-ÿ²’ôHÊ#~S¦ÿä 1¢µêî ä©­•lU'kk/ØŠŒ©Æ@$µzuÍSO=…†ˆˆÈ6H&Ê+]¬1p¡¹áä1M!¶/âû «"ÇóàóÏ??úŽØ)«ÖõvJ"©YcÄu8ŽeÄ8F ¶B`‰¹S=|‘CDľ#ŠGúO¼Í"ù™ÈHxÙš-;­¹ëõ@Qvùâ©0‹ta,9b«É¿BqDDDTŽiÄà*ŒäEŒÀ2¸NˆˆˆŸæ?s0ˆ|Ùÿà|¼=kN=,¹Z¦°‹E,›B®#""¢+V`Fa™_õ¶Í"°Lá-ÈÄ-׫BDDôâ®p½Q<â›E%Ù*)D c:"\§JDDÄ òm4Ù,‚,“í|¦­£0ZD0ɦ1ˆ¤lÉ‹¹Ì1Z파M!Óª#BDDÄ5"™>6§Éf ƒœ\þ[•ä¥5=Û!DDDìˆdôˆJGDëDkD|[‡®œB&ß!"""Þšùê«7mùä£Ý@®ù1z‘ ¾'WL!v€I """nßýøãyÀ›ó楀·#"¾ KˆØjÏ-“=1Ùe¢ˆˆˆkDbˆˆU«Vuvº€¼9¿j.F­ðaˆÀ˜"«À®x""""‘hÆ‘d²Ýf‘ÁAûw-l0Ff‹ "[;{{à—­gÎ@ DÄd‰ ÒˆˆˆØ‰ŽK«»»»££Gü&¾ï"°18&0{ölä¹téRn²±ñÒûïÏÞ²¥½=‰#""âbÕLöˆ€ãÇ_2NÊã8^}}½1P:öCss³Næ'`þüùš<œàUfwKcK㥳g¿ÛÒ²[“ ¢‹ˆˆˆ‘a ˆD9q¢ xÉqRâ7aåfˆßWßçû®1pŒ´¶¶ c¼†¹Ç.Ï_tǧ¿øbÁéÓwˆ¸8®ïjSdwKÍöCÛ7¯¬–ÞºDâ ¢‹ˆˆˆ‹Um£ä ÷Ä xé±ç__ œ>í8áæ—îÃsö¤÷;æVWWWVVÖÔÄôõÕ¨®>¥ƒÁÁÁóçÏ÷õ¹ÆÀ˜Ý0²ß ÂÊÚù‹~ò“¿Óu'ˆ("""†Qr½½žÍ"=ísh’øèBóÃK–.lhn˜»DÇáÌ sÿ@®#`Ö—"¤× d_»_ ºˆˆˆxkFų«Vc(5±YD{!â7¹"ÚíèëëÓFH®®[WŸNW,Y2ÖÖtzCX÷h|œÜÀq ‚d‘CDDÄ ’F,6&Ž¥¨š’‡ˆìÝ»wåJhÑ~Æã‡ú6ovŒñ|ß_õÈÅ/ïÀ˜ý"nkk‡1FD€ k8°E·Ûlذ¬µÕN§ªW¦ÿ´ÇuŽƒ™†ˆ¨ñÞû1 wÍ|£Y$8´êQŒ*L‘–––C‡bï°ˆ„ºï{|c‡Ö®]`Œq_Ç6ެ[÷‚ï7iÙ³'í8)íŽÀm¤üjãúŠŠfD;"ÃÈe‹!bÁ ä4‹ì ÌI$"î']\õˆgÿ® Oë¤1`Þúãî… sŒqDÄn´ùÕÆŸi_DóGØ>qL¿t¼Øãº1Ì0DDï¿÷¿ˆ>bGdx™a k_ÄÃPQÈ"[¶l±Ût»ëÕ… OþÚç_7#]O+àëü‚ku`û"ÆIéÅÚÑÜ—Iï(÷оžÎÎvD ;"ß„á#Ïf“ "öF¶/_¾\ÄuœÔÁƒ®¶#À\­¾Ž[[—ؾˆvD–nüÙñwÏ,­ªÓ»<[ŸÙ¥€£õ@"""‘¡!”ÅËdãÈ0"ÅÞ¦ùÛßjŒ1ÞãËuG®y|yƒ@«ž^¸SׄkTÑÿƒÃ>àt†ÒéWƒ=5‘BDDÄ rù2¾‰£¬ ñ8âdbPQË"|߇…4ÆH"9ÈŠb !""bFù0†‡ÏÆ‘hº ïªq±êp)Œ#ƒCÚ Ž„ˆˆˆD.Ú ba\B”Q77bGäðAµÝ‘Há"ânbÄ ¢2Àp)G®'ŠaDDüñA "qd7±ÉJ "Ö0¦±KBTŽ¢­­ À¶mÛ N‹z¡²×_÷+}Ï›û/.DD¿ÿàkýïà&ùD‘¨þÅ…ˆèèÑ£˜½¸ëÌ ")4Xä×ü¨1n\xš?Ÿ{Ãq§:.œ·3ý³Æ½¤ðú醈ˆvî܉™dVlEûåÆ- vDŠW& sFþüÕ3Í×¼Õ´BDD÷Þ"̸Ÿð "¹ÃDm’’§œ›ãÏ(q̓Èt3Þö¯¥ŠDDDܾ;l)oŠ\¥MR8)+çZ#7;"6ÄóF¥U˜EôÔÎyß$ÿÊÂwËÍ÷ÎSˆˆˆ·f†a!><µÂ•¡Å¿°àtÂAqï6ñ;OgDD¤›bJ³_—ødU"""ÍO!Âý—©{[""ba a)%""ba a!""âs܉A„ˆˆˆDˆˆˆˆÊ1­t®éÄ•$»’ """‘) )“B.|ˆÐY'ŒkI$Î ‚ˆˆˆ'D¢A\øZ!e«%¨H/»3™|öÙgœ;wn»íóè£ß{òÉ'qÃÝwß}("">ÄŒD&ŸBlñáû6‚h KÀdÈ˪ªªDÄó/¯|`D|ñ+**Ì™3§²²@ÛüJáßü—Q"DD³bÜ C "ß*…èá‹?Ú#&e àÇ€L8æ4úûû%€ç8pì6½ˆøópãýÃ,á§Q5Þ{?&ˆAdÓðá&7f€ ‹4Ù1VÐñc¨ËH— A 'N”Fˆ/"@öÜrË- """‘"¹ àdr½1ê2€\Ò“NïqݘŽüfqÊÑŸžóùÍOÏ¥~!vF×FDDD¼5#I`FïÈh]“ɶF‘D,)É{z¨ï¿x`Vmm-&PÔCDˆˆˆˆkD\iòŒ#:p› ì­6…¤ÚRMÛb¦½½½÷ÜsãG¼ {6 ;öþìÙ--ÕÕ+ßyç#GŽð<Ç÷{“ɦ3"ânÕ+VÜÔOË ‘xðUò²¿zÿ!`¸mñâÅ"À3ž—BHdLõçáüùó6…Øœ<ÙÞÞ wM›œéêBÄü?{×óÚÄÅG©ýuD‹4/ñØbËä`%àÁK#‚‡žOɱ… ›¿G›?@°Pã¥7A±"Y*èE0 šCéÁK Œo;tvÝO;û£ßl¦Éû°,ï½™}ó²0;Ÿ}û6;5sóëç'µ2fgg·¶¶,t‹°Õþó€£Ð>úwõ1 LŠlˆÉºÈ•.ŽwÈ"}vrTµ*=…D)äwj¨«&ϨX¡V(оÜhÉŽpU"LAR¯”j±T²VukÐ8HL+ýˆhg˜gqg.ƒÁDä°¹\ig§.oÜñèF‹y¸½ð´†gq "€jµäí{DGðâ…ª $ZÕ‹¨²œ¹_díˆ L^‚<`0øÑ ±â"Bü ñ)DM™œŸ×Äêd9/ˆ‹Xr]Û-´«&ìRI6ô„q³ÈókùX»é&µOu§ÞÁj'L™Ä,Ø„aؘcÀÎA'!#ލ{žvœxt“yDR»tÞÎ: ÁŒf’é©-f0LD:ör)Kž¤¨D FDº‡ªþ¬®— ñÊT !Ò$¯Gño¶ éx‹VµÐÛ{8\ƒ1u¡T´û–$0¬ÁF¢À°gäEàˆè`œØŠqÆÉ'uñ¼õpzš']êiÈ`pF¤cÕÓEB4ÿ (™´£¦}EAl{(ƒäÃLSØ9uO #›ìH·KF´`î€ú£|$ûBÁH;= cÈfrp°¹ºzeåµ”9)¥[sƒ­2 ŒÈV«¥ÕÔtÄBšbHŸDºíÇJt›¾ƒýÕ0$Ûãÿ›t ãü?üCmÖ TªÒž¸È˵÷e!Öž^j87²×jîÞÞžª ¡÷uqï4ÅB\!ÉÒß·SèýÛ–áÀp½Ïì×á!Ùx¶º(n#5Â`p±j½^uÊNqyùáÂ’´ÑÑѱ±±ÅÅE’)ÛQ«VÓ$^æHŽÝ9½Û,‹U¡.¡“ôi ÁIbhq|bO ÂŽ1†á0˜Ó‘ÑyKË'iИzÒ1Œ!ËKDÞ´*ÛŸ>4ß ×ÜšpÝ/ÃÃÓÓ÷î>¢¦oÍöõõWÛÛù|þÉÒÂå«3ôÅ5 6fkCUlØíØí( Ã ïæQ&œÓªA08DÕpl¢Câ–Ôá½¼Yueåq¡°¬SH³ÙÜ~y7S´ETµº^­ÊÆFoqñ[­V[ZʸNÖq\¯0nï‘Ì€1gü5^J¥’Î""¢ï¿rûE½~­X´õ–nÿ{waáÂÖÖ‰bQ§帖]Îv:ÙÕÕ{¹\N¢DÈÝ“¸¸é<53LÑc£ÑH§+óóW]×ÚÝ}N_Ü~ósìvS'³Ï2Žã¸;;‰lÛ–é ˆ˜qÄu•ˆ¸®ã“ɤ-K4Ër-‹r».@ÖÖ_ ‚Èø@>Ÿ—h ˆ !?þ‚ ˆÐ#2–ÇM•R2]œ:snri…Ad€ß–PJ/X¢çÄ01WùßIèÅ´Ûm™2àñZTD .züU#M!¨×ë2ÍÐIÈoÇ{q? AĬp˜e’€%G?Ê$ð‚ž˜¤ÓgÏëƇ¿ÈxO*Ãt†NTè@E¤?ò[ØQ‚KYÁ£CC(äÈšw#ßÌŠ±î EôßP€ ¢”4¨‡Ê¬‚÷” š-k1ù÷<@¿/ø0_†DÄŠé.bDéÀܤlõ”òB‰?pTJÌUCÔEúè{g¬Û6ƒa 0‡I€ÔS²vëØ¡‘¡c·&™2vÈctèØÍk2¹’‡ñ”8 ,ü#¼3 ï¬ï„MËËÿ‘®ê¤m½^o·Û´-tV;¡‹ÔåH]³æûﳜ«óYEB4Ì ñU<λ¹¯ÞVšW©Vøßâ{êÑô#çãl<òxÛŠžPÔJc*DU{VÙËn ›Í¦Ç_2/سƒ%\]¼}B]çdʤ‚À‚"i›ÕI!QhU*ͪUíþDB…>E<4%‚H!BýüuaIýå0ú‰•168ø¶kE-”.õS]×ÃTä¥b¤¤ò["ñ ¶`Æ„A‘ò°AeDj˜¶Q"%&aÀègôM‹ø½ËÆÎªw5¼QAèG€!Òëd”}Oÿ€ê£ lç°1©™G¦´[ÇJ\DµH·TUÁ÷_ý €Aj¨ÅìÅ‹{Ë=5E­¯f-9Òö é0Uhl}`7 'ju´Hï}Üu•™YЧ{»,5âz9ùù„Ðù@ê<¦*:±Å5Ã\€¨1«EŽx¡»þÔ¢B¦&¾£Ùy66©0îBú*&8ÒxÎJU@Ðë—‹gˆØ™ýC“B@ó){[õTçÈŽ€ ·b²û}Sè ÓzòzÕÍ  ½«¿Í:vÜè zó'/öP!DƒºÎzÐFc6è=5@gBhÀHW˜‰‰€®þMáôC¢+ ¥»ñBäËçOÃâ]´¹–w¼ÑÿKƒ€úÇv¡+ŒsòbïVˆl6›Wöîga p!;À‚@bqHÇ@ qËÁ1Hd%8HàÜ0±_¬éßìydÕšš7K¿·#¯—¤išð'ð-.)`ì®ü­XE+Lþìþõ¬ª¡þ…”òº#^ø’¼ÅwDP âË:ñi€ ¨xÀ03"ÄǪìN 1úo>!Ô‚€Þ9±»,j—U»S3€  ˆ¦fÚ¶ÍðQ€ ²ÝíC2U²Q"wDA@€;pL€0¨ºÑ±Vx;pLÃ0hÒâ_Õdôêx §ØrІ,nmK57766¿}ä¦Õ«v=Õ7=)‡ˆˆ(ç%ú•­¨Xww÷Wv<^QÄÑ|sÑñþ¬d†ßjhë?:œhÀØðàWo]sI‹`º ÎKTÕ½P¿xüÉJgq4ß,<ÝŸK‚@žÓ‘óáy˜/‰¦Ö¶Ü©áÏ}~'f """âBÕÀO¾|úd0š?X£45ÆRM#w'ÇñÎH ZZLÜ<ü#„ÌZü TìøË?0{٨̱—¾à+¾‰3Ýû]„Ìíºu6ø|/€yW÷¸Í=·Àük6`êüã÷ÛxQ÷æÃØ„%7lpèéYzãwp¦W~׃eŸîÅ ADDÔÙµ €=¬8¼§ê›ÆgÏ•ŽEÞâ®Äå×$:W&æ-ŒÏš­Ù<‚8:VÆf_,HapM‹¾îÂÍhÿQ±ÖewhÃdY²ù– 7G÷>Œ³ëÃW÷hÔúèêûµáL‹oج-n–|r‹¶’|N6[µxù©õ˜ ˆˆˆ,Êh¬‰ä›Zfq.èL"/¾Ü²™|ÖGLĤeA^,#ãÁÛ?Ž ÇG”å‚Nó’ÛNz¬eémF>VL6—ÞnS86‹óŽn:@[çnðŸýß·í—ݞ˙£s9eÙó0€ VÞ3´ç!í ýí!8À…W¬ðæ‹ÛrÑ•÷¹ÁyÐv^ü‰u^ß½ …ñú×w÷Î[傟ÛêòMxgàY‹Xp­ "øç3[lç%×mÂtÐ)8Ú–ßÔ àÀ“늡øæmþþ›û²â3Û_úõÚ‰ñ-ÛÝ`ß÷Ú]ŸÝ:#""¦M6Úl³ÆGÿy)/x€D "1 ¡sVIz‘¼º/ÿççŽ äó'‚” šoX¾iYz»6Ç_y€ÍßX¾i[~§6Ãû±|ÓÞy—†Ë7n¡Êå›Jh¾`ù¦ãŠ{µEÂÍ…_«Í%ë?tÕ:mnÍ7Ñ…*m¶iùfþµ´øgßË7 ®Û¨á¦ùæÐï7j;¸k*và·ë,¿y›6ûCqç²5j ùFSŽ¶Âø‰µ–o.¿e‡ 7{¥›uGDDL96¨½'&A„ŸCLÇi4Íe“ù#‡üÁ=þÐá 34$C²0V‘©Åq³8DP¡á &V‘cµ8ö¦nþ¦ÿ~aJè,N%Ÿh /ºfdA'q^ýÓ6þÈõ߯ûéz“ÕKì¡Iá sé§¶¢ ›È9WEª4åÔqÆOBÚKãÄ`îØ>ø Es3bž4xÈ£´GD09n GAj¬ÅSÄMá(TËMရ¿±…ª×žÙN9 5ÖTsÑ®ÇNnJ+Ž+ùs¸)Á @DD¬8Ö±¥œªªD$Þ†xòãþÈó™“/ä0¤’˜ÕŒt Mixq$=$¨YÊцi¥U83ô¦*""b¾ šªÚƒìˆ?¾ßÏ â$Óˆ à!6†˜{™‰¡ZZq¬å8# —;Vq¬å8n¡Ê*޵ GËq´Y¹±Váh­±•£|ì-ÇyëÅárcçÍ¿n·rc×k9Ž-TYÅq˜Vë}ãVnlûµâXËqÜB•UGj«¾c|õ™\¸é‰Ü4®ÇZŽ­8.ËUáh9Ž6+7†ꌈˆX…cj_¨ò_ËøGñáÅ€øy ä)øHºåÅ¡?c‰ !V‘#"‘”ù-®Ò”Sús_šr›öP)]¢*ñÁ•wÛ‚Ž¥œÈOëY¹±­ìXÖ±MK9©5¶‹u)GD\Ê ²PeoZùãö{4Ž»˜èÓqeh9Nè%Y¥ŠìuUÆ6»*œrì2f ""â£ÿ‚ñ Þ€ ‰§kÆLë™F‹8èý峓ü*»i¼U“ ˆˆˆˆÊý2ƒ©½ÜX[,|HÂË xYä“P~â1lúÙän0l¹J0툈ˆÈ~Ysêgq4¸ìÚÙ‡²z¾V8 u@DDD¤¿^…ª™_ˆˆˆˆ¼ÿ²wÿ* qÀOÉäs¸)h'}@ÁÅèê"ˆ¨OÑÁÑ1‚ƒº4‚n>‡«нÒK46ýÂçC)Íå×;q0_.w1Ly…ðUÒÒb°êqD@ÄD@ÄqDqv÷'¯ª‚ÐXóÞ²úã­x +4÷pÙ\ù&¶Ç8[Ƈ•gÇÒšÉ@ñ½¬¦ê[á@Öx¢%f ²–øy¦¥´f¦ñ·~ªdKX.Ï6ˆM•ý¤1¨iâDœªù•å,¦‰ý¤w¸ ØQ5¾=´Þ½QéRžfýfqbʉ‡±%©‰g§âHZŸÖ¤Òš?¿°1 ;{ï¯ÏaÖ»`pwŸçyV¨ý0€UžæøU"€ˆ â–ç¡5àäô¬þcìœ ÝÐï÷ë\²ú•Ðpsuþƒ<ÏCW\_ž/~ÓxQaÝz½^èŠápVܨj¹­íãüÞ??nÃ`¹1À7{çÏâD†q7Rø9ì®°´b#ØÁ?(ú ÁorµÁ »t‚‡œ`iawkïÔõ°ã˜Á}Ž}Â{™]çv×;1öLŠB'ìß}óéèøkž/÷ž=¿wç&©œØM¨´É§a@\)8wÉÒ&‚DŒåÒÈ·`1vDh™ç8ÜæSȚؕÞN;\9Oòü7‹œFTbk<…’8I ² o¾ÿü1†Ãa°Ô€Í&>°Ÿ®Ü"Kb„½¨Çå¤> â9ZÓÈ-ñ‰¥4ì>1F!‰3›Í&“É&ד£ŠÂÎçyþÍë›Åb±\.½¥A1 à]øÄ+$c”‘ŽÃz[}‚Mµç‰!lR!„4_j— ®À¹?õÅÓéÞ—HŸ^¡} –glÿØpÞ–g$„Ð.´K<Î9__ìëoÂ?ªXßô¿Ž9àD¬+¥†¶q‹-TÐ7ì¶gúÑs•o•y"fÍo×ücO!„$NÜ.NË._¦°«§Óí&J»{F†´Š¥@/ŽèD¼2St¢5 Ù¾DÒáô`²UÊé zq Tÿ»4ÁìšFn\Íø0£j®Ä|ýÕ—s1€±8“õσoræÐjµæÊ‹³½½?3€?~ÿm®€±8ŒÅ±zqèÅ©ó‡h6›S|˜QU;²º–ù5ªÜªœÃ#9ŸÐ‰£ui±–ÿêr¡ôò`F•ât²­K‹nÿÁîŸß.çVå´B $8(îÁ_þ«7^«|C¦‹–­Ç÷ßøøæÑþÁãnwáò‚[uÜ­ÊiD9v§ŽÄ ²¯ò$([U¸>T)v|c¢®¢º‚B%7¤reÙ\…às¦eïÅqï§||óäÙÓF£Q¯×}JÐäÉ#év„¤øÒùñPb£^z•@þpŠ}ÓÀŽ€U~ı½}Ñ`0¼¿»ûpoïððy¯×ë÷û.%úuw:jÑц7§l{þ,›œeÖ'~x¯]ˆÚ%D€±89¶b8ü|ñòòŠ{?U¯¿Òïÿ»¹±yýÚÕÁ`=œÅïçÊ3fºåôK¢ˆFéBT™7¾‹#QŽ_¼Þ¾Ý¾Õq[k\‘¼öl)émJ ž*.^Ò)\º¬eJ±e€UÃ#n|ññ{«AÜàb(H¢: ”¦ Ô)šÎïÆ›õÔéžY¦UgIq;37ÜÛ¹›óÉ™–_WCj2YºqÍI¯€+\ýPŒêM¬4ž¿ç&ÜÕáaŸ«SÒ͒󗙢ÇW”<­ËAj2“PFåg$)%€^ üñ¤ë‡®~îúÃÔü!:§¤›uö}!§Sn‘”f7_u6O•9®·xvÅtÎèÅ)â{bˆ{dßH‰Éo¿2;3°¯R¢ÃšüOz»ùrhÜ„ÔWŠÖ=±+ö’œ•€^ îÑ›Þ{$‰IuÐ¥Ù%ël:%½ùiñ–ìè Œ;@/PìéHðûÔ¡€æÇ›ž¡Xi¼P€ž¹“NJ+,"‘:èÄôÒìÌe@wzq=?YRŽgEä·2 Y¥rŽcþ¼  5?Hå”2#ëŸ~OtΙ æþÏ¿þÆ›á;³;›Ÿ..íìì>ØÚè¸ßFùµ°Òx–e²FUÒ{û\3=ø¸ÅüÓWå^0L¸˜fTÕj5ù Pâq²Ü1û\~ X£Ê7óóó¿¶ï¬­o¸­Ûw)) qk5òfTE‡8lëÆÒâŸöþ•w¸ù“K9×›^8. q’3ªìøfu-sñÛ´ð¸Û]¸¼°òýnUNõÆÊXBÜG9'Û‘úàÊzûvûVÇmÝ~ŽøFßè¡9ÅŒÅqã‹ß[ T;Êñû:q$Åç9ÅȘQ-òÍ”D!:Ñnœ/ЋSVkTÍU>‡!ÓEgv¥qºg€,Ëæf>gJ/À_0£ €5ªèÅ;àÂÅK:eæî@ùË”bÓKý”_’‚oÆâ€ÀåÞÎݳòÈ?%—¦ËÔéÅÞ « v=Ó+à W7Ó¨^‘ä†à»8ÅäI©ŸR:CúC®ØÇsÉ+¦Cý£©Ú}ÀXœÚ±¹1h6›:%µÀéÿØ;›Õ¶( ;©À/ÓE²Ë„lÝ•B~Hp^¡›B_§¦†.²Ë.P ¦¸Ð]²è.Å]'…(iWe”±‡dŒŽ=sí±Æ9AŒ4WW×÷^[Þ …ÙV ÌŸÛOÝ¢7»½T!Ϭ`œSwg™Ï`0 q`G`0p“À¹Ž¨V B˜ÅAqsþµ·¾¾¦Ôè­œå¹ÎÀ_»‰óâ*y$¤Vð¹R5X7™tU1ÆÓ‰ŠV#·cX;@ËðÂâÔ0æ -½V~“ +¸èŒåZ%a/Jœo½?¼×ã߃?Ÿ:Ÿçz'H0ˆF’,Tůy¡ýr .råEoÙ$Ô±kõÍË„fqLþÆè›ë›¿·yÞÚnu¿œ¶ö…*s6“c³õ˜ðÝœfåKH0©'{ebl·rƒBa/Ž®O}sÿÿ_³Ù̲Ì‘°i%NŒ™gŸ§´Óç}R§^œ@c®$¶àزfêÂ,ŽV9Âmc¥Ê«Á Ïï´¾‡EQè#ñËCá È ¥gØ‹ã~öà,úAWf,¿ºÔç[ôXa™Œ>¦|µ­O¹ù¿Fâ-1°ð›;u.WB‰ƒ*G¶µ”娿¸ÓéêúT–½*Їþ÷þÉñRª ,*5æÊ[iÀ vc;ˆÜŽÞЬ>«áަ<ɲ‡—¥Â ¿IðB޳àx¡Ä‰OY–º¿X÷ߘoTi}]8ÉÝ?õ‚)œ¨ª‚B%ŽF÷›]¥ÔÂå!G ÌŠ¦ÐF®r$öìÝÏjÛHp¹ôm¼ô”Ö~‚<ÈB/}_{K=,…¾AÍ-—ÅnÙ…äT‡6}®@Å™•–œtùó!˜Až‘”x¤|5úãáIw£û‹Åm=qRÐé1dMLÑ'7nØhi¶çY¸£j\€wo+£8c,‹jdDàþî¶:`€U"€ˆ âˆ8" âˆ8ü¨FD&Õ~@ÄD@Ä~;>-¸Ä4e¤^V‡1âÛúf W ­ÃXˆ8È7¿ò?}½¬Ëmˆ5NT!÷4?ÙàGSN¯mõ›ŸîËʧ¤‰Aý½W ãŠÅ„ª`ŠŒj4ÿŒ›òƒñ•¦Ü– òúQóx\'k’Þ ë×å`²“em•wšm^‚D´ .yÉßʺ㩴°~P'Zí³Í³Ýèψ"ÈLñ[ù`I’µÄõS“¿W³JñÒ\‹nùN)§Ü $a ê`wŒ§<‘OÉåõ³æÝ²K[ófz^?žC&¨Ük¶Á‡ `RﶦG'÷w·U»Õ§þ|ýf½^W¥Á¿Ÿÿ®{c[u<—¯W«Õ¨Fq ¾„vØÆ<‚àDxžd â@ë Öj0fü^E¦G'U„ù|þîâíAGøúí{5½ÿ°ãE„a5×ÙT »•j?8^\.—ÕР !âÀþ‡D8^ìߋЅðè?@Äß)ñÄKLSÐñâ:”ßTËoï®Åß>Qrâu(OÖ&}Wîð·w<º°Èÿ±<+UÄ ŸC>%E¢öú¼NHÓÛknVi”ãúa<å—1Ø– ñ©¥Ánï"×É÷ é­°~]Î÷†[vdYó¬Ív¬ùF? zZ™Ïxì’Alï"8VŽwjû_š–;Þï@ÅõÅ”ßÞE°Ç Àòc¯¦ðˆ9Æy} ô«i4¥ÔÈÙS/ÎMã@J9î9w4OÑ`Ãßüÿ¸ó‰Q91вKš²)?˜Þ¼vœC.®ÏvDœ3MnK…¡w{ŒLñí]ÄçÅÓÄ|J^Þ^?Û%õYìºæ æóB§·@ Ë†Yd{wSOBÄ—0G˜ŸN«jQ—&“iÕlºPSÞ¸_ß<êvír(í¶k€ùl¶\.ïïn«îàòãõjµª»P]nzÑô/³EÄÁ.¦ê¦ƒíE€ˆóù¼êƒíE€ˆçççU?ðêUý2›ÍÎÎΪ¾àêêÊÀóV"xFÄÿØ;e·u#KIfò0·¸Gn\ŸÎ\ø}¤Ó¹táÇHuy„¤‰'E'£0F.VƒŸ„%ÀKâù¾ñÐø³Ø¸:äÉ ‡ÃáÇã)ô­L[3Ô©yëa;‚sÇ·*ðýÛ×´ù€ÁPG‹z¦™hÚؤ[qÀÎ=CY~H@ˆp¸!)OÒ*·UN`Zu«3cBºêXÌ PK4›‘|¤ÙµRÞ«òGäïO«u|QEg·âVÖâ×Ðβ«éŒÑ£J,­ 5¡§gU¢Uá£Üí†JºûmN[WrBªdD5ûÓÒRRÀˆnÅ­c„8¬YN$Yo±pkr²tÝ´ÛO¸µ%@ˆsÝíö¿ýÿŸÝî»V˜ý‰ý®9võÒve.ã» ·2Xå—_?ÎãÑz{ôlgoÿ·Žon` kÖfBÚ¤ŸæzœÛ"+ìÆ`He냺·nŸ‚¢ñMnTÈJ P¬¤J¡MÑOHíb‚3Š‚¶~WuPù¶ž¤´ô¾†Ê»ÌøBªêééVÜê@ˆ,7–l~%fÌš˜”™SVR§D«üñú{ ÚJÁX$­…Y¡zt}ÜŠ[¯™ÚBæ{˜Npëø q€)_x]Cþ¬ƒ%ƇŪýÝ „8,Ñýòù!θ\.u ^6ô+8N!ñöö¶…(‡àx¯[qk‘³´pÛaM’ ¡IHÄ ˜(¦‰DRժ̻qX¦Ó~½Ånlìt5ä·çVÜšÄF™ÚM&Wôq*E¦l.!hó§^‹võÒcvÅ.Œ‘!³'u~e¤ˆ„µ8×-C¨TѤ¯æåCÖL«íÌ«#)éñÝŠ[¨ÝÞZcýÇÛ{°_å+Ðv,–’r…6E?!µ‹MÎ( Úú]ÕAåÛæ%“¥$1­vó¦3M|%å<‘[q«–çÔ!À¦»5›_‰³&&%EæÔ„•Ô)Ñ*¼þ¨¶R4í‰#_[R1Ò'u+nU»Ù­Bˆz~jl¢Ùc°}·!°bQ…W5¤bÞ5h ¥[ìѧm@ˆ¯¯¯³ä€àr¹Ô5xiþ+øþíë,9 Ä8•-ÎçÞ¿"àB x/!ððËp ¯³¬Lˆ¼t£ö]¡:¥dt|·¸€`K_Úç-Ú—Mþiƾ[›ö€€8عgsÀ­çݵáß/ËöË/[õLs=>ü/{ôÛËÙáP~Wƒ¾H^«¢NÚÕœEËÚùãðÁ„µIöV‰JªQâ¶õ%“}uüçßÏû?«† a+µKiìV+oîÖónÿ{¹Ug—»Uk5¡’ŽÚÁËtáÑúÿ?zFˆpïÈ»×øIÂÕàõ@¯ 5‘œ«ÔâÃÓÕ‡T¡vàÑ)A%Ýý6§­+9!UŽÔ–³“¥¶ˆþn=Ô»·Z­ï»þ¬÷õo^Hˆ°üœç“H²Þ¢ôš»Š¸UÉ\uhÖQ ܨ™ýiV~À nåϳݮ–pÊÑËЊ&ý4×£WÞ­ìš~M¯j·6˜4JÒÎ:¤ÍÌâ_¶c±””+´#ì„Ô.6!8£(hëwU•oëJêiIì–­KuǵœÁÝŠ[ ºº%€@¶RžyÎÅ ¥¤Ìœs4¯P¢Uþxý=Pm¥l,Ú_Þ/Y8® ¸·–ëÙþâÜ/Ÿ?Iv©ZSbÙoTÀ!`× MMháønU`ÔgÑ-ÛBgÿYV̨p½¡z1½ ß­§Óéíímše s-ñ¡ë˜˜ “™˜‡ lòM`€‰œ°µ æô“)m27ò"ã„M~=˜Å¸\.u ^¶ò+˜"•0‘“=á5ƒ1¸ 2ÉtÎôOäs“_ B€ãñXÙà|Þί¸Ðòc›¼‰’§Ó‰'ª†JÇèdOˆuljgpX‹<ü2¤BßÊDßn8ÖÃv ýGŠ[qëø=ôo!%·®Â}¨) m²Gd¦rmžhcÏâð!ªöîÉöÁ­x*l76y£%1j±èGäUF«rcËä›BˆÀ—aûnÀrcfq.—K]C€—aE@ˆp<+[œÏãþŠ€ -àF0‹Àsý*ò{Ÿn¼GeV2"¸·Öå—_?î`Æ£õöè!Àȱ‹Z¬'€[ûÃç-Á5"7ªø²#<½[€àpƒóÑ"ŽÛˆªÕ—Ó'¦JLhW]‹™j‰f3’4»VÊûcUE#ªØÉ»Å ëVÜšK² ócTyׄ•4X‹ /×÷=˜dFCØzJ,­ 5‘„JªD-ªÂG¸Û •t÷Ûœ¶®ä„T9^P[ÎN–Ú…ŒïVܪ¶|ß £óMìÞ„8,Ói¿Þb76+X¹«ˆ[Ë/kváKÏp+â€]ê…4+?`X·òç¶«šjî—ÏŸ$»Xm@µ±€SÎò«smÒ@sƒG‘[Ù5ýš^Õ"nm0i”¤c­·´Ð·5jЩk¶žÓoX¸32Ìâ_¶c±””+´#à„Ô.6!8£(hëwU•oëJêi)3"Õ©%3¸[qkAWkñMô@c‘···i®eŠEÂ6™‰™ C6$,-2wešéÔD‹I B`ºE³ù•˜:Ë-%e朣y…­òÇëïj+ecÑžøò~ÉÂq=µ[q«'V¿'eŠÈ?tôÈ™‹°¡F˜Î P QKHOå*£¨¼êŒ‰Ø“)ðšÒ&Ù=Ä`¾§¥‰f a£n°™’$’€Æâ’d:gú§òŠÊ$á”vÀ$­U%„8õN¬jHżé¥þn…AŸôã²'JžN§æ–Aˆ¥K^͵ØÔŽ U:{”¤×‚àr¹Ô5xyú_ð¡+ >b:&l Gdby@«D§ÌYzqŽÇceK€óyì_p¡¥“7Zb¡‰E?"¯2ZžT©|P¨¦y¢j)LÞh‰%y•±eÈ®QS‰H‰ q$€›Æq¯fM0Åãé5À¶›õ”´€) q$€Ä88@âH‰ q‰ q€EÓŽxÅÏ'0JÁ‹½;XqœŠ°³Âz[‚öy/¾„GDð jþºn;&Ëú‚÷j6þGR(9†ŒÙÔéT_ÇDS7¹œ)µ Źºêf³_…®ûñ½;9é²Õ¢YWÉñÓG³©'§ò¢Z.—]kðáÝ›UoŒ;­› ‡àå«×‹ÅbR£8PßfÛÖðLTaZj2«€b‚µ €û÷îv•Ó³ó®Â|>úäñQ§8ðåò[7Ïž¿Øó&Â2Ì}6Fq~Ãa¥›âåU ®/..:OBŠÃ/‰p½8¸¡ MŸWÿHq¤8à=@mÿcÔ ãÕ1´ßUÛïïîÅ_¡ÕpbF oß&¾|füû»¼º°É9FZÞ•*ÅçC®‰”¨?~-ǾQ¿#r³J“Ðëškc°- õÔÒh÷w)×ÉGXÔ5[ÁQî™,ë Þ§Ù(LŽ~Xô´6Ÿ;õŽÙ…ÑìïRp­\Ôêø:&ššÊw âþbƵ¿KqÀ§¸K×^9~øqͼ> úUMIŸÑDîãñÐ8YNƒgÎ]ÍÓ´Øñ7?Í?î\Y•ƒQ»Dͦ¼Uß_´ÔÁu³bÎ4>Üž€±wGŒ¤ùþ.ÅóâQ™kr¹?>ÎI?Ù»cÝ:Š( ÀcOc$Ó™ ¶K™"AAI·Lç..\ $Þ EÊ”)IG$ò0Tæ*GÌŒf0{“\¯×›ïÓÕÕìîÉ(Rìè×ٙݡfù/0Æ`¹òâøÜÕ~8Á/æJ¿ïËÿM‰8'ØÊ ¬¿‚Xðt/Àÿ–èâÀ‹—¯Òžà§q`š¦´3ø)D¸¹¾J @ËPÄ´ E@ãÙŽ*@ÄDÀŽ*àüâ2-aš¦Øzöh"ðîí›´À£7|£ ÀZ¸M»€ˆgés€ˆ`¹1X¢ûìég'€yžcsÞ[ÊqÀvôxúNŒKw'BO{ã†ÆÊöÒøÇ­ÅYP£Éü^I'q—b0VvO)Œq_³] çܵX"»´‘%ÆÑà‰NO9‡¥²ÜðŠd3Îõ"ÎÀZœœs„zòcõé'f[ŸˆÖâ:.Ñ}iOvkkŽ×MÕ϶(w—"åFÕ¨«,ƒÒÂkܨºo@Í%]‰AÛã‰ñ8è*ÇiÇ]œ•€ããa ÆõÂí ¢LT.O»"PÛ0 iûD`Œ2^à °‹ˆ âX‹ÄV¦=q€išÒΈ8ÀÍõUú‡9謹k5ñq>häÄw‰;µ SkjýX3ëÇ9ÇÁ š@"pH9çÃwJ¢ ã¨i›=1ÎïEMZÐÏY&)“·úÊ‘ˆ™?kÚʹqšÒ©ØQ¿ïilöDÖ)­Q\ZìÕñ©ˆ8@„•.|té'G g¬)çÃxiœ3ÄÕv¼£ˆ·)¥‡ ygj4)ég¬kÆóÝ¥¡¾NXÆãÉÇq` ù@ó¦ž)ƒ¥ú±æøóu‹øø(¶,Æ[Ž8ch9!=²ˆè!yº1€ˆ â|™6ˆH{"âÓ4¥q€›ë«´)Öâˆ8"ܦÍ@Äï½@ÄqD@Äq°û Dì~@ÄD@ÄqD€/Ó®ÁùÅeÚtqà×ß~O{€.üðýwïÞ¾Iû€. âˆ8"€ˆ âˆ8€ˆ âˆ8"€wT/^¾JÌó|Ê·æ!â¯_¿N ¸¹¾J'‡ˆ<þ<ðÕÙßéh?þôs =D¸Mé,mÀùÅe:BÎ9ݶ˜oîem vTÁ?ì=Žƒ0F³«H¹LŠÐåP[¤ÌR¦È¡¶#E.“jw%¤ËŸÀüÈ–÷„`ìŒMû4àÿq<‡-ª8€4¼žßYodû/™ªªš ®ë&¶¡%Hìè¤îì 8™µÜ<"ÑQqéö›Ä楠QxOsØ0ü):[¾'ÞHrŠv¬¼¨£~ƒÄ¤˜Òc— Šà©?W°8¬ëD±†æ÷YžÈLæ”ÇýfÜÂmšðÎsš™Þ‚(À8‡èv—þå"õ-;kN”¼Æ˜HÒ¶,gÅ~ƒâÀDOÒœeÊÊ8GÀr"¿þ‹ó\߃×å`z9'Ù´’a©æ”[Î æ”æð• Šó\Ù^<1îÿÎÑEóuyH"Sî%9³>1®3©ZŽçÛ¼æ[üËÞ¬6ÄÅ·QЛ^÷y¼x ½åR%}‹zì-WsÒ€yOZ(ì–tº)¬äÿ÷ûÈawí ¥äGv6)gv¸¨TÖ#§ŸNÿ±Óø|ÅS—Gãž©F÷Lx~€ÄêÍÅ%2‰äo ÿ÷kJ Õ‡ûIœë«Ë¸Ëãw©nž’8?-‹Å¢<@âö»àŸàeI@â@âH‰ q‰ q$€Ä88@âH‰H‰ q$€ÄxUNŸ¾|+)¬WËòÀë·ïK|]×%^×¼‰Ûí6úëe9æ°ß•È67·¹×5{âÀa¿‹þz™Ÿ½8@âHàÍ»¦-qðŠ~ÿèGªã“¿{dN®SSÆçâ o~ýü^W#g)q¨Û#q€ØÛŠë'Ûn qæ»P››Û’ º®ÓmÖ%q@·÷º$¬WKë:ƺl788J:€ÄyQ¢p¡ 8@âH‰ø¦ñ¿ìÀ Ã0¬Ï9>ž¶ºßЀ 3šýS1j°¿~@¡ùÎj%mŒIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/ide-eclipse-07.png0000644000175000017500000006316010536106572024564 0ustar gregoagregoa‰PNG  IHDRâ<;µY7f7IDATx^ìÀ10Á i‘ÇÈ€jƒáO{ @ÛÓõ$}öî/´­*Žø÷wrëfÛþY’ѪlµF™N*º‚à†õa‚OâÓ†âËÀ‡<óAô©(La´XíÄáæÃö2§U-e{q`Rè²Rͽ¹]’ã/‹ %¹kÚKGšúýääðË¥…sOoÊ··çÞLþ6U†ˆˆˆÈ`õ!"""zñ _ŒŸÀJ‘ú‚ðßÎr’9BN2GÈIæ›° ¡lêZŠ^Ýï Îôù×°4ñÄ0n"""¢Ñ:õeêʰÀ@ŒöF"€c´ÖŽHD¤\èÆÈ…‰î¡¡kP %“I,Y*•J§Óµ1壃@`!ƈh¡D+ \hC8Dv­>œ"¢Æ×è4^vb‚6 Dzº:ß|é‘÷_êð={wïØùàà=÷õ÷DÛÛÖØrxAHD‚†ˆóODä ž8mshÿc[wôeܹÉÌÅò¾?ï{9k âøÅˆ»A ¨x~ß“±ˆˆˆˆhû·è}PÙ²ä³)b^In‹mêpó’™Äú¾ŸËåûÓ;>yõÔÔÌï3Þµu·ÍµßžíÜèwwcQÓ××u?¬ ¬r^ÑàÙ§ŸÀÿ“Jµ¿6EàXàÑ™é¯.x³nÎó´¹®—s³®Ö®[êóyûжÇQQ]¡R¿6…ˆˆˆ¨æŸ>šTÂÆqææü³Ñx´·ØS(T±XÈk§µ6-J.ÎÖ¯MY|U q­ÖKI*ïØgPÇÀ9wy.YÈn˜ºøË7??væôÈ©o?91>|lôƒÑ‘wGŽþø‡Ïÿ ê,²„–ˆˆˆ˜Q†,ꃇLàÙ”±³]Éä¸7¶+µÅBÖs=m*Wrg<Ñ»[ P‹&•êâYmX#ˆˆÈb™ˆ«R´li$ðJŸ,Žœ¼¼w(¾} ¾uKϧã?¿ä`c{o÷æÍý±@SM_jR©_<æ2ÞyÓÒ¼}áÃR´µP"-|ü(A+(¦vì§ZÐZ¿@Vê°lîüsüÍÜ—ðKh!€•ãWñcFÄ[ïk )õbxçͦ_Z=fµ`N‘ó.ÒòÇm•ù7û -žÍ…72®æ¾—9þ[½//© w6űå ¹ñ0«•1åÐ& ÿ~4‰ µ ÿÔXåsO”J¥VþlJ<1¬Ÿ{ŒzR[¨ÀG&"""J§Ó+SVWø """rþeçŽq‚0 Oa)×[¤L‘c¦H™S„;¤Îlfwþ¬™ !KHÆAïB+#Þ§]ƒ¥§}Š)®{b ë:;ÉJÕÅctyÕïÏ÷49~`lôàô¾#Žã zâ_^9Æ¿K1.Û3›Éˆ•ªŒë1Ï7?:‚ý Ä=¤˜4@ïà¬Ç«÷Üœz¿î|™/ï*UÊGg‡ûœf_ËmthëaãóÊ»åÅÚãwoÜ®O—Ož9q±°uTz ƒM¶Ây -6abAzOçR×&ù(X_ÁþbòJ$ŒÂZô#@™›¿51R™:vjÇÎRÀXÆw²Ÿ·2G~Ø y9Šý¡ÜÞbq¬V뫟ÞÖž]¹~~S°ÒIFIòÆ­”FáZ}ð•[˜jã¹SZ ~uz™ïnÞ²õU†ŒÚÿŽx®^»°°ø°zúÒÌì¹É=û‹Ûú ùÁáì@>›å–ÉñOÞb. X_>Ç‚€ Í‘í…Êáêñ³—Wâ¼÷K7}sh¬<»TDaßÞçØòê« |žey`^T—1ÆØW\yÝûàm#‡ŸÞ¼í ƒkß¿¦¼R‰4ŽD’(–"BCð€#À“6ÐÖ´¥šµÌLMZé39:5~däoÜ|W±TF]­¯%‡ÆÎæšMôæ£@cã-N}Àƒ;~ÿä“OÞù£ï+´aï…íøkdŒ±ˆ³ÑINà¼ðÐã?™É(.*§%%ÒTÇHb¡P‰Ø©3m)뀄 %@p>‚W‰H*ñ©I ÇªdË Ÿ}ôÇ?¿å[·ü-B¨g”³„(¡âeL2°ð°~K1ÆÄ2t²¼c=;÷ìØxí×ö®É3ÊÌXO¢â$R jJ÷×4’ŠBS„7¶!QR˜ÔÁS/ä©P˜Äú+?‘×Txøö–ÑŸÿ/£x Dõ6 „÷ôOòâëü52ÆÏ™Íç£ lùô`×ÊJiÅÌë<Õ#‘”$*=Z}øh—öÜTŽ»(xä3HHHxÒq$Ig*+—&NÚò¸Gÿ‡®yú·ýÏo¼öª›¤óae)ïA!x<ÍÍOb‰0Æ 87»÷Á[+ÛûWv•*i¤¤² HÖÃJš¨"€ƒ§w??z÷?§öHˆ¤B”Tÿ˜*œ’1ê$ŠdV‘"†T›®ûÝŸî89>J X Áú`\È4K΢¥~!™1Æøß³£ýòŽ0~µgR­^7ÜÛU@) *I$U„@æ§_™:öü+;^½oÒD C@"ÁŒú†Š«tt—‡{êž… ÷„GA[Ò&|Û%Sc<ç`) 1û0i„åÃX>ÜS¼üê•¥ ZXOhó±¯Taï‰]ºío'ž@‘l„´RR¢…V]:òÒ㣘›§zíÄ’µm…“ -¦0Æc\JARè¨t•+È)•ÈŒCƒ'ç½`œíˆ»¯ìÿüe½ŸÐÏà¡|ïõì•ÖjJ+G„&r޼TI^PÙùÌψÚ8²™ÚÉìÑ 8¦0Æclç3¿ª¬ÿ`w¡Œºš­iïœ÷Æ[ë-œ Õš"‘ôÄÃÝWÝpÑ7{ C‡'ömé»/¾¶Ã‘Cƒ#Û–?`r@±oè/{v¡!„`e&8?»zÊ…ScŒ1vòôñc£ «Ö%oñ¢Z³ÍBÈ´3Ö{œqcÆŸÒ¯^•}|è«×~ÀÎc¿ùåþoÛg=o›uG Ž|F¡f´L‹éêu{^zLŠ7жKDáüÄcŒ±ƒGvç¡!‰C~ÚgÞÊXJKÖ‘µ”á É4Õ²PC]•"'®8ܬ)æ“jw¿úçí/ß~y÷¶Ëú>#‘4k*ÆÏ&K.²V¦ÅbWïñWdæs€€vScŒ1†üw¢J·,8C@B‘Ö®’ZG6³VI‹†Ìeh¡DÅ*’*ż¬2صéÑCw¿0úøþ#[ûo^]rD–, 뼬ÍÈÆÛ®¾ý/ÿõÚqLá•ÝcŒ1„×ÇŽ;;ƒ"ÔM¹štqªâÌY%mf34˜LÔl†"J±LWÜØSÌË*»=üÔ¿·ÿzÿ­XqÍÖõ7zе³ÎC; #k¬ ÊÅÅ񯯬x÷Å”¶_‘]®ßÓ_þ°Ò<íÜçÆcL@üë?ÄÚë;š¯!§“ÈNT £d„ãmÕãíH•â1¥ ɧ.ùÊÆþ-Ûÿ~çñl×ý»÷m¸±¯s=kÈïPg½J¯éí ïºjÊÒýcnvž÷|-î¾,¹Š1Æ3Y­,¤&#ˆŠ²0í\B.sFI9íÞL›æËtEÒ›¸â†®âׯþá#~:òêOºgÃÊnèÛæÈ0ÖUV‘L£I¡jOõb½Â²Ç”EÚŠ.‹)™´ŸÙ~£ösæ¿Àü{æé¼ýcsOþqžK–(Ê0Æc.é AȪ%ŠL"§Ñ‘-ªÒñ“bHa>8CÓUwz×ÑòŒ’ea sëફ 9ç½%W5@êÉI¹¢°dÚòÄü‡ÞÉâo´À=¹Et8Wb[ºúcŒ1æÉ×¼-Cè -%jN· •5™É(x´¡à3W­ÑøSÏ>tàŽã'_®góÀ¥t!—Yc¼³ºÀ9[T$%ε,ÓGòwf³hñ–4°ø-þÉ—cŒ1f½„&SßvjME>8K1ü”Ž¦Ú«)–tÕŽÒ¯í§úû†…x¯›2[Ò87Úï{acŒ1Æ ÅÒãÞ­lVVâ(j¾•3¡kJé(ØIÊ”D]@0~zÚM6‹(cãúÒUׯíÞ `Òd޼ó¾™QªFkcx­u©£\ߎã,=uVÃÌÆÿtÕ†“g.ª·öCí·hß3OÍ?³ý„æµí—àíü—» ‘ëªã8þ;çÞ;sgvgfwgÜÝ4Û¦Ù<¤±µ­©R"¡i /j U°J)¤Ð úFÐ>½Óߥ*A ‚øÆ€¶b!Xc­¨±š6ihh6MÇÌlvfçé>œs¼3‡îÙº©Ûtá÷üs²dïe÷Õ—sÏÜÿ ""¢™éþûõÂÂD«Pr;q”θž-•HÇÉ"帾N©°å¦0F'ÒTs§+ÏŸ8ÿs»‰rÏôC9¿êxE Øë´š °‹¾°UÝ{ËÊ÷¦¬>Rºö×íz틬ã®q¯u^pí«­ýs­üÊúïÑž~ÿòsW§¶›Ðø);¥“Tq…„µ+­@¦‡‘hEóW‚ ¿|íÙ³•“µZœ|œgçÖ{c­AÀ P’\­ÕnÙF±D£>³ë°Ò’o¡½"""ÚµíN$Z-ÝH£èF¡ç8€ÂÒ@AWP&|¥òü¯Î<óvµªã©=G²™|£ÛFߊ@‰”ŠZMÛ(0ð³Y^å­]G;×…™²¾Í•M‹ˆˆè®ÝG^¬ü)šé†¼z ~¤q¬]!—ÆÊñ~ë_•¿]¾ŒÂðÝ;§ï¤‰µâU³±ÑIôÔækI  /=4ä5«##)o3Æ‚™rMDDDôà}¿ôƒ_Ç7 ëFI惮;ÁqÚA¬ ïgOuš{¦î÷2Y%ÖŠ: ´0_Ÿ³Å]Ïõ¥»0|ñüáC_ ¸›²"""*ŽN}òö‡N]:ÑÜ#B™/F•,¬ÅXQPì&ÊÖ›÷AH[$+êÄ~cÒ(Í…†m¹‘0î„Y?wǾOãÇL!""↠&ªhx&_“™tÔÉb9B±x°àg”VH¦#Û%«7T"­Z õ¥’Í_öGóù¿¶“­”ùŒ3…ˆˆÈ G|à÷ª¾AZlІÊÿíÇÛ·tЀ(¼m‚1£‡#•¢rùcžtl…,™ËD‹ÉRŸ¯uÛm(njÁ >21šš}çæòÛ÷>ˆ ÁL!""7è^…½÷ÑÃO¾ñÖ?^¿ôg3=ÕÇÜqèjSëa£‡‰ÔàÐÚïÝW:ª_¹b7Ql `bÚñëS•âçŸøž‚™²DDD$%Ž=öôw~ôÈüÕ Cs.òƤÈë°Àö €A²¬¦t´ZÝvÛÈ+œTÝó““€^Í=ùèO2éœ2F0S`ÖDDD”õò_þ¿ÿÓ/…35oR¢;ôbÀ Wl²`•¸Óh4êŒìMÈyŽÛžÜ2Ô[œþÌß(OÞ @`¦°QÖ…ˆˆÈÜTÞõÝcÏýøø×.ͽéï]Ш°¯«“Á"¶ZDŸçWЧt ŸËÇGä;sÎìsOmŸ¾ ïúÑØHù«_|ög¿ù湓ÉðóCh¨Ë]Dkè µÁ¢® ¥‹;Ž«†Ò™©âx:•½zºYVÛþì·'§n5׃™BDDDÆ 2“É{ø©—OŸøÅ‰§S¥l~ßîòHÐŽºAØ®GUßJ×ðÓ),ñØh). …ðB£öZ-ùôÐÇïx$ëçpݘ)DDDl;µ1Z©Xk­Ìm;ïûúø=/œzæ•”²þôh©4]BÏBXÇr¹T@³ºÐ}µÞœ}sïmŸºÿÑ'J¥)q éBlþL1è~T–ˆˆˆŒ1JéXé(Š”Ra‡atí…fDû·ÝQ:t®ú‡‹çÏ\xéï©üXzJøÎ–«Ög›³Õbnëþí÷îØ}(“Îwç‚JkÖ’i™õRžt¤p\鸎#„tbfŠø€ŽÊ‘1Bk£ÁIUDa”àðÒÅýé£I¯¸T=S ÎÆm‰å&¶ÌŒíÞ’Ô ú¼´‡¾¤Q°Š1‚}ÖDDDDBÀó\Pž§5üŒQýG?Æ h¨HÁuG ã[ËÀ!Zi,! @8.ÙŸv×}vïDH!lÙ?ï™BDDDÆ@ iw9\ƒdÀòýÅ“+0ËOÚR¶<´Y}wð-vÞ› ­' l£XÜÌ"""2Òà`¦‘ÁæÅL!""âV 3…ˆˆˆ¸•ÂL!"""cpƒ1Sˆˆˆˆ}ãþ—½:¦øò~dÀh2 „ÞTÞ>’$éά3~G±[‡À 'Öûó!ô™§ÀÌ]ŠÛMIrþ˜®Ý”ÇÞÝ«FE¾»ñ[ÀFASð)ßg[»Xø),-§ÔÆ `#±€?íÚ¬ 3³Î³³™ŒßÇ÷ž½¹dçÌÝ oLàÙi M¦di¢àäõ›4b,‹ú’c7§Ù#f3FÄt¤šn"ŸŠDqñpÖ)ÍY™X)é“÷ŒðØ[ ]E$üÕªÅe<¬ÜI¦ªÄÄŒ'VkÊxXY `– d÷’iÜÃýl,¨kóUÓª‘7hv›;‹·ÖcÊi9ز² Y‹|5ÝDÊi§D!Fº¯¯~i›+ ÆKA¥Ó‰÷¸ÛNU)wYãí¤>Ÿüˆ‘úŠ}ó4nÕýJª8W¼ÍW¬Ümûf ú è(G›ì•þÉM5أص‰ÁþÈ<°‚} e‰Í¾þ-žþ¢v{ƕ͘­×ëðå„oHÎó|œßéÀµÙêþÃÇeÿßM˜¥ýÂc(c-¶àsSpð¤)P SZ¥« €¬¦¯ŸÚÅbš‹£¸ª4Uª)yž§6P±¥‰? éÓ┬Ò`žþs€4åÖõù·¯¿Î¾üü~öûÎ̓té'}nß88yõùôýy™ÏgGOî>}vïüÇŸžŸVÞߨ.øËÞý‡VU†Î9*b+Í•´l.+môc÷,E¼Ò[™›…,ÃbXPH¢A’AÁŒþ0ÐþhÚXEQ× ãÞË*+D+«…,Æ”»?&ã¶ín½µq@žÛ{.—»{t~?\^Î}÷¼çž]¼ó9ÏûÞsnŠ(¯ïIOä(±±ño¾îÝ··»úêYù“€ MõÍií¯bX`˜ÚŽTS½{b “•|zÏ vþeùªš"n<«b"`;ûÈ@š2š>u2c HûkuÓç³ãEÜø-˜y úƒé`=VOßz‡ºGÕñúxÌSË2¥2¦ü´Æ´óêνSŒ'šzìI‰}-ˆN\t2¡¶mt¼eºGë!á/QHSºººš››í­É<Ž%ẕz¤¥vñí×”|rDg*R‘/@€4Åd!!íd5¥f~ƒØu÷š‡ª¦KO£èb†Î'L[ª2†®”Hù@5E¬Læ1Ð?øNûbµó¥ÆœãÉ–­„NÐL³*TSÂUV_9oÞœ³g‡äÔÖUæÍQô’Rò Ö¾‚U §âUʇԡª€`¬>¤©Õíɶ%æú(¹Ñ1Qæ\1sÃÆ[²#ù !–N=•£ $¡;´´ï¡øBâÀ-m5EsgÍܾ+vÝ‚ ]G1ýÙGòp‹®¦HÁrŽ×ÚV¿ykýƒ/\¶bÁšæ›¶>wçºÇoŽìkZx-dz€µ)Úܪ óhª)ѬM¹D¾é³ã½Ó®ë¸Žã¹Î ×õ\×´3<óÔ´®çMvš€M+çJÙª)Õ‹.^[º2v×*߿ϯöxÈ_»Æ_¿¶±µÅj]ãæGý-ÅÄ‘²âš÷°6¥ÿ×ßO}•þéËô·‰Tê‹ÔÑÏ’Ÿ’úðãTÇGÉC]é©·?Hï?’¶¤J˜s¤/ðMÙVw¤aÉÍ"òZûéW÷¿µkË3ÛŸ®xºñƒAØ™Ž ";l÷å)-Àڔќk2“šø÷6˜Å´"¦çžE7 f2m¯¼ßÚ²¼íþ¥äÜ"®^Üš'ØV1“tŒN€òö„^;_…•€Ûê}¹Ìœø!%¥PMóª*‡zŽ÷Ů틵Tˆœì9.U•ÙeÛvÿÖ— æœL˜@%%ÅÄØãUÚV‘Sn\ ½| G¹ ÿÏ~öùoîÛ#¨¦ØÛ¿G]Iü|î\röúÆŠŽäy“£ˆˆçHÀlO„…Ê{3¿ U1Óe-­ÃÙpd§­ÛqòPWˆÇã&SI$ü»âw)þ‚TSìípÎkzùðõ³åèÞ;’š¹žø »åBž#&LÂØs{LðÔ´*²P*~âlXŸ¶F}œ¼Å'¸ýÝ›L[}÷þÜ_ ødñÎüÃÞÙÇ´QÆqü¹—ÒR;¥²ÂÉ òV‡cfsƒ·¤7e‡ÎaLÔd[4A㟾ìþá[2fD‚c›“±LE`‰[˜ D’á¤ÞÚJ-½Þù;N/c \i!=àùäòð½ß=¤O{mŸo¿<=„;(¯µ)n†ŒHÞëïäý_ìœhücpnšàÄ(ÅÏÎKˆ·¸|`âÖj>j89á´M8íQêˆèˆè#»_PN8Cò±u%¾_àGÀzµ8÷p ˆÆ2£n[9Âàç~däqÁ©ÈhmŠ›¡#ruMÝ£v[nÆæc{3„n’ f¡•òÒ}$oÅ·"êùƳä–snð—Úï³6ÆéuÁ†SÓ/~ùFAvþr`0^/‹<âÕÎñ3ý‚(}2­dŽUøyEÐ’áÈ0xmJ6e‹^{üÕ|ÙñZ±[Àÿ£о»þwTÏe{”šÖï ³s²â3µšš¤–齡[UÑü zÉÜ©`ô*»½¥(ÒXuÓJ›ÂpÜÌâ(hÒ ÆÎŽ$A(oekZ|k×ÀJ·,pEИ¸»•N“*©Qj¾%Ô4¥VÌ)BA'ª[ÑÚã½²fŠâ-X5ŠëFÓ4IÑ @A6Ò¼#ùþ¦ÏCûáQ4õsÇ€Á¸µÈQË4lOÙ±+y·Xß¾i神:;s¡­Þ”‘Ëÿõ'¤üÐÒ_uñrùÛn/¿uªÈôÈ^cZÛð%U-2Ô¢PÐ{éiaé97mõ+¬e¶r_Þ׋r ¢–°ò0@àQVA W»a!I1M–âÓŠäç`’ Ir¶%ÐÚcëC)9†t/ã¬Ã#QÚHÃx¼ ˰^/4<–+Z8M1=^Œd‰<Ì?–¥ÆÅn¾w“àQ®×vu%ÅÜoÊ(L¾'¥Õr-3!îӦУ™æ{p$h.P:ˆ5îTì}ÐX…X%$Š×Ú¼‰ÁMA»g_)âÐÅÓïJ¬«•°²¬ „(+Ú ˆW}¥R‡¤øø+BGУõÚuǸ“˜ui`Þè¡Qðql`àhRâ«¡8M  fÌ9¡Q"ŽS‚þk´·òJ5ˆ_ûzê:›f˜Ð.÷ÌøÔðŸ€Å FÜ]Úy¨ç¦Mð"b|"†+ÐÂѽHb¶ž€œ?Á§bωrÓ 7fWi\´âVX¸§c°óåÈÄ¢*>PIÔÙ›Š±V2®€‘ˆÚ÷ôi$頻©xª`ÿ!ñ-ûÂÙ²TÓ™9ëjOu9åŽÔ°}+þß/ߊﯿNE†é‘äAïR+=Nè®ÆÏ ¥óuó©I ‹VÖíß¿”ū꡽ÔQúh™iÜ3 }sKj[¾.𛳗6Æ,¤‚û‹—úA`%Fa½ÉÎ3ƒª|ª‘†LÔ€fÆ ¢…`«Ï[´ªè±¨ê]›ž©Ø :3–,´غº-Ããj™¥U-½U§¡~^䇃[„¿€¼Åç˺o>Ò;ŽžÍɸ÷9tø$F!rÂ;óٔʚ?yV—•=¤‰|¤#bHœÝó·Ãbës¸¯4)ï¾~àdó<}ÚšŒ'G܎1ŠÝmà)0&Øi©¬/Τ²$…À¦ðÃ.įZ8 ƒŠl¡—³ƒÖ73—âöGŽAÞ§·Á8k‰ÆÚ`d›æBZáPø¼ãæ/Š¸Ç´æ3ÆÏ˜÷TøéÓøøsA‡=ä|Ïõ<°ëù—6Fñ Ù÷ãïóñ‰D%üg,ÿËq­>õ‰j¥,tP ]0Ï0dsé÷ççdªÑ`qº½›;_IW¸.ç ÍT:P¼DB^@Jñ°Þ¶ÎÓhÞB úd>cTó™8(ვ˜M¹¾ªË¤ßÌ-"o¯XW°c­>Aû¡¹j탥¹ ³áv‹£¿æ×:ïû[ï…w ÞblN>„Š8!l0³ƒr=ËîÔÛ&²?SP>(M¤"Ÿa°"eÊqD2©cPÜœyŸ(zD"F4–>QæÓÓlô», ã÷ùÆç¯0æ̓ÃÙ¯²‡J{}Uùú7®Á(•48žzaݾ¼eH7:Åé˜ütð„”C–¦Ð *K’-­¶ò-ûJVf•/_4‚ýÆö8uŽ€Á}pÎîþøaa3Å%D(A*…÷ämkÚ=ð ø6س(5qö—/n¤åQÄ#á}‚t*zÂÆÜ´×‚>•îÌ[®S²^\Ê£oRÇÊ£’ÔâÕÜâý~­p Í>rµôÕ‡{ë[¦×1ªÇ$|°ÿ±sÆ,DAŸw9¢…‚@I,Œhg'®mlám<®Hg—BAò lUð¸I¡–Zy‘ãÙ+,Es‡¢§§ëÈ“ O^XvI˜_1¼þɼ,Ù—ÙÍ›¼Lá»ËÐ*ˆr)®ƒêuUÓ2³(±×ðz3‚þågSX‘, N‚¶Fá¯S‰·AC€Ÿ ÿ˜ r¹ßeÄ–Üÿ©žì€>ƒ]Ó(EgÿŽ9Ì ˜P ”è;]c÷ÝÿίßΡXþøiÅbžÌÙdãÚ“ÍŽC-.î–Í|YNToþ¹®êh‹—v‹‹p{j1gfÌÌßÐqZ’› ð É®*|ØÈʺ@?ÕÔûã·Ø]æ%p(V/¢eõåňgI"|:A¾É%zºó߀ƒþë !“Û˜K†99o†Ûl޽wÒ/û:óù|c^'?žDü]ñŒû¿~ƒ\.÷Ý·£ÛkSôÏëmJ×ÁöÑÁéîlwQkS*w Z™¨—ù…^Ö+‡W=„Oúüý×o²uÎõ÷º¯]ó îÞÿI4ñÎíã³Pˆ'®mJN*×°ó;$÷õ_”ƤRêØ]¸C2`š’⺌Y’†´’´Hš`šÒtcÀ4ex|ÊZcMykeëb™¨mm$]Á—í@›’Ú4åíÇ:Þ9Й½±mÍØ}ÛVŒ¦-ŽÚ2¥dd2‘ùþÞï’&À4åå“§¯§¦­-OS\ŒŠÓ”ÈÆQ[c­-E£î‡n˜é3>¹!(®?4Ö–ë¦)WŽüØyþ–hfî|&2,^ÐŽ›Í*›¯†ÅéÞ,Ö¿50M)¬Z;öøÌô‹ÙK#·ú?¼Ô“õIW¶#ü$&ìxÂi²í>vSë`š²²¹hŒ8&¯˜,eŒHR,KáÿuW\y³ñÐ/*Uêtô(•[@½} ëÃŒ>~k6À4¥z\*Øò•%FŒxq9c¤XÐ_ÞüÂÓÏÐ(Ø‹™>z”JwjüzÓCý ¦)µ¶)‘‹‘‘u?ÿúÏ«ù¹³G®|’MDŒø2ýN¿C¤žS¯LDŒ_(‚ú&áoålñ y?/0MI¡Mé:Ø>:Ø#"Ýí.ªmJø…°@òëçT!㥾©„mG˜Wß?g¨üA-€iÊB!ž¸>´)9©\ü.¥)TËjÊø…Þt˜¦ôõ_” ¡¦)€~'N? À4¥q¬$-.êÓ”Åçc.z‰|%ÉXöÓnŽŠÈÍÏ¿~ël0/²_¶ À4¥«ç)[“.»ñ‚r5wú‹ñüÉCG‡Î ´Î¤F@M= €iÊjb×1’¸`DÜ*ŸH"Eó‹Ë—OtKF.üpípÇ»7zG^ÏÍHÓÿ²s®±QoŸ)Øh0 °r)Ø"m¨@„–BZ—ÿ–PÑZ`±T*Mý€ñ ‰)øu#F£E%&b!QKZ¤u·H¤VijúiÓpÑ´5‚U¨H—›R¶{Χ†ÓìÔ3Ý‹Ë.>¿l&ïyfΜi³IŸ¾óιÁÙ݈cBø§µýLQÙþ‰¶ÝÅÞÕæ¹ÈUFiVj %äÁŠuî\§ßíééé"8rä 1•9[TªÝu$Ü@III۱ÕYs2Iv»}û¶Òè˦è# ƒJc¦È(oÿÒþoj;þÓïù³íîÜÕDBø á0BGÌ&&ŒZ§Iø€úë(ŒKdÀ¿ QšMñéq:#”qLÑ0ú.l·ù¾÷$Ž_µj‹²6EN®ø¹ Kc˜PVnT”••‘È’–6¿ö£G=äæïÐ2@mŠÏè˦°þ´‰ŸMá…ŸôI¸Ôuå‚l:D=&P—£Vbp¡µ·wfT’X@\ÐÙe«i#uÆ CX“¶¼—ü]Á†æe˦x¶·uÓάa×—L·ÁcÙp†t0Þ+–”t7¯øß³‡ø‡ä¿ ›¢l{õ‘†ÁÎúôcO{sMöÆÒ_œÐ;&mÞäÄ„é…÷i/ï˜ÿFQ ±@ò"Á‘‹âöØèºA|—4ƒ œôÑô8Í ¿uU7JGGgí³ÿ¯,|a[é-§ã'ŒŠÏ¸gÆÏ¯ÔþðÖ’Ô ATņ¸Í:@|Í‚ØvÔ5ÆzÏFy@† ¥I×cÆNÿ.i°º+ÐUI S?H½@mЍžíè•ĺGdò—.’.ò)ý%´S'Nxg=É¡-'Sšk½‰ã»OuzÜ<^Ü`•qut×íwŒ–=‡R¢jŒú^õl"Žz€î3ž(ÜDe=gx»(¿˜0²ÏÖ ëj)M’Œ¬ˆK©×ìâh-†™J€YéAŠÇIJ”˜5;³íøáÁ¯{‰ésÔÑøÞÝ ”23Âa©ßìŽãm·¥Û&•ïí:øú´G^iMMwõÚ52L}ÔUûÉÒÅË×]?\¶ooyrn­¨«Í~þ[4ìÌ7¿JiJür*"–댸”{•“X¬Jlñ ÅOå¨Õ;HBM® ›b0ZçúÀOܼ¶eÃûsµ½£ÎOÞXï*Žúíî¼§Ö,7ìäÌ–øn¹˜œëvU.v8Œ2·Ë=}ñ>.ž;T°pÝWÌw™Rf_Sÿõ®…ãïßÞMÅ’“ßÞz¼ü¸˜v*ॺ"p:!9dS23–E¯WÛú\3¯™­ÿ±B7È­'W5ØJž!(Îd©› ¦/ÙWS“ǃ{ŸóölÓòœµU†·›Ò#g VVÖ”?é¡j>䥕q¤«[äuƾõÊ6²)jxÁ,ÿ Ä$Ì Š@ó>,àÁc«ß%Œ¨x‰BÿMOóB²G½ÎØ€lJ,ÀÝýÇ|N}é`=g ašfLÍq)kSD;LEÙ¥ð1Ò£•5³ò„Ê^£~€lJ˜xuJèèë³)”è>¦Ø‘Eµ¢î lZõHy~uo¬¸€¨u:rÁ¬M%tMéˆóÔ;xýræÄiywe"˜´Óuƒyÿ ´/ 1N…WŸø•¤ˆZS±Ù”¿Ù;÷ਪ;ŽÿîÝM–ðIiD2 †‰ŒjH ¡bР %`hå1¶*m˜Ûa¨Ì¨ Ó‚íP˜>,åa1$‚3T¢`•B`Š"Ø -DžIH²ÙÇíÙ½’“îÙÜ{³—}òýÌãïþöœûø'|ýžß9—Œ1Ôóµ¥#J_=¹óÈùSÛf¿ÔÓO"‹»ÍòSaïGó[ò³‹×ÕFcV ˆB„»)‘õTP›Â?eܳ!ΊF]m¬€¿2r 1$ •§‚Ú”[v~<3¯m߇ŽÿžµeÝw9?×Äv\ÓtP-pS <~üKŠ€ïK"à¦\›Sš´äÅÔ’¢:{+å禜8É4ŠÇ… Ø*pSâhUÙÄú Í6Ò,ùáM0$©1õDk)†¸)º-cÙ½¤™<Œb7¥¥¦,eØ@ÖÒ·Pübºð\¿Þ̃©­©Ë ~çnµ)|ruÝ‘Óg'ŒóÊ”ÓçXË—ùD€Ú}ZêYÓ Ú*çn¥Y•pRR£Ö[ZI¡±n.ˆ÷2¯3øE‚€‚‚¨MaëûÙzîŸÖ”ä¸x½©Õqsîè"òaËÊlÞµ‡òs‡ÚmY÷iÿÝ×øë/Â;ón:¸)9ëG§ßtX–Ä–^}Û­ öÄ$çñKµÏ¦g–íð*™[>,£1tÿÕK¦x2Œ6F´­KÝ#øú¬{m¸)ŒÍ<ÿIÇ…GwNI_V8Tb†šO{nAsÅyùê¶ü¼ä’) öV­?ú®fø©aÜ”ôó??ÏOmÞCe:sP¤zJÉlooûüK`ûŸjüdD¯ëÞ‚F~5&;ø3‹^?ª€•>LšŒ‘á—¬S\T2™v"®Q"€›ò·UÓŸ<ô[P“[¼S?-¼ù* .&z긲€Ç‚iÁ#V‡8PïW}Ä7Õ¸”øRq®Qø¦€›¢ÝÑgW–ä}‡~SóO6ïS_U6ðÁ”†ª2zô@0Š„Çúú —"éy°EMäÝ”5ï¹:ã’±÷ªÔ7{ÂÂS_7œÅ‘+nŠ£¥¥£±N"‰¤ø~A[hœê¦èωˆ£4îÈO¨;ʸ‘cbŸÞûš€Ú”«_´'•ˆN~Þ¡´Õ±àË&5Ém7Ü”Žë-ÿ9p„T]¢¨9õ„$‰gêkÚ aœ˜pAB^5 @mÊÊò¯wÆ¿ØzîÇECÔ¸juqVy­_ZwQ€¸¯¶¶É:q#î7ý‚ nÊ7_©&=Ø\OÌm¹‘ƒ bþR¸)|ËüŠt‘,¥L©0áRµºksË%ŒïNk^ˆÅQ®<ঀ›Â·Ì_:¢ôÕ“;œ?µmöKÔìRÍA£˜2~Åý¬‚p2ôªy¡CÏ*µ6 ;pS$Å&NÅF!°o ¯T Aað|H·ˆo­ñ^¢RÛЙØpSšÍbmjîvŠ)X 3cÚcÄ$ý¿¶zm`lÙ©Ù}ú úÇ1 :tŒ8 qÜtGÉQ$‚ñæom¦n ãÚѲ‡æf (€_݆K“ÀMÑksmNiÒ’SKŠêì­”Ÿ›râäåü\âHıD²,Ñü@)ÀÂ0Ñ7ÅíöóºÂ—‡b ¶ran S*¬íê²tž º1cà¦óõ4!nŠÛ¥(_ã È0ßz0O8 6¶ëAÐΰO®*Aü,–ƒ ÍÔ¦l8³÷ô!’‡™ÿœ¬ÁªUƒß¯;kdL"n²©½©(™nÊ…ýÓUK¹Õ@>7å¢/3xb…—Oט€XñY,\¸t:(+V¬`­Ÿ#ŒÂJÍuÈÕuGN7ž0Î+SN7žcm¯fWö©ä1k ×í¬ýUXñÖ&vðä“`¥ÛéùÁ¬_Iʭˬ}lÆ ¤Ð»o½d]-·7¸€OY ¶úáyRî׊72w;ÀkQ[2Üqr?[ïÁýÓš’¯7µ:nÎ]D>lY™Í»öP~îP»£-ë>Š*D/'v€›’ùhå;oL›Z:¯³2h÷Î?gMyG­«¸ †û_ÏðÝd U4§<ût')Ĭ5~#ž‰g¼îD„›(]ã Á¾)›yþ“Ž îœ’¾¬pþ¨Ä 5ŸöÜ‚æŠ=òòÕmùyÉ%Sì­d ì 7E»%¢¬)U•Û§+’RUY•=u75žY8¯ZqÞ$¥`ξ÷ÿR˜6ö­ •Š8Mc~îFCèO‡˜æèÔ"ê¬ º&Å™  öMaÒdÔˆ ¿d⢒Éì° ³‹Ë²¸»¢¢ˆÊ÷°öÊÇ¥“žÚáq\“$E!/—oß·yÆ=ãß6¦øìŒÚF ºE|’8À¥‰_• Ïó$×+<“›2{åþÎX–d‹U¶Ê¬µ$XXcI`ÿñ2ËYdiù¬ûïÔ¶o¨EÅåôìýÓLL~âw¤ÐÞ7¦I=T ‘ó6øø“Ä`¢‡¢vá’…Ã3<“F€›rOfFïìá ©—Eî• '%Ê}|G¢¥O¢Ü;ÑÒ›%­’Í*ÿ~S5‰Hd2|Ë|êß+Vn]!R\.Oæ¤J]-"Ö±úõ ¢fV¼ö¯OÇ7%L‚nÊ•ú IJ,Y¼NŠla>ŠÕbe‡/eK²$S(ÀíR¼2E"·SÑpMŒdÄSãx,ÉøS'€È+¸)Ë&9sà_}†è~Š&âì+ÇÀíö(Ž«’ä (ÞèW¸)nÌÚoØnÏà(¼exIí©³akWÑ ÆâmâÕx>b%ÀãE€-ùÙÅëj〞FpSœ>ñ!Kÿ¯k%5 EòµäÅ屘t2Xg>*Ò‹“£\£ ®ð…?¸)ät{/¾¥²æõŠC Vëô‰ÃŸ}òáï—¯ùèÍÅë·|°cß òÁNnK¦oüºMwqˆxêgØh ‰B)œŠî&nŠË{q¦QfOý“ÇÇÍ_¶õpíÙ‚1ÙŸž¹Ä4ÊÁ­‹Ç•¯a-u¸¬ºßÁQ3[ aŽFÈBÇàpž×½EذîµU÷à ɺm‡ÏM9´u±DÄÉÆ—Ë—þºjPZÿŸ¿ü6Kª7–%vøz Ôªp½]ä܆¢ nŠn«z$Óþ±©¹mÑÉDi©}:k|õÁÏdv¢¨2…jÏê µ5ich8%NÈó¨âãÝõO“ŠäyF¢£Û# ›â>ïãk#ÖšÜõkÕÈ·UõK8,V:c®D7%'7äÕ¦9£ÄXžÑ®•á§BBØÂH܇‘DŠe ½°víZŠrdŠÝac­E"î^0$vø›ö›†ÿ!æ5Ä„ö?a¤§Ø_{¸îø.ê~Ï|é·+øK…¥U¬l9êdŠËcùÃÊ5$IäB¾¬Âµ‹…¶|ü¥Â5a“)sK (šÐ÷Bâ “>ü½³ ŠªŒâøyž]_’äeÀDDÅDÍË2ÓìeòK3ÍÔ‡¦Oš©#Šâ )¾1õ¡OÍØô¡5:5NYV£!–Xâ Ú˜Ši(®„îÝ»°ìí,®\Ö…]7ÀÎoïž=÷ÙsÏîÌ~Øÿœç<Ïí’¼ÅC¨!Ú,½šÌG{½˜ß$7hŠB(Ê”%xÊf·$¤N/ò˜sÝ1¦Gð<ätùµ»“é[?ÿ}›œg Á°La˜×óÖB÷Ø]Uÿ Ã0 ˆ5Êé+ $Z)lv‰>Z° aB98hË—ñùZ Ã0¯N‹éQßbEEEâßÚº—>¥gWõO–) #Õês!¥è = ê¹zâ ýŸÖ¾ÅÐâC¸ª¿Â°La Â"6&ú͹£’šU_»êjÑôfç[®Û-^]Úz—ó?®G;&<ˆ0Lö䀚ã•ÐKðÊÿfQ½ ˆö6YðÚìÑ“ZkíIçÅÛ^§ÙãÖ Ù*ìŸMHãaU]!nŸý€ü˜ K”sóä.åÄN|G9 ¿ï‰SV‚…¿ªJÁÄÈ™…p?¨ùºíÄçÞS§¿í[…vò¢2xà`Xß”±Œ„S\\LÛÌô¦Ra™Â0RÈ7ò3†Ei^ál†ÇãÑÛp»ÝšîÖ4}°4¢ʼnèô·…·j߇n?ù]qýø¶úê²ÄÜ•`âÊÑ÷П^`ZV&-ܪòCŸ„aHXXUHЫ0t"¡Qxò÷šCŸª,Tb1Ÿ¢Oã]Fšß²^Î2% #Å€±ÃãÀfkt·>#jˆ===¶¥¹Ù£þÃÓèô5Ö ¸'§ÊÑ:²—ݬÙå<±“ *¡qñÐFòÓžX wsî`1ùs7(çô·…4˜5¿T9'¾Z6gás5åØ+(rêK;ÐÝs×·±¸ú CJ%B“D É ”,Tb¡¢ žª·”c4kDEZbú+" ȨèAŸþéÞwòÆ÷§N4¸oØ4ä!WôPÃáKˆ—ÉÉd¥€! b\>RzùÈæºÊÍíåðF´©³Ö¤>¾ó?•€‰?®C;îÉ’ô§üãµßùcÎ(B›9oSæ¼ÍY϶çQ“>9 ¶€‰ê/W¢Í}a[î‹ÛÑùuïrz+ï•]x SùÙRè‡0\‰!'|ø–¨6¨òAJÇ%5¨è¢NÉ¡SÁ$ê*J ›®¦0Œ»0«¡~Ïw£¦»Ýxhš[×\úšæ·^¯ñhæ\•ëÇ·So 0“Ñt—¿{Öèøðè©SSÆ@0YË”lpÖì´tÑ®0µÐþï`x]+ýWEP£X;jÆ¡^¥3hP•F +:EAsC–ï–) WS>?|Õ1tð¤ŒZ÷;ïB…Ò.Qt®HJON#@t¹yèø%ݬe$LYq­z[ý±²¤©«:­ô!FÌ,£+Âö5écí¢;g¶§˜'}Æ?½lO9õM!µÐfÏ/Å5ÉÔBKÁS•a{ vÑR mDj1Œ øû+,ÿRG¸ëƒh$T«¶ ¡*„P˜ÕéiI Æ Ë†‘Â|´¿îùé‰Ùi‰£Sc?Ù[uö’[ çHJJIH ¤y5²ùÞrøŒÉ\J«‰iß<†ó>*ÌÔ›¢Î©7…ò˜ šUÔiJ'mv1í‹;nÎzë=ê&<³Éœ‡6MQq´ YõÏ*F §½¼“òL_\Nã¡Ãþþô?€þ -x52ZÇU-ùæA‰·^ÕË0‘—#,SfwU Þ÷¬r€z{d†aè^Äÿ”†e ÃüÅÃ0ÿ²wǬQ4aÀÇà'ÑJ"º¶ù ‚v6V~«t’.)V~ÁÒòÊhuƒ•~c@BžÜûäæn—Ýw?ÙÛ›ÙÝÏð¿ÙÉfSàÛéë2¸¬ÿ ߈)`‰ÏÀSàøè 0£?= ¦b €˜` -Ô‡ÐƯV…eË)à9ôQ³S¦°6@LS1xÜ=OöL‚˜‚Jöã+aº%õjî[_­åœ7S ½2gò+™Už¾/Ïþ½j±§í=Þ­_È(×Ù0gœç´ºÑ6XV;^{ëGk4^‹˜‚Œ’Ô[¶'©ÃÕµšŒÕªÅ‹ bãzÆp„†ëÏÿc›þR#óJÜÓ}®OºÄb-ßh`6¥Äz[kÏ­E{#¬¨Û¸‘_^zÁ«úæ?r•5锕#„Ñ©näG=-¦@L* …³NÖ«ýR7l“vò&P¿lRµK_ã= ˆ) ïŽ9 n'Lz5d”Ç‘ágJ€8VŒvÁ_WŽ]âöìb ÄÅÛ=`R´ p‰gŸúŠf0Êm¡®ã ëÕÅ=õmh¹15\Ë&)θ'i°~H†ƒ ùÈqgzö:î¤Íò=[Ä2ŒûÓAé.Çlî›·ŒÛ‘˜‚Ún¨ó¤Aã©7¿à¼oë`”7kÜó¿è¿±˜M¤ZjÆ} Àw¼Þ{‰)¨1OT›6yX>€˜à¦œ~þRÆ1öööÊ!¦ÀñÑAéÖ¦fSÀ-a`ÿâük™¬Ý<‚™‹åÙØc ,‹¸QãŒ)pxxXúÔuÝ£7~||»\.Ë¿çõmžág³ÄØ}ú¬ ˯VÕÙ¸ÅØùuR·ÿ ÿ6¼F â-ª@*‚R¥´)^¾•D‰M”P=@“V†¨­%šR7*•¢¶Q)­‹ÒFq‰P •Û‡†$ª©ÚPãH¤©AQ¤GÁ >´HQd ¶ã.Ø^ï›w»^+{¶>žv×»Œ×÷%k4s|Îٵ؟þçÌlñZZZä`óæÍú_mo´jTê‰ïßïy9Ž„o ‡nÜ>;zê¤cÊ–ú¿ßëVY ƒÊèêê;Ï^šßæ6~Êê\¬‚f6CLÏ¢»1WñŽ/ƒ±™‰Ï®ß]SƬ¹º}‘Æ|ñ~¥ýóò're∹4Ÿè¦Åfw.Tñ3û.|1xð± ¯½zZ±rðLmuúIO׬WI˜JŒxìjM¶ÝêéQq §¼åÖÙÏ€˜â½ù *Í6—þ„ëáÙŠ]ׄ®þé±ûì¾/)þ¹ø%»³S=&siN¬ž7;³=0€ì_™×]¬©Zwá܇3…€Œ9ºU`o É.ý¤—„r‘YŠÝTûìœ@JR@J™Ìøc*•i (Òž\+víÁœúνÿ6ì~E$™ðQÐp3C¦Å¾4}ˆ)@I—Q\¶­äãsï•tä'>³ô;¿~\Žü¼©ä›<Ì åŸÄ *è7˜äa²ˆscˆ)ÀPl–⃒Ü»ú»¿ÚŒ+°þ[Mýýñçw¯Qi˜µ»±\Jøê@@“„es2vnw+fBï2L™S€pl†‘¯ürÝ?ýêÐb©€K)J¥2‰EúÃó­/Õ¯r_[™¬¥Ï9óéé=ÐåWvKš¶Ð°óŠÝ2™¯RÄðè[4>£êg÷îxrý`(¦@jlCŠr6¤>øÞ‘ß|Ás‰Ä¾ô¼99­¯¼ç,|lÅ`NÊTˆ)à¡)Þ^yvù¶§/¿´¿]Ž6,×-ÃúS,±rÃäNhï_1-,ú”`‚ÈçØnì[ìòFi&4¿2IÈ´Ø!Iö91˜è`µ¿ Ö$¿íŸ%¦æñ*ò$ëÒj·Z¬v×KïFÓîx^Ä ’2 Øuù1 š€z nÓ4ª)ƒ§vfò}bŠ9w š*(ù¦–ãë.éSûá]+wüµ¤wˆ) ˆâ_ßܹiÏ£×#¡È¨PhõƯõ¾¹3÷Lîx¤±Üwˆ)@T Í­’4w‰æjŒVôƒ;ä]M±žš?Åxýø[òS€˜ùXκÿÕ¿ø‘<°6—TWW Ä lOŽ·„¹÷'÷‘ éS'~»Oÿkþâù¾V«Œ•ß:¢Jàà‹ÏéÖ1<9>KÆ£ÑlL9ñû—7íªÓDB¡Ð{¯U%°ºj|Ä ‹J‘LF9ºé{Û ÉŠ(QÊWJS€l5åÄ«ßôí­ŠDd iîÍd”©¸…ÀEÿ<0 ÄðèÛõD&£<,M˜Q8dGÌqˆ)à{|øÅ›]¿«iz©Y‚uV¥°úî{T^ÜZå¾m™˜¾Ó‡ b¸x¾C>À#jøNPYñ%ÕPM)~`ÃÿuÓž~£K1TSJ2ðᆖáðp<ž¸è=Ð0sÛG‹÷=*{ƒÁúòl°b @5eÙçW.Z8OÒ‚¹ ŽÕ·>õÂ~mº_W†t#:úŽ+‘Ô@lh8<8<ô~Ó1•Sª)録bÅòùs”Ö}gW[ÛÙ³ïÕDâŠÊ÷Šÿ"kªÖ]8wÆnñÁ[šf1 šr×Êå#)…†“W®þûÝ%‹žì<—lÒ´c"ÎôÉF ‹H2ŸýùŽ5Ì$e fþì«›ëÒô™Š1 šò™Ùê씋Šü0.þ¯›&°¢É-~&‹¸õ1™iêÅ€jÊ+Mf íž–v-Y¥¾n9îØÛu¸ÞåÉúî—és÷v÷ ûXìö‰èzT}úth«Ûz‡¹4çã>³=Û]f°ú81¦µûÈçXÃÄ,Ù͉¿vΰ[Ü?ìMæÈíÌaŸ»ô´[*uËLÕ—ã–šÚìZ}|­­­q˰ÒRq¥F4jDɘF%ý¶Ä?_”èb4=€EŸqų0ãYó(Áþß%•™¨¦¸s·Ð®>y²[—ß‘_ÙK6]~LN>˜bI9?¶ÍKä_Ú)ô/²÷¯˜-úTSòÜBÛèÿ½¢fµ%OÜù ØÕMkÑÇ­[¹þ"»ÌcZì÷cŸ—-¦ìMñÞB»ÿTÝúyêHÊɆÁ·»\vfŒ»,,|ä¹=Ö{Óbõ)6ÙݦÀ|rÛ-® ;˜óìpsnå ÷7Sü6XûZ§N5à)´tÔ57·œ Wõ]M õ%#ñTòÚH¸gd¸'s\¸}—g‰Å¾´OœÚ='4c-Ž“xß%dÖì—óëñ·ûH$Ö¥ÕîÐâÞÓžÐëE½ÇxéÝèýN|SžB+µ¶n~èüv%“'• $ššì„a·ä;–ÕÀ{‡,&1¦<…VÝkÛÛ;—v6ÉADS’K}¥°±”L€iJˆ)O¡b @5¥f™¦ %äs ¦TSn0wúôh˜¹í£Åû•ƒ½Á`}T€T`Š¥Sîô9VßúÔ ûµé~]ÒèèO8®DR±¡áðàðÐûMÇT€€*ÛëÇßR¥!¦ÜésgW[ÛÙ³ïÕDâŠ*OæFßrP]]­ÊCL¸ÓçÝ%‹žì<—l*úy¬¦ÝmH 8øâs1àN«Ñ›=ˆ)Õï‡åïii×’Uêë–ƒàŽ½]‡ë'\Ö;qyº«=${ž{™>¡Ö€˜PM¿…vOGªyM˕ݽýê «?¢PT‘„>‰èzT}úth«ç·çdÓ†iÉgÈôÊ(ˆ)Õ—ã–šÚìZ}|­­­q˰ÒRq¥F4jDɘF%Kñ{ÖƒS¦/PMq?æn¡];}òd·.¿£20…“WŠ`õÝ÷¨¼¸µªàmË3HTSòÜBÛX‚­¯å[Ípñ|‡PÞGÔø)¦ðäè”F<'›t¬ÿˆ3nòM˜±ã¤2„½)Þ[h÷Ÿª[?OI9Ù°3øvcW_#lØ›T<‹>ßÙî0çšq“cÌX[  Râ)´tÔ57·œ Wõ]M õ%#ñTòÚH¸gd¸'s\¸}—{ìð¾ôbb ÀSh¥ÖÖÍß®dÒ.e‰B–rŠÄ¾><…VÝkÛÛ;—v6ÉAĹâž<ì!€™¥[x ­ ÖT­»pîŒ^ÈÿnS¥Õ” ¬Y–ÇO®ÿ²wv¡Qo#ém¥ZЋ~Ò‹ õ䦡æD¡F¼IB)V/$–zá¬ËPÚÐ@šnÅêE¡„^4¤éMK$ l1‰)-½‘`¬IÖàGö{÷œnöÐó†3;;»îf’³ûüX†wç¼;sXvÙ‡gÞ™}ë¹ aÞj©|-’yPi€˲ì}Yâ¢ÑÑÑîînÊ OÔÄ3‡ØŸ"'`¼ÿÑúãïg§ÏB ³¶õÖæîC$áªÙï_qÒÉ3o'ï°ðë;7–Þ' ßt _p=·Í=«‰­QØÌ¨F7…?|nJ‘—j©`ÀNŸ~ÿÐɮڿ‹fÃô0¾üˆ$)eÒ£D8YІ¯öõÓ„ožqß_äž}ó,ZPV}À‹9®ØÉq=uz$9BB5Ö¦€>[¦‚Á‰‰=”‹$Å]¿úr7…¥Œéêäð¼7–¨üD½"Á%\Ļͣu\=U$SÀNŸË[7Õ O^7ûH»)¢ì(¿áÑ—ô»)¹")ƒ°(þ%)`§»)v°æ«9:Ý`œ8-%;. ¦BÙ@`§ê°üo¿û1pᇳŸ_ †¨ù5“=Œ£®Lë΃²ðUÎ,¾'çPNìzê´å•SÀ)q…*å’GÊKbìU7¸)b í™ñEk`ûàìé…EšÐbŒîÇ)–¢{1z§P”nž?èrS2­Kð*ŒDˆ™v+éQŒ–ç8Ð⦀%žrå8±ë©ÝVZ -¨MÉÓ6·vJhéî\0ØÛˆP+IVš–I“™Èf®Ú5, žE1e¯MŠDxʘ¬zʱ*GÝ#Æ)ÀMÉÓ®,¡­O\ž¡Û£¤‚kSTèYp“Õ«Mµ)*HpX>Øé#+¡íU•ЪÝ=¢Dù)ýŠ2Ô¦p ­s mÏHûÎ4n’ŒÝÇŒK½S7E±²#Ë´Û{dƒsBEîô@¦€Sh¯· ŽDvL'BwRáKZæ\:2ŸŽÎgÛº¶7EP'yõ„¢SÝñâ*ÄM@¦€Sh‰††ìn#Ó$–U“J‰µ)ŠÅí«?•é¦ SÀ)´4S?66¹m²$Ä„>ŽDÐ/Vx^Ô¦ ü³U+)àZ®ñP[%n MMMä@eYüÖ¥ý7Àß»køŸwýnJçÌ©_*Öø¦ëú‚ë¿mýþ´|óÕy.)Üà¦ìëä> ÎÚÖ[›»‘„Ãðë_7,ú€>ýþ¡“]=´͆éa|ùIRʤG‰p4² _íë§5 SÀNŸ-SÁàÄÄžFÊE’âT$†apE Sô Õ^ú €L;}.oÝT7ÀMÉÓ6·vJhéî\0ØÛˆP+IVš–I“™È&h„¬N ç`=™âÜ”üíÊÚúÄ•ááº=ºþjGxG6šè¾Ç@¦€Úu mïz­TåõJ^Í@¦€Ú±„¶g¤}çF7IÆîcÆ¥Þ©VvXjØXV"öˆƒ+Fö €í;ˆèÏ뿘̙U"SÀ)´×ÆÛG";¦¡;©pÈŒ%-s.™OGç³m]Û‰ÂVvÔzBˆã(Ò÷€ ë R@œº|sñ«ä3ò¤bŽ¢=Êp -ÑÐнÓmdšä²jR©õv®šúükÍ¿Ä:5Ϩᅺe 8…–fêÇÆ&·Mö‘„˜Ä½àÀSg»—EPÜãZˆ/e‚l+\•'_9—Dë(—Š8G6]&pµÊwÆ2œBëiâo¿ÝªŒŽÅ€ã"§æ¹ 7`8S-¿äÓq§úÑï¦7¥å%ª2€qÂ%g(†RÞ⪾EÎW¾3ºe pSöuòNŸ…@gmë­Í݇HB‡aø½i¨€ÚEy©°Ð£E¨½ÒŽú)¨RpSÊýBÞéÓÐØð¿¦Æ[[_]]ƒ¾‘‹¾ï¿ö¾ô;ëû¿ßwê3ßñS'>þôHËò*®QVo”hÛ»1Ç››¤ô»)`§Ï–©`pbbO#å"Iqò6.eÉ")\ur&¯$ÿUñR!£)Õ•ëÚBýBFñÎh–)ÿ²w¡MÇ?g W˜âª»¨c›0¼˜¦W0A´ƒÖA-lÂJóbìJ:ŠwÎund ÛÔÁæ²\èF[DеëÐÆÂ®&ÈêlCüiÓ“49g¶'Ysh¬ùÓäýBOž&§­åÃ÷ù>Ïñìô¹Ð²®yhüŠ3PÎýÀl$ª¿„á3oΘcÿ—0o¾,éW(é·0%ýÏÔzLØécN®ÄÄMµÕ<5fL¨¦ø–ßUË&Å¢*"pàpäDŸòxÇÞ<öoqÆL$æ½qþËÜ Ë@­‡b @5Å<,¿w,î†6‡ošŽk*©¸­DJvF·mÝI)6««Ç÷ú< ÇŒÁÅü`±·5JF@L¨¦ø\;:÷{-´º592ìèOJ’;'7«yY9iÍsä+—QJoRa=1¥jŠÿ5¿…¶5}qh(ªëçUA«Eb @oJñÚà#4½=%UÛÝà‡Ÿ~ÑŠFLèM1[h ÷l]£1GÅìèœ Füó‡—TŒÞX¿¥"U’V¹²,Õ£íÛ·k¥#¦TSÌÚKc=¡Px8¹e"»™™‰9öœëLf“SÙÙ©…ks×AŸ´áÿØdÿ-ÍmLVI²T§>ûä#Õ'bŠ+Yj\àZip°}×D—G\×ÊdÏ"Ž+YU]ý,ÉÕJbŠ¥FN¡U´utt|Ãø€Š°} !Kÿ’U–’ À|°èp mE1 šÒùœjSª)»ävúL÷yrß_뾡"}•/¨1`§Ïé¾Á÷?>¦¶WucFÿOÍÿKÎ)ãènzf6yovæ÷Óª ¦ìôy622rùòÎÿéa攪Îqm@LØés¡e]óÐøg@åd>K¹ ш);}̲¤ÓÞ€˜PMÉ?,¿7<ª–MŠEUDàÀáȉ>ÿüa>GЛôúã½Á %Þ¤76?^ç91 šb¶ÐöŽÅÝÐæðCÓqM%·•HÉÎè¶­;)ÅfuõøÞ%®ãÌxó>Oó1' î™Ô Ä€jŠÏµ£s¿×B«[“##ÁŽþ¤$¹sr³š—•“Öf¬ñ?ëAˆ)õ TSü¯ù-´­é‹CCQ]?¯20J#¥uÚªn1TS<¥·ÐË}X>›€˜ª)ßÚcÃ=[×hÌQ1;ºç‚Œ†o¦Dæ=b @5Ål¡½4Ö …‡“[&Ò±›™™˜cϹÎd69•Z¸6w4Ä70¿´ÌMÈfË­b @5Å<…Vlß5Ñ%ÇQ×µ2ùòߢlâl7Ä€jŠ–x ­¢­££ãÆT„]jϬÎv@L¨¦TîÚÚÄÀ•¬Z®¦T?yžPI\=€U†jJCbŠ¥šzS´¢Xô½)÷†»½ñêÁòŸ·°2 S@ÅL-®d)píÄ›¯÷_Õ?¾÷ÒÆß«¼4@LE3¾XÊÜ;ÛÝÖûAj2h'ìy‰ÄË;_›>ÛŸcVï Ò„ Ä Ò‹”2jÚ"©©EMú× Û:õÀÅãï®.~3vxß7l¾yqÞ¸ƒqÂ[M,U@LÒ’}KÅEÿŒ¯ß³¬'›ÁÅçõ¿ÄPGñ^ðNRY¼ÂáH{»-ÉNè3ŸÕ­]¿öÚ·ûµ`ã[_k9h[b à­³,òÛV¼kdᚺ›òbÊ™/¿j;Ø£‡I$¿ž%[ª€LRJÚ€LÁ×`\H)2°M€×·÷T™Ó4¥Rȼô£°M)2)2)2 ÿîâû–ª2¥”’ 2e]æü8‡4mÇËùôÜÂcù°.sÓ?htäö'´€›>2 7\2\ÚdŠá’áìݱnÛH`â ·ñ¾ÎiÙ]™"qEÊt>w)]ø1\¸tÉ2îb ~K@“@d.ÇßÁX­”bˆØû{9+ÿù×§_? —†“>È»¯-v®q§Uº|\S€–NÖ·¤…·ovÝ ÍìÉL›㕉•ÆŠâ{â«Ë즀‡8S)¢ÅqþžƒÉoú ' €ýLûÚÿ‚E›Ì*Úcá•[hã…‹AUïÒåâ áþEý¶m#$NFñ=õ{S„îùög7üpnS6TÖµ”ïµ$7€>âäxQâ%›Cnô-/¶Õ˜×Þf’À%îÄ™2÷ªöƒ¼®øžøê"—eÓs_OÉÞ¥|œ½z­²íi²'=¶e*“ùÓú-´1Üå›K¡µ§@`Ïæ“Wû µ¥Ä^KÞ-ëShã¥)-ßd[àÊo¥Äù…Xyÿ誯ç`»¥ œ:î}[ì¦ä=;Ųòã|›I:ž@L¹H"ÉÇÉ«nîÛ½%À¦ã¾ž<øË–õ<>=+YLÑ×Ó]íŒã¨d1¥Gðpÿ]É (sÒ@LÜôѸÔ#S4.u ÄK€Þ’>ª±þg]]ß”¿3^d×1`»Ý^°§i‚·×' z‡˜pú²mÁ6çúƃ/ŸÿNHrXJbL¹½½ÀïÍ'λ `)Ù„JÀ/-8 €ƒW ¦–Þý£Í„ñºëúm ÿÝ'}¥}lI‡WW[W#¦ ¦¬z-ßÛLŒç[¥íi›ÉßÓÙ¥1`j9H`qæ ê÷ m ¦È^«ï™1 m-TíÂ9bf)ठ‹ä­*êr6Ãj’J—ÙSiuµ§û™£®F¸8ïÄ€$„qºò2Û yzyঠ¦ˆ)b  …àñéyè ¦Œã(–ás_Ž=Ûuu}Sþ'ÃÃý÷…c À4MbÙéØn·…ÿÏüöÛäíõE”?gLðaííÄqîeÛÞ›Z1SÄÀá)-´X§ûíõV¯˜€“hm ¯šTj(¦@[ÎçqØ„XkQÉ«­º8žŠ)`Óe¡X¶ÿš¼AL¹8È÷ l)-Ùl+¦À|S#pMÚx± ç@2´&]8Ëä9»)Ðz2ªF–Ø ÜIÃl|C…˜wwwC÷Ñ$¤‡'ëžìÖïadAãþÇ9/¯œŠ‹Äû{VÀÃ7ÍDÆüûÕ¥>_5™ñní"½GÎEÆüý•¾0zÁáWæè;ºppËx¸þKKί[ÿ:À€»–ÁÇ[yÀ cÓÃ7ÿ<ÀÀ»—#,{6OÓÉM÷®Aûìþíþõ8|ìúõdx>~=‚Øþ«‡Œ|`ÎÇÖM?pÛ„Ÿ!7‚ •ƒªÐmTý3¬Eº_®TOÓˆ‘Bå@%bh9ãÄN;-I8&*Ý›’­1§¾ +– YRV9…ÉE§bÈ õÞžåï½¾n¼{…V!oüqè5%Dß³’ÈÐo®¥`ýÁºD udçsgCw>7 À-÷­§ ýshEâçÖžÒ*dë/'ò$õh(KADŽpÞ/b(ljÀNÀ <Š¢^F<’'A¦Šë"®Ÿ_DWD2„K#îÑ芕F(¤†KiÚ —FX‹t*¨;ãõ‹Iã!]¢”B§AA\#œ„ª‹ðtfV"}ÐòQ¢á¥ø‡»ÎNq1.+VùòLä›ðã÷‹èº5h(xR7hjÐd.D¸.Ò,Dt]$_äŠ!3)®‹\• \8ºACèÍ¥ƒí«Ü—ɃÆk_¥6M89B1|ü:t ‚à Aì«l ©E”RfÌ $[íæ]±S»hv "èVŒhŠ¢°LD,äå”# »F&Ж l ™Eܢȧ„>·Î -#d Í"A_„*"la¸AƒœAfø´"ˆQ¢uÑÊY®£a9ªGSîÄ›íÖývì¸cƉÂP€£†þ˜e %dá ‘@´]ÐK*P 2‹PiäØÞU›Xµ}•½«¶¯’eÄÛ£éuË ²Œ­]ÌÞU ZÖËÞÕ uŠq•½«™®ìå5½i9à3®Ò+HØ»Š´ ºg%YFؾvŠq„½«í/è](jÓe„í«Ú2’†mOOt½«JšðSZÖ›™wUTçþ APÙ)⟠£EìÆì㎲a@>ì$Eä4ìB4²L0ýÆUW…pƒÆÿìR$z¨×ÑøjÙ€)üL ¯wÕÿ,".дWŽønÄÝx`׈Þ,C®UÞíö4þg‘Áÿ/»Vy7¸"Âù5:WŠWаáy¾Ë™»ˆFµuŠhØ/Â3º4¢”»¦—z4Êó~%<ä5½äZõ.¢áýaת_‘ ùúj~ß_DA ½w-ï6ÙWõñ‚rƒÆüµq•w›åˆM/{WÛ|œä?ë«S#‚ ÷:sZ3NÊN#Q´ ¥±BW‹,ýÝŽ®ó0÷FgK^ÐÛ%Aøæî_‹À €‘‡dˆÀŠy°âHF@Øù0 Ì{¦ ^Ó«o]¤s.`¡[Œ((äAwwñë"¤0¶l¬EZª'BÏ+‚ =w7=š!‚ ‚ð?öîXÅmްÂ-G£Szté=MŸð†Ž3¶J ÍÔÇ8n¹¥þ;ÑEÈF&ý>4H>E¶oˆH2Yd¿È÷ÇOéjðwÜ\d‘—Û]šÜ<RlÒÿEd@dYEd@EY@dYîîr)œmðå°Mõ>¼{›Žüøó” •T Fþß?¿zF‡¾WØ>`ÅÍŽš²È¼±â©s¹^è³’+ìpvYäò˜õÁôH<ÙbตiÏò8Ùh´0šx˜å"Ë"zF¬9w©'ï½ö¦ÖŸf¶-±#ÒCÔO†’\†úô Y¦Ë-i ŒF‹ÿÉIŽò8í“(U7ra”©¸©+È" ‘3 yź½V@òh]ÓR×–HïÑDʫݢú”³ ´?†sé¾c#.iZY4Þ½~ïôŽÂÊúaò¦}œ¡¤…ÅYÖ `ÛþBo,ÜÄRK4Ïm%)lqÅ~‘ã­©(ºÕþµ½g®\þ©Ú  žë…ž—îÛ]+€7ùKj÷þãá×·Üx¹Ý¥ùØÂÍó!Ÿ¿ì÷ûMê`›6÷ `¿4çËë|Å€úmjÛŽÓ`[%›Ô@dYEd@EY@dYEü0°é˜b¨(© ßé¢çúSw÷¹¤Yù—š-þ±o-) APB¶Ã]âÊû¯\‰ wà ( B™êÌÔ†G!ô´ÓÕŸ<Òý^ÆSû òþõ×}r†»¹C`évx-3Œ÷Ï·ß—;µ€S( xlý®s¹î-`çêâÖ ò¯ŽÖ4´¬Ã@0Ì#8Åæ[`€0I † è¿Ø‚ ³H?xÖ¡)aB%ÉõTü„SŽÜGî;ñ½¥ÐŒJh®Œ;Ð@PN±d%¬þ² NÊB±ì…SÓõ&ÒœQÇ#‚×Ë! ½ äº$*)]Àéø È,r ð8Y=›§¯½p›ßšˆ_ê~è|»¹JAœ7>“XhíÚpPÇÖ•¯Ì+ÛÏ:½ï†Í,è±?Y9õñÍs9ù„ü)/#2‹ðù zÀRìÁÖ¤¯©0°„a/rÖµü)„½YpÌÚ –‚ÙÌ(õq.'ŸËåù?¡qذ„,<Ά´@åÛúÈIÕñ^hvƒO²²2Dô'm…î…  ¬¦4gèÊ‹àýOM0l%Ѩ 8[ºöîXGn Ã(g »1ò©ÆÀzÒ¬*EÊtƒéÒMŠ<† —.UÆM&²UÃp±n‚­.CÎ’Kîw°XPu©1`Ì]Š"Ÿ9`3ý—ØÝÜÞ}ú8|}µs¸Þã¼ürWúOUS‡}'¼˜ ïÞÇqpÈŸ¯ ðG0ðN/˜W¨qX«§O €5àÈEØr‘œmu5Îü°›ÔäÊŸ æ‹[½$aö+*~³êҫ掻Syu·^;ˆ\n‹ß¡W¬ïL¾ÀðÞÐq—ù&º+»õÆyèr|3‡‚"»3Ç“a`¨˜ˆèÐHÂp…q*ŦØ0TMDìù(f“¤Ö=+°ÍKDBeþÐ/寀qcd¢D^bï©›ÓÑ|M¹\D¿•i¾ˆÄ·o#álfË© W%ÒðÁ5½Ó–æ?iÏhòÓšø‰# 7ü  ñåjóEŒ‰–éqìøúÝœv“Z¶‚è¡?3TZK©ìŸf }!ŽL¿k¾€Øi(ÀŽ3}ìÓ èƒ?CÉYƒ^èË+§´ÆN…ê¯ìú‰#—ß¾FÈÙ \ yƒ/Ï/¶‡m¬5¡ßõöù7 õk-×þzÆKt÷®1xw×6T̘☙ÇÊ=Hãrµ˜å,öe¶ŸÊÆ HâòP㨰Z臃ë ä‹È·f±ç&öòç £ Vâe7ÚX·v! ëî>}t@.bgõÅ/è®ÃŽ^í¥—ÂŸ«Ýí Ø^ý%‘|ÕoIÓ‘Š7 a{š ÀP=]ÐMzk”¶—Ë×hd½|^¯íã#(mœVNµ€Í´ÜÓîæöò4úë«»FÃË/wî¼{ÿaÇÁ¥Bþ˜ZX¾ üéàÚ€eäí¿ösã8º`…´Á5Àétr¥À‹Í}™eãW³Yì€ÝÍmô†ZûÍêÜϺ›ñVéüÀºÏCñ ›ªþ®¿µzÛ§ö\ãòã秤Mn@ÿ[ƒë¡Ô؉ˆD}Ùètùò޼~óÖY°ßï]û`¨ù`ÅÞìÆnSr×_ Eƒh/+í×kôlÉÇ´þ^±˜z‰´4šä"嶇ÕÉ(‹»ó×Ûõ׎DíªøÕîÃJFûçXëL»MÑ¥ÌìqíÖ ÓˆÐ}"¢g}– 5:øÓ—ïq1Ôâ)³ñT(ü\æ|>/WjM8 5ø¾®®&’mHδ²³i¡z+{×ÅߤÑChšÊfMdL ~ISOidé¨P"â3 ­œ—í hÚáÓ_Sí͵æ‹[òßÙvýš÷©õfLãž}¿¤÷tĨñìa•PPɽhÌ*9J±i­HG|¹ò;½fM~­ÔC­ï"ÿÐŒ3±F'±vD¿æuÄ"æòô~[ ]t¤Ä]Ò‘éw?ïôþÉÈÓ|Ë7òÞxË;ΰO/ÿvŽ„C­ŸÊ¡&›_9¥5þp*ÿiªRékVýÇÞë¶‘ka¦ƒ›§I€DÛ8µÅ–Û ên§-ö1R¸t©Ò®”ÉøÊp²Ð±†š¥5Œˆïƒ¡p8$Ç©ôƒCÒÀ>x9 D¡Þ2—ç÷ Ï]îuLŽ#¹Y­€,ñ‚£ÿr '˜È"˜ñ›Y`³Ùü*YpЪ,6Ñ=•åöîÊ"Àz½.½È"À÷¯ePqî*€,È"² ‹ØG|¾»/×p Aìþ'‹»Ý®\À if`»Ý–¥¼½yj86¾9‹¼ûpÛð‡ôzfÀ¹ÏöÑöôï?~*°Z­Ê%ØÓ‹/ìo_.ôˆ4rå—‰öCE §„þ"‚D"€,‚ R™œH'¹M uøÌw£æÔÝlâ)qkâYãÔF®¿šÉ5ûý>פËд_7N?‹  Dù¨&·9êX!•O©¶¬þnQŸÛÌ]#r8¢&ÊQ“º´bq$j˜úDH½KÎùn½o½e<âDàh£½Š Å@‰òPïh`î«“j›ª}çSoÓ_¼¦‰r;@yþjO/"HÃF½MCßzF¹ŠÝ¿¯žBqd𵫈#Q“'0jmêc }êó8Q™.gýrMÝa9H®‰rÔœ¸›ØGa"_F¹Ö¦>f¾[ï5ÿYóÿõ82£&Ê€,­‹9Eà"›GE6›Í¯’E­Ê"`ÝSY`ï®,¬×ëÒ €,|ÿúX†P?w~Ä¿Ë@›øwQÈ"² ‹ØG|¾»/×p Aìþ'‹»Ý®\À if`»Ý–¥¼½yj86¾9‹¼ûpÛô‡ôÚ³àÜç!÷ÑÈ"€=½ðþã§(ûòpé¢K´¬7€, â»êmðŽ“%Q>|ÆÏ™Ý£åQÇTŽËzãÒÕjµ*åÇóç¡õQJ3€¼_7ÿ˜9 Ó'Ñ& Q~þy.¼x+œÔ;Žü¶ßïË qkµZ¥f­‡˜Eøˆšq²fAâ‹¿}„¹ Gæ…¡Þº' @‰ò8ëE &0ZFX¬#€8òü9àzˆW']œ¿ @| âH,éxÅ1£àóÝ}¹€cb÷ß8YØívåzNH0‹Ûí¶,àíÍSññÍYà݇Ûþ^Ï,8÷ùM°§(?d‘ÅÁûŸþýsf—éqÊy×Çjµjh| €ç‹,¾}y8|ß íC¥Ñjí3dL–äxq”]¦ÃD$’ÃçijÃöÙï÷QŽË\K€Ø¯›O0‹@|Ùç<âòÌ¡ò˜‡ag<®·;ŽÊQ“7ˆØq$jŸÁ¼HN3fSfF–Yo‚~Ñå#P. G¢<ò;HÓù½L½W‡xÑiŽdá÷2€8’‚Èèûh0A‰aÇ5´é?A²L Ä‘Á×®B¬äxqmi4ˆËÿ0æÄ­\“×s"$¦=¢üâR֣ƥ À>äêeCMºlèå^qdúMª©Eð&ç€åvë ‹`Fd´ç¶E6›MÏ,8hµCù‡;ÆA (:c¼7­¥…—²´ð0[¥X“] ¨ïU„ÀÒþl—è–îîj µ£hàz9ÇL¼» h-h-h-h-h-h-h-h@‹h‘Q-h-h-h-h-h-h`~¥E- E- E- E- E- E- E-h-h-h-h-h-h-h-h-߀- E-°?Aƃêfêù²^½>"ªdL -¢ *>%W­Ì÷}<»ÁtÐ"äê]ÿ4€áÆÞÙv·ÑÜhúºIÙ~’ÉdvöÃî9»ÿÿ§í9“™Lb[É.`Õ`¡V‘&iɲdß×S*÷+Ùd>𠀪’ B#òrÓ'N?§<~:µÓË‘ã}C!„.Bä‡Þ&×+\šÚé-ç-B!„.BdDëï—e$BÞ¶U¹ã A!„.B¤þA.þyÇ•¡"xSB¡‹PDÞܯ¸~îH¿>SäxB¡‹i-¸‚ȯS‘—{kÁB]„."×…LäçÎq’U)ýö<3QoB!tŠˆàòÃrîÞ—ŸMÞœƒB¡‹äE!r½Gȱ)B߃\|‰ç΄B]„AAÿ‹§‘<ï‰Ôî- !„ºQ©:âËà¿èt«‚ï#Ã'òŒ×ëï~B¡‹´åbüh‚ƯÓ›êp¹n€C.¬K=ýêÒ=êσB]„ m¦Ô~i¿k.ýn†[¡øÕQ 9‘ÈuÊ#ŠŸ!„ºÑèMN‡7äê+ÒmÉ¡—«‚"òÝgEÎ<¯àm@!„.Â’U—ظxõ¹È?¹xxÛéŸ#‘^” G×Ãñ.§óÆT„B]„"‘Ó“¯ŸÝö‹‡Òô#߸Fr§$Hÿ<Þ“; ¯ !„ºÔþ›àg*?kw."Ϙá½{Ÿ“)¹tÀŒ ø þAmPü'^B!t"û^¾åž[—ÅEzÒ –+Ä!Ñ£öÒ½óYùHÿÃ?Vâ7ƒ#_¯!„ºÉ@ˆ,*,x·u¹AÈÂ#ž&}Ò+Çé²Z«]ûÕrÎòÍøøJìfðAÑȇàu!„B!‚ήñxlŸ;“oÑ[Êòõò´"ˆÑNg‡äTÄVðq°µ@õx)¬†Éàµ!„B¡…hôWÌEv.)’>áyV$ÿMòˆäíÝ+ ÄÑß.?GÄ÷Q}%¶VˆÌ ò6'‚'„BaŽxÉÕw¥?é.³".Ý¥Š†vîÒÛÎ^AàlP[ FqÕ0=÷ЉãU!„Báx*GkK—8páø–C\¤ó¯×÷Ö-_”x¾g^ð@óø(6ˆ …¨bŒèyu½'ïÏ o¯!„º]ä«ãöñ‡Ë‘ä‹ô)—úÖZý yHÛmÇûb‡*`D™-D\á"PÕ¢êƒ<™nÕ9õYӃ̷æøáB¡‹D£?:z¤9‚øb×£ÉéÁ*ÚÍ*Òunàš^‚•㉘ÇO$kÄFÜÂitPƒBµ/l=_”:¿›|rë@!„.B$ÚI¾Øk»žb ý>´m.,Yÿ‘Ž’—H†DN$ˆT1Âõ  0ƒê «"M+ Çýdw&Cq¸cr¼„Bè" ŠdŽÆ÷ýéÉUÓBú‰ÝO¿=t™ŽéÂ))µîËꇪ„‚”6Üín£è¨X)DÑS?Õ¢O¦Én 6ÌQ¢¹ÁBG~<„Bè"Dº‰Vålª=¾ð ](H=+y½.ó5yÕr0 F`E©îñýSÇYÕ•bT¨¢Cúíü\†»bw;l Åàa!æpTAðã „B! hE:äX–û«2#Ópd™hIÍPR¥…`Á ¾ò2ˆps`q¥6 «Pñ|¤îÙý°]&û:aS°+˜¼†@Ì¢wµ‡`À‚B]„h“‘Kɸ/£&’¯´¬‘¶+Ëz̓µ[šƒÀëÔ¨#La.G©Yoº·ƒœY„f‘ir»›pa2ØADˆ  ÆE~<„Bè"DcÃg<ÿ=rÐ_«hd,D’㵯—=q‘…D¬Ä£¤(PÌ ²QÝ÷µ4d­@¾½¦ž£±ÛÙ]Áö¡¦Rs1fpDLAÌñc!„BavæÄŒï]pyVð·èrì®<Ë躴ãX‰ n¬¸…(@ÚäFc{P ª7ŠQ ï¹éÊq7Ùý„møG…Üçƒ}CA¯!„ºç7Ë]Ü»q¶ô'·«{UŒÌ,D$7ãOjŸÖ°VRfÅ (VU¦úJó¥A0¨®ë¢ýR{‰d]ª}ÞbS0µtL 1²(d¡Xöú“¿B¡‹°dõé¨ArTDÚ¯¼+K4w±‹Ð‰•Ú€2ÀK±‚ñ´õƒb%¸⑟ˆG’ó¼Âì;l¦PÒ& ©"R?#yE!„B!© )"§èEDûìŒ@kœ£nh†HúÐı’2[ˆc*¶HhÚ쯨/5†ˆ¬Uo@Ÿ¼µäîaù˜bŸw¸Ýa2LŽRPlnpDù9éB!t’A‘†rRDÔOO)"Y]YŒ¨Q`DÅT°+VÚÅšBE‹ ˆpˆâfPNLm")³…lq;a×!Åju*÷´ó7¢ „Bè",Y}¾ð^DZ ä´¯HndF&í멬|¶ñ°¦qª^Ç0ìE$ÚÍ ëADO½¡#(žD,¤…¤…8àÖ•ƒøOµB!t’I‘ÊB8Ì¡KIRG ѺœÏÓŒÌ( ïܦÒn“¼Xš—Hô*s‹pˆ¬œ·û¥!ÅaÇ,ÄxSB!„.Â’UE·p\C‡ÜÑ“¶ÑëÍŒ4ÅÑË(Ø™íHíR_ò8/“""ƒöïÕµeÂ×ÉÂB°0ei*<Ú› „B¡‹v€JbXn»ãâ©#Ë Hëƒø 6¢Zˆ·àGÆNº‘h¥†CD‘,gWs×Íl!Û }y2_ˆ¿á@!„ºQiÎÐã§çñ圪 ‰°–’"™ ‚# #ED$n9ˆˆb­²Eùžmq|ÝÙíÛ}R¦Y<úÀüm*!„ºQh;Ó•~xüÕ®ýÓm ‚Ó"²†­€R2ÏÛ$½Šº"ÒÆË¨ŒƒäõXllwø²³ûREÄln¥ÅB À[·B!tŠˆ¢áâ9‹™p8üèTï"¹Û=¾FØŸJ†O÷bqPj,$\D±VÜ †¯nø¼µÛ ›‡VPÊÒBòi£%@uöJB¡‹ ÅDÜø2lñIâ¬ç:v= °0ô»*ý£¾Ž"úi"¢èqÜOøÒò2»©YˆuãæñD„B]„¨B}¢Þ%dz¤žé~Åun>„Ћ#º(n}Œ¶ƒÒÆË¨B÷"2œ‘©øíοì×÷/uU·¬éx"B!„.2PDF`€ 1íæ9s$øAH4FuPša¸À"Çî]D¤Öˆ¤ˆtáÿºó/»:qˆ•\Óî{xÍ¹Þ !„ÐE>`‹ ñÚdfxÌbO-.D.*Ó„"GïÂqY ¨,²6y‹C%ä´ª•ÚÑV"¢‚%Vð5Däë6&Ù‹ˆËÅør·ñáӀЄ5O’“e/"øÓßq„Bè"ë踧ˆ69¾µÎ\µU«º·‘/®|!1UR|™ËY&hDžN ¯mïÙ™qˆ+lwþuò/[Ì"»©ÖU[Õ‰ˆ ZŽm·ŸÃ-Ÿ €áÌñ<!„0.¢P«é€ `ø1\…ÕÊ×eT£GÞ Ã³dÔ¾¶!ìD5²3Ñ ²ÈËììóŸ7¸Û`Xé¸È DT*©Yv óo~bo~¡Žëp|„Bè"ÿòo¸ÿŒ/ ¡#Eä Øq#…8Ì…bIŠÈ¢XÕ[“hi1’Akvf5³¯[üsƒÛ .ãê* élãò9ÝSV0¹«r…pø3”„B]DŸþë ¾~Áíý…ËGa|è_±øS…Ɔ¥Ž$HzI ˜%«ŠE™È"¢ŠvUñ"_¶øÇ=îM1Ž6 ìœ*ô¸/΀­aphœ{€!„ºˆoá†þ寸¹Ç?¿å#¿‰Š,Ïvñìa8ƒY Š8L Çf…_zI‘ìCDö½`¥Õ›äËÿy‡¢£ÝŒyÿ…+äô8Ü"0àÞ0¹Z/üJB!„.¢ ›à°ÂÍüû ¾~Å?î~ÑòCög ×Ñë›§H©ÿ¶¦’ãxÇè[@¥à뻇«q@NùGäøi˜ÛÆ!†µ\üð‘B¡‹ à¶… t…?þŒðåv®H¸ûUÊGTÃ!uDð ÝʽÒ\¤ÎÍZ]DpÀCD¶øÛV§õÊ%ïv_„\Ü/0÷ŒÊǽ†€_¦þ-ÓS\ !„ÆE0 6Áîá#t…¿ü >íðß·øÇÛ_."¢?XG€ž(ɨI=˜’DCô3sÜîfÙ­ÖÞ9àž¯mg£"qØ3°u˜á yËë¡!„BÁ9ŒÝ¬ L˜&è€ñÿþüiƒÿz0’ ¿†Ëd­Î£Ç›”HíƒÊ«-."íâ»-þ¶«"â~<cˆ †ìæöì ŒÀ÷Ÿa„Bè"¢ðèQÚT¢RPvs“ÜÜàÝà/÷øÛn§w_µjx%,©’æÑˆËÄ«|ˆ×ˆˆJ=¹æˆÈv\½ˆÀ:?° ÇÙnŸ:Ö/áþ]ªB!„.Í)AQ DZ!ÁnQF k|ú€ÿsƒÛ þã÷Þ/úZ:b¹^Er#çÒ¾êÐÚ&€wÀ þß½nÆ$ã) ñ^Aàß¶1¯ÆtàÏKʸã{!„Bi±ØKD¡P ¦[L«j$ÿ÷Ÿïñ÷ûÎH˜é0ƒI‹6E×Há‹ ÀkíŽJ–’üÇ=vÃè€;•")"¹qÑŠ¼%DMD";“BƒÿÑ!B!t‰~ bð¡Zˆ ùCÙ`³Ã°Âpƒùˆ?}À× þëÆHô•35:v"rè P¨A†Åh^Àñu­¬l1-Ig!±Ý[HîK^†£xæ‘ø³çq|„Bè"ÆžÁru¤ÄU¦;L;ìn0®fùã_·óX›ÛéÝLqf¯œ©Ù×±Ý÷Ýò2nõu/"­ŠÕÿ9é$êÝx™‘bžoÖçeòŽ ÝÍ‹ÝW”B!t‘Ô_–Ò›Ša·Ãd˜¶Ð5VFrƒ?Ö¸ÛÎY›¯[ÆENdj£bÁb…¼ìE¢Ûb£#‚f 9^Æbß/´ qO2@ƒt/áY<òJ B!„.Ò눶,1`„¶ÉHJÁv‡MÁf‹õ«nð¿×ØLó:)Ÿïa,9U8Ò¾o•"×ßùÂrP‰¾EH<ï†y7Ï|€âØå…‡û±ªšs…høB!t‘¾œAå#¨Ã: @Fˆ@& †{Ã]ÁÝ€õ 7«YJþçŸñ×ø¼™dk¿Ñ šó.‚EáˆÒ6>vs #Ùa=âf5÷ýùˆ¯ÛÙHnwÔ‘™É0x èѯ_Ò¾ššÖ}GÅZ¿ÈθŽa­RUÑh·©c¸0ÈñŠB!„9š,ÐÔDûò‘œªUµ¹m ·÷;|Yµ¸u;ás”’Lö{–Œ$¥@GT"„B¦ip7aÒ¡ŠHíQÄŸXêL%ó2è±ÛV/§ pøò} ®ƒB]$‘^GN”xK(X!ˆC “áŸÆ7‘¸Y ³”ü?ã_ n7ø²ÁÝô{H242jªEâõ˜þ9IÑ…‚xEÈ“Áº v>79*"ÀxüÝ“ë!i!íZ!„ÐEzÉ"Vœ˜}D'Ð)ç/`šf#YM¸#F2`ðçøÓGl'|ÝàvózÕ$è›Ñ‘RÂE©­ÃQDÔaÒ oñä”8¶óðÄ<"¢Ž±»ëû!½…8`†‚ï…BëEúò‘Y>b¡ÔN°.Ð}I„cg7»‚qW£#ë0’qÄ_WøË'lvsâæ.r7¿Otd2¬=ÔHí3Úd@Aš„{ó‘z]ÃŽ”©ZSI‡÷&ñ]"â§æ–oâ­™Áp)„Bè"×éˆ/ÊGÜãL_# LP…ìjÖF¼^¾&›ÛfÂ0`ýÐÆycT|Xãã ŠÍRrû£¥D{33±žÔxôSAN´* ˆ‡ëÁ½¿!­dg(œÌ¿dvÆŸ£ …‚Tì¥,„BÇôúeƒk,ŽeùH0B d™æ ƒc æ~ÌavÓl«ãMçþã >Ý`2lCJ6;l ^3¨ö&$«Ò;ך› `*­¢çýb1ýô!©)Ž}ne¸"Óºã阼ª<ÃB!„ÐE®ÐÏò‘¬f|È5vxmL˜84Îî€ *»ýœ­‚!td¥ÕK†&%ű e¹‹š3¼o@Gj\Ár°½XckpÒ&ú5x=bò§Ñ$Ï>qÇêòqNA<\rZž2Äç@!„.r½Ž­šÕ³>AÛ-L€4š ó5Ö^£8Ê>L¢ô©”|Xáãz®)™ 6î·s?M°ç†F~¾Ž¨Bi€QØ»Â0 Œ(ÛÅ0›ˆ›"R]»röY3"2œ[_×Ñë†é¾TR†B]äù:’å#9¤ÔKl€LUSÄ¡¨Ž²]NhÕ$K)iéb7ásÇ4…—ìæ‹·ì:2cø) UÈY·‰Bí[[V“x³¦ ÑZ^æBN<:ºtÌ«X!„ºÈõ:âºjÖ P4¤$ÞG PÏ*Ñ-*rNJ¢ÊuîU0®°ZãO^RÂH 6;Lenv±Ž y5ÿÆÿXбÍrf !h›é]ßÊTÍq!îR%¦ãl:æõKC!„ÐE’k¢#M4ÄòB‰·*miuì¼ߥ äÅ-¤d;ahR2F¯MJD0Žsû÷˜UÙíÛ„Éà;c$Å{‘,ŒV…ǹXÈrü®?­ÐnÜóTô¹QÜw[‚‹pHfgΣc’ŸWB!„."€ŸÔ‘ÄŸÎÍêÒH½XRæ^Kh¿1¾&é_xJ)†Ž Zs7ƒ@5¼$Új…õ*sf(qo G)Žbõ`ï(öœ‰ä÷Ïm¢…Jíx:¿j?S™+¸8üi^Æ3r¹ˆ82(‚+Ó1¯Ÿ”!„B¹NP¤AªÈÁ5 hÆ< À”ù qdíÂãMJR¢ŠA2^R% €mwIU„•<]†ÅÅCG}X‹·0‰9Ž#i*M€b[j;wp_~I96;ˆkÝsÃZ ænùô(ŽÉ-.QHlÈE""ß\Ï[ Äߦ…B¡‹àgu$zK·_Ë!¼ç5ó5b©)›ëôõ`V‡(šˆ(T2 !ÒªU^R»ê£‚p‡û¤~j9=ôÕ»‹û R˜Ú(é%+uPtÙ«U133îÅÍ–s޼FZK‹‚$o¯4„B]ä¼£ä¶>ñe5«ÁÇ5‰ˆGkLç$ýÿi‡H/QYlÈ!†ÑRE™" Ò ~B½¼þõ†‘Gü„‘ô9.qxÝX¦‡ (P V€—RZ0'¨÷šÓ’A‘ÅÓ71œÄ<Þ$„Bè"=}5«#“5j˜$Åb/"-_3xÝÅ é·qÆK²€T$6IœÌª ŠQÒYO Êé¹9ü›³¥»wjåÑç)øááL³6 «<€±ôôéòÛïÎ8ÆÅ‘.óv’2„Bè"~ª|ôŒœ×.¹x @§b@84ËG.Ë×|ÛKj^åq¼>† iŠÿDjvFüxÀqy6½Ä GÍ%û寵ŸÄý’¼Ù‰'Ê’UëÒ1o:)C!„qÿžLM"ý ¦9U<ò¦‘NDª3Hˆ¤:ÄY‡îø(¸w?øÛ‘Zao éå·¥!„B‘ÜNä9:ÒI‰¾ˆŽÀj`À >%äC¢·ó³àHÐî«Ö]~ÉÞ¾´¬u‹¯I:¥ˆ+ݱ õí–†Ba\Äù‡¿„” 7ˆÃ PˆÅY]ÔV#ÉjÖ¸ï}æk¤?"a󥎴ØÉ„š¦Éòƒ¹Ï=:Þwi!„ºˆÒ…p™”ø5…#ž»"my,u$_3¯‰Sçó5þöDD–»1j÷x4*Ç G³–¦©+âyôÝ'UÀ2(ònKC!„0G“½vòqÞ<®×,tÄ€â@©^RˆbŒm2´]»oó~ÊG•LÊ’^Gr*X˜‡H3 †oã} þWù'„ÂyW°¶!?dˆMö’Ñ‘,êTh+CQ`Ås¾³òEÁì\Yk˜ºÃƒCÃÌ,Ö¹WàyTÞmR†Bs43º°„Ü^ÈÊ‹.§g±ç™¬ñQ¨Ã :ÔÁ5@[Ú7ËG0¼ƒ|MŠˆ~CD¤váØ9àP„¥ >`>b§¾ÎèT`ïÚB!„ÐEÜ ÒIïÃ$ 仌¤×À㈠ðÒÆú0b(õz`97+Þ®Žd½­*T '.@Äk¶8žÔÍ0œšñ=o˜Þ­…B¡‹ ÀHŸ£A†IfôüÂõ‰_QR!~BG @õ‡´õl·87Ü÷§êHŠÈQkÍJÝ^DnænË3Ò¤Ìp!„ºˆÄ!’Fò¸–2ISÉþûÖÒëËGRG²ˆ$uDQJõ’ À¹á¾¯_Íš_¶–§_˜ùÜpZ¡r4 °löäRɯÓ&Ãû†B]d‚9×4J†CúôÍE8’¾pDò@w䉎´ )zË7S³Å  }l(w8Ú"3§±Ì•!>½MP@´}á–^cxïB¡‹”7ˆBÑ ¾í7ýZ_$tŽã—†LDRG™¬B3  Drõ•·2ûHý›‹hFž,$ú³x}h|PL†"ósDçá‘ïB!t‘i oFb€ftÄ«‘œ“<ÿw¾O¨:Ò%k$F(±ç¨œÐüè|šo§Z§qÏtÌ·d)L’/}´QÍ0¸xœj˜á€B]d·CQ T¡ˆC«üËÜ\› ¯o}¾”t…#$“5þXGJþJÚ·8¦zÊ+çk ½ãˆÕ€AáŽRÚþ‚³zÚ—Fø‡`2/HðËE!„ÐE6†Ñ`M#Hí¡ÕN}&éK\Ÿüƒ)±‹ö¦Ãr©9¯ó’ŽžO4Ó+èˆÁZØf=bµÂ(˜ v>eáê%ø‰•kT Š"P@aŵ^ç03ü"B¡‹0ØF/!Œ€t‰›Ø:)ñËÔÄ/†D=4C2ÛÈ>uDã>ü@ÉÜÈzÄÍ Vì î6°ÃjÃò¬%ôTææRg?[)V‚]÷ ¿„Bè"w±¿ dŒ$ZÛ§‰›®¾µ«{½â7ßO…F2Sã¡D)Ñåí‘0*‡ 8¿´ïŒ·‚¬±^c˜c³Áf³jkù…\óU0Å A-=9 @1‡á×Bã"[`¹y#ÙëˆW#‡îq5ž†I &"Ù#½ä8~ÍÄh©Aðx;ÕºÀ£ajå&~n¬on_œ‹G|\Íq™ðuƒ]X"|g-Æm¥³%Gêˆy¸È{†B{˜€ì€U´XÔ0´Ut˜·E!C < “ˆtRrí¨Žãdh¤*ÕV4ª9òd0”–¬T&À®Ö‘ „ŒŠO7øxƒõÇv‡»-¶[X*ND Hä‚7ʙ܎Ð>Í=š¡â¿RP„B]¤7kF2 ¬5Œá%б “H\‡Ú÷R’:’,wýÒR’¬Ÿ D‡HØ2Y“S\¾´oM¸ÜŒøó§ÙBTaŽ©`³-d· MÑEÙ®¶+¸¾´%eFÁ¨,ðöš‡‹ürB¡‹$X‹‘Œ±1ÄÆ¸‘LP@ÂH…´úV †I €ä(¯»—Žn…ŸäpÅ”Hð¶lÞPß1“5žÉšó©“UŒ‹ùôan¢(†Ý„ûî¢.¤Mú‘Ö‰ÈóàË^þ SØêRÝú47Ã/ !„ºHŸµÙëVM2¢fmt‹AQºúÖ¬&ÉdJôÑÜcgÔÄ/e“«Øˆ /±C‰³$k ƒb\cXÁ¢4õ6,dÓ22ÐÔˆ#‘‹¦ÂÏËvŽÉ³îÕô·ï 5ƒ~!„ÐEo9Ž -@2í½Ä¢Ÿ €)t€Ò¤$< I‰ )-Ï¢8Uq©xW;â±ÝJ>b ±š¯QÏO1´:˜O>ޏQ¬‡š(ÑÕ,".ÕB¾Üãn›± +U­‘ó¡œ, ÙZZÚ)Ó<’44üžó›B¡‹t£9 ÕH²”DaË0‰®¡ZBHI‘¤F4N§lüLÈ$s÷fB¨^b±-2MþmÄͪ*Hñ:µüÍ D±-øºÁç;Üïài!IÖé6‘v¼§‡XXÈt°”šC׆+§£`ç(P‹Gýí „B9&‰¦)%·PEQ )i%®!9X2žÉ”Í¥5­îÇfA{5Ù¬ ¿M Q].œ Ëpˆvªá8É"bíÅOÓÙH¶ŽéŸôB]ÄPÑç†IV€¶~hõ­ ÚFKÍMˆ5/AxIÖ=]º¬ñ””¶í¹ZͰ†Ža? S)"]c\ÁŸïñ__ðu CKëôËJU•Lúœ4§vÁÔÆë"_ü$š=¤zž†Þaú…M„B]$+ìŒUJÚÜ$ÑŠAÜ DÃP‡Ûˆe°Ä[q‰Kª†ôo·È€a€Ž9Í ¬‰¢Y\³† ¾Þã¿¿àóSWÒë…FÍ+{$cuckئ…\HÖˆ˜hù1üâBaŽÆPÑgÉLÉúÖ–²iM÷RR0 ÍEzXÖ‘Ìä ù^›KŸ^ö­Þ }M¾ àŠû ¾|Á× &`•Ÿý8ÍjÚsæñ|ŠFßzÈ„]e!õz«­€Æ¯¡¼„B8ïêËI†I†”hKß  ˆÏVÇç¯>öGU“QhFAúÜMèˆEȰÛâö îï1µš ËžV}zI?eY4ý­cc°ï ‡h}‡>þÔþš!„Ö®Ús³6)%S “ Àº½ý¸?bqÊ¡ÖjB(ÍKºÒѸfŒ6À ¶_°Û½Öa¸çY6ÞÁ©"2 KX4ߺ^àÞæruuÈYÜa„BçyÙIFJJó€¡=ÓàXÉ~º¹ -“þáÜxž;E)˜¾`ÚÂB.D`žÄŸLŒV×ú…guPÔm´ãMÚöÖpgUªT_HA›‹(ƒ"„Bè"gÊZ_FJ ˜€"øÓ€?Vø´Âj€j*Ogó…–¸×K̰»EÙÁ­3 𔕊y¿j.F ¬ÕØŠÔÔL¯ ðu”GžåIªž@êÇ!„Bè"?ÊH¬ ®¹ñG´õ€A!© ¨È¢$·[o±ÝÜàpAÅc7»^ÜNVDª|8 ÀТ#Ã"ŠSÃ'w67ô%¤'_Ù¢B!t‘4‹?U(ðqÀ§G¬ŒR­2{’x·×¦r/†©`7¡ì`Hq™±.ã)"ÕŒX·ÙWµfRÒB²—¥ŠxÝÁ¶ Ø”÷zÇSJÉr!û>wg¤ÅH6ŽÏ[³½|ôžA>%!„B¹2à@Ó?ª‚(VÖû¦ZìÁ.92© mÃdž¥v› Û7 íÉ¢$Ï ­:dT ¨Oe­àÖñu¶/Ú5üò]Œ&B!„.òŒ0IUE³1³0qæÍ…ˆ$žŸävÂÎ`^?F9Tžf0#šTMQ,FäjAIi“°í¦qQ­Ù§bVì¼ü ±#„Bè"׳T•Ʈ̭âÑ $ç<…øBCÜ!Èñ2ì ÛR ÀTÕ(¨XÛÝf6ކ?-X¤ E…n(?76a „Bè"W*Hôƒbjí…‡”ZrÏ^Ý> Å0™Y!ÙfÊÕ¿àY×Ò–†Ä? w¸ÿÔ²QÜð[C!„.¢¨Øyª †aîEENEõãæœ,5OÃ,ŒÀ`§ŸÐðˆØ ~>ŽßB!t;c*:÷D'Ò÷ï'gïéü#q˜£Æ%ÚP<íç6$EUB ?åB!t‘ËDPð‹ô#-$I ñ¹ŸYŽ#y¾ŽäkZ/!$x“ž7 !„BÑöŸŠª &bNâGø©Ó5âÏXÈ)•x~PDr~Fi!„BÆ«*šãbáÑNâývbÝä©fŽâ[ž~9I4ó3€Û›³Ž !„BIQˆÆÁÄ¿å†oâËŒŒÍíŠüˆE¯Ï‰ö³KC!„2žR´D =`½8®Æq‡/+E ?ƒ(¤Z‰y8Þ„B]DÇ:YˆtÎqò€à$Ž®@õ¼…¼xtDâB´dáÍÁ !„ºV H–pàRü’CîÑÃÌd:^ÞH$´qƒá­B!„ÐE /=1W*æÏµë Z%Z`~E!„Îïý~t9kYZÈ+¢¿¨…B!t?]Øà¾(q ѣ៛á}@!„ÐEìû×FqøòJ ñW‰…h¿ŸïûÎ!„Bñsç|±×YÈ+Šˆ Ø;MÊB!t¿FF¼Û6‡ù«fFôñ†Äà×€Ba\ÄÏéc!?ÃBÉ”÷ !„B¹>Ògd^?)ãï7B!„ñbùé™>‚ßÇB!„Ö®öýk¢-(øu!„Bè"à YHnàÑ¿!„2¾ÙŒLŸ”™±hïB!„üvëР¨`9CX¢``Ùªý7Å;.nò  +×E†Ý8$öýKF"èóޏMm%yǦkÿÙ»cݨa8 à'Ô· 6X³12ð ŒÝ¢Û:vèc00²Ý Hð>DŠôWÕïHt*:ÙÖ離òv»|µzÿpÝã—EY@dYEd@EY@dYEn² àåë·‡QLÓôp÷¸æÓçÛÃ@jtCÎÝ(£3ºË³ÀŸ_?ýûòõÛÙúÓé4ÆÇýØs7ÔèŒ.É"€°ÕýÇýxp^@d°m„,ðêͻà ¿6âEÔÇ“ ®Ooüì* Xüþù½¯ž¯}®—»ý–}˜ç9ãEžóýøá}Õ»üZW]¼Ü'‹ã&æíÜO¦ñ'ŒrudI!US…ª?õÒYhg!a¿åÚ8kZ¸—Tgžô!»Z ª\m2“E}*LTžXÖ?–À1Ïs5¨úµ\û2Ù¬ñ ’Ó—¡9Ûô»²’ÏQžE)$? s¥dýÞÅ/µ™<–¯ÅZH‘TÚÚ£©x‘ë%k:ÉÙ¬ÊmŠà¸s5挷;v;Ÿ£<‹¶Î.ô²º~öæ´Ñf[.¨4¸G“òÔÈñx\Ë]ææA«ÆUZ…÷hrëáò¥…íÐæx¯¶™Õìá’%…,«#µXÒ…¼öž9ã”ñŸé¨­Šåë?GœdOòWÏÝÞVËÚÙéýàÆErF<Í;þº@n=äy‘¼ITM•\É®æx«·±PÔÖÆSî¹dÍú=kj¦H²Yk“•‰ù¢)ŽïÉFç£~ ,lµÉš,_Û~—6šmºÙuŽ'Yd=>R‡Hªœõ٬ͫñ9Ó—/»xß]P?|œlmù–L­sD¼è7Z'ï5YptŽñ“‡7Ú~ãñÏ®È"€=àE·êišÌÝ9Fgt²àV¹3:YàáþÎèzdtFçì*€,È"² ‹È"€, ‹²€,È"€¿Óû—8&€a4ëq>½ º9€oŽi`€MÚü«"¨àiëwê@)Ê ä\kIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/resources/images/jpf-demo-dbbrowser-tool.png0000644000175000017500000005020610536106572026615 0ustar gregoagregoa‰PNG  IHDRi¬±bÀzýPLTEŒŠ„‚„DÂŒtŒ‚ä$B„þBüDF$””DbœŒò¦ô´d†dÔr”DÂDd‚´„¦„Tr¤€¢Ìœîô¤¢\||Æì¤¢¤²ÜlŽÄ4RŒÌÚ\4Ä$Þ$ÜÞ <’” füœÂìôŠtôrt6ttf”|zD|–\„’ôlò´DtšÄþ”ìî¤þD\z¬´²´´ºì„üJÄÂÄLj¤¤ú×ÚÜdޤŒ¶ŒˆªÔäæä|¢tÞÜ–ºä.tdbdL¬,J„$þäÜútvt¼¾ ”Ò¤Tr¬”’”rôÌÎü$>|l–l”lœšÌ4îtä²dîä2ŒŠŒ4´X¤ŽÜþVüœÊœL¦¬Lf¤¤ê¾ôü*lŽl´r´lм\Z\„¢Ô¬ª¬”¶ät–Ä4R”þ,*t¤Êì6|df¤{šÌö´¼º¼B^œüf|z ü¢dâŒüľD|ÚœüªœrÄ&$DÂlüþdDº¤œž ôžtìîtvÜÜŽôìîìljll޼ôüŒ‚œTþ$zü´îœšœD²´üVÄr¤¤T<¼þ<øú¼þ4.$DœdÂDþTîôŒ®Œnô”¾”}ª|tžtþÎäæä–ä´òþ¼„nlL^d^üd”dfœ¤r¼”œŒ®Üìêì,JŒ|z|Fü¦üdŠld†¼dv¤\}´´ö|¦|dú¬L¶”q–tŒt þ4þ þL4þîìÔÒÔ¤Êôü,F„LJ$Hfœ”¶Üs’Ä*l¤ÆìPn¤ÜÞÜœ¾ä2tWv¬;V”:||žÌüþœÆœ2NŒ„†„dŠdd†´„ª„¤¦¤´¶´<^”dŠœd’¤dfd”–”vôŒŽŒ\^\„¦Ô¬®¬¼¾¼üjœžœªüÌÎÌÔÒÌÄÆÄÌÊÌüúüüþüôòôDBD„‚|8Ì0˜MDIDATx^ì’án„0 ƒyÿ¶à¦)Í"Š(Õ6Ý~ÌI+W—~͵, ¡ Ó£Ñm)nJ s¦¶Ü¤Æ€Ž Å°‹ñéu/7ÿ Å ªàýµ`ûU­ÛÑ^ì› { -”ëãK\ØeN¿?Û^ž•ŽŠYÝ+Ú¿òñZ¸’˜A{Ù1|-]I£G„¡©MYŸ=‘V>ÔžÆ<"ùÀpË“¡s LÒQY‚òÒéSM"Û•~&OtôŠå“¬I‚¬Œ©µØ§ÉÁ:Ý&2!O‹€§½Sa³ð4{ÿ™Ïžï°¥?ßÓóÏç{.¢Ž©ç.­±ÖŠ?|ŸØ £Ið°„>YƒÂ0€hæiNlö¥íÖnœµWÓ¿¡€¨:+ÄtûRèLÓ¤á|&ëyšÂÓD(¶ýmZîÓ _s©ÍΞL¾Üà4?{ÊÐHG9Zγx¶‚Mâ¢ÎHìÕêÉ›{:2 =šŸd4N BG–ÎDS”Ô­C,öi|Žu³3‰´ »äi—ž6ý!O“Ô\‹õû´»··‡ûôøðóáùåûS—HÊWOÍ(ZxÚÙÚj‚zÚ§ñ½4¥†eOã¹xÊ̓ ÁïoÒ—LíËİK›n¨Idþ–Jcð‹¯Õs+’ÒԪœËžv™ûJ_>)7JȆÆ!M2S È¼wd@‘‘²5 X¤6h`뮯@¤¿IÓòÉÊ@tk%<×Ù5vj,êö¦â°iÕÙ€ÌgO»öiï˜+O›äiÒbÞ§M== R{ú~ÁK×'ó´êjæ¦ô4lÅ0J240zk[?YáiЃZË>ÈżµÃ-ÖM9Û6»Ô2qöØj…Ô¶Œ_žž&¥-{rïÿ×K¡4ªÈ>}‡‘)¯žÀò4‡«èmš|_ÆŠ)›¢°΃÷êaëƒìŒ²Cg£ŠôxÆÈÈJÓ¦¼Îj¨}FìÏLgÖÇq¶OÓ´Ò,uBgÒ™–PV@§“X-4+®¤˜$!_pŠ+O£@N¨M‚¨5 qøD¢e@UD¬ŸÚ©ÕgO¦Ñ–&Y@ S_½O£ÇÉõò ÛWgO»õü‘àk?¾=½þ;ÉÓtÇ·Ÿ‡D ¨µ ÒnÙ§¸ŠÊh“®£Ðf—ëH``‘AºåûN<ùÚsoìwR @丩K[3\lÏôX>ÃÓ6°à)+ÓUA6µh$ªKžö[Ïúåm¼HSýv4$kmÓüöSc†²8w‚kO#hgò5iLÏ¿`;Lý…#=-‡< ¿à(Ôû4ݨÛÿøëåáåõ‡6hˆ&U*KHÝ­'’PÅ-I¦–á4€pðÈHVF„Æ-²%”zg;€ØU‹òf}‰ÑÒêÌÙ­-cÇåçjúXuSpdÖgOV;g‹f©Ø¡±‘…"ôÆ6,-ãä„`[îÓ1»È–ïnóúé—Ÿ G„åÅçßp $Ñ÷éÏ_}ŽÔó}~!²¼#¸%À¿æH{Î9S­!@ÙÔ:Pf™”•§ÂÓÏŒHšXîV›ÚŽ›W‡ì#Ü ‡Itn!Y¬û÷춨·–äaÚ-×ê†UOå=¾J»í•¼h ™b ãÇá‰&ñ >)’±ÁÏø³ 3ý/¨%ÎÀEMµ—3è7ã+ÈŸG×H¥_Î`ü\ìÌ_3*¶©5NeM#Ô·=î šër¥_Þ ¼ýþ[ØÔÀØæà•¢æ œunaMc4ðä ªÜ¾‘8½ua “§ýr yÖ1+1!Î8p£0 zÄ+)$[ìFU¨»çW9§I*¹‡p—b‘GDÒ »òz}r‚Ø7YÒ•5mK$0vI\ÀãJ£"Ö"µ…Rsyœ~:ÑÐ…°ÚïÙ!¢Ë”±†¬ «˧ÊJùÁÀ"@¬ >¸Ävd iÜŸÓ˜ýQsu!r%U8ë»tp–ì<Œ%$†ŒÜ Øx dÙì"×1‚«!¸AæÉql0ÞUY£Ɖw£ãŠ®øà_î5+È&DÁõ§ñuÞ„yH³öušvË›êd<çÖéúªª»ÉŸ=«êÖ©ªSEæ~sÎW§ª{‚?À•¬¨JðMˆP*éŠ@«© KW§i×p­»cJ¦ukb´›ŽgeeQT(Ÿ(Ër)j߇§èîܼÚúpÒ¦œÐÃY’D ;€y¨Sö† d)B”Sä´`v§òS¨*¡[Ù4å‹ð8Žucj¢ä*èIL°VZ޵ÚÇèÜ 4ã]f4׳²^Ù+)ôôÊ"êÕõ}hiõÐÐò­v«IËRS&9¿¯k'oÌñpßÉ6TX癤'ºÓä´ðèéݧ ªy¶7¶·Óm±5¢5Ò„|d]N ^/„“ºkÐ0UHeÊŽÌð€Ñ(Çuœ¥ýNÝ«ã~§Jû×Ûeíý“»®¼ÖÖz«ÿØ?>ôÚkï¿zõêç_~yïÞ½ßé¥À\l1ÚF H±¿ëÐíM•ÓBVCœÆ ïúCÃi©TÅý¸E9Vò+Ïp˧qø¥‹€Kafµ C„º+7Ÿ?ë M³Gû&5–h÷ì—e{ W¡÷šWºõðE¾•´ú/<úï+¿|óñãýíè7Þ±öø—5Yš}uŸì1'F‘*Dmt×Ak›.§…¬V[N;RÛxŠr²ÝÑZÇq|-å¤õÁˆYÁà]Ò±“ßÈ:¸œô<ò | 9Ë"››’ö²{6 »‰ónÉiö-˜Ó^8üè•·~ê§Çúöѵµ§/ýf@–F*4) ËC!=¡õ(Ò#»isÚ„³'ƒ7Ì×uÿZóQ®RÍw´ÞÌ]’RNq¹®B¯ªü-‹Æ¹Â[™¨CiT²ækUŸrWiÕeYO0¬;ðÖ;7Ï[ÌëÖ‚En8íðáÃÏ\ùçñ¯]{üҥݟeNÃ^àn€Ö Ìà@ ESÅT™Ø§Îiî|7NëÖˆ½ãÖ#ëÿê¨N<›”´RËÑTŒðù*äyžË@‘ %Öð#Ùš›ÃiEZdeUT%5øü™ÖeÖéep:ߤˆ0‡îx{Æz+ÄæIqÚrçkŸøë/?óÍ_]{úM»ÿø±ï ZjCÔ’ÃøÌÓÚ¶<Œñ› Á„ÓN—Ò>¥á>­;€µ·Þþ'ŽÑæS•n¦‰NÍO¸«I,­aÁÑh4df&8XbL2Ö@Ù b¥ÇiÙ‰iSª¦>µ{å¦pÚ.N`›µ¥ÉÃPìÅj¬Ä,¬@'\ƒ¾ü;þî)FÀœÖùÑÅ‹¿ð“Ÿtm÷÷ÿpàÀ·éÖ5æ4AÍ †©‹Lô@F€…å¨'€ wïN—Ñ<è´Ó†¥³%‰fJk¾_šh‹„©¨„Nd™é“ 2ú8N)ë(yÈRžËiY¢´ÌÚeÔøÒ®]üpÓv¹éZ¸ ]YD•Ì–a)î*[ì  -me`¹~‹vÏ7sZEœ–'óº¡4¥ò„â5$X”´¸)ãfÄtX/ïFÌuç˜ÃÅÛEæ$p9 7^Ìiš-né–Ö:ѹÞF˜ 2s+½ž³Ï*Õp+¸†§)ötª—ÓÚýNÓqs_™•ý¥(îEK™Ëi $î¢éQÓ°§‰ÎGyt:Â9ã4¶ŽÓ~buõ-¿û:[Ú©×ÉÒøì©EÉ›áat1¢G ¿xæX0ôv§Oi`5/NÃG’:N(éÍc:æ¤âœ8M ½ôå è¼8Í:anfIàeÚ`2€º¡XÙ§UU?NÓbî“EF™ -*‹Âå4ŸgÆp ³@œ&R¡³`: Nã8-ŒÓøä>m¹óãÕÕ÷|ð‡/²¥ÑjvO±¤±œ&÷>£zw&I ¡ªÔ$0ô®LÑÀj~œæÜ˯Ç)íšÇŽÕóó*MUžl犙 AÐršjj®ldgT2[…žæ—F”jü‰ ®ÛuUQ•eý*#^[*£^Ü(Íþf¥?â©eËdÝè*“¬aCÞrX^&NëtÖÝ”¬Lœ÷ŠêÚ^œ6iƒ¸‡ïrÜQ ÏžÛ¹ŸEj$ûßyù, JU’6£ö5ànáÙSYNã¤l„!`POP{øLœ¶¬—[­aYþÒ³Yn,;¹=?Z@ O‰b(DçCžcð ‡RÝsœv¤¦å;·r"pïðÙÂ?ù}šo:,§U*”Æ^ìÚPæÿ3 NGÉøc¨´*³¹…ÅAœ¥ E±8¨£‰÷õ³úÃ|ÔgîÓØÄP>þÒ³­e³{º)Ë{‰ÓîÓÜ;ü„,-oLí,ÿ?a§ åR|&4ˆ)¡f8M%Û·gÏz¢ln.š3w·s ƒhB3ük»ç>­¿1.)|¼SreªŒ†Äiõ‘ca Ë욇hÝÏ#rŸFÚYJpšùx½Ýoó¥-ß6*²¨Ø·Ø,d“qf¤ÖØ]`«Õj©§¼¤hhkç¡ìN—ÒÓþ¬Ú9­¿N^0/Ÿ¤Éf—ÅuÄ»¥GkQ_¯òŽ ô~ïù\Ç"ÈÉy­C™}¬_kûè­ ËißÃi«³f~ÙðCbx2û=~/Ù §­Â •¡8íñ~ߢÓr^t ¸×²áFÔ´z1{Ϭð{É6óaŸ0h5|B§Áiá£EÌ̺&V9íÅ<ü±·.^rò¡?=Z öïi¢Ó<;­ÎiŽRdçMCÐ÷$$V9íÅ_k”Ù»²~ãu> ±SzÒÎsšcêj^—n[¶8mš`uZ³ÜtÔi 7è?ëµ™g£µõè´:ÔN‹~¶ÏiÖæI,¸hB`uZB›½9~=UÞïW‡ßʳÁÚ’îi¶‡Cv–ͪœ¶$¨âÂu"?ùryÁÿN¶†"0:MÐ\k/¾]“=e—¼›þ *úffmMh¼<Òi{(é4þž&wXU¢ Ei–ë[„ÒÈŒ.+–»hì4.É3–¶¼¡tš€ìx’XsGN;»ÀgêS6Ó=eæ_l$´ƒUU²"qê*Õuš²å†—V&ìë´ëœF¹ŠócÃZº]ºV#ÉË–K?€>Fl Û9mÉÐ:MÀ¨íYæ†óȃ6}š¿Å”žºž”vZ`~œ¨µ<ðË®Ý\ÒAC§iÛô`=¸‚ðª:m»Ÿ{²‹®œc·Œôª‘–Ó¬#šÚi ܆7³šÕiË$dA pjä'±µôÔô”ž™ÈO-pzäü’î—m‹N³¶Ûûlz6 iN[Ô”LÇS¹X §•W˜jÖS~øý*Ö)ŒFØïÜBin×ÈïÜ¢h> «§Æûµ:ÍF+øÎ­Òi= Á lr3P4Ÿ„ÕSãýæ£UÖþEöÏ¢ù,¬žï·—N#ŒfTþž:៯¡M8í±ŽÚçÌ>Ú/¶~–Ç•ƒÓ ´.øwÔ¾z†QûœÙ‡úµ¶±Sí(î9ÖA`ö;ü)œBQ§Mˆ@ëðosãžTK:mJD=Ûì¸'U«Ó¦?¨tÄoFû\ñû¹ç¤ÐÇT®¿ÍQýÊ©Ó&?¨›—œÞoF+­VwNãÿ=Ã?ì×!€@ QnWÅÙzÐñŸü4’*Ö!V±ÌS5Õ-_.ˆqJäfÆþ’`ne=ï4È…¨¬&¬WÈ5Èž½±Ô¿çÍÎÕd¹ Ã`_§˜UÀª«,r’Yô\†UïÐÝÜ‚½[_ûêD8Ÿ~€çCHb,×vîñ9å¼ zO,êâÚo*ÎF± ч~á£Ü{6m|bÑaL—«§¦¦øò]H«c¾ì±÷=wàÓ´ƒJº Wuø4&WRU‹4»Ö‚§íɧµñzÇO[8-Ïsóû4)óv@!íðiËűb­=¹íÛè®c$O/§eâ\Y#„fwn½¯*^‹ íÇxÚÁÓ*}š§˜[ð4ª|‚ÿ}2+! ²¦OsI‚æiêçÛƒ§ËÓ’Tù4»÷t.]iÚ$Q=“pàäF1‚þÐ-lÌ¢_U$t<-˜Üu0O+ ™Ï&g~O+G@“ FäÆh°ÅÇb€ì³¤Osƒ(žfùAÏû4§Ïa*½3}-·Ü{Žçq2Ù2³ò³ÙäìÞS"mž§QE"<ŸA€jinižF‡âi=rŠ K)áÜÚ"¤å5ªŠƒ~žæY›F.—ÙlrQ<÷ …>Í" …-V FÝH¯þ{Z/pP!M6À ú³q¼!W“…O·fuµª ƒ1TNï6öiäÏL9ÞíøÞsܧ9’b¤ÙõÒhBï"¤¡Í-÷UåÎ]ð4›T&/( !|Àð\Ù|¬Š>¢ ½HøŒ0û´È`e¬Êø3ËÓ  xÚp­q÷çižîŠ„7ð4ãÓ°ž2W`Ϙ˜…‚þÕT™–L#íaxZÖ6\6i~jï %nc8œ efïéloü±ëî=C’Ÿ„ó4ëÓ’X¤Z~M¨Õ"&¶HÃJlÍÓX dRí]e„§áݨ-ž{f÷æ=$ùÝ(žæLêYëÓ]«GÚÔÝmÛ=#O3üL2¸Â½g½8’¢žbÀºÒu¯_º.ëŽó4ž<ÍéTpHYÀÓÊ‘†¶ÿ‹§!͕͛JÝ&|ñ´=<÷ìN§—S’A7ú÷4x0žIÌTç÷ž¤4ÒÐ… îžâó¶|F€û¥Ý{Âïhïù¼òÞÎ\Okój&¥…eDyì->M ííÌyÚô;)"‡mÅòÔ-÷žõ‡Ý{>»O»`í%•‹ˆO›‘#æö“‡Ü{ú]ø´îü6”³äi·cZvs[°ýÅܧ½]½Ùi„§-ïÓŸæ³±„´ð´n(‚§yóêñáÓÂâÉÀ§ms[>‡«äiTO»ÅÍK_øÆgs¿²ðA³ÆË¥ÖÏ…"öž~Û˜ÛòI«|Úë™ÊwÅÓ %îD¿ÔÇŠ¹E;×r<Ô íì“:ÚyRIHO[Ò9T Ýøãšõ¦j<{7ê×ÄÜrìñîÖD}n:™q3ŽÝõ±ïGISŒé:p6yå …ÎÒdïÄTÓô|{n£¦Ålî*]hŸ{Î×ÓîдT´sd~ÒÜ‘Ià¹\p€éÐë`@^³I*ÖÄ4pTAÓ†õ´3ì¹æ,|ZA{اï—l­´o l‚S³m ·½ÈÌp(MɰhÛHŒ:¤C-£Ê´CÝäÑQ¨±ƒŸi@¬hƒ¦ ËùöÜÚtvïIVô]CÎé½çËo}ÅBžˆ<&#SŸ–¡NSì4M{ öR[ublÚ:œfåv‹ìÉIÕj>ío>÷Izzãçž}=­µ¯Á§uD±Á›+žÈN|ZŠ:MM@!bÒÏM ¶Áç$G1ÄiVŽƒ.²3 ú 2ª^¼Ó´õ{n?x¢Ñ§ueƒ¦=úûAM[ƒØ¨ ÞMvâ|Z†: *†.D‹qƒ ØÄI,G1´M–‘Bx´Kô½-CõNÓ.öÜóKêÓ'6üÆàDÓ:œO+P§)Óux%L!gœfÝœ>jG'i0}ZCîÓîÜŸFŸ8±iM$Õ4`ði9ê4$(n£¦9Ó$ Á§Q¥öKs8ÒqMC;tÄ­§9;yµýiP´l= Àé³óM©OëAŸV JS00Ý¢½êз£ÈþŠ>7¼âLž§#¹À„À~­¨¢išæ÷žÿüÕó%_O#Tp&@² ÿ–Ÿ–fóiò4j ¦3Ëe¿«àEßf0j³ÂiçÓ6fÖv¬ºõûZ·žf ¦¹õ´ ìO{Í|!*jÎïêé¸ y5˜u¤ƒ}fCËÑU@e¥ñ'ØGÑ(ù }7ÿ?F–k}6ª^O«ÁEô)°”ú`º3RWÞ{~¿Êç=ù„ ¬§­‡dH4A¿½˜îŒTºŽÒ»\nÏ- šŸv»-¬ z§/=eåNóyïIŸö‹½+È®Z‡¡ZÈß@Àèz°’XÃl„{€‘w‘ŽÁÅÇôV’]¿—*=±y)v£¶ém,[WWÿ:ç6³n³Ÿ–‡‰ ÍÚ_´Í}š’õlüqn1¶?-¹šOL1‚4[SRléÜúâÜíy¦…¼Ÿ&ó=—4[SocY?Íç–öûi!r?ÍNje¾Ä—ÄÁOùR%dÊ?“$<àï×*¶*ß9™HhÍãº~8·©Ë(ß3ûiB>êx¤Q,ŠV±aÜô”áAõsÔm)Sè$ÓÙsñǹʼn ò=á§ÙHâá÷E¸ $¸ª!Mô+™¬Ò—Ò  „­&Ò3Æóµîx=Q7ª7έ½Ÿ†<™ï¹FH#&¿ã£:ÒHCOOº¤œ+ MþO´Ÿi DgYϹQ®8·ûgÏzA$ÂcÅiêÑD©Ò+‘F8ÊH#¤qÀ¸i¨g£ëF‚s ?-”ü4ÃÙzÈ@Zê¨"­<<úêŠ@=Óˆ ¶H#| ׯ=u=›Sqn_Õü´ƒ–-ièÆ›&:´ûXGÌÍžq¿@ýÌ%%¡5t®¸çma?ÍpíYœqÀ×HS‰Õ`cö´BùiéuBý4G€úž–ûiVp`sRq?ô˜º cAÌžÀS{? FÔìÉdí™ùœ¥ºQëyòã§ÙÇ=G4jݾlé¸=hw[ûhÔˆ{¢­¨u²<í§YGØGÜódžöf{{2?­žG°Ì¦m´û6Óíý+´v÷¹tníˆ{?ÍÚÔ”JÙ¤©žM·œÛ6â™:·aðÓ5õéÏFCݨnun-- Áñü´4À,Ïk÷œ[vqjªèþzšŸ)šñÓjöH°øO«@{÷ü´›4¤»Îà§õ©s+ ×…Ó®Œ{j?M³¸ìùim¤NõK]ðÓ¦´ÎG<Æç¶…4Úá§©<¢Œfü4ÊöT ßÛô‘d¥%†aXtÁO›E<kÏžunïVt¥óuûi*qÏlÇiÄN2¸I•’ÿŠÒQ2ðÓ¤^€ Î-.#¸Œ®ßO 2îIàXØóÓ$Ñ¢V´X_X4Õ=?íFòf<èÜÚûiZ? ~Ú¡H#¢Ò€¢:Òúç§MÐ Hüf:·°¡&vŒ<' ­=G ·‘–ÏU¤õÏOãüf¬=O£säzh]á§Y!bâEÍžÕüf1öÏOK;JéNOðÓ:æÜiëÜšî§ñ•¢X{r¿òLà ,2ÈõÉO»yàÍ„´Ÿ†Ü¨óÕ÷ l?Íbƒ—ér¼ü´u󠟆'ü40ÝsnõàÓ­˜G°nR?-ö©Ÿ†ü´»’®ü4Wœ[5hä§¥÷õÓÐ㟆z6áï~Úê˜s«Û~¢q˃Ÿ¦XC=ê§¡Ç=?Íç6z—Ÿ–ŽÀâžÙOÃÑ£~z<ðÓ¦w~šgÎ-ö`˜å§ÛÄÿÎ’z\&C.|®èN?÷ô¯Ÿ6³x Öž^tnÛým¤½ŸÀ[z¢m¦1‚»ø¢í®ßøÍ~9·¿¹;ƒ–F¯/ŒÏÊ;‰+ÍFÒ• i@pã”, ) ô ¸ b‚¦‚Ÿ¢î拆Ì"äHˆy’˜@À…ÐÿÂÕ›ÌÿVéóœs¯7É›ÉÌt67}ÎyßèŒM-üúœsϽ¾NV*ö´üãxõŸ'µòëügþ/¿ú}ã/þ7Ä|Y~Å/A’öËÜùæöokûœÛÉ÷l´›pôýßéëK°g9¼£­ð´Ð…Z?LÑ`M˜îqýTƒÒüÇPÒ;\ðFÅs¡/LÜü{šýRjæSÿÆ‹ÿNÿíÍÿmÌäwdâ}VøìÇ—÷AŠó4¿Ëœ|.ÇúxÚdO]FÈ\.õs}ªÚ¯V3Õ¡¨xT,6ŠÍf³YcÖÆyÄ8]A"ÒYdö†ñt³©jµÎŽ[ÇPQ8Ԡ0`6Æ!¢±ÅØÚª#ë[õz©T¿-í–vom¨Ü.—¯××£ë´}ŽxÞ~~>ažœœ|@ì|@P÷;÷§÷§½Ó^oŸ¢³ î®LJ>»»šêi:O[¹ï¹.¤M÷•ø½Qkçit™‹ÄÒœ©´!R9Ô¬¥1jµô¸ÖÈY: ÒÔÒÈ™v¶ S#f]rfY+ „lÐ@ÌzœYOc³r›”µÅÔ ËÂr6ëiÈOÛ'hji¸Z -´q/»P=ÍÏÓxµ×óg£’ž5¨h™Œ«žGC‚ÒÔÓ ¼xZ^,ÍWO( µM%­OjÞÓÔÔÔÓ6ïi ZÕ“h O£¥(k‚bÖÓ žÖc z2àiW05:š™L¦7@&žàù´ä!I«ÓÒÖž:OSÃÔ´O;ùRŸ¦!mÚ•˜I³¨éÐV=-ÔóiÉçr„uævñ­–Ÿ¹}Ÿ&–fI£H×âhCïiMCIŸ¦žfÒÈ’f¨¬³4J5Ú™ ¦°¥”4ªÁ5‡Mh£§ÕK»°µ¥ž¦°èhji_îÓH—€ž&kOëi ÎyZçÓþç­={>í瀞sëÙ†>CšŸ§CO‹$M[5zZ†¤3’¦žFØ”´<@ÕÓÒ¸@®E”3Hku•´Of²Ià—¨¤“[]´wÝÚsn‹`´ô4š÷´žöi~¢ÐìÚsJÐôšÚ>-Øç§AÎÕÚ>ç6Y}—“¦ó´H ·= ÕÜpÕ“/¶zVüŠÒh£æÖž´´®¡°ö4ÔÂÚSBw£P>ѧ‰§•ºG œiùLÌÓvЩY-™§‘5Y0Œ§ùyZÀÏåhÛ>-È3·î]“/6[{ª"Ù`gôûLxšÛ#¨ÂÔ¸… ö¢Ý6ÇÍZÞM9Òé §é@s‚&ÛžH‚v|LOK :·EJ(j2M³3ñ4¬ù>M—žÞÓt Æ°žÌîmŸ†dèìvÆÓâ˜ÇHâ înž(i¿{GKüÞ¨žsûm“[•‚†©m¤;ìýŒîšNÔ°ïé&·5r†Ô=îF‘2†CímßS÷¢º,žœ§±z¦ÜƧzšçŒAO£vÝäVû4ë’#)ŸÎÓ™,=qA÷Ò§¹ò )g05H5óúúÑgОögržtæö_ì{FPŽÉjHs3»íI)i{–ƒŸâi4nP ƒ”*¤üQ;MÛB:ÖuÊ‘§4™§½n½§I›¶#œYSÓêé§i:¼uó´—y©§½QŸ{.ÇÇõÛ÷ôžq“@j§ œ´¢ ¢Öl"©<8S̬žô3$ôÎüþ:Q#dÂ.pf÷LMõÈýu­žM!)VN»øÜÖê©[".=¢{èÂ-Dû:á ´U£®˜Wša÷i?¬ÿóÓ¼§Q‘ÈÛZ¦ŸáyŽa†õÓ ¨©òªqž¤9eÓYeMµùÔzjYu¢”h:L4ÕCY•o›SùVH+P£ƒƒífuÂPͱFõNÞÓ–¨lŸ¦Ï h¯x.ÇÚxÚ7)–üvŸ¦Ž¶ÖϹý‡½+Öq†¡™³xðÚètpÃMŠ"Èà-“ Ã}Åý#º½¸¡€×/È(gåÑ#MùfÄpñHf<~î’‹Üé‡rä„&Ÿô=‡vª1¤ÑòJ[7"£Õkñ¹yN“Œ…Sˆž0ø%“°šô=9m÷{Ê{£<Ò]‚Ó¸`…zÐ?…¯r'e<ÖE ¸>Š|ˆ}Ï5Þ¨Qþû©KÊëÝõáZ|jA§Å˜ õ¸X§Á„œH—B¬Ó`Æ{a-JÉii)¦º°‹@ÇÆ¢!ih1¾"¥(Lê´Í§É¦jw:iê,ÛÁwØ”)NƒˆÓȘÚ"mæŸw_2ÿé&uÚ<‘vŸº7Jê4Éi)9•œï–˜%‘¦Hã‰vx=-¯ h…×hX:FÛ Ð.i ä´ˆ \f!Ái ôN³²&uÚÌ÷=ßøôñ¾%9-sö—H D¤:¢n˜Ó”DZ‡CGpZ×4±½ih=m…mSÍ8N³Oé4k=¿q9ÙƒÔiWs4Çil§øÞ(Öiœ¥ušŠ°UI6föEߺðCììª}Y˜= ŽÑ*ÇhåÖ §Iß“³NcÁæË ²t[Z§qÆ:Œ‹˜¬8÷=Ý€$Ò以÷=MC{œ.h4[£á*[¹]%öž2°“†åè4¶ÄzÚ?1FÕËMê4ò8߉ÁBÐhG³]ÝÚEŸåa):íæÝ ¦O½œörËœI¤ •6B§™Öï4{¶§Îõñ€S'n½÷ê4°‹ â,Ç<ï÷<Ý_Q±çÞ¨‹ù›œ=ó²u*Ê5®£]®‰Ñð,nN³ÿ §Í÷÷ÓNWñ?]~7jHƒidU{а­Éë\áÔYßöøžÈ»vܸa Ê: 'Í)\¥Rl—Ê·ÙÒ'²¹@ Û¨pÇ;¶Rj:ƒ… -~0x \j(ͬ>Ô¨Û‡Ñ#çÃÖ³»—ú§ ‚Ë}£Úí écŠz›s´½cŽÖ±GcuÈÓ¨m.Êû§!Òܰ’žžŸ™¥ñÕç¨íöÔïÏ7gŸ‹‹_O7 ‡"¿…xšÆý=‡?òCùiú´P¯ÎÚïYhœ œŽ'ði¬—ÖxšÂü4äi2?­ÞÝÒ§yæWÔ8,õÃÑÐd¾¥ ™ö%ó4µùiÈÓ­§íø“öýɯ£õ7#Ôú‘F®q5Úû§!OùgÙ>·±‰Çµ‘æÆ{´~÷´ën;†Ùïþä™Z_l‘_Òò­Îü4äiŸV®Ïm~¹Òˆcã§“CPÝí½ŸuòáuÒ#Ì/>‰>­ZŒ 0O£¡PŸÛdÍF0àiïÿŸþ£;n~W!ÒtÆ=‘§A_Žkõ¹€\xç ÃÇ\?%Kð´Ô#õ¹ÈÓªô¹5Ì‹"-¥vG?5]‚绎(\ÑÆÓ4 ð4Ø7ªLŸ[DK4k@ZvXã9@L¸¯”Ÿæ¯âXZ×ÀÓîŠô¹E¤ ò¶8O3&%lG·†âiø‘“…Q›äi¥âž%ûÜêçi>²ˆ`F F-§«àiÅúÜù¬åë‰%xÓ…QÆ‹6Ÿ¦Oài¡6ªjÜS Oƒ¼‰Â¨dvªÔŠ׌Á§5—ŸöX¡Ï-Èb< £x8åÓ£s¶ Ðl¾#ôi­ä§Á¾QÛòióKðüÛù*Ö©ô8©‹FðiÍæ§Ý¶€4Iºpî™ÍD¢¥•·‡dÅŠHñ±KÙbô÷O›±ž¶¤9šO·”ņŸ OmrkTcœÅ²bÜS~Z…œ[…:Míµ —H&8%§á÷SÌ?{’Ô®:ÍÞµiRÀÐ÷°ãm×Óªþ4\¿±ŸNÛÖºß3E{ØÿŸs»iÁýi!÷#ø!ï Rbàþ®§¾­Çþ%_jÏ“%¡:,–b±n"‹iF±× ,! &Š=LviZ|ÌÕauÑ>÷Ì{nù; l†ÍN£ñ§ùÿzÏívxmBÒŽV5Ò9 …ž[;l³;?iN áµ)‘ST©©?Íæ´2Ïm\Æõš–N›‡×*0©:IþÇœVé¹õ»<9¨­NKÏXÓðÚÁû–¹ØŒ™¦qúÓ÷Ü®v9GÒ ¶;­çZm^k!W ØÅÇC¬ýiÅž[¿+¾…RÏ™Óbx­ï4Ÿ>´HžcZˆt&šØœVá¹mÉ9 dÍÃk_ØÑiƘ¢Õ©©? ¥žÛ˜‚{ÿ·g²æáµÆËmbŸg´Šç4§?íE<·1¼v\¯Xwš1(CÐ4‰?Ös‹}šÃkÇûk¦+MC‡?Ír9^/çVô„ÛðZ,¼®ÖMÏ”"Ìi ð§±çÜ"óH\`sš(ÆEóë EôP¦á~?<ç°0Ø{Vt-t„Y« i}¹µG—ŸFè¹=ŸñÐ1€s3 Í>g.‘ç×ÓãuÒC_MÀ iþcQth=·—hÂŽvñøeïŒvœµ0:o·W}¶\æ]þWJ¯i©Õª¤YúÉ:òÂŽ=af“…Ø í'3à³3nø4ÕRœö¡vûïÛ›Ã@ä†OûÕ‚¹ÕÔÒ( %c‡çrùUu,¿§·ÚÝSœ65ÉsËéøþcc‡çry=<+-òÜšøÚnc™©ô\]¿·U)8¸gV†ÊÐ-'-ew/õ=§©qžÛdœõÓøŒgºÍËêí óЕöTÆî§‚ÒÔ÷lÍÜj/â5lÐ8íLDÉ¿—LZCP„"õQižê{Îÿ4ÈsK¥ip1N“6N_=QzÉR¶F¥q *M2ʕ榾çÔˆ¹¥Ò´½§ið©3¦å‹×O.K{”fiCiê{¢nT æ6ï?N³TUi‹IiŠÚ‚ʨ4Ë¥y©ïÙˆ¹¥Ò´Å qš´QOiбL ãкŠó»û¨ï)>­ÿ¼gÿ8íõ>=¦a¬ÂÛR*£ÓÆSõ=[3·E-Nûªù<-WŠIù½h*3>#Ù¸¾î^ê{Nsg>­œöüõsíç=û1·ýã´çÊóWÌFu¨uÍ8­Ç {Ì{¶·ñæ=÷š¶•—c¾dœ¶¬Fœyn·,ø´ÈsÛÕ‚O‹<·ÀpÙÅÆãfÇù4}ïºÔÐG t6¾ø4æå¨ÇÜöWšÙÁ8 ÏÖRH |Zkæ–œ ¥så>p€2æáÓ*(ÍRF¶”¨/ BÝÚ6óbáˆOcݨêÌ­:”æV E‡õÅ­ä.:Ácç¼çbµ”¦×k¯ºÑ¥¹åÓ~µÌs •¦OFŠ\ ‡Þ§Õ¤»s9©/.¨4‚jw˧MòÜn+MÊ¥C&îm¥©S ìfœ†˜¨ŠÒrÖ :".¤ùJóȧÕgnŽi2n•6YËbÎ\ùïyžÖBiÅ«'Kˆ‡™\òiSÓ<·i‡¬±äj¥#œŠÓ•œ¦†Ö×Ô‡keâšèOkËܲÊ)ß{ª—Ôò²ÉÿŸ¦Å)¥e1ˆNŸ÷žZ芕I!#žóÀ§)Ns5ïiöA|š]‹OkÇܶp0ƒƒO>Í»ŸÖgÞ3ø´˜÷lmÁ§ŸæL >-òÜŸ|ÚŒúž-,ø´ˆÓ¦ 0·¾ù44ŸöiæŸOƒ›C>íC™[38ùæÓL)Ùd¾ø4ÖòÏÜÒÃ=Ÿ–ožòiŸÉÜb×ù´4ŸÆf™>yn}3·¤Etºù4K#ñiTšg>Í?s‹…<ÓA>M>CðiTš3>y9ü2·ÚŽp$šÞCñiˆ—¼óiþ™[µ`Ë|š„=ŸVŠå’>u£ü3·ÜuðiÖòÏÜòÞÓ‚O°n”'æ6ø´ÈŸÖŸ¹íϧ… R‡=ø´àÓ"ZÁBiõëF5´àÓ‚OSœ|Z²4ŸÆíÍ5Ÿ¦yÏàÓ’uUÚÆg÷ùÓ"Ï-ÊhvâÓòÚ ˜W§[>-â4Ã5¦Ÿ–­e:Q“g>­?s[nç&æOK#ði\>÷ŧ±nÔ6sëIiÇù4Kù4vA6ù´iæ;Ì>±1sQ+Ì)ŸÆ.(Í3ŸÖŸ¹M„f çPkúž6Ÿf…«§;>mDæ–è-]ËJ«QßÓRÏüiZ°K¾ê{2/Gæ~ô1"jhüiÍwå?ÏmÚôámZ#ZÓ]ùÏsKQ¾zŸÖ~WþóÜr‡‹QÏT'Z;óiażMç=ƒO >ÍsK/|Zðiª|ZÑBiµëF]=Zª—?f;9¡cˆÚ]§¬E¶:°RC°zu£âÿøD¼¿ÒhTZ~欴ÆõQioˆÓ"Ïm-¥q&›”Úksφ샺ÔaïSZJ„ðȧé˜:nÅçi‘ç¶®Òò‰Lή¿É¡aChh·Ò,••V¾z’š«þ<-òÜfßZÔP¶1€ÃÞ|Pi–v)mGœÆ]ɪԊ8MzWO]üÄš•†jDÔÌö*MûQ§Zö*íi êFõgnËfïˆÓìôÑH®–(Ö2°Æ u>ÛÕ±©RCû•Ö¶nTæ–fÖ:N«™»ÛRâ»JTÛBÀ­p««­ÔaïWÐÜÌsË\·ëqà;Á§YµzÙÃ-­ëÞSo’j–_|õ‰›­òxÚÖó4m¦>òi–Ÿ’*óiý™[·ÄE\Õ÷Üy¶v±yÏþÌ-[ãždÃ×÷´¤šÿºQC0·tRƒ€%ùÓbÞsæ–Úa6ªú¯ï|Zæ–<„k>-ø´þÌ-2?Í_þ´àÓtïóž¡´Èsë–O >­}žÛàÓ‚O‹<·ë·Ÿ|ëF] N[,Ó:ðiÁ§]"Ïíb%>Í,UUZði¬uÿ÷|ã´Ò˜|Z£ºQ§½¬iœ|ÚvݨéñõáqÚjˆÓpÅh˧Ÿ6s+j­Rœ&› ùÓñiÁ§±{æ–uì6ßúytàÓ‚O™¹Í¶-ø´þÌ-µGšf=ähȧ…mÔ…¹UÎiztÛ“O >m$æV-ò©3¦MïåÓBiäÓFdnµe½1m~ Ÿqš æ–÷žUâ4û¶i.ðië{Ÿ6ecÚ…ø´4¯Rcœ¦§¤µ”|ÚbżŸÍܦé[jÅüiÕê{Ÿ–Ñ WãÓÒü’Z9ZÅ eÁ§½ì’9!ÓwØPæÓN*-ø4ŽiS!/ÇÆ´iž›×÷ >má›W»JvŽi¢†ÚÕ÷ >mždb9.§­ÔtGФ¾gði_¡µç£þZ,½~Ö×ógy ³ÔÉ-öã˜6?n_·ÿßVÏÓ,Ÿö/{WŒ#7 Õç%û€¼!Uª+ö%[ä*ýUyD*ÿBÒM21.±&'#°Dk] ;ÓâHΨٵƹ5‡V×ËM.‚+ý¶Ûr«96¾eó§½À54ýiñþ¿ïžÊ›àsè í‚{Ù–mQpc«æOë^÷œþ´-ïͽQ¾îI¸Æòv e¡›^ôH¡¥i`&gݳ¿¦ ÎöF¡Æ?O¦I#V¹Ü/ZQÃZš¶“ s]zbÂ4'ßú]«1-9M+÷ûúñÛ…£±–Å‹–NE5øèdA^á嘚F‚3/‡Q19¦£jmMKI™u–§¯qwϧç`s=Me@™aÚªŠqñX%es¢'cyZÔ4°ö÷œLûâZ'g Šæ4Mc½ôøÃT­44M@—§ÑkÚkÎO›þ´¼ƒJµ³ïF@ršfyÐ(ãQÓ€==!yÑwûô§Yž¦D þ´˜§‘ÊDŒ—§•  jIåà¼îÙiÓŸ¶å¤Ôún”­§ aL|’(ŒrµÊ®i˜úô4±îÙ™iÓŸ¶Cqz.øD’m=ÍÞ¨¦éTüèdQ²e/iúÓ:0wvwøO£Ó´.L›þ4O¤¦¦y*’V£n œUt¨=l=¿ØÛÝ=ýi9é¨{þŒû0`Ýä8™L´ýiÓŸö}3F„a ÿ_ý‹_ê‘ ¸HAÝ„Níý nIûé4œ‡4¯Ó ~ î¢Æ¹ƒÝ4Tý#]±‹fž;¸œ¡/Ôi´&XìšÁ @! Cÿþ#ý•¼'Q<ˆˆäöòH³A ¥w÷”{)ÀÛiàÞÓZRY»ÓdiH’äùî–£ÆxµÇD Ãð/ cLýCLMBMç¼MñAZ}>T‰b…ìgIEND®B`‚libjpf-java-1.5.1+dfsg.orig/jdocs/ide-netbeans.jxp0000644000175000017500000001276410536106574021257 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("Java IDE Configuration - Netbeans IDE"); printMenu("ide"); %>

JPF-Demo as Project in Netbeans IDE

Note: for simplicity and concreteness, instructions prepared for JPF-Demo project but applicable to any JPF based application.

Preface

Download ZIP archive with JPF-Demo source code and unpack it into some location. This location will be the project "root" folder. Following instructions are created for Netbeans IDE version 5.0 but similar steps applicable to earlier versions also.

Note: JPF-Demo source distribution package already contains project files for Netbeans IDE - nbproject folder. You have to remove this folder if you want to go through steps in this tutorial. But for quick start with JPF-Demo source code simply open provided project in Netbeans IDE.

Creating Project

Before creating project in Netbeans IDE you should already get somewhere the Ant build script for your project. For the beginning, this might be quite rudimentary script file without any useful targets defined, but it is needed as starting point for Netbeans free-form project. Later you will be able to improve it adding more targets. JPF-Demo project already contains such build script so you don't need to worry about it.

Open Netbeans New Project dialogue and select General category and Java Project with Existing Ant Script project type in the wizard.

Netbeans IDE

On the next step you have to select project location. This should be folder that contains project build script - build.xml file.

Netbeans IDE

On the next step you have to map targets from build.xml file to IDE actions. For JPF-Demo project no changes required, Netbeans maps most found targets to standard IDE actions automatically.

Netbeans IDE

Next step in wizard is quite important - you have to tell Netbeans about all source folders in your project. For JPF based application usually every plug-in has it's own separate source folder. You should provide them all here.

Netbeans IDE

Now press Finish button.

Netbeans IDE

The first phase of project configuring is done. You'll see newly created project in the IDE. Before continue, you need to build project. This makes all necessary class folders that we later will use when informing IDE about our project classpath.

Netbeans IDE

Now open project properties dialog window. On the first category Java Sources it is recommended to provide meaningful labels for plug-in sources. Plug-in ID is good candidate for such label.

Netbeans IDE

On the Java Sources Classpath category you have to provide classpath entries for every source folder. Note that these classpath entires will be used by IDE code completion and refactoring tools but not for classes compiling and running.

Netbeans IDE

On the Output category you have to provide outputs for for every source folder. This info will be used by debugger and by IDE for inter-project dependencies.

Netbeans IDE

The last Build and Run category allow you to configure mappings between Ant build script targets and IDE actions. Here you may provide additional actions configuration.

Netbeans IDE

Now you are ready to work with project in Netbeans IDE.

Run/Debug Configuration

Running configured project in Netbeans IDE is very simple. All magic done in project Ant build script. Simply press Run button that will call mapped Ant target.

Debugging is also very easy task. Press Debug button. In the first time IDE suggest you create corresponding Ant target and map it to the debug action. Answer yes to all questions. Netbeans IDE will generate target automatically basing on the run target. No manual modifications usually required.

Here the result.

Netbeans IDE

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/config.jxp0000644000175000017500000002467610605726466020200 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id: config.jxp,v 1.3 2007/04/07 12:39:50 ddimon Exp $ %> <% include("/functions.ijxp"); printHeader("JPF Configuration Reference"); printMenu("config"); %>

JPF Configuration Reference

This page collects in single place all available configuration options for various parts of JPF. Parameters are grouped by corresponding classes that introduce and support them.

Note that configuration parameters will be loaded using specially extended version of Properties class, which supports parameters substitution.

Core JPF Library

org.java.plugin.ObjectFactory

org.java.plugin.ObjectFactory
Object factory implementation to use.

org.java.plugin.standard.StandardObjectFactory

org.java.plugin.registry.PluginRegistry
Plug-in registry implementation to use.
org.java.plugin.PathResolver
Path resolver implementation to use.
org.java.plugin.standard.PluginLifecycleHandler
Plug-in lifecycle handler implementation to use.

All implementation classes specific configuration parameter names should be prefixed with corresponding classes name and separating dot (.) character.

org.java.plugin.registry.xml.PluginRegistryImpl

isValidating
Regulates is registry should use validating parser when loading plug-in manifests. The default parameter value is true.
stopOnError
Regulates is registry should stop and throw RuntimeException if an error occurred while registering or un-registering plug-ins. If this is false, the registration errors will be stored in the internal report that is available with PluginRegistry.checkIntegrity(PathResolver) method. The default parameter value is false.

org.java.plugin.standard.ShadingPathResolver

shadowFolder
Path to the folder where to copy resources to prevent their locking. By default this will be System.getProperty("java.io.tmpdir") + "/.jpf-shadow". Please note that this folder will be maintained automatically by the Framework and might be cleared without any confirmation or notification. So it is strongly not recommended to use plug-ins folder (or other sensitive application directory) as shadow folder, this may lead to losing your data.
unpackMode
If always, "JAR'ed" or "ZIP'ed" plug-ins will be un-compressed to the shadow folder, if never, they will be just copied, if smart, the processing depends on plug-in content - if plug-in contains JAR libraries, it will be un-packed, otherwise just copied to shadow folder. It is also possible to add boolean "unpack" attribute to plug-in manifest, in this case, it's value will be taken into account. The default parameter value is smart.
excludes
Pipe '|' separated list of regular expression patterns to be used to exclude files to be shadowed. By default no files excluded.
includes
Pipe '|' separated list of regular expression patterns to be used to include files to be shadowed. By default all files included.

org.java.plugin.standard.StandardPluginLifecycleHandler

probeParentLoaderLast
If true, plug-in classloader will try loading classes from system (boot) classpath after trying to load them from plug-in classpath. Otherwise system classpath will be used first. Default value is false that corresponds to standard delegation model for classloaders hierarchy.
stickySynchronizing
Allows advanced configuring of classloaders synchronization in multy-threaded environment. If true then class loading will be synchronized with initial plug-in classloader instance. Otherwise this instance will be used as synchronizing monitor. Default value is false.
localClassLoadingOptimization
If true then plug-in classloader will collect local packages statistics to predict class location. This allow to optimize class look-up procedure for classes that belong to the requested plug-in. Default value is true.
foreignClassLoadingOptimization
If true then plug-in classloader will collect statistics for "foreign" classes - those which belong to depending plug-ins. This allow to optimize class look-up procedure when enumerating depending plug-ins. Default value is true.

JPF Boot Library

Note that JPF Boot library loads all System properties as default values that together with ability of extended properties class to expand parameters substitution allows you to create extremely flexible configurations.

org.java.plugin.boot.Boot

jpf.boot.mode
Application boot mode. Always available as System property also. Default value is shell.
org.java.plugin.boot.appInitializer
Application initializer class, for details see org.java.plugin.boot.ApplicationInitializer. Default is org.java.plugin.boot.DefaultApplicationInitializer.
org.java.plugin.boot.errorHandler
Error handler class, for details see org.java.plugin.boot.BootErrorHandler. Default is org.java.plugin.boot.BootErrorHandlerConsole for "service" style applications and org.java.plugin.boot.BootErrorHandlerGui for "interactive" applications.
org.java.plugin.boot.controlHost
Host to be used by background control service, no default values.
org.java.plugin.boot.controlPort
Port number to be used by background control service, no default values.
org.java.plugin.boot.splashHandler
Splash screen handler class, for details see org.java.plugin.boot.SplashHandler. Default is simple splash handler that can only display an image.
org.java.plugin.boot.splashImage
Path to an image file to be shown as splash screen. If no file and no handler given, the splash screen will not be shown.
org.java.plugin.boot.splashLeaveVisible
If set to true, the org.java.plugin.boot.Boot class will not hide splash screen at the end of boot procedure but delegate this function to application code. Default value is false.
org.java.plugin.boot.splashDisposeOnHide
If set to false, the org.java.plugin.boot.Boot class will not dispose splash screen handler when hiding it. This allows you to reuse handler and show splash screen back after it was hidden. Default value is true.

All parameters with prefix org.java.plugin.boot.splash. will be passed to splash screen handler as configuration data (prefix will be removed from parameter names).

org.java.plugin.boot.DefaultApplicationInitializer

org.java.plugin.boot.applicationPlugin
ID of plug-in to start. There is no default value for this parameter. In common scenario, this is the only parameter that you must provide.
org.java.plugin.boot.integrityCheckMode
Regulates how to check plug-ins integrity when running JPF. Possible values: full, light, off. The default value is full.
org.java.plugin.boot.pluginsCollector
Plug-ins location collector class, for details see org.java.plugin.boot.PluginsCollector. Default is org.java.plugin.boot.DefaultPluginsCollector.
org.java.plugin.boot.pluginsWhiteList
Location of the file with plug-in identifiers that should be only accepted by this application initializer. This is optional parameter.
org.java.plugin.boot.pluginsBlackList
Location of the file with plug-in identifiers that should not be accepted by this application initializer. This is optional parameter.

org.java.plugin.boot.DefaultPluginsCollector

org.java.plugin.boot.pluginsRepositories
Comma separated list of local plug-in repositories, given folders will be scanned for plug-ins. Default value is ./plugins.
org.java.plugin.boot.pluginsLocationsDescriptors
Comma separated list of URLs for XML syntax files that describe available plug-in locations (for details see file class javadoc). No default value provided.
<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/dtd.jxp0000644000175000017500000000070710563410314017454 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("Plug-in DTD"); printMenu("dtd"); %>

Plug-in DTD

Original plain text format file is here: plugin_1_0.dtd

<% includeHtml(System.getProperty("jdocs.outputFolder") + "/plugin_1_0.dtd"); %>
<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/stories.jxp0000644000175000017500000001006210563410572020372 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id$ // Updated by Michael Dawson 20/02/2006 %> <% include("/functions.ijxp"); printHeader("Success Stories"); printMenu("stories"); %>

Success Stories

JPF is quite mature project that demonstrates great flexibility when being used as base for a Java application. We have prepared a short list of projects built around the JPF plug-in architecture.

If your application uses JPF, let us know and we'll add it to the list.


Emersion Platform

Home page: http://emersion.sourceforge.net

Status: alpha development, source code is available from the project CVS

Description: Emersion is a Java based web applications integration platform. This is a set of tightly integrated components (plug-ins) that can be used to build, deploy and maintain web sites quickly and easily.


openQRM

Home page: http://www.openqrm.org

Status: Production/Stable

Description: openQRM is an open source systems management platform that automates enterprise data centers and keeps them running.


Salomé-TMF

Home page: https://wiki.objectweb.org/salome-tmf/

Status: Production/Stable

Description: Salomé-TMF is an open source Test Management Tool, which helps you to manage your entire testing process - by creating tests, executing manual or automatic tests, tracking results, managing requirements and defects and producing HTML documentation. Salomé-TMF is compatible with Junit, Abbot and Beanshell to define your automatic tests, and with Bugzilla and Mantis to manage your defects. Salomé-TMF can also be extended by plug-ins according to your requirements.


JRubik

Home page: http://sourceforge.net/projects/rubik

Status: Beta

Description: JRubik is an Olap client developed in Java/Swing and based on JPivot project components.


Samooha

Home page: http://www.samooha.com, http://samooha.sourceforge.net

Status: Production/Stable

Description: Samooha is World's first Integrated Peer-to-Peer Business Environment that simplifies the complex process of connecting your business with that of your customers, partners and vendors. Samooha provides a platform to establish Enterprise Resource Management infrastructure for small businesses while additionally enabling them in marketing their products and services, sourcing prospective vendors (suppliers) from anywhere in their region or from all over the world. The platform offers Enterprise Resource Management modules such as Sales, Purchase, Inventory, Basic Production and Accounts.


MedImageSuite

Home page: http://sourceforge.net/projects/medimagesuite

Status: Pre-Alpha

Description: MedImageSuite is a tool suite that aims in visualization and manipulation of medical images (DICOM format). MedImageSuite is a desktop application with an plugin-based architecture permitting easy addition of new functions.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/de/0000755000175000017500000000000010541226066016547 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/jdocs/de/tutorial.jxp0000644000175000017500000005172510563410272021145 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id$ // Contributed by Frank Gernart, 2006/04/03 %> <% include("/de/functions.ijxp"); printHeader("Tutorial"); printMenu("tutorial"); %>

JPF Tutorial (Erläuterung der Demo-Anwendung)

Einführung

Dieses Tutorial ist eine detaillierte Beschreibung einer JPF Demo Applikation (JPF-Demo, Download), um Entwicklern einen schnellen Einstieg in JPF zu geben.
Bitte beachten: Dies ist kein Java Swing Tutorial. Dieses Tutorial beschreibt nur ein mögliches Beispiel wie man JPF einsetzen kann und berücksichtigt nicht alle möglichen Szenarien.

Es wird empfohlen den JPF-Demo Quellcode herunterzuladen und aus ihm ein neues Projekt in Ihrer Lieblings-Entwicklungsumgebung zu erstellen. Die Detaillierte Anleitung beschreibt, wie man JPF basierte Anwendungen in verschiedenen Java Entwicklungsumgebungen erstellt (im Augenblick nur für Eclipse).

JPF-Demo ist eine GUI-Applikation welche mit dem "Toolbox" Metaphor Entwurfsmuster im Hinterkopf entwickelt wurde. Das Hauptfenster ist eine Art Container für Tools - die eigentliche Funktionlität der Anwendung wird dabei in den Plug-ins oder Plug-in-Sets umgesetzt.

JPF-Demo - Code Colorer Tool

Auf dem Screen Shot können sie ein "Code Colorer Tool" sehen - das Programm nimmt Java Quellcode und wandelt ihn in HTML Text um, inklusive Syntax Highlighting. Zum Syntax Highlighting wird die Open-Source Bibliothek Java2Html (GPL, Java2Html Homepage) genutzt.

Anwendungsstruktur

Die Dateisystemstruktur dieser Anwendung sieht so aus:

[APPLICATION_HOME_FOLDER]/
 +- data/
 +- lib/
 |   +- commons-logging.jar
 |   +- jpf.jar
 |   +- jpf-boot.jar
 |   +- jpf-tools.jar
 |   +- jxp.jar
 |   +- log4j.jar
 +- logs/
 +- plugins/
 +- boot.properties
 +- log4j.properties
 +- run.bat
 +- run.sh


Hier die Erläuterungen:

data
In diesem Ordner können Plug-ins ihre Konfigurations- und andere Dateien ablegen.
lib
Hier liegen für den Start der Anwendung benötigte Bibliotheken wie z.B.  die JPF-Bibliotheken, ebenso wie die Bibliotheken für Logging. Logging-Bibliotheken werden auch von JPF selbst benötigt.
logs
Log-Dateien landen hier.
plugins
Hier befinden sich die JPF-Plugins, sozusagen ist dieser Ordner deren Lager.
boot.properties
Die Boot Konfigurationsdatei.
run.*
Start-Skripte der Anwendung.

Die Komponentenstruktur der Anwendung wird auf dem folgenden Diagramm dargestellt.

JPF-Demo Application Diagram

Start der Anwendung

Um die Anwendung zu starten macht das run-Skript einen Aufruf der main-Methode org.java.plugin.boot.Boot.main(String[]) der JPF-Boot Bibliothek. Diese Main-Methode liest die Konfigurationsdatei boot.properties aus, initialisiert das JPF Framework und läd alle Plugins aus dem plugins-Ordner. Am Ende ruft sie das org.jpf.demo.toolbox.core Plug-in auf, da wir dieses in der Konfigurationsdatei boot.properties spezifiziert haben.

Ab dem Zeitpunkt an dem JPF das Core Plug-in aufgerufen hat geht die gesamte Kontrolle der Anwendung an das Plug-in org.jpf.demo.toolbox.core über, welches wir wie in Eclipse "application plug-in" nennen. Die Plug-in Klasse org.jpf.demo.toolbox.core erbt von der speziellen abstrakten Klasse org.java.plugin.boot.ApplicationPlugin der JPF Boot-Bibliothek. Somit ist es möglich, dass der JPF Boot-Code unseren eigenen speziellen Boot-Code ausführt.

Core Plug-in

Wie so ziemlich jedes JPF Plug-in, besteht auch org.jpf.demo.toolbox.core aus zwei Teilen: Der Manifest-Datei und dem Plug-in Java Code. Wir werden uns die beiden der Reihe nach ansehen.

Plug-in manifest

Die Plug-in Manifest Datei ist eine XML Datei welche die Plug-in DTD (siehe z.B.plugin_1_0.dtd) erfüllen muss (zu XML und DTD siehe W3C oder W3Schools). Das Wurzel-Tag dieser XML-Datei ist:

<plugin id="org.jpf.demo.toolbox.core" version="0.0.4" class="org.jpf.demo.toolbox.core.CorePlugin">

Hier legen wir fest, dass die Plug-in ID "org.jpf.demo.toolbox.core" ist, und dass die Versionsnummer bei "0.0.4" liegt. Wir deklarieren außerdem, dass unser Plug-in eine "Plug-in Klasse" besitzt, nämlich org.jpf.demo.toolbox.core.CorePlugin, damit das JPF Framework unser Plug-in ordnungsgemäß initialisieren kann. Die "Plug-in Klasse" ist ein optionales Element in der Plug-in Deklaration und nur nötig, wenn während des Startes etwas in der doStart()- oder der doStop()-Methode aus dem Plugin-Interface ausgeführt werden soll. Lassen wir diese Deklarierung weg, also wenn während der Plug-in Aktivierung/Deaktivierung nichts spezielles gemacht werden muss, benutzt JPF eine Standard Plug-in Klasse. Beim Core Plug-in ist dies jedoch nicht der Fall, denn dieses besondere Plug-in ist der Anwendungs-Einstiegspunkt und muss bei seiner Aktivierung die GUI aufbauen und verwalten.

Das nächste Element im Manifest ist die Deklarierung der Bibliotheken:

<runtime>
	<library id="core" path="classes/" type="code">
		<export prefix="*"/>
	</library>
	<library type="resources" path="icons/" id="icons">
		<export prefix="*"/>
	</library>
</runtime>

Hier definieren wir, dass alle Java .class-Dateien dieses Plug-ins im Ordner "classes/" innerhalb des zugehörigen Plug-in Ordners abgelegt werden. Außerdem definieren wir, dass alle Klassen und Pakete (*) sichtbar für andere Plug-ins sind, und diese unseren Code frei verwenden können. Ebenso gibt es einen Ressources-Ordner "icons/", welcher ebenfalls für andere Plug-ins sicht- und benutzbar ist.

Der letzte Teil des Manifests ist der interessanteste und auch der mächtigste von JPF (ebenso wie von Eclipse), denn er macht unsere Anwendung extrem erweiterbar. Dieses ist die Deklaration eines Extension-Points:

<extension-point id="Tool">
	<parameter-def id="class"/>
	<parameter-def id="name"/>
	<parameter-def id="description" multiplicity="none-or-one"/>
	<parameter-def id="icon" multiplicity="none-or-one"/>
</extension-point>

Hiermit definieren wir, dass unser Core Plug-in einen Punkt veröffentlicht, an dem es durch andere Plug-ins erweitert werden kann. Wir nennen diesen Punkt "Tool" und erklären, dass Erweiterungen an diesem Punkt als "Tab" in der GUI dargestellt werden. Außerdem sollte jedes Plug-in das an diesem Punkt festmacht verschiedene Parameter zur Verfügung stellen, welche teils in der GUI benutzt werden, teils dazu um mit dem Plug-in zu kommunizieren (bsp. eindeutiger Namen). Für diesen Extension-Point definieren wir vier Parameter:

class
Dies ist ein benötigter Parameter vom Typ String, er sollte den kompletten Java Klassennamen enthalten.
name
Der Name des Tools, er wird als Tabname in der GUI zu sehen sein.
description
Die Tool-Beschreibung, welche als "Tab-Hint" in der GUI gezeigt werden wird. Dies ist ein optionaler Parameter.
icon
Der Dateiname des Tool-Icons. Dies ist ein optionaler Parameter.

Jetzt sind wir bereit um die Logik für unser Core Plug-in zu implementieren.


Plug-in code

Wir erinnern uns, dass wir im Plug-in Manifest deklariert haben, dass wir eine Plug-in Klasse org.jpf.demo.toolbox.core.CorePlugin bereitstellen werden. Normalerweise müssen wir dafür von der abstrakten Klasse org.java.plugin.Plugin erben und zwei Metohden implementieren die das JPF Framework während des Plug-in Lebenszyklus aufrufen wird: protected void doStart() throws Exception; und protected void doStop() throws Exception;. Aber in diesem Fall müssen wir von der Klasse org.java.plugin.boot.ApplicationPlugin erben, da wir das "Application Plug-in" entwickeln. Unsere Implementierung dieser beiden Methoden aus org.java.plugin.Plugin wird allerdings leer sein. Der wahre Grund dieser Plug-in Klasse ist die "Entry Point" Methode aus org.java.plugin.boot.ApplicationPlugin zur Verfügung zu stellen, welche von der JPF Boot-Library gerufen wird und anschließend den ganzen Zauber für uns erledigt.

Die Hauptaufgabe unserer Core Plug-in Klasse ist die GUI zu erstellen und zu verwalten. Außerdem wollen wir hier den Code für die Realisierung des Extension-Points implementieren, den wir im Manifest definiert haben. Der Trick besteht hier darin, die GUI-Logik effizient zu organisieren. Das Prinzip dahinter ist, Plug-ins erst so spät wie möglich zu aktivieren und so viele Informationen wie möglich aus der  Extension Deklaration zu sammeln. Deswegen haben wir auch so viele Parameter in der Extension-Point Deklaration definiert. Wir bauen die GUI als ein "Set von Tabs mit später Initialisierung von Komponenten". Werfen Sie einen Blick auf den JPF-Demo Quellcode für weitere Details. Der interessanteste Punkt ist die Kommunikation mit unserem Plug-in Framework um alle Extensions zu erhalten welche mit unserem Extension-Point verbunden sind:

ExtensionPoint toolExtPoint =
	getManager().getRegistry().getExtensionPoint(
		getDescriptor().getId(), "Tool");
for (Iterator it = toolExtPoint.getConnectedExtensions()
		.iterator(); it.hasNext();) {
	Extension ext = (Extension) it.next();
	JPanel panel = new JPanel();
	panel.putClientProperty("extension", ext);
	Parameter descrParam = ext.getParameter("description");
	Parameter iconParam = ext.getParameter("icon");
	URL iconUrl = null;
	if (iconParam != null) {
		iconUrl = getManager().getPluginClassLoader(
			ext.getDeclaringPluginDescriptor())
				.getResource(iconParam.valueAsString());
	}
	tabbedPane.addTab(
		ext.getParameter("name").valueAsString(),
		(iconUrl != null) ? new ImageIcon(iconUrl) : null,
		panel, (descrParam != null) ?
			descrParam.valueAsString() : "");
}


Der nächste interessante Punkt ist die Vereinbarung, die wir für unsere Extension Klasse  vorgenommen haben. Wir sagen hier, dass der "class" Parameter welcher in der Extension Deklaration definiert wurde auf eine Klasse verweisen soll, welche das Interfaceorg.jpf.demo.toolbox.core.Tool implementiert. Wir erklären außerdem, dass Objekte dieser Klasse mit dem Default-Konstruktor instanziiert werden. Wir versprechen auch, dass die Methode init einmal im Lebenszyklus der Extension aufgerufen wird. Es folgt der Code, der das eben umrissene Prinzip in die Tat umsetzt:

// Activate plug-in that declares extension.
getManager().activatePlugin(
		ext.getDeclaringPluginDescriptor().getId());
// Get plug-in class loader.
ClassLoader classLoader = getManager().getPluginClassLoader(
		ext.getDeclaringPluginDescriptor());
// Load Tool class.
Class toolCls = classLoader.loadClass(
		ext.getParameter("class").valueAsString());
// Create Tool instance.
tool = (Tool) toolCls.newInstance();
// Initialize class instance according to interface contract.
tool.init(toolComponent);

Von diesem Punkt an können wir unsere Anwendung veröffentlichen und warten, dass jemand ein Plug-in dafür schreibt :) Da wir aber nicht den ganzen Tag Zeit haben, machen wir das selbst und entwickeln verschiedene Plug-ins, welche wir dann zu unserer "Tool Box" hinzufügen.

Code Colorer Plug-in

In dieser Sektion werde ich im Detail erklären wie man ein Plug-in erstellt und damit dann ein Tool zu unserer Tool Box hinzufügt. Wie Sie bereits wissen, müssen wir dafür eine Extension für unseren Extension-Point "Tool" implementieren, welchen wir im Plug-in "org.jpf.demo.toolbox.core" definiert haben. Wie zuvor teilen wir die Erklärung in zwei Teile auf, die Manifest Beschreibung und in Kommentare zum Plug-in Code.

Plug-in Manifest

Das Wurzel-Tag der Manifest XML Datei sollte Ihnen bereits bekannt vorkommen:

<plugin id="org.jpf.demo.toolbox.codecolorer" version="0.0.5">

Wie Sie sehen ist die Plug-in ID "org.jpf.demo.toolbox.codecolorer", während die Plug-in Klasse nicht mehr deklariert wird da wir während des Starts/Stops des Plug-ins keinerlei Code auszuführen haben.

Der nächste Abschnitt im Manifest ist neu für uns:

<requires>
	<import plugin-id="org.jpf.demo.toolbox.core"/>
</requires>

Wir definieren hier, dass unser Plug-in von "org.jpf.demo.toolbox.core" abhängt. Unser Plug-in benötigt also womöglich Methoden und Ressourcen des Core Plug-ins, oder stellt womöglich eine Erweiterung für Extension-Points dar, die im Core Plug-in definiert wurden.

Die Bibliotheken Deklaration ist hier etwas aufwendiger, da wir beabsichtigen Third-Party Bibliotheken zu benutzen, nebst unserem eigenen Code.

<runtime>
	<library id="codecolorer" path="classes/" type="code"/>
	<library id="java2html" path="lib/java2html.jar"
		type="code">
		<doc caption="Java2html Library by Markus Gebhard">
			<doc-ref path="docs/java2html"
				caption="java2html library"/>
		</doc>
	</library>
	<library type="resources" path="icons/" id="icons"/>
</runtime>
	

Wie Sie sehen haben wir hier die Code Library "java2html" definiert, welche auf die JAR Datei "lib/java2html.jar" verweist, außerdem haben wir eine Referenz auf die Dokumentation dieser Bibliothek gesetzt (dies ist zwar nur ein Beispiel, aber es ist guter Stil zu jedem Plug-in Manifest Element Dokumentation zur Verfügung zu stellen). Beachten Sie auch, dass wir in diesem Plug-in Manifest keinerlei Code oder Ressourcen exportieren, da wir davon ausgehen den Code dieses Plug-ins nur innerhalb dieses Plug-ins zu verwenden.

Das letzte Element des Manifests definiert eine Extension, keinen Extension-Point. Diese Extension ist der Zweck unseres Plug-ins.

<extension plugin-id="org.jpf.demo.toolbox.core"
	point-id="Tool" id="codeColorerTool">
	<parameter id="class"
		value="org.jpf.demo.toolbox.codecolorer.CCTool"/>
	<parameter id="name" value="Code Colorer Tool"/>
	<parameter id="description"
		value="Tool to colorize source code text"/>
	<parameter id="icon" value="codecolorer.png"/>
</extension>

Wie Sie sehen können, geben wir unserer Extension die ID "codeColorerTool" und spezifizieren als Extension-Klasse "org.jpf.demo.toolbox.codecolorer.CCTool". Darunter sehen Sie, dass diese Klasse den Vertrag für den Extension-Point "Tool" vollständig erfüllt, da es zu den beiden Pflichtparametern und sogar zu den beiden optionalen  Parameter Werte spezifiziert. Jetzt kann das JPF Framework automatisch einen Integritätscheck auf unserem Plug-in ausführen und uns warnen, wenn etwas in unseren Deklarationen daneben ging.


Plug-in Code

Der Code-Teil des "org.jpf.demo.toolbox.codecolorer" Plug-ins besteht aus zwei Klassen. Die Klasse org.jpf.demo.toolbox.codecolorer.CCTool implementiert das Interface org.jpf.demo.toolbox.core.Tool und hält sich damit an den Vertrag für den Extension-Point "Tool". Die Methode init dieses Interfaces erzeugt in unserem Fall einfach nur die Tool-GUI und fügt es zu einem gegebenen Swing Container als Kind hinzu. Die Klasse org.jpf.demo.toolbox.codecolorer.CodeColorer ist die interne Plug-in Klasse die die eigentliche Arbeit übernimmt. Der Code dieser Klasse ist von der Java2Html Klasse de.java2html.Java2HtmlApplication übernommen, mit kleineren nicht so gravierenden Modifikationen. Ich werde den Code hier aber nicht weiter kommentieren, wer es genau wissen will sei auf den JPF-Demo Quellcode und dieJava2Html Homepage verwiesen.

Beachten Sie wie leicht es war, einfach Tools als Plug-in zu unserer Toolbox hinzuzufügen! Der größte Teil der Plug-in Logik ist Toollogik, und nicht Plug-in Verwaltungslogik. JPF und unser Core Plug-in haben uns diese Arbeit abgenommen.


Andere Plug-ins

Es sind noch zwei weitere Plug-ins in der JPF-Demo Anwendung. Das erste ist ein Plug-in Browser Tool.

JPF-Demo - Plug-in Browser Tool

Dieses Plug-in erlaubt es uns eine beliebige Anzahl anderer Plug-ins zu laden und dann deren Struktur zu untersuchen, ebenso wie ihre Abhängigkeiten. Beachten Sie, dass jedes der Plug-ins welches sie mit dem Browser Tool laden mit einer eigenen Browser Tool Instanz der Plug-in Registry geladen wird (eine eigene Registry für das Browser Tool, in der die geladenen Plug-ins dann eingetragen werden). Von der Demo Anwendung werden diese Plug-ins nicht aktiviert, sie sind noch nicht einmal sichtbar für die Demo Anwendung, da sie ja bei einer anderen Plug-in Registry registriert sind. Die Hauptaufgabe dieses Plug-ins liegt darin, wie man Plug-ins in JPF benutzen kann, und dem Anwender einen rudimentären Überblick über die Plug-in Struktur zu geben.

Ein anderes Plug-in ist das Database Browser Tool.

JPF-Demo - Database Browser Tool

Es ist nicht die Aufgabe diese Plug-ins zu zeigen wie man mit JDBC in Java arbeitet, sondern zu zeigen wie man Erweiterungsfähigkeit zu einer Java Anwendung hinzufügen kann. Tatsächlich ist der "DB Browser" nicht nur ein Plug-in, sondern ein Set von Plug-ins. Zunächst implementiert "org.jpf.demo.toolbox.dbbrowser" das Interface "Tool" damit es am "Tool" Extension-Point andocken und die DB Browser GUI verwalten kann. Als nächstes definiert dieses Plug-in seinen eigenen Extension-Point "Database" und eröffnet anderen Plug-ins damit die Möglichkeit am DB Browser anzudocken. Das Plug-in "org.jpf.demo.toolbox.dbbrowser" weiß eigentlich gar nichts über spezielle Datenbanken. Alle Datenbankspezifischen Dinge werden durch den Extension-Point "Database" (und einige Interfaces) abstrahiert und dann in anderen Plug-ins implementiert. Wer es genau wissen möchte ist im Quellcode des Plug-ins gut aufgehoben. In der Manifest Datei ist darauf zu achten, dass der Extension-Point direkt vor der Extension definiert wird, da das Manifest sonst den Integritätstest nicht übersteht.

Was kommt als nächstes?

Ich hoffe dieser Artikel konnte Ihnen ein Grundverständnis der Prinzipien welche JPF und JPF-Anwendungen formen, geben. Jetzt können Sie versuchen diese auf Ihre eigenen Aufgaben anzuwenden oder auch ganz eigene Ansätze in der Entwicklung mit JPF zu entwickeln.

Fühlen Sie sich eingeladen Ihre Fragen auf public JPF forum zu stellen. Sie sind natürlich auch eingeladen hier Ihre Ideen und Benutzungsmethoden zu teilen und zu diskutieren. Dies wird auf jeden Fall dazu beitragen JPF zu verbessern und es als Werkzeug, mit dem sich extrem flexible Anwendungen bauen lassen, bekannt zu machen.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/de/functions.ijxp0000644000175000017500000000666210563410244021462 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id$ %> <% import java.text.*; function void printHeader(String title) { %> Java Plugin Framework (JPF) - <%= title %> <% } function void printFooter() { %>
<% if ("web".equals(System.getProperty("jdocs.mode"))) { %> <% } %> <% } function void printMenu(String currPage) { %> <% } function String getMenuItem(String page, String title, String currPage) { if (page.startsWith(currPage)) { return title + "
"; } return "" + title + "
"; } %>libjpf-java-1.5.1+dfsg.orig/jdocs/de/boot.jxp0000644000175000017500000000624210536106574020246 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ // Contributed by Frank Gernart, 2006/04/03 %> <% include("/de/functions.ijxp"); printHeader("JPF Boot Library"); printMenu("boot"); %>

JPF Boot Bibliothek

Einführung

Eine JPF basierte Anwendung laufen zu lassen ist oftmals Routine, es kann aber etwas trickreich sein, besonders für Java Neulinge. Was müssen Java Entwickler gewöhnlich machen um eine JPF basierte Anwendung zu starten (stoppen)?

  • laden der Anwendungskonfiguration aus der boot.properties
  • alle verfügbaren Plug-ins einsammeln
  • instanziieren und initialisieren des JPF Framework
  • darstellen (laden) der verfügbaren Plug-ins
  • aktivieren und starten des Hauptplug-ins (gewöhnlich Core)
  • beim Verlassen der Anwendung das Framework anständig herunterfahren

Wie man sehen kann ist das eine recht generelle Tätigkeit, deren Schritte alle sehr gut formalisiert sind. So ist es möglich einmal eine Bibliothek zu schreiben und sie immer und immer wieder für den immer gleichen Zweck zu verwenden - laden, konfigurieren und starten der Anwendung. Diese Bibliothek ist die JPF Boot Library.

JPF Boot Library flow chart

Benutzung

Die Bibliothek ist in eine eigene JAR-Datei verpackt, der jpf-boot.jar. Es gibt einige spezielle Einträge in der Manifest Datei dieser Datei, die der JVM sagen welche anderen Bibliotheken für diese JAR gebraucht werden (im Augenblick nur jpf.jar) und welche Klasse zu starten ist wenn man diese JAR ausführt - org.java.plugin.boot.Boot. Das macht die Benutzung dieser Bibliothek sehr einfach und ermöglicht das Starten der Anwendung durch einfaches Eintippen von

java -jar lib/jpf-boot.jar
in der Konsole:


Hier eine typische Ordnerstruktur:

[APPLICATION_HOME_FOLDER]/
 +- lib/
 |   +- commons-logging.jar
 |   +- jpf.jar
 |   +- jpf-boot.jar
 |   +- log4j.jar
 +- plugins/
 +- boot.properties
 +- log4j.properties
 +- run.bat
 +- run.sh

Bringen Sie Ihre Plug-ins im plugins Ordner unter und führen Sie das run-Skript aus. Der gesamte Startvorgang wird nun von der Bibliothek übernommen.

Wenn Sie kein Logging benötigen, können Sie log4j.jar und log4j.properties auch entfernen. Werfen Sie einen Blick auf JPF Boot Library javadoc um weitere Konfigurationsmöglichkeiten kennen zu lernen.

Schauen Sie sich die JPF-Demo application an, um ein funktionierendes Beispiel für die Benutzung der JPF Boot-Library zu sehen.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/functions.ijxp0000644000175000017500000001201010563410350021050 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id$ %> <% import java.text.*; import java.io.*; function void printHeader(String title) { %> Java Plugin Framework (JPF) - <%= title %> <% } function void printFooter() { %>
<% if ("web".equals(System.getProperty("jdocs.mode"))) { %> <% } %> <% } function void printMenu(String currPage) { %> <% } function String getMenuItem(String page, String title, String currPage) { if (page.startsWith(currPage)) { return title + "
"; } return "" + title + "
"; } function void includeHtml(String file) { LineNumberReader in = new LineNumberReader(new InputStreamReader( new FileInputStream(file), "UTF-8")); try { String line = in.readLine(); while (line != null) { println(escapeHtml(line)); line = in.readLine(); } } finally { in.close(); } } function String escapeHtml(String str) { return str.replaceAll("&", "&").replaceAll("<", "<") .replaceAll(">", ">").replaceAll("\\\\t", " "); } %>libjpf-java-1.5.1+dfsg.orig/jdocs/index.jxp0000644000175000017500000001573510623626272020030 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id: index.jxp,v 1.5 2007/05/19 14:58:34 ddimon Exp $ // Updated by Michael Dawson 19/01/2006 %> <% include("/functions.ijxp"); printHeader("Home"); printMenu("index"); %>

Java Plug-in Framework (JPF) Project

Welcome to the Java Plug-in Framework project, the open source, LGPL licensed plug-in infrastructure library for new or existing Java projects. JPF can greatly improve the modularity and extensibility of your Java systems and minimize support and maintenance costs.

What is JPF?

JPF provides a runtime engine that dynamically discovers and loads "plug-ins". A plug-in is a structured component that describes itself to JPF using a "manifest". JPF maintains a registry of available plug-ins and the functions they provide (via extension points and extensions).

One major goal of JPF is that the application (and its end-user) should not pay any memory or performance penalty for plug-ins that are installed, but not used. Plug-ins are added to the registry at application start-up or while the application is running but they are not loaded until they are called.

Main features

Open framework architecture
The framework API is designed as a set of Java interfaces and abstract classes. Developers can choose to implement their own "vision" of plug-ins and Framework runtime behavior. "Standard" or default implementations are provided by JPF so developers can start using the framework quickly and easily.
Clear and consistent API design
The JPF API has been carefully designed in order to reduce the the time developers need to become familiar with it.
Built-in integrity check
Registered plug-ins are checked for consistency during JPF start up and a detailed report of results is available.
Plug-ins are self-documenting
Plug-in developers may include documentation in the plug-in manifest. This includes inline comments or references to documents bundled with the plug-in.
Plug-in dependency check
Plug-in developers can declare dependencies between plug-ins. Dependency declarations can include the desired version ID and versions matching rules.
Strongly typed extension parameters
The plug-in manifest syntax provides a mechanism for declaring typed extension points parameters. This information is used by JPF when finding and loading extensions.
Lazy plug-in activation
Plug-in classes are loaded into memory only when they are actually needed. This feature is provided by specially designed Java class loaders instantiated for each plug-in.
"On the fly" plug-in registration and activation
Plug-ins can be "hot-registered" and even de-registered during application execution. What's more, registered plug-ins can be activated and deactivated "on the fly", minimizing runtime resource usage.

What can JPF bring to your Java project?

Plug-in component model
A JPF Plug-in is a component that has: a name (ID), a version identifier, code and/or other resources, a well-defined import interface, a well-defined export interface, and well-defined places where it can be extended (extension points). You can think of plug-ins as a module for your application.
Divide large applications into smaller, more manageable parts
Building applications as a set of independent, cooperating components is particularly useful when developing in teams.
Explicitly define the systems architecture
Plug-ins, prerequisites, extension points and extensions allow you to clearly define the architecture of your system in an easy-to-understand and standard way.
Make the application easily extendable
With extension points you can allow other developers to extend your application simply.
Documentation embedded into the system
This is more than javadoc. You can include documentation in the plug-in manifest and link it with any additional resources.
Tight control over application consistency
JPF's built-in integrity check keeps a close watch on your application's health, reducing maintenance costs.
Improved resource reuse
The JPF extension points mechanism lets you easily share your code and other resources among different applications.

Current version and status

The latest framework version is 1.0.2 for Java 2 and 1.5.1 for Java 5. It was released on May 19, 2007 and has been designated as production quality. The framework API is considered to be stable and "frozen". The runtime behavior of the framework has been reported as very stable (some projects using JPF have reported containing dozens and hundreds of plug-ins, see references).

If JPF starts successfully - it just works and works :)

Demo application

The best way to get a feel for JPF and how to use it is to look at the example modular application provided with JPF and try to write your own JPF plug-ins. This demo application is available from the JPF download page.

The demo application includes a "Plug-in Browser Tool" that may be useful to analyze the plug-in structure and dependencies.

Background

This project was inspired by and continues to be influenced by the Eclipse Platform - an open source Java IDE and "rich client" GUI applications platform.

The plug-in architecture used by Eclipse was taken as the basic model for JPF in early 2004. JPF is can be considered as an attempt to "decouple" the plug-in framework from Eclipse 2.x for use in any Java project. Note that although Eclipse plug-ins are visually very similar to JPF plug-ins, they are NOT compatible and thus can't be used together.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/boot.jxp0000644000175000017500000000510310536106574017651 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2006 Dmitry Olshansky // $Id$ %> <% include("/functions.ijxp"); printHeader("JPF Boot Library"); printMenu("boot"); %>

JPF Boot Library

Introduction

Running JPF based application is often routine and it might be quite tricky, especially for Java beginners. What application developer usually need to do to start (and stop) JPF based application?

  • load application configuration
  • collect available plug-ins
  • instantiate and initialize JPF runtime
  • publish (load) collected plug-ins
  • activate and "run" main plug-in
  • on application exit, properly shutdow Framework

As you can see, this is quite general and common procedure. All steps are usual and good formalized. So it is possible to write some library once and use it again and again for one particular purpose - load, configure and start application. That is the JPF Boot Library (and slightly more as usual :).

JPF Boot Library flow chart

Usage

The library packaged in separate JAR file jpf-boot.jar There are special entries placed in manifest of this file that tells JVM what other libraries required for this JAR (jpf.jar so far) and what class to start when running JAR - org.java.plugin.boot.Boot This simplifies library usage and allows to start application simply typing in command shell:

java -jar lib/jpf-boot.jar

Here is typical folders structure:

[APPLICATION_HOME_FOLDER]/
 +- lib/
 |   +- commons-logging.jar
 |   +- jpf.jar
 |   +- jpf-boot.jar
 |   +- log4j.jar
 +- plugins/
 +- boot.properties
 +- log4j.properties
 +- run.bat
 +- run.sh

Put your plug-ins in plugins folder and execute run script. All start up magic will be done by library.

You may remove log4j.jar and log4j.properties files if you don't need logging facilities. See JPF Boot Library javadoc for configuration options.

Look at JPF-Demo application to get working example of JPF Boot library usage.



<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/concepts.jxp0000644000175000017500000000660610536106574020535 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ // Updated by Michael Dawson 20/02/2006 %> <% include("/functions.ijxp"); printHeader("Concepts"); printMenu("concepts"); %>

Core JPF Concepts

Our Purpose

The goal of the JPF project is to help Java developers build modular and extensible applications. At JPF, we think it is important to clearly distinguish between the two.

Modules and Application Modularity

Simply speaking, modularization is splitting an application into several smaller parts. The JPF framework allows this by using the concept of plug-ins. This means you can think of plug-ins as a collection of classes and resources managed by special ClassLoader that makes them available to all dependent plug-ins transparently.

Lets say a plug-in PluginA introduces a class ClassA (this class is included in a plug-in directory hierarchy described by a JPF plug-in manifest). Now you are developing another plug-in, PluginB, and add another class, ClassB, to this plug-in. You want to reference ClassA in your ClassB code so you need to declare a plug-in dependency. You can do this by making an entry in the JPF manifest of the plug-in PluginB that says "PluginB depends on PluginA". This is done in the prerequisites/imports section of the JPF manifest. JPF handles finding and loading ClassA when it is first called. The magic lies in the ClassLoaders created by JPF. The extend the classpath of PluginB so that it includes the classpath of PluginA. So the developer doesn't have to worry about finding classes and can use the basic code that follows in ClassB:

	ClassA clsA = new ClassA();
	

No further work is necessary to make ClassA visible for ClassB code, only simple JPF manifest declarations.

Extensions and Application Extensibility

Simply speaking, application extensibility is adding on to already existing functionality. JPF supports this with special manifest declarations. In JPF extensibility is based on the concept of extension points and extensions. An extenstion point is an opening that may be added to by later code. An extension is code that adds onto an existing extension point. Typically extension points are declared in a plug-in manifest and supported with Java code There is no special dedicated API for such code in JPF as it can be anything! For examples of extension points see the JPF demo application.

When designing applications based on JPF it is better to think in terms of extension points and extensions rather than plug-ins. In general, it doesn't matter where (in what plug-in) the actual code and/or resources are placed. It is much more important to define where an application can be extended, and design and develop extension points to support this extensibility.

Summary

Plug-ins - are what makes an application modular. Extension points / extensions - are what makes application extensible.

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/jdocs/build.jxp0000644000175000017500000000406710536106574020015 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.onemind.jxp.*; import java.io.*; // Functions function void processFile(JxpProcessor processor, File baseFolder, File file, File outFolder) { println("Processing " + file + " to the folder " + outFolder); if (file.isDirectory()) { File newOutFolder = new File(outFolder, file.getName()); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { String name = files[i].getName(); if (!name.endsWith(".jxp") || name.endsWith(".ijxp")) { continue; } processFile(processor, baseFolder, files[i], newOutFolder); } return; } if (!outFolder.exists()) { outFolder.mkdirs(); } String fileName = file.getName(); fileName = fileName.substring(0, fileName.lastIndexOf('.')) + ".html"; Writer out = new OutputStreamWriter(new BufferedOutputStream( new FileOutputStream(new File(outFolder, fileName), false)), "UTF-8"); try { processor.process(file.getCanonicalPath().substring( baseFolder.getCanonicalPath().length()), new JxpProcessingContext(out, new HashMap())); } finally { out.close(); } } // Main control flow JxpProcessor processor = new JxpProcessor( jxp_context.getCurrentPage().getSource()); File inFolder = new File(jxp_context.getCurrentPage().getSource().getPathPrefix()); File outFolder = new File(System.getProperty("jdocs.outputFolder")); if (!outFolder.isDirectory()) { println("Output directory not found: " + outFolder.getCanonicalFile()); exit; } println("Processing files in folder: " + inFolder.getCanonicalFile()); println("Generating result to: " + outFolder.getCanonicalFile()); File[] files = inFolder.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].equals(outFolder)) { continue; } String name = files[i].getName(); if ((!name.endsWith(".jxp") || name.equals(jxp_script_name) || name.endsWith(".ijxp")) && !files[i].isDirectory()) { continue; } processFile(processor, inFolder, files[i], outFolder); } %>libjpf-java-1.5.1+dfsg.orig/jdocs/qa.jxp0000644000175000017500000002463410563410446017315 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2007 Dmitry Olshansky // $Id$ // Updated by Michael Dawson 26/01/2006 %> <% include("/functions.ijxp"); printHeader("Questions and Answers"); printMenu("qa"); %>

JPF Questions & Answers

Questions

What kind of applications can I develop with JPF?
Where can I get plug-ins for JPF?
Why is JPF's plug-in manifest format different from the one used by Eclipse?
Why isn't there a UI provided for plug-in management?
What are the system requirements and dependencies for JPF?
Is there a way of hot-deploying plug-ins?
Is it possible to package JPF plug-in into a single JAR file?
What is it useful to know about plug-ins and classloaders?

Ask a question, not listed here.


Answers

What kind of applications can I develop with JPF?

The short answer is: ANY type of Java application. We are currently testing JPF with different types of applications and some other projects are helping with this. The first project is a simple GUI application, developed using the Java Swing API. It is available for download as a JPF demo application. The next project is a web site and services platform aimed at providing web developers and site maintainers (administrators, managers, content editors) with powerful tools to run web applications and maintain them from remote sites (with an HTML based UI, for example). This project is currently under serious development and will be publicly released soon (hopefully sometime in 2006). This project especially demonstrates how JPF can be very useful in J2EE applications. The last project is in the early design stages and is an SWT library based GUI application. This project is used to test how well JPF deals with native libraries.

Where can I get plug-ins for JPF?

JPF plug-ins are dependent on the main application being developed. While with a few lines of code JPF can be used as an effective tool to dynamically add any Java library to any application, JPF itself does not provide plug-ins. It only provides the FRAMEWORK for developing your own. That said, you can have a look at the plug-ins that come with the demo application as an example to get you started.

Why is JPF's plug-in manifest format different from the one used by Eclipse?

Your right! Making the JPF plug-in manifest compatible with Eclipse's would be convenient from a developers point of view. But unfortunately it is not so easy to implement :( The Eclipse team is moving very fast and it seems that they are moving to a completely OSGI plug-in model and making "XML based" plug-ins deprecated.

We like the original idea as it is simple and easy to understand. JPF has added several things to Eclipse's plug-in concept to make it as open for extensions as possible. All manifest related APIs exist as a set of interfaces and can be implemented by custom code. JPF believes that it is possible to develop an Eclipse-compatible manifest implementation and provide it as an additional module.

Why isn't there a UI provided for plug-in management?

The UI is out of the framework scope. That is up to the applications that use JPF. JPF provides full information about plug-ins and runtime resources, to support application logic. Nevertheless, it may be possible that some functions, related to plug-in management, will be implemented as "tools" and be added to the JPF distribution package.

What are the system requirements and dependencies for JPF?

JPF requires a Java 1.3 compatible VM. It also uses the Jakarta Commons-logging library (included in the distribution package).

Is there a way of hot-deploying plug-ins?

It is possible from version 0.4 and up! To register/deregister plug-ins while the application is running, use publishPlugins method in the PluginManager class or register() and unregister() methods in the PluginRegistry interface. To activate/deactivate registered plug-ins use the activatePlugin() and deactivatePlugin() methods in PluginManager class.

Note though that correct working of "hot deploy" functionality is dependent on cooperation between JPF and all plug-ins. In general, it is impossible to "unload" any Java class being used by at least one other "active" class. So plug-in developers need to keep in mind this aspect of Java class loading when developing plug-ins. The Framework provides and handles all required "services" to correctly "initialize" and "un-initialize" plug-in classes as well as to inform them about any changes to the plug-in manager and registry.

Is it possible to package JPF plug-in into a single JAR file?

This is possible and not as difficult as it may seem. It can be done using the standard Java feature - "JAR URL" handler. Developers construct URL's that point to resources within a JAR file.

Note that not any plug-in can be packaged in such a way if you are using standard path resolver. The exceptions are plug-ins that contain other JAR's as libraries or native code libraries.

Starting from version 0.8 the "single file plug-ins" are fully supported by the various JPF tools. There is also a special Ant task to help building this type of plug-in and the JPF Boot Library was designed to support loading such plug-ins. If you need to load plug-ins manually (not using JPF Boot library) you may find it useful to use standard plug-in location implementation, it knows how to handle ZIP file or "plain folder style" plug-ins. Finally the special path resolver knows how to handle JAR'ed plug-ins even if they contain other JAR files or native libraries.

What is it useful to know about plug-ins and classloaders?

Generally speaking plug-in developers usually don't care how plug-ins management and classloading work. This might be useful to know for application core developers - those who implement base logic and core plug-ins.

JPF introduces concept of plug-ins and main part of this concept is classloaders isolation - each plug-in has it's own associated classloader that is responsible for managing resources of the plug-in (classes and other files). Plug-in's classloaders are organized in graph hierarchy that reflects dependencies between corresponding plug-ins.

The relations in classloaders hierarchy are used to delegate resource lookup requests from descendant classloader to ancestor one: first trying to load resource with current (this) classloader, next with ancestors and next with descendants (see reverse lookup mechanism bellow).

Java classloader API introduces another, it's own classloaders hierarchy - every classloader should have parent except bootstrap classloader that is root of this hierarchy. All plug-ins in JPF have system classloader as parent in Java API. This is the classloader that reflect your application CLASSPATH variable. By default, delegation in this hierarchy organized according to Java Language Specification - delegate loading request to parent classloader first and if this fails, try to load resource with this classloader using JPF hierarchy logic as described above. With special configuration parameter (see probeParentLoaderLast parameter on configuration reference page) JPF allows to reverse this delegation logic: try to load resource with this classloader first and if fails delegate to parent.

Another useful feature of JPF classloading is "reverse lookup". Describing inter plug-ins dependencies in prerequisites section of manifest (see manifest DTD for details) you may specify that your plug-in "pluginB" depends on "pluginA" allowing "reverse lookup". What this mark will affect on? When classloader of "pluginA" will search for a resource, it will not only delegate loading request to parent classloader as described above but also try classloader of "pluginB" and all "reverse lookup" plug-ins ("children" classloaders). This trick allows creating plug-ins that can see classes not only in it's own libraries but in any depending plug-in also.

For those who want to deep into classloading in Java it is recommended to look through the following resources:

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/license.txt0000644000175000017500000006342210536106574017254 0ustar gregoagregoaGNU Lesser General Public License Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it!libjpf-java-1.5.1+dfsg.orig/build.xml0000644000175000017500000002252010623623724016702 0ustar gregoagregoa Copyright © 2004-2007 Dmitry Olshansky. All Rights Reserved.]]> libjpf-java-1.5.1+dfsg.orig/source/0000755000175000017500000000000010514450012016343 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/0000755000175000017500000000000010514450012017132 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/0000755000175000017500000000000010514450012020053 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/0000755000175000017500000000000010541226136021361 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/PathResolver.java0000644000175000017500000000604210552463620024647 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; import java.net.URL; import org.java.plugin.registry.Identity; import org.java.plugin.util.ExtendedProperties; /** * This interface is intended to establish correspondence between relative path * and absolute URL in context of plug-in or plug-in fragment. * * @see org.java.plugin.ObjectFactory#createPathResolver() * * @version $Id$ */ public interface PathResolver { /** * Configures this resolver instance. Usually this method is called from * {@link ObjectFactory object factory} implementation. * @param config path resolver configuration data * @throws Exception if any error has occurred */ void configure(ExtendedProperties config) throws Exception; /** * Registers "home" URL for given plug-in element. * @param idt plug-in element * @param url "home" URL for a given plug-in element */ void registerContext(Identity idt, URL url); /** * Unregisters plug-in element from this path resolver. * @param id plug-in element identifier */ void unregisterContext(String id); /** * Returns URL of {@link #registerContext(Identity, URL) registered} plug-in * element context. If context for plug-in element with given ID not * registered, this method should throw an {@link IllegalArgumentException}. * In other words, this method shouldn't return null. * @param id plug-in element identifier * @return registered context "home" location */ URL getRegisteredContext(String id); /** * @param id plug-in element identifier * @return true if context for plug-in element with given ID * registered */ boolean isContextRegistered(String id); /** * Should resolve given path to URL for a given identity. * @param identity plug-in element for which to resolve path * @param path path to be resolved * @return resolved absolute URL */ URL resolvePath(Identity identity, String path); }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/0000755000175000017500000000000010612737270022343 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/Resources_ru.properties0000644000175000017500000000354710541226144027144 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky # $Id$ # Exceptions related messages notAFile = \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b, \u043d\u043e {0} \u0444\u0430\u0439\u043b\u043e\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f isFolder = \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b, \u043d\u043e {0} \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 notAFolder = \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043d\u043e {0} \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f isFile = \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043d\u043e {0} \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c cantMakeFolder = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e {0} file2urlFailed = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0444\u0430\u0439\u043b\u0430 {0} \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 URL, \u043e\u0448\u0438\u0431\u043a\u0430 - {1} cantDeleteFile = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0430\u0439\u043b {0} cantEmptyFolder = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e {0} libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/package.html0000644000175000017500000000013510514424204024612 0ustar gregoagregoa

This package contains miscellaneous utility classes.

libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/Resources.properties0000644000175000017500000000102210541226144026420 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky # $Id$ # Exceptions related messages notAFile = file expected, but {0} is not a file isFolder = file expected, but {0} denotes a directory notAFolder = directory expected, but {0} is not a directory isFile = directory expected, but {0} denotes a file cantMakeFolder = can't create directory {0} file2urlFailed = failed converting file {0} to an URL, error - {1} cantDeleteFile = can't delete file {0} cantEmptyFolder = can't empty folder {0}libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/ResourceManager.java0000644000175000017500000001443510541226144026271 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.util; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * Utility class to manage localization resources. This class is not for public * usage but mainly for custom implementations developers to provide them * uniform access and organization of locale specific data. *
* Class usage is very simple. Put your locale sensible data into * Resources.properties files and save them near classes that you * are going to get localized. For {@link java.util.Locale} to file mapping * details see {@link ResourceBundle} documentation. * * @version $Id$ */ public final class ResourceManager { private static final Object FAKE_BUNDLE = new Object(); private static final Map bundles = Collections.synchronizedMap(new HashMap()); /** * @param packageName package name, used for * Resources.properties file look-up * @param messageKey message key * @return message for {@link Locale#getDefault() default locale} */ public static String getMessage(final String packageName, final String messageKey) { return getMessage(packageName, messageKey, Locale.getDefault(), null); } /** * @param packageName package name, used for * Resources.properties file look-up * @param messageKey message key * @param data data for parameter placeholders substitution, may be * Object, array or * Collection. * @return message for {@link Locale#getDefault() default locale} */ public static String getMessage(final String packageName, final String messageKey, final Object data) { return getMessage(packageName, messageKey, Locale.getDefault(), data); } /** * @param packageName package name, used for * Resources.properties file look-up * @param messageKey message key * @param locale locale to get message for * @return message for given locale */ public static String getMessage(final String packageName, final String messageKey, final Locale locale) { return getMessage(packageName, messageKey, locale, null); } /** * @param packageName package name, used for * Resources.properties file look-up * @param messageKey message key * @param locale locale to get message for * @param data data for parameter placeholders substitution, may be * Object, array or * Collection. * @return message for given locale */ public static String getMessage(final String packageName, final String messageKey, final Locale locale, final Object data) { Object obj = bundles.get(packageName + '|' + locale); if (obj == null) { try { obj = ResourceBundle.getBundle(packageName + ".Resources", //$NON-NLS-1$ locale); } catch (MissingResourceException mre) { obj = FAKE_BUNDLE; } bundles.put(packageName + '|' + locale, obj); } if (obj == FAKE_BUNDLE) { return "resource " + packageName + '.' + messageKey //$NON-NLS-1$ + " not found for locale " + locale; //$NON-NLS-1$ } try { String result = ((ResourceBundle) obj).getString(messageKey); return (data == null) ? result : processParams(result, data); } catch (MissingResourceException mre) { return "resource " + packageName + '.' + messageKey //$NON-NLS-1$ + " not found for locale " + locale; //$NON-NLS-1$ } } private static String processParams(final String str, final Object data) { String result = str; if ((data != null) && data.getClass().isArray()) { Object[] params = (Object[])data; for (int i = 0; i < params.length; i++) { result = replaceAll(result, "{" + i + "}", "" + params[i]); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } else if (data instanceof Collection) { int i = 0; for (Object object : (Collection) data) { result = replaceAll(result, "{" + i++ + "}", "" + object); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } else { result = replaceAll(result, "{0}", "" + data); //$NON-NLS-1$ //$NON-NLS-2$ } return result; } private static String replaceAll(final String str, final String from, final String to) { String result = str; int p = 0; while (true) { p = result.indexOf(from, p); if (p == -1) { break; } result = result.substring(0, p) + to + result.substring(p + from.length()); p += to.length(); } return result; } private ResourceManager() { // no-op } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/Resources_de.properties0000644000175000017500000000124510612737644027112 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky # German Translation (C) 2007 Stefan Rado # $Id: Resources_de.properties,v 1.1 2007/04/22 18:03:47 ddimon Exp $ # Exceptions notAFile = Datei erwartet, aber {0} ist keine Datei isFolder = Datei erwartet, aber {0} ist ein Verzeichnis notAFolder = Verzeichnis erwartet, aber {0} ist kein Verzeichnis isFile = Verzeichnis erwartet, aber {0} ist eine Datei cantMakeFolder = Kann Verzeichnis {0} nicht erzeugen file2urlFailed = Kann Datei {0} nicht in eine URL konvertieren, Fehler - {1} cantDeleteFile = Kann Datei {0} nicht l\u00f6schen cantEmptyFolder = Kann Verzeichnis {0} nicht leeren libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/ExtendedProperties.java0000644000175000017500000001150210554437162027024 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.util; import java.util.Properties; /** * This implementation supports parameters substitution in property value. * @see #getProperty(String) * @version $Id$ */ public class ExtendedProperties extends Properties { private static final long serialVersionUID = 8904709563073950956L; /** * @see java.util.Properties#Properties() */ public ExtendedProperties() { super(); } /** * @see java.util.Properties#Properties(java.util.Properties) */ public ExtendedProperties(Properties defs) { super(defs); } /** * Any parameter like ${propertyName} in property value will * be replaced with the value of property with name * propertyName. *

For example, for the following set of * properties: *

     * param1=abcd
     * param2=efgh
     * param3=Alphabet starts with: ${param1}${param2}
     * 
* The call props.getProperty("param3") returns: *
Alphabet starts with: abcdefgh
* Note also that call props.get("param3") returns: *
Alphabet starts with: ${param1}${param2}
* So the {@link java.util.Map#get(java.lang.Object)} works as usual and * returns raw (not expanded with substituted parameters) property value. *

* @see java.util.Properties#getProperty(java.lang.String) */ @Override public String getProperty(String key) { String result = super.getProperty(key); return (result == null) ? null : expandValue(result); } /** * @see java.util.Properties#getProperty(java.lang.String, java.lang.String) */ @Override public String getProperty(String key, String defaultValue) { String result = getProperty(key); return (result == null) ? expandValue(defaultValue) : result; } /** * @param prefix string, each property key should start with (this prefix * will NOT be included into new key) * @return sub-properties */ public ExtendedProperties getSubset(final String prefix) { return getSubset(prefix, ""); //$NON-NLS-1$ } /** * @param prefix string, each property key should start with * @param newPrefix new prefix to be added to each key instead of existing * prefix * @return sub-properties */ public ExtendedProperties getSubset(final String prefix, final String newPrefix) { ExtendedProperties result = new ExtendedProperties(); for (Object object : keySet()) { String key = object.toString(); if (!key.startsWith(prefix) || key.equals(prefix)) { continue; } result.put(key.substring(prefix.length()) + newPrefix, getProperty(key)); } return result; } private String expandValue(final String value) { if ((value == null) || (value.length() < 4)) { return value; } StringBuilder result = new StringBuilder(value.length()); result.append(value); int p1 = result.indexOf("${"); //$NON-NLS-1$ int p2 = result.indexOf("}", p1 + 2); //$NON-NLS-1$ while ((p1 >= 0) && (p2 > p1)) { String paramName = result.substring(p1 + 2, p2); String paramValue = getProperty(paramName); if (paramValue != null) { result.replace(p1, p2 + 1, paramValue); p1 += paramValue.length(); } else { p1 = p2 + 1; } p1 = result.indexOf("${", p1); //$NON-NLS-1$ p2 = result.indexOf("}", p1 + 2); //$NON-NLS-1$ } return result.toString(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/util/IoUtil.java0000644000175000017500000004667510611221210024412 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.jar.JarFile; import java.util.zip.ZipEntry; /** * Input/Output, File and URL/URI related utilities. * * @version $Id: IoUtil.java,v 1.9 2007/04/17 17:39:52 ddimon Exp $ */ public final class IoUtil { private static final String PACKAGE_NAME = "org.java.plugin.util"; //$NON-NLS-1$ /** * Copies one file, existing file will be overridden. * @param src source file to copy FROM * @param dest destination file to copy TO * @throws IOException if any I/O error has occurred */ public static void copyFile(final File src, final File dest) throws IOException { if (!src.isFile()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "notAFile", src)); //$NON-NLS-1$ } if (dest.isDirectory()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "isFolder", dest)); //$NON-NLS-1$ } BufferedInputStream in = new BufferedInputStream( new FileInputStream(src)); try { BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(dest, false)); try { copyStream(in, out, 1024); } finally { out.close(); } } finally { in.close(); } dest.setLastModified(src.lastModified()); } /** * Copies folder recursively, existing files will be overridden * @param src source folder * @param dest target folder * @throws IOException if any I/O error has occurred */ public static void copyFolder(final File src, final File dest) throws IOException { copyFolder(src, dest, true, false, null); } /** * Copies folder, existing files will be overridden * @param src source folder * @param dest target folder * @param recursive if true, processes folder recursively * @throws IOException if any I/O error has occurred */ public static void copyFolder(final File src, final File dest, final boolean recursive) throws IOException { copyFolder(src, dest, recursive, false, null); } /** * Copies folder. * @param src source folder * @param dest target folder * @param recursive if true, processes folder recursively * @param onlyNew if true, target file will be overridden if it * is older than source file only * @throws IOException if any I/O error has occurred */ public static void copyFolder(final File src, final File dest, final boolean recursive, final boolean onlyNew) throws IOException { copyFolder(src, dest, recursive, onlyNew, null); } /** * Copies folder. * @param src source folder * @param dest target folder * @param recursive if true, processes folder recursively * @param onlyNew if true, target file will be overridden if it * is older than source file only * @param filter file filter, optional, if null all files will * be copied * @throws IOException if any I/O error has occurred */ public static void copyFolder(final File src, final File dest, final boolean recursive, final boolean onlyNew, final FileFilter filter) throws IOException { if (!src.isDirectory()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "notAFolder", src)); //$NON-NLS-1$ } if (dest.isFile()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "isFile", dest)); //$NON-NLS-1$ } if (!dest.exists() && !dest.mkdirs()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "cantMakeFolder", dest)); //$NON-NLS-1$ } File[] srcFiles = (filter != null) ? src.listFiles(filter) : src.listFiles(); for (int i = 0; i < srcFiles.length; i++) { File file = srcFiles[i]; if (file.isDirectory()) { if (recursive) { copyFolder(file, new File(dest, file.getName()), recursive, onlyNew, filter); } continue; } File destFile = new File(dest, file.getName()); if (onlyNew && destFile.isFile() && (destFile.lastModified() > file.lastModified())) { continue; } copyFile(file, destFile); } dest.setLastModified(src.lastModified()); } /** * Copies streams. * @param in source stream * @param out destination stream * @param bufferSize buffer size to use * @throws IOException if any I/O error has occurred */ public static void copyStream(final InputStream in, final OutputStream out, final int bufferSize) throws IOException { byte[] buf = new byte[bufferSize]; int len; while ((len = in.read(buf)) != -1) { out.write(buf, 0, len); } } /** * Recursively deletes whole content of the given folder. * @param folder folder to be emptied * @return true if given folder becomes empty or not exists */ public static boolean emptyFolder(final File folder) { if (!folder.isDirectory()) { return true; } File[] files = folder.listFiles(); boolean result = true; for (File file : files) { if (file.isDirectory()) { if (emptyFolder(file)) { result &= file.delete(); } else { result = false; } } else { result &= file.delete(); } } return result; } /** * Compares two files for directories/files synchronization purposes. * @param file1 one file to compare * @param file2 another file to compare * @return true if file names are equal (case sensitive), files * have equal lengths and modification dates (milliseconds ignored) * * @see #synchronizeFolders(File, File) * @see #compareFileDates(Date, Date) */ public static boolean compareFiles(final File file1, final File file2) { if (!file1.isFile() || !file2.isFile()) { return false; } if (!file1.getName().equals(file2.getName())) { return false; } if (file1.length() != file2.length()) { return false; } return compareFileDates(new Date(file1.lastModified()), new Date(file2.lastModified())); } /** * For some reason modification milliseconds for some files are unstable, * use this function to compare file dates ignoring milliseconds. * @param date1 first file modification date * @param date2 second file modification date * @return true if files modification dates are equal ignoring * milliseconds */ public static boolean compareFileDates(final Date date1, final Date date2) { if ((date1 == null) || (date2 == null)) { return false; } Calendar cldr = Calendar.getInstance(Locale.ENGLISH); cldr.setTime(date1); cldr.set(Calendar.MILLISECOND, 0); long dt1 = cldr.getTimeInMillis(); cldr.setTime(date2); cldr.set(Calendar.MILLISECOND, 0); long dt2 = cldr.getTimeInMillis(); return dt1 == dt2; } /** * Performs one-way directories synchronization comparing files only, * not folders. * @param src source folder * @param dest target folder * @throws IOException if any I/O error has occurred * * @see #synchronizeFolders(File, File, FileFilter) * @see #compareFiles(File, File) */ public static void synchronizeFolders(final File src, final File dest) throws IOException { synchronizeFolders(src, dest, null); } /** * Performs one-way directories synchronization comparing files only, * not folders. * @param src source folder * @param dest target folder * @param filter file filter, optional, if null all files will * be included into synchronization process * @throws IOException if any I/O error has occurred * * @see #compareFiles(File, File) */ public static void synchronizeFolders(final File src, final File dest, final FileFilter filter) throws IOException { if (!src.isDirectory()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "notAFolder", src)); //$NON-NLS-1$ } if (dest.isFile()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "isFile", dest)); //$NON-NLS-1$ } if (!dest.exists() && !dest.mkdirs()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "cantMakeFolder", dest)); //$NON-NLS-1$ } File[] srcFiles = (filter != null) ? src.listFiles(filter) : src.listFiles(); for (File srcFile : srcFiles) { File destFile = new File(dest, srcFile.getName()); if (srcFile.isDirectory()) { if (destFile.isFile() && !destFile.delete()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "cantDeleteFile", destFile)); //$NON-NLS-1$ } synchronizeFolders(srcFile, destFile, filter); continue; } if (compareFiles(srcFile, destFile)) { continue; } copyFile(srcFile, destFile); } File[] destFiles = dest.listFiles(); for (int i = 0; i < destFiles.length; i++) { File destFile = destFiles[i]; File srcFile = new File(src, destFile.getName()); if (((filter != null) && filter.accept(destFile) && srcFile.exists()) || ((filter == null) && srcFile.exists())) { continue; } if (destFile.isDirectory() && !emptyFolder(destFile)) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "cantEmptyFolder", destFile)); //$NON-NLS-1$ } if (!destFile.delete()) { throw new IOException( ResourceManager.getMessage(PACKAGE_NAME, "cantDeleteFile", destFile)); //$NON-NLS-1$ } } dest.setLastModified(src.lastModified()); } /** * Checks if resource exist and can be opened. * @param url absolute URL which points to a resource to be checked * @return true if given URL points to an existing resource */ public static boolean isResourceExists(final URL url) { File file = url2file(url); if (file != null) { return file.canRead(); } if ("jar".equalsIgnoreCase(url.getProtocol())) { //$NON-NLS-1$ return isJarResourceExists(url); } return isUrlResourceExists(url); } private static boolean isUrlResourceExists(final URL url) { try { //url.openConnection().connect(); // Patch from Sebastian Kopsan InputStream is = url.openStream(); try { is.close(); } catch (IOException ioe) { // ignore } return true; } catch (IOException ioe) { return false; } } private static boolean isJarResourceExists(final URL url) { try { String urlStr = url.toExternalForm(); int p = urlStr.indexOf("!/"); //$NON-NLS-1$ if (p == -1) {// this is invalid JAR file URL return false; } URL fileUrl = new URL(urlStr.substring(4, p)); File file = url2file(fileUrl); if (file == null) {// this is non-local JAR file URL return isUrlResourceExists(url); } if (!file.canRead()) { return false; } if (p == urlStr.length() - 2) {// URL points to the root entry of JAR file return true; } JarFile jarFile = new JarFile(file); try { return jarFile.getEntry(urlStr.substring(p + 2)) != null; } finally { jarFile.close(); } } catch (IOException ioe) { return false; } } /** * Opens input stream for given resource. This method behaves differently * for different URL types: *
    *
  • for local files it returns buffered file input stream;
  • *
  • for local JAR files it reads resource content into memory * buffer and returns byte array input stream that wraps those * buffer (this prevents locking JAR file);
  • *
  • for common URL's this method simply opens stream to that URL * using standard URL API.
  • *
* It is not recommended to use this method for big resources within JAR * files. * @param url resource URL * @return input stream for given resource * @throws IOException if any I/O error has occurred */ public static InputStream getResourceInputStream(final URL url) throws IOException { File file = url2file(url); if (file != null) { return new BufferedInputStream(new FileInputStream(file)); } if (!"jar".equalsIgnoreCase(url.getProtocol())) { //$NON-NLS-1$ return url.openStream(); } String urlStr = url.toExternalForm(); if (urlStr.endsWith("!/")) { //$NON-NLS-1$ //JAR URL points to a root entry throw new FileNotFoundException(url.toExternalForm()); } int p = urlStr.indexOf("!/"); //$NON-NLS-1$ if (p == -1) { throw new MalformedURLException(url.toExternalForm()); } String path = urlStr.substring(p + 2); file = url2file(new URL(urlStr.substring(4, p))); if (file == null) {// non-local JAR file URL return url.openStream(); } JarFile jarFile = new JarFile(file); try { ZipEntry entry = jarFile.getEntry(path); if (entry == null) { throw new FileNotFoundException(url.toExternalForm()); } InputStream in = jarFile.getInputStream(entry); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); copyStream(in, out, 1024); return new ByteArrayInputStream(out.toByteArray()); } finally { in.close(); } } finally { jarFile.close(); } } /** * Utility method to convert local URL to a {@link File} object. * @param url an URL * @return file object for given URL or null if URL is not * local */ @SuppressWarnings("deprecation") public static File url2file(final URL url) { String prot = url.getProtocol(); if ("jar".equalsIgnoreCase(prot)) { //$NON-NLS-1$ if (url.getFile().endsWith("!/")) { //$NON-NLS-1$ String urlStr = url.toExternalForm(); try { return url2file( new URL(urlStr.substring(4, urlStr.length() - 2))); } catch (MalformedURLException mue) { // ignore } } return null; } if (!"file".equalsIgnoreCase(prot)) { //$NON-NLS-1$ return null; } try { // Method URL.toURI() may produce URISyntaxException for some // "valid" URL's that contain spaces or other "illegal" characters. //return new File(url.toURI()); return new File(URLDecoder.decode(url.getFile(), "UTF-8")); //$NON-NLS-1$ } catch (UnsupportedEncodingException e) { return new File(URLDecoder.decode(url.getFile())); } } /** * Utility method to convert a {@link File} object to a local URL. * @param file a file object * @return absolute URL that points to the given file * @throws MalformedURLException if file can't be represented as URL for * some reason */ public static URL file2url(final File file) throws MalformedURLException { try { return file.getCanonicalFile().toURI().toURL(); } catch (MalformedURLException mue) { throw mue; } catch (IOException ioe) { throw new MalformedURLException( ResourceManager.getMessage(PACKAGE_NAME, "file2urlFailed", //$NON-NLS-1$ new Object[] {file, ioe})); } } private IoUtil() { // no-op } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/Plugin.java0000644000175000017500000001030210552762554023471 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.registry.PluginDescriptor; /** * This is base for "home" class of plug-in runtime. Using this class, * plug-in code can get access to plug-in framework * ({@link org.java.plugin.PluginManager manager}, * {@link org.java.plugin.registry.PluginRegistry registry}) which was loaded it. * It is also used by manager during plug-in life cycle management (activation * and deactivation). *
* Plug-in vendor may provide it's own implementation of this class if some * actions should be performed during plug-in activation/deactivation. When no * class specified, framework provides default "empty" implementation that does * nothing when plug-in started and stopped. * @version $Id$ */ public abstract class Plugin { /** * Makes logging service available for descending classes. */ protected final Log log = LogFactory.getLog(getClass()); private PluginManager manager; private PluginDescriptor descriptor; private boolean started; /** * @return descriptor of this plug-in */ public final PluginDescriptor getDescriptor() { return descriptor; } /* * For internal use only! */ final void setDescriptor(final PluginDescriptor descr) { this.descriptor = descr; } /** * @return manager which controls this plug-in */ public final PluginManager getManager() { return manager; } /* * For internal use only! */ final void setManager(final PluginManager aManager) { this.manager = aManager; } /* * For internal use only! */ final void start() throws Exception { if (!started) { doStart(); started = true; } } /* * For internal use only! */ final void stop() throws Exception { if (started) { doStop(); started = false; } } /** * @return true if this plug-in is in active state */ public final boolean isActive() { return started; } /** * This method will be called once during plug-in activation before any * access to any code from this plug-in. * @throws Exception if an error has occurred during plug-in start-up */ protected abstract void doStart() throws Exception; /** * This method will be called once during plug-in deactivation. After * this method call, no other code from this plug-in can be accessed, * unless {@link #doStart()} method will be called again (but for another * instance of this class). * @throws Exception if an error has occurred during plug-in shutdown */ protected abstract void doStop() throws Exception; /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{" + getClass().getName() //$NON-NLS-1$ + ": manager=" + manager //$NON-NLS-1$ + ", descriptor=" + descriptor //$NON-NLS-1$ + "}"; //$NON-NLS-1$ } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/package.html0000644000175000017500000000313410552463526023653 0ustar gregoagregoa

This package contains framework runtime API.

The JPF consists of three major parts:

  • {@link org.java.plugin.registry.PluginRegistry Plug-in registry} - the storage for meta information about all discovered plug-ins
  • {@link org.java.plugin.PathResolver Path resolver} - the component, which knows all about where things are physically located
  • {@link org.java.plugin.PluginManager Plug-in manager} - the framework runtime that loads and activates plug-ins

Plug-in registry is a set of interfaces that abstract whole meta information about plug-ins and plug-in fragments. The framework provides standard implementation for these interfaces that is based on concept of plug-in manifest as a special XML syntax file, created according to plug-in DTD. But in any case, the general rule is that manifest should be registered with plug-in registry for every plug-in and plug-in fragment.

The framework also provides standard implementation of path resolver, which just maps plug-in manifests to context ("home") folder of corresponding plug-ins.

To get instances of any base Framework classes, use special {@link org.java.plugin.ObjectFactory factory class} that knows what implementation classes to load for plug-in registry, manager and path resolver. For example, you can get instance of plug-in manager just in one {@link org.java.plugin.ObjectFactory#createManager() method call}. This makes usage of JPF very simple in most situations.

libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/ObjectFactory.java0000644000175000017500000002722510552762432025000 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.standard.StandardObjectFactory; import org.java.plugin.util.ExtendedProperties; import org.java.plugin.util.IoUtil; /** * Factory class to help creating base Framework objects: plug-in registry, path * resolver and plug-in manager. * * @version $Id$ */ public abstract class ObjectFactory { /** * Creates and configures new instance of object factory. * * @return configured instance of object factory * * @see #newInstance(ExtendedProperties) */ public static ObjectFactory newInstance() { return newInstance(null); } /** * Creates and configures new instance of object factory. Factory * implementation class discovery procedure is following: *
    *
  • Use the org.java.plugin.ObjectFactory property from * the given properties collection (if it is provided).
  • *
  • Use the org.java.plugin.ObjectFactory system * property.
  • *
  • Use the properties file "jpf.properties" in the JRE "lib" directory * or in the CLASSPATH. This configuration file is in standard * java.util.Properties format and contains among others the * fully qualified name of the implementation class with the key being the * system property defined above.
  • *
  • Use the Services API (as detailed in the JAR specification), if * available, to determine the class name. The Services API will look for a * class name in the file * META-INF/services/org.java.plugin.ObjectFactory in jars * available to the runtime.
  • *
  • Framework default ObjectFactory implementation.
  • *
* * @param config * factory configuration data, may be null * @return configured instance of object factory */ public static ObjectFactory newInstance(final ExtendedProperties config) { Log log = LogFactory.getLog(ObjectFactory.class); ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl == null) { cl = ObjectFactory.class.getClassLoader(); } ExtendedProperties props; if (config != null) { props = config; } else { props = loadProperties(cl); } String className = findProperty(cl, props); ObjectFactory result; try { if (className == null) { className = "org.java.plugin.standard.StandardObjectFactory"; //$NON-NLS-1$ } result = (ObjectFactory) loadClass(cl, className).newInstance(); } catch (ClassNotFoundException cnfe) { log.fatal("failed instantiating object factory " //$NON-NLS-1$ + className, cnfe); throw new Error("failed instantiating object factory " //$NON-NLS-1$ + className, cnfe); } catch (IllegalAccessException iae) { log.fatal("failed instantiating object factory " //$NON-NLS-1$ + className, iae); throw new Error("failed instantiating object factory " //$NON-NLS-1$ + className, iae); } catch (SecurityException se) { log.fatal("failed instantiating object factory " //$NON-NLS-1$ + className, se); throw new Error("failed instantiating object factory " //$NON-NLS-1$ + className, se); } catch (InstantiationException ie) { log.fatal("failed instantiating object factory " //$NON-NLS-1$ + className, ie); throw new Error("failed instantiating object factory " //$NON-NLS-1$ + className, ie); } result.configure(props); log.debug("object factory instance created - " + result); //$NON-NLS-1$ return result; } private static Class loadClass(final ClassLoader cl, final String className) throws ClassNotFoundException { if (cl != null) { try { return cl.loadClass(className); } catch (ClassNotFoundException cnfe) { // ignore } } ClassLoader cl2 = ObjectFactory.class.getClassLoader(); if (cl2 != null) { try { return cl2.loadClass(className); } catch (ClassNotFoundException cnfe) { // ignore } } return ClassLoader.getSystemClassLoader().loadClass(className); } private static ExtendedProperties loadProperties(final ClassLoader cl) { Log log = LogFactory.getLog(ObjectFactory.class); File file = new File(System.getProperty("java.home") //$NON-NLS-1$ + File.separator + "lib" + File.separator //$NON-NLS-1$ + "jpf.properties"); //$NON-NLS-1$ URL url = null; if (file.canRead()) { try { url = IoUtil.file2url(file); } catch (MalformedURLException mue) { log.error("failed converting file " + file //$NON-NLS-1$ + " to URL", mue); //$NON-NLS-1$ } } if (url == null) { if (cl != null) { url = cl.getResource("jpf.properties"); //$NON-NLS-1$ if (url == null) { url = ClassLoader.getSystemResource("jpf.properties"); //$NON-NLS-1$ } } else { url = ClassLoader.getSystemResource("jpf.properties"); //$NON-NLS-1$ } if (url == null) { log.debug("no jpf.properties file found in ${java.home}/lib (" //$NON-NLS-1$ + file + ") nor in CLASSPATH, using standard properties"); //$NON-NLS-1$ url = StandardObjectFactory.class.getResource("jpf.properties"); //$NON-NLS-1$ } } try { InputStream strm = IoUtil.getResourceInputStream(url); try { ExtendedProperties props = new ExtendedProperties(); props.load(strm); log.debug("loaded jpf.properties from " + url); //$NON-NLS-1$ return props; } finally { try { strm.close(); } catch (IOException ioe) { // ignore } } } catch (Exception e) { log.error("failed loading jpf.properties from CLASSPATH", //$NON-NLS-1$ e); } return null; } private static String findProperty(final ClassLoader cl, final ExtendedProperties props) { Log log = LogFactory.getLog(ObjectFactory.class); String name = ObjectFactory.class.getName(); String result = System.getProperty(name); if (result != null) { log.debug("property " + name //$NON-NLS-1$ + " found as system property"); //$NON-NLS-1$ return result; } if (props != null) { result = props.getProperty(name); if (result != null) { log.debug("property " + name //$NON-NLS-1$ + " found in properties file"); //$NON-NLS-1$ return result; } } String serviceId = "META-INF/services/" //$NON-NLS-1$ + ObjectFactory.class.getName(); InputStream strm; if (cl == null) { strm = ClassLoader.getSystemResourceAsStream(serviceId); } else { strm = cl.getResourceAsStream(serviceId); } if (strm != null) { try { BufferedReader reader = new BufferedReader( new InputStreamReader(strm, "UTF-8")); //$NON-NLS-1$ try { result = reader.readLine(); } finally { try { reader.close(); } catch (IOException ioe) { // ignore } } } catch (IOException ioe) { try { strm.close(); } catch (IOException ioe2) { // ignore } } } if (result != null) { log.debug("property " + name //$NON-NLS-1$ + " found as service"); //$NON-NLS-1$ return result; } log.debug("no property " + name //$NON-NLS-1$ + " found"); //$NON-NLS-1$ return result; } /** * Configures this factory instance. This method is called from * {@link #newInstance(ExtendedProperties)}. * * @param config * factory configuration data, may be null */ protected abstract void configure(ExtendedProperties config); /** * Creates new instance of plug-in manager using new instances of registry * and path resolver. * * @return new plug-in manager instance * * @see #createRegistry() * @see #createPathResolver() */ public final PluginManager createManager() { return createManager(createRegistry(), createPathResolver()); } /** * Creates new instance of plug-in manager. * * @param registry * @param pathResolver * @return new plug-in manager instance */ public abstract PluginManager createManager(PluginRegistry registry, PathResolver pathResolver); /** * Creates new instance of plug-in registry implementation class using * standard discovery algorithm to determine which registry implementation * class should be instantiated. * * @return new registry instance */ public abstract PluginRegistry createRegistry(); /** * Creates new instance of path resolver implementation class using standard * discovery algorithm to determine which resolver implementation class * should be instantiated. * * @return new path resolver instance */ public abstract PathResolver createPathResolver(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/PluginManager.java0000644000175000017500000003774110605726706025002 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Map; import org.java.plugin.registry.Identity; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginRegistry; /** * JPF "runtime" class - the entry point to the framework API. It is expected * that only one instance of this class will be created per application (other * scenarios may be possible but not tested). *

* Usage example. Somewhere in the beginning of your application: * *

 * manager = factory.createManager();
 * manager.publishPlugins(getLocations(dir));
 * 
* * Later on, before accessing plug-in: * *
 * manager.activatePlugin(pluginId);
 * 
* * @see org.java.plugin.ObjectFactory#createManager() * * @version $Id: PluginManager.java,v 1.5 2007/04/07 12:42:14 ddimon Exp $ */ public abstract class PluginManager { /** * JPF version number. */ //NB: don't forget to update version number with new release public static final String VERSION = "1.5.1"; //$NON-NLS-1$ /** * JPF version system property name. */ public static final String VERSION_PROPERTY = "org.java.plugin.jpf-version"; //$NON-NLS-1$ static { try { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { System.setProperty(VERSION_PROPERTY, VERSION); return null; } }); } catch (SecurityException se) { // ignore } } /** * Looks for plug-in manager instance for given object. * * @param obj * any object that may be managed by some plug-in manager * @return plug-in manager instance or null if given object * doesn't belong to any plug-in (possibly it is part of "host" * application) and thus doesn't managed by the Framework directly * or indirectly. */ public static PluginManager lookup(final Object obj) { if (obj == null) { return null; } ClassLoader clsLoader; if (obj instanceof Plugin) { return ((Plugin) obj).getManager(); } else if (obj instanceof Class) { clsLoader = ((Class) obj).getClassLoader(); } else if (obj instanceof ClassLoader) { clsLoader = (ClassLoader) obj; } else { clsLoader = obj.getClass().getClassLoader(); } if (!(clsLoader instanceof PluginClassLoader)) { return lookup(clsLoader.getParent()); } return ((PluginClassLoader) clsLoader).getPluginManager(); } /** * @return registry, used by this manager */ public abstract PluginRegistry getRegistry(); /** * @return path resolver */ public abstract PathResolver getPathResolver(); /** * Registers plug-ins and their locations with this plug-in manager. You * should use this method to register new plug-ins to make them available * for activation with this manager instance (compare this to * {@link PluginRegistry#register(URL[])} method that just makes plug-in's * meta-data available for reading and doesn't "know" where are things * actually located). *

* Note that this method only load plug-ins to this manager but not activate * them. Call {@link #activatePlugin(String)} method to make plug-in * activated. It is recommended to do this immediately before first plug-in * use. * * @param locations * plug-in locations data * @return map where keys are manifest URL's and values are registered * plug-ins or plug-in fragments, URL's for unprocessed manifests * are not included * @throws JpfException * if given plug-ins can't be registered or published (optional * behavior) * * @see org.java.plugin.registry.PluginDescriptor * @see org.java.plugin.registry.PluginFragment */ public abstract Map publishPlugins( final PluginLocation[] locations) throws JpfException; /** * Looks for plug-in with given ID and activates it if it is not activated * yet. Note that this method will never return null. * * @param id * plug-in ID * @return found plug-in * @throws PluginLifecycleException * if plug-in can't be found or activated */ public abstract Plugin getPlugin(final String id) throws PluginLifecycleException; /** * Activates plug-in with given ID if it is not activated yet. Actually this * makes plug-in "running" and calls {@link Plugin#doStart()} method. This * method will effectively activate all depending plug-ins. It is safe to * call this method more than once. * * @param id * plug-in ID * @throws PluginLifecycleException * if plug-in can't be found or activated */ public abstract void activatePlugin(final String id) throws PluginLifecycleException; /** * Looks for plug-in, given object belongs to. * * @param obj * any object that maybe belongs to some plug-in * @return plug-in or null if given object doesn't belong to * any plug-in (possibly it is part of "host" application) and thus * doesn't managed by the Framework directly or indirectly */ public abstract Plugin getPluginFor(final Object obj); /** * @param descr * plug-in descriptor * @return true if plug-in with given descriptor is activated */ public abstract boolean isPluginActivated(final PluginDescriptor descr); /** * @param descr * plug-in descriptor * @return true if plug-in disabled as it's activation fails */ public abstract boolean isBadPlugin(final PluginDescriptor descr); /** * @param descr * plug-in descriptor * @return true if plug-in is currently activating */ public abstract boolean isPluginActivating(final PluginDescriptor descr); /** * Returns instance of plug-in's class loader and not tries to activate * plug-in. Use this method if you need to get access to plug-in resources * and don't want to cause plug-in activation. * * @param descr * plug-in descriptor * @return class loader instance for plug-in with given descriptor */ public abstract PluginClassLoader getPluginClassLoader( final PluginDescriptor descr); /** * Shuts down the framework.
* Calling this method will deactivate all active plug-ins in order, reverse * to the order they was activated. It also releases all resources allocated * by this manager (class loaders, plug-in descriptors etc.). All disabled * plug-ins will be marked as "enabled", all registered event listeners will * be unregistered. */ public abstract void shutdown(); /** * Deactivates plug-in with given ID if it has been successfully activated * before. This method makes plug-in "not running" and calls * {@link Plugin#doStop()} method. Note that this method will effectively * deactivate all depending plug-ins. * * @param id * plug-in ID */ public abstract void deactivatePlugin(final String id); /** * Disables plug-in (with dependencies) in this manager instance. Disabled * plug-in can't be activated although it may be valid and successfully * registered with plug-in registry. Before disabling, plug-in will be * deactivated if it was successfully activated. *

* Be careful with this method as it can effectively disable large set of * inter-depending plug-ins and your application may become unstable or even * disabled as whole. * * @param descr * descriptor of plug-in to be disabled * @return descriptors of plug-ins that was actually disabled */ public abstract PluginDescriptor[] disablePlugin( final PluginDescriptor descr); /** * Enables plug-in (or plug-ins) in this manager instance. Don't miss this * with plug-in activation semantic. Enabled plug-in is simply ready to be * activated. By default all loaded plug-ins are enabled. * * @param descr * descriptor of plug-in to be enabled * @param includeDependings * if true, depending plug-ins will be also * enabled * @return descriptors of plug-ins that was actually enabled * @see #disablePlugin(PluginDescriptor) */ public abstract PluginDescriptor[] enablePlugin( final PluginDescriptor descr, final boolean includeDependings); /** * @param descr * plug-in descriptor * @return true if given plug-in is disabled in this manager */ public abstract boolean isPluginEnabled(final PluginDescriptor descr); /** * Registers plug-in manager event listener. If given listener has been * registered before, this method will throw an * {@link IllegalArgumentException}. * * @param listener * new manager event listener */ public abstract void registerListener(final EventListener listener); /** * Unregisters manager event listener. If given listener hasn't been * registered before, this method will throw an * {@link IllegalArgumentException}. * * @param listener * registered listener */ public abstract void unregisterListener(final EventListener listener); // Delegating methods /** * Initializes given plug-in with this manager instance and given * descriptor. * * @param plugin * plug-in instance to be initialized * @param descr * plug-in descriptor */ protected final void initPlugin(final Plugin plugin, final PluginDescriptor descr) { plugin.setManager(this); plugin.setDescriptor(descr); } /** * Starts given plug-in. Simply forward call to {@link Plugin#doStart()} * method. * * @param plugin * plug-in to be started * @throws Exception * if any error has occurred during plug-in start */ protected final void startPlugin(final Plugin plugin) throws Exception { plugin.start(); } /** * Stops given plug-in. Simply forward call to {@link Plugin#doStop()} * method. * * @param plugin * plug-in to be stopped * @throws Exception * if any error has occurred during plug-in stop */ protected final void stopPlugin(final Plugin plugin) throws Exception { plugin.stop(); } /** * Forwards call to {@link PluginClassLoader#dispose()} method. * * @param cl * plug-in class loader to be disposed */ protected final void disposeClassLoader(final PluginClassLoader cl) { cl.dispose(); } /** * Forwards call to {@link PluginClassLoader#pluginsSetChanged()} method. * * @param cl * plug-in class loader to be notified */ protected final void notifyClassLoader(final PluginClassLoader cl) { cl.pluginsSetChanged(); } /** * Plug-ins life-cycle events callback interface. * * @version $Id: PluginManager.java,v 1.5 2007/04/07 12:42:14 ddimon Exp $ */ public interface EventListener { /** * This method will be called by the manager just after plug-in has been * successfully activated. * * @param plugin * just activated plug-in */ void pluginActivated(Plugin plugin); /** * This method will be called by the manager just before plug-in * deactivation. * * @param plugin * plug-in to be deactivated */ void pluginDeactivated(Plugin plugin); /** * This method will be called by the manager just before plug-in * disabling. * * @param descriptor * descriptor of plug-in to be disabled */ void pluginDisabled(PluginDescriptor descriptor); /** * This method will be called by the manager just after plug-in * enabling. * * @param descriptor * descriptor of enabled plug-in */ void pluginEnabled(PluginDescriptor descriptor); } /** * An abstract adapter class for receiving plug-ins life-cycle events. The * methods in this class are empty. This class exists as convenience for * creating listener objects. * * @version $Id: PluginManager.java,v 1.5 2007/04/07 12:42:14 ddimon Exp $ */ public abstract static class EventListenerAdapter implements EventListener { /** * @see org.java.plugin.PluginManager.EventListener#pluginActivated( * org.java.plugin.Plugin) */ public void pluginActivated(final Plugin plugin) { // no-op } /** * @see org.java.plugin.PluginManager.EventListener#pluginDeactivated( * org.java.plugin.Plugin) */ public void pluginDeactivated(final Plugin plugin) { // no-op } /** * @see org.java.plugin.PluginManager.EventListener#pluginDisabled( * org.java.plugin.registry.PluginDescriptor) */ public void pluginDisabled(final PluginDescriptor descriptor) { // no-op } /** * @see org.java.plugin.PluginManager.EventListener#pluginEnabled( * org.java.plugin.registry.PluginDescriptor) */ public void pluginEnabled(final PluginDescriptor descriptor) { // no-op } } /** * Simple callback interface to hold info about plug-in manifest and plug-in * data locations. * * @version $Id: PluginManager.java,v 1.5 2007/04/07 12:42:14 ddimon Exp $ */ public static interface PluginLocation { /** * @return location of plug-in manifest */ URL getManifestLocation(); /** * @return location of plug-in context ("home") */ URL getContextLocation(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/PluginClassLoader.java0000644000175000017500000000773410552762614025622 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; import java.net.URL; import java.net.URLClassLoader; import java.net.URLStreamHandlerFactory; import org.java.plugin.registry.PluginDescriptor; /** * Extension to Java class loader API. One instance of this class should be * created by {@link org.java.plugin.PluginManager plug-in manager} for every * available plug-in. * * @version $Id$ */ public abstract class PluginClassLoader extends URLClassLoader { private final PluginManager manager; private final PluginDescriptor descriptor; /** * @param aManager plug-in manager * @param descr plug-in descriptor * @param urls resources "managed" by this class loader * @param parent parent class loader * @param factory URL stream handler factory * @see URLClassLoader#URLClassLoader(java.net.URL[], java.lang.ClassLoader, * java.net.URLStreamHandlerFactory) */ protected PluginClassLoader(final PluginManager aManager, final PluginDescriptor descr, final URL[] urls, final ClassLoader parent, final URLStreamHandlerFactory factory) { super(urls, parent, factory); manager = aManager; descriptor = descr; } /** * @param aManager plug-in manager * @param descr plug-in descriptor * @param urls resources "managed" by this class loader * @param parent parent class loader * @see URLClassLoader#URLClassLoader(java.net.URL[], java.lang.ClassLoader) */ protected PluginClassLoader(final PluginManager aManager, final PluginDescriptor descr, final URL[] urls, final ClassLoader parent) { super(urls, parent); manager = aManager; descriptor = descr; } /** * @param aManager plug-in manager * @param descr plug-in descriptor * @param urls resources "managed" by this class loader * @see URLClassLoader#URLClassLoader(java.net.URL[]) */ protected PluginClassLoader(final PluginManager aManager, final PluginDescriptor descr, final URL[] urls) { super(urls); manager = aManager; descriptor = descr; } /** * @return returns the plug-in manager */ public PluginManager getPluginManager() { return manager; } /** * @return returns the plug-in descriptor */ public PluginDescriptor getPluginDescriptor() { return descriptor; } /** * Should release all resources acquired by this class loader instance. */ protected abstract void dispose(); /** * Registry data change notification. */ protected abstract void pluginsSetChanged(); /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{PluginClassLoader: uid=" //$NON-NLS-1$ + System.identityHashCode(this) + "; " //$NON-NLS-1$ + descriptor + "}"; //$NON-NLS-1$ } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/0000755000175000017500000000000010553765456023251 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/ParameterMultiplicity.java0000644000175000017500000000577510562133314030441 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Parameter definition multiplicity constants. */ public enum ParameterMultiplicity { /** * Parameter definition multiplicity constant. */ ONE { /** * @see org.java.plugin.registry.ParameterMultiplicity#toCode() */ @Override public String toCode() { return "one"; //$NON-NLS-1$ } }, /** * Parameter definition multiplicity constant. */ ANY { /** * @see org.java.plugin.registry.ParameterMultiplicity#toCode() */ @Override public String toCode() { return "any"; //$NON-NLS-1$ } }, /** * Parameter definition multiplicity constant. */ NONE_OR_ONE { /** * @see org.java.plugin.registry.ParameterMultiplicity#toCode() */ @Override public String toCode() { return "none-or-one"; //$NON-NLS-1$ } }, /** * Parameter definition multiplicity constant. */ ONE_OR_MORE { /** * @see org.java.plugin.registry.ParameterMultiplicity#toCode() */ @Override public String toCode() { return "one-or-more"; //$NON-NLS-1$ } }; /** * @return constant code to be used in plug-in manifest */ public abstract String toCode(); /** * Converts plug-in manifest string code to parameter multiplicity constant * value. * @param code code from plug-in manifest * @return parameter multiplicity constant value */ public static ParameterMultiplicity fromCode(final String code) { for (ParameterMultiplicity item : ParameterMultiplicity.values()) { if (item.toCode().equals(code)) { return item; } } throw new IllegalArgumentException( "unknown parameter multiplicity code " + code); //$NON-NLS-1$ } }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/IntegrityCheckReport.java0000644000175000017500000000772110562130236030211 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.util.Collection; import java.util.Locale; /** * Result of validation performed by registry on all registered plug-ins. This * includes dependencies check, parameters check (against parameter definitions) * and any other kind of validation. * * @version $Id$ */ public interface IntegrityCheckReport { /** * @return number of items with severity {@link Severity#ERROR} * in this report */ int countErrors(); /** * @return number of items with severity {@link Severity#WARNING} * in this report */ int countWarnings(); /** * @return collection of {@link ReportItem} objects */ Collection getItems(); /** * Integrity check report item severity constants. * * @version $Id$ */ enum Severity { /** * Integrity check report item severity constant. */ ERROR, /** * Integrity check report item severity constant. */ WARNING, /** * Integrity check report item severity constant. */ INFO } /** * Integrity check error constants. * * @version $Id$ */ enum Error { /** * Integrity check error constant. */ NO_ERROR, /** * Integrity check error constant. */ CHECKER_FAULT, /** * Integrity check error constant. */ MANIFEST_PROCESSING_FAILED, /** * Integrity check error constant. */ UNSATISFIED_PREREQUISITE, /** * Integrity check error constant. */ BAD_LIBRARY, /** * Integrity check error constant. */ INVALID_EXTENSION_POINT, /** * Integrity check error constant. */ INVALID_EXTENSION } /** * Integrity check report element. Holds all information about particular * check event. * @version $Id$ */ interface ReportItem { /** * @return severity code for this report item */ Severity getSeverity(); /** * @return source for this report item, can be null */ Identity getSource(); /** * @return error code for this report item */ Error getCode(); /** * @return message, associated with this report item for the system * default locale */ String getMessage(); /** * @param locale locale to get message for * @return message, associated with this report item for given locale */ String getMessage(Locale locale); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/Documentable.java0000644000175000017500000000304710553755720026513 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Interface to get access to plug-in element documentation. * @param type of identity to be documented * @version $Id$ */ public interface Documentable { /** * @return plug-in element documentation object or null * if there is no documentation provided */ Documentation getDocumentation(); /** * @return path to documentation "home", it is used for resolving * documentation references */ String getDocsPath(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/Extension.java0000644000175000017500000001731510562125212026053 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.net.URL; import java.util.Collection; import java.util.Date; import org.java.plugin.PathResolver; import org.java.plugin.registry.ExtensionPoint.ParameterDefinition; /** * This interface abstracts an extension - particular functionality, * the plug-in contribute to the system. *

* Extension UID is a combination of declaring plug-in ID and extension ID that * is unique within whole set of registered plug-ins. *

* * @version $Id$ */ public interface Extension extends UniqueIdentity, PluginElement { /** * Returns collection of all top level parameters defined in this extension. * @return collection of {@link Extension.Parameter} objects */ Collection getParameters(); /** * Returns top level parameter with given ID or null if no top * level parameters exist. If more than one top level parameters with given * ID found, the method should throw an {@link IllegalArgumentException}. * @param id ID of parameter to look for * @return top level parameter with given ID */ Parameter getParameter(String id); /** * @param id ID of parameter to look for * @return collection of all top level parameters with given ID */ Collection getParameters(String id); /** * @return ID of plug-in, extended point belongs to */ String getExtendedPluginId(); /** * @return ID of extended point */ String getExtendedPointId(); /** * @return true if extension is considered to be valid */ boolean isValid(); /** * This interface abstracts extension parameter according to extension * declaration in manifest. * @version $Id$ */ interface Parameter extends PluginElement { /** * @return parameter value as it is specified in manifest, if no value * provided there, this method should return empty string */ String rawValue(); /** * Returns collection of all sub-parameters defined in this parameter. * @return collection of {@link Extension.Parameter} objects */ Collection getSubParameters(); /** * Returns sub-parameter with given ID or null if no * sub-parameters exist. If more than one sub-parameters with given ID * found, the method should throw an {@link IllegalArgumentException}. * @param id ID of sub-parameter to look for * @return sub-parameter with given ID */ Parameter getSubParameter(String id); /** * @param id ID of sub-parameter to look for * @return collection of all sub-parameters with given ID */ Collection getSubParameters(String id); /** * @return extension this parameter belongs to */ Extension getDeclaringExtension(); /** * Returns definition for this extension parameter. * May return null for "invalid" parameters. * @return parameter definition or null, if this parameter * is "invalid" */ ParameterDefinition getDefinition(); /** * @return parameter, of which this one is child or null if * this is top level parameter */ Parameter getSuperParameter(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#STRING}, this method * should throw an {@link UnsupportedOperationException}. * @return value as String object */ String valueAsString(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#BOOLEAN}, this method * should throw an {@link UnsupportedOperationException}. * @return value as Boolean object */ Boolean valueAsBoolean(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#NUMBER}, this method * should throw an {@link UnsupportedOperationException}. * @return value as Number object */ Number valueAsNumber(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#DATE}, {@link ParameterType#TIME} * or {@link ParameterType#DATE_TIME}, this method should throw an * {@link UnsupportedOperationException}. * @return value as Date object */ Date valueAsDate(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#PLUGIN_ID}, this * method should throw an {@link UnsupportedOperationException}. * @return value as PluginDescriptor object */ PluginDescriptor valueAsPluginDescriptor(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#EXTENSION_POINT_ID}, * this method should throw an {@link UnsupportedOperationException}. * @return value as ExtensionPoint object */ ExtensionPoint valueAsExtensionPoint(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#EXTENSION_ID}, this * method should throw an {@link UnsupportedOperationException}. * @return value as Extension object */ Extension valueAsExtension(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#RESOURCE}, this * method should throw an {@link UnsupportedOperationException}. * @return value as absolute or relative URL as specified in manifest */ URL valueAsUrl(); /** * Returns "typed" value of parameter. If this parameter is invalid or * is not of type {@link ParameterType#RESOURCE}, this * method should throw an {@link UnsupportedOperationException}. * @param pathResolver path resolver to make URL absolute * @return value as absolute URL */ URL valueAsUrl(PathResolver pathResolver); } }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/ManifestProcessingException.java0000644000175000017500000000447310541226136031566 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import org.java.plugin.JpfException; /** * Exception class that indicates errors during plug-in manifest processing. * @version $Id$ */ public class ManifestProcessingException extends JpfException { private static final long serialVersionUID = -5670886724425293056L; /** * @param packageName package to load resources from * @param messageKey resource key */ public ManifestProcessingException(final String packageName, final String messageKey) { super(packageName, messageKey, null, null); } /** * @param packageName package to load resources from * @param messageKey resource key * @param data parameters substitution data */ public ManifestProcessingException(final String packageName, final String messageKey, final Object data) { super(packageName, messageKey, data, null); } /** * @param packageName package to load resources from * @param messageKey resource key * @param data parameters substitution data * @param cause nested exception */ public ManifestProcessingException(final String packageName, final String messageKey, final Object data, final Throwable cause) { super(packageName, messageKey, data, cause); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/Documentation.java0000644000175000017500000000447410553755756026740 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.util.Collection; /** * Interface to collect documentation data for some plug-in element. * @param type of identity this documentation belongs to * @version $Id$ */ public interface Documentation { /** * @return plug-in element caption or empty string */ String getCaption(); /** * @return main documentation text or empty string */ String getText(); /** * @return collection of {@link Reference references} in this documentation */ Collection> getReferences(); /** * @return element, for which this documentation is provided */ T getDeclaringIdentity(); /** * Documentation reference. * @param type of identity this documentation reference belongs to * @version $Id$ */ interface Reference { /** * @return the reference as specified in manifest */ String getRef(); /** * @return text to be used when making link for this reference */ String getCaption(); /** * @return element, for which this documentation reference is provided */ E getDeclaringIdentity(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/package.html0000644000175000017500000000012610514424204025505 0ustar gregoagregoa

This package contains framework registry API.

libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/ParameterType.java0000644000175000017500000001267010562133252026663 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Parameter definition type constants. */ public enum ParameterType { /** * Parameter definition type constant. */ STRING { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "string"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ BOOLEAN { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "boolean"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ NUMBER { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "number"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ DATE { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "date"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ TIME { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "time"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ DATE_TIME { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "date-time"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ NULL { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "null"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ ANY { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "any"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ PLUGIN_ID { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "plugin-id"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ EXTENSION_POINT_ID { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "extension-point-id"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ EXTENSION_ID { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "extension-id"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ FIXED { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "fixed"; //$NON-NLS-1$ } }, /** * Parameter definition type constant. */ RESOURCE { /** * @see org.java.plugin.registry.ParameterType#toCode() */ @Override public String toCode() { return "resource"; //$NON-NLS-1$ } }; /** * @return constant code to be used in plug-in manifest */ public abstract String toCode(); /** * Converts plug-in manifest string code to parameter type constant value. * @param code code from plug-in manifest * @return parameter type constant value */ public static ParameterType fromCode(final String code) { for (ParameterType item : ParameterType.values()) { if (item.toCode().equals(code)) { return item; } } throw new IllegalArgumentException( "unknown parameter type code " + code); //$NON-NLS-1$ } }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/ExtensionMultiplicity.java0000644000175000017500000000570010562133270030462 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Extension point multiplicity constants. */ public enum ExtensionMultiplicity { /** * Extension multiplicity constant. */ ANY { /** * @see org.java.plugin.registry.ExtensionMultiplicity#toCode() */ @Override public String toCode() { return "any"; //$NON-NLS-1$ } }, /** * Extension multiplicity constant. */ ONE { /** * @see org.java.plugin.registry.ExtensionMultiplicity#toCode() */ @Override public String toCode() { return "one"; //$NON-NLS-1$ } }, /** * Extension multiplicity constant. */ ONE_PER_PLUGIN { /** * @see org.java.plugin.registry.ExtensionMultiplicity#toCode() */ @Override public String toCode() { return "one-per-plugin"; //$NON-NLS-1$ } }, /** * Extension multiplicity constant. */ NONE { /** * @see org.java.plugin.registry.ExtensionMultiplicity#toCode() */ @Override public String toCode() { return "none"; //$NON-NLS-1$ } }; /** * @return constant code to be used in plug-in manifest */ public abstract String toCode(); /** * Converts plug-in manifest string code to extension multiplicity constant * value. * @param code code from plug-in manifest * @return extension multiplicity constant value */ public static ExtensionMultiplicity fromCode(final String code) { for (ExtensionMultiplicity item : ExtensionMultiplicity.values()) { if (item.toCode().equals(code)) { return item; } } throw new IllegalArgumentException( "unknown extension multiplicity code " + code); //$NON-NLS-1$ } }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/PluginRegistry.java0000644000175000017500000003446610572344612027104 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.net.URL; import java.util.Collection; import java.util.Map; import java.util.Set; import org.java.plugin.ObjectFactory; import org.java.plugin.PathResolver; import org.java.plugin.PluginManager; import org.java.plugin.util.ExtendedProperties; /** * Root interface to get access to all meta-information about discovered * plug-ins. All objects accessible from the registry are immutable. You can * imagine registry as a read-only storage of full information about discovered * plug-ins. There is only one exception from this rule: internal state of * registry, plug-in descriptors and plug-in elements can be modified indirectly * by {@link #register(URL[]) registering} or * {@link #unregister(String[]) un-registering} plug-ins with this registry. If * your code is interested to be notified on all modifications of plug-ins set, * you can * {@link #registerListener(PluginRegistry.RegistryChangeListener) register} an * implementation of {@link PluginRegistry.RegistryChangeListener} with this * registry. *

* Notes on unique ID's (UID's) *

*

* There are two types of identifiers in the API: ID's and UID's. ID is an * identifier that is unique within set of elements of the same type. UID is an * identifier that unique globally within registry space. ID is usually defined * by developer in plug-in manifest. UID always combined automatically from * several other plug-in "parts". All plug-in elements have method * {@link org.java.plugin.registry.Identity#getId() getId()} that come from * basic {@link org.java.plugin.registry.Identity} interface, but not all * elements have UID - only those that inherits * {@link org.java.plugin.registry.UniqueIdentity}interface. *

*

* There are several utility methods available in this interface that aimed to * build UID from different plug-in "parts" and also split UID to it's original * elements: {@link #makeUniqueId(String, Version)}, * {@link #makeUniqueId(String, String)}, {@link #extractPluginId(String)}, * {@link #extractId(String)} and {@link #extractVersion(String)}. *

* * @see org.java.plugin.ObjectFactory#createRegistry() * * @version $Id: PluginRegistry.java,v 1.5 2007/03/03 17:16:26 ddimon Exp $ */ public interface PluginRegistry { /** * Registers plug-ins and plug-in fragments in this registry. Note that this * method not makes plug-ins available for activation by any * {@link PluginManager} instance as it is not aware of any manager. Using * this method just makes plug-in meta-data available for reading from this * registry. *

* If more than one version of the same plug-in or plug-in fragment given, * the only latest version should be registered. If some plug-in or plug-in * fragment already registered it should be ignored by this method. Client * application have to un-register such plug-ins first before registering * their newest versions. * * @param manifests * array of manifest locations * @return map where keys are URL's and values are registered plug-ins or * plug-in fragments, URL's for unprocessed manifests are not * included * @throws ManifestProcessingException * if manifest processing error has occurred (optional behavior) * * @see PluginManager#publishPlugins(PluginManager.PluginLocation[]) */ Map register(URL[] manifests) throws ManifestProcessingException; /** * Reads basic information from a plug-in or plug-in fragment manifest. * * @param manifest * manifest data URL * @return manifest info * @throws ManifestProcessingException * if manifest data can't be read */ ManifestInfo readManifestInfo(URL manifest) throws ManifestProcessingException; /** * Unregisters plug-ins and plug-in fragments with given ID's (including * depending plug-ins and plug-in fragments). * * @param ids * ID's of plug-ins and plug-in fragments to be unregistered * @return collection of UID's of actually unregistered plug-ins and plug-in * fragments */ Collection unregister(String[] ids); /** * Returns descriptor of plug-in with given ID.
* If plug-in descriptor with given ID can't be found or such plug-in exists * but is damaged this method have to throw an * {@link IllegalArgumentException}. In other words, this method shouldn't * return null. * * @param pluginId * plug-id ID * @return plug-in descriptor */ PluginDescriptor getPluginDescriptor(String pluginId); /** * Checks if plug-in exists and is in valid state. If this method returns * true, the method {@link #getPluginDescriptor(String)} * should always return valid plug-in descriptor. * * @param pluginId * plug-in ID * @return true if plug-in exists and valid */ boolean isPluginDescriptorAvailable(String pluginId); /** * Returns collection of descriptors of all plug-ins that was successfully * populated by this registry. * * @return collection of {@link PluginDescriptor} objects */ Collection getPluginDescriptors(); /** * Looks for extension point. This method have throw an * {@link IllegalArgumentException} if requested extension point can't be * found or is in invalid state. * * @param pluginId * plug-in ID * @param pointId * extension point ID * @return plug-in extension point * @see ExtensionPoint#isValid() */ ExtensionPoint getExtensionPoint(String pluginId, String pointId); /** * Looks for extension point. * * @param uniqueId * extension point unique ID * @return plug-in extension point * @see #getExtensionPoint(String, String) */ ExtensionPoint getExtensionPoint(String uniqueId); /** * Checks if extension point exists and is in valid state. If this method * returns true, the method * {@link #getExtensionPoint(String, String)} should always return valid * extension point. * * @param pluginId * plug-in ID * @param pointId * extension point ID * @return true if extension point exists and valid */ boolean isExtensionPointAvailable(String pluginId, String pointId); /** * Checks if extension point exists and is in valid state. * * @param uniqueId * extension point unique ID * @return true if extension point exists and valid * @see #isExtensionPointAvailable(String, String) */ boolean isExtensionPointAvailable(String uniqueId); /** * Returns collection of descriptors of all plug-in fragments that was * successfully populated by this registry. * * @return collection of {@link PluginFragment} objects */ Collection getPluginFragments(); /** * Utility method that recursively collects all plug-ins that depends on the * given plug-in. * * @param descr * descriptor of plug-in to collect dependencies for * @return collection of {@link PluginDescriptor plug-in descriptors} that * depend on given plug-in */ Collection getDependingPlugins(PluginDescriptor descr); /** * Performs integrity check of all registered plug-ins and generates result * as a collection of standard report items. * * @param pathResolver * optional path resolver * @return integrity check report */ IntegrityCheckReport checkIntegrity(PathResolver pathResolver); /** * Performs integrity check of all registered plug-ins and generates result * as a collection of standard report items. * * @param pathResolver * optional path resolver * @param includeRegistrationReport * if true, the plug-ins registration report will * be included into resulting report * @return integrity check report */ IntegrityCheckReport checkIntegrity(PathResolver pathResolver, boolean includeRegistrationReport); /** * @return plug-ins registration report for this registry */ IntegrityCheckReport getRegistrationReport(); /** * Constructs unique identifier for some plug-in element from it's ID. * * @param pluginId * plug-in ID * @param elementId * element ID * @return unique ID */ String makeUniqueId(String pluginId, String elementId); /** * Constructs unique identifier for plug-in with given ID. * * @param pluginId * plug-in ID * @param version * plug-in version identifier * @return unique plug-in ID */ String makeUniqueId(String pluginId, Version version); /** * Extracts plug-in ID from some unique identifier. * * @param uniqueId * unique ID * @return plug-in ID */ String extractPluginId(String uniqueId); /** * Extracts plug-in element ID from some unique identifier. * * @param uniqueId * unique ID * @return element ID */ String extractId(String uniqueId); /** * Extracts plug-in version identifier from some unique identifier (plug-in * or plug-in fragment). * * @param uniqueId * unique ID * @return plug-in version identifier */ Version extractVersion(String uniqueId); /** * Registers plug-in registry change event listener. If given listener has * been registered before, this method should throw an * {@link IllegalArgumentException}. * * @param listener * new registry change event listener */ void registerListener(RegistryChangeListener listener); /** * Unregisters registry change event listener. If given listener hasn't been * registered before, this method should throw an * {@link IllegalArgumentException}. * * @param listener * registered listener */ void unregisterListener(RegistryChangeListener listener); /** * Configures this registry instance. Usually this method is called from * {@link ObjectFactory object factory} implementation. * * @param config * registry configuration data */ void configure(ExtendedProperties config); /** * Plug-in registry changes callback interface. * * @version $Id: PluginRegistry.java,v 1.5 2007/03/03 17:16:26 ddimon Exp $ */ interface RegistryChangeListener { /** * This method will be called by the framework when changes are made on * registry (via {@link PluginRegistry#register(URL[])} or * {@link PluginRegistry#unregister(String[])} methods). * * @param data * registry changes data */ void registryChanged(RegistryChangeData data); } /** * Registry changes data holder interface. * * @version $Id: PluginRegistry.java,v 1.5 2007/03/03 17:16:26 ddimon Exp $ */ interface RegistryChangeData { /** * @return collection of ID's of newly added plug-ins */ Set addedPlugins(); /** * @return collection of ID's of removed plug-ins */ Set removedPlugins(); /** * @return collection of ID's of changed plug-ins */ Set modifiedPlugins(); /** * @return collection of unique ID's of newly connected extensions */ Set addedExtensions(); /** * @param extensionPointUid * unique ID of extension point to filter result * @return collection of unique ID's of newly connected extensions */ Set addedExtensions(String extensionPointUid); /** * @return collection of unique ID's of disconnected extensions */ Set removedExtensions(); /** * @param extensionPointUid * unique ID of extension point to filter result * @return collection of unique ID's of disconnected extensions */ Set removedExtensions(String extensionPointUid); /** * @return collection of unique ID's of modified extensions */ Set modifiedExtensions(); /** * @param extensionPointUid * unique ID of extension point to filter result * @return collection of unique ID's of modified extensions */ Set modifiedExtensions(String extensionPointUid); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/PluginPrerequisite.java0000644000175000017500000000451510553765202027746 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * This interface abstracts inter plug-ins dependencies. *

* Plug-in prerequisite UID is a combination of declaring plug-in ID and * prerequisite ID (may be auto-generated) that is unique within whole set of * registered plug-ins. *

* * @version $Id$ */ public interface PluginPrerequisite extends UniqueIdentity, PluginElement { /** * @return ID of plug-in, this plug-in depends on */ String getPluginId(); /** * @return desired plug-in version identifier or null * if not specified */ Version getPluginVersion(); /** * @return true if this prerequisite is propagated * on depending plug-ins */ boolean isExported(); /** * @return true if this prerequisite is not required */ boolean isOptional(); /** * @return true if this prerequisite allows reverse look up of * classes in imported plug-in */ boolean isReverseLookup(); /** * @return true if this prerequisite is fulfilled */ boolean matches(); /** * @return the match rule as it specified in manifest */ MatchingRule getMatchingRule(); }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/MatchingRule.java0000644000175000017500000000563610562133262026470 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Version identifier matching modes. */ public enum MatchingRule { /** * Version identifier matching rule constant. */ EQUAL { /** * @see org.java.plugin.registry.MatchingRule#toCode() */ @Override public String toCode() { return "equal"; //$NON-NLS-1$ } }, /** * Version identifier matching rule constant. */ EQUIVALENT { /** * @see org.java.plugin.registry.MatchingRule#toCode() */ @Override public String toCode() { return "equivalent"; //$NON-NLS-1$ } }, /** * Version identifier matching rule constant. */ COMPATIBLE { /** * @see org.java.plugin.registry.MatchingRule#toCode() */ @Override public String toCode() { return "compatible"; //$NON-NLS-1$ } }, /** * Version identifier matching rule constant. */ GREATER_OR_EQUAL { /** * @see org.java.plugin.registry.MatchingRule#toCode() */ @Override public String toCode() { return "greater-or-equal"; //$NON-NLS-1$ } }; /** * @return constant code to be used in plug-in manifest */ public abstract String toCode(); /** * Converts plug-in manifest string code to matching rule constant value. * @param code code from plug-in manifest * @return matching rule constant value */ public static MatchingRule fromCode(final String code) { for (MatchingRule item : MatchingRule.values()) { if (item.toCode().equals(code)) { return item; } } throw new IllegalArgumentException( "unknown matching rule code " + code); //$NON-NLS-1$ } }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/PluginDescriptor.java0000644000175000017500000001072610552766252027411 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.net.URL; import java.util.Collection; /** * Main interface to get access to all meta-information for particular * plug-in, described in plug-in manifest file. *

* Plug-in UID is a combination of plug-in ID and version identifier that is * unique within whole set of registered plug-ins. *

* @see plug-in DTD for standard * registry implementation * @see org.java.plugin.registry.PluginRegistry * @version $Id$ */ public interface PluginDescriptor extends UniqueIdentity, Documentable { /** * @return vendor as specified in manifest file or empty string */ String getVendor(); /** * @return plug-in version identifier as specified in manifest file */ Version getVersion(); /** * Returns collection of all top level attributes defined in manifest. * @return collection of {@link PluginAttribute} objects */ Collection getAttributes(); /** * @param id ID of attribute to look for * @return top level attribute with given ID */ PluginAttribute getAttribute(String id); /** * @param id ID of attribute to look for * @return collection of all top level attributes with given ID */ Collection getAttributes(String id); /** * Returns collection of all prerequisites defined in manifest. * @return collection of {@link PluginPrerequisite} objects */ Collection getPrerequisites(); /** * @param id prerequisite ID * @return plug-in prerequisite object instance or null */ PluginPrerequisite getPrerequisite(String id); /** * Returns collection of all extension points defined in manifest. * @return collection of {@link ExtensionPoint} objects */ Collection getExtensionPoints(); /** * @param id extension point ID * @return extension point object or null */ ExtensionPoint getExtensionPoint(String id); /** * Returns collection of all extensions defined in manifest. * @return collection of {@link Extension} objects */ Collection getExtensions(); /** * @param id extension ID * @return extension object or null */ Extension getExtension(String id); /** * Returns collection of all libraries defined in manifest. * @return collection of {@link Library} objects */ Collection getLibraries(); /** * @param id library ID * @return library object or null */ Library getLibrary(String id); /** * @return plug-ins registry */ PluginRegistry getRegistry(); /** * @return plug-in class name as specified in manifest file or * null */ String getPluginClassName(); /** * Returns collection of plug-in fragments which contributes to this * plug-in. One plug-in fragment may contribute to several versions of the * same plug-in, according to it's manifest. * @return collection of {@link PluginFragment} objects */ Collection getFragments(); /** * @return location from which this plug-in was registered */ URL getLocation(); }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/Identity.java0000644000175000017500000000241010552766160025672 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Base interface for any plug-in manifest element class. * * @see org.java.plugin.registry.PluginRegistry * @version $Id$ */ public interface Identity { /** * @return ID of plug-in manifest element */ String getId(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/ManifestInfo.java0000644000175000017500000000410510562144014026453 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.net.URL; /** * Manifest info holder interface. * * @see PluginRegistry#readManifestInfo(URL) * @version $Id: ManifestInfo.java,v 1.2 2007/02/06 16:25:16 ddimon Exp $ */ public interface ManifestInfo { /** * @return plug-in or plug-in fragment identifier */ String getId(); /** * @return plug-in or plug-in fragment version identifier */ Version getVersion(); /** * @return plug-in or plug-in fragment vendor */ String getVendor(); /** * @return plug-in identifier this, fragment contributes to or * null if this info is for plug-in manifest */ String getPluginId(); /** * @return plug-in version identifier, this fragment contributes to or * null if this info is for plug-in manifest */ Version getPluginVersion(); /** * @return plug-in version matching rule or null if this * info is for plug-in manifest */ MatchingRule getMatchingRule(); }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/Library.java0000644000175000017500000000464610552766200025515 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.util.Collection; /** * This interface provides access to information about resource or code * contributed by plug-in. *

* Library UID is a combination of declaring plug-in ID and library ID that is * unique within whole set of registered plug-ins. *

* * @version $Id$ */ public interface Library extends UniqueIdentity, PluginElement { /** * @return path to resource */ String getPath(); /** * @return true if this is "code" library */ boolean isCodeLibrary(); /** * This method should return collection of {@link String} objects that * represent resource name prefixes or package name patterns that are * available to other plug-ins. *
* For code library, prefix is a package name, for resource library, * the same rules applied to relative resource path calculated against * library path (you can replace slash characters in path with dots). *
* Example prefixes are:
* * "*", "package.name.*", "package.name.ClassName", "resource/path/* * * @return collection of exported resource name patterns */ Collection getExports(); /** * @return library version identifier as specified in manifest file or * null */ Version getVersion(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/UniqueIdentity.java0000644000175000017500000000247010552766546027077 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2005-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * Base interface for those plug-in manifest element classes that may have UID. * * @see org.java.plugin.registry.PluginRegistry * @version $Id$ */ public interface UniqueIdentity extends Identity { /** * @return unique ID of plug-in element */ String getUniqueId(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/0000755000175000017500000000000010612737270024036 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/PluginRegistryImpl.java0000644000175000017500000014616210621652254030522 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.PathResolver; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.registry.ManifestInfo; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; import org.java.plugin.registry.IntegrityCheckReport.ReportItem; import org.java.plugin.registry.xml.IntegrityChecker.ReportItemImpl; import org.java.plugin.util.ExtendedProperties; /** * This is an implementation of plug-in registry of XML syntax plug-in * manifests. Manifests should be prepared according to * plug-in DTD. *

* Configuration parameters *

* This registry implementation supports following configuration parameters: *

*
isValidating
*
Regulates is registry should use validating parser when loading * plug-in manifests. The default parameter value is true.
*
stopOnError
*
Regulates is registry should stop and throw RuntimeException if an * error occurred while {@link PluginRegistry#register(URL[]) registering} * or {@link PluginRegistry#unregister(String[]) un-registering} plug-ins. * If this is false, the registration errors will be stored * in the internal report that is available with * {@link PluginRegistry#checkIntegrity(PathResolver)} method. * The default parameter value is false.
*
* * @see org.java.plugin.ObjectFactory#createRegistry() * * @version $Id: PluginRegistryImpl.java,v 1.6 2007/05/13 16:10:51 ddimon Exp $ */ public final class PluginRegistryImpl implements PluginRegistry { static final String PACKAGE_NAME = "org.java.plugin.registry.xml"; //$NON-NLS-1$ private static final char UNIQUE_SEPARATOR = '@'; private static final Log log = LogFactory.getLog(PluginRegistryImpl.class); private final List registrationReport = new LinkedList(); private final Map registeredPlugins = new HashMap(); private final Map registeredFragments = new HashMap(); private final List listeners = Collections.synchronizedList(new LinkedList()); private ManifestParser manifestParser; private boolean stopOnError = false; /** * Creates plug-in registry object. */ public PluginRegistryImpl() { registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "registryStart", null)); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginRegistry#configure( * ExtendedProperties) */ public void configure(final ExtendedProperties config) { stopOnError = "true".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty("stopOnError", "false")); //$NON-NLS-1$ //$NON-NLS-2$ boolean isValidating = !"false".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty("isValidating", "true")); //$NON-NLS-1$ //$NON-NLS-2$ manifestParser = new ManifestParser(isValidating); log.info("configured, stopOnError=" + stopOnError //$NON-NLS-1$ + ", isValidating=" + isValidating); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginRegistry#readManifestInfo( * java.net.URL) */ public ManifestInfo readManifestInfo(final URL url) throws ManifestProcessingException { try { return new ManifestInfoImpl(manifestParser.parseManifestInfo(url)); } catch (Exception e) { throw new ManifestProcessingException(PACKAGE_NAME, "manifestParsingError", url, e); //$NON-NLS-1$ } } /** * General algorithm: *
    *
  1. Collect all currently registered extension points.
  2. *
  3. Parse given URL's as XML content files and separate them on plug-in * and plug-in fragment descriptors.
  4. *
  5. Process new plug-in descriptors first: *
      *
    1. Instantiate new PluginDescriptorImpl object.
    2. *
    3. Handle versions correctly - register new descriptor as most * recent version or as an old version.
    4. *
    5. If other versions of the same plug-in already registered, take * their fragments and register them with this version.
    6. *
    *
  6. *
  7. Process new plug-in fragments next: *
      *
    1. Instantiate new PluginFragmentImpl object.
    2. *
    3. Check if older version of the same fragment already registered. * If yes, un-register it and move to old plug-in fragments * collection.
    4. *
    5. Register new fragment with all matches plug-in descriptors (if * this fragment is of most recent version).
    6. *
    *
  8. *
  9. Notify collected extension points about potential changes in * extensions set.
  10. *
  11. Propagate events about registry changes.
  12. *
* @see org.java.plugin.registry.PluginRegistry#register(java.net.URL[]) */ public Map register(final URL[] manifests) throws ManifestProcessingException { // collecting registered extension points and extensions List registeredPoints = new LinkedList(); Map registeredExtensions = new HashMap(); for (PluginDescriptor descriptor : registeredPlugins.values()) { for (ExtensionPoint point : descriptor.getExtensionPoints()) { registeredPoints.add(point); for (Extension ext : point.getConnectedExtensions()) { registeredExtensions.put(ext.getUniqueId(), ext); } } } Map result = new HashMap(manifests.length); Map plugins = new HashMap(); Map fragments = new HashMap(); // parsing given manifests registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "manifestsParsingStart", //$NON-NLS-1$ null)); for (URL url : manifests) { ModelPluginManifest model; try { model = manifestParser.parseManifest(url); } catch (Exception e) { log.error("can't parse manifest file " + url, e); //$NON-NLS-1$ if (stopOnError) { throw new ManifestProcessingException(PACKAGE_NAME, "manifestParsingError", url, e); //$NON-NLS-1$ } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.ERROR, null, IntegrityCheckReport.Error.MANIFEST_PROCESSING_FAILED, "manifestParsingError", new Object[] {url, e})); //$NON-NLS-1$ continue; } if (model instanceof ModelPluginFragment) { fragments.put(url.toExternalForm(), model); continue; } if (!(model instanceof ModelPluginDescriptor)) { log.warn("URL " + url //$NON-NLS-1$ + " points to XML document of unknown type"); //$NON-NLS-1$ continue; } plugins.put(url.toExternalForm(), model); } if (log.isDebugEnabled()) { log.debug("manifest files parsed, plugins.size=" + plugins.size() //$NON-NLS-1$ + ", fragments.size=" + fragments.size()); //$NON-NLS-1$ } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "manifestsParsingFinish", //$NON-NLS-1$ new Object[] {Integer.valueOf(plugins.size()), Integer.valueOf(fragments.size())})); checkVersions(plugins); if (log.isDebugEnabled()) { log.debug("plug-ins versions checked, plugins.size=" //$NON-NLS-1$ + plugins.size()); } checkVersions(fragments); if (log.isDebugEnabled()) { log.debug("plug-in fragments versions checked, fragments.size=" //$NON-NLS-1$ + fragments.size()); } RegistryChangeDataImpl registryChangeData = new RegistryChangeDataImpl(); // registering new plug-ins registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "registeringPluginsStart", null)); //$NON-NLS-1$ for (ModelPluginManifest model : plugins.values()) { PluginDescriptor descr = registerPlugin( (ModelPluginDescriptor) model, registryChangeData); if (descr != null) { result.put(descr.getLocation().toExternalForm(), descr); } } plugins.clear(); // registering new plug-in fragments registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "registeringFragmentsStart", null)); //$NON-NLS-1$ for (ModelPluginManifest entry : fragments.values()) { PluginFragment fragment = registerFragment( (ModelPluginFragment) entry, registryChangeData); if (fragment != null) { result.put(fragment.getLocation().toExternalForm(), fragment); } } fragments.clear(); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "registeringPluginsFinish", //$NON-NLS-1$ Integer.valueOf(registeredPlugins.size()))); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "registeringFragmentsFinish", //$NON-NLS-1$ Integer.valueOf(registeredFragments.size()))); log.info("plug-in and fragment descriptors registered - " //$NON-NLS-1$ + result.size()); dump(); if (result.isEmpty()) { return result; } // notify all interested members that plug-ins set has been changed for (ExtensionPoint extensionPoint : registeredPoints) { ((ExtensionPointImpl) extensionPoint).registryChanged(); } for (Extension extension : registeredExtensions.values()) { ((ExtensionImpl) extension).registryChanged(); } if (!listeners.isEmpty() || log.isDebugEnabled()) { // analyze changes in extensions set for (PluginDescriptor pluginDescriptor : registeredPlugins.values()) { for (ExtensionPoint extensionPoint : pluginDescriptor.getExtensionPoints()) { for (Extension ext : extensionPoint.getConnectedExtensions()) { if (!registeredExtensions.containsKey( ext.getUniqueId())) { registryChangeData.putAddedExtension( ext.getUniqueId(), makeUniqueId(ext.getExtendedPluginId(), ext.getExtendedPointId())); } else { registeredExtensions.remove(ext.getUniqueId()); if (registryChangeData.modifiedPlugins().contains( ext.getDeclaringPluginDescriptor().getId()) || registryChangeData.modifiedPlugins() .contains(ext.getExtendedPluginId())) { registryChangeData.putModifiedExtension( ext.getUniqueId(), makeUniqueId(ext.getExtendedPluginId(), ext.getExtendedPointId())); } } } } } for (Extension ext : registeredExtensions.values()) { registryChangeData.putRemovedExtension(ext.getUniqueId(), makeUniqueId(ext.getExtendedPluginId(), ext.getExtendedPointId())); } // fire event fireEvent(registryChangeData); } return result; } private void checkVersions(final Map plugins) throws ManifestProcessingException { Map versions = new HashMap(); // Set toBeRemovedUrls = new HashSet(); for (Iterator> it = plugins.entrySet().iterator(); it.hasNext();) { Map.Entry entry = it.next(); String url = entry.getKey(); ModelPluginManifest model = entry.getValue(); if (registeredPlugins.containsKey(model.getId())) { if (stopOnError) { throw new ManifestProcessingException(PACKAGE_NAME, "duplicatePlugin", //$NON-NLS-1$ model.getId()); } it.remove(); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.ERROR, null, IntegrityCheckReport.Error.MANIFEST_PROCESSING_FAILED, "duplicatedPluginId", model.getId())); //$NON-NLS-1$ continue; } if (registeredFragments.containsKey(model.getId())) { if (stopOnError) { throw new ManifestProcessingException(PACKAGE_NAME, "duplicatePluginFragment", //$NON-NLS-1$ model.getId()); } it.remove(); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.ERROR, null, IntegrityCheckReport.Error.MANIFEST_PROCESSING_FAILED, "duplicatedFragmentId", model.getId())); //$NON-NLS-1$ continue; } Object[] version = versions.get(model.getId()); if (version == null) { versions.put(model.getId(), new Object[] {model.getVersion(), url}); continue; } if (((Version) version[0]).compareTo(model.getVersion()) < 0) { toBeRemovedUrls.add((String) version[1]); versions.put(model.getId(), new Object[] {model.getVersion(), url}); } else { toBeRemovedUrls.add(url); } } versions.clear(); for (String url : toBeRemovedUrls) { plugins.remove(url); } toBeRemovedUrls.clear(); } private PluginDescriptor registerPlugin(final ModelPluginDescriptor model, final RegistryChangeDataImpl registryChangeData) throws ManifestProcessingException { if (log.isDebugEnabled()) { log.debug("registering plug-in, URL - " + model.getLocation()); //$NON-NLS-1$ } PluginDescriptorImpl result = null; try { result = new PluginDescriptorImpl(this, model); registryChangeData.addedPlugins().add(result.getId()); // applying fragments to the new plug-in for (PluginFragment pluginFragment : registeredFragments.values()) { PluginFragmentImpl fragment = (PluginFragmentImpl) pluginFragment; if (fragment.matches(result)) { result.registerFragment(fragment); } } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "pluginRegistered", result.getUniqueId())); //$NON-NLS-1$ } catch (ManifestProcessingException mpe) { log.error("failed registering plug-in, URL - " //$NON-NLS-1$ + model.getLocation(), mpe); if (stopOnError) { throw mpe; } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.ERROR, null, IntegrityCheckReport.Error.MANIFEST_PROCESSING_FAILED, "pluginRegistrationFailed", //$NON-NLS-1$ new Object[] {model.getLocation(), mpe})); return null; } registeredPlugins.put(result.getId(), result); return result; } private PluginFragment registerFragment(final ModelPluginFragment model, final RegistryChangeDataImpl registryChangeData) throws ManifestProcessingException { if (log.isDebugEnabled()) { log.debug("registering plug-in fragment descriptor, URL - " //$NON-NLS-1$ + model.getLocation()); } PluginFragmentImpl result = null; try { result = new PluginFragmentImpl(this, model); // register fragment with all matches plug-ins boolean isRegistered = false; PluginDescriptorImpl descr = (PluginDescriptorImpl) getPluginDescriptor( result.getPluginId()); if (result.matches(descr)) { descr.registerFragment(result); if (!registryChangeData.addedPlugins().contains( descr.getId())) { registryChangeData.modifiedPlugins().add(descr.getId()); } isRegistered = true; } if (!isRegistered) { log.warn("no matching plug-ins found for fragment " //$NON-NLS-1$ + result.getUniqueId()); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.WARNING, null, IntegrityCheckReport.Error.NO_ERROR, "noMatchingPluginFound", result.getUniqueId())); //$NON-NLS-1$ } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "fragmentRegistered", result.getUniqueId())); //$NON-NLS-1$ } catch (ManifestProcessingException mpe) { log.error("failed registering plug-in fragment descriptor, URL - " //$NON-NLS-1$ + model.getLocation(), mpe); if (stopOnError) { throw mpe; } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.ERROR, null, IntegrityCheckReport.Error.MANIFEST_PROCESSING_FAILED, "fragmentRegistrationFailed", //$NON-NLS-1$ new Object[] {model.getLocation(), mpe})); return null; } registeredFragments.put(result.getId(), result); return result; } /** * @see org.java.plugin.registry.PluginRegistry#unregister(java.lang.String[]) */ public Collection unregister(final String[] ids) { // collecting registered extension points and extensions final List registeredPoints = new LinkedList(); final Map registeredExtensions = new HashMap(); for (PluginDescriptor pluginDescriptor : registeredPlugins.values()) { for (ExtensionPoint point : pluginDescriptor.getExtensionPoints()) { registeredPoints.add(point); for (Extension ext : point.getConnectedExtensions()) { registeredExtensions.put(ext.getUniqueId(), ext); } } } final Set result = new HashSet(); RegistryChangeDataImpl registryChangeData = new RegistryChangeDataImpl(); // collect objects to be unregistered registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "unregisteringPrepare", //$NON-NLS-1$ null)); Map removingPlugins = new HashMap(); Map removingFragments = new HashMap(); for (String element : ids) { PluginDescriptor descr = registeredPlugins.get(element); if (descr != null) { for (PluginDescriptor depDescr : getDependingPlugins(descr)) { removingPlugins.put(depDescr.getId(), depDescr); registryChangeData.removedPlugins().add(depDescr.getId()); } removingPlugins.put(descr.getId(), descr); registryChangeData.removedPlugins().add(descr.getId()); continue; } PluginFragment fragment = registeredFragments.get(element); if (fragment != null) { removingFragments.put(fragment.getId(), fragment); continue; } registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.WARNING, null, IntegrityCheckReport.Error.NO_ERROR, "pluginToUngregisterNotFound", element)); //$NON-NLS-1$ } for (PluginDescriptor descr : removingPlugins.values()) { for (PluginFragment fragment : descr.getFragments()) { if (removingFragments.containsKey(fragment.getId())) { continue; } removingFragments.put(fragment.getId(), fragment); } } // notify about plug-ins removal first fireEvent(registryChangeData); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "unregisteringFragmentsStart", null)); //$NON-NLS-1$ for (PluginFragment pluginFragment : removingFragments.values()) { PluginFragmentImpl fragment = (PluginFragmentImpl) pluginFragment; unregisterFragment(fragment); if (!removingPlugins.containsKey(fragment.getPluginId())) { registryChangeData.modifiedPlugins().add( fragment.getPluginId()); } result.add(fragment.getUniqueId()); } removingFragments.clear(); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "unregisteringPluginsStart", null)); //$NON-NLS-1$ for (PluginDescriptor pluginDescriptor : removingPlugins.values()) { PluginDescriptorImpl descr = (PluginDescriptorImpl) pluginDescriptor; unregisterPlugin(descr); result.add(descr.getUniqueId()); } removingPlugins.clear(); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "unregisteringPluginsFinish", //$NON-NLS-1$ Integer.valueOf(registeredPlugins.size()))); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "unregisteringFragmentsFinish", //$NON-NLS-1$ Integer.valueOf(registeredFragments.size()))); log.info("plug-in and fragment descriptors unregistered - " //$NON-NLS-1$ + result.size()); dump(); if (result.isEmpty()) { return result; } // notify all interested members that plug-ins set has been changed for (ExtensionPoint extensionPoint : registeredPoints) { ((ExtensionPointImpl) extensionPoint).registryChanged(); } for (Extension extension : registeredExtensions.values()) { ((ExtensionImpl) extension).registryChanged(); } if (!listeners.isEmpty() || log.isDebugEnabled()) { // analyze changes in extensions set for (PluginDescriptor descriptor : registeredPlugins.values()) { for (ExtensionPoint point : descriptor.getExtensionPoints()) { for (Extension ext : point.getConnectedExtensions()) { if (!registeredExtensions.containsKey( ext.getUniqueId())) { registryChangeData.putAddedExtension( ext.getUniqueId(), makeUniqueId(ext.getExtendedPluginId(), ext.getExtendedPointId())); } else { registeredExtensions.remove(ext.getUniqueId()); if (registryChangeData.modifiedPlugins().contains( ext.getDeclaringPluginDescriptor().getId()) || registryChangeData.modifiedPlugins() .contains(ext.getExtendedPluginId())) { registryChangeData.putModifiedExtension( ext.getUniqueId(), makeUniqueId(ext.getExtendedPluginId(), ext.getExtendedPointId())); } } } } } for (Extension ext : registeredExtensions.values()) { registryChangeData.putRemovedExtension(ext.getUniqueId(), makeUniqueId(ext.getExtendedPluginId(), ext.getExtendedPointId())); } // fire event fireEvent(registryChangeData); } return result; } private void unregisterPlugin(final PluginDescriptorImpl descr) { registeredPlugins.remove(descr.getId()); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "pluginUnregistered", descr.getUniqueId())); //$NON-NLS-1$ } private void unregisterFragment(final PluginFragmentImpl fragment) { PluginDescriptorImpl descr = (PluginDescriptorImpl) registeredPlugins.get( fragment.getPluginId()); if (descr != null) { descr.unregisterFragment(fragment); } registeredFragments.remove(fragment.getId()); registrationReport.add(new ReportItemImpl( IntegrityCheckReport.Severity.INFO, null, IntegrityCheckReport.Error.NO_ERROR, "fragmentUnregistered", fragment.getUniqueId())); //$NON-NLS-1$ } private void dump() { if (!log.isDebugEnabled()) { return; } StringBuilder buf = new StringBuilder(); buf.append("PLUG-IN REGISTRY DUMP:\r\n") //$NON-NLS-1$ .append("-------------- DUMP BEGIN -----------------\r\n") //$NON-NLS-1$ .append("\tPlug-ins: " + registeredPlugins.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (PluginDescriptor descriptor : registeredPlugins.values()) { buf.append("\t\t") //$NON-NLS-1$ .append(descriptor) .append("\r\n"); //$NON-NLS-1$ } buf.append("\tFragments: " + registeredFragments.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (PluginFragment fragment : registeredFragments.values()) { buf.append("\t\t") //$NON-NLS-1$ .append(fragment) .append("\r\n"); //$NON-NLS-1$ } buf.append("Memory TOTAL/FREE/MAX: ") //$NON-NLS-1$ .append(Runtime.getRuntime().totalMemory()) .append("/") //$NON-NLS-1$ .append(Runtime.getRuntime().freeMemory()) .append("/") //$NON-NLS-1$ .append(Runtime.getRuntime().maxMemory()) .append("\r\n"); //$NON-NLS-1$ buf.append("-------------- DUMP END -----------------\r\n"); //$NON-NLS-1$ log.debug(buf.toString()); } /** * @see org.java.plugin.registry.PluginRegistry#getExtensionPoint( * java.lang.String, java.lang.String) */ public ExtensionPoint getExtensionPoint(final String pluginId, final String pointId) { PluginDescriptor descriptor = registeredPlugins.get(pluginId); if (descriptor == null) { throw new IllegalArgumentException("unknown plug-in ID " //$NON-NLS-1$ + pluginId + " provided for extension point " + pointId); //$NON-NLS-1$ } for (ExtensionPoint point : descriptor.getExtensionPoints()) { if (point.getId().equals(pointId)) { if (point.isValid()) { return point; } log.warn("extension point " + point.getUniqueId() //$NON-NLS-1$ + " is invalid and ignored by registry"); //$NON-NLS-1$ break; } } throw new IllegalArgumentException("unknown extension point ID - " //$NON-NLS-1$ + makeUniqueId(pluginId, pointId)); } /** * @see org.java.plugin.registry.PluginRegistry#getExtensionPoint(java.lang.String) */ public ExtensionPoint getExtensionPoint(final String uniqueId) { return getExtensionPoint(extractPluginId(uniqueId), extractId(uniqueId)); } /** * @see org.java.plugin.registry.PluginRegistry#isExtensionPointAvailable( * java.lang.String, java.lang.String) */ public boolean isExtensionPointAvailable(final String pluginId, final String pointId) { PluginDescriptor descriptor = registeredPlugins.get(pluginId); if (descriptor == null) { return false; } for (ExtensionPoint point : descriptor.getExtensionPoints()) { if (point.getId().equals(pointId)) { return point.isValid(); } } return false; } /** * @see org.java.plugin.registry.PluginRegistry#isExtensionPointAvailable( * java.lang.String) */ public boolean isExtensionPointAvailable(final String uniqueId) { return isExtensionPointAvailable(extractPluginId(uniqueId), extractId(uniqueId)); } /** * @see org.java.plugin.registry.PluginRegistry#getPluginDescriptor(java.lang.String) */ public PluginDescriptor getPluginDescriptor(final String pluginId) { PluginDescriptor result = registeredPlugins.get(pluginId); if (result == null) { throw new IllegalArgumentException("unknown plug-in ID - " //$NON-NLS-1$ + pluginId); } return result; } /** * @see org.java.plugin.registry.PluginRegistry#isPluginDescriptorAvailable(java.lang.String) */ public boolean isPluginDescriptorAvailable(final String pluginId) { return registeredPlugins.containsKey(pluginId); } /** * @see org.java.plugin.registry.PluginRegistry#getPluginDescriptors() */ public Collection getPluginDescriptors() { final Collection empty_collection = Collections.emptyList(); return registeredPlugins.isEmpty() ? empty_collection : Collections.unmodifiableCollection( registeredPlugins.values()); } /** * @see org.java.plugin.registry.PluginRegistry#getPluginFragments() */ public Collection getPluginFragments() { final Collection empty_collection = Collections.emptyList(); return registeredFragments.isEmpty() ? empty_collection : Collections.unmodifiableCollection(registeredFragments.values()); } /** * @see org.java.plugin.registry.PluginRegistry#getDependingPlugins( * org.java.plugin.registry.PluginDescriptor) */ public Collection getDependingPlugins( final PluginDescriptor descr) { Map result = new HashMap(); for (PluginDescriptor dependedDescr : getPluginDescriptors()) { if (dependedDescr.getId().equals(descr.getId())) { continue; } for (PluginPrerequisite pre : dependedDescr.getPrerequisites()) { if (!pre.getPluginId().equals(descr.getId()) || !pre.matches()) { continue; } if (!result.containsKey(dependedDescr.getId())) { result.put(dependedDescr.getId(), dependedDescr); for (PluginDescriptor descriptor : getDependingPlugins(dependedDescr)) { if (!result.containsKey(descriptor.getId())) { result.put(descriptor.getId(), descriptor); } } } break; } } return result.values(); } /** * @see org.java.plugin.registry.PluginRegistry#checkIntegrity( * org.java.plugin.PathResolver) */ public IntegrityCheckReport checkIntegrity( final PathResolver pathResolver) { return checkIntegrity(pathResolver, false); } /** * @see org.java.plugin.registry.PluginRegistry#checkIntegrity( * org.java.plugin.PathResolver, boolean) */ public IntegrityCheckReport checkIntegrity(final PathResolver pathResolver, final boolean includeRegistrationReport) { final Collection empty_collection = Collections.emptyList(); IntegrityChecker intergityCheckReport = new IntegrityChecker(this, includeRegistrationReport ? registrationReport : empty_collection); intergityCheckReport.doCheck(pathResolver); return intergityCheckReport; } /** * @see org.java.plugin.registry.PluginRegistry#getRegistrationReport() */ public IntegrityCheckReport getRegistrationReport() { return new IntegrityChecker(this, registrationReport); } /** * @see org.java.plugin.registry.PluginRegistry#makeUniqueId( * java.lang.String, java.lang.String) */ public String makeUniqueId(final String pluginId, final String id) { return pluginId + UNIQUE_SEPARATOR + id; } /** * @see org.java.plugin.registry.PluginRegistry#makeUniqueId( * java.lang.String, org.java.plugin.registry.Version) */ public String makeUniqueId(final String pluginId, final Version version) { return pluginId + UNIQUE_SEPARATOR + version; } /** * @see org.java.plugin.registry.PluginRegistry#extractPluginId(java.lang.String) */ public String extractPluginId(final String uniqueId) { int p = uniqueId.indexOf(UNIQUE_SEPARATOR); if ((p <= 0) || (p >= (uniqueId.length() - 1))) { throw new IllegalArgumentException("invalid unique ID - " //$NON-NLS-1$ + uniqueId); } return uniqueId.substring(0, p); } /** * @see org.java.plugin.registry.PluginRegistry#extractId(java.lang.String) */ public String extractId(final String uniqueId) { int p = uniqueId.indexOf(UNIQUE_SEPARATOR); if ((p <= 0) || (p >= (uniqueId.length() - 1))) { throw new IllegalArgumentException("invalid unique ID - " //$NON-NLS-1$ + uniqueId); } return uniqueId.substring(p + 1); } /** * @see org.java.plugin.registry.PluginRegistry#extractVersion(java.lang.String) */ public Version extractVersion(final String uniqueId) { int p = uniqueId.indexOf(UNIQUE_SEPARATOR); if ((p <= 0) || (p >= (uniqueId.length() - 1))) { throw new IllegalArgumentException("invalid unique ID - " //$NON-NLS-1$ + uniqueId); } return Version.parse(uniqueId.substring(p + 1)); } /** * @see org.java.plugin.registry.PluginRegistry#registerListener( * org.java.plugin.registry.PluginRegistry.RegistryChangeListener) */ public void registerListener(final RegistryChangeListener listener) { if (listeners.contains(listener)) { throw new IllegalArgumentException("listener " + listener //$NON-NLS-1$ + " already registered"); //$NON-NLS-1$ } listeners.add(listener); } /** * @see org.java.plugin.registry.PluginRegistry#unregisterListener( * org.java.plugin.registry.PluginRegistry.RegistryChangeListener) */ public void unregisterListener(final RegistryChangeListener listener) { if (!listeners.remove(listener)) { log.warn("unknown listener " + listener); //$NON-NLS-1$ } } void fireEvent(final RegistryChangeDataImpl data) { data.dump(); if (listeners.isEmpty()) { return; } // make local copy RegistryChangeListener[] arr = listeners.toArray( new RegistryChangeListener[listeners.size()]); data.beforeEventFire(); if (log.isDebugEnabled()) { log.debug("propagating registry change event"); //$NON-NLS-1$ } for (RegistryChangeListener element : arr) { element.registryChanged(data); } if (log.isDebugEnabled()) { log.debug("registry change event propagated"); //$NON-NLS-1$ } data.afterEventFire(); } private static final class RegistryChangeDataImpl implements RegistryChangeData { private Set addedPlugins; private Set removedPlugins; private Set modifiedPlugins; private Map addedExtensions; private Map removedExtensions; private Map modifiedExtensions; protected RegistryChangeDataImpl() { reset(); } private void reset() { addedPlugins = new HashSet(); removedPlugins = new HashSet(); modifiedPlugins = new HashSet(); addedExtensions = new HashMap(); removedExtensions = new HashMap(); modifiedExtensions = new HashMap(); } protected void beforeEventFire() { addedPlugins = Collections.unmodifiableSet(addedPlugins); removedPlugins = Collections.unmodifiableSet(removedPlugins); modifiedPlugins = Collections.unmodifiableSet(modifiedPlugins); addedExtensions = Collections.unmodifiableMap(addedExtensions); removedExtensions = Collections.unmodifiableMap(removedExtensions); modifiedExtensions = Collections.unmodifiableMap(modifiedExtensions); } protected void afterEventFire() { reset(); } protected void dump() { Log logger = LogFactory.getLog(getClass()); if (!logger.isDebugEnabled()) { return; } StringBuilder buf = new StringBuilder(); buf.append("PLUG-IN REGISTRY CHANGES DUMP:\r\n") //$NON-NLS-1$ .append("-------------- DUMP BEGIN -----------------\r\n") //$NON-NLS-1$ .append("\tAdded plug-ins: " + addedPlugins.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (Object element : addedPlugins) { buf.append("\t\t") //$NON-NLS-1$ .append(element) .append("\r\n"); //$NON-NLS-1$ } buf.append("\tRemoved plug-ins: " + removedPlugins.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (Object element : removedPlugins) { buf.append("\t\t") //$NON-NLS-1$ .append(element) .append("\r\n"); //$NON-NLS-1$ } buf.append("\tModified plug-ins: " + modifiedPlugins.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (Object element : modifiedPlugins) { buf.append("\t\t") //$NON-NLS-1$ .append(element) .append("\r\n"); //$NON-NLS-1$ } buf.append("\tAdded extensions: " + addedExtensions.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (Object element : addedExtensions.entrySet()) { buf.append("\t\t") //$NON-NLS-1$ .append(element) .append("\r\n"); //$NON-NLS-1$ } buf.append("\tRemoved extensions: " + removedExtensions.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (Object element : removedExtensions.entrySet()) { buf.append("\t\t") //$NON-NLS-1$ .append(element) .append("\r\n"); //$NON-NLS-1$ } buf.append("\tModified extensions: " + modifiedExtensions.size() //$NON-NLS-1$ + "\r\n"); //$NON-NLS-1$ for (Object element : modifiedExtensions.entrySet()) { buf.append("\t\t") //$NON-NLS-1$ .append(element) .append("\r\n"); //$NON-NLS-1$ } buf.append("Memory TOTAL/FREE/MAX: ") //$NON-NLS-1$ .append(Runtime.getRuntime().totalMemory()) .append("/") //$NON-NLS-1$ .append(Runtime.getRuntime().freeMemory()) .append("/") //$NON-NLS-1$ .append(Runtime.getRuntime().maxMemory()) .append("\r\n"); //$NON-NLS-1$ buf.append("-------------- DUMP END -----------------\r\n"); //$NON-NLS-1$ logger.debug(buf.toString()); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#addedPlugins() */ public Set addedPlugins() { return addedPlugins; } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * removedPlugins() */ public Set removedPlugins() { return removedPlugins; } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * modifiedPlugins() */ public Set modifiedPlugins() { return modifiedPlugins; } void putAddedExtension(final String extensionUid, final String extensionPointUid) { addedExtensions.put(extensionUid, extensionPointUid); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * addedExtensions() */ public Set addedExtensions() { return addedExtensions.keySet(); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * addedExtensions(java.lang.String) */ public Set addedExtensions(final String extensionPointUid) { final Set result = new HashSet(); Entry entry; for (Iterator> it = addedExtensions.entrySet().iterator(); it.hasNext();) { entry = it.next(); if (entry.getValue().equals(extensionPointUid)) { result.add(entry.getKey()); } } return Collections.unmodifiableSet(result); } void putRemovedExtension(final String extensionUid, final String extensionPointUid) { removedExtensions.put(extensionUid, extensionPointUid); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * removedExtensions() */ public Set removedExtensions() { return removedExtensions.keySet(); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * removedExtensions(java.lang.String) */ public Set removedExtensions(final String extensionPointUid) { final Set result = new HashSet(); Entry entry; for (Iterator> it = removedExtensions.entrySet().iterator(); it.hasNext();) { entry = it.next(); if (entry.getValue().equals(extensionPointUid)) { result.add(entry.getKey()); } } return Collections.unmodifiableSet(result); } void putModifiedExtension(final String extensionUid, final String extensionPointUid) { modifiedExtensions.put(extensionUid, extensionPointUid); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * modifiedExtensions() */ public Set modifiedExtensions() { return modifiedExtensions.keySet(); } /** * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData# * modifiedExtensions(java.lang.String) */ public Set modifiedExtensions(final String extensionPointUid) { final Set result = new HashSet(); Entry entry; for (Iterator> it = modifiedExtensions.entrySet().iterator(); it.hasNext();) { entry = it.next(); if (entry.getValue().equals(extensionPointUid)) { result.add(entry.getKey()); } } return Collections.unmodifiableSet(result); } } private static final class ManifestInfoImpl implements ManifestInfo { private final ModelManifestInfo model; ManifestInfoImpl(final ModelManifestInfo aModel) { model = aModel; } /** * @see org.java.plugin.registry.ManifestInfo#getId() */ public String getId() { return model.getId(); } /** * @see org.java.plugin.registry.ManifestInfo#getVersion() */ public Version getVersion() { return model.getVersion(); } /** * @see org.java.plugin.registry.ManifestInfo#getVendor() */ public String getVendor() { return model.getVendor(); } /** * @see org.java.plugin.registry.ManifestInfo#getPluginId() */ public String getPluginId() { return model.getPluginId(); } /** * @see org.java.plugin.registry.ManifestInfo#getPluginVersion() */ public Version getPluginVersion() { return model.getPluginVersion(); } /** * @see org.java.plugin.registry.ManifestInfo#getMatchingRule() */ public MatchingRule getMatchingRule() { return model.getMatchRule(); } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/PluginAttributeImpl.java0000644000175000017500000001221110554434512030640 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.java.plugin.registry.Identity; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.PluginAttribute; /** * @version $Id$ */ class PluginAttributeImpl extends PluginElementImpl implements PluginAttribute { private final PluginAttributeImpl superAttribute; private final ModelAttribute model; private List subAttributes; PluginAttributeImpl(final PluginDescriptorImpl descr, final PluginFragmentImpl aFragment, final ModelAttribute aModel, final PluginAttributeImpl aSuperAttribute) throws ManifestProcessingException { super(descr, aFragment, aModel.getId(), aModel.getDocumentation()); model = aModel; superAttribute = aSuperAttribute; if (model.getValue() == null) { model.setValue(""); //$NON-NLS-1$ } subAttributes = new ArrayList(model.getAttributes().size()); for (ModelAttribute modelAttribute : model.getAttributes()) { subAttributes.add(new PluginAttributeImpl(descr, aFragment, modelAttribute, this)); } subAttributes = Collections.unmodifiableList(subAttributes); if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.PluginAttribute#getSubAttribute(java.lang.String) */ public PluginAttribute getSubAttribute(final String id) { PluginAttributeImpl result = null; for (PluginAttribute pluginAttribute : subAttributes) { PluginAttributeImpl param = (PluginAttributeImpl) pluginAttribute; if (param.getId().equals(id)) { if (result == null) { result = param; } else { throw new IllegalArgumentException( "more than one attribute with ID " + id //$NON-NLS-1$ + " defined in plug-in " //$NON-NLS-1$ + getDeclaringPluginDescriptor().getUniqueId()); } } } return result; } /** * @see org.java.plugin.registry.PluginAttribute#getSubAttributes() */ public Collection getSubAttributes() { return subAttributes; } /** * @see org.java.plugin.registry.PluginAttribute#getSubAttributes(java.lang.String) */ public Collection getSubAttributes(final String id) { final List result = new LinkedList(); for (PluginAttribute pluginAttribute : subAttributes) { PluginAttributeImpl param = (PluginAttributeImpl) pluginAttribute; if (param.getId().equals(id)) { result.add(param); } } return Collections.unmodifiableList(result); } /** * @see org.java.plugin.registry.PluginAttribute#getValue() */ public String getValue() { return model.getValue(); } /** * @see org.java.plugin.registry.xml.IdentityImpl#isEqualTo( * org.java.plugin.registry.Identity) */ @Override protected boolean isEqualTo(final Identity idt) { if (!super.isEqualTo(idt)) { return false; } PluginAttributeImpl other = (PluginAttributeImpl) idt; if ((getSuperAttribute() == null) && (other.getSuperAttribute() == null)) { return true; } if ((getSuperAttribute() == null) || (other.getSuperAttribute() == null)) { return false; } return getSuperAttribute().equals(other.getSuperAttribute()); } /** * @see org.java.plugin.registry.PluginAttribute#getSuperAttribute() */ public PluginAttribute getSuperAttribute() { return superAttribute; } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/ParameterValueParser.java0000644000175000017500000002467510554434220031003 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.MalformedURLException; import java.net.URL; import java.text.DateFormat; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.StringTokenizer; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.ParameterType; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.ExtensionPoint.ParameterDefinition; /** * @version $Id$ */ class ParameterValueParser { private static ExtensionPoint getExtensionPoint( final PluginRegistry registry, final String uniqueId) { String pluginId = registry.extractPluginId(uniqueId); if (!registry.isPluginDescriptorAvailable(pluginId)) { return null; } String pointId = registry.extractId(uniqueId); for (ExtensionPoint point : registry.getPluginDescriptor(pluginId) .getExtensionPoints()) { if (point.getId().equals(pointId)) { return point; } } return null; } private Object value; private final boolean isParsingSucceeds; private String parsingMessage; ParameterValueParser(final PluginRegistry registry, final ParameterDefinition definition, final String rawValue) { if (definition == null) { parsingMessage = "parameter definition is NULL"; //$NON-NLS-1$ isParsingSucceeds = false; return; } if (rawValue == null) { isParsingSucceeds = true; return; } if ((ParameterType.ANY == definition.getType()) || (ParameterType.NULL == definition.getType())) { isParsingSucceeds = true; return; } else if (ParameterType.STRING == definition.getType()) { value = rawValue; isParsingSucceeds = true; return; } String val = rawValue.trim(); if (val.length() == 0) { isParsingSucceeds = true; return; } switch (definition.getType()) { case BOOLEAN: if ("true".equals(val)) { //$NON-NLS-1$ value = Boolean.TRUE; } else if ("false".equals(val)) { //$NON-NLS-1$ value = Boolean.FALSE; } else { isParsingSucceeds = false; return; } break; case NUMBER: try { value = NumberFormat.getInstance(Locale.ENGLISH).parse(val); } catch (ParseException nfe) { isParsingSucceeds = false; return; } break; case DATE: { DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); //$NON-NLS-1$ try { value = fmt.parse(val); } catch (ParseException pe) { isParsingSucceeds = false; return; } break; } case TIME: { DateFormat fmt = new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH); //$NON-NLS-1$ try { value = fmt.parse(val); } catch (ParseException pe) { isParsingSucceeds = false; return; } break; } case DATE_TIME:{ DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); //$NON-NLS-1$ try { value = fmt.parse(val); } catch (ParseException pe) { isParsingSucceeds = false; return; } break; } case PLUGIN_ID: try { value = registry.getPluginDescriptor(val); } catch (IllegalArgumentException iae) { parsingMessage = "unknown plug-in ID " + val; //$NON-NLS-1$ isParsingSucceeds = false; return; } break; case EXTENSION_POINT_ID: value = getExtensionPoint(registry, val); if (value == null) { parsingMessage = "unknown extension point UID " + val; //$NON-NLS-1$ isParsingSucceeds = false; return; } if (definition.getCustomData() != null) { ExtensionPoint customExtPoint = getExtensionPoint(registry, definition.getCustomData()); if (customExtPoint == null) { parsingMessage = "unknown extension point UID " //$NON-NLS-1$ + definition.getCustomData() + " provided as custom data"; //$NON-NLS-1$ isParsingSucceeds = false; return; } if (!((ExtensionPoint) value).isSuccessorOf( customExtPoint)) { parsingMessage = "extension point with UID " + val //$NON-NLS-1$ + " doesn't \"inherit\" point that is defined" //$NON-NLS-1$ + " according to custom data in parameter" //$NON-NLS-1$ + " definition - " //$NON-NLS-1$ + definition.getCustomData(); isParsingSucceeds = false; return; } } break; case EXTENSION_ID: String extId = registry.extractId(val); for (Extension ext : registry.getPluginDescriptor( registry.extractPluginId(val)).getExtensions()) { if (ext.getId().equals(extId)) { value = ext; break; } } if (value == null) { parsingMessage = "unknown extension UID " + val; //$NON-NLS-1$ isParsingSucceeds = false; return; } if (definition.getCustomData() != null) { ExtensionPoint customExtPoint = getExtensionPoint(registry, definition.getCustomData()); if (customExtPoint == null) { parsingMessage = "unknown extension point UID " //$NON-NLS-1$ + definition.getCustomData() + " provided as custom data in parameter definition " //$NON-NLS-1$ + definition; isParsingSucceeds = false; return; } String extPointUid = registry.makeUniqueId( ((Extension) value).getExtendedPluginId(), ((Extension) value).getExtendedPointId()); ExtensionPoint extPoint = getExtensionPoint(registry, extPointUid); if (extPoint == null) { parsingMessage = "extension point " + extPointUid //$NON-NLS-1$ + " is unknown for extension " //$NON-NLS-1$ + ((Extension) value).getUniqueId(); isParsingSucceeds = false; return; } if (!extPoint.equals(customExtPoint) && !extPoint.isSuccessorOf(customExtPoint)) { parsingMessage = "extension with UID " + val //$NON-NLS-1$ + " extends point that not allowed according" //$NON-NLS-1$ + " to custom data defined in parameter" //$NON-NLS-1$ + " definition - " //$NON-NLS-1$ + definition.getCustomData(); isParsingSucceeds = false; return; } } break; case FIXED: for (StringTokenizer st = new StringTokenizer( definition.getCustomData(), "|", false); //$NON-NLS-1$ st.hasMoreTokens();) { if (val.equals(st.nextToken().trim())) { value = val; isParsingSucceeds = true; return; } } parsingMessage = "not allowed value " + val; //$NON-NLS-1$ isParsingSucceeds = false; return; case RESOURCE: try { value = new URL(val); } catch (MalformedURLException mue) { parsingMessage = "can't parse value " + val //$NON-NLS-1$ + " as an absolute URL, will treat it as relative URL"; //$NON-NLS-1$ //return Boolean.FALSE; value = null; } isParsingSucceeds = true; return; case ANY: // no-op break; case NULL: // no-op break; case STRING: // no-op break; } isParsingSucceeds = true; } Object getValue() { return value; } String getParsingMessage() { return parsingMessage; } boolean isParsingSucceeds() { return isParsingSucceeds; } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/LibraryImpl.java0000644000175000017500000000762110554434456027142 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.java.plugin.registry.Library; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.Version; /** * @version $Id$ */ class LibraryImpl extends PluginElementImpl implements Library { private final ModelLibrary model; private List exports; LibraryImpl(final PluginDescriptorImpl descr, final PluginFragmentImpl aFragment, final ModelLibrary aModel) throws ManifestProcessingException { super(descr, aFragment, aModel.getId(), aModel.getDocumentation()); model = aModel; if ((model.getPath() == null) || (model.getPath().trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "libraryPathIsBlank"); //$NON-NLS-1$ } exports = new ArrayList(model.getExports().size()); for (String exportPrefix : model.getExports()) { if ((exportPrefix == null) || (exportPrefix.trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "exportPrefixIBlank"); //$NON-NLS-1$ } exportPrefix = exportPrefix.replace('\\', '.').replace('/', '.'); if (exportPrefix.startsWith(".")) { //$NON-NLS-1$ exportPrefix = exportPrefix.substring(1); } exports.add(exportPrefix); } exports = Collections.unmodifiableList(exports); if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.Library#getPath() */ public String getPath() { return model.getPath(); } /** * @see org.java.plugin.registry.Library#getExports() */ public Collection getExports() { return exports; } /** * @see org.java.plugin.registry.Library#isCodeLibrary() */ public boolean isCodeLibrary() { return model.isCodeLibrary(); } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getRegistry().makeUniqueId( getDeclaringPluginDescriptor().getId(), getId()); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{Library: uid=" + getUniqueId() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ } /** * @see org.java.plugin.registry.Library#getVersion() */ public Version getVersion() { return model.getVersion(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/IntegrityChecker.java0000644000175000017500000002636710554444256030166 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.URL; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Locale; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.PathResolver; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.registry.Library; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.util.IoUtil; import org.java.plugin.util.ResourceManager; /** * @version $Id$ */ class IntegrityChecker implements IntegrityCheckReport { private static Log log = LogFactory.getLog(IntegrityChecker.class); private final PluginRegistryImpl registry; private List items = new LinkedList(); private int errorsCount; private int warningsCount; IntegrityChecker(final PluginRegistryImpl aRegistry, final Collection anItems) { this.items = new LinkedList(); this.registry = aRegistry; for (ReportItem item : anItems) { switch (item.getSeverity()) { case ERROR: break; case WARNING: warningsCount++; break; case INFO: // no-op break; } this.items.add(item); } } void doCheck(final PathResolver pathResolver) { int count = 0; items.add(new ReportItemImpl(Severity.INFO, null, Error.NO_ERROR, "pluginsCheckStart", null)); //$NON-NLS-1$ try { for (PluginDescriptor descriptor : registry.getPluginDescriptors()) { PluginDescriptorImpl descr = (PluginDescriptorImpl) descriptor; count++; items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "pluginCheckStart", //$NON-NLS-1$ descr.getUniqueId())); checkPlugin(descr, pathResolver); items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "pluginCheckFinish", //$NON-NLS-1$ descr.getUniqueId())); } } catch (Exception e) { log.error("integrity check failed for registry " + registry, e); //$NON-NLS-1$ errorsCount++; items.add(new ReportItemImpl(Severity.ERROR, null, Error.CHECKER_FAULT, "pluginsCheckError", e)); //$NON-NLS-1$ } items.add(new ReportItemImpl(Severity.INFO, null, Error.NO_ERROR, "pluginsCheckFinish", Integer.valueOf(count))); //$NON-NLS-1$ } private void checkPlugin(final PluginDescriptorImpl descr, final PathResolver pathResolver) { // checking prerequisites int count = 0; items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "prerequisitesCheckStart", descr.getUniqueId())); //$NON-NLS-1$ for (PluginPrerequisite prerequisite : descr.getPrerequisites()) { PluginPrerequisiteImpl pre = (PluginPrerequisiteImpl) prerequisite; count++; if (!pre.isOptional() && !pre.matches()) { errorsCount++; items.add(new ReportItemImpl(Severity.ERROR, descr, Error.UNSATISFIED_PREREQUISITE, "unsatisfiedPrerequisite", new Object[] { //$NON-NLS-1$ pre.getPluginId(), descr.getUniqueId()})); } } items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "prerequisitesCheckFinish", //$NON-NLS-1$ new Object[] {Integer.valueOf(count), descr.getUniqueId()})); // checking libraries if (pathResolver != null) { count = 0; items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "librariesCheckStart", descr.getUniqueId())); //$NON-NLS-1$ for (Library library : descr.getLibraries()) { LibraryImpl lib = (LibraryImpl) library; count++; URL url = pathResolver.resolvePath(lib, lib.getPath()); if (!IoUtil.isResourceExists(url)) { errorsCount++; items.add(new ReportItemImpl(Severity.ERROR, lib, Error.BAD_LIBRARY, "accesToResourceFailed", new Object[] { //$NON-NLS-1$ lib.getUniqueId(), descr.getUniqueId(), url})); } } items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "librariesCheckFinish", //$NON-NLS-1$ new Object[] {Integer.valueOf(count), descr.getUniqueId()})); } else { items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "librariesCheckSkip", descr.getUniqueId())); //$NON-NLS-1$ } // checking extension points count = 0; items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "extPointsCheckStart", null)); //$NON-NLS-1$ for (ExtensionPoint extensionPoint : descr.getExtensionPoints()) { count++; ExtensionPointImpl extPoint = (ExtensionPointImpl) extensionPoint; items.add(new ReportItemImpl(Severity.INFO, extPoint, Error.NO_ERROR, "extPointCheckStart", //$NON-NLS-1$ extPoint.getUniqueId())); Collection extPointItems = extPoint.validate(); for (ReportItem item : extPointItems) { switch (item.getSeverity()) { case ERROR: errorsCount++; break; case WARNING: warningsCount++; break; case INFO: // no-op break; } items.add(item); } items.add(new ReportItemImpl(Severity.INFO, extPoint, Error.NO_ERROR, "extPointCheckFinish", //$NON-NLS-1$ extPoint.getUniqueId())); } items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "extPointsCheckFinish", //$NON-NLS-1$ new Object[] {Integer.valueOf(count), descr.getUniqueId()})); // checking extensions count = 0; items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "extsCheckStart", null)); //$NON-NLS-1$ for (Extension extension : descr.getExtensions()) { count++; ExtensionImpl ext = (ExtensionImpl) extension; items.add(new ReportItemImpl(Severity.INFO, ext, Error.NO_ERROR, "extCheckStart", ext.getUniqueId())); //$NON-NLS-1$ Collection extItems = ext.validate(); for (ReportItem item : extItems) { switch (item.getSeverity()) { case ERROR: errorsCount++; break; case WARNING: warningsCount++; break; case INFO: // no-op break; } items.add(item); } items.add(new ReportItemImpl(Severity.INFO, ext, Error.NO_ERROR, "extCheckFinish", ext.getUniqueId())); //$NON-NLS-1$ } items.add(new ReportItemImpl(Severity.INFO, descr, Error.NO_ERROR, "extsCheckFinish", //$NON-NLS-1$ new Object[] {Integer.valueOf(count), descr.getUniqueId()})); } /** * @see org.java.plugin.registry.IntegrityCheckReport#countErrors() */ public int countErrors() { return errorsCount; } /** * @see org.java.plugin.registry.IntegrityCheckReport#countWarnings() */ public int countWarnings() { return warningsCount; } /** * @see org.java.plugin.registry.IntegrityCheckReport#getItems() */ public Collection getItems() { return items; } static class ReportItemImpl implements ReportItem { private final Severity severity; private final Identity source; private final Error code; private final String msg; private final Object data; ReportItemImpl(final Severity aSeverity, final Identity aSource, final Error aCode, final String aMsg, final Object aData) { severity = aSeverity; source = aSource; code = aCode; msg = aMsg; data = aData; } /** * @see org.java.plugin.registry.IntegrityCheckReport.ReportItem#getCode() */ public Error getCode() { return code; } /** * @see org.java.plugin.registry.IntegrityCheckReport.ReportItem#getMessage() */ public String getMessage() { return ResourceManager.getMessage(PluginRegistryImpl.PACKAGE_NAME, msg, data); } /** * @see org.java.plugin.registry.IntegrityCheckReport.ReportItem#getMessage( * java.util.Locale) */ public String getMessage(Locale locale) { return ResourceManager.getMessage(PluginRegistryImpl.PACKAGE_NAME, msg, locale, data); } /** * @see org.java.plugin.registry.IntegrityCheckReport.ReportItem#getSeverity() */ public Severity getSeverity() { return severity; } /** * @see org.java.plugin.registry.IntegrityCheckReport.ReportItem#getSource() */ public Identity getSource() { return source; } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/Resources_ru.properties0000644000175000017500000005170010554435740030641 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2007 Dmitry Olshansky # $Id$ # Exceptions related messages manifestParsingError = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 {0} duplicatePlugin = \u043f\u043b\u0430\u0433\u0438\u043d \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d duplicatePluginFragment = \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d manifestElementIdIsBlank = \u043f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 extensionIdIsBlank = \u043f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {0} extendedPointIdIsBlank = \u043f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {0} duplicateParameterDefinition = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {2} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 {0} \u0434\u043b\u044f \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {1} invalidDefaultValueAttribute = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {2} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 {0} \u0434\u043b\u044f \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {1} libraryPathIsBlank = \u043f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 exportPrefixIBlank = \u043f\u0443\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 duplicateImports = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} duplicateLibraries = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 {0} duplicateExtensionPoints = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} duplicateExtensions = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} pluginNotDeclaredInPrerequisites = \u043f\u043b\u0430\u0433\u0438\u043d {0} \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 {1} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {2} fragmentPliginIdIsBlank = \u0432 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 invalidFragmentPluginId = \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 prerequisitePliginIdIsBlank = \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {0} invalidPrerequisitePluginId = \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} # Integrity checking related messages extPointNotAvailable = \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {1} \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} cantDetectParameterDef = \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 {1} \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} tooManyOrFewParams = \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} tooManyParams = \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} tooFewParams = \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 {1} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} invalidParameterValue = \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 {2} \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 {0} (\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c {1}) pluginsCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 pluginCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} pluginCheckFinish = \u043f\u043b\u0430\u0433\u0438\u043d {0} \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d pluginsCheckError = \u043e\u0431\u0449\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 - {0} pluginsCheckFinish = \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 - {0} prerequisitesCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 \u0434\u043b\u044f {0} unsatisfiedPrerequisite = \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d {0} prerequisitesCheckFinish = \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1} \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 - {0} librariesCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f {0} accesToResourceFailed = \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 {1} \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 {0} \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 (URL) {2} librariesCheckFinish = \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1} \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a - {0} librariesCheckSkip = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u0442.\u043a. \u043d\u0435 \u0437\u0430\u0434\u0430\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u0439 extPointsCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f extPointCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} extPointCheckFinish = \u0442\u043e\u0447\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 extPointsCheckFinish = \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1} \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f - {0} extsCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 extCheckStart = \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} extCheckFinish = \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 {0} \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e extsCheckFinish = \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1} \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 - {0} parentExtPointNotAvailable = \u0434\u043b\u044f \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {1} \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} parentExtPointAvailabilityCheckFailed = \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {0} \u0434\u043b\u044f \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f {1} - {2} toManyOrFewExtsConnected = \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043a \u0442\u043e\u0447\u043a\u0435 {0} extsConnectedToAbstractExtPoint = \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043a \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 {0} toManyExtsConnected = \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e \u043a \u0442\u043e\u0447\u043a\u0435 {0} # registry events related messages registryStart = \u0437\u0430\u043f\u0443\u0441\u043a \u0440\u0435\u0435\u0441\u0442\u0440\u0430 manifestsParsingStart = \u0440\u0430\u0437\u0431\u043e\u0440 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 manifestParsingError = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442, URL - {0}, \u043e\u0448\u0438\u0431\u043a\u0430 - {1} manifestsParsingFinish = \u0444\u0430\u0439\u043b\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b, \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 - {0}, \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 - {1} registeringPluginsStart = \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 registeringFragmentsStart = \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 registeringPluginsFinish = \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 - {0} registeringFragmentsFinish = \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 - {0} duplicatedPluginId = \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} \u0442.\u043a. \u043f\u043b\u0430\u0433\u0438\u043d \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d duplicatedFragmentId = \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} \u0442.\u043a. \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d pluginRegistered = \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d {0} pluginRegistrationFailed = \u0441\u0431\u043e\u0439 \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430, URL - {0}, \u043e\u0448\u0438\u0431\u043a\u0430 - {1} noMatchingPluginFound = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 {0} fragmentRegistered = \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} fragmentRegistrationFailed = \u0441\u0431\u043e\u0439 \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430, URL - {0}, \u043e\u0448\u0438\u0431\u043a\u0430 - {1} unregisteringPrepare = \u0441\u0431\u043e\u0440 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c pluginToUngregisterNotFound = \u043f\u043b\u0430\u0433\u0438\u043d \u0438\u043b\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {0} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d unregisteringFragmentsStart = \u0440\u0430\u0437\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 unregisteringPluginsStart = \u0440\u0430\u0437\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 unregisteringPluginsFinish = \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 - {0} unregisteringFragmentsFinish = \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 - {0} pluginUnregistered = \u043f\u043b\u0430\u0433\u0438\u043d {0} \u0440\u0430\u0437\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d fragmentUnregistered = \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} \u0440\u0430\u0437\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043dlibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/Model.java0000644000175000017500000003644110572344612025750 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.URL; import java.util.LinkedList; import java.util.List; import org.java.plugin.registry.ExtensionMultiplicity; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.ParameterMultiplicity; import org.java.plugin.registry.ParameterType; import org.java.plugin.registry.Version; /** * @version $Id: Model.java,v 1.4 2007/03/03 17:16:26 ddimon Exp $ */ abstract class ModelPluginManifest { private URL location; private String id; private Version version; private String vendor; private String docsPath; private ModelDocumentation documentation; private LinkedList attributes = new LinkedList(); private LinkedList prerequisites = new LinkedList(); private LinkedList libraries = new LinkedList(); private LinkedList extensionPoints = new LinkedList(); private LinkedList extensions = new LinkedList(); URL getLocation() { return location; } void setLocation(final URL value) { location = value; } String getDocsPath() { return docsPath; } void setDocsPath(final String value) { docsPath = value; } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation value) { documentation = value; } String getId() { return id; } void setId(final String value) { id = value; } String getVendor() { return vendor; } void setVendor(final String value) { vendor = value; } Version getVersion() { return version; } void setVersion(final String value) { version = Version.parse(value); } List getAttributes() { return attributes; } List getExtensionPoints() { return extensionPoints; } List getExtensions() { return extensions; } List getLibraries() { return libraries; } List getPrerequisites() { return prerequisites; } } final class ModelPluginDescriptor extends ModelPluginManifest { private String className; ModelPluginDescriptor() { // no-op } String getClassName() { return className; } void setClassName(final String value) { className = value; } } final class ModelPluginFragment extends ModelPluginManifest { private String pluginId; private Version pluginVersion; private MatchingRule matchingRule = MatchingRule.COMPATIBLE; ModelPluginFragment() { // no-op } MatchingRule getMatchingRule() { return matchingRule; } void setMatchingRule(final MatchingRule value) { matchingRule = value; } String getPluginId() { return pluginId; } void setPluginId(final String value) { pluginId = value; } Version getPluginVersion() { return pluginVersion; } void setPluginVersion(final String value) { pluginVersion = Version.parse(value); } } final class ModelDocumentation { private LinkedList references = new LinkedList(); private String caption; private String text; ModelDocumentation() { // no-op } String getCaption() { return caption; } void setCaption(final String value) { caption = value; } String getText() { return text; } void setText(final String value) { text = value; } List getReferences() { return references; } } final class ModelDocumentationReference { private String path; private String caption; ModelDocumentationReference() { // no-op } String getCaption() { return caption; } void setCaption(final String value) { caption = value; } String getPath() { return path; } void setPath(final String value) { path = value; } } final class ModelAttribute { private String id; private String value; private ModelDocumentation documentation; private LinkedList attributes = new LinkedList(); ModelAttribute() { // no-op } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation aValue) { documentation = aValue; } String getId() { return id; } void setId(final String aValue) { id = aValue; } String getValue() { return value; } void setValue(final String aValue) { value = aValue; } List getAttributes() { return attributes; } } final class ModelPrerequisite { private String id; private String pluginId; private Version pluginVersion; private MatchingRule matchingRule = MatchingRule.COMPATIBLE; private ModelDocumentation documentation; private boolean isExported; private boolean isOptional; private boolean isReverseLookup; ModelPrerequisite() { // no-op } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation value) { documentation = value; } String getId() { return id; } void setId(final String value) { id = value; } boolean isExported() { return isExported; } void setExported(final String value) { isExported = "true".equals(value); //$NON-NLS-1$ } boolean isOptional() { return isOptional; } void setOptional(final String value) { isOptional = "true".equals(value); //$NON-NLS-1$ } boolean isReverseLookup() { return isReverseLookup; } void setReverseLookup(final String value) { isReverseLookup = "true".equals(value); //$NON-NLS-1$ } MatchingRule getMatchingRule() { return matchingRule; } void setMatchingRule(final MatchingRule value) { matchingRule = value; } String getPluginId() { return pluginId; } void setPluginId(final String value) { pluginId = value; } Version getPluginVersion() { return pluginVersion; } void setPluginVersion(final String value) { pluginVersion = Version.parse(value); } } final class ModelLibrary { private String id; private String path; private boolean isCodeLibrary; private ModelDocumentation documentation; private LinkedList exports = new LinkedList(); private Version version; ModelLibrary() { // no-op } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation value) { documentation = value; } String getId() { return id; } void setId(final String value) { id = value; } boolean isCodeLibrary() { return isCodeLibrary; } void setCodeLibrary(final String value) { isCodeLibrary = "code".equals(value); //$NON-NLS-1$ } String getPath() { return path; } void setPath(final String value) { path = value; } List getExports() { return exports; } Version getVersion() { return version; } void setVersion(final String value) { version = Version.parse(value); } } final class ModelExtensionPoint { private String id; private String parentPluginId; private String parentPointId; private ExtensionMultiplicity extensionMultiplicity = ExtensionMultiplicity.ONE; private ModelDocumentation documentation; private LinkedList paramDefs = new LinkedList(); ModelExtensionPoint() { // no-op } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation value) { documentation = value; } ExtensionMultiplicity getExtensionMultiplicity() { return extensionMultiplicity; } void setExtensionMultiplicity(final ExtensionMultiplicity value) { extensionMultiplicity = value; } String getId() { return id; } void setId(final String value) { id = value; } String getParentPluginId() { return parentPluginId; } void setParentPluginId(final String value) { parentPluginId = value; } String getParentPointId() { return parentPointId; } void setParentPointId(final String value) { parentPointId = value; } List getParamDefs() { return paramDefs; } } final class ModelParameterDef { private String id; private ParameterMultiplicity multiplicity = ParameterMultiplicity.ONE; private ParameterType type = ParameterType.STRING; private String customData; private ModelDocumentation documentation; private LinkedList paramDefs = new LinkedList(); private String defaultValue; ModelParameterDef() { // no-op } String getCustomData() { return customData; } void setCustomData(final String value) { customData = value; } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation value) { documentation = value; } String getId() { return id; } void setId(final String value) { id = value; } ParameterMultiplicity getMultiplicity() { return multiplicity; } void setMultiplicity(final ParameterMultiplicity value) { multiplicity = value; } ParameterType getType() { return type; } void setType(final ParameterType value) { type = value; } List getParamDefs() { return paramDefs; } String getDefaultValue() { return defaultValue; } void setDefaultValue(final String value) { defaultValue = value; } } final class ModelExtension { private String id; private String pluginId; private String pointId; private ModelDocumentation documentation; private LinkedList params = new LinkedList(); ModelExtension() { // no-op } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation value) { documentation = value; } String getId() { return id; } void setId(final String value) { id = value; } String getPluginId() { return pluginId; } void setPluginId(final String value) { pluginId = value; } String getPointId() { return pointId; } void setPointId(final String value) { pointId = value; } List getParams() { return params; } } final class ModelParameter { private String id; private String value; private ModelDocumentation documentation; private LinkedList params = new LinkedList(); ModelParameter() { // no-op } ModelDocumentation getDocumentation() { return documentation; } void setDocumentation(final ModelDocumentation aValue) { documentation = aValue; } String getId() { return id; } void setId(final String aValue) { id = aValue; } String getValue() { return value; } void setValue(final String aValue) { value = aValue; } List getParams() { return params; } } final class ModelManifestInfo { private String id; private Version version; private String vendor; private String pluginId; private Version pluginVersion; private MatchingRule matchingRule = MatchingRule.COMPATIBLE; ModelManifestInfo() { // no-op } String getId() { return id; } void setId(final String value) { id = value; } String getVendor() { return vendor; } void setVendor(final String value) { vendor = value; } Version getVersion() { return version; } void setVersion(final String value) { version = Version.parse(value); } MatchingRule getMatchRule() { return matchingRule; } void setMatchingRule(final MatchingRule value) { matchingRule = value; } String getPluginId() { return pluginId; } void setPluginId(final String value) { pluginId = value; } Version getPluginVersion() { return pluginVersion; } void setPluginVersion(final String value) { pluginVersion = Version.parse(value); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/package.html0000644000175000017500000000020510514424202026301 0ustar gregoagregoa

This package contains XML syntax manifest files based framework registry API implementation.

libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/Resources.properties0000644000175000017500000001222210554435746030135 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2007 Dmitry Olshansky # $Id$ # Exceptions related messages manifestParsingError = can't parse manifest file {0} duplicatePlugin = plug-in with ID {0} already registered duplicatePluginFragment = plug-in fragment with ID {0} already registered manifestElementIdIsBlank = manifest element ID is blank extensionIdIsBlank = extension ID is blank in plug-in {0} extendedPointIdIsBlank = extended point ID is blank in plug-in {0} duplicateParameterDefinition = duplicate parameter definition ID attribute {0} found for extension point {1} in plug-in {2} invalidDefaultValueAttribute = parameter definition default value attribute {0} is invalid for extension point {1} in plug-in {2} libraryPathIsBlank = library path is blank exportPrefixIBlank = export prefix is blank duplicateImports = duplicate imports of plug-in {0} found in plug-in {1} duplicateLibraries = duplicate library ID {0} found in plug-in {1} duplicateExtensionPoints = duplicate extension point ID {0} found in plug-in {1} duplicateExtensions = duplicate extension ID {0} found in plug-in {1} pluginNotDeclaredInPrerequisites = plug-in {0} declared in extension {1} not found in prerequisites in plug-in {2} fragmentPliginIdIsBlank = plug-in ID is blank in plug-in fragment {0} invalidFragmentPluginId = fragment plug-in ID equals to declaring ID in plug-in fragment {0} prerequisitePliginIdIsBlank = prerequisite plug-in ID is blank in plug-in {0} invalidPrerequisitePluginId = prerequisite plug-in ID equals to declaring ID in plug-in fragment {0} # Integrity checking related messages extPointNotAvailable = extension point {0} not available for extension {1} cantDetectParameterDef = can't detect definition for parameter {0} in extension {1} tooManyOrFewParams = too many or too few parameters {0} defined in extension {1} tooManyParams = too many parameters {0} defined in extension {1} tooFewParams = too few parameters {0} defined in extension {1} invalidParameterValue = parameter {0} ({1}), defined in extension {2}, has invalid value pluginsCheckStart = checking plug-ins pluginCheckStart = checking plug-in {0} pluginCheckFinish = plug-in {0} checked pluginsCheckError = general integrity check error - {0} pluginsCheckFinish = {0} plug-ins checked prerequisitesCheckStart = checking prerequisites for {0} unsatisfiedPrerequisite = prerequisite {0} unsatisfied in plug-in {1} prerequisitesCheckFinish = checked {0} prerequisites for {1} librariesCheckStart = checking libraries for {0} accesToResourceFailed = can't access to resources from library {0} in plug-in {1}, URL is {2} librariesCheckFinish = checked {0} libraries for {1} librariesCheckSkip = checking libraries for {0} skipped as no path resolver provided extPointsCheckStart = checking extension points extPointCheckStart = checking extension point {0} extPointCheckFinish = extension point {0} checked extPointsCheckFinish = checked {0} extension points for {1} extsCheckStart = checking extensions extCheckStart = checking extension {0} extCheckFinish = extension {0} checked extsCheckFinish = checked {0} extensions for {1} parentExtPointNotAvailable = can't get parent extension point {0} to {1} parentExtPointAvailabilityCheckFailed = can't get parent extension point {0} to {1}, error - {2} toManyOrFewExtsConnected = too many or too few extensions are connected to extension point {0} extsConnectedToAbstractExtPoint = extensions are connected to the abstract extension point {0} toManyExtsConnected = too many extensions are connected to extension point {0} # registry events related messages registryStart = starting up registry manifestsParsingStart = parsing plug-in manifests manifestParsingError = can't parse manifest, URL - {0}, error - {1} manifestsParsingFinish = manifest files parsed, plug-ins found - {0}, fragments found - {1} registeringPluginsStart = registering plug-ins registeringFragmentsStart = registering plug-in fragments registeringPluginsFinish = total number of registered plug-ins now is {0} registeringFragmentsFinish = total number of registered plug-in fragments now is {0} duplicatedPluginId = skipping registering plug-in with ID {0} as it is already registered duplicatedFragmentId = skipping registering of plug-in fragment with ID {0} as it is already registered pluginRegistered = plug-in {0} registered pluginRegistrationFailed = failed registering plug-in, URL - {0}, error - {1} noMatchingPluginFound = no matching plug-ins found for fragment {0} fragmentRegistered = plug-in fragment {0} registered fragmentRegistrationFailed = failed registering plug-in fragment, URL - {0}, error - {1} unregisteringPrepare = collecting plug-in and plug-in fragments to be unregistered pluginToUngregisterNotFound = no registered plug-in nor plug-in fragment found with ID {0} unregisteringFragmentsStart = un-registering plug-in fragments unregisteringPluginsStart = un-registering plug-ins unregisteringPluginsFinish = total number of registered plug-ins now is {0} unregisteringFragmentsFinish = total number of registered plug-in fragments now is {0} pluginUnregistered = plug-in {0} unregistered fragmentUnregistered = plug-in fragment {0} unregisteredlibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/PluginPrerequisiteImpl.java0000644000175000017500000001504410554434530031365 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.Version; /** * @version $Id$ */ class PluginPrerequisiteImpl implements PluginPrerequisite { private static Log log = LogFactory.getLog(PluginPrerequisiteImpl.class); static boolean matches(final Version source, final Version target, final MatchingRule match) { if (source == null) { return true; } switch (match) { case EQUAL: return target.equals(source); case EQUIVALENT: return target.isEquivalentTo(source); case COMPATIBLE: return target.isCompatibleWith(source); case GREATER_OR_EQUAL: return target.isGreaterOrEqualTo(source); } return target.isCompatibleWith(source); } private final PluginDescriptorImpl descriptor; private final PluginFragmentImpl fragment; private final ModelPrerequisite model; private DocumentationImpl doc; PluginPrerequisiteImpl(final PluginDescriptorImpl descr, final PluginFragmentImpl aFragment, final ModelPrerequisite aModel) throws ManifestProcessingException { super(); descriptor = descr; fragment = aFragment; model = aModel; if ((model.getPluginId() == null) || (model.getPluginId().trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "prerequisitePliginIdIsBlank", descr.getId()); //$NON-NLS-1$ } if (descr.getId().equals(model.getPluginId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "invalidPrerequisitePluginId", descr.getId()); //$NON-NLS-1$ } if ((model.getId() == null) || (model.getId().trim().length() == 0)) { model.setId("prerequisite:" + model.getPluginId()); //$NON-NLS-1$ } if (model.getDocumentation() != null) { doc = new DocumentationImpl(this, model.getDocumentation()); } if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.PluginPrerequisite#getPluginId() */ public String getPluginId() { return model.getPluginId(); } /** * @see org.java.plugin.registry.PluginPrerequisite#getPluginVersion() */ public Version getPluginVersion() { return model.getPluginVersion(); } /** * @see org.java.plugin.registry.PluginPrerequisite#getDeclaringPluginDescriptor() */ public PluginDescriptor getDeclaringPluginDescriptor() { return descriptor; } /** * @see org.java.plugin.registry.PluginPrerequisite#getDeclaringPluginFragment() */ public PluginFragment getDeclaringPluginFragment() { return fragment; } /** * @see org.java.plugin.registry.PluginPrerequisite#isOptional() */ public boolean isOptional() { return model.isOptional(); } /** * @see org.java.plugin.registry.PluginPrerequisite#isReverseLookup() */ public boolean isReverseLookup() { return model.isReverseLookup(); } /** * @see org.java.plugin.registry.PluginPrerequisite#matches() */ public boolean matches() { PluginDescriptor descr = null; try { descr = this.descriptor.getRegistry().getPluginDescriptor( model.getPluginId()); } catch (IllegalArgumentException iae) { return false; } return matches(model.getPluginVersion(), descr.getVersion(), model.getMatchingRule()); } /** * @see org.java.plugin.registry.PluginPrerequisite#getMatchingRule() */ public MatchingRule getMatchingRule() { return model.getMatchingRule(); } /** * @see org.java.plugin.registry.PluginPrerequisite#isExported() */ public boolean isExported() { return model.isExported(); } /** * @see org.java.plugin.registry.Identity#getId() */ public String getId() { return model.getId(); } /** * @see org.java.plugin.registry.Documentable#getDocsPath() */ public String getDocsPath() { return (fragment != null) ? fragment.getDocsPath() : descriptor.getDocsPath(); } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return doc; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return descriptor.getRegistry().makeUniqueId( descriptor.getId(), getId()); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{Prerequisite: uid=" + getUniqueId() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/PluginFragmentImpl.java0000644000175000017500000001355610572344612030456 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.URL; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Identity; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; /** * @version $Id: PluginFragmentImpl.java,v 1.4 2007/03/03 17:16:26 ddimon Exp $ */ class PluginFragmentImpl extends IdentityImpl implements PluginFragment { private final PluginRegistry registry; private final ModelPluginFragment model; private Documentation doc; PluginFragmentImpl(final PluginRegistry aRegistry, final ModelPluginFragment aModel) throws ManifestProcessingException { super(aModel.getId()); registry = aRegistry; model = aModel; if (model.getVendor() == null) { model.setVendor(""); //$NON-NLS-1$ } if ((model.getPluginId() == null) || (model.getPluginId().trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "fragmentPliginIdIsBlank", getId()); //$NON-NLS-1$ } if (getId().equals(model.getPluginId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "invalidFragmentPluginId", getId()); //$NON-NLS-1$ } if ((model.getDocsPath() == null) || (model.getDocsPath().trim().length() == 0)) { model.setDocsPath("docs"); //$NON-NLS-1$ } if (model.getDocumentation() != null) { doc = new DocumentationImpl(this, model.getDocumentation()); } if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } ModelPluginFragment getModel() { return model; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return registry.makeUniqueId(getId(), model.getVersion()); } /** * @see org.java.plugin.registry.PluginFragment#getVendor() */ public String getVendor() { return model.getVendor(); } /** * @see org.java.plugin.registry.PluginFragment#getVersion() */ public Version getVersion() { return model.getVersion(); } /** * @see org.java.plugin.registry.PluginFragment#getPluginId() */ public String getPluginId() { return model.getPluginId(); } /** * @see org.java.plugin.registry.PluginFragment#getPluginVersion() */ public Version getPluginVersion() { return model.getPluginVersion(); } /** * @see org.java.plugin.registry.PluginFragment#getRegistry() */ public PluginRegistry getRegistry() { return registry; } /** * @see org.java.plugin.registry.PluginFragment#matches( * org.java.plugin.registry.PluginDescriptor) */ public boolean matches(final PluginDescriptor descr) { return PluginPrerequisiteImpl.matches(model.getPluginVersion(), descr.getVersion(), model.getMatchingRule()); } /** * @see org.java.plugin.registry.PluginFragment#getMatchingRule() */ public MatchingRule getMatchingRule() { return model.getMatchingRule(); } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return doc; } /** * @see org.java.plugin.registry.PluginFragment#getDocsPath() */ public String getDocsPath() { return model.getDocsPath(); } /** * @see org.java.plugin.registry.PluginFragment#getLocation() */ public URL getLocation() { return model.getLocation(); } /** * @see org.java.plugin.registry.xml.IdentityImpl#isEqualTo( * org.java.plugin.registry.Identity) */ @Override protected boolean isEqualTo(final Identity idt) { if (!(idt instanceof PluginFragmentImpl)) { return false; } PluginFragmentImpl other = (PluginFragmentImpl) idt; return getUniqueId().equals(other.getUniqueId()) && getLocation().toExternalForm().equals( other.getLocation().toExternalForm()); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{PluginFragment: uid=" + getUniqueId() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/ManifestHandler.java0000644000175000017500000004727110554436734027766 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import org.java.plugin.registry.ExtensionMultiplicity; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.ParameterMultiplicity; import org.java.plugin.registry.ParameterType; import org.xml.sax.Attributes; import org.xml.sax.EntityResolver; import org.xml.sax.SAXException; /** * @version $Id$ */ final class ManifestHandler extends BaseHandler { private ModelPluginManifest manifest = null; private ModelDocumentation documentation = null; private ModelPrerequisite prerequisite; private ModelLibrary library; private ModelExtensionPoint extensionPoint; private ModelExtension extension; private StringBuilder docText = null; private SimpleStack attributeStack = null; private ModelAttribute attribute; private SimpleStack paramDefStack = null; private ModelParameterDef paramDef; private SimpleStack paramStack = null; private ModelParameter param; private StringBuilder paramValue = null; ManifestHandler(final EntityResolver anEntityResolver) { super(anEntityResolver); } /** * @see org.xml.sax.ContentHandler#startElement(java.lang.String, * java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException { if (log.isDebugEnabled()) { log.debug("startElement - [" + uri + "]/[" //$NON-NLS-1$ //$NON-NLS-2$ + localName + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } String name = qName; if ("plugin".equals(name)) { //$NON-NLS-1$ if (manifest != null) { throw new SAXException("unexpected [" + name //$NON-NLS-1$ + "] element (manifest already defined)"); //$NON-NLS-1$ } manifest = new ModelPluginDescriptor(); manifest.setId(attributes.getValue("id")); //$NON-NLS-1$ manifest.setVersion(attributes.getValue("version")); //$NON-NLS-1$ manifest.setVendor(attributes.getValue("vendor")); //$NON-NLS-1$ manifest.setDocsPath(attributes.getValue("docs-path")); //$NON-NLS-1$ ((ModelPluginDescriptor) manifest).setClassName( attributes.getValue("class")); //$NON-NLS-1$ } else if ("plugin-fragment".equals(name)) { //$NON-NLS-1$ if (manifest != null) { throw new SAXException("unexpected [" + name //$NON-NLS-1$ + "] element (manifest already defined)"); //$NON-NLS-1$ } manifest = new ModelPluginFragment(); manifest.setId(attributes.getValue("id")); //$NON-NLS-1$ manifest.setVersion(attributes.getValue("version")); //$NON-NLS-1$ manifest.setVendor(attributes.getValue("vendor")); //$NON-NLS-1$ manifest.setDocsPath(attributes.getValue("docs-path")); //$NON-NLS-1$ ((ModelPluginFragment) manifest).setPluginId( attributes.getValue("plugin-id")); //$NON-NLS-1$ if (attributes.getValue("plugin-version") != null) { //$NON-NLS-1$ ((ModelPluginFragment) manifest).setPluginVersion( attributes.getValue("plugin-version")); //$NON-NLS-1$ } if (attributes.getValue("match") != null) { //$NON-NLS-1$ ((ModelPluginFragment) manifest).setMatchingRule( MatchingRule.fromCode(attributes.getValue("match"))); //$NON-NLS-1$ } else { ((ModelPluginFragment) manifest).setMatchingRule(MatchingRule.COMPATIBLE); } } else if ("doc".equals(name)) { //$NON-NLS-1$ documentation = new ModelDocumentation(); documentation.setCaption(attributes.getValue("caption")); //$NON-NLS-1$ } else if ("doc-ref".equals(name)) { //$NON-NLS-1$ if (documentation == null) { if (entityResolver != null) { throw new SAXException("[doc-ref] element found " //$NON-NLS-1$ + "outside of [doc] element"); //$NON-NLS-1$ } // ignore this element log.warn("[doc-ref] element found outside of [doc] element"); //$NON-NLS-1$ return; } ModelDocumentationReference docRef = new ModelDocumentationReference(); docRef.setPath(attributes.getValue("path")); //$NON-NLS-1$ docRef.setCaption(attributes.getValue("caption")); //$NON-NLS-1$ documentation.getReferences().add(docRef); } else if ("doc-text".equals(name)) { //$NON-NLS-1$ if (documentation == null) { if (entityResolver != null) { throw new SAXException("[doc-text] element found " //$NON-NLS-1$ + "outside of [doc] element"); //$NON-NLS-1$ } // ignore this element log.warn("[doc-text] element found outside of [doc] element"); //$NON-NLS-1$ return; } docText = new StringBuilder(); } else if ("attributes".equals(name)) { //$NON-NLS-1$ attributeStack = new SimpleStack(); } else if ("attribute".equals(name)) { //$NON-NLS-1$ if (attributeStack == null) { if (entityResolver != null) { throw new SAXException("[attribute] element found " //$NON-NLS-1$ + "outside of [attributes] element"); //$NON-NLS-1$ } // ignore this element log.warn("[attribute] element found " //$NON-NLS-1$ + "outside of [attributes] element"); //$NON-NLS-1$ return; } if (attribute != null) { attributeStack.push(attribute); } attribute = new ModelAttribute(); attribute.setId(attributes.getValue("id")); //$NON-NLS-1$ attribute.setValue(attributes.getValue("value")); //$NON-NLS-1$ } else if ("requires".equals(name)) { //$NON-NLS-1$ // no-op } else if ("import".equals(name)) { //$NON-NLS-1$ prerequisite = new ModelPrerequisite(); if (attributes.getValue("id") != null) { //$NON-NLS-1$ prerequisite.setId(attributes.getValue("id")); //$NON-NLS-1$ } prerequisite.setPluginId(attributes.getValue("plugin-id")); //$NON-NLS-1$ if (attributes.getValue("plugin-version") != null) { //$NON-NLS-1$ prerequisite.setPluginVersion( attributes.getValue("plugin-version")); //$NON-NLS-1$ } if (attributes.getValue("match") != null) { //$NON-NLS-1$ prerequisite.setMatchingRule( MatchingRule.fromCode(attributes.getValue("match"))); //$NON-NLS-1$ } else { prerequisite.setMatchingRule(MatchingRule.COMPATIBLE); } prerequisite.setExported(attributes.getValue("exported")); //$NON-NLS-1$ prerequisite.setOptional(attributes.getValue("optional")); //$NON-NLS-1$ prerequisite.setReverseLookup( attributes.getValue("reverse-lookup")); //$NON-NLS-1$ } else if ("runtime".equals(name)) { //$NON-NLS-1$ // no-op } else if ("library".equals(name)) { //$NON-NLS-1$ library = new ModelLibrary(); library.setId(attributes.getValue("id")); //$NON-NLS-1$ library.setPath(attributes.getValue("path")); //$NON-NLS-1$ library.setCodeLibrary(attributes.getValue("type")); //$NON-NLS-1$ if (attributes.getValue("version") != null) { //$NON-NLS-1$ library.setVersion(attributes.getValue("version")); //$NON-NLS-1$ } } else if ("export".equals(name)) { //$NON-NLS-1$ if (library == null) { if (entityResolver != null) { throw new SAXException("[export] element found " //$NON-NLS-1$ + "outside of [library] element"); //$NON-NLS-1$ } // ignore this element log.warn("[export] element found outside of [library] element"); //$NON-NLS-1$ return; } library.getExports().add(attributes.getValue("prefix")); //$NON-NLS-1$ } else if ("extension-point".equals(name)) { //$NON-NLS-1$ extensionPoint = new ModelExtensionPoint(); extensionPoint.setId(attributes.getValue("id")); //$NON-NLS-1$ extensionPoint.setParentPluginId( attributes.getValue("parent-plugin-id")); //$NON-NLS-1$ extensionPoint.setParentPointId( attributes.getValue("parent-point-id")); //$NON-NLS-1$ if (attributes.getValue("extension-multiplicity") != null) { //$NON-NLS-1$ extensionPoint.setExtensionMultiplicity( ExtensionMultiplicity.fromCode( attributes.getValue("extension-multiplicity"))); //$NON-NLS-1$ } else { extensionPoint.setExtensionMultiplicity( ExtensionMultiplicity.ANY); } paramDefStack = new SimpleStack(); } else if ("parameter-def".equals(name)) { //$NON-NLS-1$ if (extensionPoint == null) { if (entityResolver != null) { throw new SAXException("[parameter-def] element found " //$NON-NLS-1$ + "outside of [extension-point] element"); //$NON-NLS-1$ } // ignore this element log.warn("[parameter-def] element found " //$NON-NLS-1$ + "outside of [extension-point] element"); //$NON-NLS-1$ return; } if (paramDef != null) { paramDefStack.push(paramDef); } paramDef = new ModelParameterDef(); paramDef.setId(attributes.getValue("id")); //$NON-NLS-1$ if (attributes.getValue("multiplicity") != null) { //$NON-NLS-1$ paramDef.setMultiplicity( ParameterMultiplicity.fromCode( attributes.getValue("multiplicity"))); //$NON-NLS-1$ } else { paramDef.setMultiplicity(ParameterMultiplicity.ONE); } if (attributes.getValue("type") != null) { //$NON-NLS-1$ paramDef.setType( ParameterType.fromCode(attributes.getValue("type"))); //$NON-NLS-1$ } else { paramDef.setType(ParameterType.STRING); } paramDef.setCustomData(attributes.getValue("custom-data")); //$NON-NLS-1$ paramDef.setDefaultValue(attributes.getValue("default-value")); //$NON-NLS-1$ } else if ("extension".equals(name)) { //$NON-NLS-1$ extension = new ModelExtension(); extension.setId(attributes.getValue("id")); //$NON-NLS-1$ extension.setPluginId(attributes.getValue("plugin-id")); //$NON-NLS-1$ extension.setPointId(attributes.getValue("point-id")); //$NON-NLS-1$ paramStack = new SimpleStack(); } else if ("parameter".equals(name)) { //$NON-NLS-1$ if (extension == null) { if (entityResolver != null) { throw new SAXException("[parameter] element found " //$NON-NLS-1$ + "outside of [extension] element"); //$NON-NLS-1$ } // ignore this element log.warn("[parameter] element found " //$NON-NLS-1$ + "outside of [extension] element"); //$NON-NLS-1$ return; } if (param != null) { paramStack.push(param); } param = new ModelParameter(); param.setId(attributes.getValue("id")); //$NON-NLS-1$ param.setValue(attributes.getValue("value")); //$NON-NLS-1$ } else if ("value".equals(name)) { //$NON-NLS-1$ if (param == null) { if (entityResolver != null) { throw new SAXException("[value] element found " //$NON-NLS-1$ + "outside of [parameter] element"); //$NON-NLS-1$ } // ignore this element log.warn("[value] element found " //$NON-NLS-1$ + "outside of [parameter] element"); //$NON-NLS-1$ return; } paramValue = new StringBuilder(); } else { if (entityResolver != null) { throw new SAXException("unexpected manifest element - [" //$NON-NLS-1$ + uri + "]/[" + localName + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } // ignore this element log.warn("unexpected manifest element - [" + uri + "]/[" //$NON-NLS-1$ //$NON-NLS-2$ + localName + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } } /** * @see org.xml.sax.ContentHandler#endElement(java.lang.String, * java.lang.String, java.lang.String) */ @Override public void endElement(final String uri, final String localName, final String qName) { if (log.isDebugEnabled()) { log.debug("endElement - [" + uri + "]/[" + localName //$NON-NLS-1$ //$NON-NLS-2$ + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } String name = qName; if ("plugin".equals(name)) { //$NON-NLS-1$ // no-op } else if ("plugin-fragment".equals(name)) { //$NON-NLS-1$ // no-op } else if ("doc".equals(name)) { //$NON-NLS-1$ if (param != null) { param.setDocumentation(documentation); } else if (extension != null) { extension.setDocumentation(documentation); } else if (paramDef != null) { paramDef.setDocumentation(documentation); } else if (extensionPoint != null) { extensionPoint.setDocumentation(documentation); } else if (library != null) { library.setDocumentation(documentation); } else if (prerequisite != null) { prerequisite.setDocumentation(documentation); } else if (attribute != null) { attribute.setDocumentation(documentation); } else { manifest.setDocumentation(documentation); } documentation = null; } else if ("doc-ref".equals(name)) { //$NON-NLS-1$ // no-op } else if ("doc-text".equals(name)) { //$NON-NLS-1$ documentation.setText(docText.toString()); docText = null; } else if ("attributes".equals(name)) { //$NON-NLS-1$ attributeStack = null; } else if ("attribute".equals(name)) { //$NON-NLS-1$ if (attributeStack.size() == 0) { manifest.getAttributes().add(attribute); attribute = null; } else { ModelAttribute temp = attribute; attribute = attributeStack.pop(); attribute.getAttributes().add(temp); temp = null; } } else if ("requires".equals(name)) { //$NON-NLS-1$ // no-op } else if ("import".equals(name)) { //$NON-NLS-1$ manifest.getPrerequisites().add(prerequisite); prerequisite = null; } else if ("runtime".equals(name)) { //$NON-NLS-1$ // no-op } else if ("library".equals(name)) { //$NON-NLS-1$ manifest.getLibraries().add(library); library = null; } else if ("export".equals(name)) { //$NON-NLS-1$ // no-op } else if ("extension-point".equals(name)) { //$NON-NLS-1$ manifest.getExtensionPoints().add(extensionPoint); extensionPoint = null; paramDefStack = null; } else if ("parameter-def".equals(name)) { //$NON-NLS-1$ if (paramDefStack.size() == 0) { extensionPoint.getParamDefs().add(paramDef); paramDef = null; } else { ModelParameterDef temp = paramDef; paramDef = paramDefStack.pop(); paramDef.getParamDefs().add(temp); temp = null; } } else if ("extension".equals(name)) { //$NON-NLS-1$ manifest.getExtensions().add(extension); extension = null; paramStack = null; } else if ("parameter".equals(name)) { //$NON-NLS-1$ if (paramStack.size() == 0) { extension.getParams().add(param); param = null; } else { ModelParameter temp = param; param = paramStack.pop(); param.getParams().add(temp); temp = null; } } else if ("value".equals(name)) { //$NON-NLS-1$ param.setValue(paramValue.toString()); paramValue = null; } else { // ignore any other element log.warn("ignoring manifest element - [" + uri + "]/[" //$NON-NLS-1$ //$NON-NLS-2$ + localName + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } } /** * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ @Override public void characters(final char[] ch, final int start, final int length) throws SAXException { if (docText != null) { docText.append(ch, start, length); } else if (paramValue != null) { paramValue.append(ch, start, length); } else { if (entityResolver != null) { throw new SAXException("unexpected character data"); //$NON-NLS-1$ } // ignore these characters log.warn("ignoring character data - [" //$NON-NLS-1$ + new String(ch, start, length) + "]"); //$NON-NLS-1$ } } ModelPluginManifest getResult() { return manifest; } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/Resources_de.properties0000644000175000017500000001336110612737644030607 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2007 Dmitry Olshansky # German Translation (C) 2007 Stefan Rado # $Id: Resources_de.properties,v 1.1 2007/04/22 18:03:47 ddimon Exp $ # Exceptions manifestParsingError = Manifest Datei {0} konnte nicht geparst werden duplicatePlugin = Plug-in mit der ID {0} ist bereits registriert duplicatePluginFragment = Plug-in Fragment mit der ID {0} ist bereits registriert manifestElementIdIsBlank = Manifest Element ID ist leer extensionIdIsBlank = Extension ID ist leer in Plug-in {0} extendedPointIdIsBlank = Extended Point ID ist leer in Plug-in {0} duplicateParameterDefinition = Doppelte Parameter Definition f\u00fcr Attribut {0} gefunden f\u00fcr Extension Point {1} in Plug-in {2} invalidDefaultValueAttribute = Parameter Vorgabewert {0} ist ung\u00fcltig f\u00fcr Extension Point {1} in Plug-in {2} libraryPathIsBlank = Library Pfad ist leer exportPrefixIBlank = Export Pr\u00e4fix ist leer duplicateImports = Doppelter Import von Plug-in {0} gefunden in Plug-in {1} duplicateLibraries = Doppelte Library ID {0} gefunden in Plug-in {1} duplicateExtensionPoints = Doppelte Extension Point ID {0} gefunden in Plug-in {1} duplicateExtensions = Doppelte Extension ID {0} gefunden in Plug-in {1} pluginNotDeclaredInPrerequisites = Plug-in {0} deklariert in Extension {1} nicht gefunden in Vorraussetzungen in Plug-in {2} fragmentPliginIdIsBlank = Plug-in ID ist leer in Plug-in Fragment {0} invalidFragmentPluginId = Fragment Plug-in ID ist gleich der deklarierenden ID in Plug-in Fragment {0} prerequisitePliginIdIsBlank = Vorrausgesetzte Plug-in ID ist leer in Plug-in {0} invalidPrerequisitePluginId = Vorrausgesetzte Plug-in ID ist gleich der deklarierenden ID in Plug-in Fragment {0} # Integrit\u00e4tspr\u00fcfung extPointNotAvailable = Extension Point {0} nicht verf\u00fcgbar f\u00fcr Extension {1} cantDetectParameterDef = Definition f\u00fcr Parameter {0} konnte in Extension {1} nicht gefunden werden tooManyOrFewParams = Zu viele oder zu wenige Parameter {0} in Extension {1} gefunden tooManyParams = Zu viele Parameter {0} definiert in Extension {1} tooFewParams = Zu wenige Parameter {0} definiert in Extension {1} invalidParameterValue = Parameter {0} ({1}), definiert in Extension {2}, hat einen ung\u00fcltigen Wert pluginsCheckStart = Pr\u00fcfe Plug-ins pluginCheckStart = Pr\u00fcfe Plug-in {0} pluginCheckFinish = Plug-in {0} gepr\u00fcft pluginsCheckError = Allgemeiner Fehler bei Integrit\u00e4tspr\u00fcfung - {0} pluginsCheckFinish = {0} Plug-ins gepr\u00fcft prerequisitesCheckStart = Pr\u00fcfe Vorraussetzungen f\u00fcr {0} unsatisfiedPrerequisite = Vorraussetzung {0} f\u00fcr Plug-in {1} unerf\u00fcllt prerequisitesCheckFinish = {0} Vorraussetzungen f\u00fcr {1} gepr\u00fcft librariesCheckStart = Pr\u00fcfe Libraries f\u00fcr {0} accesToResourceFailed = Kann auf Ressource von Library {0} in Plug-in {1} nicht zugreifen (URL: {2}) librariesCheckFinish = {0} Libraries f\u00fcr {1} gepr\u00fcft librariesCheckSkip = Library \u00dcberpr\u00fcfung f\u00fcr {0} \u00fcbersprungen, da kein PathResolver \u00fcbergeben wurde extPointsCheckStart = Pr\u00fcfe Extension Points extPointCheckStart = Pr\u00fcfe Extension Point {0} extPointCheckFinish = Extension Point {0} gepr\u00fcft extPointsCheckFinish = {0} Extension Points f\u00fcr {1} gepr\u00fcft extsCheckStart = Pr\u00fcfe Extensions extCheckStart = Pr\u00fcfe Extension {0} extCheckFinish = Extension {0} gepr\u00fcft extsCheckFinish = {0} Extensions f\u00fcr {1} gepr\u00fcft parentExtPointNotAvailable = Eltern Extension Point {0} f\u00fcr {1} nicht verf\u00fcgbar parentExtPointAvailabilityCheckFailed = Eltern Extension Point {0} f\u00fcr {1} nicht verf\u00fcgbar (Fehler: {2}) toManyOrFewExtsConnected = Zu viele oder zu wenige Extensions sind mit Extension Point {0} verbunden extsConnectedToAbstractExtPoint = Extensions mit abstraktem Extension Point {0} verbunden toManyExtsConnected = Zu viele Extensions mit Extension Point {0} verbunden # Registrierungs-Ereignisse registryStart = Starte Registry manifestsParsingStart = Parse Plug-in Manifeste manifestParsingError = Kann Manifest nicht parsen: URL - {0}, Fehler - {1} manifestsParsingFinish = Manifest Dateien geparst: {0} Plug-ins gefunden, {1} Fragmente gefunden registeringPluginsStart = Registriere Plug-ins registeringFragmentsStart = Registriere Plug-in Fragmente registeringPluginsFinish = Gesamtzahl registrierter Plug-ins ist nun {0} registeringFragmentsFinish = Gesamtzahl registrierter Plug-in Fragmente ist nun {0} duplicatedPluginId = \u00dcberspringe Registrierung f\u00fcr Plug-in mit der ID {0}, da es bereits registriert ist duplicatedFragmentId = \u00dcberspringe Registrierung f\u00fcr Plug-in Fragment mit der ID {0}, da es bereits registriert ist pluginRegistered = Plug-in {0} registriert pluginRegistrationFailed = Plug-in Registrierung fehlgeschlagen: URL - {0}, Fehler - {1} noMatchingPluginFound = Keine passenden Plug-ins f\u00fcr Fragment {0} gefunden {0} fragmentRegistered = Plug-in Fragment {0} registriert fragmentRegistrationFailed = Plug-in Fragment Registrierung fehlgeschlagen, URL - {0}, Fehler - {1} unregisteringPrepare = Sammle Plug-ins und Plug-in Fragmente zum L\u00f6schen der Registrierung pluginToUngregisterNotFound = Kein registriertes Plug-in oder Plug-in Fragment mit ID {0} gefunden unregisteringFragmentsStart = L\u00f6sche Registrierung f\u00fcr Plug-in Fragmente unregisteringPluginsStart = l\u00f6sche Registrierung f\u00fcr Plug-ins unregisteringPluginsFinish = Gesamtzahl registrierter Plug-ins ist nun {0} unregisteringFragmentsFinish = Gesamtzahl registrierter Plug-in Fragmente ist nun {0} pluginUnregistered = Plug-in {0} ist nun nicht mehr registriert fragmentUnregistered = Plug-in Fragment {0} ist nun nicht mehr registriert libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/PluginDescriptorImpl.java0000644000175000017500000003772310572344612031033 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.Library; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.PluginAttribute; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; /** * @version $Id: PluginDescriptorImpl.java,v 1.4 2007/03/03 17:16:25 ddimon Exp $ */ class PluginDescriptorImpl extends IdentityImpl implements PluginDescriptor { private final PluginRegistry registry; private final ModelPluginDescriptor model; private Map pluginPrerequisites; private Map libraries; private Map extensionPoints; private Map extensions; private Documentation doc; private List fragments; private List attributes; PluginDescriptorImpl(final PluginRegistry aRegistry, final ModelPluginDescriptor aModel) throws ManifestProcessingException { super(aModel.getId()); registry = aRegistry; model = aModel; if (model.getVendor() == null) { model.setVendor(""); //$NON-NLS-1$ } if ((model.getClassName() != null) && (model.getClassName().trim().length() == 0)) { model.setClassName(null); } if ((model.getDocsPath() == null) || (model.getDocsPath().trim().length() == 0)) { model.setDocsPath("docs"); //$NON-NLS-1$ } if (model.getDocumentation() != null) { doc = new DocumentationImpl(this, model.getDocumentation()); } attributes = new LinkedList(); fragments = new LinkedList(); pluginPrerequisites = new HashMap(); libraries = new HashMap(); extensionPoints = new HashMap(); extensions = new HashMap(); processAttributes(null, model); processPrerequisites(null, model); processLibraries(null, model); processExtensionPoints(null, model); processExtensions(null, model); if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } void registerFragment(final PluginFragmentImpl fragment) throws ManifestProcessingException { fragments.add(fragment); processAttributes(fragment, fragment.getModel()); processPrerequisites(fragment, fragment.getModel()); processLibraries(fragment, fragment.getModel()); processExtensionPoints(fragment, fragment.getModel()); processExtensions(fragment, fragment.getModel()); } void unregisterFragment(final PluginFragmentImpl fragment) { // removing attributes for (Iterator it = attributes.iterator(); it.hasNext();) { if (fragment.equals(it.next() .getDeclaringPluginFragment())) { it.remove(); } } // removing prerequisites for (Iterator> it = pluginPrerequisites.entrySet().iterator(); it.hasNext();) { Entry entry = it.next(); if (fragment.equals(entry.getValue() .getDeclaringPluginFragment())) { it.remove(); } } // removing libraries for (Iterator> it = libraries.entrySet().iterator(); it.hasNext();) { Entry entry = it.next(); if (fragment.equals(entry.getValue() .getDeclaringPluginFragment())) { it.remove(); } } // removing extension points for (Iterator> it = extensionPoints.entrySet().iterator(); it.hasNext();) { Entry entry = it.next(); if (fragment.equals(entry.getValue() .getDeclaringPluginFragment())) { it.remove(); } } // removing extensions for (Iterator> it = extensions.entrySet().iterator(); it.hasNext();) { Entry entry = it.next(); if (fragment.equals(entry.getValue() .getDeclaringPluginFragment())) { it.remove(); } } fragments.remove(fragment); } private void processAttributes(final PluginFragmentImpl fragment, final ModelPluginManifest modelManifest) throws ManifestProcessingException { for (ModelAttribute modelAttribute : modelManifest.getAttributes()) { attributes.add(new PluginAttributeImpl(this, fragment, modelAttribute, null)); } } private void processPrerequisites(final PluginFragmentImpl fragment, final ModelPluginManifest modelManifest) throws ManifestProcessingException { for (ModelPrerequisite modelPrerequisite : modelManifest.getPrerequisites()) { PluginPrerequisiteImpl pluginPrerequisite = new PluginPrerequisiteImpl(this, fragment, modelPrerequisite); if (pluginPrerequisites.containsKey( pluginPrerequisite.getPluginId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "duplicateImports", new Object[] { //$NON-NLS-1$ pluginPrerequisite.getPluginId(), getId()}); } pluginPrerequisites.put(pluginPrerequisite.getPluginId(), pluginPrerequisite); } } private void processLibraries(final PluginFragmentImpl fragment, final ModelPluginManifest modelManifest) throws ManifestProcessingException { for (ModelLibrary modelLibrary : modelManifest.getLibraries()) { LibraryImpl lib = new LibraryImpl(this, fragment, modelLibrary); if (libraries.containsKey(lib.getId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "duplicateLibraries", new Object[] { //$NON-NLS-1$ lib.getId(), getId()}); } libraries.put(lib.getId(), lib); } } private void processExtensionPoints(final PluginFragmentImpl fragment, final ModelPluginManifest modelManifest) throws ManifestProcessingException { for (ModelExtensionPoint modelExtensionPoint : modelManifest.getExtensionPoints()) { ExtensionPointImpl extensionPoint = new ExtensionPointImpl(this, fragment, modelExtensionPoint); if (extensionPoints.containsKey(extensionPoint.getId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "duplicateExtensionPoints", new Object[] { //$NON-NLS-1$ extensionPoint.getId(), getId()}); } extensionPoints.put(extensionPoint.getId(), extensionPoint); } } private void processExtensions(final PluginFragmentImpl fragment, final ModelPluginManifest modelManifest) throws ManifestProcessingException { for (ModelExtension modelExtension : modelManifest.getExtensions()) { ExtensionImpl extension = new ExtensionImpl(this, fragment, modelExtension); if (extensions.containsKey(extension.getId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "duplicateExtensions", new Object[] { //$NON-NLS-1$ extension.getId(), getId()}); } if (!getId().equals(extension.getExtendedPluginId()) && !pluginPrerequisites.containsKey( extension.getExtendedPluginId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "pluginNotDeclaredInPrerequisites", new Object[] { //$NON-NLS-1$ extension.getExtendedPluginId(), extension.getId(), getId()}); } extensions.put(extension.getId(), extension); } //extensions = Collections.unmodifiableMap(extensions); } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return registry.makeUniqueId(getId(), model.getVersion()); } /** * @see org.java.plugin.registry.PluginDescriptor#getVendor() */ public String getVendor() { return model.getVendor(); } /** * @see org.java.plugin.registry.PluginDescriptor#getVersion() */ public Version getVersion() { return model.getVersion(); } /** * @see org.java.plugin.registry.PluginDescriptor#getPrerequisites() */ public Collection getPrerequisites() { return Collections.unmodifiableCollection(pluginPrerequisites.values()); } /** * @see org.java.plugin.registry.PluginDescriptor#getPrerequisite(java.lang.String) */ public PluginPrerequisite getPrerequisite(final String id) { return pluginPrerequisites.get(id); } /** * @see org.java.plugin.registry.PluginDescriptor#getExtensionPoints() */ public Collection getExtensionPoints() { return Collections.unmodifiableCollection(extensionPoints.values()); } /** * @see org.java.plugin.registry.PluginDescriptor#getExtensionPoint(java.lang.String) */ public ExtensionPoint getExtensionPoint(final String id) { return extensionPoints.get(id); } /** * @see org.java.plugin.registry.PluginDescriptor#getExtensions() */ public Collection getExtensions() { return Collections.unmodifiableCollection(extensions.values()); } /** * @see org.java.plugin.registry.PluginDescriptor#getExtension(java.lang.String) */ public Extension getExtension(final String id) { return extensions.get(id); } /** * @see org.java.plugin.registry.PluginDescriptor#getLibraries() */ public Collection getLibraries() { return Collections.unmodifiableCollection(libraries.values()); } /** * @see org.java.plugin.registry.PluginDescriptor#getLibrary(java.lang.String) */ public Library getLibrary(final String id) { return libraries.get(id); } /** * @see org.java.plugin.registry.PluginDescriptor#getRegistry() */ public PluginRegistry getRegistry() { return registry; } /** * @see org.java.plugin.registry.PluginDescriptor#getPluginClassName() */ public String getPluginClassName() { return model.getClassName(); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{PluginDescriptor: uid=" + getUniqueId() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return doc; } /** * @see org.java.plugin.registry.PluginDescriptor#getFragments() */ public Collection getFragments() { return Collections.unmodifiableCollection(fragments); } /** * @see org.java.plugin.registry.PluginDescriptor#getAttribute(java.lang.String) */ public PluginAttribute getAttribute(final String id) { PluginAttributeImpl result = null; for (PluginAttribute attribute : attributes) { PluginAttributeImpl attr = (PluginAttributeImpl) attribute; if (attr.getId().equals(id)) { if (result == null) { result = attr; } else { throw new IllegalArgumentException( "more than one attribute with ID " + id //$NON-NLS-1$ + " defined in plug-in " + getUniqueId()); //$NON-NLS-1$ } } } return result; } /** * @see org.java.plugin.registry.PluginDescriptor#getAttributes() */ public Collection getAttributes() { return Collections.unmodifiableCollection(attributes); } /** * @see org.java.plugin.registry.PluginDescriptor#getAttributes(java.lang.String) */ public Collection getAttributes(final String id) { List result = new LinkedList(); for (PluginAttribute attribute : attributes) { PluginAttributeImpl param = (PluginAttributeImpl) attribute; if (param.getId().equals(id)) { result.add(param); } } return Collections.unmodifiableList(result); } /** * @see org.java.plugin.registry.PluginDescriptor#getDocsPath() */ public String getDocsPath() { return model.getDocsPath(); } /** * @see org.java.plugin.registry.PluginDescriptor#getLocation() */ public URL getLocation() { return model.getLocation(); } /** * @see org.java.plugin.registry.xml.IdentityImpl#isEqualTo( * org.java.plugin.registry.Identity) */ @Override protected boolean isEqualTo(final Identity idt) { if (!(idt instanceof PluginDescriptorImpl)) { return false; } PluginDescriptorImpl other = (PluginDescriptorImpl) idt; return getUniqueId().equals(other.getUniqueId()) && getLocation().toExternalForm().equals( other.getLocation().toExternalForm()); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/PluginElementImpl.java0000644000175000017500000000637510562137246030307 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Identity; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginElement; import org.java.plugin.registry.PluginFragment; /** * @version $Id$ */ abstract class PluginElementImpl> extends IdentityImpl implements PluginElement { private final PluginDescriptor descriptor; private final PluginFragment fragment; private DocumentationImpl doc; protected PluginElementImpl(final PluginDescriptor descr, final PluginFragment aFragment, final String id, final ModelDocumentation modelDoc) throws ManifestProcessingException { super(id); descriptor = descr; fragment = aFragment; if (modelDoc != null) { doc = new DocumentationImpl(this, modelDoc); } } /** * @see org.java.plugin.registry.xml.IdentityImpl#isEqualTo( * org.java.plugin.registry.Identity) */ @Override protected boolean isEqualTo(final Identity idt) { if (!getClass().getName().equals(idt.getClass().getName())) { return false; } return getDeclaringPluginDescriptor().equals( ((PluginElementImpl) idt).getDeclaringPluginDescriptor()) && getId().equals(idt.getId()); } /** * @see org.java.plugin.registry.PluginElement#getDeclaringPluginDescriptor() */ public PluginDescriptor getDeclaringPluginDescriptor() { return descriptor; } /** * @see org.java.plugin.registry.PluginElement#getDeclaringPluginFragment() */ public PluginFragment getDeclaringPluginFragment() { return fragment; } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return doc; } /** * @see org.java.plugin.registry.Documentable#getDocsPath() */ public String getDocsPath() { return (fragment != null) ? fragment.getDocsPath() : descriptor.getDocsPath(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/ManifestInfoHandler.java0000644000175000017500000001100410554434470030556 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import org.java.plugin.registry.MatchingRule; import org.xml.sax.Attributes; import org.xml.sax.EntityResolver; import org.xml.sax.SAXException; /** * @version $Id$ */ final class ManifestInfoHandler extends BaseHandler { private ModelManifestInfo manifest = null; ManifestInfoHandler(final EntityResolver anEntityResolver) { super(anEntityResolver); } /** * @see org.xml.sax.ContentHandler#startElement(java.lang.String, * java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement(final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException { if (log.isDebugEnabled()) { log.debug("startElement - [" + uri + "]/[" //$NON-NLS-1$ //$NON-NLS-2$ + localName + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } String name = qName; if ("plugin".equals(name)) { //$NON-NLS-1$ if (manifest != null) { throw new SAXException("unexpected [" + name //$NON-NLS-1$ + "] element (manifest already defined)"); //$NON-NLS-1$ } manifest = new ModelManifestInfo(); manifest.setId(attributes.getValue("id")); //$NON-NLS-1$ manifest.setVersion(attributes.getValue("version")); //$NON-NLS-1$ manifest.setVendor(attributes.getValue("vendor")); //$NON-NLS-1$ } else if ("plugin-fragment".equals(name)) { //$NON-NLS-1$ if (manifest != null) { throw new SAXException("unexpected [" + name //$NON-NLS-1$ + "] element (manifest already defined)"); //$NON-NLS-1$ } manifest = new ModelManifestInfo(); manifest.setId(attributes.getValue("id")); //$NON-NLS-1$ manifest.setVersion(attributes.getValue("version")); //$NON-NLS-1$ manifest.setVendor(attributes.getValue("vendor")); //$NON-NLS-1$ manifest.setPluginId(attributes.getValue("plugin-id")); //$NON-NLS-1$ if (attributes.getValue("plugin-version") != null) { //$NON-NLS-1$ manifest.setPluginVersion( attributes.getValue("plugin-version")); //$NON-NLS-1$ } if (attributes.getValue("match") != null) { //$NON-NLS-1$ manifest.setMatchingRule( MatchingRule.fromCode(attributes.getValue("match"))); //$NON-NLS-1$ } else { manifest.setMatchingRule(MatchingRule.COMPATIBLE); } } else { // ignore all other elements } } /** * @see org.xml.sax.ContentHandler#endElement(java.lang.String, * java.lang.String, java.lang.String) */ @Override public void endElement(final String uri, final String localName, final String qName) { if (log.isDebugEnabled()) { log.debug("endElement - [" + uri + "]/[" + localName //$NON-NLS-1$ //$NON-NLS-2$ + "]/[" + qName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } // no-op } /** * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ @Override public void characters(final char[] ch, final int start, final int length) { // ignore all characters } ModelManifestInfo getResult() { return manifest; } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/IdentityImpl.java0000644000175000017500000000516510554434452027324 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.registry.Identity; import org.java.plugin.registry.ManifestProcessingException; /** * @version $Id$ */ abstract class IdentityImpl implements Identity { /** * Makes logging service available for descending classes. */ protected final Log log = LogFactory.getLog(getClass()); private final String id; protected IdentityImpl(final String anId) throws ManifestProcessingException { id = anId; if ((id == null) || (id.trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "manifestElementIdIsBlank"); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.Identity#getId() */ public String getId() { return id; } protected abstract boolean isEqualTo(final Identity idt); /** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof Identity)) { return false; } return isEqualTo((Identity) obj); } private int hashCode = -1; /** * @see java.lang.Object#hashCode() */ @Override public int hashCode() { if (hashCode == -1) { hashCode = getClass().hashCode() ^ getId().hashCode(); } return hashCode; } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/ManifestParser.java0000644000175000017500000001362210572344612027627 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.net.URL; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.util.IoUtil; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * @version $Id: ManifestParser.java,v 1.4 2007/03/03 17:16:26 ddimon Exp $ */ final class ManifestParser { static Log log = LogFactory.getLog(ManifestParser.class); static final String PLUGIN_DTD_1_0 = loadPluginDtd("1_0"); //$NON-NLS-1$ private static String loadPluginDtd(final String version) { try { Reader in = new InputStreamReader( PluginRegistryImpl.class.getResourceAsStream("plugin_" //$NON-NLS-1$ + version + ".dtd"), "UTF-8"); //$NON-NLS-1$ //$NON-NLS-2$ try { StringBuilder sBuf = new StringBuilder(); char[] cBuf = new char[64]; int read; while ((read = in.read(cBuf)) != -1) { sBuf.append(cBuf, 0, read); } return sBuf.toString(); } finally { in.close(); } } catch (IOException ioe) { log.error("can't read plug-in DTD file of version " + version, ioe); //$NON-NLS-1$ } return null; } private static EntityResolver getDtdEntityResolver() { return new EntityResolver() { public InputSource resolveEntity(final String publicId, final String systemId) { if (publicId == null) { log.debug("can't resolve entity, public ID is NULL, systemId=" + systemId); //$NON-NLS-1$ return null; } if (PLUGIN_DTD_1_0 == null) { return null; } if (publicId.equals("-//JPF//Java Plug-in Manifest 1.0") //$NON-NLS-1$ || publicId.equals("-//JPF//Java Plug-in Manifest 0.7") //$NON-NLS-1$ || publicId.equals("-//JPF//Java Plug-in Manifest 0.6") //$NON-NLS-1$ || publicId.equals("-//JPF//Java Plug-in Manifest 0.5") //$NON-NLS-1$ || publicId.equals("-//JPF//Java Plug-in Manifest 0.4") //$NON-NLS-1$ || publicId.equals("-//JPF//Java Plug-in Manifest 0.3") //$NON-NLS-1$ || publicId.equals("-//JPF//Java Plug-in Manifest 0.2")) { //$NON-NLS-1$ if (log.isDebugEnabled()) { log.debug("entity resolved to plug-in manifest DTD, publicId=" //$NON-NLS-1$ + publicId + ", systemId=" + systemId); //$NON-NLS-1$ } return new InputSource(new StringReader(PLUGIN_DTD_1_0)); } if (log.isDebugEnabled()) { log.debug("entity not resolved, publicId=" //$NON-NLS-1$ + publicId + ", systemId=" + systemId); //$NON-NLS-1$ } return null; } }; } private final SAXParserFactory parserFactory; private final EntityResolver entityResolver; ManifestParser(final boolean isValidating) { parserFactory = SAXParserFactory.newInstance(); parserFactory.setValidating(isValidating); entityResolver = isValidating ? getDtdEntityResolver() : null; log.info("got SAX parser factory - " + parserFactory); //$NON-NLS-1$ } ModelPluginManifest parseManifest(final URL url) throws ParserConfigurationException, SAXException, IOException { ManifestHandler handler = new ManifestHandler(entityResolver); //InputStream strm = url.openStream(); InputStream strm = IoUtil.getResourceInputStream(url); try { parserFactory.newSAXParser().parse(strm, handler); } finally { strm.close(); } ModelPluginManifest result = handler.getResult(); result.setLocation(url); return result; } ModelManifestInfo parseManifestInfo(final URL url) throws ParserConfigurationException, SAXException, IOException { ManifestInfoHandler handler = new ManifestInfoHandler(entityResolver); //InputStream strm = url.openStream(); InputStream strm = IoUtil.getResourceInputStream(url); try { parserFactory.newSAXParser().parse(strm, handler); } finally { strm.close(); } return handler.getResult(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/DocumentationImpl.java0000644000175000017500000001065310554434356030345 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Identity; /** * @version $Id$ */ class DocumentationImpl implements Documentation { /** * Logger object. */ protected static Log log = LogFactory.getLog(DocumentationImpl.class); private final T identity; private final ModelDocumentation model; private List> references; DocumentationImpl(final T anIdentity, final ModelDocumentation aModel) { identity = anIdentity; model = aModel; if ((model.getCaption() == null) || (model.getCaption().trim().length() == 0)) { model.setCaption(""); //$NON-NLS-1$ } references = new ArrayList>(model.getReferences().size()); for (ModelDocumentationReference reference : model.getReferences()) references.add(new ReferenceImpl(reference)); references = Collections.unmodifiableList(references); if (model.getText() == null) { model.setText(""); //$NON-NLS-1$ } if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.Documentation#getCaption() */ public String getCaption() { return model.getCaption(); } /** * @see org.java.plugin.registry.Documentation#getText() */ public String getText() { return model.getText(); } /** * @see org.java.plugin.registry.Documentation#getReferences() */ public Collection> getReferences() { return references; } /** * @see org.java.plugin.registry.Documentation#getDeclaringIdentity() */ public T getDeclaringIdentity() { return identity; } private class ReferenceImpl implements Reference { private final ModelDocumentationReference modelRef; ReferenceImpl(final ModelDocumentationReference aModel) { modelRef = aModel; if ((modelRef.getCaption() == null) || (modelRef.getCaption().trim().length() == 0)) { modelRef.setCaption(""); //$NON-NLS-1$ } if ((modelRef.getPath() == null) || (modelRef.getPath().trim().length() == 0)) { modelRef.setPath(""); //$NON-NLS-1$ } if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.Documentation.Reference#getCaption() */ public String getCaption() { return modelRef.getCaption(); } /** * @see org.java.plugin.registry.Documentation.Reference#getRef() */ public String getRef() { return modelRef.getPath(); } /** * @see org.java.plugin.registry.Documentation.Reference#getDeclaringIdentity() */ public T getDeclaringIdentity() { return DocumentationImpl.this.getDeclaringIdentity(); } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/ExtensionImpl.java0000644000175000017500000006775610554442532027523 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.java.plugin.PathResolver; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.ParameterType; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.ExtensionPoint.ParameterDefinition; import org.java.plugin.registry.IntegrityCheckReport.ReportItem; import org.java.plugin.registry.xml.ExtensionPointImpl.ParameterDefinitionImpl; /** * @version $Id$ */ final class ExtensionImpl extends PluginElementImpl implements Extension { private final ModelExtension model; private List parameters; private Boolean isValid; ExtensionImpl(final PluginDescriptorImpl descr, final PluginFragmentImpl aFragment, final ModelExtension aModel) throws ManifestProcessingException { super(descr, aFragment, aModel.getId(), aModel.getDocumentation()); model = aModel; if ((model.getPluginId() == null) || (model.getPluginId().trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "extensionIdIsBlank", descr.getId()); //$NON-NLS-1$ } if ((model.getPointId() == null) || (model.getPointId().trim().length() == 0)) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "extendedPointIdIsBlank", descr.getId()); //$NON-NLS-1$ } parameters = new ArrayList(model.getParams().size()); for (ModelParameter parameter : model.getParams()) { parameters.add(new ParameterImpl(null, parameter)); } parameters = Collections.unmodifiableList(parameters); if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getRegistry().makeUniqueId( getDeclaringPluginDescriptor().getId(), getId()); } /** * @see org.java.plugin.registry.Extension#getParameters() */ public Collection getParameters() { return parameters; } /** * @see org.java.plugin.registry.Extension#getParameter(java.lang.String) */ public Parameter getParameter(final String id) { ParameterImpl result = null; for (Parameter parameter : parameters) { ParameterImpl param = (ParameterImpl) parameter; if (param.getId().equals(id)) { if (result == null) { result = param; } else { throw new IllegalArgumentException( "more than one parameter with ID " + id //$NON-NLS-1$ + " defined in extension " + getUniqueId()); //$NON-NLS-1$ } } } return result; } /** * @see org.java.plugin.registry.Extension#getParameters(java.lang.String) */ public Collection getParameters(final String id) { List result = new LinkedList(); for (Parameter parameter : parameters) { if (parameter.getId().equals(id)) result.add(parameter); } return Collections.unmodifiableList(result); } /** * @see org.java.plugin.registry.Extension#getExtendedPluginId() */ public String getExtendedPluginId() { return model.getPluginId(); } /** * @see org.java.plugin.registry.Extension#getExtendedPointId() */ public String getExtendedPointId() { return model.getPointId(); } /** * @see org.java.plugin.registry.Extension#isValid() */ public boolean isValid() { if (isValid == null) { validate(); } return isValid.booleanValue(); } Collection validate() { ExtensionPoint point = getExtensionPoint(getExtendedPluginId(), getExtendedPointId()); if (point == null) { isValid = Boolean.FALSE; return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION, "extPointNotAvailable", new Object[] { //$NON-NLS-1$ getDeclaringPluginDescriptor().getRegistry() .makeUniqueId(getExtendedPluginId(), getExtendedPointId()), getUniqueId()})); } Collection result = validateParameters(point.getParameterDefinitions(), parameters); isValid = result.isEmpty() ? Boolean.TRUE : Boolean.FALSE; return result; } ExtensionPoint getExtensionPoint(final String uniqueId) { PluginRegistry registry = getDeclaringPluginDescriptor().getRegistry(); return getExtensionPoint(registry.extractPluginId(uniqueId), registry.extractId(uniqueId)); } ExtensionPoint getExtensionPoint(final String pluginId, final String pointId) { PluginRegistry registry = getDeclaringPluginDescriptor().getRegistry(); if (!registry.isPluginDescriptorAvailable(pluginId)) { return null; } for (ExtensionPoint point : registry.getPluginDescriptor(pluginId) .getExtensionPoints()) { if (point.getId().equals(pointId)) { return point; } } return null; } private Collection validateParameters(final Collection allDefinitions, final Collection allParams) { List result = new LinkedList(); Map> groups = new HashMap>(); for (Parameter param : allParams) { ParameterDefinition def = param.getDefinition(); if (def == null) { result.add(new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION, "cantDetectParameterDef", new Object[] { //$NON-NLS-1$ param.getId(), getUniqueId()})); continue; } if (groups.containsKey(param.getId())) { groups.get(param.getId()).add(param); } else { Collection paramGroup = new LinkedList(); paramGroup.add(param); groups.put(param.getId(), paramGroup); } } if (!result.isEmpty()) { return result; } List empty_paramGroup = Collections.emptyList(); for (ParameterDefinition def : allDefinitions) { Collection paramGroup = groups.get(def.getId()); result.addAll(validateParameters(def, (paramGroup != null) ? paramGroup : empty_paramGroup)); } return result; } private Collection validateParameters(final ParameterDefinition def, final Collection params) { if (log.isDebugEnabled()) { log.debug("validating parameters for definition " + def); //$NON-NLS-1$ } switch (def.getMultiplicity()) { case ONE: if (params.size() != 1) { return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION, "tooManyOrFewParams", new Object[] { //$NON-NLS-1$ def.getId(), getUniqueId()})); } break; case NONE_OR_ONE: if (params.size() > 1) { return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION, "tooManyParams", new Object[] { //$NON-NLS-1$ def.getId(), getUniqueId()})); } break; case ONE_OR_MORE: if (params.isEmpty()) { return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION, "tooFewParams", new Object[] { //$NON-NLS-1$ def.getId(), getUniqueId()})); } break; case ANY: // no-op break; } if (params.isEmpty()) { return Collections.emptyList(); } List result = new LinkedList(); int count = 1; ParameterImpl param; for (Parameter parameter : params) { param = (ParameterImpl) parameter; if (!param.isValid()) { result.add(new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION, "invalidParameterValue", new Object[] { //$NON-NLS-1$ def.getId(), Integer.valueOf(count), getUniqueId()})); } if ((ParameterType.ANY != def.getType()) && result.isEmpty()) { result.addAll(validateParameters( param.getDefinition().getSubDefinitions(), param.getSubParameters())); } count++; // FIXME in 0.11 not in 0.12 } return result; } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{PluginExtension: uid=" + getUniqueId() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ } void registryChanged() { isValid = null; } private class ParameterImpl extends PluginElementImpl implements Parameter { private final ModelParameter modelParam; private ParameterValueParser valueParser; private List subParameters; private ParameterDefinition definition = null; private boolean definitionDetected = false; private final ParameterImpl superParameter; ParameterImpl(final ParameterImpl aSuperParameter, final ModelParameter aModel) throws ManifestProcessingException { super(ExtensionImpl.this.getDeclaringPluginDescriptor(), ExtensionImpl.this.getDeclaringPluginFragment(), aModel.getId(), aModel.getDocumentation()); this.superParameter = aSuperParameter; modelParam = aModel; subParameters = new ArrayList(modelParam.getParams().size()); for (ModelParameter modelParameter : modelParam.getParams()) { subParameters.add(new ParameterImpl(this, modelParameter)); } subParameters = Collections.unmodifiableList(subParameters); if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.Extension.Parameter#getDeclaringExtension() */ public Extension getDeclaringExtension() { return ExtensionImpl.this; } /** * @see org.java.plugin.registry.PluginElement#getDeclaringPluginDescriptor() */ @Override public PluginDescriptor getDeclaringPluginDescriptor() { return ExtensionImpl.this.getDeclaringPluginDescriptor(); } /** * @see org.java.plugin.registry.PluginElement#getDeclaringPluginFragment() */ @Override public PluginFragment getDeclaringPluginFragment() { return ExtensionImpl.this.getDeclaringPluginFragment(); } /** * @see org.java.plugin.registry.Extension.Parameter#getDefinition() */ public ParameterDefinition getDefinition() { if (definitionDetected) { return definition; } definitionDetected = true; if (log.isDebugEnabled()) { log.debug("detecting definition for parameter " + this); //$NON-NLS-1$ } Collection definitions; if (superParameter != null) { if (superParameter.getDefinition() == null) { return null; } if (ParameterType.ANY == superParameter.getDefinition().getType()) { definition = superParameter.getDefinition(); if (log.isDebugEnabled()) { log.debug("definition detected - " + definition); //$NON-NLS-1$ } return definition; } definitions = superParameter.getDefinition().getSubDefinitions(); } else { definitions = getExtensionPoint( getDeclaringExtension().getExtendedPluginId(), getDeclaringExtension().getExtendedPointId()). getParameterDefinitions(); } for (ParameterDefinition def : definitions) { if (def.getId().equals(getId())) { definition = def; break; } } if (log.isDebugEnabled()) { log.debug("definition detected - " + definition); //$NON-NLS-1$ } return definition; } /** * @see org.java.plugin.registry.Extension.Parameter#getSuperParameter() */ public Parameter getSuperParameter() { return superParameter; } /** * @see org.java.plugin.registry.Extension.Parameter#getSubParameters() */ public Collection getSubParameters() { return subParameters; } /** * @see org.java.plugin.registry.Extension.Parameter#getSubParameter( * java.lang.String) */ public Parameter getSubParameter(final String id) { ParameterImpl result = null; for (Parameter parameter : subParameters) { ParameterImpl param = (ParameterImpl) parameter; if (param.getId().equals(id)) { if (result == null) { result = param; } else { throw new IllegalArgumentException( "more than one parameter with ID " + id //$NON-NLS-1$ + " defined in extension " + getUniqueId()); //$NON-NLS-1$ } } } return result; } /** * @see org.java.plugin.registry.Extension.Parameter#getSubParameters( * java.lang.String) */ public Collection getSubParameters(final String id) { List result = new LinkedList(); for (Parameter param : subParameters) { if (param.getId().equals(id)) { result.add(param); } } return Collections.unmodifiableList(result); } /** * @see org.java.plugin.registry.Extension.Parameter#rawValue() */ public String rawValue() { return (modelParam.getValue() != null) ? modelParam.getValue() : ""; //$NON-NLS-1$ } boolean isValid() { if (valueParser != null) { return valueParser.isParsingSucceeds(); } if (log.isDebugEnabled()) { log.debug("validating parameter " + this); //$NON-NLS-1$ } valueParser = new ParameterValueParser( getDeclaringPluginDescriptor().getRegistry(), getDefinition(), modelParam.getValue()); if (!valueParser.isParsingSucceeds()) { log.warn("parsing value for parameter " + this //$NON-NLS-1$ + " failed, message is: " //$NON-NLS-1$ + valueParser.getParsingMessage()); } return valueParser.isParsingSucceeds(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsBoolean() */ public Boolean valueAsBoolean() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if (ParameterType.BOOLEAN != definition.getType()) { throw new UnsupportedOperationException( "parameter type is not " //$NON-NLS-1$ + ParameterType.BOOLEAN); } if (valueParser.getValue() == null) { return (Boolean) ((ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (Boolean) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsDate() */ public Date valueAsDate() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if ((ParameterType.DATE != definition.getType()) && (ParameterType.DATE_TIME != definition.getType()) && (ParameterType.TIME != definition.getType())) { throw new UnsupportedOperationException("parameter type is not " //$NON-NLS-1$ + ParameterType.DATE + " nor " //$NON-NLS-1$ + ParameterType.DATE_TIME + " nor" //$NON-NLS-1$ + ParameterType.TIME); } if (valueParser.getValue() == null) { return (Date) ((ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (Date) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsNumber() */ public Number valueAsNumber() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if (ParameterType.NUMBER != definition.getType()) { throw new UnsupportedOperationException( "parameter type is not " //$NON-NLS-1$ + ParameterType.NUMBER); } if (valueParser.getValue() == null) { return (Number) ((ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (Number) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsString() */ public String valueAsString() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if ((ParameterType.STRING != definition.getType()) && (ParameterType.FIXED != definition.getType())) { throw new UnsupportedOperationException( "parameter type is not " //$NON-NLS-1$ + ParameterType.STRING); } if (valueParser.getValue() == null) { return (String) ((ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (String) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsExtension() */ public Extension valueAsExtension() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if (ParameterType.EXTENSION_ID != definition.getType()) { throw new UnsupportedOperationException( "parameter type is not " //$NON-NLS-1$ + ParameterType.EXTENSION_ID); } if (valueParser.getValue() == null) { return (Extension) ((ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (Extension) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsExtensionPoint() */ public ExtensionPoint valueAsExtensionPoint() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if (ParameterType.EXTENSION_POINT_ID != definition.getType()) { throw new UnsupportedOperationException( "parameter type is not " //$NON-NLS-1$ + ParameterType.EXTENSION_POINT_ID); } if (valueParser.getValue() == null) { return (ExtensionPoint) ( (ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (ExtensionPoint) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsPluginDescriptor() */ public PluginDescriptor valueAsPluginDescriptor() { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if (ParameterType.PLUGIN_ID != definition.getType()) { throw new UnsupportedOperationException("parameter type is not " //$NON-NLS-1$ + ParameterType.PLUGIN_ID); } if (valueParser.getValue() == null) { return (PluginDescriptor) ( (ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(); } return (PluginDescriptor) valueParser.getValue(); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsUrl() */ public URL valueAsUrl() { return valueAsUrl(null); } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsUrl( * org.java.plugin.PathResolver) */ public URL valueAsUrl(final PathResolver pathResolver) { if (!isValid()) { throw new UnsupportedOperationException( "parameter value is invalid"); //$NON-NLS-1$ } if (ParameterType.RESOURCE != definition.getType()) { throw new UnsupportedOperationException( "parameter type is not " //$NON-NLS-1$ + ParameterType.RESOURCE); } if ((valueParser.getValue() == null) && (rawValue() == null)) { return valueAsUrl(pathResolver, getDefinition().getDeclaringExtensionPoint(), (URL) ((ParameterDefinitionImpl) getDefinition()) .getValueParser().getValue(), getDefinition().getDefaultValue()); } return valueAsUrl(pathResolver, getDeclaringPluginDescriptor(), (URL) valueParser.getValue(), rawValue()); } private URL valueAsUrl(final PathResolver pathResolver, final Identity idt, final URL absoluteUrl, final String relativeUrl) { if ((pathResolver == null) || (absoluteUrl != null)) { return absoluteUrl; } if (relativeUrl == null) { return null; } return pathResolver.resolvePath(idt, relativeUrl); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{PluginExtension.Parameter: extUid=" //$NON-NLS-1$ + getDeclaringExtension().getUniqueId() + "; id=" + getId() //$NON-NLS-1$ + "}"; //$NON-NLS-1$ } /** * @see org.java.plugin.registry.xml.IdentityImpl#isEqualTo( * org.java.plugin.registry.Identity) */ @Override protected boolean isEqualTo(final Identity idt) { if (!super.isEqualTo(idt)) { return false; } ParameterImpl other = (ParameterImpl) idt; if ((getSuperParameter() == null) && (other.getSuperParameter() == null)) { return true; } if ((getSuperParameter() == null) || (other.getSuperParameter() == null)) { return false; } return getSuperParameter().equals(other.getSuperParameter()); } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/BaseHandler.java0000644000175000017500000000735410552475624027067 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.io.IOException; import java.util.LinkedList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; /** * * @version $Id$ */ abstract class BaseHandler extends DefaultHandler { protected final Log log = LogFactory.getLog(getClass()); protected final EntityResolver entityResolver; BaseHandler(final EntityResolver anEntityResolver) { entityResolver = anEntityResolver; } /** * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, * java.lang.String) */ @Override public InputSource resolveEntity(final String publicId, final String systemId) throws SAXException { if (entityResolver != null) { try { return entityResolver.resolveEntity(publicId, systemId); } catch (SAXException se) { throw se; } catch (IOException ioe) { throw new SAXException("I/O error has occurred - " + ioe, ioe); //$NON-NLS-1$ } } log.warn("ignoring publicId=" + publicId //$NON-NLS-1$ + " and systemId=" + systemId); //$NON-NLS-1$ return null; } /** * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException) */ @Override public void warning(final SAXParseException e) { log.warn("non-fatal error while parsing XML document", e); //$NON-NLS-1$ } /** * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException) */ @Override public void error(final SAXParseException e) throws SAXException { if (entityResolver != null) { // we are in "validating" mode log.error("failed parsing XML resource in validating mode", e); //$NON-NLS-1$ throw e; } log.warn("ignoring parse error", e); //$NON-NLS-1$ } /** * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException) */ @Override public void fatalError(final SAXParseException e) throws SAXException { log.fatal("failed parsing XML resource", e); //$NON-NLS-1$ throw e; } } class SimpleStack { private LinkedList data; SimpleStack() { data = new LinkedList(); } T pop() { return data.isEmpty() ? null : data.removeLast(); } void push(final T obj) { data.addLast(obj); } int size() { return data.size(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/ExtensionPointImpl.java0000644000175000017500000006174610554443002030517 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry.xml; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionMultiplicity; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.ParameterMultiplicity; import org.java.plugin.registry.ParameterType; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.IntegrityCheckReport.ReportItem; /** * @version $Id$ */ class ExtensionPointImpl extends PluginElementImpl implements ExtensionPoint { private final ModelExtensionPoint model; private Map connectedExtensions; private Map availableExtensions; private List parameterDefinitions; private Boolean isValid; private boolean paramDefsMerged = false; private List descendants; ExtensionPointImpl(final PluginDescriptorImpl descr, final PluginFragmentImpl aFragment, final ModelExtensionPoint aModel) throws ManifestProcessingException { super(descr, aFragment, aModel.getId(), aModel.getDocumentation()); model = aModel; if ((model.getParentPointId() != null) && (model.getParentPluginId() == null)) { log.warn("parent plug-in ID not specified together with parent" //$NON-NLS-1$ + " extension point ID, using declaring plug-in ID," //$NON-NLS-1$ + " extension point is " + getUniqueId()); //$NON-NLS-1$ model.setParentPluginId(descr.getId()); } parameterDefinitions = new ArrayList(model.getParamDefs().size()); Set names = new HashSet(); ParameterDefinitionImpl def; for (ModelParameterDef modelParameterDef : model.getParamDefs()) { def = new ParameterDefinitionImpl(null, modelParameterDef); if (names.contains(def.getId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "duplicateParameterDefinition", //$NON-NLS-1$ new Object[] {def.getId(), getId(), descr.getId()}); } names.add(def.getId()); parameterDefinitions.add(def); } parameterDefinitions = Collections.unmodifiableList(parameterDefinitions); if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getRegistry().makeUniqueId( getDeclaringPluginDescriptor().getId(), getId()); } /** * @see org.java.plugin.registry.ExtensionPoint#getMultiplicity() */ public ExtensionMultiplicity getMultiplicity() { return model.getExtensionMultiplicity(); } private void updateExtensionsLists() { connectedExtensions = new HashMap(); availableExtensions = new HashMap(); for (PluginDescriptor descr : getDeclaringPluginDescriptor().getRegistry() .getPluginDescriptors()) { for (Extension ext : descr.getExtensions()) { if (getDeclaringPluginDescriptor().getId().equals( ext.getExtendedPluginId()) && getId().equals(ext.getExtendedPointId())) { availableExtensions.put(ext.getUniqueId(), ext); if (ext.isValid()) { if (log.isDebugEnabled()) { log.debug("extension " + ext //$NON-NLS-1$ + " connected to point " + this); //$NON-NLS-1$ } connectedExtensions.put(ext.getUniqueId(), ext); } else { log.warn("extension " + ext.getUniqueId() //$NON-NLS-1$ + " is invalid and doesn't connected to" //$NON-NLS-1$ + " extension point " + getUniqueId()); //$NON-NLS-1$ } } } } } /** * @see org.java.plugin.registry.ExtensionPoint#getAvailableExtensions() */ public Collection getAvailableExtensions() { if (availableExtensions == null) { updateExtensionsLists(); } return Collections.unmodifiableCollection(availableExtensions.values()); } /** * @see org.java.plugin.registry.ExtensionPoint#getAvailableExtension( * java.lang.String) */ public Extension getAvailableExtension(final String uniqueId) { if (availableExtensions == null) { updateExtensionsLists(); } Extension result = availableExtensions.get(uniqueId); if (result == null) { throw new IllegalArgumentException("extension " + uniqueId //$NON-NLS-1$ + " not available in point " + getUniqueId()); //$NON-NLS-1$ } return result; } /** * @see org.java.plugin.registry.ExtensionPoint#isExtensionAvailable( * java.lang.String) */ public boolean isExtensionAvailable(final String uniqueId) { if (availableExtensions == null) { updateExtensionsLists(); } return availableExtensions.containsKey(uniqueId); } /** * @see org.java.plugin.registry.ExtensionPoint#getConnectedExtensions() */ public Collection getConnectedExtensions() { if (connectedExtensions == null) { updateExtensionsLists(); } return Collections.unmodifiableCollection(connectedExtensions.values()); } /** * @see org.java.plugin.registry.ExtensionPoint#getConnectedExtension( * java.lang.String) */ public Extension getConnectedExtension(final String uniqueId) { if (connectedExtensions == null) { updateExtensionsLists(); } Extension result = connectedExtensions.get(uniqueId); if (result == null) { throw new IllegalArgumentException("extension " + uniqueId //$NON-NLS-1$ + " not connected to point " + getUniqueId()); //$NON-NLS-1$ } return result; } /** * @see org.java.plugin.registry.ExtensionPoint#isExtensionConnected( * java.lang.String) */ public boolean isExtensionConnected(final String uniqueId) { if (connectedExtensions == null) { updateExtensionsLists(); } return connectedExtensions.containsKey(uniqueId); } /** * @see org.java.plugin.registry.ExtensionPoint#isValid() */ public boolean isValid() { if (isValid == null) { validate(); } return isValid.booleanValue(); } Collection validate() { if ((model.getParentPluginId() != null) && (model.getParentPointId() != null)) { try { if (!isExtensionPointAvailable(model.getParentPluginId(), model.getParentPointId())) { isValid = Boolean.FALSE; return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION_POINT, "parentExtPointNotAvailable", //$NON-NLS-1$ new Object[] { getDeclaringPluginDescriptor() .getRegistry().makeUniqueId( model.getParentPluginId(), model.getParentPointId()), getUniqueId()})); } } catch (Throwable t) { isValid = Boolean.FALSE; if (log.isDebugEnabled()) { log.debug("failed checking availability of extension point " //$NON-NLS-1$ + getDeclaringPluginDescriptor().getRegistry() .makeUniqueId(model.getParentPluginId(), model.getParentPointId()), t); } return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION_POINT, "parentExtPointAvailabilityCheckFailed", //$NON-NLS-1$ new Object[] { getDeclaringPluginDescriptor() .getRegistry().makeUniqueId( model.getParentPluginId(), model.getParentPointId()), getUniqueId(), t})); } } switch (getMultiplicity()) { case ANY: isValid = Boolean.TRUE; return Collections.emptyList(); case ONE: isValid = Boolean.valueOf(getAvailableExtensions().size() == 1); if (!isValid.booleanValue()) { return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION_POINT, "toManyOrFewExtsConnected", getUniqueId())); //$NON-NLS-1$ } break; case NONE: isValid = Boolean.valueOf(getAvailableExtensions().size() == 0); if (!isValid.booleanValue()) { return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION_POINT, "extsConnectedToAbstractExtPoint", getUniqueId())); //$NON-NLS-1$ } break; case ONE_PER_PLUGIN: isValid = Boolean.TRUE; final Set foundPlugins = new HashSet(); String pluginId; for (Extension extension : getAvailableExtensions()) { pluginId = extension.getDeclaringPluginDescriptor().getId(); if (!foundPlugins.add(pluginId)) { isValid = Boolean.FALSE; return Collections.singletonList((ReportItem) new IntegrityChecker.ReportItemImpl( IntegrityCheckReport.Severity.ERROR, this, IntegrityCheckReport.Error.INVALID_EXTENSION_POINT, "toManyExtsConnected", getUniqueId())); //$NON-NLS-1$ } } break; } return Collections.emptyList(); } private boolean isExtensionPointAvailable(final String pluginId, final String pointId) { PluginRegistry registry = getDeclaringPluginDescriptor().getRegistry(); if (!registry.isPluginDescriptorAvailable(pluginId)) { return false; } for (ExtensionPoint extensionPoint : registry.getPluginDescriptor(pluginId) .getExtensionPoints()) { if (extensionPoint.getId().equals(pointId)) { return true; } } return false; } /** * @see org.java.plugin.registry.ExtensionPoint#getParameterDefinitions() */ public Collection getParameterDefinitions() { if ((model.getParentPluginId() == null) || (model.getParentPointId() == null) || paramDefsMerged) { return parameterDefinitions; } final Set names = new HashSet(); final Collection parentParamDefs = getDeclaringPluginDescriptor().getRegistry().getExtensionPoint( model.getParentPluginId(), model.getParentPointId()) .getParameterDefinitions(); final List newParamDefs = new ArrayList(parameterDefinitions.size() + parentParamDefs.size()); for (ParameterDefinition def : parameterDefinitions) { names.add(def.getId()); newParamDefs.add(def); } for (ParameterDefinition def : parentParamDefs) { if (names.contains(def.getId())) continue; newParamDefs.add(def); } paramDefsMerged = true; parameterDefinitions = Collections.unmodifiableList(newParamDefs); return parameterDefinitions; } /** * @see org.java.plugin.registry.ExtensionPoint#getParameterDefinition( * java.lang.String) */ public ParameterDefinition getParameterDefinition(final String id) { for (ParameterDefinition parameterDefinition : getParameterDefinitions()) { ParameterDefinitionImpl def = (ParameterDefinitionImpl) parameterDefinition; if (def.getId().equals(id)) { return def; } } throw new IllegalArgumentException("parameter definition with ID " + id //$NON-NLS-1$ + " not found in extension point " + getUniqueId() //$NON-NLS-1$ + " and all it parents"); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.ExtensionPoint#getParentPluginId() */ public String getParentPluginId() { return model.getParentPluginId(); } /** * @see org.java.plugin.registry.ExtensionPoint#getParentExtensionPointId() */ public String getParentExtensionPointId() { return model.getParentPointId(); } /** * @see org.java.plugin.registry.ExtensionPoint#isSuccessorOf( * org.java.plugin.registry.ExtensionPoint) */ public boolean isSuccessorOf(final ExtensionPoint extensionPoint) { if ((model.getParentPluginId() == null) || (model.getParentPointId() == null)) { return false; } if (model.getParentPluginId().equals( extensionPoint.getDeclaringPluginDescriptor().getId()) && model.getParentPointId().equals(extensionPoint.getId())) { return true; } try { return getDeclaringPluginDescriptor().getRegistry() .getExtensionPoint(model.getParentPluginId(), model.getParentPointId()).isSuccessorOf(extensionPoint); } catch (IllegalArgumentException iae) { return false; } } private void collectDescendants() { descendants = new LinkedList(); for (PluginDescriptor descr : getDeclaringPluginDescriptor().getRegistry() .getPluginDescriptors()) { for (ExtensionPoint extp : descr.getExtensionPoints()) { if (extp.isSuccessorOf(this)) { if (log.isDebugEnabled()) { log.debug("extension point " + extp //$NON-NLS-1$ + " is descendant of point " + this); //$NON-NLS-1$ } descendants.add(extp); } } } descendants = Collections.unmodifiableList(descendants); } /** * @see org.java.plugin.registry.ExtensionPoint#getDescendants() */ public Collection getDescendants() { if (descendants == null) { collectDescendants(); } return descendants; } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{ExtensionPoint: uid=" + getUniqueId() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ } void registryChanged() { isValid = null; connectedExtensions = null; availableExtensions = null; descendants = null; } class ParameterDefinitionImpl extends PluginElementImpl implements ParameterDefinition { private List subDefinitions; private final ParameterDefinitionImpl superDefinition; private final ModelParameterDef modelParamDef; private final ParameterValueParser valueParser; ParameterDefinitionImpl(final ParameterDefinitionImpl aSuperDefinition, final ModelParameterDef aModel) throws ManifestProcessingException { super(ExtensionPointImpl.this.getDeclaringPluginDescriptor(), ExtensionPointImpl.this.getDeclaringPluginFragment(), aModel.getId(), aModel.getDocumentation()); superDefinition = aSuperDefinition; modelParamDef = aModel; valueParser = new ParameterValueParser( getDeclaringPluginDescriptor().getRegistry(), this, modelParamDef.getDefaultValue()); if (!valueParser.isParsingSucceeds()) { log.warn("parsing default value for parameter definition " //$NON-NLS-1$ + this + " failed, message is: " //$NON-NLS-1$ + valueParser.getParsingMessage()); throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "invalidDefaultValueAttribute", //$NON-NLS-1$ new Object[] {modelParamDef.getDefaultValue(), ExtensionPointImpl.this.getId(), ExtensionPointImpl.this .getDeclaringPluginDescriptor().getId()}); } if (ParameterType.ANY == modelParamDef.getType()) { subDefinitions = Collections.emptyList(); } else { subDefinitions = new ArrayList( modelParamDef.getParamDefs().size()); final Set names = new HashSet(); for (ModelParameterDef modelParameterDef : modelParamDef.getParamDefs()) { ParameterDefinitionImpl def = new ParameterDefinitionImpl(this, modelParameterDef); if (names.contains(def.getId())) { throw new ManifestProcessingException( PluginRegistryImpl.PACKAGE_NAME, "duplicateParameterDefinition", //$NON-NLS-1$ new Object[] {def.getId(), ExtensionPointImpl.this.getId(), ExtensionPointImpl.this. getDeclaringPluginDescriptor().getId()}); } names.add(def.getId()); subDefinitions.add(def); } subDefinitions = Collections.unmodifiableList(subDefinitions); } if (log.isDebugEnabled()) { log.debug("object instantiated: " + this); //$NON-NLS-1$ } } ParameterValueParser getValueParser() { return valueParser; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getDeclaringExtensionPoint() */ public ExtensionPoint getDeclaringExtensionPoint() { return ExtensionPointImpl.this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getMultiplicity() */ public ParameterMultiplicity getMultiplicity() { return modelParamDef.getMultiplicity(); } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getSubDefinitions() */ public Collection getSubDefinitions() { return subDefinitions; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getSuperDefinition() */ public ParameterDefinition getSuperDefinition() { return superDefinition; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getSubDefinition(java.lang.String) */ public ParameterDefinition getSubDefinition(final String id) { for (ParameterDefinition parameterDefinition : subDefinitions) { ParameterDefinitionImpl def = (ParameterDefinitionImpl) parameterDefinition; if (def.getId().equals(id)) { return def; } } throw new IllegalArgumentException( "parameter definition with ID " + id //$NON-NLS-1$ + " not found in extension point " + getUniqueId()); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getType() */ public ParameterType getType() { return modelParamDef.getType(); } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getCustomData() */ public String getCustomData() { return modelParamDef.getCustomData(); } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition * #getDefaultValue() */ public String getDefaultValue() { return modelParamDef.getDefaultValue(); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "{PluginExtensionPoint.ParameterDefinition: extPointUid=" //$NON-NLS-1$ + getDeclaringExtensionPoint().getUniqueId() + "; id=" + getId() //$NON-NLS-1$ + "}"; //$NON-NLS-1$ } /** * @see org.java.plugin.registry.xml.IdentityImpl#isEqualTo( * org.java.plugin.registry.Identity) */ @Override protected boolean isEqualTo(final Identity idt) { if (!super.isEqualTo(idt)) { return false; } ParameterDefinitionImpl other = (ParameterDefinitionImpl) idt; if ((getSuperDefinition() == null) && (other.getSuperDefinition() == null)) { return true; } if ((getSuperDefinition() == null) || (other.getSuperDefinition() == null)) { return false; } return getSuperDefinition().equals(other.getSuperDefinition()); } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/xml/plugin_1_0.dtd0000644000175000017500000002710310623622352026467 0ustar gregoagregoa libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/PluginFragment.java0000644000175000017500000000542010553765202027024 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.net.URL; /** * Interface to get access to main information about plug-in fragment. This * does not include information about libraries, extensions and extension * points, defined in this fragment, such information is available as part of * plug-in, to which this fragment contributes. *

* Plug-in fragment UID is a combination of plug-in fragment ID and version * identifier that is unique within whole set of registered plug-ins and * fragments. *

* * @version $Id$ */ public interface PluginFragment extends UniqueIdentity, Documentable { /** * @return vendor as specified in manifest file or empty string */ String getVendor(); /** * @return plug-in fragment version identifier as specified in manifest file */ Version getVersion(); /** * @return ID of plug-in to which this fragment may contribute */ String getPluginId(); /** * @return version identifier of plug-in to which this fragment may * contribute or null if no version specified in * manifest */ Version getPluginVersion(); /** * @return plug-ins registry */ PluginRegistry getRegistry(); /** * Checks is this fragment may contribute to given plug-in. * @param descr plug-in descriptor * @return true if this fragment may contribute to given * plug-in */ boolean matches(PluginDescriptor descr); /** * @return the match rule as it specified in manifest */ MatchingRule getMatchingRule(); /** * @return location from which this fragment was registered */ URL getLocation(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/PluginAttribute.java0000644000175000017500000000415310552766216027233 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.util.Collection; /** * This interface abstracts plug-in attribute, a <ID,VALUE> pair. Plug-in * attributes are not involved into JPF runtime internal logic and intended * to be used by plug-in developers. * @version $Id$ */ public interface PluginAttribute extends PluginElement { /** * @return attribute value as it is specified in manifest */ String getValue(); /** * @return collection of all sub-attributes of this attribute */ Collection getSubAttributes(); /** * @param id ID of sub-attribute to look for * @return sub-attribute with given ID */ PluginAttribute getSubAttribute(String id); /** * @param id ID of sub-attribute to look for * @return collection of all sub-attributes with given ID */ Collection getSubAttributes(String id); /** * @return attribute, of which this one is child or null if * this is top level attribute */ PluginAttribute getSuperAttribute(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/Version.java0000644000175000017500000002666210552766600025544 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Locale; import java.util.StringTokenizer; /** * This class represents a plug-in version identifier. *
* @version $Id$ */ public final class Version implements Serializable, Comparable { private static final long serialVersionUID = -3054349171116917643L; /** * Version identifier parts separator. */ public static final char SEPARATOR = '.'; /** * Parses given string as version identifier. All missing parts will be * initialized to 0 or empty string. Parsing starts from left side of the * string. * @param str version identifier as string * @return version identifier object */ public static Version parse(final String str) { Version result = new Version(); result.parseString(str); return result; } private transient int major; private transient int minor; private transient int build; private transient String name; private transient String asString; private Version() { // no-op } private void parseString(final String str) { major = 0; minor = 0; build = 0; name = ""; //$NON-NLS-1$ StringTokenizer st = new StringTokenizer(str, "" + SEPARATOR, false); //$NON-NLS-1$ // major segment if (!st.hasMoreTokens()) { return; } String token = st.nextToken(); try { major = Integer.parseInt(token, 10); } catch (NumberFormatException nfe) { name = token; while (st.hasMoreTokens()) { name += st.nextToken(); } return; } // minor segment if (!st.hasMoreTokens()) { return; } token = st.nextToken(); try { minor = Integer.parseInt(token, 10); } catch (NumberFormatException nfe) { name = token; while (st.hasMoreTokens()) { name += st.nextToken(); } return; } // build segment if (!st.hasMoreTokens()) { return; } token = st.nextToken(); try { build = Integer.parseInt(token, 10); } catch (NumberFormatException nfe) { name = token; while (st.hasMoreTokens()) { name += st.nextToken(); } return; } // name segment if (st.hasMoreTokens()) { name = st.nextToken(); while (st.hasMoreTokens()) { name += st.nextToken(); } } } /** * Creates version identifier object from given parts. No validation * performed during object instantiation, all values become parts of * version identifier as they are. * @param aMajor major version number * @param aMinor minor version number * @param aBuild build number * @param aName build name, null value becomes empty string */ public Version(final int aMajor, final int aMinor, final int aBuild, final String aName) { major = aMajor; minor = aMinor; build = aBuild; name = (aName == null) ? "" : aName; //$NON-NLS-1$ } /** * @return build number */ public int getBuild() { return build; } /** * @return major version number */ public int getMajor() { return major; } /** * @return minor version number */ public int getMinor() { return minor; } /** * @return build name */ public String getName() { return name; } /** * Compares two version identifiers to see if this one is * greater than or equal to the argument. *

* A version identifier is considered to be greater than or equal * if its major component is greater than the argument major * component, or the major components are equal and its minor component * is greater than the argument minor component, or the * major and minor components are equal and its build component is * greater than the argument build component, or all components are equal. *

* * @param other the other version identifier * @return true if this version identifier * is compatible with the given version identifier, and * false otherwise */ public boolean isGreaterOrEqualTo(final Version other) { if (other == null) { return false; } if (major > other.major) { return true; } if ((major == other.major) && (minor > other.minor)) { return true; } if ((major == other.major) && (minor == other.minor) && (build > other.build)) { return true; } if ((major == other.major) && (minor == other.minor) && (build == other.build) && name.equalsIgnoreCase(other.name)) { return true; } return false; } /** * Compares two version identifiers for compatibility. *

* A version identifier is considered to be compatible if its major * component equals to the argument major component, and its minor component * is greater than or equal to the argument minor component. * If the minor components are equal, than the build component of the * version identifier must be greater than or equal to the build component * of the argument identifier. *

* * @param other the other version identifier * @return true if this version identifier * is compatible with the given version identifier, and * false otherwise */ public boolean isCompatibleWith(final Version other) { if (other == null) { return false; } if (major != other.major) { return false; } if (minor > other.minor) { return true; } if (minor < other.minor) { return false; } if (build >= other.build) { return true; } return false; } /** * Compares two version identifiers for equivalency. *

* Two version identifiers are considered to be equivalent if their major * and minor components equal and are at least at the same build level * as the argument. *

* * @param other the other version identifier * @return true if this version identifier * is equivalent to the given version identifier, and * false otherwise */ public boolean isEquivalentTo(final Version other) { if (other == null) { return false; } if (major != other.major) { return false; } if (minor != other.minor) { return false; } if (build >= other.build) { return true; } return false; } /** * Compares two version identifiers for order using multi-decimal * comparison. * * @param other the other version identifier * @return true if this version identifier * is greater than the given version identifier, and * false otherwise */ public boolean isGreaterThan(final Version other) { if (other == null) { return false; } if (major > other.major) { return true; } if (major < other.major) { return false; } if (minor > other.minor) { return true; } if (minor < other.minor) { return false; } if (build > other.build) { return true; } return false; } /** * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return toString().hashCode(); } /** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof Version)) { return false; } Version other = (Version) obj; if ((major != other.major) || (minor != other.minor) || (build != other.build) || !name.equalsIgnoreCase(other.name)) { return false; } return true; } /** * Returns the string representation of this version identifier. * The result satisfies * version.equals(new Version(version.toString())). * @return the string representation of this version identifier */ @Override public String toString() { if (asString == null) { asString = "" + major + SEPARATOR + minor + SEPARATOR + build //$NON-NLS-1$ + (name.length() == 0 ? "" : SEPARATOR + name); //$NON-NLS-1$ } return asString; } /** * @param obj version to compare this instance with * @return comparison result * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(final Version obj) { if (equals(obj)) { return 0; } if (major != obj.major) { return major - obj.major; } if (minor != obj.minor) { return minor - obj.minor; } if (build != obj.build) { return build - obj.build; } return name.toLowerCase(Locale.ENGLISH).compareTo( obj.name.toLowerCase(Locale.ENGLISH)); } // Serialization related stuff. private void writeObject(final ObjectOutputStream out) throws IOException { out.writeUTF(toString()); } private void readObject(final ObjectInputStream in) throws IOException { parseString(in.readUTF()); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/ExtensionPoint.java0000644000175000017500000001465510553765456027115 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; import java.util.Collection; /** * This interface abstracts the extension point - a place where the * functionality of plug-in can be extended. *

* Extension point UID is a combination of declaring plug-in ID and extension * point ID that is unique within whole set of registered plug-ins. *

* * @version $Id$ */ public interface ExtensionPoint extends UniqueIdentity, PluginElement { /** * @return multiplicity of this extension point */ ExtensionMultiplicity getMultiplicity(); /** * Returns collection of all top level parameter definitions declared * in this extension point and all it parents. * @return collection of {@link ExtensionPoint.ParameterDefinition} objects */ Collection getParameterDefinitions(); /** * @param id ID of parameter definition to look for * @return parameter definition with given ID */ ParameterDefinition getParameterDefinition(String id); /** * Returns a collection of all extensions that available for this point. * @return collection of {@link Extension} objects */ Collection getAvailableExtensions(); /** * @param uniqueId unique ID of extension * @return extension that is available for this point */ Extension getAvailableExtension(String uniqueId); /** * Checks if extension is available for this extension point. If this method * returns true, the method * {@link #getAvailableExtension(String)} should return valid extension for * the same UID. * @param uniqueId unique ID of extension * @return true if extension is available for this extension * point */ boolean isExtensionAvailable(String uniqueId); /** * Returns a collection of all extensions that was successfully "connected" * to this point. * @return collection of {@link Extension} objects */ Collection getConnectedExtensions(); /** * @param uniqueId unique ID of extension * @return extension that was successfully "connected" to this point */ Extension getConnectedExtension(String uniqueId); /** * Checks if extension is in valid state and successfully "connected" * to this extension point. If this method returns true, * the method {@link #getConnectedExtension(String)} should return * valid extension for the same UID. * @param uniqueId unique ID of extension * @return true if extension was successfully "connected" to * this extension point */ boolean isExtensionConnected(String uniqueId); /** * @return true if extension point is considered to be valid */ boolean isValid(); /** * @return parent extension point plug-in ID or null */ String getParentPluginId(); /** * @return parent extension point ID or null */ String getParentExtensionPointId(); /** * @param extensionPoint extension point * @return true if this point is successor of given extension * point */ boolean isSuccessorOf(ExtensionPoint extensionPoint); /** * Looks for all available (valid) successors of this extension point. * The search should be done recursively including all descendants of this * extension point. * @return collection of {@link ExtensionPoint} objects */ Collection getDescendants(); /** * This interface abstracts parameter definition - a parameter * "type declaration". * @version $Id$ */ interface ParameterDefinition extends PluginElement { /** * @return multiplicity of parameter, that can be defined according * to this definition */ ParameterMultiplicity getMultiplicity(); /** * @return value type of parameter, that can be defined according * to this definition */ ParameterType getType(); /** * @return custom data for additional customization of some types */ String getCustomData(); /** * Returns collection of all parameter sub-definitions declared * in this parameter definition. * @return collection of {@link ExtensionPoint.ParameterDefinition} * objects */ Collection getSubDefinitions(); /** * @param id ID of parameter sub-definition to look for * @return parameter sub-definition with given ID */ ParameterDefinition getSubDefinition(String id); /** * @return extension point, this definition belongs to */ ExtensionPoint getDeclaringExtensionPoint(); /** * @return parameter definition, of which this one is child or * null if this is top level parameter definition */ ParameterDefinition getSuperDefinition(); /** * @return default parameter value as it is defined in manifest */ String getDefaultValue(); } }libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/registry/PluginElement.java0000644000175000017500000000356710553756074026673 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.registry; /** * This interface abstracts a plug-in element - a thing that is declared in * plug-in or plug-in fragment descriptor. * @param type of plug-in element * @version $Id$ */ public interface PluginElement> extends Identity, Documentable { /** * Returns plug-in descriptor, this element belongs to. This method * should never return null. * @return plug-in descriptor, this element belongs to */ PluginDescriptor getDeclaringPluginDescriptor(); /** * Returns descriptor of plug-in fragment that contributes this element. * This method may return null, if element is contributed by * plug-in directly. * @return descriptor of plug-in fragment that contributes this element */ PluginFragment getDeclaringPluginFragment(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/PluginLifecycleException.java0000644000175000017500000000436510552762642027202 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; /** * Exception class that indicates errors during plug-in life cycle. * @version $Id$ */ public class PluginLifecycleException extends JpfException { private static final long serialVersionUID = -4019294858687542301L; /** * @param packageName package to load resources from * @param messageKey resource key */ public PluginLifecycleException(final String packageName, final String messageKey) { super(packageName, messageKey, null, null); } /** * @param packageName package to load resources from * @param messageKey resource key * @param data parameters substitution data */ public PluginLifecycleException(final String packageName, final String messageKey, final Object data) { super(packageName, messageKey, data, null); } /** * @param packageName package to load resources from * @param messageKey resource key * @param data parameters substitution data * @param cause nested exception */ public PluginLifecycleException(final String packageName, final String messageKey, final Object data, final Throwable cause) { super(packageName, messageKey, data, cause); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/0000755000175000017500000000000010612737270023166 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/ShadingPathResolver.java0000644000175000017500000011265310621654624027756 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.registry.Identity; import org.java.plugin.registry.Library; import org.java.plugin.registry.PluginAttribute; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginElement; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.UniqueIdentity; import org.java.plugin.util.ExtendedProperties; import org.java.plugin.util.IoUtil; /** * This implementation of path resolver makes "shadow copy" of plug-in resources * before resolving paths to them, this helps avoid locking of local resources * and run native code from remote locations. *

* Configuration parameters *

*

* This path resolver implementation supports following configuration * parameters: *

*
shadowFolder
*
Path to the folder where to copy resources to prevent their locking. By * default this will be * System.getProperty("java.io.tmpdir") + "/.jpf-shadow". * Please note that this folder will be maintained automatically by the * Framework and might be cleared without any confirmation or notification. * So it is strongly not recommended to use plug-ins folder (or other * sensitive application directory) as shadow folder, this may lead to * losing your data.
*
unpackMode
*
If always, "JAR'ed" or "ZIP'ed" plug-ins will be * un-compressed to the shadow folder, if never, they will be * just copied, if smart, the processing depends on plug-in * content - if plug-in contains JAR libraries, it will be un-packed, * otherwise just copied to shadow folder. It is also possible to add * boolean "unpack" attribute to plug-in manifest, in this case, it's value * will be taken into account. The default parameter value is * smart.
*
*

* * @version $Id: ShadingPathResolver.java,v 1.5 2007/05/13 16:31:48 ddimon Exp $ */ public class ShadingPathResolver extends StandardPathResolver { private static final String UNPACK_MODE_ALWAIS = "always"; //$NON-NLS-1$ private static final String UNPACK_MODE_NEVER = "never"; //$NON-NLS-1$ private static final String UNPACK_MODE_SMART = "smart"; //$NON-NLS-1$ private File shadowFolder; private String unpackMode; private Map shadowUrlMap = new HashMap(); // private Map unpackModeMap = new HashMap(); // private ShadowDataController controller; /** * @see org.java.plugin.PathResolver#configure(ExtendedProperties) */ @Override public synchronized void configure(final ExtendedProperties config) throws Exception { super.configure(config); String folder = config.getProperty("shadowFolder"); //$NON-NLS-1$ if ((folder != null) && (folder.length() > 0)) { try { shadowFolder = new File(folder).getCanonicalFile(); } catch (IOException ioe) { log.warn("failed initializing shadow folder " + folder //$NON-NLS-1$ + ", falling back to the default folder", ioe); //$NON-NLS-1$ } } if (shadowFolder == null) { shadowFolder = new File(System.getProperty("java.io.tmpdir"), //$NON-NLS-1$ ".jpf-shadow"); //$NON-NLS-1$ } log.debug("shadow folder is " + shadowFolder); //$NON-NLS-1$ if (!shadowFolder.exists()) { shadowFolder.mkdirs(); } unpackMode = config.getProperty("unpackMode", UNPACK_MODE_SMART); //$NON-NLS-1$ log.debug("unpack mode parameter value is " + unpackMode); //$NON-NLS-1$ controller = ShadowDataController.init(shadowFolder, buildFileFilter(config)); log.info("configured, shadow folder is " + shadowFolder); //$NON-NLS-1$ } private FileFilter buildFileFilter(final ExtendedProperties config) { final FileFilter includesFilter; String patterns = config.getProperty("includes"); //$NON-NLS-1$ if ((patterns != null) && (patterns.trim().length() > 0)) { includesFilter = new RegexpFileFilter(patterns); } else { includesFilter = null; } final FileFilter excludesFilter; patterns = config.getProperty("excludes"); //$NON-NLS-1$ if ((patterns != null) && (patterns.trim().length() > 0)) { excludesFilter = new RegexpFileFilter(patterns); } else { excludesFilter = null; } if ((excludesFilter == null) && (includesFilter == null)) { return null; } return new CombinedFileFilter(includesFilter, excludesFilter); } /** * @see org.java.plugin.standard.StandardPathResolver#registerContext( * org.java.plugin.registry.Identity, java.net.URL) */ @Override public void registerContext(Identity idt, URL url) { super.registerContext(idt, url); Boolean mode; if (UNPACK_MODE_ALWAIS.equalsIgnoreCase(unpackMode)) { mode = Boolean.TRUE; } else if (UNPACK_MODE_NEVER.equalsIgnoreCase(unpackMode)) { mode = Boolean.FALSE; } else { PluginDescriptor descr = null; PluginFragment fragment = null; if (idt instanceof PluginDescriptor) { descr = (PluginDescriptor) idt; } else if (idt instanceof PluginFragment) { fragment = (PluginFragment) idt; descr = fragment.getRegistry().getPluginDescriptor( fragment.getPluginId()); } else if (idt instanceof PluginElement) { PluginElement element = (PluginElement) idt; descr = element.getDeclaringPluginDescriptor(); fragment = element.getDeclaringPluginFragment(); } else { throw new IllegalArgumentException("unknown identity class " //$NON-NLS-1$ + idt.getClass().getName()); } mode = getUnpackMode(descr, fragment); } log.debug("unpack mode for " + idt + " is " + mode); //$NON-NLS-1$ //$NON-NLS-2$ unpackModeMap.put(idt.getId(), mode); } private Boolean getUnpackMode(final PluginDescriptor descr, final PluginFragment fragment) { for (PluginAttribute attr : filterCollection(descr.getAttributes("unpack"), fragment)) { //$NON-NLS-1$ return Boolean.valueOf("false".equalsIgnoreCase( //$NON-NLS-1$ attr.getValue())); } for (Library lib : filterCollection(descr.getLibraries(), fragment)) { if (lib.isCodeLibrary() && (lib.getPath().toLowerCase( Locale.getDefault()).endsWith(".jar") //$NON-NLS-1$ || lib.getPath().toLowerCase( Locale.getDefault()).endsWith(".zip"))) { //$NON-NLS-1$ return Boolean.TRUE; } } return Boolean.FALSE; } private > Collection filterCollection( final Collection coll, final PluginFragment fragment) { if (fragment == null) { return coll; } LinkedList result = new LinkedList(); for (T element : coll) { if (fragment.equals(element.getDeclaringPluginFragment())) { result.add(element); } } return result; } /** * @see org.java.plugin.standard.StandardPathResolver#unregisterContext( * java.lang.String) */ @Override public void unregisterContext(String id) { shadowUrlMap.remove(id); unpackModeMap.remove(id); super.unregisterContext(id); } /** * @see org.java.plugin.PathResolver#resolvePath( * org.java.plugin.registry.Identity, java.lang.String) */ @Override public URL resolvePath(final Identity idt, final String path) { URL baseUrl; if (idt instanceof PluginDescriptor) { baseUrl = getBaseUrl((PluginDescriptor) idt); } else if (idt instanceof PluginFragment) { baseUrl = getBaseUrl((PluginFragment) idt); } else if (idt instanceof PluginElement) { PluginElement element = (PluginElement) idt; if (element.getDeclaringPluginFragment() != null) { baseUrl = getBaseUrl( element.getDeclaringPluginFragment()); } else { baseUrl = getBaseUrl( element.getDeclaringPluginDescriptor()); } } else { throw new IllegalArgumentException("unknown identity class " //$NON-NLS-1$ + idt.getClass().getName()); } return resolvePath(baseUrl, path); } protected synchronized URL getBaseUrl(final UniqueIdentity uid) { URL result = shadowUrlMap.get(uid.getId()); if (result != null) { return result; } result = controller.shadowResource(getRegisteredContext(uid.getId()), uid.getUniqueId(), (unpackModeMap.get(uid.getId())).booleanValue()); shadowUrlMap.put(uid.getId(), result); return result; } } final class ShadingUtil { static String getExtension(final String name) { if ((name == null) || (name.length() == 0)) { return null; } int p = name.lastIndexOf('.'); if ((p != -1) && (p > 0) && (p < name.length() - 1)) { return name.substring(p + 1); } return null; } static void unpack(final ZipFile zipFile, final File destFolder) throws IOException { for (Enumeration en = zipFile.entries(); en.hasMoreElements();) { ZipEntry entry = en.nextElement(); String name = entry.getName(); File entryFile = new File(destFolder.getCanonicalPath() + "/" + name); //$NON-NLS-1$ if (name.endsWith("/")) { //$NON-NLS-1$ if (!entryFile.exists() && !entryFile.mkdirs()) { throw new IOException("can't create folder " + entryFile); //$NON-NLS-1$ } } else { File folder = entryFile.getParentFile(); if (!folder.exists() && !folder.mkdirs()) { throw new IOException("can't create folder " + folder); //$NON-NLS-1$ } OutputStream out = new BufferedOutputStream( new FileOutputStream(entryFile, false)); try { InputStream in = zipFile.getInputStream(entry); try { IoUtil.copyStream(in, out, 1024); } finally { in.close(); } } finally { out.close(); } } entryFile.setLastModified(entry.getTime()); } } static void unpack(final InputStream strm, final File destFolder) throws IOException { ZipInputStream zipStrm = new ZipInputStream(strm); ZipEntry entry = zipStrm.getNextEntry(); while (entry != null) { String name = entry.getName(); File entryFile = new File(destFolder.getCanonicalPath() + "/" + name); //$NON-NLS-1$ if (name.endsWith("/")) { //$NON-NLS-1$ if (!entryFile.exists() && !entryFile.mkdirs()) { throw new IOException("can't create folder " + entryFile); //$NON-NLS-1$ } } else { File folder = entryFile.getParentFile(); if (!folder.exists() && !folder.mkdirs()) { throw new IOException("can't create folder " + folder); //$NON-NLS-1$ } OutputStream out = new BufferedOutputStream( new FileOutputStream(entryFile, false)); try { IoUtil.copyStream(zipStrm, out, 1024); } finally { out.close(); } } entryFile.setLastModified(entry.getTime()); entry = zipStrm.getNextEntry(); } } static boolean deleteFile(final File file) { if (file.isDirectory()) { IoUtil.emptyFolder(file); } return file.delete(); } static Date getLastModified(final URL url) throws IOException { long result = 0; if ("jar".equalsIgnoreCase(url.getProtocol())) { //$NON-NLS-1$ String urlStr = url.toExternalForm(); int p = urlStr.indexOf("!/"); //$NON-NLS-1$ if (p != -1) { //sourceFile = IoUtil.url2file(new URL(urlStr.substring(4, p))); return getLastModified(new URL(urlStr.substring(4, p))); } } File sourceFile = IoUtil.url2file(url); if (sourceFile != null) { result = sourceFile.lastModified(); } else { URLConnection cnn = url.openConnection(); try { cnn.setUseCaches(false); cnn.setDoInput(false); // this should force using HTTP HEAD method result = cnn.getLastModified(); } finally { try { cnn.getInputStream().close(); } catch (IOException ioe) { // ignore } } } if (result == 0) { throw new IOException( "can't retrieve modification date for resource " //$NON-NLS-1$ + url); } // for some reason modification milliseconds for some files are unstable Calendar cldr = Calendar.getInstance(Locale.ENGLISH); cldr.setTime(new Date(result)); cldr.set(Calendar.MILLISECOND, 0); return cldr.getTime(); } private static String getRelativePath(final File base, final File file) throws IOException { String basePath; String filePath = file.getCanonicalPath(); if (base.isFile()) { File baseParent = base.getParentFile(); if (baseParent == null) { return null; } basePath = baseParent.getCanonicalPath(); } else { basePath = base.getCanonicalPath(); } if (!basePath.endsWith(File.separator)) { basePath += File.separator; } int p = basePath.indexOf(File.separatorChar); String prefix = null; while (p != -1) { String newPrefix = basePath.substring(0, p + 1); if (!filePath.startsWith(newPrefix)) { break; } prefix = newPrefix; p = basePath.indexOf(File.separatorChar, p + 1); } if (prefix == null) { return null; } filePath = filePath.substring(prefix.length()); if (prefix.length() == basePath.length()) { return filePath; } int c = 0; p = basePath.indexOf(File.separatorChar, prefix.length()); while (p != -1) { c++; p = basePath.indexOf(File.separatorChar, p + 1); } for (int i = 0; i < c; i++) { filePath = ".." + File.separator + filePath; //$NON-NLS-1$ } return filePath; } private static String getRelativeUrl(final File base, final File file) throws IOException { String result = ShadingUtil.getRelativePath(base, file); if (result == null) { return null; } result = result.replace('\\', '/'); if (file.isDirectory() && !result.endsWith("/")) { //$NON-NLS-1$ result += "/"; //$NON-NLS-1$ } return result; } static String getRelativeUrl(final File base, final URL url) throws IOException { File file = IoUtil.url2file(url); if (file != null) { String result = getRelativeUrl(base, file); if (result != null) { return result; } } if ("jar".equalsIgnoreCase(url.getProtocol())) { //$NON-NLS-1$ String urlStr = url.toExternalForm(); int p = urlStr.indexOf("!/"); //$NON-NLS-1$ if (p != -1) { return "jar:" //$NON-NLS-1$ + getRelativeUrl(base, new URL(urlStr.substring(4, p))) + urlStr.substring(p); } } return url.toExternalForm(); } static URL buildURL(final URL base, final String url) throws MalformedURLException { if (!url.toLowerCase(Locale.ENGLISH).startsWith("jar:")) { //$NON-NLS-1$ return new URL(base, url); } int p = url.indexOf("!/"); //$NON-NLS-1$ if (p == -1) { return new URL(base, url); } return new URL("jar:" //$NON-NLS-1$ + new URL(base, url.substring(4, p)).toExternalForm() + url.substring(p)); } private ShadingUtil() { // no-op } } final class ShadowDataController { private static final String META_FILE_NAME = ".meta"; //$NON-NLS-1$ private final Log log = LogFactory.getLog(ShadowDataController.class); private final File shadowFolder; private final URL shadowFolderUrl; private final Properties metaData; private final DateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //$NON-NLS-1$ private final FileFilter fileFilter; static ShadowDataController init(final File shadowFolder, final FileFilter filter) throws IOException { ShadowDataController result = new ShadowDataController(shadowFolder, filter); result.quickCheck(); result.save(); return result; } private ShadowDataController(final File folder, final FileFilter filter) throws IOException { shadowFolder = folder; fileFilter = filter; shadowFolderUrl = IoUtil.file2url(folder); File metaFile = new File(shadowFolder, META_FILE_NAME); metaData = new Properties(); if (metaFile.isFile()) { try { InputStream in = new FileInputStream(metaFile); try { metaData.load(in); } finally { in.close(); } if (log.isDebugEnabled()) { log.debug("meta-data loaded from file " + metaFile); //$NON-NLS-1$ } } catch (IOException ioe) { log.warn("failed loading meta-data from file " + metaFile, ioe); //$NON-NLS-1$ } } } private void save() { File metaFile = new File(shadowFolder, META_FILE_NAME); try { OutputStream out = new FileOutputStream(metaFile, false); try { metaData.store(out, "This is automatically generated file."); //$NON-NLS-1$ } finally { out.close(); } if (log.isDebugEnabled()) { log.debug("meta-data saved to file " + metaFile); //$NON-NLS-1$ } } catch (IOException ioe) { log.warn("failed saving meta-data to file " + metaFile, ioe); //$NON-NLS-1$ } } private void quickCheck() { File[] files = shadowFolder.listFiles(new ShadowFileFilter()); for (File file : files) { if (metaData.containsValue(file.getName())) { continue; } if (ShadingUtil.deleteFile(file)) { if (log.isDebugEnabled()) { log.debug("deleted shadow file " + file); //$NON-NLS-1$ } } else { log.warn("can't delete shadow file " + file); //$NON-NLS-1$ } } Set uids = new HashSet(); for (Map.Entry entry : metaData.entrySet()) { String key = (String) entry.getKey(); if (!key.startsWith("uid:")) { //$NON-NLS-1$ continue; } uids.add(entry.getValue()); } for (Object object : uids) { quickCheck((String) object); } } private void quickCheck(final String uid) { if (log.isDebugEnabled()) { log.debug("quick check of UID " + uid); //$NON-NLS-1$ } String url = metaData.getProperty("source:" + uid, null); //$NON-NLS-1$ String file = metaData.getProperty("file:" + uid, null); //$NON-NLS-1$ String modified = metaData.getProperty("modified:" + uid, null); //$NON-NLS-1$ if ((url == null) || (file == null) || (modified == null)) { if (log.isDebugEnabled()) { log.debug("meta-data incomplete, UID=" + uid); //$NON-NLS-1$ } remove(uid); return; } try { if (!dtf.parse(modified).equals(ShadingUtil.getLastModified( ShadingUtil.buildURL(shadowFolderUrl, url)))) { if (log.isDebugEnabled()) { log.debug("source modification detected, UID=" + uid //$NON-NLS-1$ + ", source=" + url); //$NON-NLS-1$ } remove(uid); } } catch (IOException ioe) { log.warn("quick check failed", ioe); //$NON-NLS-1$ remove(uid); } catch (ParseException pe) { log.warn("quick check failed", pe); //$NON-NLS-1$ remove(uid); } } private void remove(final String uid) { String file = metaData.getProperty("file:" + uid, null); //$NON-NLS-1$ if (file != null) { File lostFile = new File(shadowFolder, file); if (ShadingUtil.deleteFile(lostFile)) { if (log.isDebugEnabled()) { log.debug("deleted lost file " + file); //$NON-NLS-1$ } } else { log.warn("can't delete lost file " + file); //$NON-NLS-1$ } } boolean removed = metaData.remove("uid:" + uid) != null; //$NON-NLS-1$ removed |= metaData.remove("source:" + uid) != null; //$NON-NLS-1$ removed |= metaData.remove("file:" + uid) != null; //$NON-NLS-1$ removed |= metaData.remove("modified:" + uid) != null; //$NON-NLS-1$ if (removed && log.isDebugEnabled()) { log.debug("removed meta-data, UID=" + uid); //$NON-NLS-1$ } } private URL add(final String uid, final URL sourceUrl, final File file, final Date modified) throws IOException { URL result = IoUtil.file2url(file); metaData.setProperty("uid:" + uid, uid); //$NON-NLS-1$ String source = ShadingUtil.getRelativeUrl(shadowFolder, sourceUrl); metaData.setProperty("source:" + uid, source); //$NON-NLS-1$ metaData.setProperty("file:" + uid, file.getName()); //$NON-NLS-1$ metaData.setProperty("modified:" + uid, dtf.format(modified)); //$NON-NLS-1$ save(); if (log.isDebugEnabled()) { log.debug("shading done, UID=" + uid + ", source=" //$NON-NLS-1$ //$NON-NLS-2$ + source + ", file=" + result //$NON-NLS-1$ + ", modified=" + dtf.format(modified)); //$NON-NLS-1$ } return result; } URL shadowResource(final URL source, final String uid, final boolean unpack) { try { URL result = deepCheck(source, uid); if (result != null) { if (log.isDebugEnabled()) { log.debug("got actual shaded resource, UID=" + uid //$NON-NLS-1$ + ", source=" + source //$NON-NLS-1$ + ", file=" + result); //$NON-NLS-1$ } return result; } } catch (Exception e) { log.warn("deep check failed, UID=" + uid //$NON-NLS-1$ + ", URL=" + source, e); //$NON-NLS-1$ remove(uid); } Date lastModified; try { lastModified = ShadingUtil.getLastModified(source); } catch (IOException ioe) { log.error("shading failed, can't get modification date for " //$NON-NLS-1$ + source, ioe); return source; } File file = IoUtil.url2file(source); if ((file != null) && file.isDirectory()) { // copy local folder to the shadow directory try { File rootFolder = new File(shadowFolder, uid); IoUtil.copyFolder(file, rootFolder, true, true, fileFilter); return add(uid, source, rootFolder, lastModified); } catch (IOException ioe) { log.error("failed shading local folder " + file, ioe); //$NON-NLS-1$ return source; } } try { if ("jar".equalsIgnoreCase(source.getProtocol())) { //$NON-NLS-1$ String urlStr = source.toExternalForm(); int p = urlStr.indexOf("!/"); //$NON-NLS-1$ if (p == -1) { p = urlStr.length(); } URL jarFileURL = new URL(urlStr.substring(4, p)); if (!unpack) { String ext = ShadingUtil.getExtension(jarFileURL.getFile()); if (ext == null) { ext = "jar"; //$NON-NLS-1$ } File shadowFile = new File(shadowFolder, uid + '.' + ext); File sourceFile = IoUtil.url2file(jarFileURL); InputStream in; if (sourceFile != null) { in = new BufferedInputStream( new FileInputStream(sourceFile)); } else { in = jarFileURL.openStream(); } try { OutputStream out = new FileOutputStream(shadowFile, false); try { IoUtil.copyStream(in, out, 1024); } finally { out.close(); } } finally { in.close(); } return add(uid, source, shadowFile, lastModified); } URLConnection cnn = null; try { File sourceFile = IoUtil.url2file(jarFileURL); ZipFile zipFile; if (sourceFile != null) { zipFile = new ZipFile(sourceFile); } else { cnn = source.openConnection(); cnn.setUseCaches(false); zipFile = ((JarURLConnection) cnn).getJarFile(); } File rootFolder = new File(shadowFolder, uid); try { ShadingUtil.unpack(zipFile, rootFolder); } finally { zipFile.close(); } return add(uid, source, rootFolder, lastModified); } finally { if (cnn != null) { cnn.getInputStream().close(); } } } } catch (IOException ioe) { log.error("failed shading URL connection " + source, ioe); //$NON-NLS-1$ return source; } String fileName = source.getFile(); if (fileName == null) { log.warn("can't get file name from resource " + source //$NON-NLS-1$ + ", shading failed"); //$NON-NLS-1$ return source; } String ext = ShadingUtil.getExtension(fileName); if (ext == null) { log.warn("can't get file name extension for resource " + source //$NON-NLS-1$ + ", shading failed"); //$NON-NLS-1$ return source; } if (unpack && ("jar".equalsIgnoreCase(ext) //$NON-NLS-1$ || "zip".equalsIgnoreCase(ext))) { //$NON-NLS-1$ try { InputStream strm = source.openStream(); File rootFolder = new File(shadowFolder, uid); try { ShadingUtil.unpack(strm, rootFolder); } finally { strm.close(); } return add(uid, source, rootFolder, lastModified); } catch (IOException ioe) { log.error("failed shading packed resource " + source, ioe); //$NON-NLS-1$ return source; } } try { File shadowFile = new File(shadowFolder, uid + '.' + ext); InputStream in = source.openStream(); try { OutputStream out = new FileOutputStream(shadowFile, false); try { IoUtil.copyStream(in, out, 1024); } finally { out.close(); } } finally { in.close(); } return add(uid, source, shadowFile, lastModified); } catch (IOException ioe) { log.error("failed shading resource file " + source, ioe); //$NON-NLS-1$ return source; } } private URL deepCheck(final URL source, final String uid) throws Exception { String url = metaData.getProperty("source:" + uid, null); //$NON-NLS-1$ if (url == null) { if (log.isDebugEnabled()) { log.debug("URL not found in meta-data, UID=" + uid); //$NON-NLS-1$ } remove(uid); return null; } if (log.isDebugEnabled()) { log.debug("URL found in meta-data, UID=" //$NON-NLS-1$ + uid + ", source=" + source //$NON-NLS-1$ + ", storedURL=" + url); //$NON-NLS-1$ } URL storedSource = ShadingUtil.buildURL(shadowFolderUrl, url); if (!storedSource.equals(source)) { if (log.isDebugEnabled()) { log.debug("inconsistent URL found in meta-data, UID=" //$NON-NLS-1$ + uid + ", source=" + source //$NON-NLS-1$ + ", storedSource=" + storedSource); //$NON-NLS-1$ } remove(uid); return null; } String modified = metaData.getProperty("modified:" + uid, null); //$NON-NLS-1$ if (modified == null) { if (log.isDebugEnabled()) { log.debug("modification info not found in meta-data, UID=" //$NON-NLS-1$ + uid); } remove(uid); return null; } if (!ShadingUtil.getLastModified(source).equals(dtf.parse(modified))) { if (log.isDebugEnabled()) { log.debug("source modification detected, UID=" + uid //$NON-NLS-1$ + ", source=" + source); //$NON-NLS-1$ } remove(uid); return null; } String fileStr = metaData.getProperty("file:" + uid, null); //$NON-NLS-1$ if (fileStr == null) { if (log.isDebugEnabled()) { log.debug("file info not found in meta-data, UID=" + uid); //$NON-NLS-1$ } remove(uid); return null; } File file = new File(shadowFolder, fileStr); if (!file.exists()) { if (log.isDebugEnabled()) { log.debug("shadow file not found, UID=" + uid //$NON-NLS-1$ + ", source=" + source //$NON-NLS-1$ + ", file=" + file); //$NON-NLS-1$ } remove(uid); return null; } File sourceFile = IoUtil.url2file(source); if ((sourceFile != null) && sourceFile.isDirectory()) { IoUtil.synchronizeFolders(sourceFile, file, fileFilter); if (log.isDebugEnabled()) { log.debug("folders synchronized, UID=" + uid //$NON-NLS-1$ + ", srcFile=" + sourceFile //$NON-NLS-1$ + ", destFile=" + file); //$NON-NLS-1$ } } else { if (log.isDebugEnabled()) { log.debug("source " + source + " (file is " + sourceFile //$NON-NLS-1$ //$NON-NLS-2$ + ") is not local folder, " //$NON-NLS-1$ + "skipping synchronization, UID=" + uid); //$NON-NLS-1$ } } return IoUtil.file2url(file); } static class ShadowFileFilter implements FileFilter { /** * @see java.io.FileFilter#accept(java.io.File) */ public boolean accept(final File file) { return !META_FILE_NAME.equals(file.getName()); } } } final class RegexpFileFilter implements FileFilter { private final Pattern[] patterns; RegexpFileFilter(final String str) { StringTokenizer st = new StringTokenizer(str, "|", false); //$NON-NLS-1$ patterns = new Pattern[st.countTokens()]; for (int i = 0; i < patterns.length; i++) { String pattern = st.nextToken(); if ((pattern == null) || (pattern.trim().length() == 0)) { continue; } patterns[i] = Pattern.compile(pattern.trim()); } } /** * @see java.io.FileFilter#accept(java.io.File) */ public boolean accept(final File file) { for (int i = 0; i < patterns.length; i++) { if (patterns[i] == null) { continue; } if (patterns[i].matcher(file.getName()).matches()) { return true; } } return false; } } final class CombinedFileFilter implements FileFilter { private final FileFilter includesFilter; private final FileFilter excludesFilter; CombinedFileFilter(final FileFilter includes, final FileFilter excludes) { includesFilter = includes; excludesFilter = excludes; } /** * @see java.io.FileFilter#accept(java.io.File) */ public boolean accept(final File file) { if (includesFilter != null) { if (includesFilter.accept(file)) { return true; } } if ((excludesFilter != null) && excludesFilter.accept(file)) { return false; } return true; } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/StandardPluginClassLoader.java0000644000175000017500000012310210605726466031073 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.CodeSource; import java.security.PrivilegedAction; import java.security.ProtectionDomain; import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.PathResolver; import org.java.plugin.Plugin; import org.java.plugin.PluginClassLoader; import org.java.plugin.PluginManager; import org.java.plugin.registry.Library; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.util.IoUtil; /** * Standard implementation of plug-in class loader. * * @version $Id: StandardPluginClassLoader.java,v 1.8 2007/04/07 12:39:50 ddimon Exp $ */ public class StandardPluginClassLoader extends PluginClassLoader { static Log log = LogFactory.getLog(StandardPluginClassLoader.class); private static File libCacheFolder; private static boolean libCacheFolderInitialized = false; private static URL getClassBaseUrl(final Class cls) { ProtectionDomain pd = cls.getProtectionDomain(); if (pd != null) { CodeSource cs = pd.getCodeSource(); if (cs != null) { return cs.getLocation(); } } return null; } private static URL[] getUrls(final PluginManager manager, final PluginDescriptor descr) { List result = new LinkedList(); for (Library lib : descr.getLibraries()) { if (!lib.isCodeLibrary()) { continue; } result.add(manager.getPathResolver() .resolvePath(lib, lib.getPath())); } if (log.isDebugEnabled()) { final StringBuilder buf = new StringBuilder(); buf.append("Code URL's populated for plug-in " //$NON-NLS-1$ + descr + ":\r\n"); //$NON-NLS-1$ for (Object element : result) { buf.append("\t"); //$NON-NLS-1$ buf.append(element); buf.append("\r\n"); //$NON-NLS-1$ } log.debug(buf.toString()); } return result.toArray(new URL[result.size()]); } private static URL[] getUrls(final PluginManager manager, final PluginDescriptor descr, final URL[] existingUrls) { final List urls = Arrays.asList(existingUrls); final List result = new LinkedList(); for (Library lib : descr.getLibraries()) { if (!lib.isCodeLibrary()) { continue; } URL url = manager.getPathResolver().resolvePath(lib, lib.getPath()); if (!urls.contains(url)) { result.add(url); } } return result.toArray(new URL[result.size()]); } private static File getLibCacheFolder() { if (libCacheFolder != null) { return libCacheFolderInitialized ? libCacheFolder : null; } synchronized (StandardPluginClassLoader.class) { libCacheFolder = new File(System.getProperty("java.io.tmpdir"), //$NON-NLS-1$ System.currentTimeMillis() + ".jpf-lib-cache"); //$NON-NLS-1$ log.debug("libraries cache folder is " + libCacheFolder); //$NON-NLS-1$ File lockFile = new File(libCacheFolder, "lock"); //$NON-NLS-1$ if (lockFile.exists()) { log.error("can't initialize libraries cache folder " //$NON-NLS-1$ + libCacheFolder + " as lock file indicates that it" //$NON-NLS-1$ + " is owned by another JPF instance"); //$NON-NLS-1$ return null; } if (libCacheFolder.exists()) { // clean up folder IoUtil.emptyFolder(libCacheFolder); } else { libCacheFolder.mkdirs(); } try { if (!lockFile.createNewFile()) { log.error("can\'t create lock file in JPF libraries cache" //$NON-NLS-1$ + " folder " + libCacheFolder); //$NON-NLS-1$ return null; } } catch (IOException ioe) { log.error("can\'t create lock file in JPF libraries cache" //$NON-NLS-1$ + " folder " + libCacheFolder, ioe); //$NON-NLS-1$ return null; } lockFile.deleteOnExit(); libCacheFolder.deleteOnExit(); libCacheFolderInitialized = true; } return libCacheFolder; } private PluginDescriptor[] publicImports; private PluginDescriptor[] privateImports; private PluginDescriptor[] reverseLookups; private PluginResourceLoader resourceLoader; private Map resourceFilters; private Map libraryCache; private boolean probeParentLoaderLast; private boolean stickySynchronizing; private boolean localClassLoadingOptimization = true; private boolean foreignClassLoadingOptimization = true; private final Set localPackages = new HashSet(); private final Map pluginPackages = new HashMap(); /** * Creates class instance configured to load classes and resources for given * plug-in. * * @param aManager * plug-in manager instance * @param descr * plug-in descriptor * @param parent * parent class loader, usually this is JPF "host" application * class loader */ public StandardPluginClassLoader(final PluginManager aManager, final PluginDescriptor descr, final ClassLoader parent) { super(aManager, descr, getUrls(aManager, descr), parent); collectImports(); resourceLoader = PluginResourceLoader.get(aManager, descr); collectFilters(); libraryCache = new HashMap(); } protected void collectImports() { // collect imported plug-ins (exclude duplicates) final Map publicImportsMap = new HashMap(); final Map privateImportsMap = new HashMap(); PluginRegistry registry = getPluginDescriptor().getRegistry(); for (PluginPrerequisite pre : getPluginDescriptor().getPrerequisites()) { if (!pre.matches()) { continue; } PluginDescriptor preDescr = registry.getPluginDescriptor(pre .getPluginId()); if (pre.isExported()) { publicImportsMap.put(preDescr.getId(), preDescr); } else { privateImportsMap.put(preDescr.getId(), preDescr); } } publicImports = publicImportsMap.values().toArray( new PluginDescriptor[publicImportsMap.size()]); privateImports = privateImportsMap.values().toArray( new PluginDescriptor[privateImportsMap.size()]); // collect reverse look up plug-ins (exclude duplicates) final Map reverseLookupsMap = new HashMap(); for (PluginDescriptor descr : registry.getPluginDescriptors()) { if (descr.equals(getPluginDescriptor()) || publicImportsMap.containsKey(descr.getId()) || privateImportsMap.containsKey(descr.getId())) { continue; } for (PluginPrerequisite pre : descr.getPrerequisites()) { if (!pre.getPluginId().equals(getPluginDescriptor().getId()) || !pre.isReverseLookup()) { continue; } if (!pre.matches()) { continue; } reverseLookupsMap.put(descr.getId(), descr); break; } } reverseLookups = reverseLookupsMap.values().toArray( new PluginDescriptor[reverseLookupsMap.size()]); } protected void collectFilters() { if (resourceFilters == null) { resourceFilters = new HashMap(); } else { resourceFilters.clear(); } for (Library lib : getPluginDescriptor().getLibraries()) { resourceFilters.put( getPluginManager().getPathResolver().resolvePath(lib, lib.getPath()).toExternalForm(), new ResourceFilter(lib)); } } /** * @see org.java.plugin.PluginClassLoader#pluginsSetChanged() */ @Override protected void pluginsSetChanged() { URL[] newUrls = getUrls(getPluginManager(), getPluginDescriptor(), getURLs()); for (URL element : newUrls) { addURL(element); } if (log.isDebugEnabled()) { StringBuilder buf = new StringBuilder(); buf.append("New code URL's populated for plug-in " //$NON-NLS-1$ + getPluginDescriptor() + ":\r\n"); //$NON-NLS-1$ for (URL element : newUrls) { buf.append("\t"); //$NON-NLS-1$ buf.append(element); buf.append("\r\n"); //$NON-NLS-1$ } log.debug(buf.toString()); } collectImports(); // repopulate resource URLs resourceLoader = PluginResourceLoader.get(getPluginManager(), getPluginDescriptor()); collectFilters(); Set> entrySet = libraryCache.entrySet(); for (Iterator> it = entrySet.iterator(); it.hasNext();) { if (it.next().getValue() == null) { it.remove(); } } synchronized (localPackages) { localPackages.clear(); } synchronized (pluginPackages) { pluginPackages.clear(); } } /** * @see org.java.plugin.PluginClassLoader#dispose() */ @Override protected void dispose() { for (File file : libraryCache.values()) { file.delete(); } libraryCache.clear(); resourceFilters.clear(); privateImports = null; publicImports = null; resourceLoader = null; synchronized (localPackages) { localPackages.clear(); } synchronized (pluginPackages) { pluginPackages.clear(); } } protected void setProbeParentLoaderLast(final boolean value) { probeParentLoaderLast = value; } protected void setStickySynchronizing(final boolean value) { stickySynchronizing = value; } protected void setLocalClassLoadingOptimization(final boolean value) { localClassLoadingOptimization = value; } protected void setForeignClassLoadingOptimization(final boolean value) { foreignClassLoadingOptimization = value; } /** * @see java.lang.ClassLoader#loadClass(java.lang.String, boolean) */ @Override protected Class loadClass(final String name, final boolean resolve) throws ClassNotFoundException { Class result; boolean tryLocal = true; if (isLocalClass(name)) { if (log.isDebugEnabled()) { log.debug("loadClass: trying local class guess, name=" //$NON-NLS-1$ + name + ", this=" + this); //$NON-NLS-1$ } result = loadLocalClass(name, resolve, this); if (result != null) { if (log.isDebugEnabled()) { log.debug("loadClass: local class guess succeeds, name=" //$NON-NLS-1$ + name + ", this=" + this); //$NON-NLS-1$ } checkClassVisibility(result, this); return result; } tryLocal = false; } if (probeParentLoaderLast) { try { result = loadPluginClass(name, resolve, tryLocal, this, null); } catch (ClassNotFoundException cnfe) { result = getParent().loadClass(name); } if (result == null) { result = getParent().loadClass(name); } } else { try { result = getParent().loadClass(name); } catch (ClassNotFoundException cnfe) { result = loadPluginClass(name, resolve, tryLocal, this, null); } } if (result != null) { return result; } throw new ClassNotFoundException(name); } private Class loadLocalClass(final String name, final boolean resolve, final StandardPluginClassLoader requestor) { boolean debugEnabled = log.isDebugEnabled(); synchronized (stickySynchronizing ? requestor : this) { Class result = findLoadedClass(name); if (result != null) { if (debugEnabled) { log.debug("loadLocalClass: found loaded class, class=" //$NON-NLS-1$ + result + ", this=" //$NON-NLS-1$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } return result; // found already loaded class in this plug-in } try { result = findClass(name); } catch (LinkageError le) { if (debugEnabled) { log.debug("loadLocalClass: class loading failed," //$NON-NLS-1$ + " name=" + name + ", this=" //$NON-NLS-1$ //$NON-NLS-2$ + this + ", requestor=" + requestor, le); //$NON-NLS-1$ } throw le; } catch (ClassNotFoundException cnfe) { // ignore } if (result != null) { if (debugEnabled) { log.debug("loadLocalClass: found class, class=" //$NON-NLS-1$ + result + ", this=" //$NON-NLS-1$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } if (resolve) { resolveClass(result); } registerLocalPackage(result); return result; // found class in this plug-in } } return null; } private Class loadPluginClass(final String name, final boolean resolve, final boolean tryLocal, final StandardPluginClassLoader requestor, final Set seenPlugins) throws ClassNotFoundException { Set seen = seenPlugins; if ((seen != null) && seen.contains(getPluginDescriptor().getId())) { return null; } if (seen == null) { seen = new HashSet(); } seen.add(getPluginDescriptor().getId()); if ((this != requestor) && !getPluginManager().isPluginActivated(getPluginDescriptor()) && !getPluginManager() .isPluginActivating(getPluginDescriptor())) { String msg = "can't load class " + name + ", plug-in " //$NON-NLS-1$ //$NON-NLS-2$ + getPluginDescriptor() + " is not activated yet"; //$NON-NLS-1$ log.warn(msg); throw new ClassNotFoundException(msg); } Class result = null; boolean debugEnabled = log.isDebugEnabled(); PluginDescriptor descr = guessPlugin(name); if ((descr != null) && !seen.contains(descr.getId())) { if (debugEnabled) { log.debug("loadPluginClass: trying plug-in guess, name=" //$NON-NLS-1$ + name + ", this=" //$NON-NLS-1$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(descr)).loadPluginClass(name, resolve, true, requestor, seen); if (result != null) { if (debugEnabled) { log.debug("loadPluginClass: plug-in guess succeeds, name=" //$NON-NLS-1$ + name + ", this=" //$NON-NLS-1$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } return result; } } if (tryLocal) { result = loadLocalClass(name, resolve, requestor); if (result != null) { checkClassVisibility(result, requestor); return result; } } if (debugEnabled) { log.debug("loadPluginClass: local class not found, name=" //$NON-NLS-1$ + name + ", this=" //$NON-NLS-1$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } for (PluginDescriptor element : publicImports) { if (seen.contains(element.getId())) { continue; } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)) .loadPluginClass(name, resolve, true, requestor, seen); if (result != null) { break; // found class in publicly imported plug-in } } if ((this == requestor) && (result == null)) { for (PluginDescriptor element : privateImports) { if (seen.contains(element.getId())) { continue; } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)) .loadPluginClass(name, resolve, true, requestor, seen); if (result != null) { break; // found class in privately imported plug-in } } } if (result == null) { for (PluginDescriptor element : reverseLookups) { if (seen.contains(element.getId())) { continue; } if (!getPluginManager().isPluginActivated(element) && !getPluginManager().isPluginActivating(element)) { continue; } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)) .loadPluginClass(name, resolve, true, requestor, seen); if (result != null) { break; // found class in plug-in that marks itself as // allowed reverse look up } } } registerPluginPackage(result); return result; } private boolean isLocalClass(final String className) { if (!localClassLoadingOptimization) { return false; } String pkgName = getPackageName(className); if (pkgName == null) { return false; } return localPackages.contains(pkgName); } private void registerLocalPackage(final Class cls) { if (!localClassLoadingOptimization) { return; } String pkgName = getPackageName(cls.getName()); if ((pkgName == null) || localPackages.contains(pkgName)) { return; } synchronized (localPackages) { localPackages.add(pkgName); } if (log.isDebugEnabled()) { log.debug("registered local package: name=" + pkgName); //$NON-NLS-1$ } } private PluginDescriptor guessPlugin(final String className) { if (!foreignClassLoadingOptimization) { return null; } String pkgName = getPackageName(className); if (pkgName == null) { return null; } return pluginPackages.get(pkgName); } private void registerPluginPackage(final Class cls) { if (!foreignClassLoadingOptimization) { return; } Plugin plugin = getPluginManager().getPluginFor(cls); if (plugin == null) { return; } String pkgName = getPackageName(cls.getName()); if ((pkgName == null) || pluginPackages.containsKey(pkgName)) { return; } synchronized (pluginPackages) { pluginPackages.put(pkgName, plugin.getDescriptor()); } if (log.isDebugEnabled()) { log.debug("registered plug-in package: name=" + pkgName //$NON-NLS-1$ + ", plugin=" + plugin.getDescriptor()); //$NON-NLS-1$ } } private String getPackageName(final String className) { int p = className.lastIndexOf('.'); if (p == -1) { return null; } return className.substring(0, p); } protected void checkClassVisibility(final Class cls, final StandardPluginClassLoader requestor) throws ClassNotFoundException { if (this == requestor) { return; } URL lib = getClassBaseUrl(cls); if (lib == null) { return; // cls is a system class } ClassLoader loader = cls.getClassLoader(); if (!(loader instanceof StandardPluginClassLoader)) { return; } if (loader != this) { ((StandardPluginClassLoader) loader).checkClassVisibility(cls, requestor); } else { ResourceFilter filter = resourceFilters.get(lib.toExternalForm()); if (filter == null) { log.warn("class not visible, no class filter found, lib=" + lib //$NON-NLS-1$ + ", class=" + cls + ", this=" + this //$NON-NLS-1$ //$NON-NLS-2$ + ", requestor=" + requestor); //$NON-NLS-1$ throw new ClassNotFoundException("class " //$NON-NLS-1$ + cls.getName() + " is not visible for plug-in " //$NON-NLS-1$ + requestor.getPluginDescriptor().getId() + ", no filter found for library " + lib); //$NON-NLS-1$ } if (!filter.isClassVisible(cls.getName())) { log.warn("class not visible, lib=" + lib //$NON-NLS-1$ + ", class=" + cls + ", this=" + this //$NON-NLS-1$ //$NON-NLS-2$ + ", requestor=" + requestor); //$NON-NLS-1$ throw new ClassNotFoundException("class " //$NON-NLS-1$ + cls.getName() + " is not visible for plug-in " //$NON-NLS-1$ + requestor.getPluginDescriptor().getId()); } } } /** * @see java.lang.ClassLoader#findLibrary(java.lang.String) */ @Override protected String findLibrary(final String name) { if ((name == null) || "".equals(name.trim())) { //$NON-NLS-1$ return null; } if (log.isDebugEnabled()) { log.debug("findLibrary(String): name=" + name //$NON-NLS-1$ + ", this=" + this); //$NON-NLS-1$ } String libname = System.mapLibraryName(name); String result = null; PathResolver pathResolver = getPluginManager().getPathResolver(); for (Library lib : getPluginDescriptor().getLibraries()) { if (lib.isCodeLibrary()) continue; URL libUrl = pathResolver.resolvePath(lib, lib.getPath() + libname); if (log.isDebugEnabled()) { log.debug("findLibrary(String): trying URL " + libUrl); //$NON-NLS-1$ } File libFile = IoUtil.url2file(libUrl); if (libFile != null) { if (log.isDebugEnabled()) { log.debug("findLibrary(String): URL " + libUrl //$NON-NLS-1$ + " resolved as local file " + libFile); //$NON-NLS-1$ } if (libFile.isFile()) { result = libFile.getAbsolutePath(); break; } continue; } // we have some kind of non-local URL // try to copy it to local temporary file String libraryCacheKey = libUrl.toExternalForm(); libFile = libraryCache.get(libraryCacheKey); if (libFile != null) { if (libFile.isFile()) { result = libFile.getAbsolutePath(); break; } libraryCache.remove(libraryCacheKey); } if (libraryCache.containsKey(libraryCacheKey)) { // already tried to cache this library break; } libFile = cacheLibrary(libUrl, libname); if (libFile != null) { result = libFile.getAbsolutePath(); break; } } if (log.isDebugEnabled()) { log.debug("findLibrary(String): name=" + name //$NON-NLS-1$ + ", libname=" + libname //$NON-NLS-1$ + ", result=" + result //$NON-NLS-1$ + ", this=" + this); //$NON-NLS-1$ } return result; } protected synchronized File cacheLibrary(final URL libUrl, final String libname) { String libraryCacheKey = libUrl.toExternalForm(); File result = libraryCache.get(libraryCacheKey); if (result != null) { return result; } try { File cacheFolder = getLibCacheFolder(); if (cacheFolder == null) { throw new IOException("can't initialize libraries cache folder"); //$NON-NLS-1$ } File libCachePluginFolder = new File(cacheFolder, getPluginDescriptor().getUniqueId()); if (!libCachePluginFolder.exists() && !libCachePluginFolder.mkdirs()) { throw new IOException("can't create cache folder " //$NON-NLS-1$ + libCachePluginFolder); } result = new File(libCachePluginFolder, libname); InputStream in = IoUtil.getResourceInputStream(libUrl); try { OutputStream out = new BufferedOutputStream( new FileOutputStream(result)); try { IoUtil.copyStream(in, out, 512); } finally { out.close(); } } finally { in.close(); } if (log.isDebugEnabled()) { log.debug("library " + libname //$NON-NLS-1$ + " successfully cached from URL " + libUrl //$NON-NLS-1$ + " and saved to local file " + result); //$NON-NLS-1$ } } catch (IOException ioe) { log.error("can't cache library " + libname //$NON-NLS-1$ + " from URL " + libUrl, ioe); //$NON-NLS-1$ result = null; } libraryCache.put(libraryCacheKey, result); return result; } /** * @see java.lang.ClassLoader#findResource(java.lang.String) */ @Override public URL findResource(final String name) { return findResource(name, this, null); } /** * @see java.lang.ClassLoader#findResources(java.lang.String) */ @Override public Enumeration findResources(final String name) throws IOException { final List result = new LinkedList(); findResources(result, name, this, null); return Collections.enumeration(result); } protected URL findResource(final String name, final StandardPluginClassLoader requestor, final Set seenPlugins) { Set seen = seenPlugins; if ((seen != null) && seen.contains(getPluginDescriptor().getId())) { return null; } URL result = super.findResource(name); if (result != null) { // found resource in this plug-in class path if (log.isDebugEnabled()) { log .debug("findResource(...): resource found in classpath, name=" //$NON-NLS-1$ + name + " URL=" + result + ", this=" //$NON-NLS-1$ //$NON-NLS-2$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } if (isResourceVisible(name, result, requestor)) { return result; } return null; } if (resourceLoader != null) { result = resourceLoader.findResource(name); if (result != null) { // found resource in this plug-in resource // libraries if (log.isDebugEnabled()) { log.debug( "findResource(...): resource found in libraries, name=" //$NON-NLS-1$ + name + ", URL=" + result + ", this=" //$NON-NLS-1$ //$NON-NLS-2$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } if (isResourceVisible(name, result, requestor)) { return result; } return null; } } if (seen == null) { seen = new HashSet(); } if (log.isDebugEnabled()) { log.debug("findResource(...): resource not found, name=" //$NON-NLS-1$ + name + ", this=" //$NON-NLS-1$ + this + ", requestor=" + requestor); //$NON-NLS-1$ } seen.add(getPluginDescriptor().getId()); for (PluginDescriptor element : publicImports) { if (seen.contains(element.getId())) { continue; } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)).findResource(name, requestor, seen); if (result != null) { break; // found resource in publicly imported plug-in } } if ((this == requestor) && (result == null)) { for (PluginDescriptor element : privateImports) { if (seen.contains(element.getId())) { continue; } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)).findResource(name, requestor, seen); if (result != null) { break; // found resource in privately imported plug-in } } } if (result == null) { for (PluginDescriptor element : reverseLookups) { if (seen.contains(element.getId())) { continue; } result = ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)).findResource(name, requestor, seen); if (result != null) { break; // found resource in plug-in that marks itself as // allowed reverse look up } } } return result; } protected void findResources(final List result, final String name, final StandardPluginClassLoader requestor, final Set seenPlugins) throws IOException { Set seen = seenPlugins; if ((seen != null) && seen.contains(getPluginDescriptor().getId())) { return; } URL url; for (Enumeration enm = super.findResources(name); enm.hasMoreElements();) { url = enm.nextElement(); if (isResourceVisible(name, url, requestor)) { result.add(url); } } if (resourceLoader != null) { for (Enumeration enm = resourceLoader.findResources(name); enm.hasMoreElements();) { url = enm.nextElement(); if (isResourceVisible(name, url, requestor)) { result.add(url); } } } if (seen == null) { seen = new HashSet(); } seen.add(getPluginDescriptor().getId()); for (PluginDescriptor element : publicImports) { if (seen.contains(element.getId())) { continue; } ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)).findResources(result, name, requestor, seen); } if (this == requestor) { for (PluginDescriptor element : privateImports) { if (seen.contains(element.getId())) { continue; } ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)).findResources(result, name, requestor, seen); } } for (PluginDescriptor element : reverseLookups) { if (seen.contains(element.getId())) { continue; } ((StandardPluginClassLoader) getPluginManager() .getPluginClassLoader(element)).findResources(result, name, requestor, seen); } } protected boolean isResourceVisible(final String name, final URL url, final StandardPluginClassLoader requestor) { if (this == requestor) { return true; } URL lib; try { String file = url.getFile(); lib = new URL(url.getProtocol(), url.getHost(), file.substring(0, file.length() - name.length())); } catch (MalformedURLException mue) { log.error("can't get resource library URL", mue); //$NON-NLS-1$ return false; } ResourceFilter filter = resourceFilters.get(lib.toExternalForm()); if (filter == null) { log.warn("no resource filter found for library " //$NON-NLS-1$ + lib + ", name=" + name //$NON-NLS-1$ + ", URL=" + url + ", this=" + this //$NON-NLS-1$ //$NON-NLS-2$ + ", requestor=" + requestor); //$NON-NLS-1$ return false; } if (!filter.isResourceVisible(name)) { log.warn("resource not visible, name=" + name //$NON-NLS-1$ + ", URL=" + url + ", this=" + this //$NON-NLS-1$ //$NON-NLS-2$ + ", requestor=" + requestor); //$NON-NLS-1$ return false; } return true; } protected static final class ResourceFilter { private boolean isPublic; private final Set entries; protected ResourceFilter(final Library lib) { entries = new HashSet(); for (String exportPrefix : lib.getExports()) { if ("*".equals(exportPrefix)) { //$NON-NLS-1$ isPublic = true; entries.clear(); break; } if (!lib.isCodeLibrary()) { exportPrefix = exportPrefix.replace('\\', '.').replace('/', '.'); if (exportPrefix.startsWith(".")) { //$NON-NLS-1$ exportPrefix = exportPrefix.substring(1); } } entries.add(exportPrefix); } } protected boolean isClassVisible(final String className) { if (isPublic) { return true; } if (entries.isEmpty()) { return false; } if (entries.contains(className)) { return true; } int p = className.lastIndexOf('.'); if (p == -1) { return false; } return entries.contains(className.substring(0, p) + ".*"); //$NON-NLS-1$ } protected boolean isResourceVisible(final String resPath) { // quick check if (isPublic) { return true; } if (entries.isEmpty()) { return false; } // translate "path spec" -> "full class name" String str = resPath.replace('\\', '.').replace('/', '.'); if (str.startsWith(".")) { //$NON-NLS-1$ str = str.substring(1); } if (str.endsWith(".")) { //$NON-NLS-1$ str = str.substring(0, str.length() - 1); } return isClassVisible(str); } } static class PluginResourceLoader extends URLClassLoader { private static Log logger = LogFactory .getLog(PluginResourceLoader.class); static PluginResourceLoader get(final PluginManager manager, final PluginDescriptor descr) { final List urls = new LinkedList(); for (Library lib : descr.getLibraries()) { if (lib.isCodeLibrary()) continue; urls.add(manager.getPathResolver().resolvePath(lib, lib.getPath())); } if (logger.isDebugEnabled()) { StringBuilder buf = new StringBuilder(); buf.append("Resource URL's populated for plug-in " + descr //$NON-NLS-1$ + ":\r\n"); //$NON-NLS-1$ for (URL url : urls) { buf.append("\t"); //$NON-NLS-1$ buf.append(url); buf.append("\r\n"); //$NON-NLS-1$ } logger.trace(buf.toString()); } if (urls.isEmpty()) { return null; } return AccessController . doPrivileged(new PrivilegedAction() { public PluginResourceLoader run() { return new PluginResourceLoader(urls .toArray(new URL[urls.size()])); } }); } /** * Creates loader instance configured to load resources only from given * URLs. * * @param urls * array of resource URLs */ PluginResourceLoader(final URL[] urls) { super(urls); } /** * @see java.lang.ClassLoader#findClass(java.lang.String) */ @Override protected Class findClass(final String name) throws ClassNotFoundException { throw new ClassNotFoundException(name); } /** * @see java.lang.ClassLoader#loadClass(java.lang.String, boolean) */ @Override protected Class loadClass(final String name, final boolean resolve) throws ClassNotFoundException { throw new ClassNotFoundException(name); } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/StandardPluginManager.java0000644000175000017500000007656310605726576030275 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.JpfException; import org.java.plugin.PathResolver; import org.java.plugin.Plugin; import org.java.plugin.PluginClassLoader; import org.java.plugin.PluginLifecycleException; import org.java.plugin.PluginManager; import org.java.plugin.registry.Identity; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.PluginRegistry.RegistryChangeData; import org.java.plugin.registry.PluginRegistry.RegistryChangeListener; /** * Standard implementation of plug-in manager. * * @version $Id: StandardPluginManager.java,v 1.8 2007/04/07 12:41:01 ddimon Exp $ */ public final class StandardPluginManager extends PluginManager { Log log = LogFactory.getLog(getClass()); private final PathResolver pathResolver; private final PluginRegistry registry; private final PluginLifecycleHandler lifecycleHandler; private final Map activePlugins = new HashMap(); private final Set activatingPlugins = new HashSet(); private final Set badPlugins = new HashSet(); private final List activationLog = new LinkedList(); private final Map classLoaders = new HashMap(); private final Set disabledPlugins = new HashSet(); private final List listeners = Collections.synchronizedList(new LinkedList()); private RegistryChangeListener registryChangeListener; private Map notRegisteredPluginLocations = new HashMap(); /** * Creates instance of plug-in manager for given registry, path resolver and * life cycle handler. * * @param aRegistry * some implementation of plug-in registry interface * @param aPathResolver * some implementation of path resolver interface * @param aLifecycleHandler * an implementation of plug-in life cycle handler * * @see StandardObjectFactory */ protected StandardPluginManager(final PluginRegistry aRegistry, final PathResolver aPathResolver, final PluginLifecycleHandler aLifecycleHandler) { registry = aRegistry; pathResolver = aPathResolver; lifecycleHandler = aLifecycleHandler; lifecycleHandler.init(this); registryChangeListener = new RegistryChangeListener() { public void registryChanged(final RegistryChangeData data) { registryChangeHandler(data); } }; registry.registerListener(registryChangeListener); } /** * @see org.java.plugin.PluginManager#getRegistry() */ @Override public PluginRegistry getRegistry() { return registry; } /** * @see org.java.plugin.PluginManager#getPathResolver() */ @Override public PathResolver getPathResolver() { return pathResolver; } /** * Method to handle plug-in registry change events. * * @param data * registry change data holder */ synchronized void registryChangeHandler(final RegistryChangeData data) { badPlugins.clear(); for (String id : data.removedPlugins()) { deactivatePlugin(id); pathResolver.unregisterContext(id); } URL location; for (PluginDescriptor idt : registry.getPluginDescriptors()) { location = notRegisteredPluginLocations.remove( idt.getLocation().toExternalForm()); if (location != null) { pathResolver.registerContext(idt, location); } } for (PluginFragment idt : registry.getPluginFragments()) { location = notRegisteredPluginLocations.remove( idt.getLocation().toExternalForm()); if (location != null) { pathResolver.registerContext(idt, location); } } for (String id : data.modifiedPlugins()) { if (activePlugins.containsKey(id)) { deactivatePlugin(id); try { activatePlugin(id); } catch (Exception e) { log.error("failed activating modified plug-in " + id, e); //$NON-NLS-1$ } } else { PluginClassLoader clsLoader = classLoaders.get(id); if (clsLoader != null) { notifyClassLoader(clsLoader); } } } } /** * Registers plug-ins and their locations with this plug-in manager. You * should use this method to register new plug-ins to make them available * for activation with this manager instance (compare this to * {@link PluginRegistry#register(URL[])} method that just makes plug-in's * meta-data available for reading and doesn't "know" where are things * actually located). * * @param locations * plug-in locations data * @return map where keys are manifest URL's and values are registered * plug-ins or plug-in fragments, URL's for unprocessed manifests * are not included * @throws JpfException * if given plug-ins can't be registered or published (optional * behavior) */ @Override public Map publishPlugins(final PluginLocation[] locations) throws JpfException { LinkedList manifests = new LinkedList(); for (PluginLocation location : locations) { URL manifest = location.getManifestLocation(); manifests.add(manifest); notRegisteredPluginLocations.put( manifest.toExternalForm(), location.getContextLocation()); } return registry.register(manifests.toArray(new URL[manifests.size()])); } /** * Looks for plug-in with given ID and activates it if it is not activated * yet. Note that this method will never return null. * * @param id * plug-in ID * @return found plug-in * @throws PluginLifecycleException * if plug-in can't be found or activated */ @Override public Plugin getPlugin(final String id) throws PluginLifecycleException { Plugin result = activePlugins.get(id); if (result != null) { return result; } if (badPlugins.contains(id)) { throw new IllegalArgumentException("plug-in " + id //$NON-NLS-1$ + " disabled internally as it wasn't properly initialized"); //$NON-NLS-1$ } if (disabledPlugins.contains(id)) { throw new IllegalArgumentException("plug-in " + id //$NON-NLS-1$ + " disabled externally"); //$NON-NLS-1$ } PluginDescriptor descr = registry.getPluginDescriptor(id); if (descr == null) { throw new IllegalArgumentException("unknown plug-in ID - " + id); //$NON-NLS-1$ } return activatePlugin(descr); } /** * Activates plug-in with given ID if it is not activated yet. * * @param id * plug-in ID * @throws PluginLifecycleException * if plug-in can't be found or activated */ @Override public void activatePlugin(final String id) throws PluginLifecycleException { if (activePlugins.containsKey(id)) { return; } if (badPlugins.contains(id)) { throw new IllegalArgumentException("plug-in " + id //$NON-NLS-1$ + " disabled internally as it wasn't properly initialized"); //$NON-NLS-1$ } if (disabledPlugins.contains(id)) { throw new IllegalArgumentException("plug-in " + id //$NON-NLS-1$ + " disabled externally"); //$NON-NLS-1$ } PluginDescriptor descr = registry.getPluginDescriptor(id); if (descr == null) { throw new IllegalArgumentException("unknown plug-in ID - " + id); //$NON-NLS-1$ } activatePlugin(descr); } /** * Looks for plug-in, given object belongs to. * * @param obj * any object that maybe belongs to some plug-in * @return plug-in or null if given object doesn't belong to * any plug-in (possibly it is part of "host" application) and thus * doesn't managed by the Framework directly or indirectly */ @Override public Plugin getPluginFor(final Object obj) { if (obj == null) { return null; } ClassLoader clsLoader; if (obj instanceof Class) { clsLoader = ((Class) obj).getClassLoader(); } else if (obj instanceof ClassLoader) { clsLoader = (ClassLoader) obj; } else { clsLoader = obj.getClass().getClassLoader(); } if (!(clsLoader instanceof PluginClassLoader)) { return null; } PluginDescriptor descr = ((PluginClassLoader) clsLoader) .getPluginDescriptor(); Plugin result = activePlugins.get(descr.getId()); if (result != null) { return result; } throw new IllegalStateException("can't get plug-in " + descr); //$NON-NLS-1$ } /** * @param descr * plug-in descriptor * @return true if plug-in with given descriptor is activated */ @Override public boolean isPluginActivated(final PluginDescriptor descr) { return activePlugins.containsKey(descr.getId()); } /** * @param descr * plug-in descriptor * @return true if plug-in disabled as it's activation fails */ @Override public boolean isBadPlugin(final PluginDescriptor descr) { return badPlugins.contains(descr.getId()); } /** * @param descr * plug-in descriptor * @return true if plug-in is currently activating */ @Override public boolean isPluginActivating(final PluginDescriptor descr) { return activatingPlugins.contains(descr.getId()); } /** * Returns instance of plug-in's class loader and not tries to activate * plug-in. Use this method if you need to get access to plug-in resources * and don't want to cause plug-in activation. * * @param descr * plug-in descriptor * @return class loader instance for plug-in with given descriptor */ @Override public PluginClassLoader getPluginClassLoader(final PluginDescriptor descr) { if (badPlugins.contains(descr.getId())) { throw new IllegalArgumentException("plug-in " + descr.getId() //$NON-NLS-1$ + " disabled internally as it wasn't properly initialized"); //$NON-NLS-1$ } if (disabledPlugins.contains(descr.getId())) { throw new IllegalArgumentException("plug-in " + descr.getId() //$NON-NLS-1$ + " disabled externally"); //$NON-NLS-1$ } PluginClassLoader result = classLoaders.get(descr.getId()); if (result != null) { return result; } synchronized (this) { result = classLoaders.get(descr.getId()); if (result != null) { return result; } result = lifecycleHandler.createPluginClassLoader(descr); classLoaders.put(descr.getId(), result); } return result; } /** * Shuts down the framework.
* Calling this method will deactivate all active plug-ins in order, reverse * to the order they was activated. It also releases all resources allocated * by this manager (class loaders, plug-in descriptors etc.). All disabled * plug-ins will be marked as "enabled", all registered event listeners will * be unregistered. */ @Override public synchronized void shutdown() { log.debug("shutting down..."); //$NON-NLS-1$ dump(); registry.unregisterListener(registryChangeListener); final List reversedLog = new ArrayList(activationLog); Collections.reverse(reversedLog); for (String id : reversedLog) { PluginDescriptor descr = registry.getPluginDescriptor(id); if (descr == null) { log.warn("can't find descriptor for plug-in " + id //$NON-NLS-1$ + " to deactivate plug-in", new Exception( //$NON-NLS-1$ "fake exception to view stack trace")); //$NON-NLS-1$ continue; } deactivatePlugin(descr); } dump(); classLoaders.clear(); disabledPlugins.clear(); listeners.clear(); lifecycleHandler.dispose(); log.info("shutdown done"); //$NON-NLS-1$ } private synchronized Plugin activatePlugin(final PluginDescriptor descr) throws PluginLifecycleException { Plugin result = activePlugins.get(descr.getId()); if (result != null) { return result; } if (badPlugins.contains(descr.getId())) { throw new IllegalArgumentException("plug-in " + descr.getId() //$NON-NLS-1$ + " disabled as it wasn't properly initialized"); //$NON-NLS-1$ } if (activatingPlugins.contains(descr.getId())) { throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginActivating", descr.getId()); //$NON-NLS-1$ } activatingPlugins.add(descr.getId()); try { try { checkPrerequisites(descr); String pluginClassName = descr.getPluginClassName(); if ((pluginClassName == null) || (pluginClassName.trim().length() == 0)) { result = new EmptyPlugin(); } else { result = lifecycleHandler.createPluginInstance(descr); } initPlugin(result, descr); lifecycleHandler.beforePluginStart(result); startPlugin(result); } catch (PluginLifecycleException ple) { badPlugins.add(descr.getId()); classLoaders.remove(descr.getId()); throw ple; } catch (Exception e) { badPlugins.add(descr.getId()); classLoaders.remove(descr.getId()); throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginStartFailed", descr.getUniqueId(), e); //$NON-NLS-1$ } activePlugins.put(descr.getId(), result); activationLog.add(descr.getId()); log.info("plug-in started - " + descr.getUniqueId() //$NON-NLS-1$ + " (active/total: " + activePlugins.size() //$NON-NLS-1$ + " of " //$NON-NLS-1$ + registry.getPluginDescriptors().size() + ")"); //$NON-NLS-1$ fireEvent(result, true); return result; } finally { activatingPlugins.remove(descr.getId()); } } private void checkPrerequisites(final PluginDescriptor descr) throws PluginLifecycleException { for (PluginPrerequisite pre : descr.getPrerequisites()) { if (activatingPlugins.contains(pre.getPluginId())) { log.warn("dependencies loop detected during " //$NON-NLS-1$ + "activation of plug-in " + descr, new Exception( //$NON-NLS-1$ "fake exception to view stack trace")); //$NON-NLS-1$ continue; } if (badPlugins.contains(pre.getPluginId())) { if (pre.isOptional()) { continue; } throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginPrerequisiteBad", //$NON-NLS-1$ new Object[] { descr.getId(), pre.getPluginId() }); } if (disabledPlugins.contains(pre.getPluginId())) { if (pre.isOptional()) { continue; } throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginPrerequisiteDisabled", //$NON-NLS-1$ new Object[] { descr.getId(), pre.getPluginId() }); } if (!pre.matches()) { if (pre.isOptional()) { continue; } throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginPrerequisiteNotMatches", //$NON-NLS-1$ new Object[] { descr.getId(), pre.getPluginId() }); } try { activatePlugin(registry.getPluginDescriptor(pre.getPluginId())); } catch (PluginLifecycleException ple) { if (pre.isOptional()) { log.warn("failed activating optional plug-in from" //$NON-NLS-1$ + " prerequisite " + pre, ple); //$NON-NLS-1$ continue; } throw ple; } } } /** * Deactivates plug-in with given ID if it has been successfully activated * before. Note that this method will effectively deactivate all plug-ins * that depend on the given plug-in. * * @param id * plug-in ID */ @Override public void deactivatePlugin(final String id) { if (!activePlugins.containsKey(id)) { return; } PluginDescriptor descr = registry.getPluginDescriptor(id); if (descr == null) { throw new IllegalArgumentException("unknown plug-in ID - " + id); //$NON-NLS-1$ } // Collect depending plug-ins final Map dependingPluginsMap = new HashMap(); for (PluginDescriptor dependingPlugin : registry .getDependingPlugins(descr)) { dependingPluginsMap.put(dependingPlugin.getId(), dependingPlugin); } // Prepare list of plug-ins to be deactivated in correct order final List tobeDeactivated = new LinkedList(); final List reversedLog = new ArrayList(activationLog); Collections.reverse(reversedLog); for (String pluginId : reversedLog) { if (pluginId.equals(descr.getId())) { tobeDeactivated.add(descr); } else if (dependingPluginsMap.containsKey(pluginId)) { tobeDeactivated.add(dependingPluginsMap.get(pluginId)); } } // Deactivate plug-ins for (PluginDescriptor descriptor : tobeDeactivated) { deactivatePlugin(descriptor); } dump(); } private synchronized void deactivatePlugin(final PluginDescriptor descr) { Plugin plugin = activePlugins.remove(descr.getId()); if (plugin != null) { try { if (plugin.isActive()) { fireEvent(plugin, false); stopPlugin(plugin); lifecycleHandler.afterPluginStop(plugin); log.info("plug-in stopped - " + descr.getUniqueId() //$NON-NLS-1$ + " (active/total: " + activePlugins.size() //$NON-NLS-1$ + " of " //$NON-NLS-1$ + registry.getPluginDescriptors().size() + ")"); //$NON-NLS-1$ } else { log.warn("plug-in " + descr.getUniqueId() //$NON-NLS-1$ + " is not active although present in active " //$NON-NLS-1$ + "plug-ins list", new Exception( //$NON-NLS-1$ "fake exception to view stack trace")); //$NON-NLS-1$ } } catch (Exception e) { log.error("error while stopping plug-in " //$NON-NLS-1$ + descr.getUniqueId(), e); } } PluginClassLoader clsLoader = classLoaders.remove(descr.getId()); if (clsLoader != null) { disposeClassLoader(clsLoader); } badPlugins.remove(descr.getId()); activationLog.remove(descr.getId()); } private void dump() { if (!log.isDebugEnabled()) { return; } StringBuilder buf = new StringBuilder("PLUGIN MANAGER DUMP:\r\n"); //$NON-NLS-1$ buf.append("-------------- DUMP BEGIN -----------------\r\n"); //$NON-NLS-1$ buf.append("\tActive plug-ins: " + activePlugins.size()) //$NON-NLS-1$ .append("\r\n"); //$NON-NLS-1$ for (Plugin plugin : activePlugins.values()) { buf.append("\t\t") //$NON-NLS-1$ .append(plugin).append("\r\n"); //$NON-NLS-1$ } buf.append("\tActivating plug-ins: " //$NON-NLS-1$ + activatingPlugins.size()).append("\r\n"); //$NON-NLS-1$ for (String s : activatingPlugins) { buf.append("\t\t") //$NON-NLS-1$ .append(s).append("\r\n"); //$NON-NLS-1$ } buf.append("\tPlug-ins with instantiated class loaders: " //$NON-NLS-1$ + classLoaders.size()).append("\r\n"); //$NON-NLS-1$ for (String s : classLoaders.keySet()) { buf.append("\t\t") //$NON-NLS-1$ .append(s).append("\r\n"); //$NON-NLS-1$ } buf.append("\tDisabled plug-ins: " + disabledPlugins.size()) //$NON-NLS-1$ .append("\r\n"); //$NON-NLS-1$ for (String s : disabledPlugins) { buf.append("\t\t") //$NON-NLS-1$ .append(s).append("\r\n"); //$NON-NLS-1$ } buf.append("\tBad plug-ins: " + badPlugins.size()) //$NON-NLS-1$ .append("\r\n"); //$NON-NLS-1$ for (String s : badPlugins) { buf.append("\t\t") //$NON-NLS-1$ .append(s).append("\r\n"); //$NON-NLS-1$ } buf.append("\tActivation log: " + activationLog.size()) //$NON-NLS-1$ .append("\r\n"); //$NON-NLS-1$ for (String s : activationLog) { buf.append("\t\t") //$NON-NLS-1$ .append(s).append("\r\n"); //$NON-NLS-1$ } buf.append("Memory TOTAL/FREE/MAX: ") //$NON-NLS-1$ .append(Runtime.getRuntime().totalMemory()).append("/") //$NON-NLS-1$ .append(Runtime.getRuntime().freeMemory()).append("/") //$NON-NLS-1$ .append(Runtime.getRuntime().maxMemory()).append("\r\n"); //$NON-NLS-1$ buf.append("-------------- DUMP END -----------------"); //$NON-NLS-1$ log.debug(buf.toString()); } /** * Disables plug-in (with dependencies) in this manager instance. Disabled * plug-in can't be activated although it may be valid and successfully * registered with plug-in registry. Before disabling, plug-in will be * deactivated if it was successfully activated.
* Be careful with this method as it can effectively disable large set of * inter-depending plug-ins and your application may become unstable or even * disabled as whole. * * @param descr * descriptor of plug-in to be disabled * @return descriptors of plug-ins that was actually disabled */ @Override public PluginDescriptor[] disablePlugin(final PluginDescriptor descr) { final List result = new LinkedList(); if (!disabledPlugins.contains(descr.getId())) { deactivatePlugin(descr); fireEvent(descr, false); disabledPlugins.add(descr.getId()); result.add(descr); } for (PluginDescriptor dependedPlugin : registry .getDependingPlugins(descr)) { if (!disabledPlugins.contains(dependedPlugin.getId())) { deactivatePlugin(dependedPlugin); fireEvent(dependedPlugin, false); disabledPlugins.add(dependedPlugin.getId()); result.add(dependedPlugin); } } return result.toArray(new PluginDescriptor[result.size()]); } /** * Enables plug-in (or plug-ins) in this manager instance. * * @param descr * descriptor of plug-in to be enabled * @param includeDependings * if true, depending plug-ins will be also * enabled * @return descriptors of plug-ins that was actually enabled * @see #disablePlugin(PluginDescriptor) */ @Override public PluginDescriptor[] enablePlugin(final PluginDescriptor descr, final boolean includeDependings) { final List result = new LinkedList(); if (disabledPlugins.contains(descr.getId())) { disabledPlugins.remove(descr.getId()); fireEvent(descr, true); result.add(descr); } if (includeDependings) { for (PluginDescriptor dependedPlugin : registry .getDependingPlugins(descr)) { if (disabledPlugins.contains(dependedPlugin.getId())) { disabledPlugins.remove(dependedPlugin.getId()); fireEvent(dependedPlugin, true); result.add(dependedPlugin); } } } return result.toArray(new PluginDescriptor[result.size()]); } /** * @param descr * plug-in descriptor * @return true if given plug-in is disabled in this manager */ @Override public boolean isPluginEnabled(final PluginDescriptor descr) { return !disabledPlugins.contains(descr.getId()); } /** * Registers plug-in manager event listener. If given listener has been * registered before, this method will throw an * {@link IllegalArgumentException}. * * @param listener * new manager event listener */ @Override public void registerListener(final EventListener listener) { if (listeners.contains(listener)) { throw new IllegalArgumentException("listener " + listener //$NON-NLS-1$ + " already registered"); //$NON-NLS-1$ } listeners.add(listener); } /** * Unregisters manager event listener. If given listener hasn't been * registered before, this method will throw an * {@link IllegalArgumentException}. * * @param listener * registered listener */ @Override public void unregisterListener(final EventListener listener) { if (!listeners.remove(listener)) { log.warn("unknown listener " + listener); //$NON-NLS-1$ } } private void fireEvent(final Object data, final boolean on) { if (listeners.isEmpty()) { return; } // make local copy EventListener[] arr = listeners.toArray(new EventListener[listeners .size()]); // propagate event basing on given data type and on/off flag // NB: revise this logic if EventListener members are changed if (data instanceof PluginDescriptor) { PluginDescriptor descr = (PluginDescriptor) data; if (on) { if (log.isDebugEnabled()) { log.debug("propagating \"pluginEnabled\" event for " //$NON-NLS-1$ + descr); } for (EventListener element : arr) { element.pluginEnabled(descr); } } else { if (log.isDebugEnabled()) { log.debug("propagating \"pluginDisabled\" event for " //$NON-NLS-1$ + descr); } for (EventListener element : arr) { element.pluginDisabled(descr); } } } else { Plugin plugin = (Plugin) data; if (on) { if (log.isDebugEnabled()) { log.debug("propagating \"pluginActivated\" event for " //$NON-NLS-1$ + plugin); } for (EventListener element : arr) { element.pluginActivated(plugin); } } else { if (log.isDebugEnabled()) { log.debug("propagating \"pluginDeactivated\" event for " //$NON-NLS-1$ + plugin); } for (EventListener element : arr) { element.pluginDeactivated(plugin); } } } } static final class EmptyPlugin extends Plugin { /** * @see org.java.plugin.Plugin#doStart() */ @Override protected void doStart() throws Exception { // no-op } /** * @see org.java.plugin.Plugin#doStop() */ @Override protected void doStop() throws Exception { // no-op } } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/StandardPathResolver.java0000644000175000017500000001636410555751166030150 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.PathResolver; import org.java.plugin.registry.Identity; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginElement; import org.java.plugin.registry.PluginFragment; import org.java.plugin.util.ExtendedProperties; import org.java.plugin.util.IoUtil; /** * Standard simple implementation of path resolver. For resolving it uses * plug-in element registration (see {@link #registerContext(Identity, URL)}) * procedure. * @version $Id$ */ public class StandardPathResolver implements PathResolver { protected Log log = LogFactory.getLog(getClass()); private Map urlMap = new HashMap(); /** * This implementation accepts {@link PluginDescriptor} or * {@link PluginFragment} as valid plug-in elements. * @see org.java.plugin.PathResolver#registerContext( * org.java.plugin.registry.Identity, java.net.URL) */ public void registerContext(final Identity idt, final URL url) { if (!(idt instanceof PluginDescriptor) && !(idt instanceof PluginFragment)) { throw new IllegalArgumentException( "unsupported identity class " //$NON-NLS-1$ + idt.getClass().getName()); } final URL oldUrl = urlMap.put(idt.getId(), url); if (oldUrl != null) { log.warn("old context URL " + oldUrl //$NON-NLS-1$ + " has been replaced with new " + url //$NON-NLS-1$ + " for " + idt //$NON-NLS-1$ + " with key " + idt.getId()); //$NON-NLS-1$ } else { if (log.isDebugEnabled()) { log.debug("context URL " + url //$NON-NLS-1$ + " registered for " + idt //$NON-NLS-1$ + " with key " + idt.getId()); //$NON-NLS-1$ } } } /** * @see org.java.plugin.PathResolver#unregisterContext(java.lang.String) */ public void unregisterContext(final String id) { final URL url = urlMap.remove(id); if (url == null) { log.warn("no context was registered with key " + id); //$NON-NLS-1$ } else { if (log.isDebugEnabled()) { log.debug("context URL " + url //$NON-NLS-1$ + " un-registered for key " + id); //$NON-NLS-1$ } } } /** * @see org.java.plugin.PathResolver#resolvePath( * org.java.plugin.registry.Identity, java.lang.String) */ public URL resolvePath(final Identity identity, final String path) { URL baseUrl; if ((identity instanceof PluginDescriptor) || (identity instanceof PluginFragment)) { baseUrl = getRegisteredContext(identity.getId()); } else if (identity instanceof PluginElement) { PluginElement element = (PluginElement) identity; if (element.getDeclaringPluginFragment() != null) { baseUrl = getRegisteredContext( element.getDeclaringPluginFragment().getId()); } else { baseUrl = getRegisteredContext( element.getDeclaringPluginDescriptor().getId()); } } else { throw new IllegalArgumentException("unknown identity class " //$NON-NLS-1$ + identity.getClass().getName()); } return resolvePath(baseUrl, path); } /** * @see org.java.plugin.PathResolver#getRegisteredContext(java.lang.String) */ public URL getRegisteredContext(final String id) { final URL result = urlMap.get(id); if (result == null) { throw new IllegalArgumentException("unknown plug-in or" //$NON-NLS-1$ + " plug-in fragment ID - " + id); //$NON-NLS-1$ } return result; } /** * @see org.java.plugin.PathResolver#isContextRegistered(java.lang.String) */ public boolean isContextRegistered(final String id) { return urlMap.containsKey(id); } /** * Resolves given path against given base URL. * @param baseUrl base URL to resolve given path * @param path path to be resolved * @return resolved URL */ protected URL resolvePath(final URL baseUrl, final String path) { try { if ("".equals(path) || "/".equals(path)) { //$NON-NLS-1$ //$NON-NLS-2$ return maybeJarUrl(baseUrl); } return maybeJarUrl(new URL(maybeJarUrl(baseUrl), path)); } catch (MalformedURLException mue) { log.error("can't create URL in context of " + baseUrl //$NON-NLS-1$ + " and path " + path, mue); //$NON-NLS-1$ throw new IllegalArgumentException("path " + path //$NON-NLS-1$ + " in context of " + baseUrl //$NON-NLS-1$ + " cause creation of malformed URL"); //$NON-NLS-1$ } } protected URL maybeJarUrl(final URL url) throws MalformedURLException { if ("jar".equalsIgnoreCase(url.getProtocol())) { //$NON-NLS-1$ return url; } File file = IoUtil.url2file(url); if ((file == null) || !file.isFile()) { return url; } String fileName = file.getName().toLowerCase(Locale.getDefault()); if (fileName.endsWith(".jar") //$NON-NLS-1$ || fileName.endsWith(".zip")) { //$NON-NLS-1$ return new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/"); //$NON-NLS-1$ } return url; } /** * No configuration parameters expected in this implementation. * @see org.java.plugin.PathResolver#configure(ExtendedProperties) */ public void configure(final ExtendedProperties config) throws Exception { // no-op } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/Resources_ru.properties0000644000175000017500000000376310541226144027767 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2006 Dmitry Olshansky # $Id$ # Exceptions related messages pluginClassNotFound = \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043a\u043b\u0430\u0441\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} pluginClassInstantiationFailed = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u044d\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {0} pluginActivating = \u043f\u043b\u0430\u0433\u0438\u043d {0} \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 pluginStartFailed = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d {0} pluginPrerequisiteBad = \u043f\u043b\u0430\u0433\u0438\u043d {0} \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1}, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c pluginPrerequisiteDisabled = \u043f\u043b\u0430\u0433\u0438\u043d {0} \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1}, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c pluginPrerequisiteNotMatches = \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043d\u0443\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 {1} \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d {0} libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/StandardObjectFactory.java0000644000175000017500000001544010554435120030246 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.ObjectFactory; import org.java.plugin.PathResolver; import org.java.plugin.PluginManager; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.util.ExtendedProperties; /** * Standard object factory implementation. * @version $Id$ */ public class StandardObjectFactory extends ObjectFactory { static final String PACKAGE_NAME = "org.java.plugin.standard"; //$NON-NLS-1$ protected Log log = LogFactory.getLog(getClass()); protected ExtendedProperties config; /** * @see org.java.plugin.ObjectFactory#configure(ExtendedProperties) */ @Override protected void configure(final ExtendedProperties configuration) { config = (configuration != null) ? configuration : new ExtendedProperties(); } protected String getImplClassName(final Class cls) { String result = config.getProperty(cls.getName(), null); if (log.isDebugEnabled()) { log.debug("implementation class for " + cls.getName() //$NON-NLS-1$ + " is " + result); //$NON-NLS-1$ } return result; } protected Object createClassInstance(final String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException { ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl != null) { try { return cl.loadClass(className).newInstance(); } catch (ClassNotFoundException cnfe) { // ignore } } cl = getClass().getClassLoader(); if (cl != null) { try { return cl.loadClass(className).newInstance(); } catch (ClassNotFoundException cnfe) { // ignore } } return ClassLoader.getSystemClassLoader().loadClass( className).newInstance(); } /** * @see org.java.plugin.ObjectFactory#createRegistry() */ @Override public PluginRegistry createRegistry() { String className = getImplClassName(PluginRegistry.class); PluginRegistry result; if (className == null) { className = "org.java.plugin.registry.xml.PluginRegistryImpl"; //$NON-NLS-1$ } try { result = (PluginRegistry) createClassInstance(className); } catch (Exception e) { log.fatal("failed creating registry instance " //$NON-NLS-1$ + className, e); throw new Error("failed creating registry instance " //$NON-NLS-1$ + className, e); } result.configure(config.getSubset(className + ".")); //$NON-NLS-1$ log.debug("registry instance created - " + result); //$NON-NLS-1$ return result; } /** * @see org.java.plugin.ObjectFactory#createPathResolver() */ @Override public PathResolver createPathResolver() { String className = getImplClassName(PathResolver.class); PathResolver result; if (className == null) { className = "org.java.plugin.standard.StandardPathResolver"; //$NON-NLS-1$ } try { result = (PathResolver) createClassInstance(className); } catch (Exception e) { log.fatal("failed creating path resolver instance " //$NON-NLS-1$ + className, e); throw new Error("failed creating path resolver instance " //$NON-NLS-1$ + className, e); } try { result.configure(config.getSubset(className + ".")); //$NON-NLS-1$ } catch (Exception e) { log.fatal("failed configuring path resolver instance " //$NON-NLS-1$ + result, e); throw new Error("failed configuring path resolver instance " //$NON-NLS-1$ + result, e); } log.debug("path resolver instance created - " + result); //$NON-NLS-1$ return result; } /** * Creates new instance of plug-in life cycle handler implementation class * using standard discovery algorithm to determine which handler * implementation class should be instantiated. * @return new plug-in life cycle handler instance */ protected PluginLifecycleHandler createLifecycleHandler() { String className = getImplClassName(PluginLifecycleHandler.class); PluginLifecycleHandler result; if (className == null) { className = "org.java.plugin.standard.StandardPluginLifecycleHandler"; //$NON-NLS-1$ } try { result = (PluginLifecycleHandler) createClassInstance(className); } catch (Exception e) { log.fatal("failed creating plug-in life cycle handler instance " //$NON-NLS-1$ + className, e); throw new Error( "failed creating plug-in life cycle handler instance " //$NON-NLS-1$ + className, e); } result.configure(config.getSubset(className + ".")); //$NON-NLS-1$ log.debug("life cycle handler instance created - " + result); //$NON-NLS-1$ return result; } /** * @see org.java.plugin.ObjectFactory#createManager( * org.java.plugin.registry.PluginRegistry, * org.java.plugin.PathResolver) */ @Override public PluginManager createManager(final PluginRegistry registry, final PathResolver pathResolver) { return new StandardPluginManager(registry, pathResolver, createLifecycleHandler()); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/jpf.properties0000644000175000017500000000211210541226144026051 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2005 Dmitry Olshansky # $Id$ # Default JPF configuration. All properties are optional. # Object factory implementation org.java.plugin.ObjectFactory = org.java.plugin.standard.StandardObjectFactory # Plug-in registry implementation org.java.plugin.registry.PluginRegistry = org.java.plugin.registry.xml.PluginRegistryImpl org.java.plugin.registry.xml.PluginRegistryImpl.isValidating = true org.java.plugin.registry.xml.PluginRegistryImpl.stopOnError = false # Standard (simple) path resolver implementation org.java.plugin.PathResolver = org.java.plugin.standard.StandardPathResolver # Files shading (anti-locking) path resolver implementation #org.java.plugin.PathResolver = org.java.plugin.standard.ShadingPathResolver #org.java.plugin.standard.ShadingPathResolver.shadowFolder = ./temp/.jpf-shadow #org.java.plugin.standard.ShadingPathResolver.unpackMode = smart # Plug-in life cycle handler implementation org.java.plugin.standard.PluginLifecycleHandler = org.java.plugin.standard.StandardPluginLifecycleHandler libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/package.html0000644000175000017500000000016510514424204025440 0ustar gregoagregoa

This package contains standard implementation of main framework runtime API.

libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/Resources.properties0000644000175000017500000000116510541226142027251 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2006 Dmitry Olshansky # $Id$ # Exceptions related messages pluginClassNotFound = can't find plug-in class {0} pluginClassInstantiationFailed = can't create class instance for plug-in {0} pluginActivating = plug-in {0} is activating now pluginStartFailed = can't start plug-in {0} pluginPrerequisiteBad = plug-in {0} requires plug-in {1} which failed activation pluginPrerequisiteDisabled = plug-in {0} requires plug-in {1} which was disabled externally pluginPrerequisiteNotMatches = plug-in {0} requires plug-in {1} which is unknown or has incompatible version libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/Resources_de.properties0000644000175000017500000000140210612737644027730 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2006 Dmitry Olshansky # German Translation (C) 2007 Stefan Rado # $Id: Resources_de.properties,v 1.1 2007/04/22 18:03:47 ddimon Exp $ # Exceptions pluginClassNotFound = Kann Plug-in Klasse {0} nicht finden pluginClassInstantiationFailed = Kann Plug-in Klasse f\u00fcr Plug-in {0} nicht instantiieren pluginActivating = Plug-in {0} startet nun pluginStartFailed = Kann Plug-in {0} nicht starten pluginPrerequisiteBad = Plug-in {0} ben\u00f6tigt Plug-in {1}, bei dem die Aktivierung fehlschlug pluginPrerequisiteDisabled = Plug-in {0} ben\u00f6tigt Plug-in {1}, das disabled wurde pluginPrerequisiteNotMatches = Plug-in {0} ben\u00f6tigt Plug-in {1}, das unebkannt ist oder eine inkompatible Version hat libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/PluginLifecycleHandler.java0000644000175000017500000001122210562137312030376 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import org.java.plugin.ObjectFactory; import org.java.plugin.Plugin; import org.java.plugin.PluginClassLoader; import org.java.plugin.PluginLifecycleException; import org.java.plugin.PluginManager; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.util.ExtendedProperties; /** * Manager class that handles plug-in life cycle related logic. This class is * part of standard implementation of plug-in manager, other implementations may * not use it at all. The main purpose of this class is to simplify * customization of plug-in manager behavior. * @version $Id$ */ public abstract class PluginLifecycleHandler { private PluginManager manager; /** * Initializes this handler instance. This method called once during this * handler instance life cycle. * @param aManager a plug-in manager, this handler is "connected" to */ protected void init(PluginManager aManager) { manager = aManager; } /** * @return instance of plug-in manager, this handler is "connected" to */ protected PluginManager getPluginManager() { return manager; } /** * Configures this handler instance. Note that this method should be called * once before {@link #init(PluginManager)}, usually this is done in * {@link ObjectFactory object factory} implementation. * @param config handler configuration data */ protected abstract void configure(ExtendedProperties config); /** * This method should create new instance of class loader for given plug-in. * @param descr plug-in descriptor * @return class loader instance for given plug-in */ protected abstract PluginClassLoader createPluginClassLoader( PluginDescriptor descr); /** * This method should create new instance of plug-in class. No initializing * logic should be executed in new class instance during this method call. *
* Note that this method will NOT be called for those plug-ins that have NO * class declared in plug-in descriptor i.e., method * {@link PluginDescriptor#getPluginClassName()} returns blank string or * null. * @param descr plug-in descriptor * @return new not initialized instance of plug-in class * @throws PluginLifecycleException if plug-in class can't be instantiated * for some reason */ protected abstract Plugin createPluginInstance(PluginDescriptor descr) throws PluginLifecycleException; /** * This method will be called by {@link PluginManager} just before starting * plug-in. Put here any "initializing" logic that should be executed before * plug-in start. * @param plugin plug-in being starting * @throws PluginLifecycleException if plug-in can't be "initialized" */ protected abstract void beforePluginStart(final Plugin plugin) throws PluginLifecycleException; /** * This method will be called by {@link PluginManager} just after stopping * plug-in. Put here any "un-initializing" logic that should be executed * after plug-in stop. * @param plugin plug-in being stopping * @throws PluginLifecycleException if plug-in can't be "un-initialized" */ protected abstract void afterPluginStop(final Plugin plugin) throws PluginLifecycleException; /** * Should dispose all resources allocated by this handler instance. No * methods will be called for this class instance after executing this * method. */ protected abstract void dispose(); } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/StandardPluginLifecycleHandler.java0000644000175000017500000002103610605726466032077 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import java.security.AccessController; import java.security.PrivilegedAction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.Plugin; import org.java.plugin.PluginLifecycleException; import org.java.plugin.PluginManager; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.util.ExtendedProperties; /** * Standard implementation of plug-in life cycle handler. *

* Configuration parameters *

*

* This life cycle handler implementation supports following configuration * parameters: *

*
probeParentLoaderLast
*
If true, plug-in classloader will try loading classes from * system (boot) classpath after trying to load them from plug-in * classpath. Otherwise system classpath will be used first. Default * value is false that corresponds to standard delegation model * for classloaders hierarchy that corresponds to JLS.
*
stickySynchronizing
*
Allows advanced configuring of classloaders synchronization in * multy-threaded environment. If true then class loading will * be synchronized with initial plug-in classloader instance. Otherwise * this instance will be used as synchronizing monitor. Default * value is false.
*
localClassLoadingOptimization
*
If true then plug-in classloader will collect local * packages statistics to predict class location. This allow to optimize * class look-up procedure for classes that belong to the requested plug-in. * Default value is true.
*
foreignClassLoadingOptimization
*
If true then plug-in classloader will collect statistics * for "foreign" classes - those which belong to depending plug-ins. This * allow to optimize class look-up procedure when enumerating depending * plug-ins. Default value is true.
*
*

* @version $Id: StandardPluginLifecycleHandler.java,v 1.5 2007/04/07 12:39:50 ddimon Exp $ */ public class StandardPluginLifecycleHandler extends PluginLifecycleHandler { private final Log log = LogFactory.getLog(getClass()); private boolean probeParentLoaderLast; private boolean stickySynchronizing; private boolean localClassLoadingOptimization; private boolean foreignClassLoadingOptimization; /** * Creates standard implementation of plug-in class loader. * @see org.java.plugin.standard.PluginLifecycleHandler#createPluginClassLoader( * org.java.plugin.registry.PluginDescriptor) */ @Override protected org.java.plugin.PluginClassLoader createPluginClassLoader( final PluginDescriptor descr) { /*StandardPluginClassLoader result = new StandardPluginClassLoader( getPluginManager(), descr, getClass().getClassLoader());*/ StandardPluginClassLoader result = AccessController.doPrivileged( new PrivilegedAction() { public StandardPluginClassLoader run() { return new StandardPluginClassLoader(getPluginManager(), descr, StandardPluginLifecycleHandler.this.getClass() .getClassLoader()); } }); result.setProbeParentLoaderLast(probeParentLoaderLast); result.setStickySynchronizing(stickySynchronizing); result.setLocalClassLoadingOptimization(localClassLoadingOptimization); result.setForeignClassLoadingOptimization( foreignClassLoadingOptimization); return result; } /** * Creates instance of plug-in class calling it's default (no-arguments) * constructor. Class look-up is done with * {@link PluginManager#getPluginClassLoader(PluginDescriptor) plug-in's class loader}. * @see org.java.plugin.standard.PluginLifecycleHandler#createPluginInstance( * org.java.plugin.registry.PluginDescriptor) */ @Override protected Plugin createPluginInstance(final PluginDescriptor descr) throws PluginLifecycleException { String className = descr.getPluginClassName(); Class pluginClass; try { pluginClass = getPluginManager().getPluginClassLoader(descr).loadClass( className); } catch (ClassNotFoundException cnfe) { throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginClassNotFound", className, cnfe); //$NON-NLS-1$ } try { return (Plugin) pluginClass.newInstance(); } catch (InstantiationException ie) { throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginClassInstantiationFailed", descr.getId(), ie); //$NON-NLS-1$ } catch (IllegalAccessException iae) { throw new PluginLifecycleException( StandardObjectFactory.PACKAGE_NAME, "pluginClassInstantiationFailed", descr.getId(), iae); //$NON-NLS-1$ } } /** * This method does nothing in this implementation. * @see org.java.plugin.standard.PluginLifecycleHandler#beforePluginStart( * org.java.plugin.Plugin) */ @Override protected void beforePluginStart(final Plugin plugin) { // no-op } /** * This method does nothing in this implementation. * @see org.java.plugin.standard.PluginLifecycleHandler#afterPluginStop( * org.java.plugin.Plugin) */ @Override protected void afterPluginStop(final Plugin plugin) { // no-op } /** * This method does nothing in this implementation. * @see org.java.plugin.standard.PluginLifecycleHandler#dispose() */ @Override protected void dispose() { // no-op } /** * @see org.java.plugin.standard.PluginLifecycleHandler#configure( * ExtendedProperties) */ @Override public void configure(ExtendedProperties config) { probeParentLoaderLast = "true".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty("probeParentLoaderLast", "false")); //$NON-NLS-1$ //$NON-NLS-2$ log.debug("probeParentLoaderLast parameter value is " //$NON-NLS-1$ + probeParentLoaderLast); stickySynchronizing = "true".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty("stickySynchronizing", "false")); //$NON-NLS-1$ //$NON-NLS-2$ log.debug("stickySynchronizing parameter value is " //$NON-NLS-1$ + stickySynchronizing); localClassLoadingOptimization = !"false".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty("localClassLoadingOptimization", //$NON-NLS-1$ "true")); //$NON-NLS-1$ log.debug("localLoadingClassOptimization parameter value is " //$NON-NLS-1$ + localClassLoadingOptimization); foreignClassLoadingOptimization = !"false".equalsIgnoreCase( //$NON-NLS-1$ config.getProperty("foreignClassLoadingOptimization", //$NON-NLS-1$ "true")); //$NON-NLS-1$ log.debug("foreignClassLoadingOptimization parameter value is " //$NON-NLS-1$ + foreignClassLoadingOptimization); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/standard/StandardPluginLocation.java0000644000175000017500000001640610554435132030445 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.standard; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import org.java.plugin.PluginManager.PluginLocation; import org.java.plugin.util.IoUtil; /** * A standard implementation of plug-in location interface. It may be used to * create plug-in locations from JAR or ZIP files of plug-in folders, or from * any URL pointers. *

* Inspired by Per Cederberg. * * @version $Id$ */ public class StandardPluginLocation implements PluginLocation { /** * Creates plug-in location from a given file and checks that all required * resources are available. Before creating location object, this method * probes given ZIP file of folder for presence of any of the following * files: *

    *
  • /plugin.xml
  • *
  • /plugin-fragment.xml
  • *
  • /META-INF/plugin.xml
  • *
  • /META-INF/plugin-fragment.xml
  • *
* If any of those files present, a new plug-in location object created and * returned. * @param file plug-in JAR or ZIP file or plug-in folder * @return created new plug-in location or null if given file * doesn't points to a valid plug-in file or folder * @throws MalformedURLException if the plug-in URL's couldn't be created */ public static PluginLocation create(final File file) throws MalformedURLException { if (file.isDirectory()) { URL manifestUrl = getManifestUrl(file); return (manifestUrl == null) ? null : new StandardPluginLocation( IoUtil.file2url(file), manifestUrl); } String fileName = file.getName().toLowerCase(Locale.getDefault()); if (!fileName.endsWith(".jar") //$NON-NLS-1$ && !fileName.endsWith(".zip")) { //$NON-NLS-1$ return null; } URL manifestUrl = getManifestUrl(file); return (manifestUrl == null) ? null : new StandardPluginLocation(new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/"), manifestUrl); //$NON-NLS-1$ } private static URL getManifestUrl(final File file) throws MalformedURLException { if (file.isDirectory()) { File result = new File(file, "plugin.xml"); //$NON-NLS-1$ if (result.isFile()) { return IoUtil.file2url(result); } result = new File(file, "plugin-fragment.xml"); //$NON-NLS-1$ if (result.isFile()) { return IoUtil.file2url(result); } result = new File(file, "META-INF" + File.separator //$NON-NLS-1$ + "plugin.xml"); //$NON-NLS-1$ if (result.isFile()) { return IoUtil.file2url(result); } result = new File(file, "META-INF" + File.separator //$NON-NLS-1$ + "plugin-fragment.xml"); //$NON-NLS-1$ if (result.isFile()) { return IoUtil.file2url(result); } return null; } if (!file.isFile()) { return null; } URL url = new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/plugin.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } url = new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/plugin-fragment.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } url = new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/META-INF/plugin.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } url = new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/META-INF/plugin-fragment.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } return null; } private final URL context; private final URL manifest; /** * Creates a new plug-in location from a given context an manifest URL's. * @param aContext plug-in context URL * @param aManifest plug-in manifest URL */ public StandardPluginLocation(final URL aContext, final URL aManifest) { if (aContext == null) { throw new NullPointerException("context"); //$NON-NLS-1$ } if (aManifest == null) { throw new NullPointerException("manifest"); //$NON-NLS-1$ } context = aContext; manifest = aManifest; } /** * Creates a new plug-in location from a jar or a zip file or a folder. This * plug-in manifest file path specified is relative to the root directory of * the jar or zip file or given folder. * @param file the plug-in zip file or plug-in folder * @param manifestPath the relative manifest path * @throws MalformedURLException if the plug-in URL's couldn't be created */ public StandardPluginLocation(final File file, final String manifestPath) throws MalformedURLException { if (file.isDirectory()) { context = IoUtil.file2url(file); } else { context = new URL("jar:" //$NON-NLS-1$ + IoUtil.file2url(file).toExternalForm() + "!/"); //$NON-NLS-1$ } manifest = new URL(context, manifestPath.startsWith("/") //$NON-NLS-1$ ? manifestPath.substring(1) : manifestPath); } /** * @see org.java.plugin.PluginManager.PluginLocation#getManifestLocation() */ public URL getManifestLocation() { return manifest; } /** * @see org.java.plugin.PluginManager.PluginLocation#getContextLocation() */ public URL getContextLocation() { return context; } /** * @see java.lang.Object#toString() */ @Override public String toString() { return context.toString(); } } libjpf-java-1.5.1+dfsg.orig/source/org/java/plugin/JpfException.java0000644000175000017500000000367710514424204024633 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2005 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin; import java.util.Locale; import org.java.plugin.util.ResourceManager; /** * Base JPF exception class that supports localized error messages. * @version $Id$ */ public abstract class JpfException extends Exception { private final String packageName; private final String messageKey; private final Object data; protected JpfException(final String aPackageName, final String aMessageKey, final Object aData, final Throwable cause) { super(ResourceManager.getMessage(aPackageName, aMessageKey, aData), cause); packageName = aPackageName; messageKey = aMessageKey; data = aData; } /** * @param locale locale * @return error message for the given locale */ public String getMessage(final Locale locale) { return ResourceManager.getMessage(packageName, messageKey, locale, data); } } libjpf-java-1.5.1+dfsg.orig/BUILD.txt0000644000175000017500000000300510563411112016443 0ustar gregoagregoa$Id$ JPF Build Instructions STEP 0. Prerequisites. To build JPF from source code you'll need the following software to be installed on your computer: - Java SDK (JDK) version 1.5 or newer; - Apache Ant version 1.5 or newer. All other required libraries are included into JPF source code distribution package. STEP 1. Get JPF source code. Download JPF source code archive from the project web site http://sourceforge.net/project/showfiles.php?group_id=110394 and unpack it to any directory. STEP 2. Adjust build parameters (optional step). JPF top-level directory contains "build.properties" and "build.xml" files. By default, you do not need to change any of the settings in these files, but you do need to run Ant from this location so it knows where to find them. If you wish to change build parameters, edit build.properties file instead of "build.xml". STEP 2. Run Ant. Assuming you have Ant in your PATH and have set ANT_HOME to the location of your Ant installation, typing "ant" at the shell prompt should run Ant. Ant will by default look for the "build.xml" file in your current directory, and display available JPF build targets with short descriptions. To get binary distribution package of JPF type: ant dist To get JPF JAR files only type: ant jar For further information on JPF, go to: http://jpf.sourceforge.net Please join the JPF open discussion by visiting this site: http://sourceforge.net/forum/forum.php?forum_id=378299 Copyright (C) 2006-2007 Dmitry Olshanskylibjpf-java-1.5.1+dfsg.orig/source-tools/0000755000175000017500000000000010514450050017503 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/0000755000175000017500000000000010514450050020272 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/0000755000175000017500000000000010514450050021213 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/0000755000175000017500000000000010514450050022511 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/0000755000175000017500000000000010541226154023657 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/0000755000175000017500000000000010615356106024444 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/UnpackTask.java0000644000175000017500000000545410563415030027355 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.File; import java.io.IOException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.java.plugin.ObjectFactory; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.tools.PluginArchiver; import org.java.plugin.util.IoUtil; /** * The ant task for extracting plug-ins from archive. * @version $Id$ */ public final class UnpackTask extends Task { private File destDir; private File srcFile; /** * @param aSrcFile archive file to be unpacked */ public void setSrcFile(final File aSrcFile) { this.srcFile = aSrcFile; } /** * @param aDestFolder folder where to extract archived plug-ins */ public void setDestDir(final File aDestFolder) { this.destDir = aDestFolder; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() { if (srcFile == null) { throw new BuildException("srcfile attribute must be set!", //$NON-NLS-1$ getLocation()); } if (destDir == null) { throw new BuildException("destdir attribute must be set!", //$NON-NLS-1$ getLocation()); } try { PluginArchiver.unpack(IoUtil.file2url(srcFile), ObjectFactory.newInstance().createRegistry(), destDir); log("Plug-ins archive unpacked to folder " + destDir); //$NON-NLS-1$ } catch (IOException ioe) { throw new BuildException(ioe); } catch (ManifestProcessingException mpe) { throw new BuildException(mpe); } catch (ClassNotFoundException cnfe) { throw new BuildException(cnfe); } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/PluginInfoTask.java0000644000175000017500000001434010563414630030205 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.java.plugin.ObjectFactory; import org.java.plugin.registry.ManifestInfo; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.Version; import org.java.plugin.util.IoUtil; /** * Simple task to read some data from plug-in manifest into project properties. *

* Inspired by Sebastian Kopsan. * * @version $Id$ */ public class PluginInfoTask extends Task { private File manifest; private String propertyId; private String propertyVersion; private String propertyVendor; private String propertyPluginId; private String propertyPluginVersion; private String propertyMatchingRule; /** * @param aManifest plug-in manifest to read data from */ public void setManifest(final File aManifest) { manifest = aManifest; } /** * @param propertyName name of the property to read plug-in or plug-in * fragment ID in * * @see org.java.plugin.registry.ManifestInfo#getId() */ public void setPropertyId(String propertyName) { propertyId = propertyName; } /** * @param propertyName name of the property to read plug-in or plug-in * fragment version in * * @see org.java.plugin.registry.ManifestInfo#getVersion() */ public void setPropertyVersion(String propertyName) { propertyVersion = propertyName; } /** * @param propertyName name of the property to read plug-in or plug-in * fragment vendor in * * @see org.java.plugin.registry.ManifestInfo#getVendor() */ public void setPropertyVendor(String propertyName) { propertyVendor = propertyName; } /** * @param propertyName name of the property to read plug-in ID in * * @see org.java.plugin.registry.ManifestInfo#getPluginId() */ public void setPropertyPluginId(String propertyName) { propertyPluginId = propertyName; } /** * @param propertyName name of the property to read plug-in version in * * @see org.java.plugin.registry.ManifestInfo#getPluginVersion() */ public void setPropertyPluginVersion(String propertyName) { propertyPluginVersion = propertyName; } /** * @param propertyName name of the property to read plug-in fragment * matching rule in * * @see org.java.plugin.registry.ManifestInfo#getMatchingRule() */ public void setPropertyMatchingRule(String propertyName) { this.propertyMatchingRule = propertyName; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() throws BuildException { if (manifest == null) { throw new BuildException("manifest attribute must be set!", //$NON-NLS-1$ getLocation()); } URL url; try { url = IoUtil.file2url(manifest); } catch (MalformedURLException mue) { throw new BuildException("failed converting file " + manifest //$NON-NLS-1$ + " to URL", mue, getLocation()); //$NON-NLS-1$ } ManifestInfo manifestInfo; try { manifestInfo = ObjectFactory.newInstance().createRegistry() .readManifestInfo(url); //log("Data read from manifest " + manifest); //$NON-NLS-1$ } catch (ManifestProcessingException mpe) { throw new BuildException("failed reading data from manifest " //$NON-NLS-1$ + url, mpe, getLocation()); } if (propertyId != null) { getProject().setProperty(propertyId, manifestInfo.getId()); } if (propertyVersion != null) { Version version = manifestInfo.getVersion(); getProject().setProperty(propertyVersion, (version != null) ? version.toString() : ""); //$NON-NLS-1$ } if (propertyVendor != null) { String value = manifestInfo.getVendor(); getProject().setProperty(propertyVendor, (value != null) ? value : ""); //$NON-NLS-1$ } if (propertyPluginId != null) { String value = manifestInfo.getPluginId(); getProject().setProperty(propertyPluginId, (value != null) ? value : ""); //$NON-NLS-1$ } if (propertyPluginVersion != null) { Version version = manifestInfo.getPluginVersion(); getProject().setProperty(propertyPluginVersion, (version != null) ? version.toString() : ""); //$NON-NLS-1$ } if (propertyMatchingRule != null) { MatchingRule value = manifestInfo.getMatchingRule(); getProject().setProperty(propertyMatchingRule, (value != null) ? value.toCode() : ""); //$NON-NLS-1$ } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/SingleFilePluginTask.java0000644000175000017500000000653610563415006031341 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.File; import java.io.IOException; import org.apache.tools.ant.BuildException; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.tools.PluginArchiver; /** * The Ant task to create "single file" plug-ins. * * @version $Id$ */ public class SingleFilePluginTask extends BaseJpfTask { private File destDir; /** * @param aDestDir folder, where to put generated plug-in file(s) */ public void setDestDir(final File aDestDir) { destDir = aDestDir; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() throws BuildException { if (destDir == null) { throw new BuildException("destdir attribute must be set!", //$NON-NLS-1$ getLocation()); } initRegistry(true); int count = 0; for (PluginDescriptor descr : getRegistry().getPluginDescriptors()) { File destFile = new File(destDir, descr.getId() + "-" //$NON-NLS-1$ + descr.getVersion() + ".zip"); //$NON-NLS-1$ try { PluginArchiver.pack(descr, getPathResolver(), destFile); } catch (IOException ioe) { throw new BuildException("failed building plug-in file " //$NON-NLS-1$ + destFile, ioe, getLocation()); } if (getVerbose()) { log("Created plug-in file " + destFile); //$NON-NLS-1$ } count++; } for (PluginFragment fragment : getRegistry().getPluginFragments()) { File destFile = new File(destDir, fragment.getId() + "-" //$NON-NLS-1$ + fragment.getVersion() + ".zip"); //$NON-NLS-1$ try { PluginArchiver.pack(fragment, getPathResolver(), destFile); } catch (IOException ioe) { throw new BuildException("failed building plug-in fragment file " //$NON-NLS-1$ + destFile, ioe, getLocation()); } if (getVerbose()) { log("Created plug-in fragment file " + destFile); //$NON-NLS-1$ } count++; } log("Plug-in files created " + count); //$NON-NLS-1$ } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/PathTask.java0000644000175000017500000001517310571640570027037 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.File; import java.net.URL; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.Path; import org.java.plugin.registry.Library; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.util.IoUtil; /** * The Ant task to prepare classpath according to plug-in manifest(s) * declarations. * * @version $Id: PathTask.java,v 1.3 2007/03/01 19:11:19 ddimon Exp $ */ public class PathTask extends BaseJpfTask { private String pathId; private String pathIdRef; private String pluginId; private String pluginIds; private boolean followExports = true; /** * @param value the path ID to set */ public void setPathId(final String value) { pathId = value; } /** * @param value the path ID reference to set */ public void setPathIdRef(final String value) { pathIdRef = value; } /** * @param value the plug-in ID to set */ public void setPluginId(final String value) { pluginId = value; } /** * @param value the plug-in ID's to set */ public void setPluginIds(final String value) { pluginIds = value; } /** * @param value the follow exports flag to set */ public void setFollowExports(final boolean value) { followExports = value; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() throws BuildException { if ((pathId == null) && (pathIdRef == null)) { throw new BuildException( "pathid or pathidref attribute must be set!", //$NON-NLS-1$ getLocation()); } Set ids = collectTargetIds(); if (ids.isEmpty()) { throw new BuildException( "pluginid or/and pluginids attribute must be set!", //$NON-NLS-1$ getLocation()); } initRegistry(true); Set processedIds = new HashSet(); Set result = new HashSet(); for (PluginDescriptor descr : getRegistry().getPluginDescriptors()) { if (!ids.contains(descr.getId())) { continue; } processDescriptor(result, processedIds, descr, true); } for (PluginFragment fragment : getRegistry().getPluginFragments()) { if (!ids.contains(fragment.getId())) { continue; } processDescriptor(result, processedIds, getRegistry().getPluginDescriptor(fragment.getPluginId()), true); } Path path; if (pathIdRef != null) { Object ref = getProject().getReference(pathIdRef); if (!(ref instanceof Path)) { throw new BuildException( "invalid reference " + pathIdRef //$NON-NLS-1$ + ", expected " + Path.class.getName() //$NON-NLS-1$ + ", found " + ref, //$NON-NLS-1$ getLocation()); } path = (Path) ref; } else { path = new Path(getProject()); getProject().addReference(pathId, path); } for (File file : result) { path.setLocation(file); } if (getVerbose()) { log("Collected path entries: " + result.size()); //$NON-NLS-1$ } } private void processDescriptor(final Set result, final Set processedIds, final PluginDescriptor descr, final boolean includePrivate) { if (followExports && !includePrivate && processedIds.contains(descr.getId())) { return; } processedIds.add(descr.getId()); for (Library lib : descr.getLibraries()) { if (followExports && !includePrivate && lib.getExports().isEmpty()) { continue; } URL url = getPathResolver().resolvePath(lib, lib.getPath()); File file = IoUtil.url2file(url); if (file != null) { result.add(file); if (getVerbose()) { log("Collected file " + file //$NON-NLS-1$ + " from library " + lib.getUniqueId()); //$NON-NLS-1$ } } else { log("Ignoring non-local URL " + url //$NON-NLS-1$ + " found in library " + lib.getUniqueId()); //$NON-NLS-1$ } } for (PluginPrerequisite pre : descr.getPrerequisites()) { if (!pre.matches()) { continue; } processDescriptor(result, processedIds, getRegistry().getPluginDescriptor(pre.getPluginId()), false); } } private Set collectTargetIds() { HashSet result = new HashSet(); if (pluginId != null) { result.add(pluginId); } if (pluginIds != null) { for (StringTokenizer st = new StringTokenizer(pluginIds, ",", false); //$NON-NLS-1$ st.hasMoreTokens();) { result.add(st.nextToken()); } } return result; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/CheckTask.java0000644000175000017500000000612410563414326027153 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import org.apache.tools.ant.BuildException; import org.java.plugin.registry.IntegrityCheckReport; /** * The Ant task to perform integrity check of plug-in set. * @version $Id$ */ public final class CheckTask extends BaseJpfTask { private boolean usePathResolver; /** * @param aUsePathResolver true if PathResolver should be used */ public void setUsePathResolver(final boolean aUsePathResolver) { this.usePathResolver = aUsePathResolver; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() { initRegistry(usePathResolver); IntegrityCheckReport report = getRegistry().checkIntegrity(getPathResolver()); if (getVerbose()) { log(integrityCheckReport2str(report)); } log("Integrity check done. Errors: " + report.countErrors() //$NON-NLS-1$ + ". Warnings: " + report.countWarnings() + "."); //$NON-NLS-1$ //$NON-NLS-2$ if (report.countErrors() > 0) { throw new BuildException("plug-ins set integrity check failed," //$NON-NLS-1$ + " errors count - " + report.countErrors()); //$NON-NLS-1$ } } private static String integrityCheckReport2str( final IntegrityCheckReport report) { StringBuilder buf = new StringBuilder(); buf.append("Integrity check report:\r\n"); //$NON-NLS-1$ buf.append("-------------- REPORT BEGIN -----------------\r\n"); //$NON-NLS-1$ for (IntegrityCheckReport.ReportItem item : report.getItems()) { buf.append("severity=").append(item.getSeverity()) //$NON-NLS-1$ .append("; code=").append(item.getCode()) //$NON-NLS-1$ .append("; message=").append(item.getMessage()) //$NON-NLS-1$ .append("; source=").append(item.getSource()).append("\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ } buf.append("-------------- REPORT END -----------------"); //$NON-NLS-1$ return buf.toString(); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/jpf-tasks.properties0000644000175000017500000000115010615372136030462 0ustar gregoagregoa# Java Plug-in Framework (JPF) # Copyright (C) 2004 - 2007 Dmitry Olshansky # $Id: jpf-tasks.properties,v 1.4 2007/04/30 11:51:25 ddimon Exp $ # JPF Ant tasks definitions. jpf-check=org.java.plugin.tools.ant.CheckTask jpf-doc=org.java.plugin.tools.ant.DocTask jpf-pack=org.java.plugin.tools.ant.PackTask jpf-unpack=org.java.plugin.tools.ant.UnpackTask jpf-zip=org.java.plugin.tools.ant.SingleFilePluginTask jpf-info=org.java.plugin.tools.ant.PluginInfoTask jpf-version=org.java.plugin.tools.ant.VersionUpdateTask jpf-path=org.java.plugin.tools.ant.PathTask jpf-sort=org.java.plugin.tools.ant.SortTasklibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/package.html0000644000175000017500000000023210514424204026713 0ustar gregoagregoa

This package contains implementations of various Ant tasks aimed to make usage of JPF much simple and convenient.

libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/DocTask.java0000644000175000017500000001217410563414376026652 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import org.apache.tools.ant.BuildException; import org.java.plugin.tools.docgen.DocGenerator; /** * The Ant task to generate documentation from plug-in manifest. * @version $Id$ */ public final class DocTask extends BaseJpfTask { private File destDir; private File overviewFile; private String encoding; private String docEncoding; private String templatesPath; private File stylesheetFile; /** * @param aDestDir base directory for generated documentation files */ public void setDestDir(final File aDestDir) { this.destDir = aDestDir; } /** * @param anOverviewFile documentation overview HTML file */ public void setOverview(final File anOverviewFile) { this.overviewFile = anOverviewFile; } /** * @param anEncoding source files encoding name (templates, overview etc.) */ public void setEncoding(final String anEncoding) { this.encoding = anEncoding; } /** * @param anEncoding output files encoding name */ public void setDocEncoding(final String anEncoding) { this.docEncoding = anEncoding; } /** * @param aStylesheetFile CSS style sheet to use */ public void setStylesheetFile(final File aStylesheetFile) { this.stylesheetFile = aStylesheetFile; } /** * @param aTemplatesPath path to template files * (should be available in classpath) */ public void setTemplates(final String aTemplatesPath) { this.templatesPath = aTemplatesPath; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() { if (destDir == null) { throw new BuildException("destdir attribute must be set!", //$NON-NLS-1$ getLocation()); } if (!destDir.exists() && !destDir.mkdirs()) { throw new BuildException("can't make " + destDir //$NON-NLS-1$ + " folder", getLocation()); //$NON-NLS-1$ } if (destDir.list().length != 0) { throw new BuildException("directory " + destDir //$NON-NLS-1$ + " is not empty", getLocation()); //$NON-NLS-1$ } initRegistry(true); try { DocGenerator docGen; if (templatesPath != null) { docGen = new DocGenerator(getRegistry(), getPathResolver(), templatesPath, encoding); } else { docGen = new DocGenerator(getRegistry(), getPathResolver()); } if (overviewFile != null) { docGen.setDocumentationOverview(getFileContent(overviewFile)); } if (stylesheetFile != null) { docGen.setStylesheet(getFileContent(stylesheetFile)); } if (docEncoding != null) { docGen.setOutputEncoding(docEncoding); } docGen.generate(destDir); log("Documentation generated to folder " + destDir); //$NON-NLS-1$ } catch (Exception e) { throw new BuildException(e); } } private String getFileContent(final File file) throws IOException { Reader reader; if (encoding != null) { reader = new BufferedReader(new InputStreamReader( new FileInputStream(file), encoding)); } else { reader = new BufferedReader(new InputStreamReader( new FileInputStream(file))); } try { StringBuilder result = new StringBuilder(); char[] buf = new char[256]; int len; while ((len = reader.read(buf)) != -1) { result.append(buf, 0, len); } return result.toString(); } finally { reader.close(); } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/VersionUpdateTask.java0000644000175000017500000004133710563415276030740 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.tools.ant.BuildException; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.Version; import org.java.plugin.util.IoUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** *

* This class can upgrade all version and plugin-version tags in all plugin * manifest files, to the latest version specified in a text file (in Java * properties format). This class also handles updating the build number in the * specified file. *

* This class will only upgrade 'version' and 'plugin-version' tags that already * exist in the manifest files, so it won't add any to the manifest files. *

* This class tracks plug-in modification timestamp's and keep them together * with versions info in the given text file. The actual plug-in version will be * upgraded only if plug-in timestamp changes. * * @author Jonathan Giles * @author Dmitry Olshansky */ public class VersionUpdateTask extends BaseJpfTask { private File versionsFile; private boolean alterReferences = false; private boolean timestampVersion = false; /** * @param value true if version references should be upgraded */ public final void setAlterReferences(final boolean value) { alterReferences = value; } /** * @param value file where to store versioning related info */ public void setVersionsFile(final File value) { versionsFile = value; } /** * @param value if true, the plug-in timestamp will be included * into version {@link Version#getName() name} attribute */ public void setTimestampVersion(final boolean value) { timestampVersion = value; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() throws BuildException { if (versionsFile == null) { throw new BuildException("versionsfile attribute must be set!", //$NON-NLS-1$ getLocation()); } initRegistry(true); // reading contents of versions file if (getVerbose()) { log("Loading versions file " + versionsFile); //$NON-NLS-1$ } Properties versions = new Properties(); if (versionsFile.exists()) { try { InputStream in = new BufferedInputStream(new FileInputStream(versionsFile)); try { versions.load(in); } finally { in.close(); } } catch (IOException ioe) { throw new BuildException("failed reading versions file " //$NON-NLS-1$ + versionsFile, ioe, getLocation()); } } else { log("Versions file " + versionsFile //$NON-NLS-1$ + " not found, new one will be created."); //$NON-NLS-1$ } Map infos = new HashMap(); // collecting manifests for (PluginDescriptor descr : getRegistry().getPluginDescriptors()) { File manifestFile = IoUtil.url2file(descr.getLocation()); if (manifestFile == null) { throw new BuildException( "non-local plug-in manifest URL given " //$NON-NLS-1$ + descr.getLocation()); } URL homeUrl = getPathResolver().resolvePath(descr, "/"); //$NON-NLS-1$ File homeFile = IoUtil.url2file(homeUrl); if (homeFile == null) { throw new BuildException( "non-local plug-in home URL given " //$NON-NLS-1$ + homeUrl); } try { infos.put(descr.getId(), new PluginInfo(descr.getId(), versions, manifestFile, homeFile, descr.getVersion())); } catch (ParseException pe) { throw new BuildException("failed parsing versions data " //$NON-NLS-1$ + " for manifest " + manifestFile, pe, getLocation()); //$NON-NLS-1$ } if (getVerbose()) { log("Collected manifest file " + manifestFile); //$NON-NLS-1$ } } for (PluginFragment descr : getRegistry().getPluginFragments()) { File manifestFile = IoUtil.url2file(descr.getLocation()); if (manifestFile == null) { throw new BuildException( "non-local plug-in fragment manifest URL given " //$NON-NLS-1$ + descr.getLocation()); } URL homeUrl = getPathResolver().resolvePath(descr, "/"); //$NON-NLS-1$ File homeFile = IoUtil.url2file(homeUrl); if (homeFile == null) { throw new BuildException( "non-local plug-in fragment home URL given " //$NON-NLS-1$ + homeUrl); } try { infos.put(descr.getId(), new PluginInfo(descr.getId(), versions, manifestFile, homeFile, descr.getVersion())); } catch (ParseException pe) { throw new BuildException("failed parsing versions data " //$NON-NLS-1$ + " for manifest " + manifestFile, pe, getLocation()); //$NON-NLS-1$ } if (getVerbose()) { log("Populated manifest file " + manifestFile); //$NON-NLS-1$ } } // processing manifest versions DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setValidating(false); DocumentBuilder builder; try { builder = builderFactory.newDocumentBuilder(); } catch (ParserConfigurationException pce) { throw new BuildException("can't obtain XML document builder ", //$NON-NLS-1$ pce, getLocation()); } if (getVerbose()) { log("Processing versions"); //$NON-NLS-1$ } for (PluginInfo info : infos.values()) { try { info.processVersion(versions, builder, timestampVersion); } catch (Exception e) { throw new BuildException("failed processing manifest " //$NON-NLS-1$ + info.getManifestFile(), e, getLocation()); } } if (alterReferences) { if (getVerbose()) { log("Processing version references"); //$NON-NLS-1$ } for (PluginInfo info : infos.values()) { try { info.processVersionReferences(versions, builder); } catch (Exception e) { throw new BuildException("failed processing manifest " //$NON-NLS-1$ + info.getManifestFile(), e, getLocation()); } } } Transformer transformer; try { transformer = TransformerFactory.newInstance().newTransformer(); } catch (TransformerConfigurationException tce) { throw new BuildException("can't obtain XML document transformer ", //$NON-NLS-1$ tce, getLocation()); } catch (TransformerFactoryConfigurationError tfce) { throw new BuildException( "can't obtain XML document transformer factory ", //$NON-NLS-1$ tfce, getLocation()); } transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.STANDALONE, "no"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//JPF//Java Plug-in Manifest 1.0"); //$NON-NLS-1$ transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://jpf.sourceforge.net/plugin_1_0.dtd"); //$NON-NLS-1$ if (getVerbose()) { log("Saving manifests"); //$NON-NLS-1$ } for (PluginInfo info : infos.values()) { try { info.save(versions, transformer); } catch (Exception e) { throw new BuildException("failed saving manifest " //$NON-NLS-1$ + info.getManifestFile(), e, getLocation()); } } // saving versions if (getVerbose()) { log("Saving versions file " + versionsFile); //$NON-NLS-1$ } try { OutputStream out = new BufferedOutputStream(new FileOutputStream(versionsFile)); try { versions.store(out, "Plug-in and plug-in fragment versions file"); //$NON-NLS-1$ } finally { out.close(); } } catch (IOException ioe) { throw new BuildException("failed writing versions file " //$NON-NLS-1$ + versionsFile, ioe, getLocation()); } log("Plug-in versions update done"); //$NON-NLS-1$ } static final class PluginInfo { private static Date getTimestamp(final File file, final Date parentTimestamp) { Date result; if (parentTimestamp == null) { result = new Date(file.lastModified()); } else { result = new Date(Math.max(parentTimestamp.getTime(), file.lastModified())); } File[] files = file.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { result = getTimestamp(files[i], result); } } return result; } private static Version upgradeVersion(final Version ver) { if (ver == null) { return new Version(0, 0, 1, null); } return new Version(ver.getMajor(), ver.getMinor(), ver.getBuild() + 1, ver.getName()); } private static Version upgradeVersion(final Version ver, final Date timestamp) { DateFormat dtf = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH); //$NON-NLS-1$ if (ver == null) { return new Version(0, 0, 1, dtf.format(timestamp)); } return new Version(ver.getMajor(), ver.getMinor(), ver.getBuild() + 1, dtf.format(timestamp)); } private final String id; private final File manifestFile; private final Version oldVersion; private final Date oldTimestamp; private final DateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); //$NON-NLS-1$ private Document doc; private Version newVersion; private Date currentTimestamp; PluginInfo(final String anId, final Properties versions, final File aMnifestFile, final File homeFile, final Version currentVersion) throws ParseException { id = anId; String versionStr = versions.getProperty(anId, null); String timestampStr = versions.getProperty(anId + ".timestamp", null); //$NON-NLS-1$ if (versionStr != null) { oldVersion = Version.parse(versionStr); } else { oldVersion = currentVersion; } if (timestampStr != null) { oldTimestamp = dtf.parse(timestampStr); } else { oldTimestamp = null; } manifestFile = aMnifestFile; currentTimestamp = getTimestamp(homeFile, null); versions.setProperty(id + ".timestamp", //$NON-NLS-1$ dtf.format(currentTimestamp)); } File getManifestFile() { return manifestFile; } void processVersion(final Properties versions, final DocumentBuilder builder, final boolean timestampVersion) throws Exception { if (IoUtil.compareFileDates(oldTimestamp, currentTimestamp)) { newVersion = oldVersion; } else { newVersion = !timestampVersion ? upgradeVersion(oldVersion) : upgradeVersion(oldVersion, currentTimestamp); } versions.setProperty(id, newVersion.toString()); if (oldVersion.equals(newVersion)) { return; } doc = builder.parse(manifestFile); Element root = doc.getDocumentElement(); if (root.hasAttribute("version")) { //$NON-NLS-1$ root.setAttribute("version", newVersion.toString()); //$NON-NLS-1$ } } void processVersionReferences(final Properties versions, final DocumentBuilder builder) throws Exception { if (doc == null) { doc = builder.parse(manifestFile); } Element root = doc.getDocumentElement(); if ("plugin-fragment".equals(root.getNodeName())) { //$NON-NLS-1$ processVersionReference(versions, root); } NodeList imports = root.getElementsByTagName("import"); //$NON-NLS-1$ for (int i = 0; i < imports.getLength(); i++) { processVersionReference(versions, (Element) imports.item(i)); } } private void processVersionReference(final Properties versions, final Element elm) { if (!elm.hasAttribute("plugin-version")) { //$NON-NLS-1$ return; } String version = versions.getProperty( elm.getAttribute("plugin-id"), id); //$NON-NLS-1$ if (version != null) { elm.setAttribute("plugin-version", version); //$NON-NLS-1$ } } void save(final Properties versions, final Transformer transformer) throws Exception { if (doc == null) { return; } long modified = manifestFile.lastModified(); transformer.transform(new DOMSource(doc), new StreamResult(manifestFile)); manifestFile.setLastModified(modified); } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/SortTask.java0000644000175000017500000001747310621652204027070 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.Path; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.UniqueIdentity; import org.java.plugin.util.IoUtil; /** * The Ant task to sort plug-ins and plug-in fragments in correct build order. * * @version $Id: SortTask.java,v 1.2 2007/05/13 16:10:12 ddimon Exp $ */ public class SortTask extends BaseJpfTask { /** * Put plug-in directory into output path. */ public static final String MODE_DIR = "DIR"; //$NON-NLS-1$ /** * Put plug-in's build.xml file into output path. */ public static final String MODE_BUILD = "BUILD"; //$NON-NLS-1$ /** * Put original plug-in manifest file into output path. */ public static final String MODE_MANIFEST = "MANIFEST"; //$NON-NLS-1$ private String pathId; private String pathIdRef; private String pathMode = MODE_MANIFEST; private boolean reverse; /** * @param value the path ID to set */ public void setPathId(final String value) { pathId = value; } /** * @param value the path ID reference to set */ public void setPathIdRef(final String value) { pathIdRef = value; } /** * @param value the output path mode to set (DIR, BUILD, MANIFEST) */ public void setPathMode(final String value) { pathMode = value; } /** * @param value sets the reverse sort order */ public void setReverse(final boolean value) { reverse = value; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() throws BuildException { if ((pathId == null) && (pathIdRef == null)) { throw new BuildException( "pathid or pathidref attribute must be set!", //$NON-NLS-1$ getLocation()); } initRegistry(true); List descriptors = new ArrayList( getRegistry().getPluginDescriptors()); reorder(descriptors); Collection fragments = getRegistry().getPluginFragments(); List manifests = new ArrayList( descriptors.size() + fragments.size()); manifests.addAll(descriptors); for (PluginFragment fragment : fragments) { int p = manifests.indexOf( getRegistry().getPluginDescriptor(fragment.getPluginId())); if (p == -1) { p = manifests.size() - 1; } manifests.add(p + 1, fragment); } if (reverse) { Collections.reverse(manifests); } Path path; if (pathIdRef != null) { Object ref = getProject().getReference(pathIdRef); if (!(ref instanceof Path)) { throw new BuildException( "invalid reference " + pathIdRef //$NON-NLS-1$ + ", expected " + Path.class.getName() //$NON-NLS-1$ + ", found " + ref, //$NON-NLS-1$ getLocation()); } path = (Path) ref; } else { path = new Path(getProject()); getProject().addReference(pathId, path); } int count = 0; for (UniqueIdentity idt : manifests) { URL url; if (idt instanceof PluginFragment) { url = ((PluginFragment) idt).getLocation(); } else { url = ((PluginDescriptor) idt).getLocation(); } File file = getResultFile(url); if (file == null) { continue; } path.setLocation(file); count++; if (getVerbose()) { log("Collected file " + file //$NON-NLS-1$ + " for manifest " + url //$NON-NLS-1$ + " (" + idt + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } } if (getVerbose()) { log("Collected path entries: " + count); //$NON-NLS-1$ } } /** * @param manifestUrl plug-in or plug-in fragment manifest URL * @return file to be included in result path */ protected File getResultFile(final URL manifestUrl) { File manifestFile = IoUtil.url2file(manifestUrl); if (manifestFile == null) { log("Ignoring non-local URL " + manifestUrl); //$NON-NLS-1$ return null; } if (MODE_MANIFEST.equalsIgnoreCase(pathMode)) { return manifestFile; } if (MODE_DIR.equalsIgnoreCase(pathMode)) { return manifestFile.getParentFile(); } if (MODE_BUILD.equalsIgnoreCase(pathMode)) { return new File(manifestFile.getParentFile(), "build.xml"); //$NON-NLS-1$ } return manifestFile; } protected void reorder(final List descriptors) { for (int i = 0; i < descriptors.size(); i++) { for (int j = i + 1; j < descriptors.size(); j++) { if (isDepends(descriptors.get(i), descriptors.get(j))) { Collections.swap(descriptors, i, j); i = -1; break; } } } } private boolean isDepends(final PluginDescriptor descr1, final PluginDescriptor descr2) { // Circular (mutual) dependencies are treated as absence of dependency // at all. Set pre1 = new HashSet(); Set pre2 = new HashSet(); collectPrerequisites(descr1, pre1); collectPrerequisites(descr2, pre2); return pre1.contains(descr2) && !pre2.contains(descr1); } private void collectPrerequisites(final PluginDescriptor descr, final Set result) { for (PluginPrerequisite pre : descr.getPrerequisites()) { if (!pre.matches()) { continue; } PluginDescriptor descriptor = getRegistry().getPluginDescriptor(pre.getPluginId()); if (result.add(descriptor)) { collectPrerequisites(descriptor, result); } } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/BaseJpfTask.java0000644000175000017500000002625710572344612027461 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.util.FileUtils; import org.java.plugin.ObjectFactory; import org.java.plugin.PathResolver; import org.java.plugin.registry.Identity; import org.java.plugin.registry.ManifestInfo; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.util.IoUtil; /** * Base class for some JPF related ant tasks. * @version $Id: BaseJpfTask.java,v 1.8 2007/03/03 17:16:26 ddimon Exp $ */ public abstract class BaseJpfTask extends MatchingTask { private static final FileUtils fileUtils = FileUtils.newFileUtils(); private final LinkedList fileSets = new LinkedList(); private File baseDir; private boolean verbose; private PluginRegistry registry; private PathResolver pathResolver; private Set whiteList; private Set blackList; /** * @param set the set of files to be registered as manifests */ public void addFileset(final FileSet set) { fileSets.add(set); } /** * @param aBaseDir base directory for manifest files */ public final void setBaseDir(final File aBaseDir) { this.baseDir = aBaseDir; } /** * @param aVerbose true if detailed integrity check report * required */ public final void setVerbose(final boolean aVerbose) { this.verbose = aVerbose; } /** * @param file while list file * @throws IOException if list reading failed */ public final void setWhiteList(final File file) throws IOException { whiteList = loadList(file); } /** * @param file black list file * @throws IOException if list reading failed */ public final void setBlackList(final File file) throws IOException { blackList = loadList(file); } protected Set loadList(final File file) throws IOException { if (file == null) { return null; } Set result = new HashSet(); BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(file), "UTF-8")); //$NON-NLS-1$ try { String line; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.length() > 0) { result.add(line); } } } finally { reader.close(); } return result; } protected final boolean getVerbose() { return verbose; } protected final PathResolver getPathResolver() { return pathResolver; } protected final PluginRegistry getRegistry() { return registry; } protected Set getWhiteList() { return whiteList; } protected Set getBlackList() { return blackList; } protected final void initRegistry(final boolean usePathResolver) { if (baseDir != null) { if (!baseDir.isDirectory()) { throw new BuildException("basedir " + baseDir //$NON-NLS-1$ + " does not exist!", getLocation()); //$NON-NLS-1$ } } else { baseDir = getProject().getBaseDir(); } ObjectFactory objectFactory = ObjectFactory.newInstance(); registry = objectFactory.createRegistry(); File[] manifestFiles = getIncludedFiles(); List manifestUrls = new LinkedList(); final Map foldersMap = new HashMap(); for (int i = 0; i < manifestFiles.length; i++) { File manifestFile = manifestFiles[i]; try { //manifestUrls[i] = IoUtil.file2url(manifestFile); URL manifestUrl = getManifestURL(manifestFile); if (manifestUrl == null) { if (verbose) { log("Skipped file: " + manifestFile); //$NON-NLS-1$ } continue; } try { if (!isManifestAccepted(manifestUrl)) { if (verbose) { log("Skipped URL: " + manifestUrl); //$NON-NLS-1$ } continue; } } catch (ManifestProcessingException mpe) { throw new BuildException("can't read manifest from URL " //$NON-NLS-1$ + manifestUrl, mpe, getLocation()); } manifestUrls.add(manifestUrl); if (verbose) { log("Added URL: " + manifestUrl); //$NON-NLS-1$ } if (usePathResolver) { /*foldersMap.put(manifestUrls[i], IoUtil.file2url(manifestFile.getParentFile()));*/ if ("jar".equals(manifestUrl.getProtocol())) { //$NON-NLS-1$ foldersMap.put(manifestUrl.toExternalForm(), IoUtil.file2url(manifestFile)); } else { foldersMap.put(manifestUrl.toExternalForm(), IoUtil.file2url(manifestFile.getParentFile())); } } } catch (MalformedURLException mue) { throw new BuildException("can't create URL for file " //$NON-NLS-1$ + manifestFile, mue, getLocation()); } } final Map processedPlugins; try { processedPlugins = registry.register( manifestUrls.toArray(new URL[manifestUrls.size()])); } catch (Exception e) { throw new BuildException("can't register URLs", e, getLocation()); //$NON-NLS-1$ } log("Registry initialized, registered manifests: " //$NON-NLS-1$ + processedPlugins.size() + " of " + manifestUrls.size(), //$NON-NLS-1$ (processedPlugins.size() != manifestUrls.size()) ? Project.MSG_WARN : Project.MSG_INFO); if (usePathResolver) { pathResolver = objectFactory.createPathResolver(); for (Entry entry : processedPlugins.entrySet()) { pathResolver.registerContext(entry.getValue(), foldersMap.get(entry.getKey())); } if (verbose) { log("Path resolver initialized"); //$NON-NLS-1$ } } } protected File[] getIncludedFiles() { Set result = new HashSet(); for (FileSet fs : fileSets) { for (String file : fs.getDirectoryScanner(getProject()).getIncludedFiles()) { if (file != null) { result.add(fileUtils.resolveFile( fs.getDir(getProject()), file)); } } } if (fileSets.isEmpty()) { for (String file : getDirectoryScanner(baseDir).getIncludedFiles()) { if (file != null) { result.add(fileUtils.resolveFile(baseDir, file)); } } } return result.toArray(new File[result.size()]); } protected URL getManifestURL(final File file) throws MalformedURLException { if(file.getName().endsWith(".jar") || file.getName().endsWith(".zip")) { //$NON-NLS-1$ //$NON-NLS-2$ URL url = new URL("jar:" + IoUtil.file2url(file).toExternalForm() //$NON-NLS-1$ + "!/plugin.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } url = new URL("jar:" + IoUtil.file2url(file).toExternalForm() //$NON-NLS-1$ + "!/plugin-fragment.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } url = new URL("jar:" + IoUtil.file2url(file).toExternalForm() //$NON-NLS-1$ + "!/META-INF/plugin.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } url = new URL("jar:" + IoUtil.file2url(file).toExternalForm() //$NON-NLS-1$ + "!/META-INF/plugin-fragment.xml"); //$NON-NLS-1$ if (IoUtil.isResourceExists(url)) { return url; } return null; } return IoUtil.file2url(file); } protected boolean isManifestAccepted(final URL manifestUrl) throws ManifestProcessingException { if ((whiteList == null) && (blackList == null)) { return true; } ManifestInfo manifestInfo = registry.readManifestInfo(manifestUrl); if (whiteList != null) { if (isPluginInList(manifestInfo, whiteList)) { return true; } } if ((blackList != null) && isPluginInList(manifestInfo, blackList)) { return false; } return true; } private boolean isPluginInList(final ManifestInfo manifestInfo, final Set list) { if (list.contains(manifestInfo.getId())) { return true; } return list.contains(registry.makeUniqueId(manifestInfo.getId(), manifestInfo.getVersion())); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/ant/PackTask.java0000644000175000017500000000400310563414516027007 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.ant; import java.io.File; import org.apache.tools.ant.BuildException; import org.java.plugin.tools.PluginArchiver; /** * The ant task for creating plug-ins archive file. * @version $Id$ */ public final class PackTask extends BaseJpfTask { private File destFile; /** * @param aDestFile target archive file */ public void setDestFile(final File aDestFile) { this.destFile = aDestFile; } /** * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() { if (destFile == null) { throw new BuildException("destfile attribute must be set!", //$NON-NLS-1$ getLocation()); } initRegistry(true); try { PluginArchiver.pack(getRegistry(), getPathResolver(), destFile); log("Plug-ins archive created in file " + destFile); //$NON-NLS-1$ } catch (Exception e) { throw new BuildException(e); } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/package.html0000644000175000017500000000011710536120574026142 0ustar gregoagregoa

General plug-in tools related classes.

libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/Util.java0000644000175000017500000000644110536120574025447 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2006 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.util.IoUtil; /** * @version $Id$ */ final class Util { private static Log log = LogFactory.getLog(Util.class); private static File tempFolder; private static boolean tempFolderInitialized = false; static File getTempFolder() throws IOException { if (tempFolder != null) { return tempFolderInitialized ? tempFolder : null; } synchronized (Util.class) { tempFolder = new File(System.getProperty("java.io.tmpdir"), //$NON-NLS-1$ System.currentTimeMillis() + ".jpf-tool-cache"); //$NON-NLS-1$ log.debug("libraries cache folder is " + tempFolder); //$NON-NLS-1$ File lockFile = new File(tempFolder, "lock"); //$NON-NLS-1$ if (lockFile.exists()) { throw new IOException("can't initialize temporary folder " //$NON-NLS-1$ + tempFolder + " as lock file indicates that it is " //$NON-NLS-1$ + "owned by another JPF instance"); //$NON-NLS-1$ } if (tempFolder.exists()) { // clean up folder IoUtil.emptyFolder(tempFolder); } else { tempFolder.mkdirs(); } if (!lockFile.createNewFile()) { throw new IOException("can\'t create lock file in JPF " //$NON-NLS-1$ + "tool temporary folder " + tempFolder); //$NON-NLS-1$ } lockFile.deleteOnExit(); tempFolder.deleteOnExit(); tempFolderInitialized = true; } return tempFolder; } static byte[] readUrlContent(final URL url) throws IOException { ByteArrayOutputStream result = new ByteArrayOutputStream(); InputStream urlStrm = url.openStream(); try { IoUtil.copyStream(urlStrm, result, 256); } finally { urlStrm.close(); } return result.toByteArray(); } private Util() { // no-op } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/PluginArchiver.java0000644000175000017500000006415710536120574027464 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2006 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; import java.net.URL; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import org.java.plugin.ObjectFactory; import org.java.plugin.PathResolver; import org.java.plugin.registry.Identity; import org.java.plugin.registry.ManifestProcessingException; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; import org.java.plugin.util.IoUtil; /** * Plug-ins archive support class. * @version $Id$ */ public final class PluginArchiver { private static final String DESCRIPTOR_ENTRY_NAME = "JPF-DESCRIPTOR"; //$NON-NLS-1$ /** * Packs given plug-in into single ZIP file. Resulting file may be used to * run plug-ins from. * @param descr plug-in descriptor * @param pathResolver path resolver instance * @param destFile target file * @throws IOException if an I/O error has occurred */ public static void pack(final PluginDescriptor descr, final PathResolver pathResolver, final File destFile) throws IOException { pack(pathResolver.resolvePath(descr, "/"), //$NON-NLS-1$ "JPF plug-in "+ descr.getId() //$NON-NLS-1$ + " of version " + descr.getVersion(), destFile); //$NON-NLS-1$ } /** * Packs given plug-in fragment into single ZIP file. Resulting file may be * used to run plug-ins from. * @param fragment plug-in fragment descriptor * @param pathResolver path resolver instance * @param destFile target file * @throws IOException if an I/O error has occurred */ public static void pack(final PluginFragment fragment, final PathResolver pathResolver, final File destFile) throws IOException { pack(pathResolver.resolvePath(fragment, "/"), //$NON-NLS-1$ "JPF plug-in fragment "+ fragment.getId() //$NON-NLS-1$ + " of version " + fragment.getVersion(), destFile); //$NON-NLS-1$ } private static void pack(final URL url, final String comment, final File destFile) throws IOException { ZipOutputStream zipStrm = new ZipOutputStream( new BufferedOutputStream(new FileOutputStream( destFile, false))); try { zipStrm.setComment(comment); File file = IoUtil.url2file(url); if (file == null) { throw new IOException("resolved URL " + url //$NON-NLS-1$ + " is not local file system location pointer"); //$NON-NLS-1$ } File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { packEntry(zipStrm, null, files[i]); } } finally { zipStrm.close(); } } /** * Packs all plug-ins from given registry as one archive file. * @param registry plug-ins registry * @param pathResolver path resolver (only local file URLs are supported) * @param destFile target archive file (will be overridden if any exists) * @return set of UID's of all packed plug-ins * @throws IOException if an I/O error has occurred */ public static Set pack(final PluginRegistry registry, final PathResolver pathResolver, final File destFile) throws IOException { return pack(registry, pathResolver, destFile, new Filter() { public boolean accept(final String id, final Version version, final boolean isFragment) { return true; } }); } /** * Packs plug-ins from given registry as one archive file according to * given filter. * @param registry plug-ins registry * @param pathResolver path resolver (only local file URLs are supported) * @param destFile target archive file (will be overridden if any exists) * @param filter filter to be used when packing plug-ins * @return set of UID's of all packed plug-ins * @throws IOException if an I/O error has occurred */ public static Set pack(final PluginRegistry registry, final PathResolver pathResolver, final File destFile, final Filter filter) throws IOException { Set result; ZipOutputStream zipStrm = new ZipOutputStream( new BufferedOutputStream(new FileOutputStream( destFile, false))); try { zipStrm.setComment("JPF plug-ins archive"); //$NON-NLS-1$ ZipEntry entry = new ZipEntry(DESCRIPTOR_ENTRY_NAME); entry.setComment("JPF plug-ins archive descriptor"); //$NON-NLS-1$ zipStrm.putNextEntry(entry); result = writeDescripor(registry, filter, new ObjectOutputStream(zipStrm)); zipStrm.closeEntry(); for (PluginDescriptor descr : registry.getPluginDescriptors()) { if (!result.contains(descr.getUniqueId())) { continue; } URL url = pathResolver.resolvePath(descr, "/"); //$NON-NLS-1$ File file = IoUtil.url2file(url); if (file == null) { throw new IOException("resolved URL " + url //$NON-NLS-1$ + " is not local file system location pointer"); //$NON-NLS-1$ } entry = new ZipEntry(descr.getUniqueId() + "/"); //$NON-NLS-1$ entry.setComment("Content for JPF plug-in " //$NON-NLS-1$ + descr.getId() + " version " + descr.getVersion()); //$NON-NLS-1$ entry.setTime(file.lastModified()); zipStrm.putNextEntry(entry); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { packEntry(zipStrm, entry, files[i]); } } for (PluginFragment fragment : registry.getPluginFragments()) { if (!result.contains(fragment.getUniqueId())) { continue; } URL url = pathResolver.resolvePath(fragment, "/"); //$NON-NLS-1$ File file = IoUtil.url2file(url); if (file == null) { throw new IOException("resolved URL " + url //$NON-NLS-1$ + " is not local file system location pointer"); //$NON-NLS-1$ } entry = new ZipEntry(fragment.getUniqueId() + "/"); //$NON-NLS-1$ entry.setComment("Content for JPF plug-in fragment " //$NON-NLS-1$ + fragment.getId() + " version " //$NON-NLS-1$ + fragment.getVersion()); entry.setTime(file.lastModified()); zipStrm.putNextEntry(entry); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { packEntry(zipStrm, entry, files[i]); } } } finally { zipStrm.close(); } return result; } private static void packEntry(final ZipOutputStream zipStrm, final ZipEntry parentEntry, final File file) throws IOException { String parentEntryName = (parentEntry == null) ? "" //$NON-NLS-1$ : parentEntry.getName(); if (file.isFile()) { ZipEntry entry = new ZipEntry(parentEntryName + file.getName()); entry.setTime(file.lastModified()); zipStrm.putNextEntry(entry); BufferedInputStream fileStrm = new BufferedInputStream( new FileInputStream(file)); try { IoUtil.copyStream(fileStrm, zipStrm, 1024); } finally { fileStrm.close(); } return; } ZipEntry entry = new ZipEntry(parentEntryName + file.getName() + "/"); //$NON-NLS-1$ entry.setTime(file.lastModified()); zipStrm.putNextEntry(entry); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { packEntry(zipStrm, entry, files[i]); } } /** * Extracts plug-ins from the given archive file. * @param archiveFile plug-in archive file * @param registry plug-in registry where to register manifests for * unpacked plug-ins * @param destFolder target folder * @return set of UID's of all un-packed (and registered) plug-ins * @throws IOException if an I/O error has occurred * @throws ClassNotFoundException if descriptor can't be read * @throws ManifestProcessingException if manifest can't be registered * (optional behavior) * * @see #unpack(URL, PluginRegistry, File, PluginArchiver.Filter) */ public static Set unpack(final URL archiveFile, final PluginRegistry registry, final File destFolder) throws ManifestProcessingException, IOException, ClassNotFoundException { return unpack(archiveFile, registry, destFolder, new Filter() { public boolean accept(final String id, final Version version, final boolean isFragment) { return true; } }); } /** * Extracts plug-ins from the given archive file. *
* Note: *
* In the current implementation all plug-in manifests are extracted to * temporary local storage and deleted immediately after their registration * with plug-in registry. So manifest URL's are actually point to "fake" * locations. * @param archiveFile plug-in archive file * @param registry plug-in registry where to register manifests for * unpacked plug-ins * @param destFolder target folder * @param filter filter to be used when un-packing plug-ins * @return set of UID's of all un-packed (and registered) plug-ins * @throws ClassNotFoundException if plug-ins archive descriptor can't be * de-serialized * @throws ManifestProcessingException if plug-in manifests can't be * registered * @throws IOException if archive damaged or I/O error has occurred */ public static Set unpack(final URL archiveFile, final PluginRegistry registry, final File destFolder, final Filter filter) throws IOException, ManifestProcessingException, ClassNotFoundException { Set result; int count = 0; ZipInputStream zipStrm = new ZipInputStream(new BufferedInputStream( archiveFile.openStream())); try { ZipEntry entry = zipStrm.getNextEntry(); //NB: we are expecting that descriptor is in the first ZIP entry if (entry == null) { throw new IOException( "invalid plug-ins archive, no entries found"); //$NON-NLS-1$ } if (!DESCRIPTOR_ENTRY_NAME.equals(entry.getName())) { throw new IOException("invalid plug-ins archive " + archiveFile //$NON-NLS-1$ + ", entry " + DESCRIPTOR_ENTRY_NAME //$NON-NLS-1$ + " not found as first ZIP entry in the archive file"); //$NON-NLS-1$ } ObjectInputStream strm = new ObjectInputStream(zipStrm); result = readDescriptor(strm, registry, destFolder, filter); entry = zipStrm.getNextEntry(); while (entry != null) { String name = entry.getName(); if (name.endsWith("/") //$NON-NLS-1$ && (name.lastIndexOf('/', name.length() - 2) == -1)) { String uid = name.substring(0, name.length() - 1); if (!result.contains(uid)) { entry = zipStrm.getNextEntry(); continue; } count++; } else { int p = name.indexOf('/'); if ((p == -1) || (p == 0) || !result.contains(name.substring(0, p))) { entry = zipStrm.getNextEntry(); continue; } } unpackEntry(zipStrm, entry, destFolder); entry = zipStrm.getNextEntry(); } } finally { zipStrm.close(); } if (result.size() != count) { throw new IOException("invalid plug-ins number (" + count //$NON-NLS-1$ + ") found in the archive, expected number according to " //$NON-NLS-1$ + "the archive descriptor is " + result.size()); //$NON-NLS-1$ } return result; } /** * Extracts all plug-ins from the given archive file. *
* Note: *
* {@link ObjectFactory#createRegistry() Standard plug-in registry} * implementation will be used internally to read plug-in manifests. * @param archiveFile plug-in archive file * @param destFolder target folder * @return set of UID's of all un-packed plug-ins * @throws IOException if an I/O error has occurred * @throws ClassNotFoundException if descriptor can't be read * @throws ManifestProcessingException if manifest can't be registered * (optional behavior) * * @see ObjectFactory#createRegistry() */ public static Set unpack(final URL archiveFile, final File destFolder) throws ManifestProcessingException, IOException, ClassNotFoundException { return unpack(archiveFile, ObjectFactory.newInstance().createRegistry(), destFolder); } /** * Extracts plug-ins from the given archive file according to given filter. *
* Note: *
* {@link ObjectFactory#createRegistry() Standard plug-in registry} * implementation will be used internally to read plug-in manifests. * @param archiveFile plug-in archive file * @param destFolder target folder * @param filter filter to be used when un-packing plug-ins * @return set of UID's of all un-packed plug-ins * @throws IOException if an I/O error has occurred * @throws ClassNotFoundException if descriptor can't be read * @throws ManifestProcessingException if manifest can't be registered * (optional behavior) */ public static Set unpack(final URL archiveFile, final File destFolder, final Filter filter) throws ManifestProcessingException, IOException, ClassNotFoundException { return unpack(archiveFile, ObjectFactory.newInstance().createRegistry(), destFolder, filter); } private static void unpackEntry(final ZipInputStream zipStrm, final ZipEntry entry, final File destFolder) throws IOException { String name = entry.getName(); if (name.endsWith("/")) { //$NON-NLS-1$ File folder = new File(destFolder.getCanonicalPath() + "/" + name); //$NON-NLS-1$ if (!folder.exists() && !folder.mkdirs()) { throw new IOException("can't create folder " + folder); //$NON-NLS-1$ } folder.setLastModified(entry.getTime()); return; } File file = new File(destFolder.getCanonicalPath() + "/" + name); //$NON-NLS-1$ File folder = file.getParentFile(); if (!folder.exists() && !folder.mkdirs()) { throw new IOException("can't create folder " + folder); //$NON-NLS-1$ } OutputStream strm = new BufferedOutputStream( new FileOutputStream(file, false)); try { IoUtil.copyStream(zipStrm, strm, 1024); } finally { strm.close(); } file.setLastModified(entry.getTime()); } /** * Reads meta-information from plug-ins archive file and registers found * plug-in manifest data with given registry for future analysis. * @param archiveFile plug-in archive file * @param registry plug-in registry where to register discovered manifests * for archived plug-ins * @return set of UID's of all registered plug-ins * @throws IOException if an I/O error has occurred * @throws ClassNotFoundException if descriptor can't be read * @throws ManifestProcessingException if manifest can't be registered * (optional behavior) * * @see #readDescriptor(URL, PluginRegistry, PluginArchiver.Filter) */ public static Set readDescriptor(final URL archiveFile, final PluginRegistry registry) throws IOException, ClassNotFoundException, ManifestProcessingException { return readDescriptor(archiveFile, registry, new Filter() { public boolean accept(final String id, final Version version, final boolean isFragment) { return true; } }); } /** * Reads meta-information from plug-ins archive file and registers found * plug-in manifest data with given registry for future analysis. *
* Note: *
* In the current implementation all plug-in manifests are extracted to * temporary local storage and deleted immediately after their registration * with plug-in registry. So manifest URL's are actually point to "fake" * locations and main purpose of this method is to allow you to analyze * plug-ins archive without needing to download and unpack it. * @param archiveFile plug-in archive file * @param registry plug-in registry where to register discovered manifests * for archived plug-ins * @param filter filter to be used when un-packing plug-ins * @return set of UID's of all registered plug-ins * @throws IOException if an I/O error has occurred * @throws ClassNotFoundException if descriptor can't be read * @throws ManifestProcessingException if manifest can't be registered * (optional behavior) */ public static Set readDescriptor(final URL archiveFile, final PluginRegistry registry, final Filter filter) throws IOException, ClassNotFoundException, ManifestProcessingException { ZipInputStream zipStrm = new ZipInputStream(new BufferedInputStream( archiveFile.openStream())); try { ZipEntry entry = zipStrm.getNextEntry(); //NB: we are expecting that descriptor is in the first ZIP entry if (entry == null) { throw new IOException( "invalid plug-ins archive, no entries found"); //$NON-NLS-1$ } if (!DESCRIPTOR_ENTRY_NAME.equals(entry.getName())) { throw new IOException("invalid plug-ins archive " + archiveFile //$NON-NLS-1$ + ", entry " + DESCRIPTOR_ENTRY_NAME //$NON-NLS-1$ + " not found as first ZIP entry in the archive file"); //$NON-NLS-1$ } ObjectInputStream strm = new ObjectInputStream(zipStrm); return readDescriptor(strm, registry, Util.getTempFolder(), filter); } finally { zipStrm.close(); } } private static Set writeDescripor(final PluginRegistry registry, final Filter filter, final ObjectOutputStream strm) throws IOException { final Map result = new HashMap(); for (PluginDescriptor descr : registry.getPluginDescriptors()) { if (!filter.accept(descr.getId(), descr.getVersion(), false)) { continue; } result.put(descr.getUniqueId(), new ArchiveDescriptorEntry(descr.getId(), descr.getVersion(), false, Util.readUrlContent(descr.getLocation()))); } for (PluginFragment fragment : registry.getPluginFragments()) { if (!filter.accept(fragment.getId(), fragment.getVersion(), true)) { continue; } result.put(fragment.getUniqueId(), new ArchiveDescriptorEntry(fragment.getId(), fragment.getVersion(), true, Util.readUrlContent(fragment.getLocation()))); } strm.writeObject(result.values().toArray( new ArchiveDescriptorEntry[result.size()])); return result.keySet(); } private static Set readDescriptor(final ObjectInputStream strm, final PluginRegistry registry, final File tempFolder, final Filter filter) throws IOException, ClassNotFoundException, ManifestProcessingException { ArchiveDescriptorEntry[] data = (ArchiveDescriptorEntry[]) strm.readObject(); // For simplicity we'll store manifests to a temporary files rather than // create special URL's and provide special URL handler for them. // More powerful approach will be possibly implemented in the future. Set urls = new HashSet(); Set files = new HashSet(); for (int i = 0; i < data.length; i++) { if (!filter.accept(data[i].getId(), data[i].getVersion(), data[i].isFragment())) { continue; } File file = File.createTempFile("manifest.", null, tempFolder); //$NON-NLS-1$ file.deleteOnExit(); OutputStream fileStrm = new BufferedOutputStream( new FileOutputStream(file, false)); try { fileStrm.write(data[i].getData()); } finally { fileStrm.close(); } files.add(file); urls.add(IoUtil.file2url(file)); } Set result = new HashSet(); try { for (Identity obj : registry.register(urls.toArray( new URL[urls.size()])).values()) { if (obj instanceof PluginDescriptor) { result.add(((PluginDescriptor) obj).getUniqueId()); } else if (obj instanceof PluginFragment) { result.add(((PluginFragment) obj).getUniqueId()); } else { //NB: ignore all other elements } } } finally { for (File file : files) { file.delete(); } } return result; } private PluginArchiver() { // no-op } /** * Callback interface to filter plug-ins being processed. * @version $Id$ */ public static interface Filter { /** * @param id plug-in or plug-in fragment identifier * @param version plug-in or plug-in fragment version * @param isFragment true if given identity data * corresponds to plug-in fragment * @return true if plug-in or plug-in fragment with given * identity should be taken into account */ boolean accept(String id, Version version, boolean isFragment); } private static class ArchiveDescriptorEntry implements Serializable { private static final long serialVersionUID = 8749937247555974932L; private final String id; private final Version version; private final boolean isFragment; private final byte[] data; protected ArchiveDescriptorEntry(final String anId, final Version aVersion, final boolean fragment, final byte[] aData) { id = anId; version = aVersion; isFragment = fragment; data = aData; } protected String getId() { return id; } protected Version getVersion() { return version; } protected boolean isFragment() { return isFragment; } protected byte[] getData() { return data; } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/0000755000175000017500000000000010541226150025112 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/0000755000175000017500000000000010541226150027110 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/plugin.jxp0000644000175000017500000000552410541226150031137 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> Plug-in - <%= descriptor.getId() %>

Plug-in details

ID: <%= descriptor.getId() %>
Version: <%= descriptor.getVersion() %>
Vendor: <%= descriptor.getVendor() %>

<% printDoc(tool, descriptor); %>

Fragments

Attributes

    <% for (PluginAttribute attr : descriptor.getAttributes()) { %>
  • <% printAttr(tool, attr); %>
  • <% } %>

Prerequisites

Libraries

    <% for (Library lib : descriptor.getLibraries()) { %>
  • <%= lib.getId() %>: <%= lib.getPath() %>   <%= lib.isCodeLibrary() ? "[code]" : "[resources]" %> <%= (lib.getVersion() != null) ? "   " + lib.getVersion() : "" %>
    <% if (!lib.getExports().isEmpty()) { %>
      <% for (String export : lib.getExports()) { %>
    • <%= export %>
    • <% } %>
    <% } %> <% printDoc(tool, lib); %>
  • <% } %>

Extension points

Extensions

Depended plugins

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/overview.jxp0000644000175000017500000000161210541226150031501 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% include("functions.ijxp"); %> Plug-ins Overview

Plug-ins Overview

<%= tool.processDocText(overview) %>

Short Statistics

Plug-ins: <%= allPluginDescriptors.size() %>
Plug-in fragments: <%= allPluginFragments.size() %>
Extension points: <%= allExtensionPoints.size() %>
Extensions: <%= allExtensions.size() %>

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/allfragments.jxp0000644000175000017500000000164710541226150032322 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> All Plug-in Fragments

All Plug-in Fragments List

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/extpoint.jxp0000644000175000017500000000527310541226150031514 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> Extension Point - <%= extPoint.getId() %>

Extension point details

Plugin: <%= extPoint.getDeclaringPluginDescriptor().getId() %> version <%= extPoint.getDeclaringPluginDescriptor().getVersion() %>
Extension point ID: <%= extPoint.getId() %>
Multiplicity: <%= extPoint.getMultiplicity() %>
<% if (extPoint.getParentExtensionPointId() != null) { %> Parent extension point: <%= extPoint.getParentExtensionPointId() %> in <%= extPoint.getParentPluginId() %>
<% } %>

<% printDoc(tool, extPoint); %>
Parameter definitions
<% boolean isOdd = true; %> <% for (ExtensionPoint.ParameterDefinition def : extPoint.getParameterDefinitions()) { printParamTableRow(tool, def, 1, isOdd); isOdd = !isOdd; } %>
NameTypeMultiplicityDocumentation
Connected extensions
Descended extension points
<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/allplugins.jxp0000644000175000017500000000142010541226150032002 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> All Plug-ins

All Plug-ins List

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/allexts.jxp0000644000175000017500000000215210541226150031307 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> All Extensions

All Extensions List

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/fragment.jxp0000644000175000017500000000204310541226150031435 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> Plug-in fragment - <%= fragment.getId() %>

Plug-in fragment details

ID: <%= fragment.getId() %>
Version: <%= fragment.getVersion() %>
Vendor: <%= fragment.getVendor() %>
Contributes to plug-in: <%= fragment.getPluginId() %><% if (fragment.getPluginVersion() != null) { %> version <%= fragment.getPluginVersion() %><% } else { %> of any version<% } %>

<% printDoc(tool, fragment); %> <% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/menu.jxp0000644000175000017500000000223110541226150030575 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> Menu
libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/stylesheet.jxp0000644000175000017500000000341410541226150032026 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> /* JPF documentation style sheet */ BODY { margin : 10; background-color : White; color : Black; font-size : 100%; font-family : Arial, Helvetica, sans-serif; } H1 { padding: .3em 1em .3em 1em; font-size : 130%; font-weight: bold; } H2 { padding: .3em 1em .3em 1em; font-size : 120%; font-weight: bold; } H3 { padding: .2em 1em .2em 1em; font-size : 120%; font-weight: normal; } H4 { font-size : 110%; font-weight: bold; margin: .5em 1em .5em 1em; } H5 { font-size : 110%; font-weight: normal; margin: .5em 1em .5em 1em; } H6 { font-size : 100%; font-weight: bold; margin: .5em 1em .5em 1em; } TABLE { background-color : White; color : Black; font-size : 100%; font-family : Arial, Helvetica, sans-serif; } P { font-size : 100%; font-family : Arial, Helvetica, sans-serif; margin: .5em .7em .7em .7em; } A, A:ACTIVE, A:FOCUS, A:LINK, A:VISITED { color : #0000CC; text-decoration : none; } A:HOVER { color : #0066FF; text-decoration : none; } HR { width : 100%; height : 1px; color : Black; margin: 1em 0 1em 0; } PRE { border : 1px outset; background-color : #F5F5F5; color : Black; padding : .5em; margin : .5em; font-size : 90%; } DL, UL, OL { font-size : 100%; } DT { font-size : 100%; font-weight : bold; } .navbar { font-size : 120%; font-weight : bold; } DIV.footer { float : none; clear : both; margin: 0; padding : 1em; border-top : 1px solid; font-size : 80%; } TABLE.parameters { border : 1px outset; } TR.even { background-color : #ddd; } TR.odd { background-color : #efefef; } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/allextpoints.jxp0000644000175000017500000000171710541226150032367 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> All Extension Points

All Extension Points List

<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/ext.jxp0000644000175000017500000000253310541226150030436 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> Extension - <%= ext.getId() %>

Extension details

Plugin: <%= ext.getDeclaringPluginDescriptor().getId() %> version <%= ext.getDeclaringPluginDescriptor().getVersion() %>
Extension ID: <%= ext.getId() %>
Extends: <%= ext.getExtendedPointId() %> in <%= ext.getExtendedPluginId() %>

<% printDoc(tool, ext); %>
Parameters
    <% for (Extension.Parameter param : ext.getParameters()) { %>
  • <% printParam(tool, param); %>
  • <% } %>
<% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/functions.ijxp0000644000175000017500000000542210541226150032017 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import java.text.*; import org.java.plugin.*; function void printFooter() { %>


<% } function void printDoc(DocGenerator.Tool tool, Documentable obj) { Documentation doc = obj.getDocumentation(); if (doc == null) { return; } println("

" + tool.processDocText(doc.getCaption()) + "

"); println("

" + tool.processDocText(doc.getText()) + "

"); if (doc.getReferences().isEmpty()) { return; } println("

References

"); } function void printAttr(DocGenerator.Tool tool, PluginAttribute attr) { println(attr.getId() + " [" + attr.getValue() + "]"); if (attr.getSubAttributes().isEmpty()) { return; } println("
    "); for (PluginAttribute subAttr : attr.getSubAttributes()) { println("
  • "); printAttr(tool, subAttr); println("
  • "); } println("
"); } function void printParamTableRow(DocGenerator.Tool tool, ExtensionPoint.ParameterDefinition def, int nestedLevel, boolean isOdd) { if(isOdd) { print(""); } else { print(""); } print(""); for(int i =0; i < nestedLevel; i++) { print("   "); } print(def.getId() + ""); print("" + def.getType() + ""); print("" + def.getMultiplicity() + ""); print(""); printParamDoc(tool, def); println(""); for (ExtensionPoint.ParameterDefinition subDef : def.getSubDefinitions()) { printParamTableRow(tool, subDef, nestedLevel + 1, isOdd); } } function void printParamDoc(DocGenerator.Tool tool, ExtensionPoint.ParameterDefinition def) { Documentation doc = def.getDocumentation(); if (doc == null) { return; } print(tool.processDocText(doc.getText())); } function void printParam(DocGenerator.Tool tool, Extension.Parameter param) { println(param.getId() + " [" + param.rawValue() + "]"); if (param.getSubParameters().isEmpty()) { return; } println("
    "); for (Extension.Parameter subParam : param.getSubParameters()) { println("
  • "); printParam(tool, subParam); println("
  • "); } } %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/index.jxp0000644000175000017500000000161110541226150030741 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> JPF Plug-ins Documentation <h2>Frame Alert</h2> <p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.</p> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/templates/tree.jxp0000644000175000017500000000454310541226150030600 0ustar gregoagregoa<% // Java Plug-in Framework (JPF) // Copyright (C) 2004 - 2005 Dmitry Olshansky // $Id$ %> <% import org.java.plugin.*; include("functions.ijxp"); %> Plug-ins Tree Hierarchy

    Plug-ins Tree Hierarchy

      <% for (PluginDescriptor plugin : allPluginDescriptors) { %>
    • Plug-in: <%= plugin.getId() %> <%= plugin.getVersion() %> <% if (!plugin.getFragments().isEmpty()) { %> <% } %> <% if (!plugin.getPrerequisites().isEmpty()) { %> <% } %> <% if (!plugin.getExtensionPoints().isEmpty()) { %>
        <% for (ExtensionPoint extp : plugin.getExtensionPoints()) { %>
      • Extension point: <%= extp.getId() %> <% if (!extp.getConnectedExtensions().isEmpty()) { %>
          <% for (Extension ext : extp.getConnectedExtensions()) { %>
        • Connected extension: <%= ext.getId() %>
        • <% } %>
        <% } %>
      • <% } %>
      <% } %> <% if (!plugin.getExtensions().isEmpty()) { %>
        <% for (Extension ext : plugin.getExtensions()) { %>
      • Extension: <%= ext.getId() %>
      • <% } %>
      <% } %>
    • <% } %>
    <% printFooter(); %> libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/package.html0000644000175000017500000000025010514424204027370 0ustar gregoagregoa

    JXP (Java scripted page) templates based documentation generator.

    libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/ClassPathPageSource.java0000644000175000017500000000561010552476054031633 0ustar gregoagregoapackage org.java.plugin.tools.docgen; import java.io.IOException; import java.io.InputStreamReader; import org.onemind.commons.java.util.FileUtils; import org.onemind.jxp.CachedJxpPage; import org.onemind.jxp.CachingPageSource; import org.onemind.jxp.JxpPage; import org.onemind.jxp.JxpPageNotFoundException; import org.onemind.jxp.JxpPageParseException; import org.onemind.jxp.parser.AstJxpDocument; import org.onemind.jxp.parser.JxpParser; import org.onemind.jxp.parser.ParseException; /** * JXP page source configured to load templates from the classpath. * @version $Id$ */ final class ClassPathPageSource extends CachingPageSource { private final String base; private final ClassLoader cl; private final String encoding; ClassPathPageSource(final String aBase, final String anEncoding) { super(); base = aBase; encoding = anEncoding; cl = getClass().getClassLoader(); } /** * @see org.onemind.jxp.CachingPageSource#loadJxpPage(java.lang.String) */ @Override protected CachedJxpPage loadJxpPage(final String id) throws JxpPageNotFoundException { if (!hasJxpPage(id)) { throw new JxpPageNotFoundException("page " + id + " not found"); //$NON-NLS-1$ //$NON-NLS-2$ } return new CachedJxpPage(this, id); } /** * @see org.onemind.jxp.CachingPageSource#parseJxpDocument( * org.onemind.jxp.JxpPage) */ @Override protected AstJxpDocument parseJxpDocument(final JxpPage page) throws JxpPageParseException { try { JxpParser parser; if (encoding == null) { parser = new JxpParser(cl.getResourceAsStream( getStreamName(page.getName()))); } else { parser = new JxpParser(new InputStreamReader( cl.getResourceAsStream(getStreamName(page.getName())), encoding)); } return parser.JxpDocument(); } catch (IOException ioe) { throw new JxpPageParseException("problem parsing page " //$NON-NLS-1$ + page.getName() + ": " + ioe.getMessage(), ioe); //$NON-NLS-1$ } catch (ParseException pe) { throw new JxpPageParseException("problem parsing page " //$NON-NLS-1$ + page.getName() + ": " + pe.getMessage(), pe); //$NON-NLS-1$ } } /** * @see org.onemind.jxp.JxpPageSource#hasJxpPage(java.lang.String) */ @Override public boolean hasJxpPage(final String id) { if (isJxpPageCached(id)) { return true; } return cl.getResource(getStreamName(id)) != null; } private String getStreamName(final String pageName) { return FileUtils.concatFilePath(base, pageName); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/docgen/DocGenerator.java0000644000175000017500000004755110554437130030353 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2004-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.docgen; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.java.plugin.PathResolver; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginElement; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.util.IoUtil; import org.onemind.jxp.FilePageSource; import org.onemind.jxp.JxpProcessingContext; import org.onemind.jxp.JxpProcessor; /** * Tool class to generate documentation for plug-ins using JXP templates. * * @version $Id$ */ public final class DocGenerator { private static String getRelativePath(final int level) { StringBuilder result = new StringBuilder(); if (level > 0) { for (int i = 0; i < level; i++) { if (i > 0) { result.append("/"); //$NON-NLS-1$ } result.append(".."); //$NON-NLS-1$ } } else { result.append("."); //$NON-NLS-1$ } return result.toString(); } private final PluginRegistry registry; private final PathResolver pathResolver; private JxpProcessor processor; private Collection allPluginDescriptors; private Collection allPluginFragments; private Collection allExtensionPoints; private Collection allExtensions; private String documentationOverview; private String stylesheet; private String outputEncoding = "UTF-8"; //$NON-NLS-1$ /** * Constructs generator configured to use pre-defined set of templates. * * @param aRegistry * plug-ins registry * @param aPathResolver * path resolver * @throws Exception * if an error has occurred */ public DocGenerator(final PluginRegistry aRegistry, final PathResolver aPathResolver) throws Exception { this(aRegistry, aPathResolver, DocGenerator.class.getName().substring( 0, DocGenerator.class.getName().lastIndexOf('.')).replace('.', '/') + "/templates/", null); //$NON-NLS-1$ } /** * Constructs generator configured to use custom templates available in the * classpath. * * @param aRegistry * plug-ins registry * @param aPathResolver * path resolver * @param templatesPath * path to templates (should be available in classpath) * @param templatesEncoding * templates characters encoding, if null, system * default will be used * @throws Exception * if an error has occurred */ public DocGenerator(final PluginRegistry aRegistry, final PathResolver aPathResolver, final String templatesPath, final String templatesEncoding) throws Exception { this(aRegistry, aPathResolver, new JxpProcessor( new ClassPathPageSource(templatesPath, templatesEncoding))); } /** * Constructs generator configured to use custom templates located somewhere * in the local file system. * * @param aRegistry * plug-ins registry * @param aPathResolver * path resolver * @param templatesFolder * folder with templates * @param templatesEncoding * templates characters encoding, if null, system * default will be used * @throws Exception * if an error has occurred */ public DocGenerator(final PluginRegistry aRegistry, final PathResolver aPathResolver, final File templatesFolder, final String templatesEncoding) throws Exception { // TODO: use character encoding when that will be possible in JXP // library this(aRegistry, aPathResolver, new JxpProcessor(new FilePageSource( templatesFolder.getCanonicalPath()))); } private DocGenerator(final PluginRegistry aRegistry, final PathResolver aPathResolver, final JxpProcessor proc) { registry = aRegistry; pathResolver = aPathResolver; processor = proc; allPluginDescriptors = getAllPluginDescriptors(); allPluginFragments = getAllPluginFragments(); allExtensionPoints = getAllExtensionPoints(); allExtensions = getAllExtensions(); } /** * @return documentation overview HTML content */ public String getDocumentationOverview() { return documentationOverview; } /** * @param aDocumentationOverview * documentation overview HTML content */ public void setDocumentationOverview(final String aDocumentationOverview) { this.documentationOverview = aDocumentationOverview; } /** * @return CSS style sheet content */ public String getStylesheet() { return stylesheet; } /** * @param aStylesheet * CSS style sheet content */ public void setStylesheet(final String aStylesheet) { this.stylesheet = aStylesheet; } /** * @return output files encoding name */ public String getOutputEncoding() { return outputEncoding; } /** * @param encoding * output files encoding name (default is UTF-8) */ public void setOutputEncoding(final String encoding) { this.outputEncoding = encoding; } private void processTemplateFile(final Map ctx, final String template, final File outFile) throws Exception { Writer out = new OutputStreamWriter(new BufferedOutputStream( new FileOutputStream(outFile, false)), outputEncoding); try { processor.process(template, new JxpProcessingContext(out, ctx)); } finally { out.close(); } } private void processTemplateContent(final Map ctx, final String template, final File outFile) throws Exception { File tmpFile = File.createTempFile("~jpf-jxp", null); //$NON-NLS-1$ tmpFile.deleteOnExit(); Writer tmpOut = new OutputStreamWriter(new BufferedOutputStream( new FileOutputStream(tmpFile, false)), "UTF-8"); //$NON-NLS-1$ try { tmpOut.write(template); } finally { tmpOut.close(); } Writer out = new OutputStreamWriter(new BufferedOutputStream( new FileOutputStream(outFile, false)), outputEncoding); try { JxpProcessor proc = new JxpProcessor(new FilePageSource(tmpFile .getParentFile().getCanonicalPath())); // TODO: use character encoding when that will be possible in JXP // library (UTF-8 in this case) proc.process(tmpFile.getName(), new JxpProcessingContext(out, ctx)); } finally { tmpFile.delete(); out.close(); } } /** * Generates documentation for all registered plug-ins. * * @param destDir * target folder * @throws Exception * if an error has occurred */ public void generate(final File destDir) throws Exception { // generating index page Map ctx = createConext(0); processTemplateFile(ctx, "index.jxp", //$NON-NLS-1$ new File(destDir, "index.html")); //$NON-NLS-1$ // generating style sheet file generateCss(destDir); // generating menu page ctx = createConext(0); processTemplateFile(ctx, "menu.jxp", //$NON-NLS-1$ new File(destDir, "menu.html")); //$NON-NLS-1$ // generating overview page ctx = createConext(0); if (documentationOverview != null) { ctx.put("overview", documentationOverview.replaceAll( //$NON-NLS-1$ "(?i)(?d)(?m).*(.*).*", "$1")); //$NON-NLS-1$ //$NON-NLS-2$ } else { ctx.put("overview", ""); //$NON-NLS-1$ //$NON-NLS-2$ } processTemplateFile(ctx, "overview.jxp", //$NON-NLS-1$ new File(destDir, "overview.html")); //$NON-NLS-1$ // generating "all plug-ins" page ctx = createConext(0); processTemplateFile(ctx, "allplugins.jxp", //$NON-NLS-1$ new File(destDir, "allplugins.html")); //$NON-NLS-1$ // generating "all plug-in fragments" page ctx = createConext(0); processTemplateFile(ctx, "allfragments.jxp", //$NON-NLS-1$ new File(destDir, "allfragments.html")); //$NON-NLS-1$ // generating "all extension points" page ctx = createConext(0); processTemplateFile(ctx, "allextpoints.jxp", //$NON-NLS-1$ new File(destDir, "allextpoints.html")); //$NON-NLS-1$ // generating "all extensions" page ctx = createConext(0); processTemplateFile(ctx, "allexts.jxp", //$NON-NLS-1$ new File(destDir, "allexts.html")); //$NON-NLS-1$ // generating tree page ctx = createConext(0); processTemplateFile(ctx, "tree.jxp", //$NON-NLS-1$ new File(destDir, "tree.html")); //$NON-NLS-1$ // per plug-in generation for (PluginDescriptor descriptor : registry.getPluginDescriptors()) { generateForPluginDescriptor(destDir, descriptor); } } private void generateCss(final File destDir) throws Exception { final Map ctx = createConext(0); if (stylesheet == null) { processTemplateFile(ctx, "stylesheet.jxp", //$NON-NLS-1$ new File(destDir, "stylesheet.css")); //$NON-NLS-1$ } else { processTemplateContent(ctx, stylesheet, new File(destDir, "stylesheet.css")); //$NON-NLS-1$ } } private void generateForPluginDescriptor(final File baseDir, final PluginDescriptor descr) throws Exception { File destDir = new File(baseDir, descr.getId()); destDir.mkdirs(); File srcDocsFolder = IoUtil.url2file(pathResolver.resolvePath(descr, descr.getDocsPath())); if ((srcDocsFolder != null) && srcDocsFolder.isDirectory()) { File destDocsFolder = new File(destDir, "extra"); //$NON-NLS-1$ destDocsFolder.mkdir(); IoUtil.copyFolder(srcDocsFolder, destDocsFolder, true); } List dependedPlugins = new LinkedList(); for (PluginDescriptor dependedDescr : registry.getPluginDescriptors()) { if (dependedDescr.getId().equals(descr.getId())) { continue; } for (PluginPrerequisite pre : dependedDescr.getPrerequisites()) { if (pre.getPluginId().equals(descr.getId()) && pre.matches()) { dependedPlugins.add(dependedDescr); break; } } } Map ctx = createConext(1); ctx.put("descriptor", descr); //$NON-NLS-1$ ctx.put("dependedPlugins", dependedPlugins); //$NON-NLS-1$ processTemplateFile(ctx, "plugin.jxp", //$NON-NLS-1$ new File(destDir, "index.html")); //$NON-NLS-1$ // per plug-in fragment generation for (PluginFragment fragment : descr.getFragments()) { generateForPluginFragment(baseDir, fragment); } // generating extension points if (!descr.getExtensionPoints().isEmpty()) { File extPointsDir = new File(destDir, "extp"); //$NON-NLS-1$ extPointsDir.mkdir(); for (ExtensionPoint extPoint : descr.getExtensionPoints()) { ctx = createConext(3); ctx.put("extPoint", extPoint); //$NON-NLS-1$ File dir = new File(extPointsDir, extPoint.getId()); dir.mkdir(); processTemplateFile(ctx, "extpoint.jxp", //$NON-NLS-1$ new File(dir, "index.html")); //$NON-NLS-1$ } } // generating extensions if (!descr.getExtensions().isEmpty()) { File extsDir = new File(destDir, "ext"); //$NON-NLS-1$ extsDir.mkdir(); for (Extension ext : descr.getExtensions()) { ctx = createConext(3); ctx.put("ext", ext); //$NON-NLS-1$ File dir = new File(extsDir, ext.getId()); dir.mkdir(); processTemplateFile(ctx, "ext.jxp", //$NON-NLS-1$ new File(dir, "index.html")); //$NON-NLS-1$ } } } private void generateForPluginFragment(final File baseDir, final PluginFragment fragment) throws Exception { final File destDir = new File(baseDir, fragment.getId()); destDir.mkdirs(); Map ctx = createConext(1); ctx.put("fragment", fragment); //$NON-NLS-1$ processTemplateFile(ctx, "fragment.jxp", //$NON-NLS-1$ new File(destDir, "index.html")); //$NON-NLS-1$ } private Map createConext(final int level) { final Map result = new HashMap(); String relativePath = getRelativePath(level); result.put("tool", new Tool(relativePath)); //$NON-NLS-1$ result.put("relativePath", relativePath); //$NON-NLS-1$ result.put("registry", registry); //$NON-NLS-1$ result.put("allPluginDescriptors", allPluginDescriptors); //$NON-NLS-1$ result.put("allPluginFragments", allPluginFragments); //$NON-NLS-1$ result.put("allExtensionPoints", allExtensionPoints); //$NON-NLS-1$ result.put("allExtensions", allExtensions); //$NON-NLS-1$ return result; } private Collection getAllPluginDescriptors() { final List result = new LinkedList(); result.addAll(registry.getPluginDescriptors()); Collections.sort(result, new IdentityComparator()); return Collections.unmodifiableCollection(result); } private Collection getAllPluginFragments() { final List result = new LinkedList(); result.addAll(registry.getPluginFragments()); Collections.sort(result, new IdentityComparator()); return Collections.unmodifiableCollection(result); } private Collection getAllExtensionPoints() { final List result = new LinkedList(); for (PluginDescriptor descriptor : registry.getPluginDescriptors()) { result.addAll(descriptor.getExtensionPoints()); } Collections.sort(result, new IdentityComparator()); return Collections.unmodifiableCollection(result); } private Collection getAllExtensions() { final List result = new LinkedList(); for (PluginDescriptor descriptor : registry.getPluginDescriptors()) { result.addAll(descriptor.getExtensions()); } Collections.sort(result, new IdentityComparator()); return Collections.unmodifiableCollection(result); } /** * Utility class to be used from JXP templates. * * @version $Id$ */ public static final class Tool { private String relativePath; protected Tool(final String aRelativePath) { this.relativePath = aRelativePath; } /** * @param ref * documentation reference element * @return link to be used in "href" attribute */ public String getLink(final Documentation.Reference ref) { if (isAbsoluteUrl(ref.getRef())) { return ref.getRef(); } String id; Identity idt = ref.getDeclaringIdentity(); if (idt instanceof PluginElement) { PluginElement element = (PluginElement) idt; PluginFragment fragment = element.getDeclaringPluginFragment(); if (fragment != null) { id = fragment.getId(); } else { id = element.getDeclaringPluginDescriptor().getId(); } } else { id = idt.getId(); } return relativePath + "/" + id + "/extra/" + ref.getRef(); //$NON-NLS-1$ //$NON-NLS-2$ } /** * @param url * an URL to check * @return true if given link is an absolute URL */ public boolean isAbsoluteUrl(final String url) { try { String protocol = new URL(url).getProtocol(); return (protocol != null) && (protocol.length() > 0); } catch (MalformedURLException e) { return false; } } /** * Substitutes all ${relativePath} variables with their values. * * @param text * text to be processed * @return processed documentation text */ public String processDocText(final String text) { if ((text == null) || (text.length() == 0)) { return ""; //$NON-NLS-1$ } return text.replaceAll("(?d)(?m)\\$\\{relativePath\\}", //$NON-NLS-1$ relativePath); } } static final class IdentityComparator implements Comparator { /** * @param o1 first object to compare * @param o2 second object to compare * @return comparison result * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(final Identity o1, final Identity o2) { return o1.getId().compareTo(o2.getId()); } } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/0000755000175000017500000000000010562141712024772 5ustar gregoagregoalibjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockPluginAttribute.java0000644000175000017500000000773510554435530031612 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import org.java.plugin.registry.PluginAttribute; /** * @version $Id$ */ public class MockPluginAttribute extends MockPluginElement implements PluginAttribute { private LinkedList subAttributes = new LinkedList(); private PluginAttribute superAttribute; private String value; /** * No-arguments constructor. */ public MockPluginAttribute() { // no-op } /** * @param id attribute ID * @param aValue attribute value */ public MockPluginAttribute(final String id, final String aValue) { setId(id); value = aValue; } /** * @see org.java.plugin.registry.PluginAttribute#getSubAttribute( * java.lang.String) */ public PluginAttribute getSubAttribute(final String id) { for (PluginAttribute attr : subAttributes) { if (attr.getId().equals(id)) { return attr; } } throw new IllegalArgumentException("unknown attribute ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginAttribute#getSubAttributes() */ public Collection getSubAttributes() { return Collections.unmodifiableCollection(subAttributes); } /** * @see org.java.plugin.registry.PluginAttribute#getSubAttributes( * java.lang.String) */ public Collection getSubAttributes(final String id) { LinkedList result = new LinkedList(); for (PluginAttribute attr : subAttributes) { if (attr.getId().equals(id)) { result.add(attr); } } return result; } /** * @param attribute sub-attribute to add * @return this instance */ public MockPluginAttribute addSubAttribute( final PluginAttribute attribute) { subAttributes.add(attribute); return this; } /** * @see org.java.plugin.registry.PluginAttribute#getSuperAttribute() */ public PluginAttribute getSuperAttribute() { return superAttribute; } /** * @param attribute the super attribute to set * @return this instance */ public MockPluginAttribute setSuperAttribute( final PluginAttribute attribute) { superAttribute = attribute; return this; } /** * @see org.java.plugin.registry.PluginAttribute#getValue() */ public String getValue() { return value; } /** * @param attributeValue the attribute value to set * @return this instance */ public MockPluginAttribute setValue(final String attributeValue) { value = attributeValue; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockPluginPrerequisite.java0000644000175000017500000001073710562141242032315 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.Version; /** * @version $Id$ */ public class MockPluginPrerequisite extends MockPluginElement implements PluginPrerequisite { private String pluginId; private Version pluginVersion; private boolean isExported; private boolean isOptional; private boolean isReverseLookup; private boolean matches = true; private MatchingRule matchingRule; /** * @see org.java.plugin.registry.PluginPrerequisite#getPluginId() */ public String getPluginId() { return pluginId; } /** * @param value the plug-in id to set * @return this instance */ public MockPluginPrerequisite setPluginId(final String value) { pluginId = value; return this; } /** * @see org.java.plugin.registry.PluginPrerequisite#getPluginVersion() */ public Version getPluginVersion() { return pluginVersion; } /** * @param value the plug-in version to set * @return this instance */ public MockPluginPrerequisite setPluginVersion(final Version value) { pluginVersion = value; return this; } /** * @see org.java.plugin.registry.PluginPrerequisite#isExported() */ public boolean isExported() { return isExported; } /** * @param value the exported flag to set * @return this instance */ public MockPluginPrerequisite setExported(final boolean value) { isExported = value; return this; } /** * @see org.java.plugin.registry.PluginPrerequisite#isOptional() */ public boolean isOptional() { return isOptional; } /** * @param value the optional flag to set * @return this instance */ public MockPluginPrerequisite setOptional(final boolean value) { isOptional = value; return this; } /** * @see org.java.plugin.registry.PluginPrerequisite#isReverseLookup() */ public boolean isReverseLookup() { return isReverseLookup; } /** * @param value the reverse look-up flag to set * @return this instance */ public MockPluginPrerequisite setReverseLookup(final boolean value) { isReverseLookup = value; return this; } /** * @see org.java.plugin.registry.PluginPrerequisite#matches() */ public boolean matches() { return matches; } /** * @param value the matches flag to set * @return this instance */ public MockPluginPrerequisite setMatches(final boolean value) { matches = value; return this; } /** * @see org.java.plugin.registry.PluginPrerequisite#getMatchingRule() */ public MatchingRule getMatchingRule() { return matchingRule; } /** * @param value the matchingRule to set * @return this instance */ public MockPluginPrerequisite setMatchingRule(final MatchingRule value) { matchingRule = value; return this; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getId() + '@' + getId(); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/package.html0000644000175000017500000000012610536120572027254 0ustar gregoagregoa

    Simple mock classes to be used in unit tests.

    libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockPluginElement.java0000644000175000017500000000652410562140556031233 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginElement; import org.java.plugin.registry.PluginFragment; /** * @version $Id$ * @param plug-in element owner type */ public abstract class MockPluginElement> extends MockIdentity implements PluginElement { private PluginDescriptor declaringPluginDescriptor; private PluginFragment declaringPluginFragment; private String docsPath; private Documentation documentation; /** * @see org.java.plugin.registry.PluginElement#getDeclaringPluginDescriptor() */ public PluginDescriptor getDeclaringPluginDescriptor() { return declaringPluginDescriptor; } /** * @param value the declaring plug-in descriptor to set * @return this instance */ public MockPluginElement setDeclaringPluginDescriptor( final PluginDescriptor value) { declaringPluginDescriptor = value; return this; } /** * @see org.java.plugin.registry.PluginElement#getDeclaringPluginFragment() */ public PluginFragment getDeclaringPluginFragment() { return declaringPluginFragment; } /** * @param value the declaring plug-in fragment to set * @return this instance */ public MockPluginElement setDeclaringPluginFragment( final PluginFragment value) { declaringPluginFragment = value; return this; } /** * @see org.java.plugin.registry.Documentable#getDocsPath() */ public String getDocsPath() { return docsPath; } /** * @param value the docs path to set * @return this instance */ public MockPluginElement setDocsPath(final String value) { docsPath = value; return this; } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return documentation; } /** * @param value the documentation to set * @return this instance */ public MockPluginElement setDocumentation(final Documentation value) { documentation = value; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockExtensionPoint.java0000644000175000017500000002125310554435476031456 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionMultiplicity; import org.java.plugin.registry.ExtensionPoint; /** * @version $Id$ */ public class MockExtensionPoint extends MockPluginElement implements ExtensionPoint { private ExtensionMultiplicity multiplicity; private String parentExtensionPointId; private String parentPluginId; private boolean isValid = true; private LinkedList availableExtensions = new LinkedList(); private LinkedList connectedExtensions = new LinkedList(); private LinkedList descendants = new LinkedList(); private LinkedList parameterDefinitions = new LinkedList(); private HashSet predecessors = new HashSet(); /** * @see org.java.plugin.registry.ExtensionPoint#getAvailableExtension( * java.lang.String) */ public Extension getAvailableExtension(final String uniqueId) { for (Extension ext : availableExtensions) { if (ext.getUniqueId().equals(uniqueId)) { return ext; } } throw new IllegalArgumentException("extension UID " //$NON-NLS-1$ + uniqueId + " not available"); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.ExtensionPoint#getAvailableExtensions() */ public Collection getAvailableExtensions() { return Collections.unmodifiableCollection(availableExtensions); } /** * @see org.java.plugin.registry.ExtensionPoint#getConnectedExtension( * java.lang.String) */ public Extension getConnectedExtension(final String uniqueId) { for (Extension ext : connectedExtensions) { if (ext.getUniqueId().equals(uniqueId)) { return ext; } } throw new IllegalArgumentException("extension UID " //$NON-NLS-1$ + uniqueId + " not connected"); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.ExtensionPoint#getConnectedExtensions() */ public Collection getConnectedExtensions() { return Collections.unmodifiableCollection(connectedExtensions); } /** * @param extension extension to add * @param isConnected if true extension will be marked as * "connected" also * @return this instance */ public MockExtensionPoint addExtension(final Extension extension, final boolean isConnected) { availableExtensions.add(extension); if (isConnected) { connectedExtensions.add(extension); } return this; } /** * @see org.java.plugin.registry.ExtensionPoint#getDescendants() */ public Collection getDescendants() { return Collections.unmodifiableCollection(descendants); } /** * @param extensionPoint descendant extension to add * @return this instance */ public MockExtensionPoint addParameter(final ExtensionPoint extensionPoint) { descendants.add(extensionPoint); return this; } /** * @see org.java.plugin.registry.ExtensionPoint#getMultiplicity() */ public ExtensionMultiplicity getMultiplicity() { return multiplicity; } /** * @param value the multiplicity to set * @return this instance */ public MockExtensionPoint setMultiplicity( final ExtensionMultiplicity value) { multiplicity = value; return this; } /** * @see org.java.plugin.registry.ExtensionPoint#getParameterDefinition( * java.lang.String) */ public ParameterDefinition getParameterDefinition(String id) { for (ParameterDefinition paramDef : parameterDefinitions) { if (paramDef.getId().equals(id)) { return paramDef; } } throw new IllegalArgumentException( "unknown parameter definition ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.ExtensionPoint#getParameterDefinitions() */ public Collection getParameterDefinitions() { return Collections.unmodifiableCollection(parameterDefinitions); } /** * @param parameterDefinition parameter definition to add * @return this instance */ public MockExtensionPoint addParameterDefinition( final ParameterDefinition parameterDefinition) { parameterDefinitions.add(parameterDefinition); return this; } /** * @see org.java.plugin.registry.ExtensionPoint#getParentExtensionPointId() */ public String getParentExtensionPointId() { return parentExtensionPointId; } /** * @param pluginId the parent plug-in id to set * @param extensionPointId the parent extension point id to set * @return this instance */ public MockExtensionPoint setParentExtensionPoint(final String pluginId, final String extensionPointId) { parentPluginId = pluginId; parentExtensionPointId = extensionPointId; predecessors.add(pluginId + '@' + extensionPointId); return this; } /** * @see org.java.plugin.registry.ExtensionPoint#getParentPluginId() */ public String getParentPluginId() { return parentPluginId; } /** * @see org.java.plugin.registry.ExtensionPoint#isExtensionAvailable( * java.lang.String) */ public boolean isExtensionAvailable(final String uniqueId) { for (Extension ext : availableExtensions) { if (ext.getUniqueId().equals(uniqueId)) { return true; } } return false; } /** * @see org.java.plugin.registry.ExtensionPoint#isExtensionConnected( * java.lang.String) */ public boolean isExtensionConnected(final String uniqueId) { for (Extension ext : connectedExtensions) { if (ext.getUniqueId().equals(uniqueId)) { return true; } } return false; } /** * @see org.java.plugin.registry.ExtensionPoint#isSuccessorOf( * org.java.plugin.registry.ExtensionPoint) */ public boolean isSuccessorOf(final ExtensionPoint extensionPoint) { return predecessors.contains(extensionPoint.getUniqueId()); } /** * @param pluginId predecessor plug-in ID to add * @param extensionPointId predecessor extension point ID to add * @return this instance */ public MockExtensionPoint addPredecessors(final String pluginId, final String extensionPointId) { predecessors.add(pluginId + '@' + extensionPointId); return this; } /** * @see org.java.plugin.registry.ExtensionPoint#isValid() */ public boolean isValid() { return isValid; } /** * @param value the valid flag to set * @return this instance */ public MockExtensionPoint setValid(final boolean value) { isValid = value; return this; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getId() + '@' + getId(); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockExtension.java0000644000175000017500000001115610554435500030431 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import org.java.plugin.registry.Extension; import org.java.plugin.registry.PluginDescriptor; /** * @version $Id$ */ public class MockExtension extends MockPluginElement implements Extension { private String extendedPluginId; private String extendedPointId; private boolean isValid = true; private LinkedList parameters = new LinkedList(); /** * No-arguments constructor. */ public MockExtension() { // no-op } /** * @param id extension ID */ public MockExtension(final String id) { setId(id); } /** * @param id extension ID * @param declaringPluginDescriptor declaring plug-in descriptor */ public MockExtension(final String id, final PluginDescriptor declaringPluginDescriptor) { setDeclaringPluginDescriptor(declaringPluginDescriptor); setId(id); } /** * @see org.java.plugin.registry.Extension#getExtendedPluginId() */ public String getExtendedPluginId() { return extendedPluginId; } /** * @param value the extended plug-in id to set * @return this instance */ public MockExtension setExtendedPluginId(final String value) { extendedPluginId = value; return this; } /** * @see org.java.plugin.registry.Extension#getExtendedPointId() */ public String getExtendedPointId() { return extendedPointId; } /** * @param value the extended point id to set * @return this instance */ public MockExtension setExtendedPointId(final String value) { extendedPointId = value; return this; } /** * @see org.java.plugin.registry.Extension#getParameter(java.lang.String) */ public Parameter getParameter(final String id) { for (Parameter param : parameters) { if (param.getId().equals(id)) { return param; } } throw new IllegalArgumentException("unknown parameter ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.Extension#getParameters() */ public Collection getParameters() { return Collections.unmodifiableCollection(parameters); } /** * @see org.java.plugin.registry.Extension#getParameters(java.lang.String) */ public Collection getParameters(final String id) { LinkedList result = new LinkedList(); for (Parameter param : parameters) { if (param.getId().equals(id)) { result.add(param); } } return result; } /** * @param parameter parameter to add * @return this instance */ public MockExtension addParameter(final Parameter parameter) { parameters.add(parameter); return this; } /** * @see org.java.plugin.registry.Extension#isValid() */ public boolean isValid() { return isValid; } /** * @param value the valid flag to set * @return this instance */ public MockExtension setValid(final boolean value) { isValid = value; return this; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getId() + '@' + getId(); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockLibrary.java0000644000175000017500000000615410554435472030073 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import org.java.plugin.registry.Library; import org.java.plugin.registry.Version; /** * @version $Id$ */ public class MockLibrary extends MockPluginElement implements Library { private boolean isCodeLibrary; private String path; private Version version; private LinkedList exports = new LinkedList(); /** * @see org.java.plugin.registry.Library#getExports() */ public Collection getExports() { return Collections.unmodifiableCollection(exports); } /** * @param exportPrefix export prefix to add * @return this instance */ public MockLibrary addExport(final String exportPrefix) { exports.add(exportPrefix); return this; } /** * @see org.java.plugin.registry.Library#getPath() */ public String getPath() { return path; } /** * @param value the path to set * @return this instance */ public MockLibrary setPath(final String value) { path = value; return this; } /** * @see org.java.plugin.registry.Library#getVersion() */ public Version getVersion() { return version; } /** * @param value the version to set * @return this instance */ public MockLibrary setVersion(final Version value) { version = value; return this; } /** * @see org.java.plugin.registry.Library#isCodeLibrary() */ public boolean isCodeLibrary() { return isCodeLibrary; } /** * @param value the code library flag to set * @return this instance */ public MockLibrary setCodeLibrary(final boolean value) { isCodeLibrary = value; return this; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getDeclaringPluginDescriptor().getId() + '@' + getId(); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockPluginDescriptor.java0000644000175000017500000002601710554435536031765 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Library; import org.java.plugin.registry.PluginAttribute; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginPrerequisite; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; /** * @version $Id$ */ public class MockPluginDescriptor extends MockIdentity implements PluginDescriptor { private URL location; private String pluginClassName; private PluginRegistry registry; private String vendor; private Version version; private String docsPath; private Documentation documentation; private LinkedList attributes = new LinkedList(); private LinkedList extensions = new LinkedList(); private LinkedList extPoints = new LinkedList(); private LinkedList fragments = new LinkedList(); private LinkedList libraries = new LinkedList(); private LinkedList prerequisites = new LinkedList(); /** * No-arguments constructor. */ public MockPluginDescriptor() { // no-op } /** * @param id plug-in ID */ public MockPluginDescriptor(final String id) { setId(id); } /** * @param id plug-in ID * @param aVersion plug-in version */ public MockPluginDescriptor(final String id, final Version aVersion) { setId(id); setVersion(aVersion); } /** * @see org.java.plugin.registry.PluginDescriptor#getAttribute( * java.lang.String) */ public PluginAttribute getAttribute(final String id) { for (PluginAttribute attr : attributes) { if (attr.getId().equals(id)) return attr; } throw new IllegalArgumentException("unknown attribute ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginDescriptor#getAttributes() */ public Collection getAttributes() { return Collections.unmodifiableCollection(attributes); } /** * @see org.java.plugin.registry.PluginDescriptor#getAttributes( * java.lang.String) */ public Collection getAttributes(final String id) { LinkedList result = new LinkedList(); for (PluginAttribute attr : attributes) { if (attr.getId().equals(id)) { result.add(attr); } } return result; } /** * @param attribute attribute to add * @return this instance */ public MockPluginDescriptor addAttribute(final PluginAttribute attribute) { attributes.add(attribute); return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getExtension( * java.lang.String) */ public Extension getExtension(final String id) { for (Extension ext : extensions) { if (ext.getId().equals(id)) { return ext; } } throw new IllegalArgumentException("unknown extension ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginDescriptor#getExtensionPoint( * java.lang.String) */ public ExtensionPoint getExtensionPoint(final String id) { for (ExtensionPoint extPoint : extPoints) { if (extPoint.getId().equals(id)) { return extPoint; } } throw new IllegalArgumentException("unknown extension point ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginDescriptor#getExtensionPoints() */ public Collection getExtensionPoints() { return Collections.unmodifiableCollection(extPoints); } /** * @see org.java.plugin.registry.PluginDescriptor#getExtensions() */ public Collection getExtensions() { return Collections.unmodifiableCollection(extensions); } /** * @param extPoint extension point to add * @return this instance */ public MockPluginDescriptor addExtensionPoint( final ExtensionPoint extPoint) { extPoints.add(extPoint); return this; } /** * @param extension extension to add * @return this instance */ public MockPluginDescriptor addExtension(final Extension extension) { extensions.add(extension); return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getFragments() */ public Collection getFragments() { return Collections.unmodifiableCollection(fragments); } /** * @param fragment plug-in fragment to add * @return this instance */ public MockPluginDescriptor addFragment(final PluginFragment fragment) { fragments.add(fragment); return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getLibraries() */ public Collection getLibraries() { return Collections.unmodifiableCollection(libraries); } /** * @param library library to add * @return this instance */ public MockPluginDescriptor addLibrary(final Library library) { libraries.add(library); return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getLibrary( * java.lang.String) */ public Library getLibrary(final String id) { for (Library lib : libraries) { if (lib.getId().equals(id)) { return lib; } } throw new IllegalArgumentException("unknown library ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginDescriptor#getLocation() */ public URL getLocation() { return location; } /** * @param value the location to set * @return this instance */ public MockPluginDescriptor setLocation(final URL value) { location = value; return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getPluginClassName() */ public String getPluginClassName() { return pluginClassName; } /** * @param value the plug-in class name to set * @return this instance */ public MockPluginDescriptor setPluginClassName(final String value) { pluginClassName = value; return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getPrerequisite( * java.lang.String) */ public PluginPrerequisite getPrerequisite(final String id) { for (PluginPrerequisite pre : prerequisites) { if (pre.getId().equals(id)) { return pre; } } throw new IllegalArgumentException( "unknown plug-in prerequisite ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.PluginDescriptor#getPrerequisites() */ public Collection getPrerequisites() { return Collections.unmodifiableCollection(prerequisites); } /** * @param pre plug-in prerequisite to add * @return this instance */ public MockPluginDescriptor addPrerequisite(final PluginPrerequisite pre) { prerequisites.add(pre); return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getRegistry() */ public PluginRegistry getRegistry() { return registry; } /** * @param value the registry to set * @return this instance */ public MockPluginDescriptor setRegistry(final PluginRegistry value) { registry = value; return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getVendor() */ public String getVendor() { return vendor; } /** * @param value the vendor to set * @return this instance */ public MockPluginDescriptor setVendor(final String value) { vendor = value; return this; } /** * @see org.java.plugin.registry.PluginDescriptor#getVersion() */ public Version getVersion() { return version; } /** * @param value the version to set * @return this instance */ public MockPluginDescriptor setVersion(final Version value) { version = value; return this; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getId() + '@' + getVersion(); } /** * @see org.java.plugin.registry.Documentable#getDocsPath() */ public String getDocsPath() { return docsPath; } /** * @param value the docs path to set * @return this instance */ public MockPluginDescriptor setDocsPath(final String value) { docsPath = value; return this; } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return documentation; } /** * @param value the documentation to set * @return this instance */ public MockPluginDescriptor setDocumentation( final Documentation value) { documentation = value; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockPluginRegistry.java0000644000175000017500000002561410572344606031456 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import org.java.plugin.PathResolver; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.Identity; import org.java.plugin.registry.IntegrityCheckReport; import org.java.plugin.registry.ManifestInfo; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; import org.java.plugin.registry.xml.PluginRegistryImpl; import org.java.plugin.util.ExtendedProperties; /** * @version $Id: MockPluginRegistry.java,v 1.4 2007/03/03 17:16:22 ddimon Exp $ */ public class MockPluginRegistry implements PluginRegistry { private IntegrityCheckReport integrityCheckReport; private PluginRegistryImpl xmlRegistryImpl; private LinkedList listeners = new LinkedList(); private IntegrityCheckReport registrationReport; private HashMap extensionPoints = new HashMap(); private HashMap pluginDescriptors = new HashMap(); private LinkedList pluginFragments = new LinkedList(); /** * @see org.java.plugin.registry.PluginRegistry#checkIntegrity( * org.java.plugin.PathResolver) */ public IntegrityCheckReport checkIntegrity( final PathResolver pathResolver) { return integrityCheckReport; } /** * @see org.java.plugin.registry.PluginRegistry#checkIntegrity( * org.java.plugin.PathResolver, boolean) */ public IntegrityCheckReport checkIntegrity(final PathResolver pathResolver, final boolean includeRegistrationReport) { return integrityCheckReport; } /** * @param value the integrity check report to set * @return this instance */ public MockPluginRegistry setIntegrityCheckReport( final IntegrityCheckReport value) { integrityCheckReport = value; return this; } /** * @see org.java.plugin.registry.PluginRegistry#configure( * org.java.plugin.util.ExtendedProperties) */ public void configure(final ExtendedProperties config) { // no-op } /** * @see org.java.plugin.registry.PluginRegistry#extractId( * java.lang.String) */ public String extractId(final String uniqueId) { if (xmlRegistryImpl == null) { xmlRegistryImpl = new PluginRegistryImpl(); } return xmlRegistryImpl.extractId(uniqueId); } /** * @see org.java.plugin.registry.PluginRegistry#extractPluginId( * java.lang.String) */ public String extractPluginId(final String uniqueId) { if (xmlRegistryImpl == null) { xmlRegistryImpl = new PluginRegistryImpl(); } return xmlRegistryImpl.extractPluginId(uniqueId); } /** * @see org.java.plugin.registry.PluginRegistry#extractVersion( * java.lang.String) */ public Version extractVersion(final String uniqueId) { if (xmlRegistryImpl == null) { xmlRegistryImpl = new PluginRegistryImpl(); } return xmlRegistryImpl.extractVersion(uniqueId); } /** * @see org.java.plugin.registry.PluginRegistry#getDependingPlugins( * org.java.plugin.registry.PluginDescriptor) */ public Collection getDependingPlugins( final PluginDescriptor descr) { // no-op return Collections.emptyList(); } /** * @see org.java.plugin.registry.PluginRegistry#getExtensionPoint( * java.lang.String, java.lang.String) */ public ExtensionPoint getExtensionPoint(String pluginId, String pointId) { String uid = makeUniqueId(pluginId, pointId); ExtensionPoint result = extensionPoints.get(uid); if (result == null) { throw new IllegalArgumentException( "unknown extenssion point UID " + uid); //$NON-NLS-1$ } return result; } /** * @see org.java.plugin.registry.PluginRegistry#getExtensionPoint( * java.lang.String) */ public ExtensionPoint getExtensionPoint(String uniqueId) { ExtensionPoint result = extensionPoints.get(uniqueId); if (result == null) { throw new IllegalArgumentException( "unknown extenssion point UID " + uniqueId); //$NON-NLS-1$ } return result; } /** * @param extPoint extension point to add * @return this instance */ public MockPluginRegistry addExtensionPoint(final ExtensionPoint extPoint) { extensionPoints.put(extPoint.getUniqueId(), extPoint); return this; } /** * @see org.java.plugin.registry.PluginRegistry#getPluginDescriptor( * java.lang.String) */ public PluginDescriptor getPluginDescriptor(final String pluginId) { PluginDescriptor result = pluginDescriptors.get(pluginId); if (result == null) { throw new IllegalArgumentException( "unknown plug-in ID " + pluginId); //$NON-NLS-1$ } return result; } /** * @see org.java.plugin.registry.PluginRegistry#getPluginDescriptors() */ public Collection getPluginDescriptors() { return Collections.unmodifiableCollection(pluginDescriptors.values()); } /** * @param descr plug-in descriptor to add * @return this instance */ public MockPluginRegistry addPluginDescriptor( final PluginDescriptor descr) { pluginDescriptors.put(descr.getId(), descr); return this; } /** * @see org.java.plugin.registry.PluginRegistry#getPluginFragments() */ public Collection getPluginFragments() { return Collections.unmodifiableCollection(pluginFragments); } /** * @param fragment plug-in fragment to add * @return this instance */ public MockPluginRegistry addPluginFragment(final PluginFragment fragment) { pluginFragments.add(fragment); return this; } /** * @see org.java.plugin.registry.PluginRegistry#getRegistrationReport() */ public IntegrityCheckReport getRegistrationReport() { return registrationReport; } /** * @param value the registration report to set * @return this instance */ public MockPluginRegistry setRegistrationReport( final IntegrityCheckReport value) { registrationReport = value; return this; } /** * @see org.java.plugin.registry.PluginRegistry#isExtensionPointAvailable( * java.lang.String, java.lang.String) */ public boolean isExtensionPointAvailable(final String pluginId, final String pointId) { return extensionPoints.containsKey(makeUniqueId(pluginId, pointId)); } /** * @see org.java.plugin.registry.PluginRegistry#isExtensionPointAvailable( * java.lang.String) */ public boolean isExtensionPointAvailable(final String uniqueId) { return extensionPoints.containsKey(uniqueId); } /** * @see org.java.plugin.registry.PluginRegistry#isPluginDescriptorAvailable( * java.lang.String) */ public boolean isPluginDescriptorAvailable(final String pluginId) { return pluginDescriptors.containsKey(pluginId); } /** * @see org.java.plugin.registry.PluginRegistry#makeUniqueId( * java.lang.String, java.lang.String) */ public String makeUniqueId(final String pluginId, final String elementId) { if (xmlRegistryImpl == null) { xmlRegistryImpl = new PluginRegistryImpl(); } return xmlRegistryImpl.makeUniqueId(pluginId, elementId); } /** * @see org.java.plugin.registry.PluginRegistry#makeUniqueId( * java.lang.String, org.java.plugin.registry.Version) */ public String makeUniqueId(final String pluginId, final Version version) { if (xmlRegistryImpl == null) { xmlRegistryImpl = new PluginRegistryImpl(); } return xmlRegistryImpl.makeUniqueId(pluginId, version); } /** * @see org.java.plugin.registry.PluginRegistry#readManifestInfo( * java.net.URL) */ public ManifestInfo readManifestInfo(final URL manifest) { // no-op return null; } /** * @see org.java.plugin.registry.PluginRegistry#register(java.net.URL[]) */ public Map register(final URL[] manifests) { // no-op return Collections.emptyMap(); } /** * @see org.java.plugin.registry.PluginRegistry#registerListener( * org.java.plugin.registry.PluginRegistry.RegistryChangeListener) */ public void registerListener(final RegistryChangeListener listener) { listeners.add(listener); } /** * @see org.java.plugin.registry.PluginRegistry#unregister( * java.lang.String[]) */ public Collection unregister(final String[] ids) { // no-op return Collections.emptyList(); } /** * @see org.java.plugin.registry.PluginRegistry#unregisterListener( * org.java.plugin.registry.PluginRegistry.RegistryChangeListener) */ public void unregisterListener(final RegistryChangeListener listener) { listeners.remove(listener); } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockParameter.java0000644000175000017500000001664510554435510030406 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.LinkedList; import org.java.plugin.PathResolver; import org.java.plugin.registry.Extension; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.Extension.Parameter; import org.java.plugin.registry.ExtensionPoint.ParameterDefinition; /** * @version $Id$ */ public class MockParameter extends MockPluginElement implements Parameter { private Extension declaringExtension; private ParameterDefinition definition; private Parameter superParameter; private String rawValue; private Object typedValue; private LinkedList subParameters = new LinkedList(); /** * No-arguments constructor. */ public MockParameter() { // no-op } /** * @param id parameter ID * @param aRawValue raw parameter value * @param aTypedValue typed parameter value */ public MockParameter(final String id, final String aRawValue, final Object aTypedValue) { setId(id); rawValue = aRawValue; typedValue = aTypedValue; } /** * @param id parameter ID * @param aRawValue raw parameter value * @param aTypedValue typed parameter value * @param aDeclaringExtension declaring extension */ public MockParameter(final String id, final String aRawValue, final Object aTypedValue, final Extension aDeclaringExtension) { setId(id); rawValue = aRawValue; typedValue = aTypedValue; declaringExtension = aDeclaringExtension; } /** * @see org.java.plugin.registry.Extension.Parameter#getDeclaringExtension() */ public Extension getDeclaringExtension() { return declaringExtension; } /** * @param value the declaring extension to set * @return this instance */ public MockParameter setDeclaringExtension(final Extension value) { declaringExtension = value; return this; } /** * @see org.java.plugin.registry.Extension.Parameter#getDefinition() */ public ParameterDefinition getDefinition() { return definition; } /** * @param value the parameter definition to set * @return this instance */ public MockParameter setDefinition(final ParameterDefinition value) { definition = value; return this; } /** * @see org.java.plugin.registry.Extension.Parameter#getSubParameter( * java.lang.String) */ public Parameter getSubParameter(final String id) { for (Parameter param : subParameters) { if (param.getId().equals(id)) { return param; } } throw new IllegalArgumentException("unknown parameter ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.Extension.Parameter#getSubParameters() */ public Collection getSubParameters() { return Collections.unmodifiableCollection(subParameters); } /** * @see org.java.plugin.registry.Extension.Parameter#getSubParameters( * java.lang.String) */ public Collection getSubParameters(final String id) { LinkedList result = new LinkedList(); for (Parameter param : subParameters) { if (param.getId().equals(id)) { result.add(param); } } return result; } /** * @param parameter sub-parameter to add * @return this instance */ public MockParameter addParameter(final Parameter parameter) { subParameters.add(parameter); return this; } /** * @see org.java.plugin.registry.Extension.Parameter#getSuperParameter() */ public Parameter getSuperParameter() { return superParameter; } /** * @param value the super parameter to set * @return this instance */ public MockParameter setSuperParameter(final Parameter value) { superParameter = value; return this; } /** * @see org.java.plugin.registry.Extension.Parameter#rawValue() */ public String rawValue() { return rawValue; } /** * @param raw raw parameter value * @param typed typed parameter value * @return this instance */ public MockParameter setValue(final String raw, final Object typed) { rawValue = raw; typedValue = typed; return this; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsBoolean() */ public Boolean valueAsBoolean() { return (Boolean) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsDate() */ public Date valueAsDate() { return (Date) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsExtension() */ public Extension valueAsExtension() { return (Extension) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsExtensionPoint() */ public ExtensionPoint valueAsExtensionPoint() { return (ExtensionPoint) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsNumber() */ public Number valueAsNumber() { return (Number) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsPluginDescriptor() */ public PluginDescriptor valueAsPluginDescriptor() { return (PluginDescriptor) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsString() */ public String valueAsString() { return (String) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsUrl() */ public URL valueAsUrl() { return (URL) typedValue; } /** * @see org.java.plugin.registry.Extension.Parameter#valueAsUrl( * org.java.plugin.PathResolver) */ public URL valueAsUrl(final PathResolver pathResolver) { return (URL) typedValue; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockDocumentation.java0000644000175000017500000000610410562140442031260 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.Identity; /** * @version $Id$ * @param documentation owner element type */ public class MockDocumentation implements Documentation { private String caption; private T declaringIdentity; private String text; private LinkedList> references = new LinkedList>(); /** * @see org.java.plugin.registry.Documentation#getCaption() */ public String getCaption() { return caption; } /** * @param value the caption to set * @return this instance */ public MockDocumentation setCaption(final String value) { caption = value; return this; } /** * @see org.java.plugin.registry.Documentation#getDeclaringIdentity() */ public T getDeclaringIdentity() { return declaringIdentity; } /** * @param value the declaring identity to set * @return this instance */ public MockDocumentation setDeclaringIdentity(final T value) { declaringIdentity = value; return this; } /** * @see org.java.plugin.registry.Documentation#getReferences() */ public Collection> getReferences() { return Collections.unmodifiableCollection(references); } /** * @param reference reference to add * @return this instance */ public MockDocumentation addReference(final Reference reference) { references.add(reference); return this; } /** * @see org.java.plugin.registry.Documentation#getText() */ public String getText() { return text; } /** * @param value the text to set * @return this instance */ public MockDocumentation setText(final String value) { text = value; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockIdentity.java0000644000175000017500000000275110554435474030261 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import org.java.plugin.registry.Identity; /** * @version $Id$ */ public abstract class MockIdentity implements Identity { private String id; /** * @see org.java.plugin.registry.Identity#getId() */ public String getId() { return id; } /** * @param value the id to set * @return this instance */ public MockIdentity setId(final String value) { id = value; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockManifestInfo.java0000644000175000017500000000721510562144014031034 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import org.java.plugin.registry.ManifestInfo; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.Version; /** * @version $Id: MockManifestInfo.java,v 1.1 2007/02/06 16:25:16 ddimon Exp $ */ public class MockManifestInfo implements ManifestInfo { private String id; private MatchingRule matchingRule; private String pluginId; private Version pluginVersion; private String vendor; private Version version; /** * @see org.java.plugin.registry.ManifestInfo#getId() */ public String getId() { return id; } /** * @param value the id to set * @return this instance */ public MockManifestInfo setId(final String value) { id = value; return this; } /** * @see org.java.plugin.registry.ManifestInfo#getMatchingRule() */ public MatchingRule getMatchingRule() { return matchingRule; } /** * @param value the matching rule to set * @return this instance */ public MockManifestInfo setMatchingRule(final MatchingRule value) { matchingRule = value; return this; } /** * @see org.java.plugin.registry.ManifestInfo#getPluginId() */ public String getPluginId() { return pluginId; } /** * @param value the plug-in id to set * @return this instance */ public MockManifestInfo setPluginId(final String value) { pluginId = value; return this; } /** * @see org.java.plugin.registry.ManifestInfo#getPluginVersion() */ public Version getPluginVersion() { return pluginVersion; } /** * @param value the plug-in version to set * @return this instance */ public MockManifestInfo setPluginVersion(final Version value) { pluginVersion = value; return this; } /** * @see org.java.plugin.registry.ManifestInfo#getVendor() */ public String getVendor() { return vendor; } /** * @param value the vendor to set * @return this instance */ public MockManifestInfo setVendor(final String value) { vendor = value; return this; } /** * @see org.java.plugin.registry.ManifestInfo#getVersion() */ public Version getVersion() { return version; } /** * @param value the version to set * @return this instance */ public MockManifestInfo setVersion(final Version value) { version = value; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockPluginFragment.java0000644000175000017500000001312210562140656031376 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.net.URL; import org.java.plugin.registry.Documentation; import org.java.plugin.registry.MatchingRule; import org.java.plugin.registry.PluginDescriptor; import org.java.plugin.registry.PluginFragment; import org.java.plugin.registry.PluginRegistry; import org.java.plugin.registry.Version; /** * @version $Id$ */ public class MockPluginFragment extends MockIdentity implements PluginFragment { private URL location; private String pluginId; private Version pluginVersion; private PluginRegistry registry; private String vendor; private Version version; private String docsPath; private Documentation documentation; private MatchingRule matchingRule; /** * @see org.java.plugin.registry.PluginFragment#getLocation() */ public URL getLocation() { return location; } /** * @param value the location to set * @return this instance */ public MockPluginFragment setLocation(final URL value) { location = value; return this; } /** * @see org.java.plugin.registry.PluginFragment#getPluginId() */ public String getPluginId() { return pluginId; } /** * @param value the plug-in ID to set * @return this instance */ public MockPluginFragment setPluginId(final String value) { pluginId = value; return this; } /** * @see org.java.plugin.registry.PluginFragment#getPluginVersion() */ public Version getPluginVersion() { return pluginVersion; } /** * @param value the plug-in version to set * @return this instance */ public MockPluginFragment setPluginVersion(final Version value) { pluginVersion = value; return this; } /** * @see org.java.plugin.registry.PluginFragment#getRegistry() */ public PluginRegistry getRegistry() { return registry; } /** * @param value the registry to set * @return this instance */ public MockPluginFragment setRegistry(final PluginRegistry value) { registry = value; return this; } /** * @see org.java.plugin.registry.PluginFragment#getVendor() */ public String getVendor() { return vendor; } /** * @param value the vendor to set * @return this instance */ public MockPluginFragment setVendor(final String value) { vendor = value; return this; } /** * @see org.java.plugin.registry.PluginFragment#getVersion() */ public Version getVersion() { return version; } /** * @param value the version to set * @return this instance */ public MockPluginFragment setVersion(final Version value) { version = value; return this; } /** * @see org.java.plugin.registry.PluginFragment#matches( * org.java.plugin.registry.PluginDescriptor) */ public boolean matches(final PluginDescriptor descr) { return getVersion().isCompatibleWith(descr.getVersion()); } /** * @see org.java.plugin.registry.PluginFragment#getMatchingRule() */ public MatchingRule getMatchingRule() { return matchingRule; } /** * @param value the matching rule to set * @return this instance */ public MockPluginFragment setMatchingRule(final MatchingRule value) { matchingRule = value; return this; } /** * @see org.java.plugin.registry.UniqueIdentity#getUniqueId() */ public String getUniqueId() { return getId() + '@' + getVersion(); } /** * @see org.java.plugin.registry.Documentable#getDocsPath() */ public String getDocsPath() { return docsPath; } /** * @param value the docs path to set * @return this instance */ public MockPluginFragment setDocsPath(final String value) { docsPath = value; return this; } /** * @see org.java.plugin.registry.Documentable#getDocumentation() */ public Documentation getDocumentation() { return documentation; } /** * @param value the documentation to set * @return this instance */ public MockPluginFragment setDocumentation( final Documentation value) { documentation = value; return this; } } libjpf-java-1.5.1+dfsg.orig/source-tools/org/java/plugin/tools/mocks/MockParameterDefinition.java0000644000175000017500000001273710554435522032420 0ustar gregoagregoa/***************************************************************************** * Java Plug-in Framework (JPF) * Copyright (C) 2006-2007 Dmitry Olshansky * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ package org.java.plugin.tools.mocks; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import org.java.plugin.registry.ExtensionPoint; import org.java.plugin.registry.ParameterMultiplicity; import org.java.plugin.registry.ParameterType; import org.java.plugin.registry.ExtensionPoint.ParameterDefinition; /** * @version $Id$ */ public class MockParameterDefinition extends MockPluginElement implements ParameterDefinition { private String customData; private ExtensionPoint declaringExtensionPoint; private String defaultValue; private ParameterMultiplicity multiplicity; private ParameterType type; private ParameterDefinition superDefinition; private LinkedList subDefinitions = new LinkedList(); /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getCustomData() */ public String getCustomData() { return customData; } /** * @param value the custom data to set * @return this instance */ public MockParameterDefinition setCustomData(final String value) { customData = value; return this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getDeclaringExtensionPoint() */ public ExtensionPoint getDeclaringExtensionPoint() { return declaringExtensionPoint; } /** * @param value the declaring extension point to set * @return this instance */ public MockParameterDefinition setDeclaringExtensionPoint( final ExtensionPoint value) { declaringExtensionPoint = value; return this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getDefaultValue() */ public String getDefaultValue() { return defaultValue; } /** * @param value the default value to set * @return this instance */ public MockParameterDefinition setDefaultValue(final String value) { defaultValue = value; return this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getMultiplicity() */ public ParameterMultiplicity getMultiplicity() { return multiplicity; } /** * @param value the multiplicity to set * @return this instance */ public MockParameterDefinition setMultiplicity( final ParameterMultiplicity value) { multiplicity = value; return this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getSubDefinition(java.lang.String) */ public ParameterDefinition getSubDefinition(String id) { for (ParameterDefinition paramDef : subDefinitions) { if (paramDef.getId().equals(id)) { return paramDef; } } throw new IllegalArgumentException( "unknown parameter definition ID " + id); //$NON-NLS-1$ } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getSubDefinitions() */ public Collection getSubDefinitions() { return Collections.unmodifiableCollection(subDefinitions); } /** * @param parameterDefinition sub-parameter definition to add * @return this instance */ public MockParameterDefinition addSubDefinition( final ParameterDefinition parameterDefinition) { subDefinitions.add(parameterDefinition); return this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getSuperDefinition() */ public ParameterDefinition getSuperDefinition() { return superDefinition; } /** * @param value the super definition to set * @return this instance */ public MockParameterDefinition setSuperDefinition( final ParameterDefinition value) { superDefinition = value; return this; } /** * @see org.java.plugin.registry.ExtensionPoint.ParameterDefinition#getType() */ public ParameterType getType() { return type; } /** * @param value the type to set * @return this instance */ public MockParameterDefinition setType(final ParameterType value) { type = value; return this; } }