r985 - in trunk/src: main/java/org/ourproject/kune/app/public/css main/java/org/ourproject/kune/blogs/client main/java/org/ourproject/kune/blogs/client/cnt main/java/org/ourproject/kune/chat/client main/java/org/ourproject/kune/chat/client/cnt main/java/org/ourproject/kune/docs/client main/java/org/ourproject/kune/docs/client/cnt main/java/org/ourproject/kune/gallery/client main/java/org/ourproject/kune/gallery/client/cnt main/java/org/ourproject/kune/platf/client/dto main/java/org/ourproject
Author: vjrj Date: 2008-12-05 18:53:45 +0100 (Fri, 05 Dec 2008) New Revision: 985 Added: trunk/src/main/java/org/ourproject/kune/platf/server/utils/ trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/all.css trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java trunk/src/main/resources/kune.properties trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java Log: Preview of uploaded files (different than images). Complete - task pdf to img for previews Complete - task Text files preview Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/all.css =================================================================== --- trunk/src/main/java/org/ourproject/kune/app/public/css/all.css 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/app/public/css/all.css 2008-12-05 17:53:45 UTC (rev 985) @@ -41,4 +41,4 @@ padding: 1px 0px 1px 1px; text-decoration:none; } -*/.k-textlinethrough{text-decoration:line-through;color:red;}.k-textnormal{text-decoration:inherit;color:green;}.k-textunderline{text-decoration:underline;color:gray;}.x-tool-kmenu{background-position:0 -75px;}.x-tool-kmenu-over{background-position:-15px -75px;}.k-border-openbox{border-bottom:1px #D0D0D0 solid;border-right:1px #D0D0D0 solid;border-left:1px #D0D0D0 solid;}/* SiteToastMessages */.k-stm-info-icon{background-image:url(img/info.gif)!important;}.k-stm-imp-icon{background-image:url(img/alert.gif)!important;}.k-stm-verimp-icon{background-image:url(img/important.gif)!important;}.k-stm-error-icon{background-image:url(img/error.gif)!important;}.k-error-tb{background:#FFB380 none repeat scroll 0 50%;color:#250;}.k-infod-head{font-size:108%;margin-bottom:10px;}.gwt-DisclosurePanel{}.gwt-DisclosurePanel-open{}.gwt-DisclosurePanel-closed{}.gwt-DisclosurePanel .header,.gwt-DisclosurePanel .header a,.gwt-DisclosurePanel .header td{text-decoration:none;/* Remove underline from header */color:#000;cursor:pointer;cursor:hand;}.gwt-DisclosurePanel .content{border-left:3px solid #e8eef7;padding:4px 0 4px 8px;margin-left:6px;}.k-basic-thumb{background:#FAFAFA none repeat scroll 0 50%;border:1px solid #EBEBEB;padding:3px;margin:3px;}.k-basic-thumb td{padding:2px 3px;border:none;}.k-text-gray{color:gray;}.k-elp-limg{margin-top:4px;margin-left:5px;cursor:pointer;}.k-tsp-tag{float:right;margin-right:5px;cursor:pointer;color:#00F;}.k-tsp-cloud{vertical-align:bottom;}.k-options-icon{background-image:url(img/emblem-system.gif)!important;}.x-toolbar-body table{width:100%;} \ No newline at end of file +*/.k-textlinethrough{text-decoration:line-through;color:red;}.k-textnormal{text-decoration:inherit;color:green;}.k-textunderline{text-decoration:underline;color:gray;}.x-tool-kmenu{background-position:0 -75px;}.x-tool-kmenu-over{background-position:-15px -75px;}.k-border-openbox{border-bottom:1px #D0D0D0 solid;border-right:1px #D0D0D0 solid;border-left:1px #D0D0D0 solid;}/* SiteToastMessages */.k-stm-info-icon{background-image:url(img/info.gif)!important;}.k-stm-imp-icon{background-image:url(img/alert.gif)!important;}.k-stm-verimp-icon{background-image:url(img/important.gif)!important;}.k-stm-error-icon{background-image:url(img/error.gif)!important;}.k-error-tb{background:#FFB380 none repeat scroll 0 50%;color:#250;}.k-infod-head{font-size:108%;margin-bottom:10px;}.gwt-DisclosurePanel{}.gwt-DisclosurePanel-open{}.gwt-DisclosurePanel-closed{}.gwt-DisclosurePanel .header,.gwt-DisclosurePanel .header a,.gwt-DisclosurePanel .header td{text-decoration:none;/* Remove underline from header */color:#000;cursor:pointer;cursor:hand;}.gwt-DisclosurePanel .content{border-left:3px solid #e8eef7;padding:4px 0 4px 8px;margin-left:6px;}.k-basic-thumb{background:#FAFAFA none repeat scroll 0 50%;border:1px solid #EBEBEB;padding:3px;margin:3px;}.k-basic-thumb td{padding:2px 3px;border:none;}.k-text-gray{color:gray;}.k-elp-limg{margin-top:4px;margin-left:5px;cursor:pointer;}.k-tsp-tag{float:right;margin-right:5px;cursor:pointer;color:#00F;}.k-tsp-cloud{vertical-align:bottom;}.k-options-icon{background-image:url(img/emblem-system.gif)!important;}.x-toolbar-body table{/* width: 100%; */}.k-preview-msg{background:#FCA;}.k-preview-msg-lab{background:#FCA;padding:0 5px;} \ No newline at end of file Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css =================================================================== --- trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/app/public/css/kune-new.css 2008-12-05 17:53:45 UTC (rev 985) @@ -816,6 +816,15 @@ } .x-toolbar-body table { - width: 100%; + /* width: 100%; */ } +.k-preview-msg + { + background: #FFCCAA; +} +.k-preview-msg-lab + { + background: #FFCCAA; + padding: 0 5px; +} Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/blogs/client/BlogClientModule.java 2008-12-05 17:53:45 UTC (rev 985) @@ -108,7 +108,7 @@ public BlogFolderContent create() { final BlogFolderContentPresenter presenter = new BlogFolderContentPresenter($(StateManager.class), $(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class), - $(I18nTranslationService.class)); + $(I18nTranslationService.class), $$(FileDownloadUtils.class)); final BlogFolderContentView view = new BlogFolderContentPanel($(WorkspaceSkeleton.class), $(I18nTranslationService.class)); presenter.init(view); Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -27,16 +27,20 @@ import org.ourproject.kune.platf.client.services.I18nTranslationService; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; +import com.calclab.suco.client.ioc.Provider; + public class BlogFolderContentPresenter extends FoldableContentPresenter implements BlogFolderContent { private BlogFolderContentView view; private final I18nTranslationService i18n; public BlogFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar, - final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n) { - super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry); + final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n, + Provider<FileDownloadUtils> downloadProvider) { + super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); this.i18n = i18n; } Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -22,62 +22,31 @@ import org.ourproject.kune.blogs.client.BlogClientTool; import org.ourproject.kune.platf.client.actions.ContentActionRegistry; import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar; -import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; import org.ourproject.kune.platf.client.dto.StateContentDTO; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; -import org.ourproject.kune.platf.client.ui.download.ImageSize; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; import com.calclab.suco.client.ioc.Provider; public class BlogViewerPresenter extends FoldableContentPresenter implements BlogViewer { - private BlogViewerView view; - private final Provider<FileDownloadUtils> downloadProvider; public BlogViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n, ActionContentToolbar toolbar, ContentActionRegistry actionRegistry, Provider<FileDownloadUtils> downloadProvider) { - super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry); - this.downloadProvider = downloadProvider; + super(BlogClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); } public void init(BlogViewerView view) { super.init(view); - this.view = view; } @Override protected void setState(StateContentDTO state) { super.setState(state); - setContent(state, BlogClientTool.TYPE_UPLOADEDFILE); + super.setContent(state, BlogClientTool.TYPE_UPLOADEDFILE); } - private void setContent(StateContentDTO state, String uploadedfileType) { - String typeId = state.getTypeId(); - String contentBody = state.getContent(); - StateToken token = state.getStateToken(); - BasicMimeTypeDTO mimeType = state.getMimeType(); - if (typeId.equals(uploadedfileType)) { - if (mimeType != null) { - FileDownloadUtils fileDownloadUtils = downloadProvider.get(); - if (mimeType.getType().equals("image")) { - view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token, - ImageSize.sized)); - } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) { - view.setContent(contentBody); - } else { - view.setContent(""); - } - } else { - view.setContent(""); - } - } else { - view.setContent(contentBody); - } - view.attach(); - } } Modified: trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/blogs/client/cnt/BlogViewerView.java 2008-12-05 17:53:45 UTC (rev 985) @@ -23,8 +23,4 @@ public interface BlogViewerView extends AbstractContentView { - void setContent(String content); - - void showImage(String imageUrl, String imageResizedUrl); - } Modified: trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java 2008-12-05 17:53:45 UTC (rev 985) @@ -37,6 +37,7 @@ import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.tool.ToolSelector; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; @@ -91,7 +92,7 @@ public ChatRoom create() { final ChatRoomPresenter presenter = new ChatRoomPresenter($(StateManager.class), $(Session.class), $(I18nUITranslationService.class), $(ActionContentToolbar.class), - $(ContentActionRegistry.class)); + $(ContentActionRegistry.class), $$(FileDownloadUtils.class)); final ChatRoomPanel panel = new ChatRoomPanel($(WorkspaceSkeleton.class), $(I18nTranslationService.class)); presenter.init(panel); Modified: trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/chat/client/cnt/ChatRoomPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -26,18 +26,22 @@ import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; import org.ourproject.kune.workspace.client.site.Site; +import com.calclab.suco.client.ioc.Provider; + public class ChatRoomPresenter extends FoldableContentPresenter implements ChatRoom { private ChatRoomView view; private final I18nUITranslationService i18n; public ChatRoomPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n, - ActionContentToolbar toolbar, final ActionRegistry<StateToken> actionRegistry) { - super(ChatClientTool.NAME, stateManager, session, toolbar, actionRegistry); + ActionContentToolbar toolbar, final ActionRegistry<StateToken> actionRegistry, + Provider<FileDownloadUtils> downloadProvider) { + super(ChatClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); this.i18n = i18n; } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java 2008-12-05 17:53:45 UTC (rev 985) @@ -100,7 +100,7 @@ createEditAction(TYPE_DOCUMENT); - createTranslateAction(TYPE_DOCUMENT, TYPE_FOLDER, TYPE_UPLOADEDFILE); + createTranslateAction(TYPE_DOCUMENT, TYPE_FOLDER); createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot); createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents); Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-12-05 17:53:45 UTC (rev 985) @@ -76,8 +76,8 @@ $(Session.class), $(StateManager.class), $(DeferredCommandWrapper.class), $$(ContentServiceAsync.class), $$(GroupServiceAsync.class), $$(FileUploader.class), $(ContentActionRegistry.class), $(ContextActionRegistry.class), $$(FileDownloadUtils.class), - $(EntityHeader.class), $$(TextEditor.class), $(KuneErrorHandler.class), $(DocumentViewer.class), - $$(ContextPropEditor.class)); + $(EntityHeader.class), $$(TextEditor.class), $(KuneErrorHandler.class), + $(DocumentViewer.class), $$(ContextPropEditor.class)); } }); @@ -107,7 +107,8 @@ @Override public DocFolderContent create() { final DocFolderContentPresenter presenter = new DocFolderContentPresenter($(StateManager.class), - $(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class)); + $(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class), + $$(FileDownloadUtils.class)); final DocFolderContentView view = new DocFolderContentPanel($(WorkspaceSkeleton.class), $(I18nTranslationService.class)); presenter.init(view); Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java 2008-12-05 17:53:45 UTC (rev 985) @@ -46,7 +46,7 @@ registerRateableTypes(TYPE_DOCUMENT, TYPE_UPLOADEDFILE); registerRenamableTypes(TYPE_DOCUMENT, TYPE_FOLDER, TYPE_UPLOADEDFILE); registerTageableTypes(TYPE_DOCUMENT, TYPE_UPLOADEDFILE); - registerTranslatableTypes(TYPE_DOCUMENT, TYPE_FOLDER, TYPE_UPLOADEDFILE); + registerTranslatableTypes(TYPE_DOCUMENT, TYPE_FOLDER); registerIcons(); } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPanel.java 2008-12-05 17:53:45 UTC (rev 985) @@ -21,13 +21,11 @@ import org.ourproject.kune.platf.client.services.I18nTranslationService; import org.ourproject.kune.workspace.client.cnt.FoldableContentPanel; -import org.ourproject.kune.workspace.client.site.Site; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; public class DocFolderContentPanel extends FoldableContentPanel implements DocFolderContentView { public DocFolderContentPanel(WorkspaceSkeleton ws, I18nTranslationService i18n) { super(ws, i18n); - super.setLabel("Folder properties, translations ..." + Site.IN_DEVELOPMENT); } } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -25,13 +25,16 @@ import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; +import com.calclab.suco.client.ioc.Provider; + public class DocFolderContentPresenter extends FoldableContentPresenter implements DocFolderContent { public DocFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar, - final ActionRegistry<StateToken> actionRegistry) { - super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry); + final ActionRegistry<StateToken> actionRegistry, Provider<FileDownloadUtils> downloadProvider) { + super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); } public void init(final DocFolderContentView view) { Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -22,32 +22,25 @@ import org.ourproject.kune.docs.client.DocumentClientTool; import org.ourproject.kune.platf.client.actions.ContentActionRegistry; import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar; -import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; import org.ourproject.kune.platf.client.dto.StateContentDTO; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; -import org.ourproject.kune.platf.client.ui.download.ImageSize; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; import com.calclab.suco.client.ioc.Provider; public class DocumentViewerPresenter extends FoldableContentPresenter implements DocumentViewer { - private DocumentViewerView view; - private final Provider<FileDownloadUtils> downloadProvider; public DocumentViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n, ActionContentToolbar toolbar, ContentActionRegistry actionRegistry, Provider<FileDownloadUtils> downloadProvider) { - super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry); - this.downloadProvider = downloadProvider; + super(DocumentClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); } public void init(DocumentViewerView view) { super.init(view); - this.view = view; } @Override @@ -55,29 +48,4 @@ super.setState(state); setContent(state, DocumentClientTool.TYPE_UPLOADEDFILE); } - - private void setContent(StateContentDTO state, String uploadedfileType) { - String typeId = state.getTypeId(); - String contentBody = state.getContent(); - StateToken token = state.getStateToken(); - BasicMimeTypeDTO mimeType = state.getMimeType(); - if (typeId.equals(uploadedfileType)) { - if (mimeType != null) { - FileDownloadUtils fileDownloadUtils = downloadProvider.get(); - if (mimeType.getType().equals("image")) { - view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token, - ImageSize.sized)); - } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) { - view.setContent(contentBody); - } else { - view.setContent(""); - } - } else { - view.setContent(""); - } - } else { - view.setContent(contentBody); - } - view.attach(); - } } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerView.java 2008-12-05 17:53:45 UTC (rev 985) @@ -22,9 +22,4 @@ import org.ourproject.kune.workspace.client.cnt.AbstractContentView; public interface DocumentViewerView extends AbstractContentView { - - void setContent(String content); - - void showImage(String imageUrl, String imageResizedUrl); - } Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientModule.java 2008-12-05 17:53:45 UTC (rev 985) @@ -108,9 +108,10 @@ public GalleryFolderContent create() { final GalleryFolderContentPresenter presenter = new GalleryFolderContentPresenter( $(StateManager.class), $(Session.class), $(ActionContentToolbar.class), - $(ContentActionRegistry.class), $(I18nTranslationService.class), $$(FileDownloadUtils.class)); + $(ContentActionRegistry.class), $(I18nTranslationService.class), $$(FileDownloadUtils.class), + $$(FileDownloadUtils.class)); final GalleryFolderContentView view = new GalleryFolderContentPanel($(WorkspaceSkeleton.class), - $(I18nTranslationService.class), $(StateManager.class)); + $(I18nTranslationService.class), $(StateManager.class), $(Session.class)); presenter.init(view); return presenter; } Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientTool.java 2008-12-05 17:53:45 UTC (rev 985) @@ -45,7 +45,7 @@ registerRateableTypes(TYPE_UPLOADEDFILE); registerRenamableTypes(TYPE_ALBUM, TYPE_UPLOADEDFILE); registerTageableTypes(TYPE_UPLOADEDFILE); - registerTranslatableTypes(TYPE_ALBUM, TYPE_UPLOADEDFILE); + // registerTranslatableTypes(); registerIcons(); } Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPanel.java 2008-12-05 17:53:45 UTC (rev 985) @@ -21,6 +21,7 @@ import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.BasicThumb; import org.ourproject.kune.workspace.client.cnt.FoldableContentPanel; @@ -37,20 +38,24 @@ private static final int TEXT_MAX_LENGHT = 15; private FlowPanel flowPanel; private final StateManager stateManager; + private final Session session; - public GalleryFolderContentPanel(WorkspaceSkeleton ws, I18nTranslationService i18n, StateManager stateManager) { + public GalleryFolderContentPanel(WorkspaceSkeleton ws, I18nTranslationService i18n, StateManager stateManager, + Session session) { super(ws, i18n); this.stateManager = stateManager; + this.session = session; } public void addThumb(final StateToken token, final String title, final String imgUrl) { DeferredCommand.addCommand(new Command() { public void execute() { - BasicThumb thumb = new BasicThumb(imgUrl, 85, title, TEXT_MAX_LENGHT, true, new ClickListener() { - public void onClick(Widget sender) { - stateManager.gotoToken(token); - } - }); + BasicThumb thumb = new BasicThumb(imgUrl, session.getImgCropsize(), title, TEXT_MAX_LENGHT, true, + new ClickListener() { + public void onClick(Widget sender) { + stateManager.gotoToken(token); + } + }); thumb.setHeight("100"); thumb.setWidth("100"); if (title.length() > TEXT_MAX_LENGHT) { @@ -67,6 +72,6 @@ } else { flowPanel.clear(); } - super.setContent(flowPanel); + super.setWidgetAsContent(flowPanel, true); } } Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -43,8 +43,8 @@ public GalleryFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar, final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n, - Provider<FileDownloadUtils> downloadUtils) { - super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry); + Provider<FileDownloadUtils> downloadUtils, Provider<FileDownloadUtils> downloadProvider) { + super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); this.i18n = i18n; this.downloadUtils = downloadUtils; } Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -22,32 +22,25 @@ import org.ourproject.kune.gallery.client.GalleryClientTool; import org.ourproject.kune.platf.client.actions.ContentActionRegistry; import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar; -import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; import org.ourproject.kune.platf.client.dto.StateContentDTO; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; -import org.ourproject.kune.platf.client.ui.download.ImageSize; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; import com.calclab.suco.client.ioc.Provider; public class GalleryViewerPresenter extends FoldableContentPresenter implements GalleryViewer { - private GalleryViewerView view; - private final Provider<FileDownloadUtils> downloadProvider; public GalleryViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n, ActionContentToolbar toolbar, ContentActionRegistry actionRegistry, Provider<FileDownloadUtils> downloadProvider) { - super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry); - this.downloadProvider = downloadProvider; + super(GalleryClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); } public void init(GalleryViewerView view) { super.init(view); - this.view = view; } @Override @@ -56,28 +49,4 @@ setContent(state, GalleryClientTool.TYPE_UPLOADEDFILE); } - private void setContent(StateContentDTO state, String uploadedfileType) { - String typeId = state.getTypeId(); - String contentBody = state.getContent(); - StateToken token = state.getStateToken(); - BasicMimeTypeDTO mimeType = state.getMimeType(); - if (typeId.equals(uploadedfileType)) { - if (mimeType != null) { - FileDownloadUtils fileDownloadUtils = downloadProvider.get(); - if (mimeType.getType().equals("image")) { - view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token, - ImageSize.sized)); - } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) { - view.setContent(contentBody); - } else { - view.setContent(""); - } - } else { - view.setContent(""); - } - } else { - view.setContent(contentBody); - } - view.attach(); - } } Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/cnt/GalleryViewerView.java 2008-12-05 17:53:45 UTC (rev 985) @@ -22,9 +22,4 @@ import org.ourproject.kune.workspace.client.cnt.AbstractContentView; public interface GalleryViewerView extends AbstractContentView { - - void setContent(String content); - - void showImage(String imageUrl, String imageResizedUrl); - } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java 2008-12-05 17:53:45 UTC (rev 985) @@ -52,10 +52,33 @@ return type; } + /** + * Duplicate code in BMT + * + * @return + */ public boolean isImage() { - return getType().equals("image"); + return type != null && type.equals("image"); } + /** + * Duplicate code in BMT + * + * @return + */ + public boolean isPdf() { + return type != null && subtype != null && type.equals("application") && subtype.equals("pdf"); + } + + /** + * Duplicate code in BMTDTO + * + * @return + */ + public boolean isText() { + return type != null && subtype != null && type.equals("text") && subtype.equals("plain"); + } + public void setSubtype(final String subtype) { this.subtype = subtype; } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-12-05 17:53:45 UTC (rev 985) @@ -384,7 +384,7 @@ $(I18nUITranslationService.class), $(StateManager.class), $(SiteSignOutLink.class), $(DeferredCommandWrapper.class)); final TextEditorPanel panel = new TextEditorPanel(presenter, $(I18nTranslationService.class), - $(WorkspaceSkeleton.class), $(ColorWebSafePalette.class)); + $(WorkspaceSkeleton.class), $(ColorWebSafePalette.class), false); presenter.init(panel); return presenter; } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/KuneUiUtils.java 2008-12-05 17:53:45 UTC (rev 985) @@ -77,7 +77,7 @@ return tipHtml; } - public static String genQuickTipWithImage(String imageResizedUrl) { + public static String genQuickTipWithImage(String imageResizedUrl, int size) { return new Image(imageResizedUrl).toString(); } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/server/domain/BasicMimeType.java 2008-12-05 17:53:45 UTC (rev 985) @@ -53,6 +53,33 @@ return type; } + /** + * Duplicate code in BMTDTO + * + * @return + */ + public boolean isImage() { + return type != null && type.equals("image"); + } + + /** + * Duplicate code in BMTDTO + * + * @return + */ + public boolean isPdf() { + return type != null && subtype != null && type.equals("application") && subtype.equals("pdf"); + } + + /** + * Duplicate code in BMTDTO + * + * @return + */ + public boolean isText() { + return type != null && subtype != null && type.equals("text") && subtype.equals("plain"); + } + public void setSubtype(final String subtype) { this.subtype = subtype; } @@ -61,6 +88,7 @@ this.type = type; } + @Override public String toString() { return subtype == null ? type : type + "/" + subtype; } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileDownloadManager.java 2008-12-05 17:53:45 UTC (rev 985) @@ -75,16 +75,24 @@ String extension = FileUtils.getFileNameExtension(filename, true); BasicMimeType mimeType = cnt.getMimeType(); - if (mimeType.getType().equals("image")) { + boolean isPdfAndNotDownload = mimeType.isPdf() && !download; + if (mimeType.isImage() || isPdfAndNotDownload) { String imgsizePrefix = imgsize == null ? "" : "." + imgsize; String filenameWithoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension); - String filenameResized = filenameWithoutExtension + imgsizePrefix + extension; + String filenameResized = filenameWithoutExtension + imgsizePrefix + + (isPdfAndNotDownload ? ".png" : extension); if (new File(absDir + filenameResized).exists()) { // thumb can fail filename = filenameResized; } } + // We will send the pdf thumb not the real pdf + if (isPdfAndNotDownload) { + extension = ".png"; + mimeType = new BasicMimeType("image", "png"); + } + final String absFilename = absDir + filename; doBuildResp(resp, absFilename, cnt.getTitle(), mimeType, extension, download); @@ -98,7 +106,7 @@ resp.setContentLength((int) file.length()); if (mimeType == null || download) { resp.setContentType("application/x-download"); - } else if (mimeType.getType().equals("image")) { + } else if (mimeType.isImage()) { resp.setContentType(mimeType.toString()); } else { resp.setContentType("application/x-download"); Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/FileUploadManager.java 2008-12-05 17:53:45 UTC (rev 985) @@ -42,6 +42,7 @@ import org.ourproject.kune.platf.server.domain.User; import org.ourproject.kune.platf.server.manager.FileManager; import org.ourproject.kune.platf.server.properties.KuneProperties; +import org.ourproject.kune.platf.server.utils.StringW; import com.google.inject.Inject; import com.google.inject.servlet.RequestScoped; @@ -116,15 +117,21 @@ log.info("Mimetype: " + basicMimeType); final String extension = FileUtils.getFileNameExtension(file.getName(), false); - if (basicMimeType.getType().equals("image")) { - generateThumbs(absDir, file.getName(), extension); + String preview = ""; + + if (basicMimeType.isImage()) { + generateThumbs(absDir, file.getName(), extension, false); + } else if (basicMimeType.isPdf()) { + generateThumbs(absDir, file.getName(), "png", true); + } else if (basicMimeType.isText()) { + String textPreview = new String(FileUtils.getBytesFromFile(file)); + preview = "<pre>" + StringW.wordWrap(textPreview) + "</pre>"; } // Persist final User user = userSession.getUser(); final Container container = accessService.accessToContainer(ContentUtils.parseId(stateToken.getFolder()), user, AccessRol.Editor); - final String preview = "Preview of this file (in development)"; final Content content = contentManager.createContent(FileUtils.getFileNameWithoutExtension(file.getName(), extension), preview, user, container, typeId); content.setMimeType(basicMimeType); @@ -138,7 +145,7 @@ } } - private void generateThumbs(String absDir, String filename, String extension) { + private void generateThumbs(String absDir, String filename, String extension, boolean isPdf) { try { String fileOrig = absDir + filename; String withoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension); @@ -146,6 +153,7 @@ String resizeName = absDir + withoutExtension + "." + ImageSize.sized + "." + extension; String thumbName = absDir + withoutExtension + "." + ImageSize.thumb + "." + extension; String iconName = absDir + withoutExtension + "." + ImageSize.ico + "." + extension; + String previewName = absDir + withoutExtension + "." + extension; int resizeWidth = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_RESIZEWIDTH)); int thumbSize = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_THUMBSIZE)); @@ -155,6 +163,9 @@ ImageUtilsDefault.scaleImageToMax(fileOrig, resizeName, resizeWidth); ImageUtilsDefault.createThumb(fileOrig, thumbName, thumbSize, cropSize); ImageUtilsDefault.createThumb(fileOrig, iconName, iconSize); + if (isPdf) { + ImageUtilsDefault.createThumbFromPdf(fileOrig, previewName); + } } catch (NumberFormatException e) { log.error("Image sizes in kune.properties are not integers"); Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefault.java 2008-12-05 17:53:45 UTC (rev 985) @@ -46,7 +46,7 @@ if (thumbDimension < cropDimension) { throw new IndexOutOfBoundsException("Thumb dimension must be bigger than crop dimension"); } - MagickImage imageOrig = createImage(fileOrig); + MagickImage imageOrig = readImage(fileOrig); Dimension origDimension = imageOrig.getDimension(); int origHeight = origDimension.height; int origWidth = origDimension.width; @@ -57,6 +57,12 @@ cropImage(scaled, fileDest, x, y, cropDimension, cropDimension); } + static public boolean createThumbFromPdf(String pdfFile, String newPngFile) throws MagickException { + MagickImage pdf = readImage(pdfFile); + MagickImage pdf1 = pdf.breakFrames()[0]; + return writeImage(pdf1, newPngFile); + } + public static boolean cropImage(String fileOrig, String fileDest, int x, int y, int width, int height) throws MagickException, FileNotFoundException { Rectangle rectangle = new Rectangle(x, y, width, height); @@ -66,32 +72,42 @@ public static boolean cropImage(String fileOrig, String fileDest, Rectangle rectangle) throws MagickException, FileNotFoundException { checkExist(fileOrig); - return cropImage(createImage(fileOrig), fileDest, rectangle); + return cropImage(readImage(fileOrig), fileDest, rectangle); } public static Dimension getDimension(String file) throws MagickException { - MagickImage imageOrig = createImage(file); + MagickImage imageOrig = readImage(file); return imageOrig.getDimension(); } + /** + * FIXME: Not working, returns null always (bug) + * + */ + public static String getPage(String file) throws MagickException { + ImageInfo imageInfo = new ImageInfo(file); + new MagickImage(imageInfo); + return imageInfo.getPage(); + } + public static boolean scaleImage(String fileOrig, String fileDest, Dimension dimension) throws MagickException, FileNotFoundException { checkExist(fileOrig); - MagickImage imageOrig = createImage(fileOrig); + MagickImage imageOrig = readImage(fileOrig); return scaleImage(imageOrig, fileDest, (int) dimension.getWidth(), (int) dimension.getHeight()); } public static boolean scaleImage(String fileOrig, String fileDest, int width, int height) throws MagickException, FileNotFoundException { checkExist(fileOrig); - MagickImage imageOrig = createImage(fileOrig); + MagickImage imageOrig = readImage(fileOrig); return scaleImage(imageOrig, fileDest, width, height); } public static boolean scaleImageToMax(String fileOrig, String fileDest, int maxSize) throws MagickException, FileNotFoundException { checkExist(fileOrig); - MagickImage imageOrig = createImage(fileOrig); + MagickImage imageOrig = readImage(fileOrig); Dimension origDimension = imageOrig.getDimension(); int origHeight = origDimension.height; int origWidth = origDimension.width; @@ -130,12 +146,14 @@ } private static ImageInfo createEmptyImageInfo() throws MagickException { - ImageInfo info = new ImageInfo(); - return info; + ImageInfo imageInfo = new ImageInfo(); + return imageInfo; } - private static MagickImage createImage(String file) throws MagickException { - return new MagickImage(new ImageInfo(file)); + private static ImageInfo createEmptyImageInfoWithNoPage() throws MagickException { + ImageInfo imageInfo = createEmptyImageInfo(); + imageInfo.setPage("0x0+0+0"); + return imageInfo; } private static boolean cropImage(MagickImage fileOrig, String fileDest, int x, int y, int width, int height) @@ -146,9 +164,16 @@ private static boolean cropImage(MagickImage fileOrig, String fileDest, Rectangle rectangle) throws MagickException { MagickImage cropped = fileOrig.cropImage(rectangle); - return writeImage(cropped, fileDest); + cropped.setFileName(fileDest); + ImageInfo imageInfo = createEmptyImageInfoWithNoPage(); + return cropped.writeImage(imageInfo); } + private static MagickImage readImage(String file) throws MagickException { + ImageInfo imageInfo = new ImageInfo(file); + return new MagickImage(imageInfo); + } + private static MagickImage scaleImage(MagickImage imageOrig, int width, int height) throws MagickException { return imageOrig.scaleImage(width, height); } Added: trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/server/utils/StringW.java 2008-12-05 17:53:45 UTC (rev 985) @@ -0,0 +1,305 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Copied from GenerationJava Core Library. +//package com.generationjava.lang; +// copied in kune from: +// http://svn.apache.org/repos/asf/jakarta/taglibs/proper/string/trunk/src/org/... +package org.ourproject.kune.platf.server.utils; + +import org.apache.commons.lang.StringUtils; + +/** + * A set of String library static methods. While extending String or + * StringBuffer would have been the nicest solution, that is not possible, so a + * simple set of static methods seems the most workable. + * + * Method ideas have so far been taken from the PHP4, Ruby and .NET languages. + * + * @author [email protected] + * @version 0.4 20010812 + */ +final public class StringW { + + /** + * Quote a string so that it may be used in a regular expression without any + * parts of the string being considered as a part of the regular + * expression's control characters. + */ + static public String quoteRegularExpression(String str) { + // replace ? + * / . ^ $ as long as they're not in character + // class. so must be done by hand + char[] chrs = str.toCharArray(); + int sz = chrs.length; + StringBuffer buffer = new StringBuffer(2 * sz); + for (int i = 0; i < sz; i++) { + switch (chrs[i]) { + case '[': + case ']': + case '?': + case '+': + case '*': + case '/': + case '.': + case '^': + case '$': + buffer.append("\\"); + default: + buffer.append(chrs[i]); + } + } + return buffer.toString(); + } + + /** + * Truncates a string nicely. It will search for the first space after the + * lower limit and truncate the string there. It will also append any string + * passed as a parameter to the end of the string. The hard limit can be + * specified to forcibily truncate a string (in the case of an extremely + * long word or such). All HTML/XML markup will be stripped from the string + * prior to processing for truncation. + * + * @param str + * String the string to be truncated. + * @param lower + * int value of the lower limit. + * @param upper + * int value of the upper limit, -1 if no limit is desired. If + * the uppper limit is lower than the lower limit, it will be + * adjusted to be same as the lower limit. + * @param appendToEnd + * String to be appended to the end of the truncated string. This + * is appended ONLY if the string was indeed truncated. The + * append is does not count towards any lower/upper limits. + * + * @author [email protected] + */ + public static String truncateNicely(String str, int lower, int upper, String appendToEnd) { + // strip markup from the string + str = XmlW.removeXml(str); + + // unescape temporarily for length handling + str = XmlW.unescapeXml(str); + + // quickly adjust the upper if it is set lower than 'lower' + if (upper < lower) { + upper = lower; + } + + // now determine if the string fits within the upper limit + // if it does, go straight to return, do not pass 'go' and collect $200 + if (str.length() > upper) { + // the magic location int + int loc; + + // first we determine where the next space appears after lower + loc = str.lastIndexOf(' ', upper); + + // now we'll see if the location is greater than the lower limit + if (loc >= lower) { + // yes it was, so we'll cut it off here + str = str.substring(0, loc); + } else { + // no it wasnt, so we'll cut it off at the upper limit + str = str.substring(0, upper); + } + + // the string was truncated, so we append the appendToEnd String + str = str + appendToEnd; + } + + // escape after finished processing string + str = XmlW.escapeXml(str); + + return str; + } + + /** + * Create a word-wrapped version of a String. Wrap at 80 characters and use + * newlines as the delimiter. If a word is over 80 characters long use a - + * sign to split it. + */ + static public String wordWrap(String str) { + return wordWrap(str, 80, "\n", "-", true); + } + + /** + * Create a word-wrapped version of a String. Wrap at a specified width and + * use newlines as the delimiter. If a word is over the width in lenght use + * a - sign to split it. + */ + static public String wordWrap(String str, int width) { + return wordWrap(str, width, "\n", "-", true); + } + + /** + * Word-wrap a string. + * + * @param str + * String to word-wrap + * @param width + * int to wrap at + * @param delim + * String to use to separate lines + * @param split + * String to use to split a word greater than width long + * + * @return String that has been word wrapped (with the delim inside width + * boundaries) + */ + static public String wordWrap(String str, int width, String delim, String split) { + return wordWrap(str, width, delim, split, true); + } + + /** + * Word-wrap a string. + * + * @param str + * String to word-wrap + * @param width + * int to wrap at + * @param delim + * String to use to separate lines + * @param split + * String to use to split a word greater than width long + * @param delimInside + * wheter or not delim should be included in chunk before length + * reaches width. + * + * @return String that has been word wrapped + */ + static public String wordWrap(String str, int width, String delim, String split, boolean delimInside) { + int sz = str.length(); + + // System.err.println( ">>>> inside: " + delimInside + " sz : " + sz ); + + // / shift width up one. mainly as it makes the logic easier + width++; + + // our best guess as to an initial size + StringBuffer buffer = new StringBuffer(sz / width * delim.length() + sz); + + // every line might include a delim on the end + // System.err.println( "width before: "+ width ); + if (delimInside) { + width = width - delim.length(); + } else { + width--; + } + // System.err.println( "width after: "+ width ); + + int idx = -1; + String substr = null; + + // beware: i is rolled-back inside the loop + for (int i = 0; i < sz; i += width) { + + // on the last line + if (i > sz - width) { + buffer.append(str.substring(i)); + // System.err.print("LAST-LINE: "+str.substring(i)); + break; + } + + // System.err.println("loop[i] is: "+i); + // the current line + substr = str.substring(i, i + width); + // System.err.println( "substr: " + substr ); + + // is the delim already on the line + idx = substr.indexOf(delim); + // System.err.println( "i: " + i + " idx : " + idx ); + if (idx != -1) { + buffer.append(substr.substring(0, idx)); + // System.err.println("Substr: '"substr.substring(0,idx)+"'"); + buffer.append(delim); + i -= width - idx - delim.length(); + + // System.err.println("loop[i] is now: "+i); + // System.err.println("ounfd-whitespace: '"+substr.charAt(idx+1)+"'."); + // Erase a space after a delim. Is this too obscure? + if (substr.length() > idx + 1) { + if (substr.charAt(idx + 1) != '\n') { + if (Character.isWhitespace(substr.charAt(idx + 1))) { + i++; + } + } + } + // System.err.println("i -= "+width+"-"+idx); + continue; + } + + idx = -1; + + // figure out where the last space is + char[] chrs = substr.toCharArray(); + for (int j = width; j > 0; j--) { + if (Character.isWhitespace(chrs[j - 1])) { + idx = j; + // System.err.println("Found whitespace: "+idx); + break; + } + } + + // idx is the last whitespace on the line. + // System.err.println("idx is "+idx); + if (idx == -1) { + for (int j = width; j > 0; j--) { + if (chrs[j - 1] == '-') { + idx = j; + // System.err.println("Found Dash: "+idx); + break; + } + } + if (idx == -1) { + buffer.append(substr); + buffer.append(delim); + // System.err.print(substr); + // System.err.print(delim); + } else { + if (idx != width) { + idx++; + } + buffer.append(substr.substring(0, idx)); + buffer.append(delim); + // System.err.print(substr.substring(0,idx)); + // System.err.print(delim); + i -= width - idx; + } + } else { + /* + * if(force) { if(idx == width-1) { buffer.append(substr); + * buffer.append(delim); } else { // stick a split in. int + * splitsz = split.length(); + * buffer.append(substr.substring(0,width-splitsz)); + * buffer.append(split); buffer.append(delim); i -= splitsz; } } + * else { + */ + // insert spaces + buffer.append(substr.substring(0, idx)); + buffer.append(StringUtils.repeat(" ", width - idx)); + // System.err.print(substr.substring(0,idx)); + // System.err.print(StringUtils.repeat(" ",width-idx)); + buffer.append(delim); + // System.err.print(delim); + // System.err.println("i -= "+width+"-"+idx); + i -= width - idx; + // } + } + } + // System.err.println("\n*************"); + return buffer.toString(); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/platf/server/utils/XmlW.java 2008-12-05 17:53:45 UTC (rev 985) @@ -0,0 +1,161 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Copied from GenerationJava Core Library. +//package com.generationjava.web; +// Copied in kune from: +// http://svn.apache.org/repos/asf/jakarta/taglibs/proper/string/trunk/src/org/... +package org.ourproject.kune.platf.server.utils; + +import org.apache.commons.lang.StringUtils; + +/** + * XML helping static methods. + * + * @author [email protected] + * @version 0.4 20010812 + */ +final public class XmlW { + + static public String escapeXml(String str) { + str = StringUtils.replace(str, "&", "&"); + str = StringUtils.replace(str, "<", "<"); + str = StringUtils.replace(str, ">", ">"); + str = StringUtils.replace(str, "\"", """); + str = StringUtils.replace(str, "'", "'"); + return str; + } + + static public String getAttribute(String attribute, String text) { + return getAttribute(attribute, text, 0); + } + + static public String getAttribute(String attribute, String text, int idx) { + int close = text.indexOf(">", idx); + int attrIdx = text.indexOf(attribute + "=\"", idx); + if (attrIdx == -1) { + return null; + } + if (attrIdx > close) { + return null; + } + int attrStartIdx = attrIdx + attribute.length() + 2; + int attrCloseIdx = text.indexOf("\"", attrStartIdx); + if (attrCloseIdx > close) { + return null; + } + return unescapeXml(text.substring(attrStartIdx, attrCloseIdx)); + } + + static public String getContent(String tag, String text) { + int idx = XmlW.getIndexOpeningTag(tag, text); + if (idx == -1) { + return ""; + } + text = text.substring(idx); + int end = XmlW.getIndexClosingTag(tag, text); + idx = text.indexOf('>'); + if (idx == -1) { + return ""; + } + return text.substring(idx + 1, end); + } + + // Pass in "para" and a string that starts with + // <para> and it will return the index of the matching </para> + // It assumes well-formed xml. Or well enough. + static public int getIndexClosingTag(String tag, String text) { + return getIndexClosingTag(tag, text, 0); + } + + static public int getIndexClosingTag(String tag, String text, int start) { + String open = "<" + tag; + String close = "</" + tag + ">"; + // System.err.println("OPEN: "+open); + // System.err.println("CLOSE: "+close); + int closeSz = close.length(); + int nextCloseIdx = text.indexOf(close, start); + // System.err.println("first close: "+nextCloseIdx); + if (nextCloseIdx == -1) { + return -1; + } + int count = StringUtils.countMatches(text.substring(start, nextCloseIdx), open); + // System.err.println("count: "+count); + if (count == 0) { + return -1; // tag is never opened + } + int expected = 1; + while (count != expected) { + nextCloseIdx = text.indexOf(close, nextCloseIdx + closeSz); + if (nextCloseIdx == -1) { + return -1; + } + count = StringUtils.countMatches(text.substring(start, nextCloseIdx), open); + expected++; + } + return nextCloseIdx; + } + + static public int getIndexOpeningTag(String tag, String text) { + return getIndexOpeningTag(tag, text, 0); + } + + /** + * Remove any xml tags from a String. Same as HtmlW's method. + */ + static public String removeXml(String str) { + int sz = str.length(); + StringBuffer buffer = new StringBuffer(sz); + // boolean inString = false; + boolean inTag = false; + for (int i = 0; i < sz; i++) { + char ch = str.charAt(i); + if (ch == '<') { + inTag = true; + } else if (ch == '>') { + inTag = false; + continue; + } + if (!inTag) { + buffer.append(ch); + } + } + return buffer.toString(); + } + + static public String unescapeXml(String str) { + str = StringUtils.replace(str, "&", "&"); + str = StringUtils.replace(str, "<", "<"); + str = StringUtils.replace(str, ">", ">"); + str = StringUtils.replace(str, """, "\""); + str = StringUtils.replace(str, "'", "'"); + return str; + } + + static private int getIndexOpeningTag(String tag, String text, int start) { + // consider whitespace? + int idx = text.indexOf("<" + tag, start); + if (idx == -1) { + return -1; + } + char next = text.charAt(idx + 1 + tag.length()); + if ((next == '>') || Character.isWhitespace(next)) { + return idx; + } else { + return getIndexOpeningTag(tag, text, idx + 1); + } + } + +} Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java 2008-12-05 17:53:45 UTC (rev 985) @@ -100,7 +100,7 @@ createEditAction(TYPE_WIKIPAGE); - createTranslateAction(TYPE_FOLDER, TYPE_UPLOADEDFILE, TYPE_WIKIPAGE); + createTranslateAction(TYPE_FOLDER, TYPE_WIKIPAGE); createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot); createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents); Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientModule.java 2008-12-05 17:53:45 UTC (rev 985) @@ -108,7 +108,7 @@ public WikiFolderContent create() { final WikiFolderContentPresenter presenter = new WikiFolderContentPresenter($(StateManager.class), $(Session.class), $(ActionContentToolbar.class), $(ContentActionRegistry.class), - $(I18nTranslationService.class)); + $(I18nTranslationService.class), $$(FileDownloadUtils.class)); final WikiFolderContentView view = new WikiFolderContentPanel($(WorkspaceSkeleton.class), $(I18nTranslationService.class)); presenter.init(view); Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientTool.java 2008-12-05 17:53:45 UTC (rev 985) @@ -46,7 +46,7 @@ registerRateableTypes(TYPE_UPLOADEDFILE, TYPE_WIKIPAGE); registerRenamableTypes(TYPE_FOLDER, TYPE_UPLOADEDFILE, TYPE_WIKIPAGE); registerTageableTypes(TYPE_UPLOADEDFILE, TYPE_WIKIPAGE); - registerTranslatableTypes(TYPE_FOLDER, TYPE_UPLOADEDFILE, TYPE_WIKIPAGE); + registerTranslatableTypes(TYPE_FOLDER, TYPE_WIKIPAGE); registerIcons(); } Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiFolderContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -27,17 +27,21 @@ import org.ourproject.kune.platf.client.services.I18nTranslationService; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.wiki.client.WikiClientTool; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; +import com.calclab.suco.client.ioc.Provider; + public class WikiFolderContentPresenter extends FoldableContentPresenter implements WikiFolderContent { private WikiFolderContentView view; private final I18nTranslationService i18n; public WikiFolderContentPresenter(StateManager stateManager, Session session, ActionContentToolbar toolbar, - final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n) { - super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry); + final ActionRegistry<StateToken> actionRegistry, I18nTranslationService i18n, + Provider<FileDownloadUtils> downloadProvider) { + super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); this.i18n = i18n; } Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -19,35 +19,28 @@ */ package org.ourproject.kune.wiki.client.cnt; -import org.ourproject.kune.wiki.client.WikiClientTool; import org.ourproject.kune.platf.client.actions.ContentActionRegistry; import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar; -import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; import org.ourproject.kune.platf.client.dto.StateContentDTO; -import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; -import org.ourproject.kune.platf.client.ui.download.ImageSize; +import org.ourproject.kune.wiki.client.WikiClientTool; import org.ourproject.kune.workspace.client.cnt.FoldableContentPresenter; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; import com.calclab.suco.client.ioc.Provider; public class WikiViewerPresenter extends FoldableContentPresenter implements WikiViewer { - private WikiViewerView view; - private final Provider<FileDownloadUtils> downloadProvider; public WikiViewerPresenter(StateManager stateManager, Session session, I18nUITranslationService i18n, ActionContentToolbar toolbar, ContentActionRegistry actionRegistry, Provider<FileDownloadUtils> downloadProvider) { - super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry); - this.downloadProvider = downloadProvider; + super(WikiClientTool.NAME, stateManager, session, toolbar, actionRegistry, downloadProvider); } public void init(WikiViewerView view) { super.init(view); - this.view = view; } @Override @@ -55,29 +48,4 @@ super.setState(state); setContent(state, WikiClientTool.TYPE_UPLOADEDFILE); } - - private void setContent(StateContentDTO state, String uploadedfileType) { - String typeId = state.getTypeId(); - String contentBody = state.getContent(); - StateToken token = state.getStateToken(); - BasicMimeTypeDTO mimeType = state.getMimeType(); - if (typeId.equals(uploadedfileType)) { - if (mimeType != null) { - FileDownloadUtils fileDownloadUtils = downloadProvider.get(); - if (mimeType.getType().equals("image")) { - view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token, - ImageSize.sized)); - } else if (mimeType.toString().equals("text/plain") || mimeType.toString().equals("application/pdf")) { - view.setContent(contentBody); - } else { - view.setContent(""); - } - } else { - view.setContent(""); - } - } else { - view.setContent(contentBody); - } - view.attach(); - } } Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/cnt/WikiViewerView.java 2008-12-05 17:53:45 UTC (rev 985) @@ -22,9 +22,4 @@ import org.ourproject.kune.workspace.client.cnt.AbstractContentView; public interface WikiViewerView extends AbstractContentView { - - void setContent(String content); - - void showImage(String imageUrl, String imageResizedUrl); - } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -2,7 +2,7 @@ public abstract class AbstractContentPresenter { - private AbstractContentView view; + protected AbstractContentView view; public AbstractContentPresenter() { } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/AbstractContentView.java 2008-12-05 17:53:45 UTC (rev 985) @@ -1,11 +1,22 @@ package org.ourproject.kune.workspace.client.cnt; +import com.google.gwt.user.client.ui.Widget; + public interface AbstractContentView { + public void setRawContent(final String content); + void attach(); void detach(); + void setContent(String content, boolean showPreviewMsg); + void setInfo(String info); + void setNoPreview(); + + void setWidgetAsContent(final Widget widget, boolean setDefMargins); + + void showImage(String imageUrl, String imageResizedUrl, boolean showPreviewMsg); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPanel.java 2008-12-05 17:53:45 UTC (rev 985) @@ -1,35 +1,43 @@ package org.ourproject.kune.workspace.client.cnt; import org.ourproject.kune.platf.client.services.I18nTranslationService; +import org.ourproject.kune.platf.client.services.Images; +import org.ourproject.kune.platf.client.ui.IconLabel; import org.ourproject.kune.platf.client.ui.KuneUiUtils; +import org.ourproject.kune.platf.client.ui.RoundedPanel; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; -public abstract class FoldableContentPanel extends AbstractContentPanel { +public abstract class FoldableContentPanel extends AbstractContentPanel implements AbstractContentView { + private static final String DEF_CONTENT_MARGINS_STYLE = "kune-Margin-7-trbl"; private final I18nTranslationService i18n; + private final RoundedPanel previewPanel; + private final IconLabel previewLabel; public FoldableContentPanel(final WorkspaceSkeleton ws, I18nTranslationService i18n) { super(ws); this.i18n = i18n; + previewLabel = new IconLabel(Images.App.getInstance().info(), ""); + previewLabel.addStyleName("k-preview-msg-lab"); + previewPanel = new RoundedPanel(previewLabel, RoundedPanel.ALL, 2); + previewPanel.setCornerStyleName("k-preview-msg"); + previewPanel.addStyleName("kune-Margin-7-b"); } - public void setContent(final String content) { + public void setContent(String content, boolean showPreviewMsg) { + final VerticalPanel vp = createPreviewVp(showPreviewMsg); final HTML html = new HTML(content); - setContent(html); + vp.add(html); + setWidgetAsContent(vp, true); } - public void setContent(final Widget widget) { - setDefStyle(widget); - setWidget(widget); - attach(); - } - public void setInfo(String info) { setLabel(info); } @@ -40,7 +48,27 @@ setWidget(label); } - public void showImage(String imageUrl, String imageResizedUrl) { + public void setNoPreview() { + VerticalPanel vp = createPreviewVp(true); + setNoPreviewLabelMsg(); + setWidgetAsContent(vp, true); + } + + public void setRawContent(final String content) { + final HTML html = new HTML(content); + setDefStyle(html); + setContent(html); + } + + public void setWidgetAsContent(final Widget widget, boolean setDefMargins) { + if (setDefMargins) { + widget.addStyleName(DEF_CONTENT_MARGINS_STYLE); + } + setContent(widget); + } + + public void showImage(String imageUrl, String imageResizedUrl, boolean showPreviewMsg) { + final VerticalPanel vp = createPreviewVp(showPreviewMsg); final Image imgOrig = new Image(imageUrl); final Image imgResized = new Image(imageResizedUrl); KuneUiUtils.setQuickTip(imgOrig, i18n.t("Click to zoom out")); @@ -51,25 +79,45 @@ imgResized.addStyleName("kune-pointer"); imgResized.addClickListener(new ClickListener() { public void onClick(Widget sender) { - detach(); - setWidget(imgOrig); - attach(); + imgResized.removeFromParent(); + vp.add(imgOrig); } }); imgOrig.addClickListener(new ClickListener() { public void onClick(Widget sender) { - detach(); - setWidget(imgResized); - attach(); + imgOrig.removeFromParent(); + vp.add(imgResized); } }); - setWidget(imgResized); - attach(); + vp.add(imgResized); + setWidgetAsContent(vp, true); Image.prefetch(imageUrl); } + private VerticalPanel createPreviewVp(boolean showPreviewMsg) { + final VerticalPanel vp = new VerticalPanel(); + if (showPreviewMsg) { + setDefPreviewMsg(); + vp.add(previewPanel); + } + return vp; + } + + private void setContent(final Widget widget) { + setWidget(widget); + attach(); + } + + private void setDefPreviewMsg() { + previewLabel.setText(i18n.t("This is only a preview, download it to get the complete file")); + } + private void setDefStyle(final Widget widget) { widget.setStyleName("kune-Content-Main"); - widget.addStyleName("kune-Margin-7-trbl"); + widget.addStyleName(DEF_CONTENT_MARGINS_STYLE); } + + private void setNoPreviewLabelMsg() { + previewLabel.setText(i18n.t("Preview not available")); + } } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -4,13 +4,17 @@ import org.ourproject.kune.platf.client.actions.ActionRegistry; import org.ourproject.kune.platf.client.actions.toolbar.ActionContentToolbar; import org.ourproject.kune.platf.client.dto.AccessRightsDTO; +import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; import org.ourproject.kune.platf.client.dto.StateAbstractDTO; import org.ourproject.kune.platf.client.dto.StateContainerDTO; import org.ourproject.kune.platf.client.dto.StateContentDTO; import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; +import org.ourproject.kune.platf.client.ui.download.ImageSize; +import com.calclab.suco.client.ioc.Provider; import com.calclab.suco.client.listener.Listener; public abstract class FoldableContentPresenter extends AbstractContentPresenter implements FoldableContent { @@ -19,13 +23,16 @@ private final ActionRegistry<StateToken> actionRegistry; protected final Session session; private final ActionContentToolbar toolbar; + private final Provider<FileDownloadUtils> downloadProvider; public FoldableContentPresenter(final String toolName, StateManager stateManager, Session session, - final ActionContentToolbar toolbar, ActionRegistry<StateToken> actionRegistry) { + final ActionContentToolbar toolbar, ActionRegistry<StateToken> actionRegistry, + Provider<FileDownloadUtils> downloadProvider) { this.toolName = toolName; this.session = session; this.toolbar = toolbar; this.actionRegistry = actionRegistry; + this.downloadProvider = downloadProvider; stateManager.onStateChanged(new Listener<StateAbstractDTO>() { public void onEvent(final StateAbstractDTO state) { setState(state); @@ -41,6 +48,34 @@ setState(session.getContentState()); } + protected void setContent(StateContentDTO state, String uploadedfileType) { + String typeId = state.getTypeId(); + String contentBody = state.getContent(); + StateToken token = state.getStateToken(); + BasicMimeTypeDTO mimeType = state.getMimeType(); + if (typeId.equals(uploadedfileType)) { + if (mimeType != null) { + FileDownloadUtils fileDownloadUtils = downloadProvider.get(); + if (mimeType.isImage()) { + view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token, + ImageSize.sized), false); + } else if (mimeType.isPdf()) { + view.showImage(fileDownloadUtils.getImageUrl(token), fileDownloadUtils.getImageResizedUrl(token, + ImageSize.sized), true); + } else if (mimeType.isText()) { + view.setContent(contentBody, true); + } else { + view.setNoPreview(); + } + } else { + view.setNoPreview(); + } + } else { + view.setRawContent(contentBody); + } + view.attach(); + } + protected void setState(StateAbstractDTO state) { toolbar.detach(); if (state instanceof StateContainerDTO) { Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java 2008-12-05 17:53:45 UTC (rev 985) @@ -332,9 +332,9 @@ } private String getTooltip(StateToken token, BasicMimeTypeDTO mimeType) { - if (mimeType != null && mimeType.getType().equals("image")) { + if (mimeType != null && (mimeType.isImage() || mimeType.isPdf())) { return KuneUiUtils.genQuickTipWithImage(downloadUtilsProvider.get().getImageResizedUrl(token, - ImageSize.thumb)); + ImageSize.thumb), session.getImgCropsize()); } else { return null; } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2008-12-05 17:53:45 UTC (rev 985) @@ -45,7 +45,7 @@ private final WorkspaceSkeleton ws; public TextEditorPanel(final TextEditorPresenter presenter, final I18nTranslationService i18n, - final WorkspaceSkeleton ws, final ColorWebSafePalette colorPalette) { + final WorkspaceSkeleton ws, final ColorWebSafePalette colorPalette, boolean permitHtmlButton) { this.presenter = presenter; this.i18n = i18n; this.ws = ws; @@ -53,14 +53,14 @@ mainPanel.setWidth("100%"); gwtRTarea = new RichTextArea(); - gwtRTarea.setWidth("97%"); + gwtRTarea.setWidth("96%"); gwtRTarea.setHeight("100%"); gwtRTarea.addStyleName("kune-TexEditorPanel-TextArea"); gwtRTarea.ensureDebugId(TEXT_AREA); final Toolbar editorTopBar = new Toolbar(); editorTopBar.getPanel().setWidth("auto"); - textEditorToolbar = new TextEditorToolbar(gwtRTarea, presenter, colorPalette, i18n); + textEditorToolbar = new TextEditorToolbar(gwtRTarea, presenter, colorPalette, i18n, permitHtmlButton); editorTopBar.add(textEditorToolbar); editorTopBar.addStyleName("k-toolbar-bottom-line"); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java 2008-12-05 17:53:45 UTC (rev 985) @@ -115,6 +115,8 @@ colorPalette.hide(); } }); + } else if (sender == editHtml) { + presenter.onEditHTML(); } else if (sender == fontColor) { colorPalette.show(sender.getAbsoluteLeft(), sender.getAbsoluteTop() + 20, new Listener<String>() { public void onEvent(final String color) { @@ -264,6 +266,7 @@ private ToggleButton subscript; private ToggleButton superscript; private ToggleButton strikethrough; + private ToggleButton editHtml; private PushButton indent; private PushButton outdent; private PushButton justifyLeft; @@ -291,7 +294,7 @@ * the rich text area to be controlled */ public TextEditorToolbar(final RichTextArea richText, final TextEditorPresenter presenter, - final ColorWebSafePalette colorPalette, final I18nTranslationService i18n) { + final ColorWebSafePalette colorPalette, final I18nTranslationService i18n, boolean permitEditHtml) { this.richText = richText; this.colorPalette = colorPalette; this.i18n = i18n; @@ -348,10 +351,9 @@ richText.addClickListener(listener); } - // if (basic != null) { - // topPanel.add(editHtml = createToggleButton(images.editHtml(), - // i18n.t("Edit HTML"))); - // } + if (basic != null && permitEditHtml) { + topPanel.add(editHtml = createToggleButton(images.edithtml(), i18n.t("Edit HTML"))); + } // super.setVisible(false); } @@ -359,28 +361,28 @@ public void editHTML(final boolean edit) { final boolean enable = !edit; if (basic != null) { - bold.setEnabled(enable); - italic.setEnabled(enable); - underline.setEnabled(enable); - subscript.setEnabled(enable); - superscript.setEnabled(enable); - justifyLeft.setEnabled(enable); - justifyCenter.setEnabled(enable); - justifyRight.setEnabled(enable); - backColor.setEnabled(enable); - fontColor.setEnabled(enable); + bold.setVisible(enable); + italic.setVisible(enable); + underline.setVisible(enable); + subscript.setVisible(enable); + superscript.setVisible(enable); + justifyLeft.setVisible(enable); + justifyCenter.setVisible(enable); + justifyRight.setVisible(enable); + backColor.setVisible(enable); + fontColor.setVisible(enable); } if (extended != null) { - strikethrough.setEnabled(enable); - indent.setEnabled(enable); - outdent.setEnabled(enable); - insertImage.setEnabled(enable); - createLink.setEnabled(enable); - removeLink.setEnabled(enable); - ol.setEnabled(enable); - ul.setEnabled(enable); - hr.setEnabled(enable); - removeFormat.setEnabled(enable); + strikethrough.setVisible(enable); + indent.setVisible(enable); + outdent.setVisible(enable); + insertImage.setVisible(enable); + createLink.setVisible(enable); + removeLink.setVisible(enable); + ol.setVisible(enable); + ul.setVisible(enable); + hr.setVisible(enable); + removeFormat.setVisible(enable); fonts.setVisible(enable); fontSizes.setVisible(enable); } @@ -416,8 +418,7 @@ KuneUiUtils.setQuickTip(menu, i18n.t("Font Type")); menu.addItem(images.charfontname().getHTML(), true, submenu); - for (int i = 0; i < fontName.length; i++) { - final String f = fontName[i]; + for (final String f : fontName) { submenu.addItem("<span style=\"font-family: " + f + "\">" + f + "</span>", true, new Command() { public void execute() { basic.setFontName(f); Modified: trunk/src/main/resources/kune.properties =================================================================== --- trunk/src/main/resources/kune.properties 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/main/resources/kune.properties 2008-12-05 17:53:45 UTC (rev 985) @@ -30,6 +30,7 @@ kune.upload.gallerypermittedextensions = jpg,jpeg,png,gif,bmp,svg,avi,mpg,mpeg,ogg,mov,tif,tiff,mp3,wav kune.upload.maxfilesizeinmegas = 10 # Images are resized to thumbsize pixels and later cropped (centered) to cropsize +# (integer values) kune.images.resizewidth = 400 kune.images.thumbsize = 100 kune.images.cropsize = 85 Modified: trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/ImageUtilsDefaultTest.java 2008-12-05 17:53:45 UTC (rev 985) @@ -26,8 +26,9 @@ public class ImageUtilsDefaultTest { private static final String IMG_PATH = "src/test/java/org/ourproject/kune/platf/server/manager/file/"; - private static String[] images = { "orig.png", "orig.gif", "orig.jpg", "orig.tiff" }; + private static String[] images = { "orig.png", "orig.gif", "orig.jpg", "orig.tiff", "orig.pdf" }; private static String imageDest; + private static String pdf = "orig.pdf"; @AfterClass public static void after() { @@ -37,10 +38,15 @@ @BeforeClass public static void before() { - imageDest = IMG_PATH + "output"; + imageDest = IMG_PATH + "output.png"; } @Test + public void convertPdfToPng() throws MagickException { + ImageUtilsDefault.createThumbFromPdf(IMG_PATH + pdf, imageDest); + } + + @Test public void generateIcon() throws MagickException, FileNotFoundException { for (String image : images) { ImageUtilsDefault.createThumb(IMG_PATH + image, imageDest, 16, 16); @@ -164,9 +170,11 @@ @Test public void testSize() throws MagickException { for (String image : images) { - Dimension dimension = ImageUtilsDefault.getDimension(IMG_PATH + image); - assertEquals(400, (int) dimension.getHeight()); - assertEquals(300, (int) dimension.getWidth()); + if (!image.equals(pdf)) { + Dimension dimension = ImageUtilsDefault.getDimension(IMG_PATH + image); + assertEquals(400, (int) dimension.getHeight()); + assertEquals(300, (int) dimension.getWidth()); + } } } Added: trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf 2008-12-05 16:22:07 UTC (rev 984) +++ trunk/src/test/java/org/ourproject/kune/platf/server/manager/file/orig.pdf 2008-12-05 17:53:45 UTC (rev 985) @@ -0,0 +1,445 @@ +%PDF-1.4 +%���� +3 0 obj +<< /Length 4 0 R + /Filter /FlateDecode +>> +stream +x���M�d9�%�������o ���A̢�K�"�"� �E�,��xxHɮ�p���T"ʟh���(�:���:�M�������y����L�o���=�8����[x���o�<�����������#�����B���O�O�3{-���ˑ��(�V����˭����0�c�[�����ǭΆO5��:tJ�����R����Y��x�~c���ٗ�U#��H^�'���n���i4���C��������q����2&Ss���G,y�QF'��-͚[�o��O�p�h���[K{*�I��oHY���5K�n� �'��Bb�3��za1J�"bJ�dR?I����s ������ ��[�� 9c�Z�o#��~K�-�����mR�[�BB>����Mf�.��t}+s��%�PQ�[��>��a��$�5ɒ�6�H{�H�7 �ﳐY�Hy˒����0����,Z�c�rV1ۗ��g�3�҆9�&a2�'42t���ۀn�6��I�2>3K��J�Y�,c�.��V�S�д�OK�)�/� +I�:t<�4c��ΊO��Rm����2%^�!�Zi�) s0������2�x��)�m:��)H��|���Z3D�t��%���C��� 2�Mھ܌ ���isJ{�P�ԒVz!N1�DBOo��!�BzyK}/v���>S8R�˘3Ej��3�~1s�\t�@��ɾ2v�,\f�w��a��(����q������XYUEk$��0�a�~��*��� +�6�͝ZSH��� ��i�4Gì.z�)֝#���b�HNq6�g��ɺ: +r�(��, :g��(���R +D/d4���3�0f/�q�r�� +T�[Z>����1�Hq��~�4uNV����I���S�OE暀"lBx�9[������ws��w�N�Y��\-hi�c��!2}��̩��M1��{�A�y��)7f�r��ֿȌ�ј�%���r3�L�!-sȓ���E�@�IS Yk�� �����Ζs�ݙ�VS��*�M'��OM�B�%̕�3E���B�m��4g^�f���@�*�V2m��;a���"�F�>̳�[&��R�9t��&KZgs���������NQMUwi��L�'s>�Ht-b��9E��J�XG��*3�Ϫ���ޓ���ݽ�<��,���,��K��dQ�T" +��S'��u��D��if��`}�9��߷��f�!$e��ς�MT + `��zkW���DH�"��i����K������c��s��?zNS�L��^�*Ă|b������=ǭ'������bk�'�����ט�f�OW�M�<���PE��sy9�<e������K9�6�:;��0�����T�StŒ����K:��PX���������Gt�\��*��O|�\�v����J��U�9G��(�M���Ǐo��\�K��@�i*h��HGg�����-K�S���lϤ��r��uv@��_�1Qe�$b[D^gqsYMNy�/�g��ڴ�+���}8��*{�,�W<[G��9���a�e� Nk�Z�0w�h���3�Z6�l��?V���x7�5��6��Y���p�f�rFEe.}6t�E���2�`��e-�eó���:vY���������N+��<��:��(�'3Go���\�:�^c���Q���CgRZ��0=wzًk]v�+��d�d�9jS[��P�IY��P���ޚ�Q��Z�����gn�1s��!��Ȓ��`�F0��Mv��"�M����ľ�vrQ�8O���XR����6,���&�,�������Xm6˳^=�a��36͆���Dh�ε,�-�9y�E6b��H��O�N�#D�#@��<�|���%MkL��2��Kgſ�ϒ�l�Q�.`So�:�]+ϓ�Z� Ś��9A���G`�}�ꥄ��~�2������k�0̏�>'��͵�m�:7J�r��_>��f��_~9~8�3��"�K�����/�jK!��#�:M1Mc<�Wa2�5�(ӐsK�%���"͞���9a���b��yl��EAT�̹���+EÍV!����?�s�d[a%1yX]wϠ�y��6� +co.88��L��Pϕqu�M+qv�ݡ���u����_����_�������?�����?��~a���S�A�$�C3����7��3��~��_�C��r�M�[����T�����[Գ�)�ڵ��5�t��6f�6���u$��6~�c��\��S�4&���d����V��m��-��c��*��5�R�KTX�Ol�|�-��|�-�N/S��W�����|K!B�i:X +�,$� gl�yZ�Y�X�a��pƖ��0_=���C��k��n#0��� ���N>N�0���kV&G�*��f�Čs�@ +������ 8��`%�Xi�ϣ�?i����0�C�m��Z¢���ht��l��F�)d���Q�Jm�Y6 +Iaa�´�`���jz������袥5>��wxv6y���ï͵�5�dMLz15�o� �[oآ��-;S����Y��M��OC}��V�����^��f���v���[y������)` ��؛K�7K`q�CF����K���*Wʾ|�ݸ��4�q�e��i$Ϻ7�>N+:�E�����l�c��7ʲ�EMr+ԍz���lԦ-#?�-՜���I�"�E0;�(��_m<˴�]�h�ʢ�z���3K*��,�i�����,�?moB��ζuN�b1��� N�"h���>��`�o�5����e���[����m�L�`Ե���>�8�%��M�B `�K.<����CB0 �:��3e�K9~n"} CP*�L|C%�i�Lg� I���:a.du,JLr��7��� �l:�)� ,t�ֻd�ڶd"N�2�E�g*�X� �,�Xm��2q���+�>"q����6wO��A����u��ߐ�1pZ�)���X��ٕE�#>�b�bp�+R6��*��]B��-�FEM*�\HY��"VZ��YϬ&����,�5�د�A�_a��Y?�)/�C��S���O�ҟ�v,�OyR�)�Ny��<�ݦ<۶M���V%Ny�My'��'e��N�g�k�_x�)�§My�y������� 8��[?V�m3m� qzX��4}gC%���H��X3���F��r�Bi�^�[��6��c�zI��KVV��"�����E�{/<����CP� �9s��W�~��XPXH�C�ハ� vv�t�_#�Ī��X�3���s�[�*��_��������S��m���]X�����9���FX{�p�ner�o���ߚe{�l8 ���!!g�$hz��[��;�{+�;�5>��_����{����VR�ׂ!��O�߈��@�j��'�Z@ʶ8�k]k����m[j����[�Ҷ8��R���)\X�Z.<QMp���4A|K���-�OQ�Ϻ� �O��'�N�? �s ,��ZW\��\YI��5��X`����W�$�t��|���*3���Ւ��CFX� �h��F��Qb��8����h1�C�/�sJû���v@�w]�m?�*|������ �ȿb�1���uM�$��5n�'�e� ����Hxڔ K�8A�����\��ڵ���y�L�#�[��q��R6������� +/<���*Z�� �#F�ϔ������9]�=���{�aQ`\� �\R6Yp +���.a`��0�mK�߰��ޤ,,�ɂQ�,,���e.Q�pD�\��(H ӖL߆'�2BN����v��wQ\�B��D��5��� +* r0e����K +̽ɻ�đ�����g��)��0�-+0�����4�ZwHX� ���D_xX�Zxب���,��taþ�,��ƅ瓿������=�Dt������)?]���%6Wo����ו�����o7�����zW$��a�u39���;��y2-�4� 6s���\�Y�U��^�syv��=���|]�cL7�?~7�;&R6g�H�4�. +�(+7u�^��MFp"��,����"<�*T�lVyH�'�$|I�S�J�$�X�y��<�P+���t}�;�ٵ��]��lL1��̝����9�F ������:�����sUS��̮����e'�줭�r]����6p�T��:�zIm�{�に ��cQf'�w�(�<��Lދ5��U��V�Ve��L�ʅ��(��X���x����WN��oG�=�hw�ls�B�{�d�tN��;N��8Ÿ���úw�u�.M�w)��xs�b}x�6�s����w{�͕��"�U��%$�w�)��m�n����k4��?�ܞ��_~z�zT�7�B���P�_3�fLMMt�{�Vq �=Z{�{xڏ<���x�,px���$���NBq5uQ�2(O� ��~����<e���������C��"��s +�G��w@6e���@f�r��RӮ-�" �x#�fZ��B�Ob�](���p� =�u����Z,���ݞ��8�4I�]�"F�pT^�.r�Ya`�ʖ�C���'�z�N��4i����d����L@v�s3�Ë����ӭ�LJ���3����U@��`e*x4^n$T����*��<<�m7B�UC|-;�2U�t�\��믇�n�.���'��9^HE���/�Dn ɁT�[���Q�]Hi�˛T�O\������\�!A��~,hӼ�H�S�8>��m��R�3�h���I�}��5��;�J.b��@&��8w���ׁ��3���r�!������k��u��H�.J�9�K�����~�����w�b.+F��s�6�*��Ax� W�I��\��^���h�W2 �[�ɖ�L����e2��9��������� �ي-!7��ΰ%Upb�U|��n7&9���Jx�.�_��)�� +|'�:y$�H�&�^��)j2TO"�F4AB�(q�5�D�p]�Im4�W��vm��Q�02��㘓����V����8D��O�Dv��R>�ɸ +F�͓���֭���:H^�˳K��Ƃ�):Hu%��;����hB4ͭ���G�!xʭ 8���=8c�ڈv�|����m#����껄�[�B�.�?� 3~+����ZȻ�J�.:k��Y�ި�s¦δ|��/y��S]+dP�\ ��ט�|y�X�,I�!��Q���GiY��Z��ǬJ����m��Q����P%�����ֱ�GK{ۍ`�^���q������\Cl��ߡ�3�0}}�����I4�Z��k�r`��r��;[!�\cA�����X+d���Ğ�Ȭ���ln��@"NKY+d��̶B�ς�B�}� +����VHK�Ɠ�R��%*-�9��&SJ�wE;k�}��������!FĒS%�#��B1 �t-T��&��I�x�)!�wn�V2!�}"�2��Np�Ir<%#(��O�_.uW���Jy(��VeQUy�m�\պ����,}`���Ĕg�U$>9!�҃�;8�eE +��'@�Vj���Pӟso6����%��شK%����q!"�m�eyL����J�GG���B�(�Ms"Q�.w��͜��"�MA rF[�S6}j�AuZr�?4�<��+O+ߔ�T��+O6�'��Q۾tg�q���Ұ�1�Y�#-�Y�v�9��rͩ��pMSoʧ-�ޔ��<e���%ζ*[$���r�q�u}r�)wpۚ��{(N�YzJ��< ��Mi���_�4-��B��`C維��q�Ǵ&�_ۊR�t�J��_ZS"�H�,ϐtѠ֔�mkZS��=�����\kZr��jM|��Rz}����,��3�>�����)���.�Y�G4�cz=n��9yx��AÇlh�'������<<�K����e�n�W���C���H��:����F~�K��A'>/�f��[m3P�O>A��o}��;"ށ����L7�����>{4�"�SH���}��@�e�S�Y�5��vƻٸ���xH�,�����H��C�DPs_�r%��J8tVH� �)#���n��Hf�r3g�U���3Y/1�l�J<��|�W�кB����&$�.�2�f�lN!���;@uB��&q����]o������/���넋\���/�"&���MW�v�P�-L�%rkh�J�=������&D0�A��dR[θ~�8�Ǧ{TOˎ7X~�lARQ-�% �#��̮�(��� q�xV`�'U�2��^�E�ٱI#��b-BRHs|2%3�z�"�h%[�,�f���hDjbkk�� +aȀ��2�to2�)F1�>�3���y,A1±Q������f����AڞA�t�`��U�ίi+��lxLQ��)6�3��H�B2|K����껛�F�,Z���S���C7B}X�2��u���1��up%��P��>a0Uu�Ss��f���~����(,y<�~�,u�T�u��h����RtiPaB{��L֞d���x��s�,�&�E�HK�,|�b���[ݘqTzn�����qՎ ������� rH4�(;�OI��E���B��L��H����b�1wԓ�O[ Q+H<����tf,I6�'�WO�͡]�b@��Ŏ�����P��䔠�z�@b'E�4��%B��H�Ё8MH�S��A�aMAsJ��FA(@�ix(�X"��?�%1a�p�����Ԕ��I%%����-G���GI�`����8G��]�'�\�kA�%v�D擻)�KC�D/!�w-:XN�cӬ���2����E5�mo7����\ij$튬B�8$r]�"%�QI�%�@6�`��MS3Jb7tl/�)�]�@�M�ĄABWlő��n��L���`�Ь���^<k܋�ŐBg�Y9U�Lo_<���X��� ��K�*�G[B��-3rX�TFܫ��(n"��X�J�צ���`BsD� x��@~&>M�dMc\�� ��$e�@;!���Q}��$'�,]� +b&n$2#x&���.�3 � �ISWFa�~_`W�{�jne��Mqs$k�옞��Lu$+VA��x�G�oD��� +�'���N����9� fOIwDoeG+�S7�h-iE�Ʌ�A I�G���Hj�(W�ϴ�#�I�AC��0Jar��/��[�-r��Ʉ��$�B J2�N��*!�,��1D �tø�Ȑ���1�1�bB��VU�Ͳ����T��M�pJ��TUTǖ_�ѱ9A~ � X�$;E�t2$R@�C3@*�5��I��}gFk�Dm*3i��:^@)N�����d�5�ڧ3;߂�v�RQ7Q��vͮ� ��!~��iY���zFc����>�0� c0?���nH'�/\DY �4BxC�D�й*`�kVhi؉�0�J��M�$�thN/���8�cZ����k�ٚtM���������uY��kU]�{|?�^~�4�A+���V�0߷kW�AK������CN��A�Qy��I��g�R�����,���Y��UM��qV���A�%��z �%->�)8@vq���:���eP3j���"o$d���Z���VZ�V�HT�����u��+�x��-���r����L��Rg�k�w�~ +�d'���] +ˁ����ټ|p#�zY���W��BYeT���:0�<VRnM���-s#�!��P����" +b&�_N�%��Q��jQ@p$ 59�� V��7NƁ��5�s�~�K�0Pl)=1���hn���VifN}���lDS�<"���O�Ԣ�>ed��isb./Rd��u���- + +)�M1Q��H��i4� SY4�ǂ������ɉG��g3-�t�.��]�[B�X�ar D],�UC�����l|}�������/�QM�d��M?)r$�$�;r��3H^͈���x�M�¨�H�w�N��x&��Sc�q�=��n(<R��R�n�P�5�-�ŝ�I��]�����F|�A+ ��r�ō4�1�,fV�.���Ԣk$a&�A����p8�<c��U-���3䂖5`�Ġq�#����rI:��@� BPS=c[x!�Y�ةzTX��d��h�Uz�2w('��ɖO�Ay�)F�� s/fs� ���]t~�$�-�)E(ħ�k��C� �A����"��ɘ�'�h�vUT.q�HSVT��Qv��d��t�ϳz��N'��y���Kz�0F��U�-Hf��rz!?���K.U�Iz��2l��gE�w��b����]�,3�'�� Mo�`Ҝ�~�tu�h� +����:(�fܮ� �(#qL�E ��j�*�L!i#߂.Zo���~��������:�3sߡ��9-}�AfFn�N%�#A��ը*�:l{�Ae-|y+� +a�W.���5��#����W�s_@o4�*r������Zu1-Z�<����q��]8(��s��DSUUc��ր��j)G�O]����ؚ.i ��xԸ�s��U Z@�RН�X�º�m���-�� z���^�]�����3lv����i�� +r�6�p�~��)o�9�ָ��Fh�K���:1�z��"����T�)��}RS���r����6T>���!ҥ6�t�� g���t��--�2��X!]]��b6Kav���XJ�|�"id5أ_����"f���:w1 �9aqO\���@��<����֨2Va�|�5�B��j�l���>ζ�k}U�p��Y��{.[��Ш��!���i��{[���w| +�jt�<n��JZ�`E�.*���b\�A���¥U��Ɲ�A�B y���6t��8�q><zh�����q9��dt/R��:�zd-�$�$.��?���˧6�*}��N�A.��B"�cx)z�M� �\�5�3�{dz�B�-*MA!J +?(�Xf��i�k�J��֞r�3�7�Va�n�h� +�r +J�7�N/�<PL����NA!�9��N8F�S�����-(Dm^�O�b&*rh�o��:� +�sN��M��T�K���h�l8O��`0*ƛ���YA8[�؈J�$����*%��!�u��H��e�"%W;b����t�%@U�ȕ��@U!�9���4"S�Y<e�V�R��*fPq;=�FU�A�U,@U'7CV��S!�V!p�`��M2hW���� _E'��W�>�ew�`�* ]��xX��c���A�;�z��IT��T�U(pw3�=��!�zi±V���/%�g^h��-����B�"���+�W�%��u��nTT+����C1W���Y��Vv�U5�ʻ�Tʫ���:�58/��D���Oߟ�"1g�vkWi���D�U +�I�_�>Q�UURX�A�g~�����uϮ,�(���J�a��-(<����E!��*�x��2�܆�jn_��!'���V�B�Hw�F��ah��QHVZء��uu:��J�c%�)�n�i<t��=�@�{��쬵����=����Y)F7�<�/x�sV���� +U�Ki�y���{V��G����iA��9U��Ӎ�R�UAZ�fS��Y�´_MQ�P�-�V�|,���H�t�QXb:��E�J�f�T�H +����U [m�� +v7�����:�jo����u�Xh���J�����-�yԍi˚�D���r� �@+O�����u��d�߃R����®L���9�x��j&�|�v�;��[ p�l+�Z��BV�c�� 5�Q �rҎ��v����uF�\�bP�<��6cԕ.�T�UUs���f�D3C[.�°ə�w���rN�^��J2��.�����ɠ'K +dHZOҀ�JR���S.�gp��(C��F�&"ΝA��N�������{�pj=��"���� y�f�$3-xvAYa/�p��� +홂�HWnұ������%�6Cـ^)��#�k�"�0���"C\X�Z}��^�U�h/���E�l���9ګFfT�x�j7U�^�L&BܴS*�����x��H��*�+�ժb�3���D��E8Ħ���=ӑ���G�������-�W%�������ú��<�3�W(=���AmP��&Ud� FY +k5CA]5/ ���#�%��y��e@�a80��i�G�+��!L=ǝ��T�)Ѽ�v&�p0Q�?�H6���8�!�y��Nx'�P�7�n>`1��L�^O�GԖ��)0��iR�a�!7��A2w&��f�aR �k<Kr��ݵ�����Y��j(<!��]u;��jӨp�6�t`�/��G^M7 +�F�2ZPxV͋�b`�8.� +DW�N�Bg�ax��KTe/ � U���9+�����͞�yt���1��@�A�<Q^�u�>��d'�W�t�eN��v�;��}x.�C�㵉T�W��+Ȏeh?��^ +,d�ګ���;b>O���fV �L�`��Sc�Ѷ�ò��8*4m;��Z�%C��� ��)�JX���)���\�SF��@e��|��Q�D�$Vß2�`R�6��� +-?�^��(k�p/o`r2Kl�UYh���?����4Vp��4�b�{�)�۵�;+6G���ݠ@3�ُ�Ԍءf-ö>E�w�������U�f��K��;Gp�X�Ď n��N�$<V����I�F���h�'C���N�4J�9�&��g�!i�����г� l�r��A !�ɉ^����fd�#_���5G۵j�h�i�vⰞu�Ah�愥@�t��4���qf�t�lg?���5h������0�7�Y#�w��D�dށ�h�+�9yh��a��z;qeE��9U�|�5��;F���I�:}�5ϴriA��t�&ԜN"���%Gްf��CnX�\�jďNԻփ8ܝP!�t��ײqt�h�@�|h<Q�~�Pc�7���8�?�@3f5�;�A�� 4KZ�U��:����Ӹs�� 4G=WY@s4ONͰ�v^4�+�� %����}�8Ќ}4�m��e0�f�=�Ś�Vs�E���#͢��=�H3�qvU�O�:���է&Qf>X竝�MQf̴n�� +� t�T�5�U]6z�7����.@��ck���>�>>���а�-�Y +$�L�Y>��d��F�Q�+��c���fˑ�� ��M3c���JϪ2�n!��ց��P�u��Q�4�]ɹ�_�!qfQ�t0�,B�`Ff9qd��:�l�L��ęE�4��4#}��3K�@4qf�-I��Y�Hl�͚��F�"D=�m4��q��4A�8Ǚ%Kݰf��l7ǚ�|U�/����Jk�t�c>b�B�}9�����ޒ�<6{36�9�v��x�`3�8ؼ +���m�^)A�T7E�͒�}��Hj ����ͱ��G]�9{�7K �0,�θZE�d�ѥ�c'���s +<�h�p�҈7��-���";�r�!�/��x���!�H ֈ�C���A�B�;S�����������,9>U�*g/�g���3v�@U�Б[_B��$����81g!�b�����9Kz�w8�l=���*��k9AgjĘO��Lu7u8>l�11gh�ۆ8�.� +8��:���@غ������B�gnԵb4��z1���7K��ͺd�5&O�����Y��Ď芦�X���F��S"���B9c�%��9V7WO}նf�;sRR!�,���q�v4��s��dž9�$��w�3ǔ���Ig � �p�9V^i8�7�q�d��8���bΑ�� +9��� +G��Ҹch�s�9c�RcM1g�4��r�v�M�92�φ9˨��WM��n�9�1v�YDm6�P�]Ü!7)�s���b��#�܈fsl�����e�b��Qg�D��_t��u.c�b�s�����_YS�y@���cu,����UZ@�hC +: �69)�!L�Y��(��9�'�B�p�9�t���H�Y�c�0�y,nrt�2�{�637VĜc&�k�3 +9髌 rG��hZ�t�:��j��N���v��d�]�v������}�;�J"�1˙���V��6$q2�t�O���h�������Y�B���30R�}�N�����U��Y�۱ +��zF��qY�PC�QH�٪�U�S�<c��鹜}Bu�!r� +�E�~�� ̠gLR�;�Ј���tQ���^�S�+��}�z"�pPUɱvID�ei?�]���f��>':�*�|,<�M�6�bMs�䱎b� +;�M +|�MǞ/�� +a3�� =ð�mȳo, ����"�� �g�q��Yth��c�u�s������6����`������AxPW�F@89L�ք#ϗZ� �Uz�� +=��w=�%n�s��WG�aG�[�(���|����m��� ���"��@d]�h�)�X\.�X�2ӎq�:q{��p�7�����������-�pvF�9f�V����7ORnv��p��C4��,�7G��B��� ߪ@�~��6OB��}l��9����B"-z�W��ۓos�u�hs�\�yn��38vH�9�p#G�j�͒�7�Y�d_���Y��ɷ9��շY�a�y���`&E]a8g ��|�/=��E *� �l�� +9Kn���%}>c�9��\`Β��s�}��!�O�����w2!B�t_eC���*�b�<@�/�X�{1��nG*�,yns�|����LsΉp$1g�6�f��J��0���s��������q��Tq���K� +�ne�d�1�YF�g���%��}����rɭ+F��o��\��}��d.�8��G�8�pk �s˅Wː��XK�ؐ��i:UrN�n�r���6�f<���ۜO^6�6�r�����,�R���̉��t��z2�����6��"���$�8'�:e�3��;�<�6;�:��wt�3��,M�pt�y�6�fƎw�Y�jn��b<Q�4�d���ݵYzj2�����;��~ ��1^+�:B��Tޥg��s�k��PI58�1g]/�,_��C%��'�f� �����lw�r�%뎨S�)�9˜mO�s^7(a�g��H�9'?"�P%iC�sZ�� ��c�sN,"�O�� q��ɳ9'�1q�Y($�������%(m\1&�N�s3��;�,9� +3a�8�,��@��s�mۅ7K�`�i3܉7�U�s��"4v{����Ȳ�M�of�ތx��Se�X�'��O��B yÛs�04��a7!����B[�6�yU�Vm��`���o�ɑ/ky�3bQ�6�9'�މ7�Dt�x�7��fax�\�%�s��,��ӓ�s6C����ÊG�c؞�l���CO�ًp��ü��ݪ�<�o�����~M7!<�8ˢ�M1��V��xs�v;��c_ȉ7K����)�`�~D��:&���PhLq?W\��i`OF�s@�'$���Y���8�&��|1�� ��:�*���,%��7��e5a��ց�V�3/�:�4���^β����Y�֝(�G�Y^c��,a�6�95Vopsj�#A�Y�.gI�� mN�[G�����98���ڜ�u��fÿ́3Dm��E�ps�.�ps�v8R��H�xs2���f>d�x3s,�Y4r�7'��7�F�@�9�z;ޜ=��fl�,����7������f>��x��@o;�,c.@��͒�m�͉�hnN�ܜ:=] 7'�cp3�����d7�oN�*�xs�)����n�W��f!ܜ:g�fI�?Y�f��BQ��f����sj<�5�YD:*DM�9�g��d1؈7�pR{�r�z�(B���M��d�h�,��,�)4��(B�mhsZ�.�,��>��2��_T��6�}��F��G�9U:9�,Yh1mN���9U�I�Ay}��C�Ycsr��C��ڊ�D�9�g�'!ڞ��t�issNzI�������`��o<遳]�s7��ע;YD��|�rn0��fX�m���n�D����:ڜ���z�=ᆖ�_x�K=���Y����'�K�B�K�0X�f1����,�ݲbrܹ~���7!?�:g��P7[;V��;�GF.!�얈��LB��A����d��p�=%�b<�F�ܻ�+3glƈ,U�vQҊث��)���ޱ`[�v����˓�s�{l�����Mu��]�l��kU�&���!g��^P���z�rvc�0�l��cΒ�l�����y;_�u��^(�,K�9'Ӥ�t��'�m�;�f�2̢ʛ�36�O�ΗZUR*�AG��� ��*q<���"E,�Ytk��(tsw�Trg��fd�je�4�T�f��̇�Nv=����+�wǛ�]oC��B�Gc �ڛi�No���t!�MZ��g�����\�ȱ�6i33!ǟ'�2�(ٱ0��%�����C ?K ����},��K�P� +?���+۾ S���A?I��y��/��Y�X���P~.�Wj?K��d?��2�3���?_��z�_�$���d~.�;�=ȝ�������C��M,��K%V�^+6/�����8��G�����:-� l@�BV.�qХ��-9x� �L�����El=�:���P,*��Ѕב�A�Lk�0h!$]�� ��c�.���A��u�A[/�A�`����n��X���[2�3�Ms�s���B����.�C��FU�$�"�>���i�yT�T�J� %���{=�� ��ʀ�KɻJ��Gd?��1sVv��ĠK���X�Ȼ�@h4����u]5_�31�W"��B�6�9(�|ƞyw}. +���,�kC=V2!h��� +ZF�0.@�b.�Bo��.��.�-:]�*a蒈����>t�CZtD��60���%�3���oj����-�v,+�s�B�*�n�3 +�I$�z���,/C��n�%��a Z��� 842���:����q)6,D�Ke����K������@%]V,-�%GW �� ]^Oq�_T�C�Lv��0����� +�!�c�\�X,�C������%]� � �&�a�R=x�JR��cġK�Aa�Ri���tx����%��� ��*��Y�n�*�%��I��\�Q4o�]pkl�Yx����b&30��h�.ˉ�0t������B�8�z��vFmK�س����� C� +�BJ|���Ԋ��FJ��t)�O�X�G�K�K��� +71�R��A�k� ����BK��*D��^#=����&�Y�O�'v&B���� ��B:�B�(�B���ͮH�R/5������#&.><ѯ���j����'���է���,�g�"%�u�s��$3�ah,`�-M"��uԂqt.�gZphy2q�ژ����1´Q�ԑ�b����:�(-IIT$�o����EV19"�3%Y�E�a�}`;�K��� +$:��#ѹ/�#�E�``���l7���Ħ�DK�Nu�S2� + �h}ց���z�Ѕ~-C:�}�жk0 �06��K���e�Ѕ!-v�%SJ�XE�L��a�g�b�144��-�Q�׆C���8��� +�.�c۪�O���@t1�-��ɍ��.Q�^����:-��������-@�<j���]�i�����k�.|k�8tt[�`�}��+�C:�πt2�q6���W�ʓ�T��D�e��p +��4���YD���\s�BK�샃�XQ��-�15o�-^1�<�|GL����GZʠ�:ۛ8�����aЪB�lC�W���=�j@�ԚAЇ��P���Vl�,�>�?+=?�%O�ЉH��� +:�.�GZf��)��8]����R��/�l +��� +�?i\X_^*����>��h�����]�Gl ���@ta�sК�z�_7+���Aw��;6��C6�J(Pa7��.�Q���%�c�r���7��K"�؉V(�����|��Φ�`nMQC�t�ϰ�'zˠ:,P륅TN�bK�^��r�vZ(v�Zh��:5@�nt�~#�4�h��D���T�H��5+-kO��4�^������`ŭ)C�uk�x/���R�;�Rǟs_n"��;Mm���^�Z���3��(T?�|��Ί�ğ�r ���] -jW�Ӟ�����"�������{w<PX���m*��ۖ;]��D��x�D�)��M��?��<���<�k~!�~���)�!P����Sf� ϛ/N�Í©%}*/�~��G����v,�Ei�mɫ<��� 6h����b��� +�4���u��X��\/�ݹ�@��|e˿���+�DJ|���sq�FE킲NE��ې��#^h�G�RbЇ!Ak������b�g=]�N|�1j���#���9�hb���20�gW�3G�����O.�j6��Y���/'�R����s�O��y/�(�W��E����:��(��X���x'�:.�������������W���{����X�,�&olJX�4w��6��O���͊w=C�[������W)Zc�*�Po���.�;��uu��.��'�S]�`�(�EijF�_9� ��k�:�>� �S��.,P��Q� ��Ⅻ�"�K,��f��NIl/�)��6��rii5��(���.���>��×[Hz=�(��C�i���)|,B���}e� >��Rnz�]#�^/ ��5���m��=F�t`%2yX�w��f=An�_V��_���khз�Wm1i��5Q<o��|����6F�p������:} �]>1��Y���+�X��h,���������>����s��E�[>iۻj\��~����Q����1%eɗ3�(����Q�)jG c1���2�w'�e���B���F�e�a��jIPs +M#E,"E�"����2���Z�+[��(�x/��{ሙU�\��Y���c�[=%l�e��n!�����-Ă%r����ڴ6D�q�I��;#M#4|]0� )X��ʑEW�Q_'L-�asB����Lk��c.��W��P���9���'(�N���ZE��&��EU�*+�Ƀ��w6��h+�}�0Z��1}m*���*���_,�O�9o5<���ϻQ��ˇ�~����ؗ��=��5{�,;#����!Zs�n*K��D�)&b��"aE��y�.c�0��S�%e)�'1;�r��EѶ{�&[W~����H����Թ=�!�=��!�ku�3>��|L��c�����bծA���AIEm ���^֠8��kP��A�2}P.���p����7ķA����A)��E��XLmP���b'pP�L�v �5m � O�|��O��Aq� �֠8��be��\8�Ay��GW�2'�`h]5�.�}����w���D��&�]�b�sڎ� ϝoț����S/��m������ܮ�u���7~�Tm�.%W~���1VYf��m���"�aNha,4�����q۶em��y]��Ey)h߶�¿g�S߿�,O���ċ*'�k�1l��WO��U�G$>���'9�����Y�;6i��M*�}���5E�M!\k�*�c6�=��E�k0�MTHY��N��DeQ^ +z/\x��n|@8��dm�1�6��-�p�g�� +I�;�04���#Ŕt��dLRF�zC�7���}�|����<���c�"�Y����|��F��2-y�]���]�h˽Lv�j=�]�+�>2c���߁&@�7�\�5�b[�����������_�չ���ǚ[ߑ?����4��B���ȟQ��"V�#V�N�6��gsJ�z ��E0��)8-�6�5���H��>"!�|�$��G�KAO�.Ov�2G]�9�� +��?�L�jf@8*�{�����U���Ƶ��ٹ���v:|9�q$�P[s�(���I��(�������p#��U/�<6�.^d��<��J�h ���<�7��݇�y,�V{߲�e�EЦ[���7T�\9�!��,�Qmu�{���L�i�������Y���{�.7�IXj���bE�+��`X�2g�% /d��i�E0aYX/҄�k]�b-[�R��KKѐ�KZ�����#PZ�H�? ./<����(.S%�S��n,~D��M~��d���<��x}�r[�&/�~RF bA�2�YߛZ��[�������c��[�^hWW�êe�~�����t#��IV ��Uy�l�c��V�ua ��|D"��a.�p ��0��_;���<�'�O�e������X���B�ƌ�K���1J��V.6�N�7J��w +G� +�y����{۪�}��PF %=���)��Q��^(���h�>}H+�S.��}U^|K~�|�з��o/C�.C߮C�^���}�}�}��2��2��:��e���з�з�зw��7M�}�>���)됇��bM�R�Lh>ԛ��W/"0^D`\D�_E�����m�@UO@��p�q��\��D�)+�E�����>$M<�C|b�;�������Ƅ\=->���%�m�@Zn0��/���S|�E����z}�m>�S#�2���4��\#�y���w�6�����'�/|��~B�c�o{��rys��^�l�B��D���$� .FY�J��a�.���-��۵�8%�V�K�"�D8�%bQ(V�Ką'��>}H" +.�~X"�~fb�!�w��5i��K9|^m[4�2,�I�S\E�5i�z�4Xۖ4��K�(ip�K�Q�48��`��4\xix�Ӈ�a��I����1Jɟ/�����)�8��#;4��al��8������Q:��ZN����`�%FY�`Y+�X�w�m6�Ł�{�ɓ88�~�8$ܑ���`Pҏ����u�m�I���@���=��m(���z������V��M(aSJ��c�K��m�ٮm��t/�]{��Ӡ;�~�7����:�N�<�x �oy�@G�y�?塏�����1�r��� n�1I�#X��> /����cQ�-�,R=�|��I�����Q�U=)R�5��Y��<*6�$ r�|,�V~_Y��Ǣ��T��?" �0�r���^jzE)��w��X�G�wIA���(J��v��_RJկe� +��19P�bؠ����$�4d�����?$֊�Q��,˺q�8�����[���i��'�|�A��eW��t�gŭ�/�p'=�S�@�>c9&A�^��)�r�,�y�K5������E��4�24H�;��p��� ��K��-�����^\� GW�m��æ��B���oɚ�(��E�����?V�b�j������=��h�V���:��}a�+K�O=]�ڸHP���g>���,C��r���)�=/z��o|�6�g=\DiQ���-r�w��}��%�O1^�1\�ÕO1��i��U�bM_��*��d�/>�6�g�ʧEq>-��(^�t�>nڽ�D������Ou`E��T���U����n��UNq>9Ż�E/>���O�F�����(�ON�9�;r�>��ɧÅ�B��i�>>�P�|Z$kբX�ź��v>Y��O���q�Ӣ8�i�h\�t�>��^X��|�U�oY�e�����m����8�͌�l3���U�m�ڗmŐ7۬���6+Uc�{�U�������F3��iF��e�ifU��f�z,����c�.�86cm1�k�$�kr��a8�v��A� b��z�7H�g�g�L�[��v��Dz�d�%����Oz�Ҏ�ni-���J߳ė�'"�l����S�/;je�����9�b-q�5����:[<�u6.�0��Ϝ xqqg��Y�,�5iQ�ًb=[E;�~g�j���]X�(ΣEZ-j.]���ٕ%�u��ɬ��'�P[�4�v>9�[��S�{^��տ��m��hf�GY|r���)ޑK�w��Of�,�[G�'3�Vaffm|Z$kբX�ź��v>y�Χ�F�,^��(ΧE��+���߭�g>���d���M��x�Y;���r���)�=/z���_|�6�g4�ޣ,>9�[��ȥ��u��'3Eѭ#瓙P�03�6>-��jQ��b�[E;��~��j��l\��(ΧEZ->]��[gO|��u���-�ٴ�N �g��U��E��A�{<��r��ЈFQ�죆��$����f���f�R��6c�L�P9ՠ�C2�W��,����z,��xq���qu��͌��3��ͤo�ͅ������"?�������+�Y`�Y��v�S�i'�Q��_'q]�R���/��t��}P�(E�<lz6�Q����l8��xQ�Q���Y�=#����p�y�HyLJ��F�5!t�z,��{_YضǢ��^(����W>}� +�74��z�',���C#�F�"\����k�c:�A�=�@b��(YC��;X�x�a�2���t\ Jk8]-�X���Y�]���M�2�k/��ay����(�v�i�F�ˉ�GG�Wϧ��Gc26�=]9�jA�I�c��q+�� r�3 +}��([����on<vR�=�U��Y�J�c%k�R�X)�y"(�4�l�R���U߷Ll�c'i/V���+p>��4�bs(�>��t�5̹,Gj� ����8�\���e��tG����\r;��)m%�mKd��?������k��L���zW���3�����/h��ӌI�ͩ�B(� ����A���ů���ҁh����7����ׯ2s�Q�� �.C?������9�VCC�5�u4�XiAD���/�w�R�����~�]"9�R���3;2���r�U�[�ro�+d杕)�v�����N�o<iG��f�ē�bp��_�9�(85���QD��V����G!�)��ʒ��ay9h� +�S^+ s�c�H�E�F�}�����g6��h+�}��h�k>b�J��:�D����'�_w}�&ʧ8���Q�e.�qZ^֔��X���������=�%�c�����e�x�S��Un/x��Xu�"�XI�����a�I�p��������[6�`��w��p��ۑߘ��biZe�Ai�B�g�̴F����)k��T}��bcd�V#V]�Y��"�'m���6Y��F�!2JYC�$"+8�=�F��ʯ�1D�5.�:.�e\�e\�˸��q�/�ү�ү��_ǥ��K��K��2.�u\�u\�u\�;��L��Łh���Dr�w��Z&O�� +��%�yE�خJ9��t2r�\�Ϭ��"a���� +�����p�y�HyLJ��FI�D�p+�p뽯,l�cQ�|/��{� b�����8�m��ր0��[I�%u��p���Q���;q�>��B[+x_��z�p�i�,����oe����f2yX�w��q0���[ό�mq��GL�e�j(�-��%y����]�Ʉ�}^]���Z5����V��.a�쩵�A�0��hq0���+��V+g�5bJˌ0G���#T�#Y S��x7�5��lg��0BG�ʜ s��sC;�y6����%�O@]�^$6�������4�Bӵ�������ۢ���}1b�ؖT��+���Z��0j�Ƕ�Z��j:��L���H������R˱VR���V&��J�}���O�n��q�q�5$l�@�3uD݅-B~��e��K�X:;)c�g�NBdv�b'��p� 'k��c�h�ۈh�a|@���< ���O ���Mo#���}՚x�*�3k�اFMp�Y���v�55�ަ)�o��V�O V���� ��� +e�|nh�i �A6�݆9�q��)�8\�1䝋3:�!$yi�> ���e��O�n��p8�-��-�(���VnȈ�u��I�b��$I9s�+�oF�$X�`��N��e#���'����>Vg/<��2�O��ѹ��|<v�Ew�X��+^խ2�E�,B�C�ݳ4���B���Jmrk����ӤѦA�VyF ;%�����c�ڻg��=6��� +��]9��ʤ���ũq%ܴJүGg��������7����/�ixo:s����2o�\�2�Lc٧��w)�06�S� ^��"���=�����Y�#�J����)Zx����u +���(�r+�{���g�|l��q�( + �#�R~��=��(�+��M|�DSm�7/^�?-����h��,�/7/�W\u#O�b7�������x +endstream +endobj +4 0 obj + 22398 +endobj +2 0 obj +<< + /ExtGState << + /a0 << /CA 1 /ca 1 >> + >> + /Font << + /f-0-0 5 0 R + /f-1-0 6 0 R + /f-2-0 7 0 R + >> +>> +endobj +8 0 obj +<< /Type /Page + /Parent 1 0 R + /MediaBox [ 0 0 595.275586 841.889746 ] + /Contents 3 0 R + /Group << + /Type /Group + /S /Transparency + /CS /DeviceRGB + >> + /Resources 2 0 R +>> +endobj +10 0 obj +<< /Length 11 0 R + /Filter /FlateDecode +>> +stream +x�+� +��� +endstream +endobj +11 0 obj + 13 +endobj +9 0 obj +<< +>> +endobj +12 0 obj +<< /Type /Page + /Parent 1 0 R + /MediaBox [ 0 0 595.275586 841.889746 ] + /Contents 10 0 R + /Group << + /Type /Group + /S /Transparency + /CS /DeviceRGB + >> + /Resources 9 0 R +>> +endobj +13 0 obj +<< /Length 14 0 R + /Filter /FlateDecode + /Length1 7884 +>> +stream +x��Y XS���s� �aH@""e �Ȏ( ��,EAE��EK�nm�V�E[�L�����6Զ��j������}:]�����}�:s{;U�|�9IL�}f� ��rN��[�������Ukw�fr��(@��>�ڷ-6&�����㑎������'"�;ۚҬh���sY�x"�!���x��ٽ��A�x� ?�qSk�H�C����t7�o���m<ޏDZ�{�6�/ۇ�'�8����Z�N +��X�����a%Ri��ҧ�M����F�����|�&����F`[���`�34$-���eN�5c�i�*X�bCT�t��!*P�s��(�㕪P�Ǵ��W�Ƙ��`,��{��whU�-"�S+N��p�Z�SK�����A��1f�5Τΰ�ͦx�T�W��6u�-�3���)��̒T�O��jh|�k5y�?�h�3���ĵ�?X:�Q,37��1�°S&M˝P�%bӄ6$�N� +U�X1�g��jM6�]��r�-d<6g��s�dh�T��Tܧ.Rm��hUbV$� )Fo���jS� ���&���1�����ѩ�g�����&�.���E���*z�z7�~�����I��p�uXO�N�Nu���: �Tz)G^!�3�舷�X�����@�]�i�L�\��V��e�>�:)��oQk�.:�`K�geb�꣓[����ٿ�Ɦ�}��7�/ZV�n{�c�bQ1���՞:�畑�nkt��[�G�K۶�8V�4o���h�3�ž����X��X��A����X�b�V"c�XeN㏕�uBsf������}9:�������C_�cU�ڍe��-��ty�����ən�Y��W�_U��s�==xǰ�F0C�s�1"\��Դ�T���f "ܛslB���P"�0q�ќ$�O���ILq��.�����h�[������'���tdG痻�"���Xbߵt�N#���[�d�wi����ެ=�K��+W���tUM���q|�u3 �>��W7�$�=� X��H��Q�RX7r[�L@�THd#��8Q@�z���Cq�2g7�T��G�R�ʊ{�v߹;JN����Zܰ��xY1�������چ7w�S��?��}l����9KJ:6U8x�k0�U�ϑo5��d�/��� E���P>̫^�,���� �%H��( ����KEJ�<�X������$������%і^��v��愌tsB�͚`�����_�.���������S�H��̎�jBD��&"�S��$Δ魃w�h}�m�t{Q�%�%m�4�6v��5�ߪY���\^���i�2x��BݪD��BЭp\T��l���2ux(�G���Ω�����xƊ����V$'W�⦖e��}OZyvvlrRlƐ��|��zGɰ��U�3g�3�x$C�3�� +�'I����e�H��8O��j IN��L��p�C��ֹ��)C�<(J�`��tl�b-f��ZH�qXO1��q��!͵��Ouu���7<~��T� ��?ܿ�j����as�g�\T]�N�p����ujlruѓ�+���H���7=��c3_�z�m��6A2}P��2���q�T���] 8rڀ +���{�Ɉ�܃+Ĉ�'o~�P![��#jQo���9��+Q�JSc�����)Y���7�D�[����lao1��7�:�H��`��.�z%�������!��,�@#�UF�2��tr���˜����W#++S-Z�e<04z|�ƶ�%/�a�ѡ���������w��7O�.�).�ϭ[�.0D�w����V��ʫ �^��������|���H$������BZC�+�K��*a*d�|`�"/ݍ���L�[$��9N�D&����W&h����u8kh�h"�X��}`͇d��_tύ��9GN�d�p�ۅ��_n�y���@o��g���cn}�_I��P���O~R���]�za�3�&�nM��K�.�c�A�R�R�1b��@އ�B.�̊xB�z5}ਃd�@$��X֤em���2��������'�~�=ѻ�&�ȳ?���*���y�݉�k�S��t&��Q����N�V��ʼn�[��[q|��e"jB�L�)��(}R��4f1�a�j����7�tndφye[jv�y�{(ḱ삎������ +�X�A��ɋ6���g�SQoN�0�,l�Y4G�r��%�,�y�C�'������v�Q���H�C }>&=r$�M��~4$~�R�y����$i����\g~�k�=AK +~E��YE<M��'��p��������ڴZ���������O��]���;l�X2�2S�ת{�:�i����i.��k��n���3�!��d��,)����,K�ɒ�i�~a�;�Ԣ� �h��S �=�'��}FD(e�/�i" Np ���A04�ap)�~y�7p�Fb����io��ig�O��ӛ�RF�W�����ӭ�f�}n.��l'��md� ;�JH̠F�� ��g��T�U�]{�]���!��䳍�x�TN� �<��cPc�:D!e���qE N��A�E!u�}5�ʿ���#S[�ț��;��Y������0�'�VL�/G����֯I���&�z`�o�p 1�!��QZ��Q���1u)���)4L����O/7˛�����n]�sqϮ�?�����������l������:��7<���͗W.n�.+nX\���!��=�� ։hU(O^��`t�g J���L�B�LHSo�s�6}< ��f��m��y��v--��{.r�����Լ��--� h}v��zq�����!��� =%�at��F �XNN�3$�W{�*�[�3t���H�ԉ]�%� a��6�g#X�ec����g(�[d����J�n#,��5?���/���ߛ��"��s���߹��V�k�e_��Z0�C��(o�A +U�7V�������ȈRx��\�oE �I� �q�ZT�h� ,G����V.8���\��E�&�lΣ~�v^�\���l[�e�����m�y�wUΙsb��pφfӼ��u-�_ �[ʋ��wU�4TU��f�.�[��pu}˕=�������o�^ǒ�)�K����,_�~��;���3�Ew����9��� �M��|QIYŚ�C�0>�����)J�Vt�n��=�f]xCJ�����7��6s�;��5����+n�@z.��~��yp�ɔ�w/���>,�WV���5���#ySSx/z_ ]d=���W1K�<� �碫��8��}��']�@����s�����h��5�;~L�Q��%��1�R�� �Y��f���zR�cV���Ä:(�P�:�ƙ�q�2m��E�MO)S�/�~�������w�:�����͛�e^*��H���D�'�E�Q*eZj���Q^m�� �R�'��t��@��0�W1Y3gk���f���2 )f�����8q�Ǿ�k�0HA�ŧ閾�⥼{��U�Ͻ�b���#X�� �n1�ƀ��W_���Qs��z-^�<k������?ټ7I����к�X��f��ز=?snWT"�;)�,x�j�%c�C����Ykʮ��c��X�}�ݺ��Ҟ�KL�������a݄F"6��-�������u@�c���3P���E�Z% `�=IOm�m�V�������������W{*�닛�U5��� ����{���g�95ݹ��}{Unm����<���3���"�A�I�*�<Q�D��~a~ނt�Uu�� +��Q-�^0G,�k�Y��yi��*HEaA�|�$ϻ1��R"C��aQ�I��=-^9� +P��Vo2����P�0z�D�]���٘��=�P���<6���VWw��~��~�&5��nth���V֭�n�mmYP߶���j��1%~ђ����jqϝ��cϽ�w���p;9u�dc�zg͖-;Ǝ�.j�?����G~�4���A���p�y�cE�A" ��M�`�U�����/J�_����=���ۊ�0gB*ȳS�+��0��'�1��T+��[����Īx���7���|���� +�����GM�'O4�t�{�����L;������Q��}��='����0>�L-�F�S����~%N����ߡ�t�Ul�8����&�2j��@�lX�]�����ޭ�S��ǡo�k���_��w����F~]�fנ�2��ΨȀ}��hU$&v\���-.s��� �Gb�+�#}�0GG�VN�2�z a H���/&R���1+tr<ǩ8�u�f�<]�q�m5��꾉�=�y����;lQ�V��T6�4o��:t�U-5w?�PYV֦6mN=������lw����b�gj���s~@3D���F�c��,�F�b���)�H�������^�9'�$��}���,}�d|d�b�U�?x�?�ff���Q���/�d�?��"�Y)���N��� +A%S! h��z0 ��A8D@$D�����E�&H�U��b���n6��3|�?�6x��Kp��6��Z��<�a���4�!"���&�E֒�����(�� p �`�Ij`F�Mꡓ���}�`ޅg�(���n�� ���5�OBJ�����)4�o��x�c�6m����E����*�����o<e��)���ݭG2~��^�m�"5����~ +v��L���t�[������>���4D�)p��ݷ e��R&�X��g�o|�ȍ�?�������m"-��X����X�`�gٿA>$ɰ���=� �Y V�=��J�[+f��wh�>f +������~�~ ��N,�����Kb%{%�%?J�J�U�˾�#�I�R��8�Ee��^�;�L���s|&����;�����%j<"A,r&/�V8K����Cqg����: � +endstream +endobj +14 0 obj + 4938 +endobj +15 0 obj +<< /Length 16 0 R + /Filter /FlateDecode +>> +stream +x�]��j�0��>E��â��vA���x�j�1�B7Jt���� [���g�8IO�s��U��~2�b���LWoH�t]"���Y���\���!��-+]Z7LI]��#,.���ݓ�zzH�雷�Gw��S�W�u��BnY�4��>���W}!���}k�����!�/��6�P�%Z2��eֆ�vgJ�,\���p5 9�o�Ȑ��[�.Cx���M$�*@9(���*A +T���G�AґW�#Ȁ8�F:p=B�i"�]#R¯��d��~�Z¯*A�S�.�O��ς��H�� +�+{�J�I�UL�+ف���Jt�����;���s$�4���_��}*�)쒂_ő�S�8P<9�hm��>���}�xX�nS::���y���x��6ݣ +endstream +endobj +16 0 obj + 394 +endobj +17 0 obj +<< /Type /FontDescriptor + /FontName /HoratioDMed + /Flags 4 + /FontBBox [ -136 -250 1094 898 ] + /ItalicAngle 0 + /Ascent 946 + /Descent -253 + /CapHeight 898 + /StemV 80 + /StemH 80 + /FontFile2 13 0 R +>> +endobj +18 0 obj +<< /Type /Font + /Subtype /CIDFontType2 + /BaseFont /HoratioDMed + /CIDSystemInfo + << /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 17 0 R + /W [0 [ 250 468 282 508 508 483 508 212 508 464 250 740 629 612 373 395 464 365 363 261 382 237 211 624 496 343 416 509 574 211 173 264 237 494 494 770 253 457 291 477 291 ]] +>> +endobj +5 0 obj +<< /Type /Font + /Subtype /Type0 + /BaseFont /HoratioDMed + /Encoding /Identity-H + /DescendantFonts [ 18 0 R] + /ToUnicode 15 0 R +>> +endobj +19 0 obj +<< /Length 20 0 R + /Filter /FlateDecode + /Length1 2432 +>> +stream +x�uVLU�?�{_���_�>���WPF����0d�AF�y@T�u�VC;��F�jZ�,�4�6��+aY� T�Ę�df�k�F��X�E��s_q]�����~�9����|����. ��s�h�����9�V��|�pnd��+����`��Q�"����ط��ٴw@l{1�{�n @=E��6Rd��y��q�u;��*�(����CGZ�V������#z<&.��$�l�~�b���_$���B`,VB�@v(��� ������ӂ�iAfZ����B���Σ�@���7t�a���o��+S�V��`BI(��tө���0e ɠWG̓��%c +��p�N�s�:�/+�>�nY�M��B�mJKMK��|�"�]i�>��X�ʷ����4��<܁��Z�{U��w�.~�ϏON^�d�'Ǒ�]S�M����>�����G�����i�O>7}��$�G\Gyi"�I���B�SO�5 Г�1EG�.BZVV�_�B����)_�ǷIj:���]�7��x�$�=��������[�U�w�$�v|T��� �qKY��1�t���5���(F���PABӎ��_���)7/�|�M%�%�շ��o/���M,�J��m�������yf����8���S�8�io�c^�?b_�뺷0�k��U>�g'��Լ�c�裔�����R��2��ák�Q�@r`LMPe��F�j�\`fC<(���"���/.��Y +��?����wqSQ�w��&}t���:.�N�7C'ё��� yE���@�cIn�����*D/�%;/w���"�@~VQ~d_Uՙ��wVe�>���v�:x�lU�հ��ƕ)��H�\�w�eS�u:a��;�E�$|)A[+aJR<�a}^n��ˉқ�&ޘ潽C�#�?a�9�|`����V�͂]˵|�҄5�=^'CT'mătbBah��0��59^Լ�R���O}���p�Wd�$>oZj��,}���� +b���=�|ub���k����/ޤ���|������熶��b�{'{��|�/_G���:���m>w(tTۡ'��"D�g]�Q������L �.}Fؑ�Bqt��GD��������y7o���+� ^��/.����GM��o�!��L����� �A�H��UWV� +++.X�!CV|�l�/�DZ�Z�L� x����V���a�S��J�<+�U�@l����z�H�y6��X�e�����"5�w�O�O�_��S�~jC&����Ā�4A4B8�t҉ĩ���j�N���EuR�P{գj��K-U]������#�=�_yM)QtyN���K��s�)�O� \�NMB�P@����\���!�^�g�����[�:�{��UR^Kc�Q�07a�C�)�d�ە�LtP�SY��������c���#�������J�˶�b�� F\�R~�Z,?�����K(䄍 +�-�j 9��1�F�P����G������1Ǩh������}���^Cf���G�f��0���'���m�ΝRN�l��~\�0�r{�J�� :6q(b� {�-!mo��� K0�#Ȥ��3�c�K4��V�}V��^�n��F��l&�۷VE�U��`If�L�n�������Q#�=�AZ���j���6-��+(`��z+��`��Q�!�!x*��,o~0^ 4��w�M��%.����K���Ħxհ���k��t ��������9h����Z\�y�[�-�]�4���ս�ރ�����i������1*� �;Nܺ�G�2˩R8���#����Pn�F�/�\f��dC1b���;�J�RK�^9{:��������A)?' +endstream +endobj +20 0 obj + 1898 +endobj +21 0 obj +<< /Length 22 0 R + /Filter /FlateDecode +>> +stream +x�]��n� ��<��ݡ"I�6��HS{�a�l@�ɐ@���#��Y���l�/��5:��Vv`�Fy���%B��6,/@i�v9 �x4w�pj�`Y]���� +�e{|b�߽B����KGG��� '42�4�p� +�&&���VE]�um_�C(�T�� +g'$zaFdu��z��04�^����);��YvʛDE�sAt �@t$��J�g���Dg�J���2�sy�l�m�x;N�N�nMj���p�m��~P�3 +endstream +endobj +22 0 obj + 263 +endobj +23 0 obj +<< /Type /FontDescriptor + /FontName /Emblem + /Flags 4 + /FontBBox [ -83 -210 1162 835 ] + /ItalicAngle 0 + /Ascent 688 + /Descent -215 + /CapHeight 835 + /StemV 80 + /StemH 80 + /FontFile2 19 0 R +>> +endobj +24 0 obj +<< /Type /Font + /Subtype /CIDFontType2 + /BaseFont /Emblem + /CIDSystemInfo + << /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 23 0 R + /W [0 [ 750 646 333 566 606 253 312 627 606 ]] +>> +endobj +6 0 obj +<< /Type /Font + /Subtype /Type0 + /BaseFont /Emblem + /Encoding /Identity-H + /DescendantFonts [ 24 0 R] + /ToUnicode 21 0 R +>> +endobj +25 0 obj +<< /Length 26 0 R + /Filter /FlateDecode + /Length1 7972 +>> +stream +x��Yy|U���Nݮ�zOw�Iw���Y�B `�&� 2�h!t!�$�ąEI��(���B�-Bp".�̈"Ou���7�?�I����{��}�/��{�Vݳ}�|� ��#��oѲ+��o ����Z�z����K�8o �n_�bɲ���E��S��yIպş������g��/���IH\� ���K�&���~jŲUk�|X��������E�3�����]��'`_��[���WܱN�=�qMv��b��_�������u�y�����I^�ٞk�t��lO��ⷤ�-��<�_ ��_(m����Z�I(Y9�9�ǓLr^�.%�K��1��8�o�ޠ��7����>N�����q�^O��)P����^ѕ���1���T.�L&dI��z�v�H�R��Z�?������|�kq�O�U*H��x)D��M>�˦�L. $| 9�2O7O?�0�8/i�o�^riʆ� � � �Rڒ�|m��䶔I|���x���C�C�C�C�Cq��'�''�']'�N�Me���� ���Kϣ��p������Hɥ)��ݙD�îIIN_���������Wf]�7ݱjͼ�[w����%]�.�Y]6w�kr��-�z ����U3g��)+'��z�3At�e +�)g�=q�ɲ��Z�n�Pk"�1 �9h�wJ��C�ݪ��zB�=g��?��BSЩ�٥��`'�ljMa)1�;&����/,���_��;nl^�|v���vZ�jrǏ��;�njHfV�;F�����H��u�dl��"��p���q�d�A-ɋ�.��Ͼ�^wIJ���8�2�B�_G�;�B�&0�!8�t!]�s7�[�{ܺ2[ +�W`�;��M_T`Bc�~�o��t�r`��Ic����=���J:Ey�r�l� 7�o���;Ն�?��`\�I<�.'r�����C\y��d(O���sV�t�'���V,�z$�[���V�W�6x��}�{��N<+C�?��#!"D�A�����u�$m^<uA��:��wʝմnj�*qD<�aC��vZ���aʹ�G_9��sJ�P��q�;�d�Ec0ڹ��8c���֖�$�B�HSP +�<(q�%�p7z?jh�7dQ�ZZ�Z����x�,�|C|{<w5:<���Ӣ��ߢ�D��j`�쎗�{��YeW����O����6n����E�G�Ϝ�+z�����ϣz`�»h�8�,jm�s��0g�Q[k٭\��V1`����j��H]�HooH9}��RlAD%N���䐜�K����D�2'���l�Cv�.9Ks�d�q���P�����6��e���p�Ap;���>uS�{o@?X����T��q��vŃP�����JS4��b�s�1��b� H��&%� ��z3����C����d+�������A_�9@ +�=B�3+GUc.�q�1�ӃQ'����h�sc�S�OKr�܆��\ձDq�D���(�p�U�D���E�����K;K˭����d]��_�{r8�Pvnk��ں�i����?�(��%<�������*���o|��G;�I��(����ٲ��4-*|����E� �Q�r����}�j7G�Ң�2&�� +Hv�Ul߱c��;�}�|I�.P����o��/\���f"C�!及��]�2���� $��,)�x��o� 0�k}���&O����Ԥ <hS�+��1?U�Z8�ţ�'#��l\��|CZ{JJ���6p%�;�<&t�������m��Rդ�/w�I��p�������>���7^�<����ק��V�+�ܩ�ϋ�{H��!�Z����E������=��x���[g��دf��#� j6������\-9j�ὁ���V�|}�n�t4����mk�x���!� �&/_����/�����+��{Q/Y!� +F���Z��Z�;�jZ�k��e�-!�1m�H>��H��O�a�ԭZ4����ꏖj��/�%5$�'�O�K�B/[z?����b;�U�<Q�~`���)_�YF-?�T-���ӑG~�z�9Db,_������-�e��V��I-G�$ @���b�q�4ba���0�r���J�� �~ա��H$�䈺�>��I�l�DSc��8�t��+��Kͺ�E�94���5�����ڰa�rj=O�0=�laDiP�P�+ C:����Iz[#�7j1Hg�����n*}^���/)�JJ�^C���r�H���b��~V�O�P\4}zQ� #�OQ4}��F+�_�?^6��5&�E �I:��"��p��"q�B�zjݵq�K�/+�F���V4�ݑ�˔��[yT De���ɤyl��I�!�'~"~ $̖� ��g�u�O�����D�t��Lb��g�wIEB���O����(�����gd��n�f�����L�o��n�}z;+Z�H�Ʊ*C���4d3�2}�����b�H�H�Hc��8qd�H�Hq�ɺ��)���II�}���������������&G�U�*}���X�T��W%/M�����u�u���:_��.y]J����lNe��/Yd�/!c��?9��Jv��c5/���!j�Tq���r���~s癗�|F�F�X78�Φ�h�X��h�u����_r��Wk������h�+{����`�y��t��:-'�1����`��Q@���ӌ��L�Adj +���dԊ���Dk�sf��[hr�R ��;�EWH�ċ�C��SD��I�)�0KX$�Q��|<sh�4��g�,m�.�4��K�����M�"��%�´�_��h֊k�kuk� h8?U�F�6v��OY��^8H�i�ڲFY��r �����<��A�c��{X=���&A ��h���Ia 3G�$� �@%Q0�7pFI�i��TM$�|�f�,��dԣ1G�Ѧ�Uk�t�5��XnvQ�7d�'��h��j���d6�,C�a�0-�V �J�Z��������KUz&����9� |v�~��~?��N�荰ʾ�":I������ +�\���u�8�c6��:N��d6�{���H9�4�0���4�˙=�s:p�f�j���z9�I���LN4p�f/&��=�b�4��F�B�}?��,�W,��L�-湤�t)]Ky��2Y��B0��R)����f��534��9�9� +ƝQ�&,�&k�Z�.��_�Vi�i��"��0�!������_����dE���(��B��щ��_D�;T[��(t����h�����Տ��E2�9~�h����)���'�d�<I�ӂA��A�y�&�$��j��)�j�B���6kw�W/�>���$>���M���m�R�?M�+�NX^;;�,hA��VK4�zC�� ��DmWL��l��ån� ����F�C�?�o�����3ο��0n��O���������@- �x���y��-3� ��7 <�e�T�����-mm[�tgn�]DF=N��jǽ�ڴХ�� +�a��R��`��:�E��\U�KK,������?2?^-�WD�C��S�����C�w?�\V֠��~J5Jߧ��_q����6U��Ouv|<TOW~��cM�r�g9���/7,��D�ٜ� �I�����!�-1���JI�I*��j��sȸP����u�q��c�3�[��XF��ɵԾ�&�3�~���O~�O7��\x� +�}K�S�u�o�Q�Q^R:�g�<�rAB�3h�8j����1�XØp�F��%A�LsجOuP-��N���D�6�p��T�+�a�S��z>�a&��?���>�ݭFMwqt� W�F��ʩ +?tD3�٣�o�V�f�[��&Y3�y�L[�}��Zk���>Y�d��:�6�^*�Z�[���ٗ +�j�R�R�����Ѡ�"�D�S��v[��*����Å��Vh�(L��&�of�7�f��BX��W w��l+퍞=�C���T��=���:e(~i��5'���8g�;_?9�qB!� +9�z���|��G�����-o����=�f�:�A����z7�sZ��&���[R�[�qof�5qnF�9�Ơ�Lz�IvfeF�Hlo��P��n���/���b�̗S��ꬵ�Y|mF'��:���b]�.G���������mh�U�n��Y�?��R +c�ϼ��oشjes�~e�轕���{�r��/�G�_�����?[][}�z|�/��S&���'�[^x.3���w#����t�Ѳ;�K��r�*&��ǃ���c���-R����]��=.�n����2��X��E�)o(�br&��Rf ��7���&�P��VW�*���� �L 5r��$V]�H�w�d����MZ#�!F� �m�Ò�.�t���K�������O�� ��d>�gd�%�^l12�R9)�ܵ�T��1n��g�+�`���,��n\2�f*�z�noo��q�2���5��W�?����ȋq�uA=;���0��yl8�gp���A��� �T��ܤ>����G����=�y������ �� N�g�an�PY�Ou�7���W7�zx#ً�_����)^T��g��wI��y��h^T������_���da�~�m��mn �`^͈>��t�(�doǎ�So���(9�^��IΛI�a�o�B����^���G�I3Yɫz{�c1�m!{/ھ#�FWV�"�=���$�zǷ�L:�a1-E 9z&��z�˱�m|T��W���K��n�2�=��k���?HF���Q�Ixp��p��J�f��a��@5B=��w렀��xI9������8�L��s� +��E �Y`�'�si����M��?������_;��n\���Q��wn;Kh�4��OK�����,'8uF���̄�Co�P>�f����a�0>'e�L���o.�'I���5��7\9����Hc��;��J\�_a��%�����0V�����b|<Yɵ�)PDF���b E�.��ޟ����u��)8o$�}�fr +ϭ��<ͯ�c�^R� �aI�&�����_#�5���j~����ӝ�Pa�hBh��|6����~�:�r{�8!�Ɉ��nBt%���l�u:K������'B,+�� ��a��U���sZ�Mv9�T����6��\���� +���k]��0�&�]��{#�z*�^ ét���z8��cz8��� ��v��K +��� +<���_��A��pH�g���6�S �);4��B��0<��C�ľ0{B�}ax���O��kulo� +�I�h.�ޔ�v+��.�=�]<���N��8o� v��|p�v4�m&h����`�}�l�۶�ض4��jd[m���ʲ�o}P�Z���A�<�Pv�-����l�[϶X`��7�U�Hh�|�5)���2��ln��?�=P���(��i�i��mJ�M��� ���q��a�/�u�=mp��a֨@C���pW����z�Ygfwڠ��m��ku�f�����w$��>�#V�C�a��V�f���(��+d���/ÖW²1PUi`UT5����.郥��R*����cP��/Y�Ɩ���_����� �EX�����r���m +�)p�T���)0w<�*�+������v�)3n4��p��_'���0%��E6� &��z���6�h� ��Mp��q66�ƍ��8��N��Jp��e��Aւ��qm��sؘi0���FO��Q:Vb������V6��GXX�FX���(fg� ++��av(�X� B�hYH����B~^�y��y�|n���: ���цYN��,8�Q�l;d�|���̌|�yd�`��S@����f�cie��be�� K�B��'����1��,��N> K�@R#���D���@��S���g�Y�Ʒ��!N.�R�)��ng�J��l�n���l`�y�c`A�Z��$�3�on�3)`���(�����#*A�st�� �(X�h�b�z`��N�+��r:���(@;hx}3���#����?�:� �? +endstream +endobj +26 0 obj + 6009 +endobj +27 0 obj +<< /Length 28 0 R + /Filter /FlateDecode +>> +stream +x�]�Mn�0���b��" ����tâ?*���b,Cܾ��J�Z����<_�Z�v� /�ZY����L_��� �@�-��D�Kn�y����%şN����YM?ED�[�v�W�}_|j�����z�$�*Rܻr��ykG��'�k��aY�.�/�k5L�g���x6�d��+Ge�NEe�N�V���@Z��[k}�p�Ir<T�RO�t���2h9(����#"������Zh���A$A�Sz1(D� t-O9j���_&@�_ȃ����S�_j�_�@�_� �L�F��m,�=f.�ֺq�E�s�&<h~좙̖�_>z�� +endstream +endobj +28 0 obj + 336 +endobj +29 0 obj +<< /Type /FontDescriptor + /FontName /DejaVuSerif + /Flags 4 + /FontBBox [ -769 -346 1679 1242 ] + /ItalicAngle 0 + /Ascent 928 + /Descent -235 + /CapHeight 1242 + /StemV 80 + /StemH 80 + /FontFile2 25 0 R +>> +endobj +30 0 obj +<< /Type /Font + /Subtype /CIDFontType2 + /BaseFont /DejaVuSerif + /CIDSystemInfo + << /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 29 0 R + /W [0 [ 600 513 319 401 591 644 478 640 602 640 560 644 319 390 317 390 685 564 722 564 752 672 765 1023 596 801 370 ]] +>> +endobj +7 0 obj +<< /Type /Font + /Subtype /Type0 + /BaseFont /DejaVuSerif + /Encoding /Identity-H + /DescendantFonts [ 30 0 R] + /ToUnicode 27 0 R +>> +endobj +1 0 obj +<< /Type /Pages + /Kids [ 8 0 R 12 0 R ] + /Count 2 +>> +endobj +31 0 obj +<< /Creator (cairo 1.8.0 (http://cairographics.org)) + /Producer (cairo 1.8.0 (http://cairographics.org)) +>> +endobj +32 0 obj +<< /Type /Catalog + /Pages 1 0 R +>> +endobj +xref +0 33 +0000000000 65535 f +0000039841 00000 n +0000022513 00000 n +0000000015 00000 n +0000022489 00000 n +0000029394 00000 n +0000032408 00000 n +0000039687 00000 n +0000022660 00000 n +0000022987 00000 n +0000022874 00000 n +0000022965 00000 n +0000023008 00000 n +0000023224 00000 n +0000028257 00000 n +0000028281 00000 n +0000028753 00000 n +0000028776 00000 n +0000029009 00000 n +0000029548 00000 n +0000031541 00000 n +0000031565 00000 n +0000031906 00000 n +0000031929 00000 n +0000032156 00000 n +0000032557 00000 n +0000038661 00000 n +0000038685 00000 n +0000039099 00000 n +0000039122 00000 n +0000039357 00000 n +0000039913 00000 n +0000040039 00000 n +trailer +<< /Size 33 + /Root 32 0 R + /Info 31 0 R +>> +startxref +40092 +%%EOF
participants (1)
-
vjrj