From bee096671bfd98614325cc16c039b6a35f8833b4 Mon Sep 17 00:00:00 2001 From: xjp Date: Tue, 20 Sep 2022 16:25:30 +0800 Subject: [PATCH 1/2] dbedebugger --- code/datastudio/src/copyExternalsToBuild.sh | 1 + .../bl/serverdatacache/DebugObjects.java | 7 +- .../bl/serverdatacache/IDebugObject.java | 2 + .../META-INF/MANIFEST.MF | 3 +- .../common/QueryResVoConvertHelper.java | 157 ++ .../mppdbide/common/VersionHelper.java | 50 + .../debuger/debug/DebugConstants.java | 75 +- .../debuger/service/DebugService.java | 1420 +++++++------- .../service/DebuggerReportService.java | 246 +++ .../debuger/service/IDebugService.java | 3 + .../debuger/service/QueryService.java | 29 +- .../debuger/service/ServiceFactory.java | 5 +- .../debuger/service/SourceCodeService.java | 68 +- .../mppdbide/debuger/vo/BreakPointListVo.java | 17 + .../mppdbide/debuger/vo/BreakpointList.java | 3 + .../mppdbide/debuger/vo/PositionVo.java | 7 + .../mppdbide/debuger/vo/SourceCodeVo.java | 25 +- .../mppdbide/debuger/vo/VersionVo.java | 35 +- .../mppdbide/debuger/vo/dbe/AttachVo.java | 16 + .../mppdbide/debuger/vo/dbe/BacktraceVo.java | 37 + .../debuger/vo/dbe/InfoBreakpointsVo.java | 37 + .../mppdbide/debuger/vo/dbe/InfoCodeVo.java | 22 + .../mppdbide/debuger/vo/dbe/ServerInfoVo.java | 13 + .../mppdbide/debuger/vo/dbe/TurnOnVo.java | 13 + .../mppdbide/debuger/vo/dbe/VariablesVo.java | 111 ++ .../META-INF/MANIFEST.MF | 3 +- .../mppdbide/utils/ConstantRunLine.java | 19 + .../utils/DebuggerStartConstants.java | 44 + .../mppdbide/utils/IMessagesConstants.java | 32 +- .../mppdbide/utils/IMessagesConstantsOne.java | 3 + .../mppdbide/utils/vo/DebuggerEndInfoVo.java | 36 + .../utils/vo/DebuggerStartInfoVo.java | 29 + .../Application.e4xmi | 3 + .../META-INF/MANIFEST.MF | 19 +- .../icons/debug/breakpoint_indicate.png | Bin 195 -> 430 bytes .../icons/debug/debug_fail.png | Bin 0 -> 323 bytes .../icons/debug/debug_pass.png | Bin 0 -> 346 bytes .../icons/icon-remarkCoverage.png | Bin 0 -> 363 bytes .../core/sourceeditor/AnnotationHelper.java | 24 +- .../DebugFailPositionAnnotation.java | 95 + .../DebugPassPositionAnnotation.java | 95 + .../core/sourceeditor/PLSourceEditorCore.java | 90 +- .../sourceeditor/SQLSyntaxColorProvider.java | 2 + .../view/handler/ExecuteEditorItem.java | 1627 +++++++++-------- .../handler/ViewSourceDebugObjectHandler.java | 5 + .../handler/debug/ContinueDebugHandler.java | 2 + .../view/handler/debug/DebugHandlerUtils.java | 8 +- .../debug/DebugHistoryCoverageHandler.java | 90 + .../handler/debug/DebugServiceHelper.java | 21 +- .../view/handler/debug/StartDebugHandler.java | 34 +- .../handler/debug/TerminateDebugHandler.java | 8 +- .../handler/debug/chain/ServerExitChain.java | 9 + .../debug/ui/UpdateDebugPositionTask.java | 190 +- .../view/service/CoverageServiceFactory.java | 45 + .../mppdbide/view/ui/CoverageHistory.java | 479 +++++ .../mppdbide/view/ui/PLSourceEditor.java | 72 +- .../mppdbide/view/utils/ExportUtil.java | 103 ++ .../mppdbide/view/utils/icon/IiconPath.java | 6 + .../mppdbide/view/vo/CoverageService.java | 128 ++ .../mppdbide/view/vo/CoverageVo.java | 154 ++ ...\350\203\275\350\257\264\346\230\216.docx" | Bin 0 -> 260931 bytes .../New features to DataStudio.docx | Bin 0 -> 254615 bytes 62 files changed, 4362 insertions(+), 1515 deletions(-) create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/VersionHelper.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebuggerReportService.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakPointListVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/AttachVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/BacktraceVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoBreakpointsVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoCodeVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/ServerInfoVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/TurnOnVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/ConstantRunLine.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/DebuggerStartConstants.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerEndInfoVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerStartInfoVo.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/icons/debug/debug_fail.png create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/icons/debug/debug_pass.png create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/icons/icon-remarkCoverage.png create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugFailPositionAnnotation.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugPassPositionAnnotation.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHistoryCoverageHandler.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/service/CoverageServiceFactory.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/CoverageHistory.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java create mode 100644 code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageVo.java create mode 100644 "information/datastudio/DataStudio\346\226\260\345\242\236\345\212\237\350\203\275\350\257\264\346\230\216.docx" create mode 100644 information/datastudio/New features to DataStudio.docx diff --git a/code/datastudio/src/copyExternalsToBuild.sh b/code/datastudio/src/copyExternalsToBuild.sh index 9c2d20c8..b23aead6 100644 --- a/code/datastudio/src/copyExternalsToBuild.sh +++ b/code/datastudio/src/copyExternalsToBuild.sh @@ -49,6 +49,7 @@ cp $SOURCE/3rd_src/target/dependency/guava-30.1.1-jre.jar $DEST/org.opengauss.mp cp $SOURCE/3rd_src/target/dependency/javafx-base-18-ea+2-win.jar $DEST/org.opengauss.mppdbide.view/. cp $SOURCE/3rd_src/target/dependency/javafx-controls-18-ea+2-win.jar $DEST/org.opengauss.mppdbide.view/. cp $SOURCE/3rd_src/target/dependency/javafx-graphics-18-ea+2-win.jar $DEST/org.opengauss.mppdbide.view/. +cp $SOURCE/3rd_src/target/dependency/jsoup-1.14.3.jar $DEST/org.opengauss.mppdbide.view/. cp $SOURCE/platform/Gauss200/gs_jdbc/gsjdbc4.jar $DEST/org.opengauss.dbdriver.jdbc.gauss/. rm -rf $TEST/org.opengauss.mppdbide.adapter.test.fragment/lib diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/DebugObjects.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/DebugObjects.java index b32769dd..574ddf4d 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/DebugObjects.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/DebugObjects.java @@ -55,6 +55,7 @@ public class DebugObjects extends BatchDropServerObject implements ObjectChange, private ObjectParameter returnType; private Database db; private String usageHint; + private static String coverageHint; private Namespace namespace; private String lang; @@ -88,6 +89,7 @@ public class DebugObjects extends BatchDropServerObject implements ObjectChange, */ public void setUsagehint(String usagehint) { this.usageHint = usagehint; + this.coverageHint = usagehint; } /** @@ -868,7 +870,10 @@ public class DebugObjects extends BatchDropServerObject implements ObjectChange, hasout = createTemplateFromParams(params, parameterObject.getTemplateParams(), template, parameterObject.getOutParams()); - + + if (MessageConfigLoader.getProperty(IMessagesConstants.COVERAGE_HINT).equalsIgnoreCase(coverageHint)) { + usagehint.append(coverageHint + MPPDBIDEConstants.LINE_SEPARATOR); + } if (hasout) { usagehint.append(MessageConfigLoader.getProperty(IMessagesConstants.EXEC_DEBUG_DIALOG_OUT_PARA_MSG) + MPPDBIDEConstants.LINE_SEPARATOR); diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/IDebugObject.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/IDebugObject.java index 3dc740b0..444ff7a6 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/IDebugObject.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/IDebugObject.java @@ -258,6 +258,8 @@ public interface IDebugObject { * @return the template parameters */ ArrayList getTemplateParameters(); + + ObjectParameter[] getObjectParameters(); /** * Clear template parameter values. diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/META-INF/MANIFEST.MF b/code/datastudio/src/org.opengauss.mppdbide.debuger/META-INF/MANIFEST.MF index 2a29a9e2..9fb82c43 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/META-INF/MANIFEST.MF +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/META-INF/MANIFEST.MF @@ -20,7 +20,8 @@ Export-Package: org.opengauss.mppdbide.common, org.opengauss.mppdbide.debuger.service, org.opengauss.mppdbide.debuger.service.chain, org.opengauss.mppdbide.debuger.thread, - org.opengauss.mppdbide.debuger.vo + org.opengauss.mppdbide.debuger.vo, + org.opengauss.mppdbide.debuger.vo.dbe Bundle-ClassPath: . Import-Package: org.postgresql.core, org.postgresql.jdbc, diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java new file mode 100644 index 00000000..23c0dd39 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java @@ -0,0 +1,157 @@ +package org.opengauss.mppdbide.common; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.opengauss.mppdbide.debuger.annotation.ParseVo; +import org.opengauss.mppdbide.debuger.debug.DebugConstants; +import org.opengauss.mppdbide.debuger.vo.BreakPointListVo; +import org.opengauss.mppdbide.debuger.vo.PositionVo; +import org.opengauss.mppdbide.debuger.vo.SourceCodeVo; +import org.opengauss.mppdbide.debuger.vo.StackVo; +import org.opengauss.mppdbide.debuger.vo.VariableVo; +import org.opengauss.mppdbide.debuger.vo.VersionVo; +import org.opengauss.mppdbide.debuger.vo.dbe.BacktraceVo; +import org.opengauss.mppdbide.debuger.vo.dbe.InfoBreakpointsVo; +import org.opengauss.mppdbide.debuger.vo.dbe.InfoCodeVo; +import org.opengauss.mppdbide.debuger.vo.dbe.VariablesVo; + +/** + * Convert openGauss 3.0 vo to openGauss2.0 vo + * + * @author gitam + */ +public class QueryResVoConvertHelper { + + public static T parse(ResultSet rs,Class clazz,IConnection conn) throws SQLException { + VersionVo version=VersionHelper.getDebuggerVersion(conn); + return parse(rs,clazz,version); + } + + public static T parse(ResultSet rs,Class clazz,VersionVo versionVo) throws SQLException { + String className= clazz.getName(); + T obj = null; + //if openGauss2.0 command do not need to convert + boolean needConvert=versionVo.getDebuggerVersion().equalsIgnoreCase(DebugConstants.DBE_DEBUGGER); + if(!needConvert) { + obj= ParseVo.parse(rs, clazz); + }else { + switch(className) { + case "org.opengauss.mppdbide.debuger.vo.SourceCodeVo": + obj= convertToSourceCodeVo(rs); + break; + case "org.opengauss.mppdbide.debuger.vo.TotalSourceCodeVo": + break; + default: + break; + } + } + return obj; + } + + public static List parseList(ResultSet rs,Class clazz,IConnection conn) throws SQLException { + VersionVo version=VersionHelper.getDebuggerVersion(conn); + return parseList(rs,clazz,version); + } + + public static List parseList(ResultSet rs,Class clazz,VersionVo versionVo) throws SQLException { + String className= clazz.getName(); + List list = null; + //if openGauss2.0 command do not need to convert + boolean needConvert=versionVo.getDebuggerVersion().equalsIgnoreCase(DebugConstants.DBE_DEBUGGER); + if(!needConvert) { + list= ParseVo.parseList(rs, clazz); + }else { + switch(className) { + case "org.opengauss.mppdbide.debuger.vo.BreakpointVo": + list= covertToInofBreakpointsVo(rs); + break; + case "org.opengauss.mppdbide.debuger.vo.StackVo": + list= covertToInofBacktraceVo(rs); + break; + case "org.opengauss.mppdbide.debuger.vo.VariableVo": + list = covertToInofVariablesVo(rs); + break; + case "org.opengauss.mppdbide.debuger.vo.BreakPointListVo": + list = covertToInofBreakPointList(rs); + break; + } + } + return list; + } + + public static List covertToInofBreakPointList(ResultSet rs) throws SQLException { + List list = new ArrayList(); + List vos = ParseVo.parseList(rs,BreakPointListVo.class); + vos.forEach(item -> { + BreakPointListVo vo = new BreakPointListVo(); + vo.breakpointno = item.breakpointno; + vo.enable = item.enable; + vo.funcoid = item.funcoid; + vo.lineno = item.lineno; + vo.query = item.query; + list.add((T) vo); + }); + return list; + } + + public static List covertToInofVariablesVo(ResultSet rs) throws SQLException { + List list = new ArrayList(); + VariablesVo item = ParseVo.parse(rs,VariablesVo.class); + VariableVo vo = new VariableVo(); + vo.name = item.getVarname(); + vo.isconst = item.getIsconst(); + vo.value = item.getValue(); + vo.dtype = item.getDtype(); + list.add((T) vo); + return list; + } + + public static List covertToInofBacktraceVo(ResultSet rs) throws SQLException { + List list = new ArrayList(); + List infos = ParseVo.parseList(rs,BacktraceVo.class); + infos.forEach(item -> { + StackVo vo = new StackVo(); + vo.func = item.getFuncoid(); + vo.linenumber = item.getLineno(); + vo.level = 0; + vo.targetname = item.getQuery(); + list.add((T) vo); + }); + return list; + } + + public static List covertToInofBreakpointsVo(ResultSet rs) throws SQLException { + List list = new ArrayList(); + List infos = ParseVo.parseList(rs,InfoBreakpointsVo.class); + infos.forEach(item -> { + PositionVo vo = new PositionVo(); + vo.func = item.getFuncoid(); + vo.linenumber = item.getLineno(); + vo.breakpointno = item.getBreakpointno(); + list.add((T) vo); + }); + return list; + } + + public static T convertToSourceCodeVo(ResultSet rs) throws SQLException { + SourceCodeVo sourceCodeVo = new SourceCodeVo(); + List infoCodeList= ParseVo.parseList(rs,InfoCodeVo.class); + StringBuffer buffer=new StringBuffer(); + infoCodeList.forEach(a->{ + if (a.query.toLowerCase().contains("begin")) { + a.query = a.query.toUpperCase(Locale.ROOT).replaceFirst("BEGIN", "\rBEGIN"); + } + if (a.query.toLowerCase().contains("end")) { + a.query = a.query.toUpperCase(Locale.ROOT).replaceFirst("END", "\rEND"); + } + buffer.append(a.query); + }); + sourceCodeVo.setCodes(infoCodeList); + sourceCodeVo.setSourceCode(buffer.toString()); + return (T) sourceCodeVo; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/VersionHelper.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/VersionHelper.java new file mode 100644 index 00000000..076ca3f1 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/VersionHelper.java @@ -0,0 +1,50 @@ +package org.opengauss.mppdbide.common; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.opengauss.mppdbide.debuger.debug.DebugConstants; +import org.opengauss.mppdbide.debuger.debug.DebugConstants.DebugOpt; +import org.opengauss.mppdbide.debuger.vo.VersionVo; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; + +public class VersionHelper { + + /** + * get openGauss debugger version + * @return pl_debugger or dbe_debugger + */ + public static VersionVo getDebuggerVersion(IConnection serverConn) throws SQLException { + if (null == serverConn) { + MPPDBIDELoggerUtility.error("serverConn is null!"); + } + String sql= DebugConstants.getDbVersionSql(); + VersionVo versionVo=new VersionVo(); + try (PreparedStatement ps = serverConn.getStatement(sql)) { + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + // (openGauss 2.1.0 build 590b0f8e) openGauss version info + String version= rs.getObject(1).toString(); + MPPDBIDELoggerUtility.debug("openGauss db info version:" + version); + versionVo.version = version; + } + MPPDBIDELoggerUtility.debug("openGauss db info is empty!"); + return versionVo; + } + } + } + + public static DebugOpt getDebugOptByDebuggerVersion(IConnection serverConn,DebugOpt debugOpt) throws SQLException { + if (null == serverConn) { + return debugOpt; + } + VersionVo versionVo=getDebuggerVersion(serverConn); + DebugOpt res=DebugConstants.getDebugOptByDebuggerVersion(debugOpt,versionVo.getDebuggerVersion()); + if (null == res) { + return debugOpt; + } + return res; + } + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/debug/DebugConstants.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/debug/DebugConstants.java index 8e28d521..8c26b162 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/debug/DebugConstants.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/debug/DebugConstants.java @@ -15,6 +15,8 @@ package org.opengauss.mppdbide.debuger.debug; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.stream.Stream; @@ -28,28 +30,87 @@ public class DebugConstants { * default string length */ public static final int DEFAULT_STRING_BUILD_LEN = 128; + public static final String PL_DEBUGGER="pl_debugger"; + public static final String DBE_DEBUGGER="dbe_debugger"; + public static final Integer DBE_DEBUGGER_MIN_VERSION=300; + public static final LinkedHashMap enumMap=getEnumMap(DebugOpt.class); + public static HashMap oidSqlMap = new HashMap<>(); + + /** + * get DebugOpt by different debugger + * @param debugOpt + * @param debuggerVersion + * @return DebugOpt + */ + public static DebugOpt getDebugOptByDebuggerVersion(DebugOpt debugOpt,String debuggerVersion) { + if(PL_DEBUGGER.equalsIgnoreCase(debuggerVersion)) { + return debugOpt; + }else { + String optName=debugOpt.name(); + optName="DBE_"+optName; + return enumMap.get(optName); + } + } + + /** + * get name and all enum map + * @param + * @param enumClass + * @return LinkedHashMap + */ + public static > LinkedHashMap getEnumMap(final Class enumClass) { + final LinkedHashMap map = new LinkedHashMap<>(); + for (final E e : enumClass.getEnumConstants()) { + map.put(e.name(), e); + } + return map; + } /** * Title: the DebugOpt enum use to descript debuger interface */ public static enum DebugOpt { + //pldebugger command DEBUG_ON("pldbg_on", 0), DEBUG_OFF("pldbg_off", 0), - DEBUG_VERSION("pldbg_get_proxy_info", 0), + DEBUG_VERSION("version", 0), GET_SOURCE_CODE("pldbg_get_source", 1), GET_TOTAL_SOURCE_CODE("pg_get_functiondef", 1), START_SESSION("plpgsql_oid_debug", 1), ATTACH_SESSION("pldbg_attach_to_port", 1), STEP_INTO("pldbg_step_into", 1), STEP_OVER("pldbg_step_over", 1), - STEP_OUT("pldbg_step_out", 1), + STEP_OUT("pldbg_step_out", 1),//not support CONTINUE_EXEC("pldbg_continue", 1), ABORT_TARGET("pldbg_abort_target", 1), GET_VARIABLES("pldbg_get_variables", 1), GET_STACKS("pldbg_get_stack", 1), GET_BREAKPOINTS("pldbg_get_breakpoints", 1), DROP_BREAKPOINT("pldbg_drop_breakpoint", 3), - SET_BREAKPOINT("pldbg_set_breakpoint", 3); + SET_BREAKPOINT("pldbg_set_breakpoint", 3), + //dbe_debugger command + DBE_DEBUG_ON("DBE_PLDEBUGGER.turn_on",1), + DBE_DEBUG_OFF("DBE_PLDEBUGGER.turn_off", 1), + DBE_DEBUG_VERSION("version", 0), + DBE_GET_SOURCE_CODE("DBE_PLDEBUGGER.info_code", 1), + DBE_GET_TOTAL_SOURCE_CODE("pg_get_functiondef", 1), + DBE_START_SESSION("DBE_PLDEBUGGER.turn_on", 1), + DBE_ATTACH_SESSION("DBE_PLDEBUGGER.attach", 2), + DBE_STEP_INTO("DBE_PLDEBUGGER.step", 1), + DBE_STEP_OVER("DBE_PLDEBUGGER.next", 0), + DBE_STEP_OUT("pldbg_step_out", 1),//not support + DBE_CONTINUE_EXEC("DBE_PLDEBUGGER.continue", 0), + DBE_ABORT_TARGET("DBE_PLDEBUGGER.abort", 0), + DBE_GET_VARIABLES("DBE_PLDEBUGGER.print_var", 1), + DBE_GET_STACKS("DBE_PLDEBUGGER.backtrace", 0), + DBE_GET_BREAKPOINTS("DBE_PLDEBUGGER.info_breakpoints", 0), + DBE_DROP_BREAKPOINT("DBE_PLDEBUGGER.delete_breakpoint", 1), + DBE_SET_BREAKPOINT("DBE_PLDEBUGGER.add_breakpoint", 2), + DBE_REMARK_INFO_SET("DBE_PLDEBUGGER.remark_info_set",2), + DBE_REMARK_INFO_GET("DBE_PLDEBUGGER.remark_info_get",1), + DBE_COVERAGE_INFO_GET("DBE_PLDEBUGGER.coverage_info_get",1), + DBE_COVERAGE_INFO_DEL("DBE_PLDEBUGGER.coverage_info_del",2) + ; /** * opt of interface @@ -95,4 +156,12 @@ public class DebugConstants { paramReplace ); } + + /** + * get openGauss db version sql + * @return String query sql + */ + public static String getDbVersionSql() { + return "select version()"; + } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java index ea5d4e2d..9b3a2916 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022 Huawei Technologies Co.,Ltd. * * openGauss is licensed under Mulan PSL v2. @@ -6,7 +6,7 @@ * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 - * + * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. @@ -27,15 +27,23 @@ import org.opengauss.mppdbide.debuger.debug.DebugState; import org.opengauss.mppdbide.debuger.thread.DebugServerRunable; import org.opengauss.mppdbide.debuger.thread.DebugServerThreadProxy; import org.opengauss.mppdbide.debuger.thread.EventQueueThread; +import org.opengauss.mppdbide.debuger.vo.BreakPointListVo; import org.opengauss.mppdbide.debuger.vo.FunctionVo; import org.opengauss.mppdbide.debuger.vo.PositionVo; import org.opengauss.mppdbide.debuger.vo.SessionVo; import org.opengauss.mppdbide.debuger.vo.StackVo; import org.opengauss.mppdbide.debuger.vo.VariableVo; import org.opengauss.mppdbide.debuger.vo.VersionVo; +import org.opengauss.mppdbide.debuger.vo.dbe.AttachVo; +import org.opengauss.mppdbide.debuger.vo.dbe.TurnOnVo; import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.common.QueryResVoConvertHelper; +import org.opengauss.mppdbide.utils.ConstantRunLine; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; import org.postgresql.core.NoticeListener; +import org.opengauss.mppdbide.common.VersionHelper; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; import java.lang.Thread.State; import java.sql.PreparedStatement; @@ -45,7 +53,11 @@ import java.sql.SQLWarning; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; /** * Title: the DebugService class @@ -53,632 +65,812 @@ import java.util.Optional; * you can use by this step: * 1. create and DebugService by new DebugService() * 2. set DebugService.functionVo which come from QueryService.queryFunction - * by functionName + * by functionName * 3. set DebugService.clientConn and DebugService.serverConn, - * this is IConnection instance, your can create ConnectionAdapter objects + * this is IConnection instance, your can create ConnectionAdapter objects * 4. set DebugService.clinetConn and DebugService.serverConn's NoticeListener, - * which is DebugService instance self + * which is DebugService instance self * 5. call DebugService.prepareDebug * 6. call DebugService.startDebug and receive return value for close back server - * thread in end + * thread in end * 7. call DebugService.attachDebug * 8. then you can use stepOver/StepInto/continueExec to control debug process * 9. you can use getVariables and getStacks get variables and stacks info * 10. you can use getBreakPoints/setBreakpoint/dropBreakpoint function to manager - * breakpoints + * breakpoints * 11. when debug over, call DebugService.abortDebug, if forget this operation, - * threadleak will occur + * threadleak will occur * 12. call DebugService.debugOff, if forget this operation, openGauss Database - * will exit!! + * will exit!! * 13. call DebugService.closeConn * sample use you can see DebugTest.java * * @since 3.0.0 */ public class DebugService implements NoticeListener, EventHander, IDebugService { - private static final int DEFAULT_WAIT_LOCK_TIME = 2000; // ms - private IConnection serverConn; - private IConnection clientConn; - private FunctionVo functionVo; - private MsgChainHelper msgChainHelper; - private boolean isRollback = false; - private SessionVo sessionVo = new SessionVo(); - private final Object waitLock = new int[0]; - private DebugState serverState = new DebugState(); - private DebugState clientState = new DebugState(); - private EventQueueThread eventQueueThread = new EventQueueThread(); - private DebugServerThreadProxy serverThreadProxy = new DebugServerThreadProxy(); - - public DebugService() { - eventQueueThread.addHandler(this); - msgChainHelper = new MsgChainHelper(this); - } - - /** - * prepare to debug - * - * @return void - * @throws SQLException the exp - */ - public void prepareDebug() throws SQLException { - List inputsParams = Arrays.asList(functionVo.oid); - serverConn.getDebugOptPrepareStatement( - DebugConstants.DebugOpt.START_SESSION, - inputsParams).execute(); - } - - /** - * start to debug - * - * @param args input args to function - * @return DebugServerThreadProxy debug manager thread - */ - public DebugServerThreadProxy startDebug(List args) { - DebugServerRunable debugServerRunable = new DebugServerRunable( - this, - args, - eventQueueThread); - serverThreadProxy.setDebugServerRunable(debugServerRunable); - serverThreadProxy.start(); - return serverThreadProxy; - } - - /** - * get debug manager thread - * - * @return DebugServerThreadProxy debug manager thread - */ - public DebugServerThreadProxy getServerThreadProxy() { - return serverThreadProxy; - } - - /** - * when server backthread started, this will callback - * - * @param args input args to function - * @return Optional the function result - * @throws SQLException the exp - */ - public Optional serverDebugCallBack(List args) throws SQLException { - try { - serverCallBackBegin(); - String sql = DebugConstants.getSql(functionVo.proname, args.size()); - try (PreparedStatement ps = serverConn.getStatement(sql)) { - for (int i = 1 ; i < args.size() + 1; i ++) { - ps.setObject(i, args.get(i - 1)); - } - try (ResultSet rs = ps.executeQuery()) { - if (rs.next()) { - return Optional.ofNullable(rs.getObject(1)); - } - return Optional.empty(); - } - } - } finally { - serverCallBackEnd(); - } - } - - /** - * client attach debug - * - * @return void - * @throws SQLException the exp - */ - public void attachDebug() throws SQLException { - waitServerStart(); - List inputParams = Arrays.asList(sessionVo.serverPort); - try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement( - DebugConstants.DebugOpt.ATTACH_SESSION, inputParams)) { - try (ResultSet rs = ps.executeQuery()) { - if (rs.next()) { - clientState.attached(); - sessionVo.clientPort = rs.getInt(1); - return; - } - } - } - throw new SQLException("client attach failed, please check"); - } - - private void waitServerStart() throws SQLException { - synchronized (waitLock) { - try { - waitLock.wait(DEFAULT_WAIT_LOCK_TIME); - } catch (InterruptedException intExp) { - MPPDBIDELoggerUtility.debug("wait has error!!!! err=" + intExp.toString()); - Thread.currentThread().interrupt(); - } - } - - if (!serverState.isRunning()) { - throw new SQLException("server not running, please check!"); - } - } - - /** - * server set debug session off - * - * @return void - * @throws SQLException the exp - */ - public void debugOff() throws SQLException { - serverConn.getDebugOptPrepareStatement( - DebugConstants.DebugOpt.DEBUG_OFF, - new ArrayList(1)).execute(); - } - - /** - * client abort debug - * - * @return Optional true if success - * @throws SQLException the exp - */ - public Optional abortDebug() throws SQLException { - if (clientState.isStopped()) { - return Optional.empty(); - } - List inputParams = Arrays.asList(sessionVo.clientPort); - try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement( - DebugConstants.DebugOpt.ABORT_TARGET, inputParams)) { - clientState.stop(); - clientState.stateLocked(); - try (ResultSet rs = ps.executeQuery()) { - Boolean result = false; - if (rs.next()) { - result = rs.getBoolean(1); - } - return Optional.of(result); - } - } - } - - /** - * step over run - * - * @return Optional the breakpoint line position - * @throws SQLException the exp - * @throws DebugExitException the debug exit exp - */ - @Override - public Optional stepOver() throws SQLException, DebugExitException { - return getPositionVo(DebugConstants.DebugOpt.STEP_OVER); - } - - /** - * step into run - * - * @return Optional the breakpoint line position - * @throws SQLException the exp - * @throws DebugExitException the debug exit exp - */ - @Override - public Optional stepInto() throws SQLException, DebugExitException { - return getPositionVo(DebugConstants.DebugOpt.STEP_INTO); - } - - /** - * step out run - * - * @return Optional the breakpoint line position - * @throws SQLException the exp - * @throws DebugExitException the debug exit exp - */ - @Override - public Optional stepOut() throws SQLException, DebugExitException { - return getPositionVo(DebugOpt.STEP_OUT); - } - - /** - * continue exec run - * - * @return Optional the breakpoint line position - * @throws SQLException the exp - * @throws DebugExitException the debug exit exp - */ - @Override - public Optional continueExec() throws SQLException, DebugExitException { - return getPositionVo(DebugConstants.DebugOpt.CONTINUE_EXEC); - } - - /** - * step run common command - * - * @param debugOpt which opteration to exec - * @return Optional the breakpoint line position - * @throws SQLException the exp - * @throws DebugExitException the debug exit exp - */ - @Override - public Optional getPositionVo( - DebugConstants.DebugOpt debugOpt - ) throws SQLException, DebugExitException { - clientState.running(); - if (debugOpt == DebugOpt.STEP_OUT) { - throw new SQLException("not support method!"); - } - List inputParams = Arrays.asList(sessionVo.clientPort); - try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement( - debugOpt, inputParams)) { - try (ResultSet rs = ps.executeQuery()) { - // this order is very important, because when debug opt is return, - // maybe server is already over, so must stop debug! - if (!serverState.isRunning()) { - throw new DebugExitException(); - } - PositionVo positionVo = null; - if (rs.next()) { - positionVo = ParseVo.parse(rs, PositionVo.class); - } - return Optional.ofNullable(positionVo); - } - } - } - - /** - * get cur variables - * - * @return List all variables - * @throws SQLException the exp - */ - @Override - public List getVariables() throws SQLException { - return getListVos(DebugConstants.DebugOpt.GET_VARIABLES, VariableVo.class); - } - - /** - * get cur stacks - * - * @return List all stacks - * @throws SQLException the exp - */ - @Override - public List getStacks() throws SQLException { - return getListVos(DebugConstants.DebugOpt.GET_STACKS, StackVo.class); - } - - /** - * get cur breakpoints - * - * @return List all breakpoints - * @throws SQLException the exp - */ - @Override - public List getBreakPoints() throws SQLException { - return getListVos(DebugConstants.DebugOpt.GET_BREAKPOINTS, PositionVo.class); - } - - private List getListVos(DebugConstants.DebugOpt debugOpt, Class clazz) throws SQLException { - List inputParams = Arrays.asList(sessionVo.clientPort); - try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement( - debugOpt, inputParams)) { - try (ResultSet rs = ps.executeQuery()) { - List results = ParseVo.parseList(rs, clazz); - return results; - } - } - } - - /** - * set breakpoint - * - * @param positionVo which line will set breakpoint - * @return boolean true if success - * @throws SQLException the exp - */ - @Override - public boolean setBreakPoint(PositionVo positionVo) throws SQLException { - return disposeBreakpoint(DebugConstants.DebugOpt.SET_BREAKPOINT, positionVo); - } - - /** - * delete breakpoint - * - * @param positionVo which line will set breakpoint - * @return boolean true if success - * @throws SQLException the exp - */ - @Override - public boolean dropBreakPoint(PositionVo positionVo) throws SQLException { - return disposeBreakpoint(DebugConstants.DebugOpt.DROP_BREAKPOINT, positionVo); - } - - /** - * set/delete breakpoint - * - * @param debugOpt which opteration to exec - * @param positionVo which line will set breakpoint - * @return boolean true if success - * @throws SQLException the exp - */ - public boolean disposeBreakpoint(DebugConstants.DebugOpt debugOpt, - PositionVo positionVo) throws SQLException { - if (positionVo.func == null || positionVo.func.intValue() == 0) { - positionVo.func = functionVo.oid; - } - - List inputParams = Arrays.asList( - sessionVo.clientPort, - positionVo.func, - positionVo.linenumber - ); - try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement( - debugOpt, inputParams)) { - try (ResultSet rs = ps.executeQuery()) { - boolean result = false; - if (rs.next()) { - result = rs.getBoolean(1); - } - return result; - } - } - } - - /** - * set server connection - * - * @param serverConn connection to set of server - * @return void - */ - public void setServerConn(IConnection serverConn) { - this.serverConn = serverConn; - this.serverConn.setNoticeListener(this); - } - - /** - * set client connection - * - * @param clientConn connection - * @return void - */ - public void setClientConn(IConnection clientConn) { - this.clientConn = clientConn; - this.clientConn.setNoticeListener(this); - } - - /** - * close all connection - * - * @return void - */ - @Override - public void closeService() { - eventQueueThread.stopThread(); - try { - if (clientConn != null) { - clientConn.close(); - clientConn = null; - } - } catch (SQLException sqlErr) { - MPPDBIDELoggerUtility.warn("clientConn close failed!err=" + sqlErr.toString()); - } - - try { - if (serverConn != null) { - serverConn.close(); - serverConn = null; - } - } catch (SQLException sqlErr) { - MPPDBIDELoggerUtility.warn("serverConn close failed, err=" + sqlErr.toString()); - } - } - - /** - * dispose sql warning of notice - * - * @param notice the notice - * @return void - */ - @Override - public void noticeReceived(SQLWarning notice) { - if (notice == null || notice.getMessage() == null) { - return; - } - String msgString = notice.getMessage(); - MPPDBIDELoggerUtility.debug("sql message:" + msgString); - msgChainHelper.handleSqlMsg(new Event(EventMessage.ON_SQL_MSG, msgString)); - } - - /** - * handle event - * - * @param event event to handle - * @return void - */ - @Override - public void handleEvent(Event event) { - msgChainHelper.handleEventMsg(event); - } - - /** - * update server port - * - * @param serverPort the port to set - * @return void - */ - public void updateServerPort(int serverPort) { - sessionVo.serverPort = serverPort; - serverState.running(); - synchronized (waitLock) { - waitLock.notifyAll(); - } - } - - /** - * update server state with exception - * - * @return void - */ - public void updateServerWithException() { - serverState.terminaled(); - } - - /** - * update server state with normal exit - * - * @param result the execute result - * @return void - */ - public void updateServerWithResult(Object result) { - serverState.stop(); - serverState.stateLocked(); - sessionVo.result = result; - serverThreadProxy.start(); - } - - @Override - public Optional version() throws SQLException { - try (PreparedStatement ps = serverConn.getDebugOptPrepareStatement( - DebugConstants.DebugOpt.DEBUG_VERSION, new ArrayList<>(1))) { - try (ResultSet rs = ps.executeQuery()) { - if (rs.next()) { - return Optional.ofNullable(ParseVo.parse(rs, VersionVo.class)); - } - return Optional.empty(); - } - } - } - - /** - * begin debug - * - * @param args function input args - * @return void - * @throws SQLException sql exception - */ - @Override - public void begin(List args) throws SQLException { - init(); - prepareDebug(); - startDebug(args); - attachDebug(); - } - - /** - * end debug - * - * @return void - */ - @Override - public void end() { - try { - abortDebug(); - } catch (SQLException e) { - MPPDBIDELoggerUtility.debug("abortDebug with error:" + e.toString()); - } - serverThreadProxy.join(); - try { - debugOff(); - } catch (SQLException e) { - MPPDBIDELoggerUtility.debug("debugOff with error:" + e.toString()); - } - closeService(); - } - - /** - * get normal end result - * - * @return Optional the result - */ - @Override - public Optional getResult() { - if (isNormalEnd()) { - return Optional.ofNullable(sessionVo.result); - } - return Optional.empty(); - } - - /** - * is normal end - * - * @return true if normal end - */ - @Override - public boolean isNormalEnd() { - return serverState.isNormalStopped(); - } - - /** - * is debug server still running - * - * @return true if running - */ - @Override - public boolean isRunning() { - return getServerDebugState().isRunning(); - } - - /** - * set function vo - * - * @param functionVo function vo - * @return void - */ - public void setFunctionVo(FunctionVo functionVo) { - this.functionVo = functionVo; - } - - /** - * get server state - * - * @return DebugState state of server - */ - public DebugState getServerDebugState() { - return serverState; - } - - /** - * get server state - * - * @return DebugState state of client - */ - public DebugState getClientDebugState() { - return clientState; - } - - /** - * add server debug exit listener - * - * @param handler event handler of exit - * @return void - */ - @Override - public void addServerExistListener(EventHander handler) { - eventQueueThread.addHandler(handler); - } - - @Override - public void init() { - if (eventQueueThread.getState() == State.NEW) { - eventQueueThread.start(); - } - } - - @Override - public boolean isRollback() { - return isRollback; - } - - @Override - public void setRollback(boolean isRollback) { - this.isRollback = isRollback; - } - - private void serverCallBackBegin() throws SQLException { - serverExecuteInner("begin;"); - } - - private void serverCallBackEnd() throws SQLException { - if (isRollback()) { - serverExecuteInner("rollback;"); - } else { - serverExecuteInner("commit;"); - } - } - - private void serverExecuteInner(String sql) throws SQLException { - try (PreparedStatement ps = serverConn.getStatement(sql)) { - ps.execute(); - } - } + private static final int DEFAULT_WAIT_LOCK_TIME = 2000; // ms + private IConnection serverConn; + private IConnection clientConn; + private FunctionVo functionVo; + private MsgChainHelper msgChainHelper; + private boolean isRollback = false; + private SessionVo sessionVo = new SessionVo(); + private TurnOnVo turnOnVo=null; + private final Object waitLock = new int[0]; + private DebugState serverState = new DebugState(); + private DebugState clientState = new DebugState(); + private EventQueueThread eventQueueThread = new EventQueueThread(); + private DebugServerThreadProxy serverThreadProxy = new DebugServerThreadProxy(); + public static final Map> map = new ConcurrentHashMap<>(); + public DebuggerReportService reportService = DebuggerReportService.getInstance(); + + public DebugService() { + eventQueueThread.addHandler(this); + msgChainHelper = new MsgChainHelper(this); + } + + /** + * prepare to debug + * + * @return void + * @throws SQLException the exp + */ + public void prepareDebug() throws SQLException { + List inputsParams = Arrays.asList(functionVo.oid); + DebugOpt opt=VersionHelper.getDebugOptByDebuggerVersion(clientConn,DebugConstants.DebugOpt.START_SESSION); + ResultSet rs=serverConn.getDebugOptPrepareStatement(opt,inputsParams).executeQuery(); + if(rs.next()) { + if (!getVersion()) { + turnOnVo=ParseVo.parse(rs, TurnOnVo.class); + SQLWarning sql=new SQLWarning("Pldebugger is started successfully, you are SERVER now."); + noticeReceived(sql); + } + + } + } + + /** + * start to debug + * + * @param args input args to function + * @return DebugServerThreadProxy debug manager thread + */ + public DebugServerThreadProxy startDebug(List args) { + DebugServerRunable debugServerRunable = new DebugServerRunable( + this, + args, + eventQueueThread); + serverThreadProxy.setDebugServerRunable(debugServerRunable); + serverThreadProxy.start(); + return serverThreadProxy; + } + + /** + * get debug manager thread + * + * @return DebugServerThreadProxy debug manager thread + */ + public DebugServerThreadProxy getServerThreadProxy() { + return serverThreadProxy; + } + + /** + * when server backthread started, this will callback + * + * @param args input args to function + * @return Optional the function result + * @throws SQLException the exp + */ + public Optional serverDebugCallBack(List args) throws SQLException { + try { + serverCallBackBegin(); + String sql = DebugConstants.getSql(functionVo.proname, args.size()); + try (PreparedStatement ps = serverConn.getStatement(sql)) { + for (int i = 1 ; i < args.size() + 1; i ++) { + ps.setObject(i, args.get(i - 1)); + } + if (!getVersion()) { + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + public void run() { + SQLWarning sqlWarning=new SQLWarning("YOUR PROXY PORT ID IS:"+turnOnVo.port); + noticeReceived(sqlWarning); + } + }, 2000); + } + + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return Optional.ofNullable(rs.getObject(1)); + } + return Optional.empty(); + } + } + } finally { + serverCallBackEnd(); + } + } + + /** + * client attach debug + * + * @return void + * @throws SQLException the exp + */ + public void attachDebug() throws SQLException { + if (!getVersion()) { + try { + Thread.sleep(DEFAULT_WAIT_LOCK_TIME); + } catch (InterruptedException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + waitServerStart(); + List inputParams = Arrays.asList(sessionVo.serverPort); + DebugOpt opt=VersionHelper.getDebugOptByDebuggerVersion(clientConn,DebugConstants.DebugOpt.ATTACH_SESSION); + + if (!getVersion()) { + inputParams=Arrays.asList(turnOnVo.nodename,sessionVo.serverPort); + } + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement(opt, inputParams)) { + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + clientState.attached(); + if (getVersion()) { + sessionVo.clientPort = rs.getInt(1); + }else { + AttachVo attachVo=ParseVo.parse(rs, AttachVo.class); + sessionVo.clientPort=attachVo.lineno; + } + + return; + } + }catch(Exception e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + throw new SQLException("client attach failed, please check"); + } + + private void waitServerStart() throws SQLException { + synchronized (waitLock) { + try { + waitLock.wait(DEFAULT_WAIT_LOCK_TIME); + } catch (InterruptedException intExp) { + MPPDBIDELoggerUtility.debug("wait has error!!!! err=" + intExp.toString()); + Thread.currentThread().interrupt(); + } + } + + if (!serverState.isRunning()) { + throw new SQLException("server not running, please check!"); + } + } + + /** + * server set debug session off + * + * @return void + * @throws SQLException the exp + */ + public void debugOff() throws SQLException { + List inputParams = new ArrayList(1); + DebugOpt opt=DebugConstants.DebugOpt.DEBUG_OFF; + if (!getVersion()) { + inputParams = Arrays.asList(functionVo.oid); + opt = DebugConstants.DebugOpt.DBE_DEBUG_OFF; + clientConn.getDebugOptPrepareStatement(opt,inputParams).execute(); + } else if (null != serverConn){ + serverConn.getDebugOptPrepareStatement(opt,inputParams).execute(); + } + } + + /** + * client abort debug + * + * @return Optional true if success + * @throws SQLException the exp + */ + public Optional abortDebug() throws SQLException { + if (clientState.isStopped()) { + return Optional.empty(); + } + List inputParams = Arrays.asList(sessionVo.clientPort); + DebugConstants.DebugOpt opt=VersionHelper.getDebugOptByDebuggerVersion(clientConn,DebugConstants.DebugOpt.ABORT_TARGET); + if (!getVersion()) { + inputParams=new ArrayList(); + } + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement(opt, inputParams)) { + clientState.stop(); + clientState.stateLocked(); + try (ResultSet rs = ps.executeQuery()) { + Boolean result = false; + if (rs.next()) { + result = rs.getBoolean(1); + } + return Optional.of(result); + }catch(SQLException e) { + return Optional.of(true); + } + } + } + + /** + * step over run + * + * @return Optional the breakpoint line position + * @throws SQLException the exp + * @throws DebugExitException the debug exit exp + */ + @Override + public Optional stepOver() throws SQLException, DebugExitException { + return getPositionVo(DebugConstants.DebugOpt.STEP_OVER); + } + + /** + * step into run + * + * @return Optional the breakpoint line position + * @throws SQLException the exp + * @throws DebugExitException the debug exit exp + */ + @Override + public Optional stepInto() throws SQLException, DebugExitException { + return getPositionVo(DebugConstants.DebugOpt.STEP_INTO); + } + + /** + * step out run + * + * @return Optional the breakpoint line position + * @throws SQLException the exp + * @throws DebugExitException the debug exit exp + */ + @Override + public Optional stepOut() throws SQLException, DebugExitException { + return getPositionVo(DebugOpt.STEP_OUT); + } + + /** + * continue exec run + * + * @return Optional the breakpoint line position + * @throws SQLException the exp + * @throws DebugExitException the debug exit exp + */ + @Override + public Optional continueExec() throws SQLException, DebugExitException { + return getPositionVo(DebugConstants.DebugOpt.CONTINUE_EXEC); + } + + /** + * step run common command + * + * @param debugOpt which opteration to exec + * @return Optional the breakpoint line position + * @throws SQLException the exp + * @throws DebugExitException the debug exit exp + */ + @Override + public Optional getPositionVo( + DebugConstants.DebugOpt debugOpt + ) throws SQLException, DebugExitException { + clientState.running(); + if (debugOpt == DebugOpt.STEP_OUT) { + throw new SQLException("not support method!"); + } + List inputParams = Arrays.asList(sessionVo.clientPort); + DebugOpt opt=VersionHelper.getDebugOptByDebuggerVersion(clientConn,debugOpt); + if (!getVersion()) { + inputParams=new ArrayList(); + } + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement(opt, inputParams)) { + try (ResultSet rs = ps.executeQuery()) { + // this order is very important, because when debug opt is return, + // maybe server is already over, so must stop debug! + if (!serverState.isRunning()) { + throw new DebugExitException(); + } + PositionVo positionVo = null; + if (rs.next()) { + if (getVersion()) { + positionVo = ParseVo.parse(rs, PositionVo.class); + }else { + AttachVo vo = new AttachVo(); + vo = ParseVo.parse(rs, AttachVo.class); + positionVo = new PositionVo(vo.funcoid,vo.lineno,vo.funcname); + } + } + return Optional.ofNullable(positionVo); + }catch(SQLException e) { + return Optional.empty(); + } + } + } + + /** + * get cur variables + * + * @return List all variables + * @throws SQLException the exp + */ + @Override + public List getVariables() throws SQLException { + return getAllVariable(DebugConstants.DebugOpt.GET_VARIABLES, VariableVo.class); + } + + private List getAllVariable(DebugConstants.DebugOpt debugOpt, Class clazz) throws SQLException { + if (!getVersion()) { + List vos = new ArrayList(); + map.get(functionVo.oid).forEach(item -> { + DebugOpt opt; + try { + opt = DebugConstants.DebugOpt.DBE_GET_VARIABLES; + List inputParams = Arrays.asList(item); + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement(opt, inputParams)) { + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + vos.addAll(QueryResVoConvertHelper.parseList(rs,clazz,clientConn)); + } + }catch(SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + } catch (SQLException e1) { + e1.printStackTrace(); + } + }); + return vos; + } else { + return getListVos(debugOpt, clazz); + } + } + + /** + * get cur stacks + * + * @return List all stacks + * @throws SQLException the exp + */ + @Override + public List getStacks() throws SQLException { + if (getVersion()) { + return getListVos(DebugConstants.DebugOpt.GET_STACKS, StackVo.class); + } else { + return getListVos_v3(DebugConstants.DebugOpt.GET_STACKS, StackVo.class, new ArrayList<>()); + } + } + + /** + * get cur breakpoints + * + * @return List all breakpoints + * @throws SQLException the exp + */ + @Override + public List getBreakPoints() throws SQLException { + if (getVersion()) { + return getListVos(DebugConstants.DebugOpt.GET_BREAKPOINTS, PositionVo.class); + } else { + List list = getListVos_v3(DebugConstants.DebugOpt.DBE_GET_BREAKPOINTS, BreakPointListVo.class, new ArrayList<>()); + List vos = new ArrayList<>(); + list.forEach(item -> { + PositionVo vo = new PositionVo(); + vo.breakpointno = item.breakpointno; + vo.enable = item.enable; + vo.func = item.funcoid; + vo.linenumber = item.lineno; + vo.targetname = item.query; + vos.add(vo); + }); + return vos; + } + } + + private List getListVos_v3(DebugConstants.DebugOpt debugOpt, Class clazz, List inputParams) throws SQLException { + DebugOpt opt=VersionHelper.getDebugOptByDebuggerVersion(clientConn,debugOpt); + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement(opt, inputParams)) { + try (ResultSet rs = ps.executeQuery()) { + List results = QueryResVoConvertHelper.parseList(rs,clazz,clientConn); + return results; + }catch(SQLException e) { + return new ArrayList(); + } + } + } + + private List getListVos(DebugConstants.DebugOpt debugOpt, Class clazz) throws SQLException { + List inputParams = Arrays.asList(sessionVo.clientPort); + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement( + debugOpt, inputParams)) { + try (ResultSet rs = ps.executeQuery()) { + List results = ParseVo.parseList(rs, clazz); + return results; + } + } + } + + /** + * set breakpoint + * + * @param positionVo which line will set breakpoint + * @return boolean true if success + * @throws SQLException the exp + */ + @Override + public boolean setBreakPoint(PositionVo positionVo) throws SQLException { + if (getVersion()) { + return disposeBreakpoint(DebugConstants.DebugOpt.SET_BREAKPOINT, positionVo,false); + }else { + return disposeBreakpoint(DebugConstants.DebugOpt.DBE_SET_BREAKPOINT, positionVo,false); + } + } + + /** + * delete breakpoint + * + * @param positionVo which line will set breakpoint + * @return boolean true if success + * @throws SQLException the exp + */ + @Override + public boolean dropBreakPoint(PositionVo positionVo) throws SQLException { + if (getVersion()) { + return disposeBreakpoint(DebugConstants.DebugOpt.DROP_BREAKPOINT, positionVo, true); + }else { + return disposeBreakpoint(DebugConstants.DebugOpt.DBE_DROP_BREAKPOINT, positionVo, true); + } + } + + /** + * set/delete breakpoint + * + * @param debugOpt which opteration to exec + * @param positionVo which line will set breakpoint + * @return boolean true if success + * @throws SQLException the exp + */ + public boolean disposeBreakpoint(DebugConstants.DebugOpt debugOpt,PositionVo positionVo, Boolean isDelete) throws SQLException { + if (positionVo.func == null || positionVo.func.intValue() == 0) { + positionVo.func = functionVo.oid; + } + List inputParams; + if (getVersion()) { + inputParams = Arrays.asList(sessionVo.clientPort,positionVo.func,positionVo.linenumber); + } else { + if (isDelete) { + List res = getBreakPoints(); + Optional vo = res.stream().filter(item -> item.linenumber.equals(positionVo.linenumber)).findFirst(); + inputParams = new ArrayList<>(); + if (vo.isPresent()) { + inputParams = Arrays.asList(vo.get().getBreakpointno()); + } + }else { + inputParams = Arrays.asList(positionVo.func,positionVo.linenumber); + } + } + try (PreparedStatement ps = clientConn.getDebugOptPrepareStatement(debugOpt, inputParams)) { + try (ResultSet rs = ps.executeQuery()) { + boolean result = false; + if (rs.next() && getVersion()) { + result = rs.getBoolean(1); + } + return result; + } + } + } + + /** + * set server connection + * + * @param serverConn connection to set of server + * @return void + */ + public void setServerConn(IConnection serverConn) { + this.serverConn = serverConn; + this.serverConn.setNoticeListener(this); + } + + /** + * set client connection + * + * @param clientConn connection + * @return void + */ + public void setClientConn(IConnection clientConn) { + this.clientConn = clientConn; + this.clientConn.setNoticeListener(this); + } + + /** + * close all connection + * + * @return void + */ + @Override + public void closeService() { + eventQueueThread.stopThread(); + try { + if (clientConn != null) { + clientConn.close(); + clientConn = null; + } + } catch (SQLException sqlErr) { + MPPDBIDELoggerUtility.warn("clientConn close failed!err=" + sqlErr.toString()); + } + + try { + if (serverConn != null) { + serverConn.close(); + serverConn = null; + } + } catch (SQLException sqlErr) { + MPPDBIDELoggerUtility.warn("serverConn close failed, err=" + sqlErr.toString()); + } + if (null != reportService) { + try { + if (null != reportService.serverConn) { + reportService.serverConn.close(); + reportService.serverConn=null; + } + } catch (SQLException sqlErr) { + MPPDBIDELoggerUtility.warn("reportService serverConn close failed, err=" + sqlErr.toString()); + } + try { + if (null != reportService.clientConn) { + reportService.clientConn.close(); + reportService.clientConn=null; + } + } catch (SQLException sqlErr) { + MPPDBIDELoggerUtility.warn("reportService clientConn close failed, err=" + sqlErr.toString()); + } + } + } + + /** + * dispose sql warning of notice + * + * @param notice the notice + * @return void + */ + @Override + public void noticeReceived(SQLWarning notice) { + if (notice == null || notice.getMessage() == null) { + return; + } + String msgString = notice.getMessage(); + MPPDBIDELoggerUtility.debug("sql message:" + msgString); + msgChainHelper.handleSqlMsg(new Event(EventMessage.ON_SQL_MSG, msgString)); + } + + /** + * handle event + * + * @param event event to handle + * @return void + */ + @Override + public void handleEvent(Event event) { + msgChainHelper.handleEventMsg(event); + } + + /** + * update server port + * + * @param serverPort the port to set + * @return void + */ + public void updateServerPort(int serverPort) { + sessionVo.serverPort = serverPort; + serverState.running(); + synchronized (waitLock) { + waitLock.notifyAll(); + } + } + + /** + * update server state with exception + * + * @return void + */ + public void updateServerWithException() { + serverState.terminaled(); + } + + /** + * update server state with normal exit + * + * @param result the execute result + * @return void + */ + public void updateServerWithResult(Object result) { + serverState.stop(); + serverState.stateLocked(); + sessionVo.result = result; + serverThreadProxy.start(); + } + + @Override + public Optional version() throws SQLException { + try (PreparedStatement ps = serverConn.getDebugOptPrepareStatement( + DebugConstants.DebugOpt.DEBUG_VERSION, new ArrayList<>(1))) { + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return Optional.ofNullable(ParseVo.parse(rs, VersionVo.class)); + } + return Optional.empty(); + } + } + } + + /** + * begin debug + * + * @param args function input args + * @return void + * @throws SQLException sql exception + */ + @Override + public void begin(List args) throws SQLException { + ConstantRunLine.isContinue = null; + ConstantRunLine.isPldebugger = null; + ConstantRunLine.passLine.clear(); + ConstantRunLine.isTerminate = true; + DebuggerStartInfoVo startInfo=DebuggerStartConstants.getStartInfo(functionVo.oid); + startInfo.args=args; + startInfo.oid=functionVo.oid; + startInfo.ifMakeReport=true; + DebuggerStartConstants.setStartInfo(functionVo.oid, startInfo); + getVersion(); + init(); + prepareDebug(); + startDebug(args); + attachDebug(); + } + + public boolean getVersion() { + if (null == ConstantRunLine.isPldebugger) { + try { + ConstantRunLine.isPldebugger = VersionHelper.getDebuggerVersion(clientConn).isPldebugger(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + return ConstantRunLine.isPldebugger; + } + + /** + * end debug + * + * @return void + */ + @Override + public void end() { + try { + abortDebug(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error("abortDebug with error:" + e.toString()); + } + + serverThreadProxy.join(); + + try { + debugOff(); + Thread.sleep(500); + } catch(InterruptedException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } catch (SQLException e) { + MPPDBIDELoggerUtility.debug("debugOff with error:" + e.toString()); + } + closeService(); + } + + /** + * get normal end result + * + * @return Optional the result + */ + @Override + public Optional getResult() { + if (isNormalEnd()) { + return Optional.ofNullable(sessionVo.result); + } + return Optional.empty(); + } + + /** + * is normal end + * + * @return true if normal end + */ + @Override + public boolean isNormalEnd() { + return serverState.isNormalStopped(); + } + + /** + * is debug server still running + * + * @return true if running + */ + @Override + public boolean isRunning() { + return getServerDebugState().isRunning(); + } + + /** + * set function vo + * + * @param functionVo function vo + * @return void + */ + public void setFunctionVo(FunctionVo functionVo) { + this.functionVo = functionVo; + } + + /** + * get server state + * + * @return DebugState state of server + */ + public DebugState getServerDebugState() { + return serverState; + } + + /** + * get server state + * + * @return DebugState state of client + */ + public DebugState getClientDebugState() { + return clientState; + } + + /** + * add server debug exit listener + * + * @param handler event handler of exit + * @return void + */ + @Override + public void addServerExistListener(EventHander handler) { + eventQueueThread.addHandler(handler); + } + + @Override + public void init() { + if (eventQueueThread.getState() == State.NEW) { + eventQueueThread.start(); + } + } + + @Override + public boolean isRollback() { + return isRollback; + } + + @Override + public void setRollback(boolean isRollback) { + this.isRollback = isRollback; + } + + private void serverCallBackBegin() throws SQLException { + serverExecuteInner("begin;"); + } + + private void serverCallBackEnd() throws SQLException { + if (isRollback()) { + serverExecuteInner("rollback;"); + } else { + serverExecuteInner("commit;"); + } + } + + private void serverExecuteInner(String sql) throws SQLException { + if (null != serverConn) { + try (PreparedStatement ps = serverConn.getStatement(sql)) { + ps.execute(); + } + } + } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebuggerReportService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebuggerReportService.java new file mode 100644 index 00000000..79f98d77 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebuggerReportService.java @@ -0,0 +1,246 @@ +package org.opengauss.mppdbide.debuger.service; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.common.IConnectionProvider; +import org.opengauss.mppdbide.debuger.annotation.ParseVo; +import org.opengauss.mppdbide.debuger.debug.DebugConstants; +import org.opengauss.mppdbide.debuger.debug.DebugConstants.DebugOpt; +import org.opengauss.mppdbide.debuger.exception.DebugPositionNotFoundException; +import org.opengauss.mppdbide.debuger.service.SourceCodeService.CodeDescription; +import org.opengauss.mppdbide.debuger.vo.FunctionVo; +import org.opengauss.mppdbide.debuger.vo.dbe.AttachVo; +import org.opengauss.mppdbide.debuger.vo.dbe.TurnOnVo; +import org.opengauss.mppdbide.utils.ConstantRunLine; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; +import org.opengauss.mppdbide.utils.vo.DebuggerEndInfoVo; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; + +/** + * 覆盖率记录生成 + * + * @author gitam + */ +public class DebuggerReportService { + private static DebuggerReportService debuggerReportService = new DebuggerReportService(); + public IConnection serverConn; + public IConnection clientConn; + private FunctionVo functionVo; + private TurnOnVo turnOnVo; + private DebuggerStartInfoVo startInfo; + public static final int CODE_BASE_OFFSET = 1; + + private CodeDescription baseCodeDesc = null; + private CodeDescription totalCodeDesc = null; + + public static DebuggerReportService getInstance() { + return debuggerReportService; + } + + public void setBaseCode(CodeDescription baseCodeDesc) { + this.baseCodeDesc = baseCodeDesc; + } + + public void setTotalCode(CodeDescription totalCodeDesc) { + this.totalCodeDesc = totalCodeDesc; + } + + public DebuggerReportService() { + + } + + private String getCurLine(int breakPointLine) { + try { + return String.valueOf(codeLine2ShowLine(breakPointLine)); + } catch (DebugPositionNotFoundException dbgExp) { + MPPDBIDELoggerUtility.error("receive invalid position:" + dbgExp.toString()); + } + return "-1"; + } + + private String getCurLine() { + try { + return String.valueOf(getBeginDebugCodeLine()); + } catch (DebugPositionNotFoundException debugExp) { + MPPDBIDELoggerUtility.error("receive invalid position:" + debugExp.toString()); + } + return "-1"; + } + + public void setAttr(IConnectionProvider connectProvider, FunctionVo functionVo) { + try { + this.serverConn = connectProvider.getValidFreeConnection(); + this.clientConn = connectProvider.getValidFreeConnection(); + this.functionVo = functionVo; + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + + /** + * set server connection + * + * @param serverConn connection to set of server + * @return void + */ + public void setServerConn(IConnection serverConn) { + this.serverConn = serverConn; + } + + /** + * set client connection + * + * @param clientConn connection + * @return void + */ + public void setClientConn(IConnection clientConn) { + this.clientConn = clientConn; + } + + /** + * set function vo + * + * @param functionVo function vo + * @return void + */ + public void setFunctionVo(FunctionVo functionVo) { + this.functionVo = functionVo; + } + + /** + * make dbedebugger report info + */ + public void makeReport() { + startInfo = DebuggerStartConstants.getStartInfo(functionVo.oid); + if(!startInfo.ifMakeReport) { + return; + } + List inputsParams = Arrays.asList(functionVo.oid); + ResultSet rs = null; + try { + //DBE_DEBUG_OFF + DebugOpt opt = DebugConstants.DebugOpt.DBE_DEBUG_OFF; + rs = serverConn.getDebugOptPrepareStatement(opt, inputsParams).executeQuery(); + opt = DebugConstants.DebugOpt.DBE_START_SESSION; + rs = serverConn.getDebugOptPrepareStatement(opt, inputsParams).executeQuery(); + if (rs.next()) { + turnOnVo = ParseVo.parse(rs, TurnOnVo.class); + } + + // call proc + List args = startInfo.args; + String sql = DebugConstants.getSql(functionVo.proname, args.size()); + try (PreparedStatement ps = serverConn.getStatement(sql)) { + for (int i = 1; i < args.size() + 1; i++) { + ps.setObject(i, args.get(i - 1)); + } + CompletableFuture.delayedExecutor(100, TimeUnit.MILLISECONDS).execute(() -> { + doClient(); + }); + ps.executeQuery(); + } + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } finally { + try { + if (null !=rs) { + rs.close(); + } + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + } + + public void doClient() { + ConstantRunLine.runList.clear(); + List runLinks = new ArrayList(); + List historyList=DebuggerStartConstants.getHistoryList(functionVo.oid); + // attach + List inputsParams = new ArrayList(); + inputsParams.add(turnOnVo.nodename); + inputsParams.add(turnOnVo.port); + DebugOpt opt = DebugConstants.DebugOpt.DBE_ATTACH_SESSION; + try (ResultSet rs= clientConn.getDebugOptPrepareStatement(opt, inputsParams).executeQuery();){ + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + runLinks.add(getCurLine()); + //next + inputsParams = new ArrayList(); + opt = DebugConstants.DebugOpt.DBE_STEP_OVER; + Boolean hasNext = true; + while (hasNext) { + try (ResultSet rs = clientConn.getDebugOptPrepareStatement(opt, inputsParams).executeQuery()){ + if (rs.next()) { + AttachVo attachVo = ParseVo.parse(rs, AttachVo.class); + Integer lineNo=attachVo.lineno; + if (lineNo>1) { + runLinks.add(getCurLine(lineNo)); + } + } else { + hasNext = false; + } + } catch (SQLException e) { + hasNext = false; + } + } + ConstantRunLine.runList.addAll(runLinks); + DebuggerEndInfoVo endInfo = new DebuggerEndInfoVo(); + String runStr = runLinks.stream().map(String::valueOf).collect(Collectors.joining(",")); + endInfo.runStr = runStr; + endInfo.setInfo(startInfo); + historyList.add(endInfo); + DebuggerStartConstants.setHistoryList(functionVo.oid, historyList); + String createTableSql="CREATE TABLE IF NOT EXISTS his_coverage( oid BIGINT, cid BIGINT, coverageLines VARCHAR, remarkLines VARCHAR, endTime BIGINT,sourceCode VARCHAR);"; + try { + clientConn.getStatement(createTableSql).execute(); + String insertSql="insert into his_coverage VALUES(?,?,?,?,?,?);"; + PreparedStatement preparedStatement= clientConn.getStatement(insertSql); + preparedStatement.setObject(1, endInfo.oid); + preparedStatement.setObject(2, endInfo.cid); + preparedStatement.setObject(3, endInfo.runStr); + preparedStatement.setObject(4, endInfo.remarLinesStr); + preparedStatement.setObject(5, endInfo.endDateLong); + preparedStatement.setObject(6, endInfo.sourceCode); + preparedStatement.execute(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + + private int getBeginDebugCodeLine() throws DebugPositionNotFoundException { + return getFirstValidDebugPos() + getBeginTotalAndBaseDiff(); + } + + private int getFirstValidDebugPos() throws DebugPositionNotFoundException { + return getBeignOfBaseCode() + CODE_BASE_OFFSET; + } + + private int codeLine2ShowLine(int codeLine) throws DebugPositionNotFoundException { + return codeLine + getBeginTotalAndBaseDiff() - CODE_BASE_OFFSET; + } + + private int getBeginTotalAndBaseDiff() throws DebugPositionNotFoundException { + return getBeignfTotalCode() - getBeignOfBaseCode(); + } + + private int getBeignOfBaseCode() throws DebugPositionNotFoundException { + return this.baseCodeDesc.getBeginPosition(); + } + + private int getBeignfTotalCode() throws DebugPositionNotFoundException { + return this.totalCodeDesc.getBeginPosition(); + } + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/IDebugService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/IDebugService.java index 6ddb1c65..4cb3c42a 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/IDebugService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/IDebugService.java @@ -194,4 +194,7 @@ public interface IDebugService extends IService { * @return true if running */ boolean isRunning(); + + + } \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/QueryService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/QueryService.java index 810bbf6c..97dd7498 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/QueryService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/QueryService.java @@ -15,15 +15,6 @@ package org.opengauss.mppdbide.debuger.service; -import org.opengauss.mppdbide.debuger.dao.FunctionDao; -import org.opengauss.mppdbide.debuger.annotation.ParseVo; -import org.opengauss.mppdbide.debuger.debug.DebugConstants; -import org.opengauss.mppdbide.debuger.vo.FunctionVo; -import org.opengauss.mppdbide.debuger.vo.SourceCodeVo; -import org.opengauss.mppdbide.debuger.vo.TotalSourceCodeVo; -import org.opengauss.mppdbide.common.IConnection; -import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; - import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -31,6 +22,17 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.common.QueryResVoConvertHelper; +import org.opengauss.mppdbide.common.VersionHelper; +import org.opengauss.mppdbide.debuger.dao.FunctionDao; +import org.opengauss.mppdbide.debuger.debug.DebugConstants; +import org.opengauss.mppdbide.debuger.debug.DebugConstants.DebugOpt; +import org.opengauss.mppdbide.debuger.vo.FunctionVo; +import org.opengauss.mppdbide.debuger.vo.SourceCodeVo; +import org.opengauss.mppdbide.debuger.vo.TotalSourceCodeVo; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; + /** * Title: the QueryService class * @@ -66,9 +68,10 @@ public class QueryService implements IService { * @throws SQLException sql exp */ public Optional getSourceCode(Long oid) throws SQLException { - return getTempSourceCode(oid, - DebugConstants.DebugOpt.GET_SOURCE_CODE, - SourceCodeVo.class); + DebugOpt opt=VersionHelper.getDebugOptByDebuggerVersion(conn,DebugConstants.DebugOpt.GET_SOURCE_CODE); + Optional sourceCodeVo=getTempSourceCode(oid,opt,SourceCodeVo.class); + String sourceCode= sourceCodeVo.get().getSourceCode(); + return sourceCodeVo; } /** @@ -93,7 +96,7 @@ public class QueryService implements IService { debugOpt, inputParams)) { try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { - return Optional.of(ParseVo.parse(rs, clazz)); + return Optional.of(QueryResVoConvertHelper.parse(rs, clazz,conn)); } return Optional.empty(); } diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/ServiceFactory.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/ServiceFactory.java index f6f19ba1..2100564e 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/ServiceFactory.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/ServiceFactory.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022 Huawei Technologies Co.,Ltd. * * openGauss is licensed under Mulan PSL v2. @@ -6,7 +6,7 @@ * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 - * + * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. @@ -23,7 +23,6 @@ import org.opengauss.mppdbide.common.IConnection; import org.opengauss.mppdbide.common.IConnectionProvider; import org.opengauss.mppdbide.debuger.vo.VersionVo; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; - import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java index 717547e4..95624f7e 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java @@ -15,12 +15,16 @@ package org.opengauss.mppdbide.debuger.service; +import org.apache.commons.lang.StringUtils; import org.opengauss.mppdbide.debuger.exception.DebugPositionNotFoundException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Title: the SourceCodeService class @@ -223,8 +227,70 @@ public class SourceCodeService implements IService { * @return List the list of code */ public static List getLines(String srcCode) { - return Arrays.stream(srcCode.split("[\\n]")).collect(Collectors.toList()); + List s1 = Arrays.stream(srcCode.split("[\r]")).filter(item-> !item.isBlank()).collect(Collectors.toList()); + List s2 = Arrays.stream(srcCode.split("[\\n]")).filter(item-> !item.isBlank()).collect(Collectors.toList()); + List s3 = Arrays.stream(srcCode.split("[\r\\n]")).filter(item-> !item.isBlank()).collect(Collectors.toList()); + return Stream.of(s1,s2,s3).max((v1,v2)-> v1.size() -v2.size()).get().stream().map(item->item.trim()).filter(item-> StringUtils.isNotBlank(item)).collect(Collectors.toList()); } + + /** + * get code to run lines + * @param srcCode + * @return + */ + public static List getRunLines(String srcCode){ + List totalLines=getLines(srcCode); + Boolean isStart=false; + Boolean isEnd=false; + Boolean isBegin=false; + List runLines=new ArrayList(); + for(String line:totalLines) { + if(!isStart) { + isStart=line.toUpperCase(Locale.ENGLISH).contains("BEGIN"); + } + isEnd=line.toUpperCase(Locale.ENGLISH).contains("END;"); + if(isEnd) { + break; + } + if(isStart) { + isBegin=line.toUpperCase(Locale.ENGLISH).contains("BEGIN"); + if(!isBegin) { + runLines.add(line); + } + } + } + return runLines; + + } + + + public static List getRunLinesNums(String srcCode){ + List totalLines=getLines(srcCode); + Boolean isStart=false; + Boolean isEnd=false; + Boolean isBegin=false; + List runLines=new ArrayList(); + Integer count=0; + for(String line:totalLines) { + count++; + if(!isStart) { + isStart=line.toUpperCase(Locale.ENGLISH).contains("BEGIN"); + } + isEnd=line.toUpperCase(Locale.ENGLISH).contains("END;"); + if(isEnd) { + break; + } + if(isStart) { + isBegin=line.toUpperCase(Locale.ENGLISH).contains("BEGIN"); + if(!isBegin) { + runLines.add(count.toString()); + } + } + } + return runLines; + + } + private int getBeginFromCode(List lines) { for (int i = 0; i < lines.size(); i ++) { diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakPointListVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakPointListVo.java new file mode 100644 index 00000000..44b66f54 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakPointListVo.java @@ -0,0 +1,17 @@ +package org.opengauss.mppdbide.debuger.vo; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class BreakPointListVo { + + @DumpFiled + public int breakpointno; + @DumpFiled + public Long funcoid; + @DumpFiled + public int lineno; + @DumpFiled + public String query; + @DumpFiled + public Boolean enable; +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakpointList.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakpointList.java index 294a36e3..2b09cca2 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakpointList.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/BreakpointList.java @@ -36,6 +36,9 @@ public class BreakpointList { * @return Map the instance of BreakpointList */ public static Map getInstance() { + if(breakpointList==null) { + initialInstance(); + } return breakpointList; } diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/PositionVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/PositionVo.java index 7c2250fa..aabe8df6 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/PositionVo.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/PositionVo.java @@ -29,7 +29,10 @@ public class PositionVo { * the format of this vo */ public static final String FORMAT = "%8s %20s"; + + public Boolean enable; + public Integer breakpointno; /** * func of positionvo */ @@ -51,6 +54,10 @@ public class PositionVo { public PositionVo() { this(null, null, null); } + + public Integer getBreakpointno() { + return breakpointno; + } public PositionVo(Long func, Integer linenumber, String targetname) { this.func = func; diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/SourceCodeVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/SourceCodeVo.java index 967e572f..2d48c503 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/SourceCodeVo.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/SourceCodeVo.java @@ -15,7 +15,13 @@ package org.opengauss.mppdbide.debuger.vo; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.opengauss.mppdbide.debuger.annotation.DumpFiled; +import org.opengauss.mppdbide.debuger.vo.dbe.InfoCodeVo; /** * Title: the SourceCodeVo class @@ -28,7 +34,9 @@ public class SourceCodeVo { */ @DumpFiled public String pldbg_get_source; - + + private List codes; + /** * get source code * @@ -37,4 +45,19 @@ public class SourceCodeVo { public String getSourceCode() { return pldbg_get_source; } + + public void setSourceCode(String sourceCode) { + this.pldbg_get_source=sourceCode; + } + + public Map getCodes() { + if (null == codes) { + return Collections.emptyMap(); + } + return codes.stream().collect(Collectors.toMap(InfoCodeVo::getLineno, InfoCodeVo::getQuery)); + } + + public void setCodes(List codes) { + this.codes=codes; + } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java index aebe2185..66bb3831 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022 Huawei Technologies Co.,Ltd. * * openGauss is licensed under Mulan PSL v2. @@ -6,7 +6,7 @@ * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 - * + * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. @@ -16,6 +16,7 @@ package org.opengauss.mppdbide.debuger.vo; import org.opengauss.mppdbide.debuger.annotation.DumpFiled; +import org.opengauss.mppdbide.debuger.debug.DebugConstants; /** * Title: VersionVo for use @@ -27,23 +28,47 @@ public class VersionVo { * this is version str */ @DumpFiled + public String version; + + public String debuggerVersion; + + /** + * this is version str + */ public String serverversionstr; /** * this is version number */ - @DumpFiled public Integer serverversionnum; /** * this is proxy api version */ - @DumpFiled public Integer proxyapiver; /** * this is server process id */ - @DumpFiled public Long serverprocessid; + + public String getDebuggerVersion() { + String versionStr=this.version; + Integer start = versionStr.indexOf("openGauss")+9; + Integer end = versionStr.indexOf("build"); + versionStr = versionStr.substring(start, end); + versionStr=versionStr.replaceAll("\\.", "").trim(); + Integer version = Integer.valueOf(versionStr); + if (version < DebugConstants.DBE_DEBUGGER_MIN_VERSION) { + return DebugConstants.PL_DEBUGGER; + } else { + return DebugConstants.DBE_DEBUGGER; + } + } + + public boolean isPldebugger() { + this.debuggerVersion=getDebuggerVersion(); + return debuggerVersion.equalsIgnoreCase(DebugConstants.PL_DEBUGGER); + + } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/AttachVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/AttachVo.java new file mode 100644 index 00000000..d967763e --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/AttachVo.java @@ -0,0 +1,16 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class AttachVo { + + @DumpFiled + public long funcoid; + @DumpFiled + public String funcname; + @DumpFiled + public int lineno; + @DumpFiled + public String query; + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/BacktraceVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/BacktraceVo.java new file mode 100644 index 00000000..812740e2 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/BacktraceVo.java @@ -0,0 +1,37 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class BacktraceVo { + + @DumpFiled + public Integer frameno; + @DumpFiled + public String funcname; + @DumpFiled + public Integer lineno; + @DumpFiled + public String query; + @DumpFiled + public long funcoid; + + public Integer getFrameno() { + return frameno; + } + + public String getFuncname() { + return funcname; + } + + public Integer getLineno() { + return lineno; + } + + public String getQuery() { + return query; + } + + public long getFuncoid() { + return funcoid; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoBreakpointsVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoBreakpointsVo.java new file mode 100644 index 00000000..b10a1abe --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoBreakpointsVo.java @@ -0,0 +1,37 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class InfoBreakpointsVo { + + @DumpFiled + private Integer breakpointno; + @DumpFiled + private long funcoid; + @DumpFiled + private Integer lineno; + @DumpFiled + private String query; + @DumpFiled + private Boolean enable; + + public Integer getBreakpointno() { + return breakpointno; + } + + public long getFuncoid() { + return funcoid; + } + + public Integer getLineno() { + return lineno; + } + + public String getQuery() { + return query; + } + + public Boolean getEnable() { + return enable; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoCodeVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoCodeVo.java new file mode 100644 index 00000000..228c0068 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/InfoCodeVo.java @@ -0,0 +1,22 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class InfoCodeVo { + + @DumpFiled + public int lineno; + @DumpFiled + public String query; + @DumpFiled + public boolean canbreak; + + public Integer getLineno() { + return lineno; + } + + public String getQuery() { + return query; + } + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/ServerInfoVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/ServerInfoVo.java new file mode 100644 index 00000000..f3ffb9d2 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/ServerInfoVo.java @@ -0,0 +1,13 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class ServerInfoVo { + + @DumpFiled + String nodename; + @DumpFiled + Long port; + @DumpFiled + Long funcoid; +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/TurnOnVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/TurnOnVo.java new file mode 100644 index 00000000..f4f1c7e4 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/TurnOnVo.java @@ -0,0 +1,13 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class TurnOnVo { + + + @DumpFiled + public String nodename; + @DumpFiled + public int port; + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java new file mode 100644 index 00000000..91ae9a70 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java @@ -0,0 +1,111 @@ +package org.opengauss.mppdbide.debuger.vo.dbe; + +import java.util.Map; +import java.util.Map.Entry; + +import org.opengauss.mppdbide.adapter.gauss.Datatype; +import org.opengauss.mppdbide.adapter.gauss.GaussDatatypeUtils; +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; + +public class VariablesVo { + + @DumpFiled + public String varname; + @DumpFiled + public String vartype; + @DumpFiled + public String value; + @DumpFiled + public String package_name; + @DumpFiled + public Boolean isconst; + public Long dtype; + + + public Long getDtype() { + String type = null; + switch (this.vartype) { + case "bpchar": { + type ="char"; + break; + } + case "bool": { + type = "boolean"; + break; + } + case "float": { + type = "binary double"; + break; + } + case "int2": { + type = "smallint"; + break; + } + case "int4": { + type = "integer"; + break; + } + case "int8": { + type = "bigint"; + break; + } + case "float8": { + type = "double precision"; + break; + } + case "float4": { + type = "real"; + break; + } + case "timetz": { + type = "time with time zone"; + break; + } + case "timestamptz": { + type = "timestamp with time zone"; + break; + } + case "time": { + type = "time without time zone"; + break; + } + case "timestamp": { + type = "timestamp without time zone"; + break; + } + } + if (type == null) { + MPPDBIDELoggerUtility.error("not supported type!"); + return 0L; + } + Map map = GaussDatatypeUtils.getDataTypeHashMap(); + for (Entry entry : map.entrySet()) { + if (type.equalsIgnoreCase(entry.getValue().getTypename())) { + this.dtype = Long.valueOf(entry.getKey()); + break; + } + } + return dtype; + } + + public String getVarname() { + return varname; + } + + public String getVartype() { + return vartype; + } + + public String getValue() { + return value; + } + + public String getPackage_name() { + return package_name; + } + + public Boolean getIsconst() { + return isconst; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/META-INF/MANIFEST.MF b/code/datastudio/src/org.opengauss.mppdbide.utils/META-INF/MANIFEST.MF index 34b3e441..c5b38b94 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/META-INF/MANIFEST.MF +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/META-INF/MANIFEST.MF @@ -24,7 +24,8 @@ Export-Package: ., org.opengauss.mppdbide.utils.messaging, org.opengauss.mppdbide.utils.observer, org.opengauss.mppdbide.utils.security, - org.opengauss.mppdbide.utils.stringparse + org.opengauss.mppdbide.utils.stringparse, + org.opengauss.mppdbide.utils.vo Import-Package: net.sf.jsqlparser.schema Bundle-ClassPath: ., log4j-api-2.17.1.jar, diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/ConstantRunLine.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/ConstantRunLine.java new file mode 100644 index 00000000..84a763be --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/ConstantRunLine.java @@ -0,0 +1,19 @@ +package org.opengauss.mppdbide.utils; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CopyOnWriteArraySet; + +public class ConstantRunLine { + + public static volatile List runList = new CopyOnWriteArrayList<>(); + + public static volatile Set passLine = new CopyOnWriteArraySet(); + + public static volatile boolean isTerminate = true; + + public static volatile Boolean isContinue; + + public static volatile Boolean isPldebugger; +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/DebuggerStartConstants.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/DebuggerStartConstants.java new file mode 100644 index 00000000..b464749a --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/DebuggerStartConstants.java @@ -0,0 +1,44 @@ +package org.opengauss.mppdbide.utils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.opengauss.mppdbide.utils.vo.DebuggerEndInfoVo; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; + +public class DebuggerStartConstants { + + public static Map beginInfoMap = new HashMap(); + + public static Map> endInfoMap = new HashMap(); + + public static List getHistoryList(Long oid) { + List list = endInfoMap.get(oid); + if (list == null) { + list = new ArrayList(); + setHistoryList(oid, list); + } + return list; + } + + public static void setHistoryList(Long oid, List list) { + endInfoMap.put(oid, list); + } + + + public static DebuggerStartInfoVo getStartInfo(Long oid) { + DebuggerStartInfoVo info = beginInfoMap.get(oid); + if (info == null) { + info = new DebuggerStartInfoVo(); + setStartInfo(oid, info); + } + return info; + } + + public static void setStartInfo(Long oid, DebuggerStartInfoVo info) { + beginInfoMap.put(oid, info); + } + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstants.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstants.java index 9ed69f4b..f39b6cc7 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstants.java +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstants.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022 Huawei Technologies Co.,Ltd. * * openGauss is licensed under Mulan PSL v2. @@ -6,7 +6,7 @@ * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 - * + * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. @@ -1027,7 +1027,7 @@ public interface IMessagesConstants extends IMessagesConstantsOne { String YES_OPTION = "YES_OPTION"; String NO_OPTION = "NO_OPTION"; - + String SECURITY_WARNING_OPTION = "SECURITY_WARNING_OPTION"; String ENABLE_OPTION = "ENABLE_OPTION"; @@ -1948,7 +1948,7 @@ public interface IMessagesConstants extends IMessagesConstantsOne { String CODE_TEMPLATE_PREFPAGE_MESSAGE = "CODE_TEMPLATE_PREFPAGE_MESSAGE"; String CODE_TEMPLATE_PREFPAGE_TITLE = "CODE_TEMPLATE_PREFPAGE_TITLE"; - + String CODE_TEMPLATE_DUPLICATE_MSG = "CODE_TEMPLATE_DUPLICATE_MSG"; String CODE_TEMPLATE_PREFPAGE_EDIT = "CODE_TEMPLATE_PREFPAGE_EDIT"; @@ -2135,6 +2135,7 @@ public interface IMessagesConstants extends IMessagesConstantsOne { String PROPERTIES_COMPLEX_DATATYPE_ERROR_MSG = "PROPERTIES_COMPLEX_DATATYPE_ERROR_MSG"; String PREFERENCE_SHORTCUT_KEY_BINDING_TOGGLE_LINE_COMMENTS = "PREFERENCE_SHORTCUT_KEY_BINDING_TOGGLE_LINE_COMMENTS"; + String REMARK_SHORTCUT_KEY_BINDING_TOGGLE_LINE_COMMENTS="REMARK_SHORTCUT_KEY_BINDING_TOGGLE_LINE_COMMENTS"; String PREFERENCE_SHORTCUT_KEY_BINDING_TOGGLE_BLOCK_COMMENTS = "PREFERENCE_SHORTCUT_KEY_BINDING_TOGGLE_BLOCK_COMMENTS"; @@ -2921,6 +2922,8 @@ public interface IMessagesConstants extends IMessagesConstantsOne { String BREAKPOINT_ANNOTATION_LABEL = "BREAKPOINT_ANNOTATION_LABEL"; String DEBUG_POSITION_LABEL = "DEBUG_POSITION_LABEL"; + String DEBUG_POSITION_LABEL_PASS = "DEBUG_POSITION_LABEL_PASS"; + String DEBUG_POSITION_LABEL_FAIL = "DEBUG_POSITION_LABEL_FAIL"; String DEBUG_TABLE_ORDER = "DEBUG_TABLE_ORDER"; String DEBUG_STACK_INVOKING_LEVEL = "DEBUG_STACK_INVOKING_LEVEL"; @@ -3015,4 +3018,25 @@ public interface IMessagesConstants extends IMessagesConstantsOne { String CREATE_VIEW_UI_VIEW = "CREATE_VIEW_UI_VIEW"; String CREATE_VIEW_UI_MATERVIEW = "CREATE_VIEW_UI_MATERVIEW"; String CREATE_VIEW_UI_NAME_NOT_EMPTY = "CREATE_VIEW_UI_NAME_NOT_EMPTY"; + + String OID="OID"; + String TOTAL_LINE="TOTAL_LINE"; + String TOTAL_RUN_LINE_NUM="TOTAL_RUN_LINE_NUM"; + String TOTAL_Coverage="TOTAL_Coverage"; + String REMARK_LINE="REMARK_LINE"; + String REMARK_RUM_LIME_NUM="REMARK_RUM_LIME_NUM"; + String REMARK_Coverage="REMARK_Coverage"; + String DELETE_Coverage = "DELETE_Coverage"; + String DELETE_Coverage_All="DELETE_Coverage_All"; + String EXPORT_REPORT="EXPORT_REPORT"; + + String COVERAGE_HISTORY_TITLE = "COVERAGE_HISTORY_TITLE"; + String DELETE_COVERAGE_REPORT_TITLE = "DELETE_COVERAGE_REPORT_TITLE"; + String DELETE_SELECTED_COVERAGE_HISTORY_ALERT = "DELETE_SELECTED_COVERAGE_HISTORY_ALERT"; + String DELETE_ALL_COVERAGE_HISTORY_ALERT = "DELETE_ALL_COVERAGE_HISTORY_ALERT"; + String SURE_EXPORT_REPORT = "SURE_EXPORT_REPORT"; + String COVERAGE_REPORT_NOT_EXIST = "COVERAGE_REPORT_NOT_EXIST"; + String COVERAGE_REPORT_TO_SELECT = "COVERAGE_REPORT_TO_SELECT"; + String UPDATE_TIME = "UPDATE_TIME"; + } diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java index ff57dd80..3e024733 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java @@ -1099,4 +1099,7 @@ public interface IMessagesConstantsOne extends IMessagesConstantsTwo { String ERROR_WHILE_FETCHING_OWNER_NAME = "ERROR_WHILE_FETCHING_OWNER_NAME"; String ERR_WHILE_FETCHING_SEQ_VALUE = "ERR_WHILE_FETCHING_SEQ_VALUE"; + String COVERAGE_HINT = "COVERAGE_HINT"; + String EXPORT_PATH = "EXPORT_PATH"; + String COVERAGE_CHECK = "COVERAGE_CHECK"; } \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerEndInfoVo.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerEndInfoVo.java new file mode 100644 index 00000000..932f6cbc --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerEndInfoVo.java @@ -0,0 +1,36 @@ +package org.opengauss.mppdbide.utils.vo; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 存储过程结束后的执行信息 + * @author gitam + * + */ +public class DebuggerEndInfoVo extends DebuggerStartInfoVo{ + SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyyHHmmssSSS"); + public Long cid=System.currentTimeMillis(); //覆盖率id + public Long endDateLong=System.currentTimeMillis(); //结束时间 + public List runList; //跑到的行 + public String runStr; //跑到行的字符串 + + public List getRunList() { + if (runStr==null || "".equals(runStr)){ + return new ArrayList(); + }else { + remarkList =new ArrayList<>(Arrays.asList(runStr.split(","))); + } + return remarkList; + } + + public void setInfo(DebuggerStartInfoVo info) { + super.oid=info.oid; + super.sourceCode=info.sourceCode; + super.args=info.args; + super.remarLinesStr=info.remarLinesStr; + } + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerStartInfoVo.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerStartInfoVo.java new file mode 100644 index 00000000..36cf885e --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/vo/DebuggerStartInfoVo.java @@ -0,0 +1,29 @@ +package org.opengauss.mppdbide.utils.vo; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 存储过程启动时候的信息 + * @author gitam + * + */ +public class DebuggerStartInfoVo { + + public Long oid; //存储过程id + public String sourceCode; //源代码 + public List args; //启动参数 + public List remarkList; //标记的行 + public String remarLinesStr; //标记行的字符串 + public boolean ifMakeReport=true; //是否生成报告 + + public List getRemarkList() { + if (remarLinesStr==null || "".equals(remarLinesStr)){ + return new ArrayList(); + }else { + remarkList =new ArrayList<>(Arrays.asList(remarLinesStr.split(","))); + } + return remarkList; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/Application.e4xmi b/code/datastudio/src/org.opengauss.mppdbide.view/Application.e4xmi index 26da7d5e..0d93b595 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/Application.e4xmi +++ b/code/datastudio/src/org.opengauss.mppdbide.view/Application.e4xmi @@ -166,6 +166,7 @@ + @@ -314,6 +315,7 @@ + @@ -1020,6 +1022,7 @@ + diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/META-INF/MANIFEST.MF b/code/datastudio/src/org.opengauss.mppdbide.view/META-INF/MANIFEST.MF index b8eb0ac8..3770da56 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/META-INF/MANIFEST.MF +++ b/code/datastudio/src/org.opengauss.mppdbide.view/META-INF/MANIFEST.MF @@ -8,7 +8,9 @@ Bundle-ClassPath: ., guava-30.1.1-jre.jar Bundle-Activator: org.opengauss.mppdbide.view.Activator Bundle-Vendor: Huawei Technologies -Export-Package: org.opengauss.mppdbide.view.utils +Export-Package: org.opengauss.mppdbide.view.handler.debug, + org.opengauss.mppdbide.view.ui, + org.opengauss.mppdbide.view.utils Require-Bundle: org.eclipse.core.runtime;bundle-version="3.15.300", org.eclipse.swt;bundle-version="3.108.0", javax.inject;bundle-version="1.0.0", @@ -71,12 +73,20 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.15.300", openjfx.graphics.win32_64;bundle-version="17.0.2", openjfx.swing;bundle-version="17.0.2", openjfx.swt;bundle-version="17.0.2" -Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-RequiredExecutionEnvironment: JavaSE-11, + OSGi/Minimum-1.2 Bundle-ActivationPolicy: lazy Import-Package: com.google.common.collect;version="15.0.0", com.google.inject;version="1.3.0", com.google.inject.binder;version="1.3.0", com.google.inject.util;version="1.3.0", + javax.annotation;version="1.0.0";resolution:=optional, + javax.inject;version="1.0.0", + org.apache.commons.collections4.trie, + org.apache.commons.csv, + org.eclipse.ui.editors.text, + org.jsoup;version="1.14.3", + org.jsoup.nodes;version="1.14.3", org.opengauss.mppdbide.editor.extension.nameparser, org.opengauss.mppdbide.explainplan.ui.model, org.opengauss.mppdbide.parser.alias, @@ -93,9 +103,4 @@ Import-Package: com.google.common.collect;version="15.0.0", org.opengauss.mppdbide.presentation.resultsetif, org.opengauss.mppdbide.presentation.search, org.opengauss.mppdbide.presentation.visualexplainplan, - javax.annotation;version="1.0.0";resolution:=optional, - javax.inject;version="1.0.0", - org.apache.commons.collections4.trie, - org.apache.commons.csv, - org.eclipse.ui.editors.text, org.postgresql diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/icons/debug/breakpoint_indicate.png b/code/datastudio/src/org.opengauss.mppdbide.view/icons/debug/breakpoint_indicate.png index bf1501cf404360d9719e0a90cd2b3dd9c48efe46..e978dff6fdc6ebaf1a0e9670844de7ff5d4a3cee 100644 GIT binary patch literal 430 zcmV;f0a5;mP)Px$Xh}ptR5(wyld(&~P!Ptyduanj5$x_P=-5c9gBD^Jce@CJ;9yfy=q}jKB0@u3 z2Pe^`-9@N@PD(MwN&f*y2SJo#CGR9}5Ua5f#9Q9*-u>?T?%ff_gj-0h1=nV?-~Q;!E7_Q5h(irK!`Q7ex1Lt({tqew_%c5)8<#4-kn=qXhF($ zC?H7eY#Uh!WJe$p-Q1zqRf?kk;~E) z3^0+1_ZAPX24fX;ETbZT;J?3x1gg1)SBbRnrzQq-z`makgOH}RBIm#@rnX4Zdgvet zJ~iw8qyMp>c7bq0#5%Lkg*u^2ApTX2##kQNg)=)nrAvR0K+{nTRLco|)P=vZG Y1C%8C5w`K)kpKVy07*qoM6N<$f`S6SZ2$lO literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^fO>_%)r2R1cVuZ0f7Ul0?H>=2AExZuYc>mQx`aP zA9NR6BKqKC`^S&ZG;YkYc6cZ-{p6#?540xxN^9Inwhr!UPf(wn%cwE)P@&oryORH0 z4+>QXb#)+nK|4CnC@-(Px$B}qggzP^Mm6j8+Hgn|`B5D{8&Q9&1qB596-7tn?J zD4BHEcX5-EQ;bcjwh5i(T>hE)W(W%!Em)7*0?f9XW!cAY7>-=?S^~`W2+%%2J(1wF zmH@Lo0Q5o?$7yQ%`RbJ>U>@uNbVY>2Br)ejZgT~g2W^0EiLjp}=5iW3d0uov)c6z$ z&ZdLR@eY7HKszGgjf?w!v|O5?0Hz}njFX%($D05i0klO-l>424YNJ3*h>A$gSJ<_~Yz5qTrWIwUU-X#D4002ov JPDHLkV1mCbmM{PS literal 0 HcmV?d00001 diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/AnnotationHelper.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/AnnotationHelper.java index 41858e3f..a28cfebe 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/AnnotationHelper.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/AnnotationHelper.java @@ -16,7 +16,6 @@ package org.opengauss.mppdbide.view.core.sourceeditor; import org.eclipse.swt.graphics.RGB; - import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.loader.MessageConfigLoader; @@ -52,15 +51,23 @@ public class AnnotationHelper { * debug position annotation type label */ public static final String DEBUG_POSITION_TYPE_LABEL = IMessagesConstants.DEBUG_POSITION_LABEL; + + public static final String DEBUG_POSITION_TYPE_PASS = IMessagesConstants.DEBUG_POSITION_LABEL_PASS; + + public static final String DEBUG_POSITION_TYPE_FAIL = IMessagesConstants.DEBUG_POSITION_LABEL_FAIL; /** * debug position annotation strategy id */ public static final String DEBUG_POSITION_STRATEGY_ID = "PLSQL_DEBUGGER_DEBUG_POSITION"; + + public static final String DEBUG_POSITION_STRATEGY_PASS_ID = "PLSQL_DEBUGGER_DEBUG_POSITION_PASS"; + + public static final String DEBUG_POSITION_STRATEGY_FAIL_ID = "PLSQL_DEBUGGER_DEBUG_POSITION_FAIL"; /** * debug position annotation rgb */ public static final RGB DEBUG_POSITION_RGB = new RGB(255, 153, 51); - + /** * error annotation layer */ @@ -94,6 +101,15 @@ public class AnnotationHelper { * error position annotation rgb */ public static final RGB ERROR_POSITION_RGB = new RGB(255, 255, 0); + + public static final int DEBUG_POSITION_LAYER_PASS = 4; + + public static final RGB DEBUG_POSITION_PASS_RGB = new RGB(40, 255, 15); + + public static final int DEBUG_POSITION_LAYER_FAIL = 5; + + public static final RGB DEBUG_POSITION_FAIL_RGB = new RGB(255, 30, 25); + /** * Title: AnnotationType enum this enum assocate with AnnotationWithLineNumber's instance @@ -104,6 +120,10 @@ public class AnnotationHelper { BREAKPOINT_RGB), DEBUG_POSITION(DEBUG_POSITION_LAYER, DEBUG_POSITION_TYPE_LABEL, DEBUG_POSITION_STRATEGY_ID, DEBUG_POSITION_RGB), + DEBUG_POSITION_PASS(DEBUG_POSITION_LAYER_PASS, DEBUG_POSITION_TYPE_PASS, DEBUG_POSITION_STRATEGY_PASS_ID, + DEBUG_POSITION_PASS_RGB), + DEBUG_POSITION_FAIL(DEBUG_POSITION_LAYER_FAIL, DEBUG_POSITION_TYPE_FAIL, DEBUG_POSITION_STRATEGY_FAIL_ID, + DEBUG_POSITION_FAIL_RGB), ERROR(ERROR_LAYER, ERROR_TYPE_LABEL, ERROR_STRATEGY_ID, ERROR_RGB), ERROR_POSITION(ERROR_POSITION_LAYER, ERROR_POSITION_TYPE_LABEL, ERROR_POSITION_STRATEGY_ID, diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugFailPositionAnnotation.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugFailPositionAnnotation.java new file mode 100644 index 00000000..364f9817 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugFailPositionAnnotation.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2022 Huawei Technologies Co.,Ltd. + * + * openGauss is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.opengauss.mppdbide.view.core.sourceeditor; + +import java.util.Optional; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.RGB; +import org.opengauss.mppdbide.view.core.sourceeditor.AnnotationHelper.AnnotationType; +import org.opengauss.mppdbide.view.utils.icon.IiconPath; + +/** + * Title: class + * Description: The Class DebugFailPositionAnnotation. + * + * @since 3.0.0 + */ +public class DebugFailPositionAnnotation extends AnnotationWithLineNumber { + private static final AnnotationType ANNOTATION_TYPE_FAIL = AnnotationType.DEBUG_POSITION_FAIL; + private static final RGB DEBUGPOSITION_RGB = new RGB(255, 153, 51); + + /** + * Instantiates a new debug position annotation. + * + * @param line the line + */ + public DebugFailPositionAnnotation(int line) { + super(ANNOTATION_TYPE_FAIL.getStrategy(), false, "[Line : " + line, line); + } + + /** + * Gets the layer. + * + * @return the layer + */ + public static int getLayer() { + return ANNOTATION_TYPE_FAIL.getLayer(); + } + + /** + * Gets the image. + * + * @return the image + */ + public Optional getImage() { + return Optional.of( + loadImage(IiconPath.ICO_EXECUTE_Fail) + ); + } + + /** + * Gets the breakpoint rgb. + * + * @return the breakpoint rgb + */ + public static RGB getBreakpointRgb() { + return DEBUGPOSITION_RGB; + } + + /** + * Gets the strategyid. + * + * @return the strategyid + */ + public static String getStrategyid() { + return ANNOTATION_TYPE_FAIL.getStrategy(); + } + + /** + * Gets the typelabel. + * + * @return the typelabel + */ + public static String getTypelabel() { + return ANNOTATION_TYPE_FAIL.getTypeLabel(); + } + + @Override + public AnnotationType getAnnotationType() { + return ANNOTATION_TYPE_FAIL; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugPassPositionAnnotation.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugPassPositionAnnotation.java new file mode 100644 index 00000000..8841fa9a --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/DebugPassPositionAnnotation.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2022 Huawei Technologies Co.,Ltd. + * + * openGauss is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.opengauss.mppdbide.view.core.sourceeditor; + +import java.util.Optional; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.RGB; +import org.opengauss.mppdbide.view.core.sourceeditor.AnnotationHelper.AnnotationType; +import org.opengauss.mppdbide.view.utils.icon.IiconPath; + +/** + * Title: class + * Description: The Class DebugPassPositionAnnotation. + * + * @since 3.0.0 + */ +public class DebugPassPositionAnnotation extends AnnotationWithLineNumber { + private static final AnnotationType ANNOTATION_TYPE_PASS = AnnotationType.DEBUG_POSITION_PASS; + private static final RGB DEBUGPOSITION_RGB = new RGB(255, 153, 51); + + /** + * Instantiates a new debug position annotation. + * + * @param line the line + */ + public DebugPassPositionAnnotation(int line) { + super(ANNOTATION_TYPE_PASS.getStrategy(), false, "[Line : " + line, line); + } + + /** + * Gets the layer. + * + * @return the layer + */ + public static int getLayer() { + return ANNOTATION_TYPE_PASS.getLayer(); + } + + /** + * Gets the image. + * + * @return the image + */ + public Optional getImage() { + return Optional.of( + loadImage(IiconPath.ICO_EXECUTE_PASS) + ); + } + + /** + * Gets the breakpoint rgb. + * + * @return the breakpoint rgb + */ + public static RGB getBreakpointRgb() { + return DEBUGPOSITION_RGB; + } + + /** + * Gets the strategyid. + * + * @return the strategyid + */ + public static String getStrategyid() { + return ANNOTATION_TYPE_PASS.getStrategy(); + } + + /** + * Gets the typelabel. + * + * @return the typelabel + */ + public static String getTypelabel() { + return ANNOTATION_TYPE_PASS.getTypeLabel(); + } + + @Override + public AnnotationType getAnnotationType() { + return ANNOTATION_TYPE_PASS; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java index b45bb730..33e40f85 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022 Huawei Technologies Co.,Ltd. * * openGauss is licensed under Mulan PSL v2. @@ -6,7 +6,7 @@ * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 - * + * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. @@ -15,9 +15,13 @@ package org.opengauss.mppdbide.view.core.sourceeditor; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Locale; +import java.util.Optional; +import java.util.stream.Collectors; import javax.annotation.PreDestroy; @@ -63,8 +67,6 @@ import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.ISharedTextColors; import org.eclipse.jface.text.source.OverviewRuler; import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.text.source.projection.ProjectionAnnotation; -import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel; import org.eclipse.jface.text.source.projection.ProjectionSupport; import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.jface.util.IPropertyChangeListener; @@ -81,7 +83,6 @@ import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.VerifyEvent; @@ -97,16 +98,20 @@ import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.internal.editors.text.EditorsPlugin; import org.eclipse.ui.texteditor.SourceViewerDecorationSupport; - import org.opengauss.mppdbide.adapter.keywordssyntax.SQLSyntax; import org.opengauss.mppdbide.bl.serverdatacache.Database; +import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.common.IConnectionProvider; +import org.opengauss.mppdbide.common.VersionHelper; import org.opengauss.mppdbide.gauss.sqlparser.SQLFoldingConstants; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.MPPDBIDEConstants; import org.opengauss.mppdbide.utils.loader.MessageConfigLoader; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; import org.opengauss.mppdbide.view.core.SelectMenuItem; -import org.opengauss.mppdbide.view.handler.debug.DebugHandlerUtils; +import org.opengauss.mppdbide.view.handler.debug.DBConnectionProvider; import org.opengauss.mppdbide.view.handler.debug.DebugServiceHelper; import org.opengauss.mppdbide.view.prefernces.DSFormatterPreferencePage; import org.opengauss.mppdbide.view.prefernces.FormatterPreferenceKeys; @@ -123,6 +128,7 @@ import org.opengauss.mppdbide.view.uidisplay.UIDisplayState; import org.opengauss.mppdbide.view.uidisplay.uidisplayif.UIDisplayStateIf; import org.opengauss.mppdbide.view.utils.IUserPreference; import org.opengauss.mppdbide.view.utils.TerminalStatusBar; +import org.opengauss.mppdbide.view.utils.UIElement; import org.opengauss.mppdbide.view.utils.dialog.MPPDBIDEDialogs; import org.opengauss.mppdbide.view.utils.dialog.MPPDBIDEDialogs.MESSAGEDIALOGTYPE; import org.opengauss.mppdbide.view.utils.icon.IconUtility; @@ -135,6 +141,7 @@ import org.opengauss.mppdbide.view.workerjob.UIWorkerJob; * @since 3.0.0 */ public final class PLSourceEditorCore extends SelectMenuItem implements IPropertyChangeListener { + private static final String FORMAT_COMMAND_ID = "org.opengauss.mppdbide.command.id.format"; private ECommandService commandService; @@ -337,10 +344,10 @@ public final class PLSourceEditorCore extends SelectMenuItem implements IPropert addPasteMenuItem(menu); addSelectAllMenuItem(menu); addToggleLineCommentMenuItem(menu); + addRemarkLineCommentMenuItem(menu); addToggleBlockCommentMenuItem(menu); addFormatMenuItem(menu); addExecStmtMenuItem(menu); - this.config = new SQLSourceViewerConfig(syntx); setTabStrategy(); @@ -1334,6 +1341,69 @@ public final class PLSourceEditorCore extends SelectMenuItem implements IPropert toggleLineComments.setImage(IconUtility.getIconImage(IiconPath.ICON_TOGGLE_LINE_COMMENTS, this.getClass())); } + private void addRemarkLineCommentMenuItem(Menu menuItem) { + toggleLineComments = new MenuItem(menuItem, SWT.PUSH); + toggleLineComments.setText(MessageConfigLoader + .getProperty(IMessagesConstants.REMARK_SHORTCUT_KEY_BINDING_TOGGLE_LINE_COMMENTS)); + toggleLineComments.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent event) { + PLSourceEditor pl = UIElement.getInstance().getVisibleSourceViewer(); + IConnectionProvider prov = new DBConnectionProvider(pl.getDebugObject().getDatabase()); + Optional conn = prov.getFreeConnection(); + try { + boolean isPldebugger= VersionHelper.getDebuggerVersion(conn.get()).isPldebugger(); + if (isPldebugger) { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXECDIALOG_HINT), + MessageConfigLoader.getProperty(IMessagesConstants.COVERAGE_CHECK)); + return; + } + ISelection res = viewer.getSelection(); + int start = Integer.valueOf(res.toString().split("startLine: ")[1].split(",")[0]); + String[] arr = res.toString().split("endLine: "); + int endLength = 1; + if (arr.length > 1) { + endLength = Integer.parseInt(arr[1].split(",")[0]); + } + List list = new ArrayList(); + for(int i = start; i< (endLength==1?start+1:endLength+1); i++) { + list.add(String.valueOf(i)); + } + long oid = pl.getDebugObject().getOid(); + DebuggerStartInfoVo startInfo=DebuggerStartConstants.getStartInfo(oid); + List remarkLines= startInfo.getRemarkList(); + List cancel = list.stream().filter(item -> remarkLines.contains(item)).collect(Collectors.toList()); + cancel.forEach(item -> viewer.getTextWidget().setLineBackground(Integer.parseInt(item), 1, SQLSyntaxColorProvider.BACKGROUND_COLOR)); + List newRemark = list.stream().filter(item -> !remarkLines.contains(item)).collect(Collectors.toList()); + newRemark.forEach(item -> viewer.getTextWidget().setLineBackground(Integer.parseInt(item), 1, SQLSyntaxColorProvider.BACKGROUND_COLOR_GREY)); + List oldRemark = remarkLines.stream().filter(item -> !list.contains(item)).collect(Collectors.toList()); + newRemark.addAll(oldRemark); + String remarLinesStr= newRemark.stream().map(String::valueOf).collect(Collectors.joining(",")); + startInfo.remarLinesStr=remarLinesStr; + DebuggerStartConstants.setStartInfo(oid, startInfo); + } catch (SQLException e1) { + e1.printStackTrace(); + } finally { + try { + conn.get().close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent event) { + + } + }); + toggleLineComments.setImage(IconUtility.getIconImage(IiconPath.ICON_REMARK_COVERAGE, this.getClass())); + } + + + /** * Adds the toggle block comment menu item. * @@ -2463,7 +2533,7 @@ public final class PLSourceEditorCore extends SelectMenuItem implements IPropert /** * to remove completed Job - * + * * @param job which job need to be removed */ public void removeCompletedJob(UIWorkerJob job) { @@ -2482,7 +2552,7 @@ public final class PLSourceEditorCore extends SelectMenuItem implements IPropert public AnnotationModel getfAnnotationModel() { return fAnnotationModel; } - + /** * pre destroy */ diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLSyntaxColorProvider.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLSyntaxColorProvider.java index 7d67c146..07dae819 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLSyntaxColorProvider.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLSyntaxColorProvider.java @@ -71,6 +71,8 @@ public class SQLSyntaxColorProvider { * The Constant BACKGROUND_COLOR. */ public static final Color BACKGROUND_COLOR = new Color(Display.getCurrent(), BACKGROUND); + + public static final Color BACKGROUND_COLOR_GREY = new Color(Display.getCurrent(), new RGB(167, 169, 169)); /** * use for debug position highlight diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ExecuteEditorItem.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ExecuteEditorItem.java index cdcecad5..56c17fac 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ExecuteEditorItem.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ExecuteEditorItem.java @@ -15,6 +15,7 @@ package org.opengauss.mppdbide.view.handler; +import java.sql.SQLException; import java.util.ArrayList; import javax.inject.Inject; @@ -29,16 +30,18 @@ import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; - import org.opengauss.mppdbide.adapter.gauss.DBConnection; import org.opengauss.mppdbide.adapter.keywordssyntax.SQLSyntax; import org.opengauss.mppdbide.bl.errorlocator.IErrorLocator; import org.opengauss.mppdbide.bl.serverdatacache.Database; import org.opengauss.mppdbide.bl.serverdatacache.DatabaseUtils; +import org.opengauss.mppdbide.bl.serverdatacache.DebugObjects; import org.opengauss.mppdbide.bl.serverdatacache.IDebugObject; import org.opengauss.mppdbide.bl.serverdatacache.OBJECTTYPE; import org.opengauss.mppdbide.bl.serverdatacache.ObjectChange; import org.opengauss.mppdbide.bl.serverdatacache.ObjectParameter; +import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.common.VersionHelper; import org.opengauss.mppdbide.presentation.CanContextContinueExecuteRule; import org.opengauss.mppdbide.presentation.IExecutionContext; import org.opengauss.mppdbide.presentation.IResultDisplayUIManager; @@ -56,6 +59,7 @@ import org.opengauss.mppdbide.view.functionchange.ExecuteWrapper; import org.opengauss.mppdbide.view.functionchange.ObjectChangeEvent; import org.opengauss.mppdbide.view.functionchange.ObjectChangeEvent.ButtonPressed; import org.opengauss.mppdbide.view.functionchange.ObjectChangeWorker; +import org.opengauss.mppdbide.view.handler.debug.DBConnectionProvider; import org.opengauss.mppdbide.view.terminal.TerminalQueryExecutionWorker; import org.opengauss.mppdbide.view.terminal.executioncontext.FuncProcEditorTerminalExecutionContext; import org.opengauss.mppdbide.view.ui.PLSourceEditor; @@ -73,802 +77,829 @@ import org.opengauss.mppdbide.view.utils.dialog.MPPDBIDEDialogs.MESSAGEDIALOGTYP */ public class ExecuteEditorItem implements ExecuteWrapper { - /** - * Executor - * - * @param application - * @param service - */ - @Inject - private ECommandService commandService; - - @Inject - private EHandlerService handlerService; - - private QueryInfo queryInfo = new QueryInfo(); - - private static final String ERROR_POSITION_IDENTIFIER = "Position:"; - - /** - * Execute. - */ - @Execute - public void execute() { - - MPPDBIDELoggerUtility - .info(MessageConfigLoader.getProperty(IMessagesConstants.GUI_EXECUTEEDITORITEM_EXECUTE_CLICKED)); - PLSourceEditor editor = UIElement.getInstance().getVisibleSourceViewer(); - if (null == editor) { - Command command = commandService.getCommand("org.opengauss.mppdbide.command.id.executeobjectbrowseritem"); - ParameterizedCommand parameterizedCommand = ParameterizedCommand.generateCommand(command, null); - handlerService.executeHandler(parameterizedCommand); - return; - } - editor.setExecuteInProgress(true); - editor.enabledisableTextWidget(false); - IDebugObject debugObject = editor.getDebugObject(); - ObjectChangeWorker objWorker = new ObjectChangeWorker("Function Change Worker", - null, debugObject, editor, this, IMessagesConstants.FUNCTN_CHANGE_MSG, - IMessagesConstants.FUNCTN_CHANGE_OVERWRITE); - objWorker.schedule(); - } - - /** - * Handle execute. - * - * @param event the event - */ - @Override - public void handleExecute(ObjectChangeEvent event) { - PLSourceEditor editor = event.getEditor(); - IDebugObject debugObject = event.getDbgObj(); - Database db = debugObject.getDatabase(); - boolean iscontinue = true; - - if (validateForRefreshStatus(event)) { - iscontinue = refreshDebugObjectOnTerminal(editor, debugObject, db); - } else { - boolean codeChanged = editor.isCodeChanged(); - int returnVal = displayIfCodeChanged(codeChanged); - - boolean debugObjChanged = true; - debugObjChanged = getDebugObjectChanged(debugObject, debugObjChanged); - - iscontinue = executeIfCodeNotChanged(editor, debugObject, db, codeChanged, returnVal, debugObjChanged); - - iscontinue = executeIfCodeIsChanged(editor, iscontinue, codeChanged, returnVal, debugObjChanged); - } - if (iscontinue) { - editor.enabledisableTextWidget(true); - editor.setCompileInProgress(false); - editor.setExecuteInProgress(false); - executeSQLObjWindow(debugObject, false); - } - } - - /** - * Execute if code is changed. - * - * @param editor the editor - * @param iscontinue the iscontinue - * @param codeChanged the code changed - * @param returnVal the return val - * @param debugObjChanged the debug obj changed - * @return true, if successful - */ - private boolean executeIfCodeIsChanged(PLSourceEditor editor, boolean iscontinue, boolean codeChanged, - int returnVal, boolean debugObjChanged) { - iscontinue = refreshOnDebugObjChange(editor, iscontinue, codeChanged, returnVal, debugObjChanged); - if (iscontinue && codeChanged && (returnVal != 0)) { - editor.enabledisableTextWidget(true); - editor.setCompileInProgress(false); - editor.setExecuteInProgress(false); - return false; - } - return iscontinue; - } - - /** - * Refresh on debug obj change. - * - * @param editor the editor - * @param iscontinue the iscontinue - * @param codeChanged the code changed - * @param returnVal the return val - * @param debugObjChanged the debug obj changed - * @return true, if successful - */ - private boolean refreshOnDebugObjChange(PLSourceEditor editor, boolean iscontinue, boolean codeChanged, - int returnVal, boolean debugObjChanged) { - if (iscontinue && codeChanged && (returnVal == 0)) { - refreshDebugObjectOnChanged(editor, debugObjChanged); - editor.setCompileInProgress(false); - editor.setExecuteInProgress(false); - editor.enabledisableTextWidget(true); - editor.getConsoleMessageWindow(true) - .logInfo(MessageConfigLoader.getProperty(IMessagesConstants.STATUS_MSG_STATUS)); - iscontinue = executeIfDebugObjectIsNotChanged(editor, debugObjChanged); - } - return iscontinue; - } - - /** - * Execute if debug object is not changed. - * - * @param editor the editor - * @param debugObjChanged the debug obj changed - * @return true, if successful - */ - private boolean executeIfDebugObjectIsNotChanged(PLSourceEditor editor, boolean debugObjChanged) { - if (!debugObjChanged) { - - // source code changed, but the debug object didnt change as new - // debug object compiled open the new function in a new tab - - IExecutionContext context = generateContext(Display.getDefault().getActiveShell(), editor); - TerminalQueryExecutionWorker worker = new TerminalQueryExecutionWorker(context) { - - private boolean isExecuted = false; - - /** - * Final cleanup. - * - * @throws MPPDBIDEException the MPPDBIDE exception - */ - public void finalCleanup() throws MPPDBIDEException { - super.finalCleanup(); - if (this.context instanceof FuncProcEditorTerminalExecutionContext) { - FuncProcEditorTerminalExecutionContext funcContext = (FuncProcEditorTerminalExecutionContext) this.context; - IResultDisplayUIManager canExecute = funcContext.getResultDisplayUIManager(); - if (CanContextContinueExecuteRule.CONTEXT_EXECUTION_PROCEED == canExecute - .canContextExecutionContinue() && !isExecuted) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - PLSourceEditor editor1 = UIElement.getInstance() - .getEditorModelById(funcContext.getDebugObject()); - if (editor1 != null) { - editor1.enabledisableTextWidget(true); - editor1.setCompileInProgress(false); - editor1.setExecuteInProgress(false); - executeSQLObjWindow(editor1.getDebugObject(), false); - } - } - }); - - isExecuted = true; - } - - } - - } - }; - worker.setTaskDB(context.getTermConnection().getDatabase()); - worker.schedule(); - return false; - } - return true; - } - - /** - * Refresh debug object on changed. - * - * @param editor the editor - * @param debugObjChanged the debug obj changed - */ - private void refreshDebugObjectOnChanged(PLSourceEditor editor, boolean debugObjChanged) { - if (debugObjChanged) { - editor.refreshDebugObjectAfterEdit(editor.getDebugObject()); - } - } - - /** - * Execute if code not changed. - * - * @param editor the editor - * @param debugObject the debug object - * @param db the db - * @param codeChanged the code changed - * @param returnVal the return val - * @param debugObjChanged the debug obj changed - * @return true, if successful - */ - private boolean executeIfCodeNotChanged(PLSourceEditor editor, IDebugObject debugObject, Database db, - boolean codeChanged, int returnVal, boolean debugObjChanged) { - if (validateIfCodeChanged(codeChanged, returnVal) && debugObjChanged) { - return executeOnCodeChange(editor, debugObject, db); - } - return true; - } - - /** - * Execute on code change. - * - * @param editor the editor - * @param debugObject the debug object - * @param db the db - * @return true, if successful - */ - private boolean executeOnCodeChange(PLSourceEditor editor, IDebugObject debugObject, Database db) { - try { - executeOnTerminal(editor, debugObject, db); - editor.enabledisableTextWidget(true); - } catch (DatabaseOperationException exception) { - MPPDBIDELoggerUtility.error("error while execute debug obj.", exception); - editor.enabledisableTextWidget(true); - return false; - } - return true; - } - - /** - * Validate if code changed. - * - * @param codeChanged the code changed - * @param returnVal the return val - * @return true, if successful - */ - private boolean validateIfCodeChanged(boolean codeChanged, int returnVal) { - return (!codeChanged) || (returnVal == 0); - } - - /** - * Display if code changed. - * - * @param codeChanged the code changed - * @return the int - */ - private int displayIfCodeChanged(boolean codeChanged) { - int returnVal = -1; - if (codeChanged) { - returnVal = MPPDBIDEDialogs.generateYesNoMessageDialog(MESSAGEDIALOGTYPE.QUESTION, true, - MessageConfigLoader.getProperty(IMessagesConstants.SOURCE_CODE_CHANGE), - MessageConfigLoader.getProperty(IMessagesConstants.SOURCE_HAS_BEEN_CHANGED)); - } - return returnVal; - } - - /** - * Gets the debug object changed. - * - * @param debugObject the debug object - * @param debugObjChanged the debug obj changed - * @return the debug object changed - */ - private boolean getDebugObjectChanged(IDebugObject debugObject, boolean debugObjChanged) { - try { - debugObjChanged = debugObject.isChanged(debugObject.getLatestInfo()); - } catch (DatabaseCriticalException exception) { - MPPDBIDELoggerUtility.error("error while comparing debug obj info with server", exception); - } catch (DatabaseOperationException exception) { - MPPDBIDELoggerUtility.error("error while comparing debug obj info with server", exception); - } - return debugObjChanged; - } - - /** - * Refresh debug object on terminal. - * - * @param editor the editor - * @param debugObject the debug object - * @param db the db - * @return true, if successful - */ - private boolean refreshDebugObjectOnTerminal(PLSourceEditor editor, IDebugObject debugObject, Database db) { - editor.setDocument(new Document(debugObject.getSourceCode().getCode())); - editor.registerModifyListener(); - try { - executeOnTerminal(editor, debugObject, db); - } catch (DatabaseOperationException exception) { - MPPDBIDELoggerUtility.error("error while execute debug obj.", exception); - editor.enabledisableTextWidget(true); - return false; - } - return true; - } - - /** - * Validate for refresh status. - * - * @param event the event - * @return true, if successful - */ - private boolean validateForRefreshStatus(ObjectChangeEvent event) { - return event.getStatus() != null && event.getStatus().equals(ButtonPressed.REFRESH); - } - - /** - * Generate context. - * - * @param shell the shell - * @param editor the editor - * @return the i execution context - */ - private IExecutionContext generateContext(Shell shell, PLSourceEditor editor) { - ExecuteSourceEditor executeSourceEditor = null; - executeSourceEditor = new ExecuteSourceEditor(shell, editor); - - return executeSourceEditor.getContextForNewEditor(); - - } - - /** - * Execute on terminal. - * - * @param editor the editor - * @param debugObject the debug object - * @param db the db - * @throws DatabaseOperationException the database operation exception - */ - private void executeOnTerminal(PLSourceEditor editor, IDebugObject debugObject, Database db) - throws DatabaseOperationException { - String query = editor.getDocument(); - DBConnection conn = null; - - try { - conn = executeOnTerminal(editor, debugObject, query); - } catch (DatabaseOperationException exception) { - editor.setExecuteInProgress(false); - String message = ""; - message = getServerMessageDetails(editor, query, exception); - message = getErrorMessage(message, exception); - editor.getConsoleMessageWindow(true).logErrorInUI(message); - MPPDBIDELoggerUtility.error("ExecuteEditorItem: execute on terminal failed.", exception); - throw new DatabaseOperationException("error occured."); - } catch (DatabaseCriticalException e) { - UIDisplayFactoryProvider.getUIDisplayStateIf().handleDBCriticalError(e, db); - return; - } finally { - releaseConnection(db, conn); - } - - } - - /** - * Execute on terminal. - * - * @param editor the editor - * @param debugObject the debug object - * @param query the query - * @return the DB connection - * @throws DatabaseCriticalException the database critical exception - * @throws DatabaseOperationException the database operation exception - */ - private DBConnection executeOnTerminal(PLSourceEditor editor, IDebugObject debugObject, String query) - throws DatabaseCriticalException, DatabaseOperationException { - DBConnection conn = null; - if (query.trim().isEmpty()) { - MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.ERROR, true, - MessageConfigLoader.getProperty(IMessagesConstants.EMPTY_PLSOURCE_TITEL), - MessageConfigLoader.getProperty(IMessagesConstants.EMPTY_PLSOURCE_VIEWER)); - return conn; - } - - conn = debugObject.getDatabase().getConnectionManager().getObjBrowserConn(); - DatabaseUtils.executeOnSqlTerminalAndReturnNothing(query, 0, conn, editor.getConsoleMsgQueue(false)); - editor.setCriticalErr(true); - editor.refreshDebugObjectAfterEdit(debugObject); - editor.setModified(false); - editor.setModifiedAfterCreate(false); - editor.setExecuteInProgress(false); - return conn; - } - - /** - * Release connection. - * - * @param db the db - * @param conn the conn - */ - private void releaseConnection(Database db, DBConnection conn) { - if (conn != null) { - db.getConnectionManager().releaseAndDisconnection(conn); - } - } - - /** - * Gets the error message. - * - * @param message the message - * @param e the e - * @return the error message - */ - private String getErrorMessage(String message, DatabaseOperationException e) { - if (message.isEmpty()) { - message = MessageConfigLoader.getProperty(IMessagesConstants.EXECUTION_FAILED_ITEM, - MPPDBIDEConstants.LINE_SEPARATOR, e.getErrorCode(), - e.getServerMessage() == null ? e.getDBErrorMessage() : e.getServerMessage()); - } - return message; - } - - /** - * Gets the server message details. - * - * @param editor the editor - * @param query the query - * @param e the e - * @return the server message details - */ - private String getServerMessageDetails(PLSourceEditor editor, String query, DatabaseOperationException e) { - String message = ""; - if (validateServerMessage(e)) { - try { - getErrorDetailsForLocator(editor, query, e); - } catch (BadLocationException exception) { - MPPDBIDELoggerUtility.error("ExecuteEditorItem: execute on terminal failed.", exception); - } - - message = MessageConfigLoader.getProperty(IMessagesConstants.EXECUTION_FAILED_ITEM, - MPPDBIDEConstants.LINE_SEPARATOR, e.getErrorCode(), - (e.getServerMessage() == null ? e.getDBErrorMessage() : e.getServerMessage()) - + MPPDBIDEConstants.LINE_SEPARATOR + " Line Number: " + queryInfo.getErrLineNo()); - } - return message; - } - - /** - * Validate server message. - * - * @param e the e - * @return true, if successful - */ - private boolean validateServerMessage(DatabaseOperationException e) { - return e.getServerMessage() != null && e.getServerMessage().contains(ERROR_POSITION_IDENTIFIER); - } - - /** - * Gets the error details for locator. - * - * @param editor the editor - * @param query the query - * @param e the e - * @return the error details for locator - * @throws BadLocationException the bad location exception - */ - private void getErrorDetailsForLocator(PLSourceEditor editor, String query, DatabaseOperationException e) - throws BadLocationException { - Database database = editor.getDatabase(); - - if (database != null) { - IErrorLocator errorLocator = database.getErrorLocator(); - String msg = e.getServerMessage(); - int errorPos = -1; - errorPos = getErrorPOsition(msg, errorPos); - - errorPos = getErrorPositionForGreaterThanSize(query, errorPos); - queryInfo.setErrorPosition(errorPos); - int errLineNo = editor.getsourceViewerLineOfOffset(getErrorLineNumber(errorLocator)); - queryInfo.setErrLineNo(errLineNo + 1); - } - } - - /** - * Gets the error line number. - * - * @param errorLocator the error locator - * @return the error line number - */ - private int getErrorLineNumber(IErrorLocator errorLocator) { - return errorLocator.errorLineNumber(queryInfo.getStartOffset(), queryInfo.getErrorPosition()); - } - - /** - * Gets the error P osition. - * - * @param msg the msg - * @param errorPos the error pos - * @return the error P osition - */ - private int getErrorPOsition(String msg, int errorPos) { - if (null != msg) { - - int idx = msg.lastIndexOf(ERROR_POSITION_IDENTIFIER); - String newStr; - newStr = getErrorPositionString(msg, idx); - - newStr = getStringForNewLine(newStr); - errorPos = convertErrorPositionToInt(errorPos, newStr); - } - - else { - errorPos++; - } - return errorPos; - } - - /** - * Gets the error position for greater than size. - * - * @param query the query - * @param errorPos the error pos - * @return the error position for greater than size - */ - private int getErrorPositionForGreaterThanSize(String query, int errorPos) { - if (errorPos > query.length()) { - errorPos = query.length(); - } - return errorPos; - } - - /** - * Convert error position to int. - * - * @param errorPos the error pos - * @param newStr the new str - * @return the int - */ - private int convertErrorPositionToInt(int errorPos, String newStr) { - try { - errorPos = Integer.parseInt(newStr.trim()); - } catch (NumberFormatException ex) { - errorPos++; - } - return errorPos; - } - - /** - * Gets the error position string. - * - * @param msg the msg - * @param idx the idx - * @return the error position string - */ - private String getErrorPositionString(String msg, int idx) { - String newStr; - if (idx != -1) { - newStr = msg.substring(idx + ERROR_POSITION_IDENTIFIER.length() + 1); - } else { - newStr = msg.substring(ERROR_POSITION_IDENTIFIER.length() + 1); - } - return newStr; - } - - /** - * Gets the string for new line. - * - * @param newStr the new str - * @return the string for new line - */ - private String getStringForNewLine(String newStr) { - if (newStr.contains(MPPDBIDEConstants.LINE_SEPARATOR)) { - newStr = newStr.substring(0, newStr.indexOf(MPPDBIDEConstants.LINE_SEPARATOR)); - } - return newStr; - } - - /** - * Execute SQL obj window. - * - * @param debugObject the debug object - */ - public void executeSQLObjWindow(IDebugObject debugObject, boolean isCurrentTerminal) { - ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit = new ExcuteSQLObjectTable( - Display.getDefault().getActiveShell()); - executeSQLObjectWindowCoreEdit.setSyntax(getSqlSyntax(debugObject)); - try { - executeSQLObjectWindowCoreEdit.setDebugObject(debugObject); - } catch (DatabaseCriticalException exception) { - UIDisplayFactoryProvider.getUIDisplayStateIf().handleDBCriticalError(exception, debugObject.getDatabase()); - return; - } catch (MPPDBIDEException exception) { - handleMppDbIdeException(exception); - return; - } catch (Exception exception) { - MPPDBIDELoggerUtility.error( - MessageConfigLoader.getProperty(IMessagesConstants.ERR_WHILE_STARTING_TO_EXECUTE_SQL_OBJECT), - exception); - MPPDBIDEDialogs.generateErrorDialog(MessageConfigLoader.getProperty(IMessagesConstants.PLSQL_ERR), - MessageConfigLoader.getProperty(IMessagesConstants.UNKNOWN_INTERNAL_ERR), exception); - } - executeSQLObjectWindowCoreEdit.defaultParameterValues(); - debugObject.setIsCurrentTerminal(isCurrentTerminal); - - openParameterWindow(debugObject, executeSQLObjectWindowCoreEdit); - } - - private void handleMppDbIdeException(MPPDBIDEException exception) { - UIDisplayUtil.getDebugConsole().logError(MessageConfigLoader - .getProperty(IMessagesConstants.OPERATION_CANNOT_BE_PERFOREMD, exception.getMessage())); - MPPDBIDEDialogs.generateDSErrorDialog(MessageConfigLoader.getProperty(IMessagesConstants.EXECUTE_DEBUGE), - MessageConfigLoader.getProperty(IMessagesConstants.OPERATION_CANNOT_BE_PERFOREMD_TITLE), - MessageConfigLoader.getProperty(IMessagesConstants.OPERATION_CANNOT_BE_PERFOREMD, - exception.getServerMessage()), - exception); - } - - /** - * Open parameter window. - * - * @param debugObject the debug object - * @param executeSQLObjectWindowCoreEdit the execute SQL object window core - * edit - */ - private void openParameterWindow(IDebugObject debugObject, ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit) { - if (executeFunctionProcedure(debugObject, executeSQLObjectWindowCoreEdit)) { - - executeSQLObjectWindowCoreEdit.open(); - } - } - - /** - * Gets the sql syntax. - * - * @param debugObject the debug object - * @return the sql syntax - */ - private SQLSyntax getSqlSyntax(IDebugObject debugObject) { - return debugObject.getDatabase() == null ? null : debugObject.getDatabase().getSqlSyntax(); - } - - /** - * Execute function procedure. - * - * @param debugObject the debug object - * @param executeSQLObjectWindowCoreEdit the execute SQL object window core - * edit - * @return true, if successful - */ - private boolean executeFunctionProcedure(IDebugObject debugObject, - ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit) { - boolean isContinue = true; - if (validateOlapFunctions(debugObject)) { - ArrayList params = debugObject.getTemplateParameters(); - - isContinue = executeForNoParameters(executeSQLObjectWindowCoreEdit, params); - - isContinue = validateExecutableFunction(isContinue, params); - } - return isContinue; - } - - /** - * Validate executable function. - * - * @param isContinue the is continue - * @param params the params - * @return true, if successful - */ - private boolean validateExecutableFunction(boolean isContinue, ArrayList params) { - if (isContinue && !IHandlerUtilities.isFunctionExecutable(false, params)) { - return false; - } - return isContinue; - } - - /** - * Execute for no parameters. - * - * @param executeSQLObjectWindowCoreEdit the execute SQL object window core - * edit - * @param params the params - * @return true, if successful - */ - private boolean executeForNoParameters(ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit, - ArrayList params) { - if (params == null || params.size() == 0) { - executeSQLObjectWindowCoreEdit.executePressed(); - return false; - } - return true; - } - - /** - * Validate olap functions. - * - * @param debugObject the debug object - * @return true, if successful - */ - private boolean validateOlapFunctions(IDebugObject debugObject) { - return debugObject.getObjectType() == OBJECTTYPE.PLSQLFUNCTION - || debugObject.getObjectType() == OBJECTTYPE.PROCEDURE - || debugObject.getObjectType() == OBJECTTYPE.SQLFUNCTION - || debugObject.getObjectType() == OBJECTTYPE.CFUNCTION; - } - - /** - * Can execute. - * - * @return true, if successful - */ - @CanExecute - public boolean canExecute() { - IDebugObject object = IHandlerUtilities.getSelectedDebugObject(); - boolean isObjectBrowserActive = UIElement.getInstance().isObjectBrowserActive(); - - if (validatePlEditorExists(object)) { - return false; - } - - object = getDebugObject(object, isObjectBrowserActive); - - PLSourceEditor editor = UIElement.getInstance().getVisibleSourceViewer(); - - if (getDbConnected(object)) { - return validateOperationInProgress(editor); - } - return false; - - } - - /** - * Validate pl editor exists. - * - * @param object the object - * @return true, if successful - */ - private boolean validatePlEditorExists(IDebugObject object) { - return object == null && null == UIElement.getInstance().getVisibleSourceViewer(); - } - - /** - * Gets the db connected. - * - * @param object the object - * @return the db connected - */ - private boolean getDbConnected(IDebugObject object) { - return object != null && object.getDatabase().isConnected(); - } - - /** - * Validate operation in progress. - * - * @param editor the editor - * @return true, if successful - */ - private boolean validateOperationInProgress(PLSourceEditor editor) { - if (validateExecutionInProgress(editor)) { - return false; - } - return true; - } - - /** - * Validate execution in progress. - * - * @param editor the editor - * @return true, if successful - */ - private boolean validateExecutionInProgress(PLSourceEditor editor) { - return editor != null && (editor.isCompileInProgress() || editor.isExecuteInProgress()); - } - - /** - * Gets the debug object. - * - * @param object the object - * @param isObjectBrowserActive the is object browser active - * @return the debug object - */ - private IDebugObject getDebugObject(IDebugObject object, boolean isObjectBrowserActive) { - PLSourceEditor sourceViewerEditor = UIElement.getInstance().getVisibleSourceViewer(); - if (sourceViewerEditor != null && (object == null || !isObjectBrowserActive)) { - object = sourceViewerEditor.getDebugObject(); - } - return object; - } - - /** - * Handle exception. - * - * @param e the e - * @param event the event - */ - @Override - public void handleException(Throwable exception, ObjectChangeEvent event) { - MPPDBIDELoggerUtility.error(MessageConfigLoader.getProperty(IMessagesConstants.ERR_GUI_SOURCE_NOT_AVAILABLE), - exception); - ConsoleCoreWindow.getInstance() - .logWarning(MessageConfigLoader.getProperty(IMessagesConstants.ERR_GUI_SOURCE_NOT_AVAILABLE)); - String msg = MessageConfigLoader.getProperty(IMessagesConstants.FUNCT_CHANGE_EXECUTE_ERR) - + exception.getMessage(); - MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.ERROR, true, - MessageConfigLoader.getProperty(IMessagesConstants.PL_SOURCE_VIEWER_ERROR), msg); - PLSourceEditor srcEditor = event.getEditor(); - srcEditor.setExecuteInProgress(false); - srcEditor.setCompileInProgress(false); - srcEditor.enabledisableTextWidget(true); - } + /** + * Executor + * + * @param application + * @param service + */ + @Inject + private ECommandService commandService; + + @Inject + private EHandlerService handlerService; + + private QueryInfo queryInfo = new QueryInfo(); + + private static final String ERROR_POSITION_IDENTIFIER = "Position:"; + + private volatile boolean isPldebugger = true; + + /** + * Execute. + */ + @Execute + public void execute() { + + MPPDBIDELoggerUtility + .info(MessageConfigLoader.getProperty(IMessagesConstants.GUI_EXECUTEEDITORITEM_EXECUTE_CLICKED)); + PLSourceEditor editor = UIElement.getInstance().getVisibleSourceViewer(); + if (null == editor) { + Command command = commandService.getCommand("org.opengauss.mppdbide.command.id.executeobjectbrowseritem"); + ParameterizedCommand parameterizedCommand = ParameterizedCommand.generateCommand(command, null); + handlerService.executeHandler(parameterizedCommand); + return; + } + editor.setExecuteInProgress(true); + editor.enabledisableTextWidget(false); + DebugObjects debugObject = null; + if (editor.getDebugObject() instanceof DebugObjects) { + debugObject = (DebugObjects)editor.getDebugObject(); + } + checkVersion(editor); + if (!isPldebugger) { + debugObject.setUsagehint(MessageConfigLoader.getProperty(IMessagesConstants.COVERAGE_HINT)); + } + ObjectChangeWorker objWorker = new ObjectChangeWorker("Function Change Worker", + null, debugObject, editor, this, IMessagesConstants.FUNCTN_CHANGE_MSG, + IMessagesConstants.FUNCTN_CHANGE_OVERWRITE); + objWorker.schedule(); + } + + /** + * Handle execute. + * + * @param event the event + */ + @Override + public void handleExecute(ObjectChangeEvent event) { + PLSourceEditor editor = event.getEditor(); + IDebugObject debugObject = event.getDbgObj(); + Database db = debugObject.getDatabase(); + boolean iscontinue = true; + + if (validateForRefreshStatus(event)) { + iscontinue = refreshDebugObjectOnTerminal(editor, debugObject, db); + } else { + boolean codeChanged = editor.isCodeChanged(); + int returnVal = displayIfCodeChanged(codeChanged); + + boolean debugObjChanged = true; + debugObjChanged = getDebugObjectChanged(debugObject, debugObjChanged); + + iscontinue = executeIfCodeNotChanged(editor, debugObject, db, codeChanged, returnVal, debugObjChanged); + + iscontinue = executeIfCodeIsChanged(editor, iscontinue, codeChanged, returnVal, debugObjChanged); + } + if (iscontinue) { + editor.enabledisableTextWidget(true); + editor.setCompileInProgress(false); + editor.setExecuteInProgress(false); + executeSQLObjWindow(debugObject, false); + } + } + + private void checkVersion(PLSourceEditor editor) { + IConnection conn = null; + try { + conn = new DBConnectionProvider(editor.getDebugObject().getDatabase()).getValidFreeConnection(); + isPldebugger = VersionHelper.getDebuggerVersion(conn).isPldebugger(); + } catch(SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } finally { + if (null != conn) { + try { + conn.close(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + } + } + + /** + * Execute if code is changed. + * + * @param editor the editor + * @param iscontinue the iscontinue + * @param codeChanged the code changed + * @param returnVal the return val + * @param debugObjChanged the debug obj changed + * @return true, if successful + */ + private boolean executeIfCodeIsChanged(PLSourceEditor editor, boolean iscontinue, boolean codeChanged, + int returnVal, boolean debugObjChanged) { + iscontinue = refreshOnDebugObjChange(editor, iscontinue, codeChanged, returnVal, debugObjChanged); + if (iscontinue && codeChanged && (returnVal != 0)) { + editor.enabledisableTextWidget(true); + editor.setCompileInProgress(false); + editor.setExecuteInProgress(false); + return false; + } + return iscontinue; + } + + /** + * Refresh on debug obj change. + * + * @param editor the editor + * @param iscontinue the iscontinue + * @param codeChanged the code changed + * @param returnVal the return val + * @param debugObjChanged the debug obj changed + * @return true, if successful + */ + private boolean refreshOnDebugObjChange(PLSourceEditor editor, boolean iscontinue, boolean codeChanged, + int returnVal, boolean debugObjChanged) { + if (iscontinue && codeChanged && (returnVal == 0)) { + refreshDebugObjectOnChanged(editor, debugObjChanged); + editor.setCompileInProgress(false); + editor.setExecuteInProgress(false); + editor.enabledisableTextWidget(true); + editor.getConsoleMessageWindow(true) + .logInfo(MessageConfigLoader.getProperty(IMessagesConstants.STATUS_MSG_STATUS)); + iscontinue = executeIfDebugObjectIsNotChanged(editor, debugObjChanged); + } + return iscontinue; + } + + /** + * Execute if debug object is not changed. + * + * @param editor the editor + * @param debugObjChanged the debug obj changed + * @return true, if successful + */ + private boolean executeIfDebugObjectIsNotChanged(PLSourceEditor editor, boolean debugObjChanged) { + if (!debugObjChanged) { + + // source code changed, but the debug object didnt change as new + // debug object compiled open the new function in a new tab + + IExecutionContext context = generateContext(Display.getDefault().getActiveShell(), editor); + TerminalQueryExecutionWorker worker = new TerminalQueryExecutionWorker(context) { + + private boolean isExecuted = false; + + /** + * Final cleanup. + * + * @throws MPPDBIDEException the MPPDBIDE exception + */ + public void finalCleanup() throws MPPDBIDEException { + super.finalCleanup(); + if (this.context instanceof FuncProcEditorTerminalExecutionContext) { + FuncProcEditorTerminalExecutionContext funcContext = (FuncProcEditorTerminalExecutionContext) this.context; + IResultDisplayUIManager canExecute = funcContext.getResultDisplayUIManager(); + if (CanContextContinueExecuteRule.CONTEXT_EXECUTION_PROCEED == canExecute + .canContextExecutionContinue() && !isExecuted) { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + PLSourceEditor editor1 = UIElement.getInstance() + .getEditorModelById(funcContext.getDebugObject()); + if (editor1 != null) { + editor1.enabledisableTextWidget(true); + editor1.setCompileInProgress(false); + editor1.setExecuteInProgress(false); + executeSQLObjWindow(editor1.getDebugObject(), false); + } + } + }); + + isExecuted = true; + } + + } + + } + }; + worker.setTaskDB(context.getTermConnection().getDatabase()); + worker.schedule(); + return false; + } + return true; + } + + /** + * Refresh debug object on changed. + * + * @param editor the editor + * @param debugObjChanged the debug obj changed + */ + private void refreshDebugObjectOnChanged(PLSourceEditor editor, boolean debugObjChanged) { + if (debugObjChanged) { + editor.refreshDebugObjectAfterEdit(editor.getDebugObject()); + } + } + + /** + * Execute if code not changed. + * + * @param editor the editor + * @param debugObject the debug object + * @param db the db + * @param codeChanged the code changed + * @param returnVal the return val + * @param debugObjChanged the debug obj changed + * @return true, if successful + */ + private boolean executeIfCodeNotChanged(PLSourceEditor editor, IDebugObject debugObject, Database db, + boolean codeChanged, int returnVal, boolean debugObjChanged) { + if (validateIfCodeChanged(codeChanged, returnVal) && debugObjChanged) { + return executeOnCodeChange(editor, debugObject, db); + } + return true; + } + + /** + * Execute on code change. + * + * @param editor the editor + * @param debugObject the debug object + * @param db the db + * @return true, if successful + */ + private boolean executeOnCodeChange(PLSourceEditor editor, IDebugObject debugObject, Database db) { + try { + executeOnTerminal(editor, debugObject, db); + editor.enabledisableTextWidget(true); + } catch (DatabaseOperationException exception) { + MPPDBIDELoggerUtility.error("error while execute debug obj.", exception); + editor.enabledisableTextWidget(true); + return false; + } + return true; + } + + /** + * Validate if code changed. + * + * @param codeChanged the code changed + * @param returnVal the return val + * @return true, if successful + */ + private boolean validateIfCodeChanged(boolean codeChanged, int returnVal) { + return (!codeChanged) || (returnVal == 0); + } + + /** + * Display if code changed. + * + * @param codeChanged the code changed + * @return the int + */ + private int displayIfCodeChanged(boolean codeChanged) { + int returnVal = -1; + if (codeChanged) { + returnVal = MPPDBIDEDialogs.generateYesNoMessageDialog(MESSAGEDIALOGTYPE.QUESTION, true, + MessageConfigLoader.getProperty(IMessagesConstants.SOURCE_CODE_CHANGE), + MessageConfigLoader.getProperty(IMessagesConstants.SOURCE_HAS_BEEN_CHANGED)); + } + return returnVal; + } + + /** + * Gets the debug object changed. + * + * @param debugObject the debug object + * @param debugObjChanged the debug obj changed + * @return the debug object changed + */ + private boolean getDebugObjectChanged(IDebugObject debugObject, boolean debugObjChanged) { + try { + debugObjChanged = debugObject.isChanged(debugObject.getLatestInfo()); + } catch (DatabaseCriticalException exception) { + MPPDBIDELoggerUtility.error("error while comparing debug obj info with server", exception); + } catch (DatabaseOperationException exception) { + MPPDBIDELoggerUtility.error("error while comparing debug obj info with server", exception); + } + return debugObjChanged; + } + + /** + * Refresh debug object on terminal. + * + * @param editor the editor + * @param debugObject the debug object + * @param db the db + * @return true, if successful + */ + private boolean refreshDebugObjectOnTerminal(PLSourceEditor editor, IDebugObject debugObject, Database db) { + editor.setDocument(new Document(debugObject.getSourceCode().getCode())); + editor.registerModifyListener(); + try { + executeOnTerminal(editor, debugObject, db); + } catch (DatabaseOperationException exception) { + MPPDBIDELoggerUtility.error("error while execute debug obj.", exception); + editor.enabledisableTextWidget(true); + return false; + } + return true; + } + + /** + * Validate for refresh status. + * + * @param event the event + * @return true, if successful + */ + private boolean validateForRefreshStatus(ObjectChangeEvent event) { + return event.getStatus() != null && event.getStatus().equals(ButtonPressed.REFRESH); + } + + /** + * Generate context. + * + * @param shell the shell + * @param editor the editor + * @return the i execution context + */ + private IExecutionContext generateContext(Shell shell, PLSourceEditor editor) { + ExecuteSourceEditor executeSourceEditor = null; + executeSourceEditor = new ExecuteSourceEditor(shell, editor); + + return executeSourceEditor.getContextForNewEditor(); + + } + + /** + * Execute on terminal. + * + * @param editor the editor + * @param debugObject the debug object + * @param db the db + * @throws DatabaseOperationException the database operation exception + */ + private void executeOnTerminal(PLSourceEditor editor, IDebugObject debugObject, Database db) + throws DatabaseOperationException { + String query = editor.getDocument(); + DBConnection conn = null; + + try { + conn = executeOnTerminal(editor, debugObject, query); + } catch (DatabaseOperationException exception) { + editor.setExecuteInProgress(false); + String message = ""; + message = getServerMessageDetails(editor, query, exception); + message = getErrorMessage(message, exception); + editor.getConsoleMessageWindow(true).logErrorInUI(message); + MPPDBIDELoggerUtility.error("ExecuteEditorItem: execute on terminal failed.", exception); + throw new DatabaseOperationException("error occured."); + } catch (DatabaseCriticalException e) { + UIDisplayFactoryProvider.getUIDisplayStateIf().handleDBCriticalError(e, db); + return; + } finally { + releaseConnection(db, conn); + } + + } + + /** + * Execute on terminal. + * + * @param editor the editor + * @param debugObject the debug object + * @param query the query + * @return the DB connection + * @throws DatabaseCriticalException the database critical exception + * @throws DatabaseOperationException the database operation exception + */ + private DBConnection executeOnTerminal(PLSourceEditor editor, IDebugObject debugObject, String query) + throws DatabaseCriticalException, DatabaseOperationException { + DBConnection conn = null; + if (query.trim().isEmpty()) { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.ERROR, true, + MessageConfigLoader.getProperty(IMessagesConstants.EMPTY_PLSOURCE_TITEL), + MessageConfigLoader.getProperty(IMessagesConstants.EMPTY_PLSOURCE_VIEWER)); + return conn; + } + + conn = debugObject.getDatabase().getConnectionManager().getObjBrowserConn(); + DatabaseUtils.executeOnSqlTerminalAndReturnNothing(query, 0, conn, editor.getConsoleMsgQueue(false)); + editor.setCriticalErr(true); + editor.refreshDebugObjectAfterEdit(debugObject); + editor.setModified(false); + editor.setModifiedAfterCreate(false); + editor.setExecuteInProgress(false); + return conn; + } + + /** + * Release connection. + * + * @param db the db + * @param conn the conn + */ + private void releaseConnection(Database db, DBConnection conn) { + if (conn != null) { + db.getConnectionManager().releaseAndDisconnection(conn); + } + } + + /** + * Gets the error message. + * + * @param message the message + * @param e the e + * @return the error message + */ + private String getErrorMessage(String message, DatabaseOperationException e) { + if (message.isEmpty()) { + message = MessageConfigLoader.getProperty(IMessagesConstants.EXECUTION_FAILED_ITEM, + MPPDBIDEConstants.LINE_SEPARATOR, e.getErrorCode(), + e.getServerMessage() == null ? e.getDBErrorMessage() : e.getServerMessage()); + } + return message; + } + + /** + * Gets the server message details. + * + * @param editor the editor + * @param query the query + * @param e the e + * @return the server message details + */ + private String getServerMessageDetails(PLSourceEditor editor, String query, DatabaseOperationException e) { + String message = ""; + if (validateServerMessage(e)) { + try { + getErrorDetailsForLocator(editor, query, e); + } catch (BadLocationException exception) { + MPPDBIDELoggerUtility.error("ExecuteEditorItem: execute on terminal failed.", exception); + } + + message = MessageConfigLoader.getProperty(IMessagesConstants.EXECUTION_FAILED_ITEM, + MPPDBIDEConstants.LINE_SEPARATOR, e.getErrorCode(), + (e.getServerMessage() == null ? e.getDBErrorMessage() : e.getServerMessage()) + + MPPDBIDEConstants.LINE_SEPARATOR + " Line Number: " + queryInfo.getErrLineNo()); + } + return message; + } + + /** + * Validate server message. + * + * @param e the e + * @return true, if successful + */ + private boolean validateServerMessage(DatabaseOperationException e) { + return e.getServerMessage() != null && e.getServerMessage().contains(ERROR_POSITION_IDENTIFIER); + } + + /** + * Gets the error details for locator. + * + * @param editor the editor + * @param query the query + * @param e the e + * @return the error details for locator + * @throws BadLocationException the bad location exception + */ + private void getErrorDetailsForLocator(PLSourceEditor editor, String query, DatabaseOperationException e) + throws BadLocationException { + Database database = editor.getDatabase(); + + if (database != null) { + IErrorLocator errorLocator = database.getErrorLocator(); + String msg = e.getServerMessage(); + int errorPos = -1; + errorPos = getErrorPOsition(msg, errorPos); + + errorPos = getErrorPositionForGreaterThanSize(query, errorPos); + queryInfo.setErrorPosition(errorPos); + int errLineNo = editor.getsourceViewerLineOfOffset(getErrorLineNumber(errorLocator)); + queryInfo.setErrLineNo(errLineNo + 1); + } + } + + /** + * Gets the error line number. + * + * @param errorLocator the error locator + * @return the error line number + */ + private int getErrorLineNumber(IErrorLocator errorLocator) { + return errorLocator.errorLineNumber(queryInfo.getStartOffset(), queryInfo.getErrorPosition()); + } + + /** + * Gets the error P osition. + * + * @param msg the msg + * @param errorPos the error pos + * @return the error P osition + */ + private int getErrorPOsition(String msg, int errorPos) { + if (null != msg) { + + int idx = msg.lastIndexOf(ERROR_POSITION_IDENTIFIER); + String newStr; + newStr = getErrorPositionString(msg, idx); + + newStr = getStringForNewLine(newStr); + errorPos = convertErrorPositionToInt(errorPos, newStr); + } + + else { + errorPos++; + } + return errorPos; + } + + /** + * Gets the error position for greater than size. + * + * @param query the query + * @param errorPos the error pos + * @return the error position for greater than size + */ + private int getErrorPositionForGreaterThanSize(String query, int errorPos) { + if (errorPos > query.length()) { + errorPos = query.length(); + } + return errorPos; + } + + /** + * Convert error position to int. + * + * @param errorPos the error pos + * @param newStr the new str + * @return the int + */ + private int convertErrorPositionToInt(int errorPos, String newStr) { + try { + errorPos = Integer.parseInt(newStr.trim()); + } catch (NumberFormatException ex) { + errorPos++; + } + return errorPos; + } + + /** + * Gets the error position string. + * + * @param msg the msg + * @param idx the idx + * @return the error position string + */ + private String getErrorPositionString(String msg, int idx) { + String newStr; + if (idx != -1) { + newStr = msg.substring(idx + ERROR_POSITION_IDENTIFIER.length() + 1); + } else { + newStr = msg.substring(ERROR_POSITION_IDENTIFIER.length() + 1); + } + return newStr; + } + + /** + * Gets the string for new line. + * + * @param newStr the new str + * @return the string for new line + */ + private String getStringForNewLine(String newStr) { + if (newStr.contains(MPPDBIDEConstants.LINE_SEPARATOR)) { + newStr = newStr.substring(0, newStr.indexOf(MPPDBIDEConstants.LINE_SEPARATOR)); + } + return newStr; + } + + /** + * Execute SQL obj window. + * + * @param debugObject the debug object + */ + public void executeSQLObjWindow(IDebugObject debugObject, boolean isCurrentTerminal) { + ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit = new ExcuteSQLObjectTable( + Display.getDefault().getActiveShell()); + executeSQLObjectWindowCoreEdit.setSyntax(getSqlSyntax(debugObject)); + try { + executeSQLObjectWindowCoreEdit.setDebugObject(debugObject); + } catch (DatabaseCriticalException exception) { + UIDisplayFactoryProvider.getUIDisplayStateIf().handleDBCriticalError(exception, debugObject.getDatabase()); + return; + } catch (MPPDBIDEException exception) { + handleMppDbIdeException(exception); + return; + } catch (Exception exception) { + MPPDBIDELoggerUtility.error( + MessageConfigLoader.getProperty(IMessagesConstants.ERR_WHILE_STARTING_TO_EXECUTE_SQL_OBJECT), + exception); + MPPDBIDEDialogs.generateErrorDialog(MessageConfigLoader.getProperty(IMessagesConstants.PLSQL_ERR), + MessageConfigLoader.getProperty(IMessagesConstants.UNKNOWN_INTERNAL_ERR), exception); + } + executeSQLObjectWindowCoreEdit.defaultParameterValues(); + debugObject.setIsCurrentTerminal(isCurrentTerminal); + + openParameterWindow(debugObject, executeSQLObjectWindowCoreEdit); + } + + private void handleMppDbIdeException(MPPDBIDEException exception) { + UIDisplayUtil.getDebugConsole().logError(MessageConfigLoader + .getProperty(IMessagesConstants.OPERATION_CANNOT_BE_PERFOREMD, exception.getMessage())); + MPPDBIDEDialogs.generateDSErrorDialog(MessageConfigLoader.getProperty(IMessagesConstants.EXECUTE_DEBUGE), + MessageConfigLoader.getProperty(IMessagesConstants.OPERATION_CANNOT_BE_PERFOREMD_TITLE), + MessageConfigLoader.getProperty(IMessagesConstants.OPERATION_CANNOT_BE_PERFOREMD, + exception.getServerMessage()), + exception); + } + + /** + * Open parameter window. + * + * @param debugObject the debug object + * @param executeSQLObjectWindowCoreEdit the execute SQL object window core + * edit + */ + private void openParameterWindow(IDebugObject debugObject, ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit) { + if (executeFunctionProcedure(debugObject, executeSQLObjectWindowCoreEdit)) { + + executeSQLObjectWindowCoreEdit.open(); + } + } + + /** + * Gets the sql syntax. + * + * @param debugObject the debug object + * @return the sql syntax + */ + private SQLSyntax getSqlSyntax(IDebugObject debugObject) { + return debugObject.getDatabase() == null ? null : debugObject.getDatabase().getSqlSyntax(); + } + + /** + * Execute function procedure. + * + * @param debugObject the debug object + * @param executeSQLObjectWindowCoreEdit the execute SQL object window core + * edit + * @return true, if successful + */ + private boolean executeFunctionProcedure(IDebugObject debugObject, + ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit) { + boolean isContinue = true; + if (validateOlapFunctions(debugObject)) { + ArrayList params = debugObject.getTemplateParameters(); + + isContinue = executeForNoParameters(executeSQLObjectWindowCoreEdit, params); + + isContinue = validateExecutableFunction(isContinue, params); + } + return isContinue; + } + + /** + * Validate executable function. + * + * @param isContinue the is continue + * @param params the params + * @return true, if successful + */ + private boolean validateExecutableFunction(boolean isContinue, ArrayList params) { + if (isContinue && !IHandlerUtilities.isFunctionExecutable(false, params)) { + return false; + } + return isContinue; + } + + /** + * Execute for no parameters. + * + * @param executeSQLObjectWindowCoreEdit the execute SQL object window core + * edit + * @param params the params + * @return true, if successful + */ + private boolean executeForNoParameters(ExcuteSQLObjectTable executeSQLObjectWindowCoreEdit, + ArrayList params) { + if (params == null || params.size() == 0) { + executeSQLObjectWindowCoreEdit.executePressed(); + return false; + } + return true; + } + + /** + * Validate olap functions. + * + * @param debugObject the debug object + * @return true, if successful + */ + private boolean validateOlapFunctions(IDebugObject debugObject) { + return debugObject.getObjectType() == OBJECTTYPE.PLSQLFUNCTION + || debugObject.getObjectType() == OBJECTTYPE.PROCEDURE + || debugObject.getObjectType() == OBJECTTYPE.SQLFUNCTION + || debugObject.getObjectType() == OBJECTTYPE.CFUNCTION; + } + + /** + * Can execute. + * + * @return true, if successful + */ + @CanExecute + public boolean canExecute() { + IDebugObject object = IHandlerUtilities.getSelectedDebugObject(); + boolean isObjectBrowserActive = UIElement.getInstance().isObjectBrowserActive(); + + if (validatePlEditorExists(object)) { + return false; + } + + object = getDebugObject(object, isObjectBrowserActive); + + PLSourceEditor editor = UIElement.getInstance().getVisibleSourceViewer(); + + if (getDbConnected(object)) { + return validateOperationInProgress(editor); + } + return false; + + } + + /** + * Validate pl editor exists. + * + * @param object the object + * @return true, if successful + */ + private boolean validatePlEditorExists(IDebugObject object) { + return object == null && null == UIElement.getInstance().getVisibleSourceViewer(); + } + + /** + * Gets the db connected. + * + * @param object the object + * @return the db connected + */ + private boolean getDbConnected(IDebugObject object) { + return object != null && object.getDatabase().isConnected(); + } + + /** + * Validate operation in progress. + * + * @param editor the editor + * @return true, if successful + */ + private boolean validateOperationInProgress(PLSourceEditor editor) { + if (validateExecutionInProgress(editor)) { + return false; + } + return true; + } + + /** + * Validate execution in progress. + * + * @param editor the editor + * @return true, if successful + */ + private boolean validateExecutionInProgress(PLSourceEditor editor) { + return editor != null && (editor.isCompileInProgress() || editor.isExecuteInProgress()); + } + + /** + * Gets the debug object. + * + * @param object the object + * @param isObjectBrowserActive the is object browser active + * @return the debug object + */ + private IDebugObject getDebugObject(IDebugObject object, boolean isObjectBrowserActive) { + PLSourceEditor sourceViewerEditor = UIElement.getInstance().getVisibleSourceViewer(); + if (sourceViewerEditor != null && (object == null || !isObjectBrowserActive)) { + object = sourceViewerEditor.getDebugObject(); + } + return object; + } + + /** + * Handle exception. + * + * @param e the e + * @param event the event + */ + @Override + public void handleException(Throwable exception, ObjectChangeEvent event) { + MPPDBIDELoggerUtility.error(MessageConfigLoader.getProperty(IMessagesConstants.ERR_GUI_SOURCE_NOT_AVAILABLE), + exception); + ConsoleCoreWindow.getInstance() + .logWarning(MessageConfigLoader.getProperty(IMessagesConstants.ERR_GUI_SOURCE_NOT_AVAILABLE)); + String msg = MessageConfigLoader.getProperty(IMessagesConstants.FUNCT_CHANGE_EXECUTE_ERR) + + exception.getMessage(); + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.ERROR, true, + MessageConfigLoader.getProperty(IMessagesConstants.PL_SOURCE_VIEWER_ERROR), msg); + PLSourceEditor srcEditor = event.getEditor(); + srcEditor.setExecuteInProgress(false); + srcEditor.setCompileInProgress(false); + srcEditor.enabledisableTextWidget(true); + } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java index 7c145289..b6b93290 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java @@ -19,6 +19,7 @@ import org.eclipse.e4.core.di.annotations.Execute; import org.opengauss.mppdbide.bl.serverdatacache.IDebugObject; import org.opengauss.mppdbide.bl.serverdatacache.ObjectChange; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.exceptions.DatabaseCriticalException; import org.opengauss.mppdbide.utils.exceptions.DatabaseOperationException; @@ -54,6 +55,10 @@ public class ViewSourceDebugObjectHandler implements ExecuteWrapper { PLSourceEditor editorObject = null; Object partObject = UIElement.getInstance().getActivePartObject(); IDebugObject debugObject = IHandlerUtilities.getSelectedDebugObject(); + if (null != debugObject) { + Long oid= debugObject.getOid(); + DebuggerStartConstants.getStartInfo(oid).remarLinesStr=""; + } if (debugObject != null) { if (!(UIElement.getInstance().isEditorExistByDbgObj(debugObject))) { try { diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ContinueDebugHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ContinueDebugHandler.java index 64768372..9204248e 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ContinueDebugHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ContinueDebugHandler.java @@ -23,6 +23,7 @@ import org.eclipse.e4.core.di.annotations.Execute; import org.opengauss.mppdbide.debuger.exception.DebugExitException; import org.opengauss.mppdbide.debuger.vo.PositionVo; +import org.opengauss.mppdbide.utils.ConstantRunLine; /** * Title: class @@ -53,6 +54,7 @@ public class ContinueDebugHandler extends BaseDebugStepHandler { @Override public Optional debugRun() throws SQLException, DebugExitException { + ConstantRunLine.isContinue = true; return getDebugService().continueExec(); } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHandlerUtils.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHandlerUtils.java index 9c8d0ec7..d2d39b68 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHandlerUtils.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHandlerUtils.java @@ -20,10 +20,11 @@ import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.e4.core.commands.ECommandService; import org.eclipse.e4.core.commands.EHandlerService; import org.eclipse.e4.ui.model.application.ui.MUIElement; - import org.opengauss.mppdbide.bl.serverdatacache.IDebugObject; import org.opengauss.mppdbide.eclipse.dependent.EclipseInjections; +import org.opengauss.mppdbide.utils.ConstantRunLine; import org.opengauss.mppdbide.view.handler.IHandlerUtilities; +import org.opengauss.mppdbide.view.handler.debug.ui.UpdateDebugPositionTask; import org.opengauss.mppdbide.view.prefernces.PreferenceWrapper; import org.opengauss.mppdbide.view.ui.PLSourceEditor; import org.opengauss.mppdbide.view.utils.UIElement; @@ -93,6 +94,11 @@ public class DebugHandlerUtils { public void setDebugStart(boolean isDebugStart) { this.isDebugStart = isDebugStart; } + + public void terminateDebug() { + ConstantRunLine.isTerminate = false; + UpdateDebugPositionTask.terminateDebug(); + } /** * description: this use to show debug view partstack diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHistoryCoverageHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHistoryCoverageHandler.java new file mode 100644 index 00000000..235a1844 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugHistoryCoverageHandler.java @@ -0,0 +1,90 @@ +package org.opengauss.mppdbide.view.handler.debug; + +import java.sql.SQLException; + +import org.eclipse.e4.core.di.annotations.CanExecute; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.opengauss.mppdbide.bl.serverdatacache.Server; +import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.common.VersionHelper; +import org.opengauss.mppdbide.utils.IMessagesConstants; +import org.opengauss.mppdbide.utils.loader.MessageConfigLoader; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; +import org.opengauss.mppdbide.view.ui.CoverageHistory; +import org.opengauss.mppdbide.view.ui.PLSourceEditor; +import org.opengauss.mppdbide.view.utils.UIElement; +import org.opengauss.mppdbide.view.utils.dialog.MPPDBIDEDialogs; +import org.opengauss.mppdbide.view.utils.dialog.MPPDBIDEDialogs.MESSAGEDIALOGTYPE; + +public class DebugHistoryCoverageHandler { + private DebugHandlerUtils debugUtils = DebugHandlerUtils.getInstance(); + private DebugServiceHelper serviceHelper = DebugServiceHelper.getInstance(); + private PLSourceEditor plSourceEditor; + + /** + * description: can execute + * + * @return boolean true if can + */ + @CanExecute + public boolean canExecute() { + return debugUtils.canStartDebug(); + } + + /** + * description: excute the command + * + * @return void + */ + @Execute + public void execute() { + plSourceEditor = UIElement.getInstance().getVisibleSourceViewer(); + IConnection conn = null; + try { + conn = new DBConnectionProvider(plSourceEditor.getDebugObject().getDatabase()).getValidFreeConnection(); + boolean isPldebugger= VersionHelper.getDebuggerVersion(conn).isPldebugger(); + conn.close(); + if (isPldebugger) { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXECDIALOG_HINT), + MessageConfigLoader.getProperty(IMessagesConstants.COVERAGE_CHECK)); + return; + } + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } finally { + try { + if (null != conn) { + conn.close(); + } + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + MPPDBIDELoggerUtility.error("start debugint:" + "null"); + debugUtils.initDebugSourceView(); + Shell shell = Display.getDefault().getActiveShell(); + Server server = plSourceEditor.getDatabase().getServer(); + CoverageHistory coverageHistory=new CoverageHistory(shell,server.getServerConnectionInfo().getConectionName(), + server.getServerConnectionInfo().getProfileId()); + coverageHistory.open(); + + } + + + private void showMsg(String msg) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + MPPDBIDEDialogs.generateOKMessageDialog( + MESSAGEDIALOGTYPE.WARNING, + true, + "get debug history coverage data warning", + msg); + } + }); + } + +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java index aae740dc..1a9e6a97 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java @@ -21,6 +21,7 @@ import java.util.Optional; import org.eclipse.jface.preference.PreferenceStore; import org.opengauss.mppdbide.bl.serverdatacache.IDebugObject; +import org.opengauss.mppdbide.common.IConnectionProvider; import org.opengauss.mppdbide.debuger.event.Event; import org.opengauss.mppdbide.debuger.event.IHandlerManger; import org.opengauss.mppdbide.debuger.event.Event.EventMessage; @@ -29,12 +30,15 @@ import org.opengauss.mppdbide.debuger.service.ServiceFactory; import org.opengauss.mppdbide.debuger.service.SourceCodeService; import org.opengauss.mppdbide.debuger.service.WrappedDebugService; import org.opengauss.mppdbide.debuger.vo.FunctionVo; +import org.opengauss.mppdbide.debuger.service.DebuggerReportService; import org.opengauss.mppdbide.debuger.vo.SourceCodeVo; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.MPPDBIDEConstants; import org.opengauss.mppdbide.utils.loader.MessageConfigLoader; import org.opengauss.mppdbide.view.core.sourceeditor.BreakpointAnnotation; import org.opengauss.mppdbide.view.prefernces.PreferenceWrapper; +import org.opengauss.mppdbide.view.service.CoverageServiceFactory; +import org.opengauss.mppdbide.view.vo.CoverageService; /** * Title: class @@ -46,10 +50,13 @@ public class DebugServiceHelper { private static DebugServiceHelper debugServiceHelper = new DebugServiceHelper(); private IDebugObject debugObject = null; private ServiceFactory serviceFactory = null; + private CoverageServiceFactory coverageServiceFactory = null; private WrappedDebugService debugService = null; + private DebuggerReportService debuggerReportService=null; private FunctionVo functionVo = null; private QueryService queryService = null; private SourceCodeService codeService = null; + private CoverageService coverageService = null; private DebugServiceHelper() { } @@ -75,21 +82,28 @@ public class DebugServiceHelper { return false; } if (!isCommonDatabase(debugObject)) { - serviceFactory = new ServiceFactory(new DBConnectionProvider(debugObject.getDatabase())); + IConnectionProvider provider=new DBConnectionProvider(debugObject.getDatabase()); + serviceFactory = new ServiceFactory(provider); + coverageServiceFactory = new CoverageServiceFactory(provider); checkSupportDebug(); queryService = serviceFactory.getQueryService(); functionVo = queryService.queryFunction(debugObject.getName()); + debuggerReportService=DebuggerReportService.getInstance(); + debuggerReportService.setAttr(provider, functionVo); debugService = new WrappedDebugService(serviceFactory.getDebugService(functionVo)); debugService.addHandler(new UiEventHandler()); debugService.addHandler(new DebugEventHandler()); codeService = serviceFactory.getCodeService(); + coverageService = coverageServiceFactory.getCoverageService(); Optional sourceCode = queryService.getSourceCode(functionVo.oid); if (sourceCode.isPresent()) { codeService.setBaseCode(sourceCode.get().getSourceCode()); + debuggerReportService.setBaseCode(codeService.getBaseCodeDesc()); } else { throw new SQLException("get source code failed!"); } codeService.setTotalCode(debugObject.getSourceCode().getCode()); + debuggerReportService.setTotalCode(codeService.getTotalCodeDesc()); this.debugObject = debugObject; } if (debugService != null) { @@ -143,6 +157,11 @@ public class DebugServiceHelper { public QueryService getQueryService() { return queryService; } + + public CoverageService getCoverageService() { + return coverageService; + } + /** * description: get code service diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java index 14ad5dce..556e82a3 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java @@ -17,8 +17,10 @@ package org.opengauss.mppdbide.view.handler.debug; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; @@ -29,6 +31,8 @@ import org.opengauss.mppdbide.bl.serverdatacache.DefaultParameter; import org.opengauss.mppdbide.bl.serverdatacache.IDebugObject; import org.opengauss.mppdbide.bl.serverdatacache.ObjectParameter; import org.opengauss.mppdbide.bl.serverdatacache.ObjectParameter.PARAMETERTYPE; +import org.opengauss.mppdbide.debuger.debug.DebugConstants; +import org.opengauss.mppdbide.debuger.service.DebugService; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.exceptions.DatabaseCriticalException; import org.opengauss.mppdbide.utils.exceptions.DatabaseOperationException; @@ -88,6 +92,11 @@ public class StartDebugHandler { plSourceEditor.setExecuteInProgress(true); debugUtils.showAllDebugView(true); startInputParamDialog(); + PLSourceEditor pl = UIElement.getInstance().getVisibleSourceViewer(); + List params = Arrays.asList(pl.getDebugObject().getObjectParameters()); + long oid = pl.getDebugObject().getOid(); + List paramNames = params.stream().map(item -> item.getName()).distinct().collect(Collectors.toList()); + DebugService.map.put(oid, paramNames); } private void startInputParamDialog() { @@ -142,9 +151,27 @@ public class StartDebugHandler { .getDefaulParametertMap() .get(debugObject.getOid()); debugParams = getDebugParams(serverParams); + StringBuffer buffer=new StringBuffer("("); + int count=0; + for(DefaultParameter a:serverParams) { + if(count!=0) { + buffer.append(","); + } + buffer.append(a.getDefaultParameterName()); + buffer.append(":=?").append(""); + count++; + } + buffer.append(")"); + } + if (serviceHelper.getDebugService() != null) { + serviceHelper.getDebugService().begin(debugParams); + debugUtils.setDebugStart(true); + } else { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXECDIALOG_HINT), + "please wait for server running!"); + return; } - serviceHelper.getDebugService().begin(debugParams); - debugUtils.setDebugStart(true); } catch (DatabaseCriticalException exception) { UIDisplayFactoryProvider.getUIDisplayStateIf().handleDBCriticalError(exception, debugObject.getDatabase()); return; @@ -157,6 +184,9 @@ public class StartDebugHandler { exception); MPPDBIDEDialogs.generateErrorDialog(MessageConfigLoader.getProperty(IMessagesConstants.PLSQL_ERR), MessageConfigLoader.getProperty(IMessagesConstants.UNKNOWN_INTERNAL_ERR), exception); + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXECDIALOG_HINT) + ,"please wait for server running!"); } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java index 5308fc59..91be62a9 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java @@ -17,8 +17,9 @@ package org.opengauss.mppdbide.view.handler.debug; import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; - +import org.opengauss.mppdbide.utils.DebuggerStartConstants; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; import org.opengauss.mppdbide.view.ui.PLSourceEditor; import org.opengauss.mppdbide.view.utils.UIElement; @@ -53,11 +54,16 @@ public class TerminateDebugHandler { MPPDBIDELoggerUtility.error("terminate debugint:" + "null"); debugUtils.showAllDebugView(false); PLSourceEditor plSourceEditor = UIElement.getInstance().getVisibleSourceViewer(); + Long oid= plSourceEditor.getDebugObject().getOid(); + DebuggerStartInfoVo debuggerStartInfoVo=DebuggerStartConstants.getStartInfo(oid); + debuggerStartInfoVo.ifMakeReport=false; + DebuggerStartConstants.setStartInfo(oid, debuggerStartInfoVo); if (plSourceEditor != null) { plSourceEditor.setEditable(true); plSourceEditor.setExecuteInProgress(false); } debugUtils.setDebugStart(false); + debugUtils.terminateDebug(); serviceHelper.closeService(); } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java index a77b0468..a2836e7b 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java @@ -19,7 +19,9 @@ import org.eclipse.swt.widgets.Display; import org.opengauss.mppdbide.debuger.event.Event; import org.opengauss.mppdbide.debuger.event.Event.EventMessage; +import org.opengauss.mppdbide.debuger.service.DebuggerReportService; import org.opengauss.mppdbide.debuger.service.chain.IMsgChain; +import org.opengauss.mppdbide.utils.ConstantRunLine; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; import org.opengauss.mppdbide.view.handler.debug.DebugHandlerUtils; import org.opengauss.mppdbide.view.handler.debug.DebugServiceHelper; @@ -37,6 +39,7 @@ public class ServerExitChain extends IMsgChain { private boolean isResultUpdated = false; private DebugHandlerUtils debugUtils = DebugHandlerUtils.getInstance(); private DebugServiceHelper serviceHelper = DebugServiceHelper.getInstance(); + public DebuggerReportService reportService = DebuggerReportService.getInstance(); @Override public boolean matchMsg(Event event) { @@ -52,6 +55,12 @@ public class ServerExitChain extends IMsgChain { } Display.getDefault().asyncExec(new UpdateDebugPositionTask(-1)); Display.getDefault().asyncExec(new UpdateHighlightLineNumTask()); + reportService.makeReport(); + if (null != ConstantRunLine.isContinue && ConstantRunLine.isContinue) { + Display.getDefault().asyncExec(()->{ + UpdateDebugPositionTask.continueDebug(); + }); + } if (!isResultUpdated) { isResultUpdated = true; Display.getDefault().asyncExec(new UpdateDebugResultTask(event)); diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java index 16dd684b..b923f03c 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022 Huawei Technologies Co.,Ltd. * * openGauss is licensed under Mulan PSL v2. @@ -6,7 +6,7 @@ * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 - * + * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. @@ -15,9 +15,22 @@ package org.opengauss.mppdbide.view.handler.debug.ui; -import org.eclipse.jface.text.BadLocationException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import org.eclipse.jface.text.BadLocationException; +import org.opengauss.mppdbide.debuger.service.SourceCodeService; +import org.opengauss.mppdbide.debuger.vo.VersionVo; +import org.opengauss.mppdbide.utils.ConstantRunLine; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; +import org.opengauss.mppdbide.utils.exceptions.DatabaseCriticalException; +import org.opengauss.mppdbide.utils.exceptions.DatabaseOperationException; +import org.opengauss.mppdbide.utils.exceptions.MPPDBIDEException; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; +import org.opengauss.mppdbide.view.core.sourceeditor.SQLSyntaxColorProvider; import org.opengauss.mppdbide.view.ui.PLSourceEditor; import org.opengauss.mppdbide.view.utils.UIElement; @@ -28,26 +41,153 @@ import org.opengauss.mppdbide.view.utils.UIElement; * @since 3.0.0 */ public class UpdateDebugPositionTask implements Runnable { - private int showLine = -1; - - public UpdateDebugPositionTask(int showLine) { - this.showLine = showLine; - } - - @Override - public void run() { - PLSourceEditor plSourceEditor = UIElement.getInstance().getVisibleSourceViewer(); - if (plSourceEditor == null) { - return; - } - - plSourceEditor.removeDebugPosition(); - try { - if (showLine >= 0) { - plSourceEditor.createDebugPosition(showLine); - } - } catch (BadLocationException e) { - MPPDBIDELoggerUtility.error("set debugPostion at " + showLine + " failed,err=" + e.getMessage()); - } - } + private int showLine = -1; + + public UpdateDebugPositionTask(int showLine) { + this.showLine = showLine; + ConstantRunLine.passLine.add(showLine); + } + + @Override + public void run() { + PLSourceEditor plSourceEditor = UIElement.getInstance().getVisibleSourceViewer(); + if (plSourceEditor == null) { + return; + } + Boolean isPlDebugger = true; + try { + VersionVo vo = new VersionVo(); + vo.version = plSourceEditor.getDatabase().getServerVersion(); + isPlDebugger = vo.isPldebugger(); + if (isPlDebugger) { + plSourceEditor.removeDebugPosition(); + if (showLine >= 0) { + plSourceEditor.createDebugPosition(showLine); + } + }else { + //dbedebugger + if(ConstantRunLine.isTerminate) { + debDebuggerRemark(plSourceEditor); + } + } + } catch (MPPDBIDEException e) { + MPPDBIDELoggerUtility.error("get version failed,err=" + e.getMessage()); + } catch (BadLocationException e) { + MPPDBIDELoggerUtility.error("set debugPostion at " + showLine + " failed,err=" + e.getMessage()); + } + } + + public static PLSourceEditor terminateDebug() { + PLSourceEditor plSourceEditor = UIElement.getInstance().getVisibleSourceViewer(); + plSourceEditor.removeDebugPosition(); + long oid = plSourceEditor.getDebugObject().getOid(); + String covs=DebuggerStartConstants.getStartInfo(oid).remarLinesStr; + if(covs!= null && !covs.isEmpty()) { + List lines = Arrays.asList(covs.split(",")); + lines.forEach(item -> { + plSourceEditor.getSourceEditorCore().getSourceViewer().getTextWidget().setLineBackground(Integer.parseInt(item), 1, SQLSyntaxColorProvider.BACKGROUND_COLOR_GREY); + }); + } + return plSourceEditor; + } + + public static void continueDebug() { + try { + Thread.sleep(200); + PLSourceEditor pl = terminateDebug(); + getToatlLineNo(pl).forEach(item-> { + try { + if (ConstantRunLine.runList.contains(String.valueOf(item))) { + pl.createPassPosition(item); + }else { + pl.createFailPosition(item); + } + } catch (BadLocationException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + }); + } catch (Exception e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + + private void remarkBack(PLSourceEditor plSourceEditor) { + long oid = plSourceEditor.getDebugObject().getOid(); + String covs=DebuggerStartConstants.getStartInfo(oid).remarLinesStr; + if(covs!= null && !covs.isEmpty()) { + List lines = Arrays.asList(covs.split(",")); + lines.forEach(item -> { + if (!String.valueOf(showLine).equals(item)) { + plSourceEditor.getSourceEditorCore().getSourceViewer().getTextWidget().setLineBackground(Integer.parseInt(item), 1, SQLSyntaxColorProvider.BACKGROUND_COLOR_GREY); + } + }); + } + } + + private void debDebuggerRemark(PLSourceEditor plSourceEditor) { + plSourceEditor.removeDebugPosition(); + try { + remarkBack(plSourceEditor); + if (showLine >= 0) { + plSourceEditor.createDebugPosition(showLine); + } + remark(showLine,plSourceEditor); + } catch (BadLocationException e) { + MPPDBIDELoggerUtility.error("set debugPostion at " + showLine + " failed,err=" + e.getMessage()); + } catch (Exception e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + } + + private void remark(int line, PLSourceEditor plSourceEditor) { + getToatlLineNo(plSourceEditor).forEach(item-> { + try { + if (item != showLine && ConstantRunLine.passLine.contains(item)) { + plSourceEditor.createPassPosition(item); + }else if(item != showLine){ + plSourceEditor.createFailPosition(item); + } + } catch (BadLocationException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + }); + } + + public static Set getToatlLineNo(PLSourceEditor plSourceEditor){ + Set record = new HashSet<>(); + int begin = -1; + int end = -1;; + try { + String sourceCode = plSourceEditor.getDebugObject().getLatestSouceCode().getCode(); + List total = SourceCodeService.CodeDescription.getLines(sourceCode); + + for(int i=0;i ls =coverageService.getCoverageInfoByOid(oid); + setInput(ls); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } finally { + if (null != coverageService) { + coverageService.closeService(); + } + } + } + + public void setInput(List items) { + int index = 1; + for (CoverageVo item : items) { + TableItem row = new TableItem(table, SWT.NONE); + setColValues(row, item, index); + index++; + row.setData(item); + } + if (table != null) { + if (table.getItems().length > 0) { + enablebuttons(true); + } + } + } + + private void setColValues(TableItem row, CoverageVo item, Integer count) { + row.setText(SERIAL_NUMBER_COLUMN, count.toString()); + row.setText(PIN_STATUS_COLUMN, String.valueOf(item.totalLineNum)); + row.setText(SQL_QUERY_COLUMN, String.valueOf(item.coverageLineNum)); + row.setText(NUMBER_OF_ROWS_COLUMN, String.valueOf(item.totalPercent)); + row.setText(START_TIME_COLUMN, String.valueOf(item.remarkLinesArr)); + row.setText(ELAPSED_TIME, String.valueOf(item.remarkCoverageLinesArr)); + row.setText(DATABASE_NAME_COLUMN, String.valueOf(item.remarkPercent)); + row.setText(UPDATE_TIME, item.parseDate()); + } + + private void loadQuerytoSQLTerminal() { + String query = null; + StringBuilder sb = new StringBuilder(MPPDBIDEConstants.STRING_BUILDER_CAPACITY); + SQLTerminal terminal = UIElement.getInstance().getTerminal(terminalParentId); + TableItem[] items = table.getSelection(); + for (TableItem t : items) { + query = t.getText(SQL_QUERY_COLUMN); + sb.append(query); + sb.append(EnvirnmentVariableValidator.validateAndGetLineSeperator()); + } + + if (null != terminal) { + terminal.getTerminalCore().setSelectedQuery(sb.toString()); + terminal.resetSQLTerminalButton(); + terminal.resetAutoCommitButton(); + terminal.setModified(true); + terminal.setModifiedAfterCreate(true); + } + } + + public SQLSyntax getSyntax() { + return syntax; + } + + public void setSyntax(SQLSyntax syntax) { + this.syntax = syntax; + } + + public CompositeRuler getCompositeRuler() { + fCompositeRuler = new CompositeRuler(SPACE_BETWEEN_RULER); + fCompositeRuler.addDecorator(1, new LineNumberRulerColumn()); + + return fCompositeRuler; + } + + public void setDocument(IDocument document) { + sourceViewer.setDocument(document); + } + + private void createToolbar(final Composite parent) { + + final ToolBar bar = new ToolBar(parent, SWT.FLAT | SWT.FOCUSED); + + final Image sqlcloseIcon = IconUtility.getIconImage(IiconPath.LOAD_QUERY_SQL_CLOSE, getClass()); + final Image deleteIcon = IconUtility.getIconImage(IiconPath.DELETE_SELECTED, getClass()); + + final Image deleteallIcon = IconUtility.getIconImage(IiconPath.DELETE_ALL, getClass()); + + saveToolItem = new ToolItem(bar, SWT.PUSH); + saveToolItem.setEnabled(false); + saveToolItem.setImage(sqlcloseIcon); + saveToolItem.setToolTipText(MessageConfigLoader.getProperty(IMessagesConstants.EXPORT_REPORT)); + saveToolItem.addSelectionListener(new ExportCoverageReport()); + + deleteToolItem = new ToolItem(bar, SWT.PUSH); + deleteToolItem.setEnabled(false); + deleteToolItem.setImage(deleteIcon); + deleteToolItem.setToolTipText(MessageConfigLoader.getProperty(IMessagesConstants.DELETE_Coverage)); + deleteToolItem.addSelectionListener(new DeletesqlClass()); + + deleteAllToolItem = new ToolItem(bar, SWT.PUSH); + deleteAllToolItem.setEnabled(false); + deleteAllToolItem.setImage(deleteallIcon); + deleteAllToolItem.setToolTipText(MessageConfigLoader.getProperty(IMessagesConstants.DELETE_Coverage_All)); + deleteAllToolItem.addSelectionListener(new DeleteAllsqlClass()); + } + + private final class DeletesqlClass implements SelectionListener { + + @Override + public void widgetSelected(SelectionEvent event) { + TableItem[] tableItems = table.getSelection(); + if (tableItems.length == 0) { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.DELETE_COVERAGE_REPORT_TITLE), + MessageConfigLoader.getProperty(IMessagesConstants.SELECT_QUERY_TO_DELETE)); + return; + } + int type = MPPDBIDEDialogs.generateOKCancelMessageDialog(MESSAGEDIALOGTYPE.WARNING, true, + MessageConfigLoader.getProperty(IMessagesConstants.DELETE_COVERAGE_REPORT_TITLE), + MessageConfigLoader.getProperty(IMessagesConstants.DELETE_SELECTED_COVERAGE_HISTORY_ALERT, profileName, + MPPDBIDEConstants.LINE_SEPARATOR)); + deleteSQLHistory(type, tableItems); + resetSerialNumber(); + } + + private void displayInfoMessage() { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.DELETE_SQL), + MessageConfigLoader.getProperty(IMessagesConstants.PINNED_DELETION)); + } + + @Override + public void widgetDefaultSelected(SelectionEvent event) { + + } + } + + private final class ExportCoverageReport implements SelectionListener { + + @Override + public void widgetSelected(SelectionEvent event) { + TableItem[] items = table.getSelection(); + if (items.length == 0) { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXPORT_REPORT), + MessageConfigLoader.getProperty(IMessagesConstants.COVERAGE_REPORT_TO_SELECT)); + return; + } + int type = MPPDBIDEDialogs.generateOKCancelMessageDialog(MESSAGEDIALOGTYPE.WARNING, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXPORT_REPORT), + MessageConfigLoader.getProperty(IMessagesConstants.SURE_EXPORT_REPORT)); + if (type == 0) { + Boolean flag = true; + String html = null; + String serialNum; + for (int index=0; index< items.length; index++) { + TableItem item =items[index]; + List list = getData(item); + serialNum = String.valueOf(index+1); + list.add(0, serialNum); + Map code = new HashMap(); + if (item.getData() instanceof CoverageVo) { + CoverageVo vo = (CoverageVo)item.getData(); + List codes = SourceCodeService.CodeDescription.getLines(vo.sourceCode); + for (int i =0;i getData(TableItem item) { + if (item.getData() instanceof CoverageVo) { + CoverageVo coverageVo = (CoverageVo) item.getData(); + return Stream.of(String.valueOf(coverageVo.totalLineNum),String.valueOf(coverageVo.coverageLineNum),coverageVo.totalPercent, + String.valueOf(coverageVo.remarkLinesArr),String.valueOf(coverageVo.remarkCoverageLinesArr), + coverageVo.remarkPercent, coverageVo.parseDate()).collect(Collectors.toList()); + } else { + return Collections.emptyList(); + } + } + + private final class DeleteAllsqlClass implements SelectionListener { + + @Override + public void widgetSelected(SelectionEvent event) { + TableItem[] items = table.getItems(); + int type = MPPDBIDEDialogs.generateOKCancelMessageDialog(MESSAGEDIALOGTYPE.WARNING, true, + MessageConfigLoader.getProperty(IMessagesConstants.DELETE_COVERAGE_REPORT_TITLE), + MessageConfigLoader.getProperty(IMessagesConstants.DELETE_ALL_COVERAGE_HISTORY_ALERT, profileName, + MPPDBIDEConstants.LINE_SEPARATOR)); + deleteSQLHistory(type, items); + resetSerialNumber(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent event) { + + } + } + + private void deleteSQLHistory(int type, TableItem[] items) { + if (type == 0) { + List historyItems = new LinkedList(); + int counter = 0; + for (TableItem item : items) { + if (item.getData() instanceof CoverageVo) { + historyItems.add((CoverageVo) item.getData()); + item.dispose(); + counter++; + } + } + if (counter != 0) { + CoverageService[] service = new CoverageService[1]; + try { + service[0] = coverageServiceFactory.getCoverageService(); + historyItems.forEach(item -> { + service[0].delCoverageInfoByOid(item.oid, item.cid); + }); + } catch(SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } finally { + service[0].closeService(); + } + } + sourceViewer.getDocument().set(""); + } + } + + private void resetSerialNumber() { + if (table != null) { + TableItem[] items = table.getItems(); + int size = items.length; + if (size <= 0) { + enablebuttons(false); + return; + } + + for (int indx = 0; indx < size; indx++) { + items[indx].setText(0, Integer.toString(indx + 1)); + } + } + } + + protected void enablebuttons(boolean value) { + saveToolItem.setEnabled(value); + deleteAllToolItem.setEnabled(value); + deleteToolItem.setEnabled(value); + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java index d9190220..9916adaf 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java @@ -45,10 +45,8 @@ import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.IDocumentListener; -import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; -import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.source.Annotation; @@ -60,10 +58,6 @@ import org.eclipse.jface.text.source.CompositeRuler; import org.eclipse.jface.text.source.IAnnotationAccess; import org.eclipse.jface.text.source.LineNumberRulerColumn; import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.text.source.projection.ProjectionViewer; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.dnd.Clipboard; @@ -77,7 +71,6 @@ import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -86,8 +79,6 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.texteditor.AnnotationPreference; - import org.opengauss.mppdbide.adapter.keywordssyntax.SQLSyntax; import org.opengauss.mppdbide.bl.errorlocator.IErrorLocator; import org.opengauss.mppdbide.bl.serverdatacache.Database; @@ -102,6 +93,7 @@ import org.opengauss.mppdbide.presentation.grid.IDSGridDataProvider; import org.opengauss.mppdbide.presentation.resultset.ActionAfterResultFetch; import org.opengauss.mppdbide.presentation.resultsetif.IConsoleResult; import org.opengauss.mppdbide.presentation.resultsetif.IResultConfig; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.MPPDBIDEConstants; import org.opengauss.mppdbide.utils.MemoryCleaner; @@ -112,13 +104,16 @@ import org.opengauss.mppdbide.utils.loader.MessageConfigLoader; import org.opengauss.mppdbide.utils.logger.ILogger; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; import org.opengauss.mppdbide.utils.messaging.MessageQueue; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; import org.opengauss.mppdbide.view.core.ConsoleCoreWindow; import org.opengauss.mppdbide.view.core.ConsoleMessageWindow; +import org.opengauss.mppdbide.view.core.sourceeditor.AnnotationHelper.AnnotationType; import org.opengauss.mppdbide.view.core.sourceeditor.AnnotationHover; import org.opengauss.mppdbide.view.core.sourceeditor.BreakpointAnnotation; +import org.opengauss.mppdbide.view.core.sourceeditor.DebugFailPositionAnnotation; +import org.opengauss.mppdbide.view.core.sourceeditor.DebugPassPositionAnnotation; import org.opengauss.mppdbide.view.core.sourceeditor.DebugPositionAnnotation; import org.opengauss.mppdbide.view.core.sourceeditor.ErrorAnnotation; -import org.opengauss.mppdbide.view.core.sourceeditor.ErrorPositionAnnotation; import org.opengauss.mppdbide.view.core.sourceeditor.PLAnnotationMarkerAccess; import org.opengauss.mppdbide.view.core.sourceeditor.PLSourceEditorCore; import org.opengauss.mppdbide.view.core.sourceeditor.SQLDocumentPartitioner; @@ -126,12 +121,9 @@ import org.opengauss.mppdbide.view.core.sourceeditor.SQLEditorPlugin; import org.opengauss.mppdbide.view.core.sourceeditor.SQLPartitionScanner; import org.opengauss.mppdbide.view.core.sourceeditor.SQLSourceViewerConfig; import org.opengauss.mppdbide.view.core.sourceeditor.SQLSyntaxColorProvider; -import org.opengauss.mppdbide.view.core.sourceeditor.AnnotationHelper.AnnotationType; import org.opengauss.mppdbide.view.handler.ExecuteEditorItem; import org.opengauss.mppdbide.view.handler.HandlerUtilities; -import org.opengauss.mppdbide.view.handler.debug.DebugHandlerUtils; import org.opengauss.mppdbide.view.handler.debug.DebugServiceHelper; -import org.opengauss.mppdbide.view.prefernces.PreferenceWrapper; import org.opengauss.mppdbide.view.terminal.executioncontext.FuncProcEditorTerminalExecutionContext; import org.opengauss.mppdbide.view.ui.autosave.AbstractAutoSaveObject; import org.opengauss.mppdbide.view.ui.autosave.IAutoSaveDbgObject; @@ -140,8 +132,6 @@ import org.opengauss.mppdbide.view.ui.terminal.FuncProcTerminalResultDisplayUIMa import org.opengauss.mppdbide.view.ui.terminal.resulttab.ResultTabManager; import org.opengauss.mppdbide.view.ui.uiif.PLSourceEditorIf; import org.opengauss.mppdbide.view.uidisplay.UIDisplayFactoryProvider; -import org.opengauss.mppdbide.view.uidisplay.UIDisplayState; -import org.opengauss.mppdbide.view.utils.IUserPreference; import org.opengauss.mppdbide.view.utils.UIElement; import org.opengauss.mppdbide.view.utils.UserPreference; import org.opengauss.mppdbide.view.utils.common.SourceViewerUtil; @@ -697,6 +687,9 @@ public class PLSourceEditor extends AbstractAutoSaveObject sourceEditor.setDocument(new Document(debugObject.getLatestSouceCode().getCode()), 0); debugObject.setCodeReloaded(false); } + String sourceCode=debugObject.getLatestSouceCode().getCode(); + DebuggerStartInfoVo info= DebuggerStartConstants.getStartInfo(debugObject.getOid()); + info.sourceCode=sourceCode; registerModifyListener(); setSourceChangedInEditor(false); setSourceViewerConfiguration(); @@ -1335,17 +1328,40 @@ public class PLSourceEditor extends AbstractAutoSaveObject */ public void removeDebugPosition() { Iterator annoIterator = fAnnotationModel.getAnnotationIterator(); - List needRemoveAnnotations = - new ArrayList(1); + List needRemoveAnnotations = + new ArrayList(1); while (annoIterator.hasNext()) { Annotation annotation = annoIterator.next(); if (annotation instanceof DebugPositionAnnotation) { needRemoveAnnotations.add((DebugPositionAnnotation) annotation); } + if (annotation instanceof DebugPassPositionAnnotation) { + needRemoveAnnotations.add((DebugPassPositionAnnotation) annotation); + } + if (annotation instanceof DebugFailPositionAnnotation) { + needRemoveAnnotations.add((DebugFailPositionAnnotation) annotation); + } } - for (DebugPositionAnnotation anno: needRemoveAnnotations) { - fAnnotationModel.removeAnnotation(anno); - deHighlightLine(anno.getLine()); + for (Object anno: needRemoveAnnotations) { + Annotation annotation = null; + int line = -1; + if (anno instanceof DebugPositionAnnotation) { + DebugPositionAnnotation debug = (DebugPositionAnnotation)anno; + annotation = debug; + line = debug.getLine(); + } + if (anno instanceof DebugPassPositionAnnotation) { + DebugPassPositionAnnotation pass = (DebugPassPositionAnnotation)anno; + annotation = pass; + line = pass.getLine(); + } + if (anno instanceof DebugFailPositionAnnotation) { + DebugFailPositionAnnotation fail = (DebugFailPositionAnnotation)anno; + annotation = fail; + line = fail.getLine(); + } + fAnnotationModel.removeAnnotation(annotation); + deHighlightLine(line); } } @@ -1361,9 +1377,23 @@ public class PLSourceEditor extends AbstractAutoSaveObject new Position(sourceEditor.getDocument().getLineOffset(line)) ); sourceEditor.goToLineNumber(line); - highlightLine(line); + highlightLine(line); setDebugPositionLine(line); } + + public void createPassPosition(int line) throws BadLocationException { + DebugPassPositionAnnotation annotation = new DebugPassPositionAnnotation(line); + fAnnotationModel.addAnnotation(annotation, + new Position(sourceEditor.getDocument().getLineOffset(line)) + ); + } + + public void createFailPosition(int line) throws BadLocationException { + DebugFailPositionAnnotation annotation = new DebugFailPositionAnnotation(line); + fAnnotationModel.addAnnotation(annotation, + new Position(sourceEditor.getDocument().getLineOffset(line)) + ); + } /** * Search for any annotation for given line. diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java new file mode 100644 index 00000000..e0a6e7b8 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java @@ -0,0 +1,103 @@ +package org.opengauss.mppdbide.view.utils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URL; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.eclipse.core.runtime.FileLocator; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; + +public final class ExportUtil { + + private static String outpath; + private static File file; + + private ExportUtil() { + + } + + public static String getPath() { + return outpath; + } + + public static String exportReport(long oid, String index, Map executeSql,Set remarkLines, Set coveragePassLines, List list, String html) { + URL url = ExportUtil.class.getClassLoader().getResource("exportTemplate.html"); + Document parse = null; + try { + if (null == html) { + String path = FileLocator.toFileURL(url).getPath().substring(1); + file = new File(path); + outpath = path.substring(0, path.indexOf("/")+1)+oid+"_"+ System.currentTimeMillis()+".html"; + parse = Jsoup.parse(file, "gbk"); + }else { + parse = Jsoup.parse(html); + } + Element data = parse.getElementById("data"); + Element datatr = data.appendElement("tr"); + list.forEach(item -> { + Element td = datatr.appendElement("td"); + td.text(item); + }); + int[] begin=new int[]{-1}; + int[] end=new int[]{-1}; + Element excuteSql = parse.getElementById("executeSql"); + List val = executeSql.values().stream().collect(Collectors.toList()); + for(int i=0;i { + Element tr = excuteSql.appendElement("tr"); + if (flag[0]) { + Element td0 = tr.appendElement("td"); + td0.attr("rowspan", val.size()+""); + td0.text(index); + flag[0] = false; + } + Element td = tr.appendElement("td"); + Element td2 = tr.appendElement("td"); + Element div = td.appendElement("div"); + td2.text(v); + if (remarkLines.contains(k.toString())) { + td2.addClass("bac_remark"); + } + if (coveragePassLines.contains((k-1)+"")) { + div.addClass("bac_pass"); + }else if (k> (begin[0]+1) && k< (end[0]+1)) { + div.addClass("bac_fail"); + } + }); + } catch (IOException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + return parse.outerHtml(); + } + + public static void loadStr(String path,String text_description) throws IOException{ + BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path))); + String[] split = text_description.split(" "); + for (String str : split) { + bw.write(str+"\r\n"); + } + if(bw!=null){ + bw.close(); + } + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/icon/IiconPath.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/icon/IiconPath.java index b5e1d7ae..739bbd2b 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/icon/IiconPath.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/icon/IiconPath.java @@ -979,4 +979,10 @@ public interface IiconPath { * The ico breakpoint arrow. */ String ICO_BREAKPOINT_ARROW = PRE_DEBUG_PATH + "debugarrows.png"; + + String ICO_EXECUTE_PASS = PRE_DEBUG_PATH + "debug_pass.png"; + + String ICO_EXECUTE_Fail = PRE_DEBUG_PATH + "debug_fail.png"; + + String ICON_REMARK_COVERAGE = "icon-remarkCoverage.png"; } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java new file mode 100644 index 00000000..ec5050bc --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java @@ -0,0 +1,128 @@ +package org.opengauss.mppdbide.view.vo; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.opengauss.mppdbide.common.IConnection; +import org.opengauss.mppdbide.debuger.annotation.ParseVo; +import org.opengauss.mppdbide.debuger.service.IService; +import org.opengauss.mppdbide.debuger.service.SourceCodeService; +import org.opengauss.mppdbide.utils.DebuggerStartConstants; +import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; +import org.opengauss.mppdbide.utils.vo.DebuggerEndInfoVo; +import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; + +public class CoverageService implements IService { + + private IConnection conn = null; + + public void setConn(IConnection conn) { + this.conn = conn; + } + + public void setRemarkInfo(long oid, String rowLines) throws SQLException { + DebuggerStartInfoVo startInfo = DebuggerStartConstants.getStartInfo(oid); + startInfo.remarLinesStr = rowLines; + DebuggerStartConstants.setStartInfo(oid, startInfo); + } + + public String getRemarkInfo(long oid) throws SQLException { + DebuggerStartInfoVo startInfo = DebuggerStartConstants.getStartInfo(oid); + return startInfo.remarLinesStr; + } + + public List getCoverageInfoByOid(long oid) { + String sql="select * from his_coverage where oid="+oid+" order by cid desc;"; + try { + List res=this.queryList(sql, CoverageVo.class); + res.stream().forEach(coverageVo->{ + List toRunLines=SourceCodeService.CodeDescription.getRunLinesNums(coverageVo.sourceCode); + coverageVo.totalLineNum=toRunLines.size(); + coverageVo.coverageLineNum=coverageVo.getRunList().size(); + coverageVo.coverageLinesArr=coverageVo.getRunList(); + coverageVo.totalPercent=Double.parseDouble(String.format("%.2f", ((double)coverageVo.coverageLineNum* 100 / (double)coverageVo.totalLineNum))) + "%"; + //if not remark + if(coverageVo.remarkLines==null || "".equals(coverageVo.remarkLines)) { + coverageVo.remarkLines=toRunLines.stream().map(String::valueOf).collect(Collectors.joining(",")); + coverageVo.remarkLinesArr=coverageVo.getRemarkList(); + }else { + coverageVo.remarkLinesArr = coverageVo.getRemarkList().stream().map(item -> Integer.parseInt(item) + 1).sorted().map(item-> String.valueOf(item)).collect(Collectors.toList()); + } + coverageVo.remarkLineNum=coverageVo.remarkLinesArr.size(); + coverageVo.remarkCoverageLinesArr=coverageVo.coverageLinesArr.stream().map(item-> Integer.parseInt(item)+1+"").filter(ite -> coverageVo.remarkLinesArr.contains(ite)).collect(Collectors.toList()); + coverageVo.remarkCoverageLineNum=coverageVo.remarkCoverageLinesArr.size(); + coverageVo.remarkPercent=Double.parseDouble(String.format("%.2f", ((double)coverageVo.remarkCoverageLineNum* 100 / (double)coverageVo.remarkLineNum))) + "%"; + }); + return res.stream().sorted(Comparator.comparing(CoverageVo::getEndTime).reversed()).collect(Collectors.toList()); + } catch (SQLException e) { + return new ArrayList(); + } + } + + public void delCoverageInfoByOid(long oid, Long cid) { + String sql="delete from his_coverage where oid="+oid+" and cid="+cid+";"; + try { + conn.getStatement(sql).executeUpdate(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); + } + + List historyList=DebuggerStartConstants.getHistoryList(oid); + historyList=historyList.stream().filter(a->!a.cid.equals(cid)).collect(Collectors.toList()); + DebuggerStartConstants.setHistoryList(oid, historyList); + } + + private Boolean executeSql(String sql) throws SQLException { + Boolean flag = false; + try (PreparedStatement ps = conn.getStatement(sql)) { + flag = ps.execute(sql); + } catch (SQLException e) { + throw new SQLException("sql execute exception!"); + } + return flag; + } + + private T queryObj(String sql, Class clazz) throws SQLException { + T t = null; + try (PreparedStatement ps = conn.getStatement(sql)) { + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + t = ParseVo.parse(rs, clazz); + } + } + } catch (SQLException e) { + throw new SQLException("sql execute exception!"); + } + return t; + } + + private List queryList(String sql, Class clazz) throws SQLException { + List list = null; + try (PreparedStatement ps = conn.getStatement(sql)) { + try (ResultSet rs = ps.executeQuery()) { + list = ParseVo.parseList(rs, clazz); + } + } catch (SQLException e) { + throw new SQLException("sql execute exception!"); + } + return list; + } + + @Override + public void closeService() { + try { + if (this.conn != null) { + this.conn.close(); + this.conn = null; + } + } catch (SQLException e) { + MPPDBIDELoggerUtility.warn("close conn with err:" + e.toString()); + } + + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageVo.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageVo.java new file mode 100644 index 00000000..36e20b69 --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageVo.java @@ -0,0 +1,154 @@ +package org.opengauss.mppdbide.view.vo; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import org.opengauss.mppdbide.debuger.annotation.DumpFiled; + +public class CoverageVo { + + private final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + /** + * 存储过程key + */ + @DumpFiled + public long oid; + + /** + * 覆盖率报告key + */ + @DumpFiled + public long cid; + + /** + * 存储过程总行数 + */ + public int totalLineNum; + + /** + * 执行到的语句的数量 + */ + public int coverageLineNum; + + /** + * 执行到的语句行号 + */ + @DumpFiled + public String coverageLines; + + /** + * 执行到的语句行号集合 + */ + public List coverageLinesArr; + + /** + * 总覆盖率 + */ + public String totalPercent; + + /** + * 标记的行数量 + */ + public int remarkLineNum; + + /** + * 标记的行号 + */ + @DumpFiled + public String remarkLines; + + /** + * 标记的行号集合 + */ + public List remarkLinesArr; + + /** + * 标记执行到的行数量 + */ + public int remarkCoverageLineNum; + + /** + * 标志执行到的行号集合 + */ + public List remarkCoverageLinesArr; + + /** + * 标记覆盖率 + */ + public String remarkPercent; + + /** + * 结束时间 + */ + @DumpFiled + public long endTime; + + /** + * 执行语句 + */ + @DumpFiled + public String sourceCode; + + public CoverageVo() { + + } + + public List getRemarkList() { + if (remarkLines==null || "".equals(remarkLines)){ + return new ArrayList(); + }else { + remarkLinesArr =new ArrayList<>(Arrays.asList(remarkLines.split(","))); + } + return remarkLinesArr; + } + + public List getRunList() { + if (coverageLines==null || "".equals(coverageLines)){ + return new ArrayList(); + }else { + coverageLinesArr =new ArrayList<>(Arrays.asList(coverageLines.split(","))); + } + return coverageLinesArr; + } + + public CoverageVo(long cid, + long oid, + int totalLineNum, + int coverageLineNum, + String coverageLines, + String totalPercent, + int remarkLineNum, + String remarkLines, + int remarkCoverageLineNum, + String remarkCoverageLineNo, + String remarkPercent, + long endTime, + String sourceCode) { + this.cid = cid; + this.oid = oid; + this.totalLineNum = totalLineNum; + this.coverageLineNum = coverageLineNum; + this.coverageLines = coverageLines; + this.totalPercent = totalPercent; + this.remarkLineNum = remarkLineNum; + this.remarkLines = remarkLines; + this.remarkCoverageLineNum = remarkCoverageLineNum; + this.remarkPercent = remarkPercent; + this.endTime = endTime; + this.sourceCode = sourceCode; + } + + public String parseDate() { + Date date = new Date(this.endTime); + return df.format(date); + } + + public long getEndTime() { + return endTime; + } + +} diff --git "a/information/datastudio/DataStudio\346\226\260\345\242\236\345\212\237\350\203\275\350\257\264\346\230\216.docx" "b/information/datastudio/DataStudio\346\226\260\345\242\236\345\212\237\350\203\275\350\257\264\346\230\216.docx" new file mode 100644 index 0000000000000000000000000000000000000000..92cd323cac53b4d225a095df45623bb903f751ca GIT binary patch literal 260931 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 S?WlJd+rD<&j8|SQ zv9-WIo)k0jWm0M0i#N_N06ie6SY@==+^ZdG?631ocH1qRWgIe_^Jyd2;3`~}$+?zQ zUNUnB%4i=pwoIT6tQCOp3q=vgwg4LtkPZnD z5h)=8A|Me$vXv5gY=DA*h>;os(pw^gvIS|O2}nsI(jigGl7x8HzTDq`p6~l_&c(Ul zGCY|xYt8w-V~lqUt4Z#kDjUVT6AERL9`4Hr;gj%=Q`<6e^H!Yqk^S488uY zyzzAwu2o*=AVhc?;||z@>x$o^D06i)6Z5|S{cRI@_}LNF%6KLnzHDWoGm7ewEnmIe zT;oQ1%G~$dGUs{mjr2&zC8lxuQD(Zvi@e+4ioLRlk^Ii{;l7KV;mR5TUwBDpFl%=4 zH$rk;O@CYwv!8$7Xleg6+q(1YT#BRT>btLbO+D&AXa2&T=l9M?6^y6=9$YJoDDX@i zZwN=(147J*zj)q?giz(ad>;i$u__*8TU4HRX&Naq&W7?-fA@t@Q3|;3!NF zwQ9Rd;x}m0CN2qlM^@z7lkG5kJYNn_?8c4HI0A{J!X#aZ_*xUCD*C2`vi zBhrZ#ZeYh{{-tLtzGR}w*$1|NM2v0|7_Q8O90dAwR(lW6xKipybg73IQL{5*=%_!N z8?zCd`^5zTjV6g&qj{m2xl~GKG55vIMxX4n`=!DtJ zS6ajgI)EqjDE7n`qWEh^eV8eq0+~svVh=?OgiU%N?_%X9b#xV=67QkqsA$JMO%?`Sia1^W0T)UoyIF z;-h(%&3XnTW@ayRwhSR_p;Rr88jw<1=5V(?mj$*7!RPsoq=OJ!W0gXxK#qqfuOg|C`;ewS>>jmsF zo;*SpqY4ah&tQxIsbJP3?~ru=I2V@*Y*)t%j5bu_#o$LHJ*H9Sp`_k3H{LGaPSX+bOcRdvi%D6Wb+UBmU=%xi zD$MlCkGJpez3|HXd@H@pi%`FbZzNcZoT_Z8913=@p+p&*JJdzB7}z$#k+A9Q8`V}* z7uU)HeGV8;H3mpa=r!LntE(l(F7lXPz}4E~?kEUtg*9?^=iB=~bGuBS9MzQ{jF|~} z+6?;jVi&x^yKxi}Za@4l|V?2}Q-NK-9j427|?CqI=Tjk6VT7)FK|2kMrdSU(;(uKrP4`7aRj{aZ0CAn;7H%+48h+F~xm&?T{qr^-B%ZNndGu4#B?I${qGkBUn7 zkx5Ox9`0toH_NU-*-A3*Zedb(RtMMU+N~Tzr;FY$Vs@vmk!75AVU8N$6fLotBJGF{ z6>+9YvQ1Dg8KvIuG2N-xZA>L@e*bigqsJL={SqWUVHU5S@_-tuhc6X9J%Ti}DM0MO zsDR%(7CQ=+$FQ`!uyX5Na{JAj^c1AWXTyEUcdyt12k!kPUZP12Kk_E!~;}eRNX^p5J3^R%7PGd zaT5+(k9VJt_(%O`1b+$mT1Q<5D{hZj^5Gdzi6m-u5QzHP4|;J1ff1$^R2pMEz_WU7 zQqh=0{)=Z=1zhdSQY4k4Z0l_>5hbQ7Y5g8+rb zKIHNKcE0*>GkFzq_@Bg8nlTDN{eJq*&`oX-X!Ln&-mdX`*uwE4=8v`8-&gXJM)X_d z%&IFcK9{;^E+d!jy~1)DAtgI5UG^#+c;$4#S|ikkq;6Ig{d1(vp~G=^H*$MSvcpIu zIYT3x(FmMYQIUN?F7_E0>9i|$xIkm&yGSIEE_1~(VuqguEw0@C&_=A_)1T*D;0plf z`660e8+7(oFwjC;GRWJnE0LBf4%D&la~U=TrT^TUyt9n;w7e=E@ajm|hKg3_$?;48 z7mg$=^Px7+f(b{x2;@1aR55U=iYI{kfqK?Te<+?f=P`wvxQ|bx&Xyu-=Q8nBzh#2N za$Z$tT=P|qq$RLi2&(%mIT0(McbFK$9>jAbVyIHp{rg;jJdke->!0Yc8m0QJi=z}3 zInsGWz!0qp40pjXhIfp=y{_{-JrwRkxVHOsn0o7%z~^;0Yke)mmd$Qfxa&rs%H$t| ztl@tkHHx+7m8yo^@BOAj_RDQ_Qra_QL}+MuU?D7_Y__337oBh6^CbH!xU%;;;8=-> z2bE(>p!$MYqFstABSC`GU=E!Om{AtU^oX!;l&-D4^6i&^%V@J+RFS8<$R&Br%X%H{ zPetID;L+1g&1$cx<8J-+(*bj8MOP5b?N_9fOgnW;>N}>T{LGHkzbL-o42u6=HGFXg zVd%|mnpAQ)62KNSO1wkRi}uCw-Dl6|A2WlC9=o?=w2^Q5PW-~6Q*UwOWBiDQ1Mv}U z5FPL=9qP@-R!pB{gZuc$SY$XCML9O87f%`FfxT_^=77pv~?zgV025~4Wl$c4|goviRyxPf{s`phjiN|ZIt7{%AJ(`%9*iV-| z9(P#n*0nTU#~XrKJBjrTA3I>$_8~T7c7fxU+(4IGcqQOnGet%9<1$7zJ&F!29yYp(9_8A4jQL4oSv2Niu2}`(CuOKtpCl{u)UL}?+v&u^;xyOX zKUEFyqEk+`M_X%4^p>!5HB$;)G~8??74RP%^Nm>A@xg{K68o}9=BgPde5LLVmvkOk za!wWTEGf3pQyc6Uq3z0WSRW{Q03OBY6`|>8-0BKS z5Yd)F4t!7oj$y@8&T89AYj10X2=8$e)2#Pbx27j{fXa!TDiK!^0&;c!XhZ?@_K z8_V(}%kNUnP3+C`;>`y>(Tan^bDj!%&mUjbpu-RTd2|2Y#`}K{J1)0VbSuD%4HOSP zv&*bYwZ(70dd~Vp_I>KSW$Emsb0E}1ts9}~oT6$^sD5;>P%d1Z6x}(eZrb7y1am~z ziCBuATFd+qD#1JKw^g4p!@9POfbaz`m+&mX7&&{igl%me6S6ACq>8z^Vuz^*!$1!_ zbkZb^qQKEFHA!aQ(h;qx7`{mb%!$Z|>Cet&f{uS5Q4H5iI~cK9ZMe~nSe>c7&GtCQ%dUQH+SF3lER z`+E$GE)I1VtWM6Bm*jqYGaL>Vaq(1cNC`#YcOa|F+&}zr5>#J_#H+0JHYmZFdN`~< zRq;5`^$$&^+IAmIcj^M!7lwz3BNc1`@OUGyGS4Nx3gG953t{!T&?F~Jam-+etKq~B zl-NoZydMlSh~nA-V}$QtoWWj6fDtL7Q)+dhFs=(t?39fhDPi0*Il;W6>+gF3DjMRZ zFXwdE%_PL^T$gXX=B=e0u0{4~8fhB1aku-3E_atJ)r<2D3Qn6m`wV#*nq3yz&6IM6;jXC)Qe$}H+kzjHmH&At#{xT0n&P8gRE#P&gIaerZz_}wr7=-?V)tOlWe z>klc~fHjkP1pRHYV?u(^99n{LY5?5IFjvRQHgJN-3=@&TJJrz$MszCSuj(dr{-0qY zL*lhTI;7EvdE8AMKs7T3>OGT)mFA2#aY8>t_Ty)FbB!*8Db_e~j9TLxkUs;cOj`(A z$DIRhm)PsEY<8&$L;}}o(*o>OP?3d!Mu<_LarOf-?e{eec&8?k3+L)$ph3ZDGL73S zg-8};VlP8F`yI~(2<4s+z^YXbVkE)p-H~HDlY+f?wQzYN2OOSMC<0UVw%c_?77MR) zgz%>^T1<((fKZpG?2v9ljqMTi_j%K*>IYgTp6nUkk)ExWEdZPYu9>i^#}33;%z79u zpk-(Ta2SnThOW__NtqGD$nwt)Ag%*(;j@zvv4BPiFsxaF-p{m6F_I_OQnngn4gVOt z^G}@nuD9k64rop5io)nTRD{?{#(p}tqHOq#W1BW_?ZkZ5CI8fpXhVbuEjbj&5j75X zc^3~q&+vGJK8;m5n0|q)0agfZU9!A7h3A7z(fD|w^Tg*jIqbHt;c8t{$9$1l!>uFV zh>y}W&c~lW`>9fDnc*Z9NAvcvXhd5+ef>+Imb~hr!++!q0geWP&gp9W5jr?Qtn3Ab z3}%3Cd-tf1JzTbicFW7LvS9NRS+}}}eQ7qf7I$o&asd64atdwEm?})`n5J@c7y+FO4R}`b42M9hy03ou|?N zyA{Xm$2CMElpVVe%xbxM^`HShvx7P=y-M~(dMN}>TFT{3sMZKGCGQ**I?#(TP{fYn z4jLJMxOw(x*Fy?~g{wZFGNwX|?KW~^8kwo+eUE&SrXxGs5gj}GI7_W= z?enz0nsm#6H?dzq?%Wzz6Gq)R;EJ2|q5cv$R={-u#i6g$@%(*o(7d#pZ?OrTl-Wug z0tY?}+}T2_54jgH{+zrR@VFwxBYp=7vls>epQ|urSn z_}#ZyE#}jb<|Ax+{2^9;#%{0-GZ^9p>l*Gp^K(vAvu7F56P>e?%or_2NVss%GL}z^ z-_Ca{+ow$XLKy5nm#Ld~*k^z!{DWpma@Y2@9AU&4Cx=ZPm>tzN`WzseR6T#%u+Ui+ zbFH`!C6=&-`)s>a4$_;KH6?hWbzlkl92c;N+c;bSYBYOr{ELWBnY8|ic~);%NB{4D zAIMJg#i_|;6a5L^ZyfSUHWBSPi*cgsW{YXqmGUBD+MfV_1&9?)8^>Twt1|hA&Vs`h z7e`NT)Q5XBJItU3kfVGh6jUOtU#Nqzj1Z&Lu=3>H08N{bW>m?PKShMSQUy)|VwImc zakLA30>ke={sKq)MoV0K|L{aKyaU!5^ESIlwHO!EB=O5x4hA_e8{X)BF#QdIKBAWgL|D{f5t&@>YqXdj~4N2Ll}bB zpArpSKQSzZX;w#w<_8P}ZC))ql=?Y`c{m*yD9QJHM2c%S)p&8;>}0kBu7o<#h}iwT z49Y$Sdc&sK?UoWj39=;(3>^V6bYKp<2Y_!C0j(^M`x?#?$FmRV=_E&jVE#EJ97m#^ z$|j7fw%N)cz^JR?YL8o>kBEVy$`H?0w?WD$8O#h;wXdPpaP7xGzMF0><$u|Rfz@21 z;t|}wMc8~CPjfanZTb}ZTd5aQ?2^@}9`zu<|1SJ0iy&H_7+pMte)DZyZ++ER6i7qt zTgWmxhs+BcQsIcDe|1o`+%3!1wvtL{wck0%Zo&9Ur=eiAikT^gLR0R!56M4c760go zEij)f^K}7}s)d}KIvDr91f3TXt`9I7#fn}KIbdhnrQd#`FHF7DN~iH&`<3&BCFOMY zr}NM5+ogWpNXg=Zpz(iy1p~;?JJ3|mLjay*K(mse%_L{dZKq)Oqv36lkcUPnh6V4y zYzWx#%p5TaES>sT3S4LK5O`qbs*UL)24K#f!?>w{#BliT@0H)A0Ju#=WxV&woCReHQZU zehW(zJM-@Y=RfxXK)&YFL1HGDg@^-#vIy~f>2V|<3OMPsXK!$VQ}ueZ0_fKAosll_ z;eiIU3S_P#h0v}qx0_bhSQoST^5oF9t=c?PQ)Pzy0<-ojIO#eFrgT2xn(?&g!JFU? zEMoTo$!r;BAz=f=<#Ug5l+&u1E#g0Dl(T@7*IU*07Q=1Y{fWLfmi5X0_MPb`#h;O& zsB=rXyb{Iq5MQ@yX=1O)eObhgK_tD+&yW*#F0gYIkNUd2@O@F=-_gBU(w5<2u1|6i zUtnC&k#xS0RC=Mn5_&%rsxC27eFd$*bgYW+g{Mg^5I0W`~G8`s#Z zuN`*JCz=R`$u`LL-R=LZ0to*q5;WP8Tl2sOCt@r7ABla3v1I2K1p+AR=W+J7=9&!M z1cC!u)>ud)Z2pnaA7DRHBO?D%Pt)Sf`!T-q)qM16B-Xwa2dbKBhT$DkEoqgw2VQJ) z95t9q$PdOC|QaTqaGIPT5PDBt=e;Lt{`QR=Wc&nRr?L1$HeWBKE5 z&R^U#s#R1Cf%j_Cj(1uKX3aTz*|v4RIN;|RP;>5Gh0YnvYBT}wZB}DBPLea9oa66d z{V;0cS_$PcO6~dm9p5Zt@4hHZOg}BIBJ1w4zfG5DNz;5JVQ~g1AVy^W>(?s0w%NrWjpcPI`=A^O@7oYJ*~*@Ut!H6CZHb> z`;1UzbZyraPA*9ZzZ#Ac0xEc>^k$Eu9;r9T9-MN)7i5-WRt$Q*iwvkiRu3_#3b20m zGB`(Tk|zeL8wf0eI3tk~Xbe{R%K{8aoB1sODi#*4*)?XOKE^)|PV02FP6Uye1gX!c z$h;Wc{zIs`AAs+YF~qC|Ztcmk*fA>IdW;^-_8qyGg%!A~FMPMl??JR^kRMYOa`Wzm zFJ@Qch$)??Pb~q)n|R^R4{jAcOvmU6CG-2cG(vW#bb@E%b}stKmN~L3``8;kqR!`q zt%0^5CZI82>E;RHsj9FRij~fN4s}(FbE$Qwa8-$fT%ARNy)_{- zxp?oF41S$OFXQg>1{PfA*fnQGoN5l*!U(?v_3V>(<%ymb4$2S?bSOBjZy=-Q?Br)= zNz%A@Uwy=J#P!NsZ>yXU41Rt7-^c!cR$l#JRXIsT0Ko;;p{lVwC8n15hi!^#HZv^J zFM+htF9uqbODw~%ct0j#AG)9eM#cwfdyj=52=`DNGkqV^K{-*!QG6EhHdSTm2uQ7l z51W_(wCezw1L~g%4AZ=}^%zgZK_fq=?ZIAVu%tWsD*$(32Q@Lp>`}o7kS2;FC+eHn ztD~{o4hg|1dp&*-=NL9KDdGEzs7$)yrafnA)eSN@doLSeD$o z;aomUl(Mn0)V5Z4c-rhIq%-lqx}cZ4-hAOhoS-3Eu2QBofMk>Tk`hA8k@&5?WF{`* zBN2{3--0}Z9Hv}!wY`HmYS8|2!{go>jX_*X+|4edP89Gbhr&_4P}}dyL#jJ_O@U>Q za+j)Gp)pet9TTdLw2fRiJ;;m#9pmSeiI)U z0j7=BOkF^Z!88jeZ&gs>fDhDvBNRH(z#O&07bf>oQon#A3FpGpTtyO8R^!`Y^5*sA zb4)qQ98q%2+0W^=XL`Ojn-5p&snPZ?JLZepD2Wp39+~8GX%l<13?C*$)ZDxFQyla`n;Ik8P1_}9QcAY?B(ua{kke2BQ z*{BkJUg>_+=IyzJxB=U_ex@*16aw+KHSUvel{jB3Ly(@ zJJbyu8Q)7}Pb>wCxY{zNBw^K@1H+O`Ib^Njt3wmSmeJ(s=&fkW^U|;QR%HG(MF$kD zPqs}TWM|T*uF7Gu`rD>(9awFI7}8T|Xk$H%D$YL;&{Mv!6)^#}5n)BpYNIHvk&MbB z!2EI&6DNT%^?J87>d=A7eJ8S22{aJePpd!{dfR4T+q*JxoWqiKB*lwRw(?~d27sb^-pyV zkZ2C7=r=oT>aDrt8jypz%Uw+ai`0`2NZMDW z2|7Q%mK$*pJ4QVO1iYeFW7CdZI_-1J=48C;o<|&=i=CtSR$`AH#9>-*Rq*y0RY_*r zx2eJ?=LHGvbeae4;NoyWVw@ZS54c&1aA74WizOv*E1nk!9vv;blBvgW9}Hh|w0r&K zLBOR>tv+p?&4~ZN5}^Njn#l8cZ6I7TlLBdz0mHc7rLxN`iWWiLZ6LGOvEVDa6-Loa zYW(ybj{Xw{A#Mj0TFel3z>eHj3e-4pHtV)j(xVGt%lCSj3Q!kzcz^PWYR2D-k8N>` z&zl~91i!4N0)J`|y>K#x3A<&A+KiU!(&(f0Fx?{G^!JhV1RzD^^XdC?8T#)u4i)o@ zCWxnXzw?}gHy3{l65&g{p)J>DW!Mkx-`dR1zpA=pu4Ncr(r2|NT=qu6W@1xk)5xGh z&V|zM!c#0k^{#Y2nEd=-yBR=)WjiU~kt+tYzQ(B5v*-U>d)J%`{SC-=S5&oznz8#k z8Ym)5c}H*2@8o$<2YC+6)jidyKskrdeDv`N+B@LUfgs*xWEpa7LT!$606T^_NI4Hf zEI=h~X@p1A$?4x4#+sol9gtQ%xUxBAZZmS{4)}P|KOZnrN1vp%4Y~(#c=y3zy4ThZ zyo=5C3y3ow7D0HIA<~^=IFwLw@ae)=RtrOIk9$gd8t#Y4&2VJq?W^B6_myjdjO%GJ zMTt^Ed)t{0Oz?DO+#TT{98*u58cM0(y8E7tSlTBA&( z_yEt3mC5dpjW3wBvO@d@)OFOF>|;;%mM?h<)_UyiAK2_a(-rY{X&s^(!gT>k{{S*M za8r&4zU?#S0GrC>C$c-Y6l6N&_yrsr4@f&jfSpHJHHwIs{W^F%Y0_dq_m_ZVw_dW9 z#roW^?z#jJ<64nB$-Nl1Og_)o;4s6l&zO9ypqk}EI>!DsY0#)y1oB?c+rBy8b?Z15 zk50)b*LleP{%O&#Tvby1IRi0R$x@#BKdw2U6E-{ufW(QS34PfXRtqK|rpnBX1u@kIm|W>BW;+ z3MTz#98m3{?!TVO`0ai2VW27Af+Lxr5?3MAvTsIU{VLs66QNGj z5gjj4V~ljf^R~2;Bv=?R_0t(ZNIBU_9lYshzqpSECf-dkE(qz#-u7@Y(^B@RTU8-h zek@4}`*N&-)yw7luk8WdiYKAW@+!_d+6P5dHl%Ib=x7O=%v8mf>E#KcXWApXQnlZ( zu{GT5{&E)hw(V(|>LKOfn!u}D!HsUGZ*oLw5vgIxQEsQQI`~uH^2GizQB1|2*ahWr zcY>4U_)X^D4P;1Wj{+c$O}%z(_r7o&D!=RG+x zwA8B|NtuSD#PTIlIe@dT9$GUp5Cv%>juTXRafECxvvF_s%c%w1_>+^IQ2CTXolSCr zGVMWV_&v(LE_(h-sG8-4gNg?yhZ2j^tB~EYOR5%WW7R2VB zyMM34Ov~^_H7w{y7WW{@5I3ay-^=UtX+t0x$LNQE@JLo1sd{2lgp&-p%*sb<(xxw$?u(}E>yEMLl(CPE6w1-dhJiD`oNGXusxL2TQ z(A^iu7*(`??i}n?fA0sbvh(9db!A)`JUhMk!dk%veUdV+`M=}afMF8Y@h8o4RCkr$ znS%~FIuH<;bRlolPyzfA+(MuWD8mISoL)sLeQX`_-;X1T_!|OHE^!z~H@uAl-h*24 zT|sbPtQ`0!Iv_jpPT(lmg=KxG^#8U#DD#*dnBP-_;3*M)3F!XwJrVzVv!Kj+ zBMUIYaq$WG%k*@CE*nzdx3K;H>0Tv)KmY&riip4}hs#i18DVeR0Ypwgr@o>HJ19FO z@b=ht$d{=pM1VnAj~{VS&Lh^qFpX6FW#tL;eMN1q*YD@Q{9POztXoM2B|YYty}R#> z)B{0Slzs{ki@l{cV z_sL9k%tbMtiPYc<&%mo_e4+7vTKJz@dLrYW0~+J{3X0vwU5`$nP_8TVOM`(rL~9gJ@hyoyI+MUa)`E1%7($EVUqv zpY)R~f2-M+X^60Z8HM0`zORdVKg2EZHRBakMJ&CpEolW8t+$jh=BZsaR<)|rj( z=FfkOrJW-$;Zk`{Z2pild*%_w%g3al7lP+&R* z1g+DYvB&7V%R~!N{k%hK;p+$eDQDPvFUP8ly>C3D=|}3PN1&LFBQoakmq;S;k!lY) zCJKdEymEZ$Yo4~t z*ZbDyKjRj4!nw^A0XsF?PW@5HAZ(Bm=M?!=dG=3kCuF~g+#*Ghn%%`$8#-;I9_?@MO@;e=3fpyF z12N3?-vG(!Dq--`W8(d0kjJt9%b@COr1{*f+TiN2j60i)F{iR2$?|So z!KIlAbnxZj8K4hRHNOyw&rc}8vo%kqs`jXR70rL~x{`a+=}56-N&)}9#=Yl7>O<)k zW_Ffuy_|>VGhHIj0#1g06d z$kq3s)}V)JU2V@33nR;aHh<$kp-4ba|5nLydhU6mrjgFONJJW9m|C6_#`k*6TZXEw zIC8r-^BIgrbhQqN4#fqEF8;U< zW!sQb4H|2UaV(u=oG1oEQGPZ{;3@wA`e`^BBe!s-JRt^m^aSvJVk0s*#Y79pY*UnO z;9UE@r2ho%@PQ)BE{wsbN1S$n`DRBS;u;xiF6`a7T%ZwBFk5cZu-unw`IxDwUnuLv z{`u~tEUZs6k$j5%m_O*a9_bWPNfgw0&N*G;j_eS2x>&{YP`e^)>(|Ykx9btIX^9L; z@t=S?cR7{f@t0Cyw7%*vvUS%2LLM!%<(hn*U0y&Elj+KmNx_~3f*F*|GIZz%m`i)G z_yjQHI2M){zhj)4pw}y5HW~&M`{+};BPD zUdNZbL)q<5%)Y{xD-5pp#jA9&ESFIB~1EFa4-pjw@r~?F#E+G~$3SV6;X-TBR6W?_y)+_dI4+HYmH^tyM|{ zX~?Q>bn%t=Yl}BIve1)id;(ZN6S|~3*@40Y5g&XDxnnJetDFqJbN^q zF)4xPpRFIncR0|+Y( zi@nKzQSw2@x{qwX&Me>bl4wF3|MXz_+syVXm4e+EhDX%(`b_ul!G2@arTvvtuwIqQ zT9JluD~qEwVijMEet0R?XCq=D)oD4iIurd?H5``@+0>)Fu#uYeL%fUi!x$N6)VdJb z!F>#~myw63APCh8D2Fiy=Ut4qHv=x_8LcP}->>(vkTMu--ICfiWxBZ?%e&;wfQSI0 zZH+#ZJX9e%_$s|xQ!`rAVkk`EoP3~0r--bB?Z5^KWvpagbwGe?@{%|KTiiMu2wGjl zPph#IUf6!HqT-E+n%WB9^GkAd|9#G&-3XlK=@@CP_dSy`bGX4w7iIo=sCq{4KvD4s zL6<gtk7`_==Y}Ay4R@$HO| zFpMZ;2VEw*;MmGk$_aT?8kZ{_lxj2k+1jf5hKee@-qYX_g+^5ZpO= zYssZFiS4c4?%3XJ)oxRFh*M+XvNMM(V~)6(s9*vm91#Uz;?_UkK z)_@42?X?W-Ym)eZ_L?ZJ>_$yZ^CM%MZ!Ehs`GmKrI`dhpj_#JdqXq(F z!(ool*Ajz*-40k0AMwy|<%^V)EI;+`nhSO%b2^(@-^2Zf;xtlg!9gEnAICys7ui4k zGu4{JJFP!v4@$EeZKmi^Z!vSh+;bSC>d_j+VVK)E3`q85I^#<37_!q<W5o^Y;Kep+bO% z(WP+QH*mi}D>&kEQoC+FEyc>6) zQH~%`I}u6i)e6EtIt-2OvlkUlHL}U^YkIrd^2SWM)+N_$+i0`SOLnIpO=*?iay9Du z{%HM9uOC;FcV=j_DNoWBDQ8Vc)Y0~9ZsG{$#Wx!VlBPVSE^ooJOLJiIzf*I+F(-Ew zAI#MwePg!Ioj3nJMjyTbqE7Pz9NIYb_j~5nUekvzgWsO9X|C-TKZmjE*^JQqI9OM8 zFR*^9iM&|~1mj~01YK$hGQnZhwqeyUMTuzk-nN|_>bRa}PwJIncbJC=YFWW> z?TZI;`!3?M`%i;|7LbY4WDsgvn)_Q7Svtu5a2f#Tta){R7`r>DP|2KNE+gztQ&xUO!~{MBe{aOmMoK+7DbJ zq5{#1NUCk@peAOw>l2v9Q6DI$ILhE_=VaPnucaQpGOCu)|u-_wFPWfA?(B78P@{}+>-sPmH__2!a$-!{QK ztdxmmPu<}!<|1nAeD4i(x-9Kzy8Lr{G?Wlp%SglSquERwgHZP+OY9FOHu!<1C5+o0 zYO`eD2?L*FY(e8!qzzT`45jiy1Rv5P8mVTxcPdXi=CU! zYsjGRxfIqc#o=h1QAHNG9Q%~$g3_L&+A597B~xb4EQX&K1|ju9!CBroc~vgse&f~! z)FoA^@Rjgtc+yI?l^G@*$Nk4a&nqh0p;b|AnDq6f_U%U?N0ckk9B-9C9QI3MFze~J z&9g3UM#FBWKmYsbQdUY*>v|A)L_@|k89|v$GfsTw?JU1UDno3DqS#u7+|s|Fsc#}o z4;NX5+p?!$JbnX5W_eJEMPEFl^K2h|wmvr@A9HSTOC)ep>WI~X;Kr5oi*}iheqJl; zlPol}XKL%Gs}B_|8a~c3Xzx25XKt4K>h>$&MTdK~8T!!CS6o}bF85XKZlC;$<#{}> zfqOp12Qv5ETiN%Si7F7x737Hn9*pSVHbuqCrr|KMq(=Z))?{}SqnNAk_T&=JsQ?*i z?1@pmh2U_pV4JjWTdQRoyY^8{aM`s}k4DvApFBI{iS2~!)f3sT+w_mRO`m(crjZ+7 zp7UVVR_M!TxaV$sj}`YeD2USu78~30%`QaF_^0V*ujorVXY>0}zlZGlm@sF4oDNZxxDZ))Liu z>+$(BG85)tuK1#8BCs!;h>VQxNOVByrDb~|Pgw{11s}uN54!g(?AiDuMaj}c`0LUu zCE2ztrlQ^ruoP@Nn<685uk&oI_mQU-rfS5%eLx{JX#H%_bXKFQFIeks8PL0@%9@ns zUP5m}W8ZrKhqt*W`;KB|Jp*6_+GkQ2$*`}dbt0bhCcs2~Sf^USkglf76=~QI^L82R z_@w{FKWx{ECp|1%zE|m5l(GJrmUe4l?Sq>?)Kf)$ z#og{}WbSlymdmF6{zC}V)H@|Jor!V9FB^QN&a7`covkWPeB}dsJFm>Iny1Y3)NHrI zm7GPu!%euNP~%3i)XJSgVUWwTK*?Hk=;jcf;a7av|A;s)ux(@FpG6%zGrj2jfpSnT z{EPnf&{77+!wq+PH;Z{e?^0=w*^vxYS8};((;sz*KPtf*b_skjPdB7o;7pv++3-St zX~X!;d{=kid|TDHf0i%lP>j=1b+TJnXN+~_@T`i$6?)%=!1Y@ymtM?WP1?y#>fIIK zCj?pAwql4M9dmqC+c803OC8^^H#Ob?pqV9c-+~S9$U>csb!&Yczj}TLgyB=Io$}Ty zCQ6Il`14L-IkkA%hbI@G zd=wiPKJ^q7J{)@Avo)@`jLTj5cIlVExDZ2{h$?dP@NYy{j~dw(pvPd3#!Ttez-GTR z8s}EY5hsvQZ`wq>NlW^$>1?m!(-Xx_KY~cdqaLdLp}CZ#uJcbh@01GKfZr%JbDWne zO{kxo=nO0AY*8=CTQ)FEHynryxM#yIm9p2ec8469U)B8~m#RBtlP1@Dp<7FD<<3wF zQM$3y9uhDeciJJa9wh97zFI#CS=Z8&v30_dpJOQ(wrv#E+Mf zx-iU!#4nkpLVe86_g$a_q-#GI*$Nx3Pb_lSO4o4wnp)6r|8}+aq5)#r@8A@5)o|>Y zjqNyNZ6YZtkgEVo@s^4%I8tk&s0^m^Tr~qn4n_-q31CS$0CWla(|=||4&*x4N64U) zspq7rAGnOA9ckQP3q#C(6&PW_Khn)B4f05EB=xARFF?1+46T`Ae{)hrT=TOEwvygl7qO?zjFqo0}2E^L52PTzURjpZTAjS zXGhK%Bref7zCAkg-`fiobN^mzRNxU@han{{Z{sF_0Ilts!HJSViOl&a{LXkgVnde% z!fK#`i1(JG^Y8t&1Ap@WtF=HuIAXREQC-+Y7?0UpJFRnSt~R8idkc1xfUxtQ77^yPr<&$VY~tWc*hGrWVzTcx{ir~%M8 z#G!Qx6yb@kKudPi8mh)%m1Y)e8>80~Nt+5P-?{KXvPwmDRn_nsM#l&iTKl>p`r2GVaY8=fDBfLVf?%IyLq$;T>Pj= z-fD7keSWTmSJnxiV3g=~WbD@H-5x_oMdqp=*ML7n*_Yg&S7kgEt0=)985w<81XxOl zb(*m^+ zZe&XXSGSceWe1Gfc&~Hly$LRJ1xX8JVY^$ z!)3`N^F&xpVw%>^9O*n61_BQwblA$zEJP?CjA=I<%`616Z3fnKqkn_QE-0R=841$m zB5ya;4^;PPowpyEAJJ|4)5ztudrdl}Zu7SGDf-6GBWDh)Je@U6zpDs$-t+u>*&dqu z*JCk%leGXc3mTVu_}Nt|kjWsKJ9{YE(>Ea!ON(rBhlx@3z~ow(Urmt;q7| zjtMoSxF3bO1y08V5KeDRTQXf=w%DJOx30XoUsU(~-rvghWDU=j3Uo(b7KmvT7+V0( zA$<45s{(t{{K$`yoIfv5{>jy_FElkp05+wV5uz}zV+dHw)VN#t|M2$SK~1Ia->@A4 zF(OSs$SNY8DAMby3kXOey$M-Fgb)Fd79=FA^d>8H0U=T&gb;xQlolbBRThyhK}v#! zDv3ZiLdZU6fA7rme!nyC_c!l6znLe@`2!Nph^(lc-4#cBI+LY3;8kYe< zX)Ve#`zhaqR}Yl2>5q_2gg!{RK*U_!{49W)FY)TjzXyDq^l0T&ee!{31j$So4*>WZ zqqI14Ca+IEJ#;Ny>A78njd~E_L(zApepW2VBOU@&OX-}I*9C5_v$`OpYz8;kE7xPL z01C;IRT%g9r+~6&K+%{* zuLH{J*lZU31U`d_7MA$H5*1c6jpM{t&gv7p)Nee=xcbaKY(YVZMYWLn#t*Iub@Hhe_c>l5SZft4Fx z)4_-Nm&sS-MD9=avKHTx<^K4nFV|i(T%tNrV^<_Rp6e0-uexR+JeCpIr~iqx`)A8w z*_!{9VtAqNEDZK%_}x+Aq?*(u4T*=Z*(>jfs=pG`^3?MdeOH`_>Zfeop9aHYtejtL z5>u#tcGC`3ths3!4nAX!Na9;V5}KEk?5tmc*E4N%9TX$Q_!R(IJCTPS?ts*u2w$- zanh{!HRoL$hrrO8Ip2iheFYb(`3j3hp)@^cvc9<-C^(>3Jd`>s$5BaZS3X~`Yl?d> z6UEz6=~*Ea!;;q6WLrog#gDVI+kar>%S!hHgU9vlMkI96b$ilMvw@tG@^nl+;qQHi z@9o9wY0329&NhP`*wdq?^mfHP=3J29(I za2|{|dEGi`jplI|wxxk=QEtEeXOol8fQxO|jzHuoirvsevS&YkHAX~SprqF%hUdWp z?G7gFbRMW12`Mo(^V~vpyQe+LDodX4gyoV9Irx)og+^u=$gq0Tm+AR3@K=3{-4+$Tdmi%M~MPh9gBxu4Z%pj_oY(#aXl@0 zhAZLzGO`)ECKI}Qjlp@u;MtFdc1jN|1S>I8xrJ`LRQ-5HYuc1ve_D$N?rm#9_ku$9 z&9|%8z1y7i9iv@DD%t5>pf?*2sMA;VSYpub2l*`vh*U!^D2gN|1m}D!*o6s3jkhzX zLni=)52rtohKFD#UmHWa)~x%G5dP)k^aYsklD?eEV=5F9R79JlS6NmtXN#Y=#7)g3 zQhZJVd7SNTf+SYzIf9H)>JvzgV9~5hhX}Ig+XW}iY+LnJ(vlmgd|6+=Xr^xRL0pec zeQ^xYYuUjh9aXpRO6=&Dp0^%Fi~)^zODx}n9^VGT_1de4GasvGyx9C{(IwBt)!oyb zQaer-9)7AUHpzY2NRlvBUvQ5v2<=u(Vzt;2@LV`1RtjT2OFO}1C z2feiO#qPL&B-eh3`TU_JrQ60iLu16J`vmehAGFrt3s+&y_FCFOSsE(wVS9}Kt~q9- zueH5Yhl@ztM9858LL6FhH{<}ONPbRwiGJ)>Gd;dL3a3%f>klThkR|D8owyv=;Z0TZ z={wEu_r~Yt*H0{$9^ph0*;5f7e23?N-&H#I*zD<1+6?sPVvqLG;Cek-U2l~hFx_!P zJ@A{c(eOZl4=o>lm;6^0^ADLPe+j(?%QH^M4+v*)IHv?~ab&K{6^>5?#oQbOZ@AGhdQVI!PAjJKpc0lG2*N8K}e`%^YoJK~7 z!;>}dwb%&>8)|gVzN<9ywE{O9m1Az873N+C-aizIz4qQ*3ggDM|5CxmOBRbFAVDWF z2ifqFc?D#TXI9c09~nGv2TLm=B-|Cq4s!LddiPp;CmG`GIRH@?e74P?Q=ujM?b?|g zbf2O=Cx9_{V51jj!HrHb6=MY(kwRTXUwEn5`r;$ zlL9%vq{bUJOgNxLUGt5c7zzCfbZ`XnS`JuP?Q|gSe6aB{;zXSci8T|#8?v6Xr)Fm= zxwJKpZXFDbHoZYd`*XutRu$|}aR7z@N;o`FPs<$gBF?S1Q=*YeO#0St&kEKttSGg& z>v?cYF1M&U_1E7AC5K`_ebebW$9|=2;$tOp=!o&$;?8^rptM7YS2{p`EIHayvi7!w z)>Q0}hGz$Z>GdU)M)LzHsqfq1{C}4|)zWi`Z}~Erz0M#(g!p=$oRE?lK70&!4yzA6 z7Fj%W+9Sx#*uFk~K?8DXZfOu78dHIm)2^sQ<3ALQ8CMryY#FVmPN$1mtq;@YvOrp! zDJ=4tJ5an3(2Y1g3s9_^xRAuUEs#hnHlp2b^DIavpBb0*>Y3NF++cfaUsfDGHoz~S zX6a41e|SuEaPYBpU9Qq&Ej{Uy=`=f1crrDuCFaV8U9{w9^m)iH)5FSY`kS^F2~9cC zQ&zZ7#lwi1s0WHImN9)#xallKIt4@OWZqD(q@u_s|sLCAt=;o$&I`bG@Jf)cYjXWTWpKdBR zr!0`QG3;Ga)6nP;3W%!v_B6-a>Cu;LbZnpTn~?naKY2SEZ}qZ3^Z?eZK2UIKQgDf{ z0?I+LHN+q;|Ez^H5YlpDRBtf)I#+LZ2`4`m5qEyu{SnCAd%-U=4FD)b^zuC=|yDThS9vZPrGF&=8lN~JB{=AA$k8X^ZsnFeW z3X9*ak{ll|?tH=v?tDw@$oYHU%hZ~yKPqA8StW6!PmbKK^Wdtky? zEzsH$!yf7@H3F^Bp(*Av4V?9ENP4NsXe8_yR`WdtYqL-|l)@LA&l1PnA95bvELPI= zQRo~GZof+MMh3QqWL3>Ad-5_-ai1)X;^(U@8bE?EELBkgu;c9Zck1Gym|fN%0An5` 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

-P&={Rq7niLvXIb)DWaId`s=HL#}p_r6TL@S4S4*)7LBXuS-*14 z3LXi>deQ9R1(FFR33SI>PcwB}kZx|zV#w@RwlL--W`dwmZo|%RbeO|D+J!A;IdIQv zQ*-O$lZ=H7il(-oJ!9I+d`R5sNQGpfO^AqQBu&E0NOhN14~9 zm9!FV9N%E>cNn?7SsA)GpwU;?SYtd=mePliP40QSQNLn+@~f*vm4m>12H&L_Idlwb z@V-+PdlFdS?6NwuSg^-M7JZbXL5fOyg`1#;)Ozx-RFKImP(vfdSd-t()iHiO#)LAjhu^()3Dd_{S|8;`6ioCwE-@74UJUcissoG6>NCqx z%=1~Oszpyda%Q=wyBF$#Sn||ro$kQ7$GWtUwPX4`9=D3BtmL8;m9|=zSeBG|?M6aP zAEoh27L}w*@v}PhAgJi+ryA7}qU5-?rJ7G=4oS_PUmw~tH4%5(H2m)EFuW@zz4uC} z@S_UXdKCrZ$cvZ^|GVaLd3WQ2#?@+CUoNp#WNk?a^c8ETaznNq#@erbzRHD*{k%-z)YY~7 z)-89!Mooo+S+QDIhMbEgZILo>SfZ+Y9Z*#qH;fbETBNpXuqYD1aruF{6r>2&FO)0v zdgm8KMb2b;upT)O2=6HsX&t4(jsb0KMAx2>a|_sdrIFgKUjoJR1DTgxX`?i>nK!Y~ z+kAIXU8DK2V!mQQ!?P;5;)tFL(ddnHqPisNjcp}S!>J;XF`VFaFHs#dx=|N*Fpt)G zx1l*pQ~!~Pxurf*=9;X-@O>ee(EI9HeZF34nHm^}mPxNkA-lM}vj_@Ev@s$9XEr5&do*GNlqQaP#rbMWU@bPj*PT0VkO(UO`q_+| zUaB0b#1#B89;s!EIN>G88}>el9anLEt3zl;8^0V&@5A-8o&Qk(QHsfP&$`3YNmFus7!q_-g=&41dOho9hxbh*kbj<=x2$CU3d)G!5j)X|@{kRB*76Lv> z(`fOEv$z77%)g1WH=cdh-y^eAuP3|(4Qd6%xkLx>K4s`ZGVr2w77AnHHWt8{B@=N& z%z6T6CPKlFfdZ$K>yw>O=wlflrHM#FW547MGSwF#RK2Oty^rD<-wG_)X)bua7ioFj zF+)lZ=K?QLtuatJ<@kL0vgMmsmK!aDsxNU*w51g^E_$FNG=xh~iN;L7CuN}!@vahK1zFoiBggGn}ZSFXqgscvHGUx`p*gXhTUWh&sE&csUP{A-qZu9**3REwR5FDYVnm_ z!>ZoM{2Ki7oz{}m2czvA#+4Fd?Ooz22coR*B=v^RWXUo%bJq{|rZsdebYARWH=aYl z#IvkZ+b^*r#v_m^r4kL)POeyT68~!DvX2lzncu}wRGJetJI`a)xGEsPCh~zlN>`p7 z0Oxv_&}NCO713xQz8}xAg-8KeyqspR(F)zYVep%2_&hU(%pf1>Q_DDJsDj(lti!t>FQRwUojX7lw#_uEc zN;M?p<{m##;Y*nC;&ZNyVGS1O(Tw<^DPb#rxdO>*# z-1%{O(E72Pz(yDJ1Wp-yd(zaJ4V!BAcCw$qUEu%1m3c(_1DpdW5Da>u<>6?zacKN1 zh`F(|0-HUFTMCH2s1}E*Wf|PLj!C4;s|4KKu={}0fU-!$=PMQ91pi`ea)R5EC?^#- zS#j#kEu-9;aZpB0q=5It{jRR_j|-cAh|w}OUXImZag%WeqiKGI9rj1RV>0C4%sH-X zl47%rf&skLK`z9w)i7;9+=embQse0IRmgky>IRfy0nU4w8oUGm#U1t8BlgwL9?a@a zt@i?A=LyN}2e}8?mMw{$3hsc4K%B0?x93b|D1kFPrOUXlK@2n;(i4;DorQ4Cn?j>w z0xAMQhPf_T2Js6b%c3c|cUJ@QcpE87^+L+qaMM9A%s;^PTJV99k)bZnJ|atWE-4Bm zG_9IO!%|I6xJtdCD>BxAttB!6d1P!(E}L2s7`IGr$%9P;`zlam&u@61DGBW%Qjvw<&$EO#t7vt-t2?7wy+{-i-t8awGW9K>G|p=m zP6KmH$ANsec;^@Hr%zu1uHEQk)u=jl`M%f;a;dPp(Ay_P8YMZ@j%3<669b_IV1=DN zPr#oLs4o_M0XMs1=R2WoTrxd_29fjfz(Ckqlt+-vcJErRWe_3D$@;BbWA_(~i9NM3 z+swjlWGfWHx9b327VO|kM^QzD%h`NDozW4*uMbY%x6No zTO&&40j=64{K-yeP^lcJxv2~j(9;U*u}3T%r&sw5RR-aH8rNG~^#|~Q$A*G~gJS~D zdi%`oJ+!=8UWJ&l{YKDamrqmu98DWrlYkYC9HN}c6)h( z3z++(^Ap7^dL~k|ZgVJM?levv8uMZ6lf$0?THLx=YCbS zD$erEyhKX`#mg&1HxACZXkn zVlxvhsOZlI_=ZVv)TRg|INK?vmfWXU6CggeoNxY~f4OYYXCGJQVLJ%!K8pB_Z^VTl zzz047i+F~W-K)O)EtKzFu?+eVZF%2W?=cqY6QvyRnO$r>{M7s?!E$tji5z*We%dL6 z{cYS9;~5U#HoS|AkqX9;S!M0$NY<;HP0!bPdRsjwGaIEkAb#$tpR!)gxpL#A7Z@@-gP^>olDdqEnsiJ;B)OJCaxqW_ z?hvQ4)r=oL4d}nw{IFJ!cU~j~w>H#GNBU|0lKbu3teUOfSpI0{wRd*eK{p=d+{kb` zI+iQpfKoHI-)#sswqS$>8^|cge?}KRe~Wzw=5Vm9dkLMI7?Z9d!f)+TyO;T9BUl*Q z4AC9BAO^j$M`*VR^Iw37VL)ZBBPm#AvJGp93GFtfKDg5+HktTMZz&?q%Pz+y4&pUR z$^Oci)hxCg!PRnx!2RvwoP?=T4Cv&*shaDe2=PUlL4WOe!coj6Th7c}R;S(&*{gU+ z1|P8Oy3^bL&{Tm%ITkp9GI<`|pGt!cn^4++$Gi!j>8R*c2VcvFK^lojXOvCo{G4<_Dp6TxjwpA`O3< z3QZFzD;jZ=y9im6SNlDYX?IO85`pmOc+g-Xwm0fQ6oujwWSrNZwlLC;2wwC#y_agP z0bG5JJH|;$=T5UaE8>GMshF7XP6+0#(>(uJq>jT-(of)o)3z9#SuaIqn47OvQE(CS{_%Y12 z;3)x57U-F-Q0dK3rYPe5U0ujYCfKYiJu<;R$d&Kul;?a(=Y%={m!AW;{+~zjfrO)2 zi!6qla6JapB9CbT;{4dVu#-U>=gSrpLhUZ!+As&_6m)k8Voe4g>q=+m z(FBx{adZaJekAu*<)@`qm&KPGHq8`-gtvZCh>NlV9fhjR3(Cp(_4Bu`8mo&Lzvfm9 zp!5#Q(*_j0r<*C^?5yOurlG#j1VtzS0gDy%UWD*s=Mm0ipG6AvgutMy41mBnvxW5- ziJoSh=>!!Yk35PMC8_j?h9={L3QRb|pcR){FEd%9iEXpmD+VX# zIrjS6r7*VEl@-tfRG zRG~cAA3>ey|1{RHK-6mzJZNM?TD!9G`32E2H0#A#g*$Hj`m{f9=hEHKJ=`XnL^*bLGpr zTiY1^7uE9hQYq~pEM-IZdXcv7R~vNf_uBC6&(WF8yjK;{MNjht@`lf;EFpO{ry}aj zo40<{T%EPCsZwnjFsi|!F;2WgTuK~>(vQDkE_U1q21bA~21r0=C zx)({aYN=gno;}wLOw}y!=<$uM*WB2_iVUBY*z|O-bbFoovzFnA~RPW>T3J)f^U};9uiFR(mUbV)NC*g`<-q;y5MK%;i=a#K4 z)mW_;73H~)c05T}}*k3EIA6j4xja z*p7rsEJug3G{`ERlUo`c=NUKXISkHn(VePQNeB41H=zM4(QWs0a)P%WJg?rmk>N*m zbP_n&MA)jGE6D#I_gT$sT12({_rsD7KmVsg5%TXXjxQ^f93nsI7ARkS38b<#{VY2t zF3{kca?BfuOCT=2b1a0qB8r!so0|f#E7GM$K=dXi;+m;P{cPjcYolIHchcANZ++nz zYDS7#*@4B4ft3Ng)0N{Tx2%84)Qn#~#(PN-24*-ya9}vHN_2P4z;;y7%~VPKlGNX0 z!!|=R9D{bE$YIYe*DiKme6QO)`t4j}Tz;n-xIU-XMeHu+xR0!o^;EG-X5;(3^?R-N zTjdMAw+}k3I+rs$g5A>2e`mVpgpT#eev~(zQ&hbDE9>YhufqHK3vcA-BDLL(G`98@ zNW;pIJK4FpUtwm=0ExH^mEE$4_jJvPd5#3oEJ4Y_kSykr5z8LNxZ2Y?Gx21e0vVE4 zj3py`-Y?>`#uI{ky-ncnZx#7o7+=HET__+Pi9>P#VqiV%;sDX5agra&^Dp1!nVG5z4_g}z85gV?zHzbdDdN|#&@ z`qbl+=lL%4S*c>4=V(oG_h2_C@2$@4uVfiraWGF$L)~`2J7TDc6T8mDyfp%Airp=_H(opU+}K&=x&(DMPb`IL zF)xeEAS5r?-)}hk(f)ALbslHng2TBdKW`gAj)nA|MW+@XD7>wuC+X(9@$kRt+WmJO zz5mI3Lh<9fqIPY(wx$>3ln9MCtJ))CNO&^5bQgh#Sp?G3T^q-!lZ8K@IlPwmabL;M z!FiFge;>>C-g>pIK}*!}UA;SmA{0+93dKY1&9*|1EE6PfXYt)s!0&mGz>I5E$R-h{ zqPu-A0>9oGzdafvP~&4;I~pHvSdXug?WsOG9g$!*`(PsU=&a{QRQLy=#eJ;!I_fTY zok|%M4Oc=LqixHS12^N<<9~0I4HkWF*4_NG`6C)h5C2I41VG%Q??KVONMuNQeZh{O z`;0aUpCGw-Yd2(G8@6xm$P_t|mVuhe#*Tim%e&vLZc_EeDpMt(Iy+Cz6^%#xP>XX4 zzqfReNR)Jo(}IiGyG3j^@(6JD%LWev*xkMJy9WYHJ|2^KluSjP=7;VK4NN>+tfSyj zMe99pvbl7>UcFW*f0|IgOsmQ(B^+RW@bvQV(il{qW?q(}iYov0{pQDOFS=7t#ikcl zy)5ib%8$97e`UnvV$;n(j%jqUP{SpNV2`)tyY^_q+Lv|q9_))QXO4VY8p(S=Q;>r@ z@pR)#q>R*2^m6u79^u5D-+Ndu2vbubLa>4R*a~gllUh#99j8YXj~Kh2zZ0$Uu7~JH zEPsiqKbt3VqVEo{iqmr-YF;l-Q!Q_UJOwAL-~MkO7JpCOuse82a^JpvNB1Se**|;C zr@On#VRve*lsK7aYTxU|guzOlK*+XjB@ z{1eyyeFy*dCHw!3OB{^rz@bA24+;Gf*Zu?1;Bip=(BU%|kDR>hAmke+aaQNyQOPS$ z${M8W{qMm3-?*6jjvd?&-n@h2`z-be zzFV*^z4&_{0Zn-e6KH1v*H|3+3t;LA6U* zsIikd!C8$R=oGo+TdMFbB4{+Y_VJ0_r~X><=3cw8x}+5H zG3c>{FbwFAWhLe};g@@Z2==Wmb-O)(?%LZgaq0?9Jx$#?_v@(*)v1b2H-Ur+n zUk-AV7r{CC9YYXTPgkV_tv?{$Z|VT(d|~rMrxJ46vn5F=g*qir0!GHr#+h%IIyJ{N zwP;#F6K{eO`Roxxt!s&Xux5jwUfkUl7;wqSzwwo0*l|~k^dt^=g0REpV997EkMi73 zs=lxa^~AQTx_vC<%VWdfd7E#xAolR)wMQyHo_0IyEWccwpa@+(u+sVm$)&*t;(-Q@9!O8U9*sjyOGQsb1K3F6Ww(4em&p{YL_LV&6S5g4Z?(k+ z3N#Y=msuefdKWlGiWV!U>R!?79G@DUuGvtn-So^|a7?IDUR_pGb}a>)3Iy`GhR zKjf#LTlZdy(4>__UVXKqqWZ!snYJBzaI)7(4m#iQUT#jv#UP!qo$!AR``>S~AQmLC z(NDIcISXDuAsaMt;I4Fc3UQQq6!yS6;0F4`FR@A>Kaa9FbF0a$8P`dtSHQ(xQ*3mr zoU?Isrm5Y+w1SeOTx4&iAZtM@*806R{~`(N1X7 zfLBABm=hz+8m(OhU49h+@w=2JRr{G5_Tg>r88sJT(rb8~i>0u$v!9EL&q!sNEF$}< zid(i$Q8l~RxaruoaGqNg0_r7{kQmdayL{_nLzRkU~r)x<9bn4_w$e64c32pQr;9u_)0<9is>$(iD*)D z-T03jd$W=69VH!u?8=hSj-rl|>}dEzEV(#t#2)z#`JbcN*!G|T{d+lFEnP?k^ki_m z&HS`o8}c|rhHnB`KEs6fm7XoOM6Zd69dv8s3|4hkRn9DDGXuAyyT5e()DaW>*RW1Z z#WG$0_6YyS=f|Q6FLV$l>I0Gzm4~aIWM86y2~3b0gWaGF<&a z_L`ys+IIKKv`tuSfTls%(GW6>I{jvIch@ArEni8C{F%zp&EL4``IpmR^UG49$F6kJ z@=jDD(L0Dq{*%@~bw>Gr|59ol<9|(yOb!mNDEhXu!~5cXcXQADt!Vn%m7UmF4UO3J zwiMqer3w0fzGB7xK->JOh|Ehj3*6{-VxH>`jm=2F3hNxHdVYAT(A11%PA;!ci7XKr zy*_!?*nUsY;!FJCiL?m~4GTYA;M$F}eFnMqZ_C5KEt{RUL7IftF_1h_5YKlgv*arF z+cb}nH>bAj%_rBhj zVKP$8dhLSG(vw+o(!-cK_di0jCq84zepY}&SS6f{zMo{>GJa+H&)bjKXcVjP*1o+f z|IK#_2PkB;j{<1Tt`)!-xoKJFVNImvf@CGRjO9Dyby{D(udYQvByYm)+eeRxFB(6z z)KbzE$&3{GOYtaovY#&bu^+4FpL}&R(q2a)#5+nJA$p7XC3vJ#94G+0n8^Vhuu#c` zy#x1Lczq#SpR)CzK}P8R`C;qDTCnHDFm*uzjG|crC}S1W(t5r&->EJewNp({OIv=o ztkmpY0-rh)g-~B+UJF^fT{MBYlU@C=mL_OnubiJ;r8!gu>AS8}PouswZw4MfEC0dt znK5Y$()pOf%PsmTUGnxXRxy=KxW=Xbk1%|%)>pXbv2ADY@%ef+spe$?gLt>@;@gMd9h&;Ct9J`l^6AdIw?lRMskj%avfLZ z^Jc4f_*61y0+yzz_@3fdbjsAL+`NLFsm<mZPl)kIeqH`ES|nzb|Yom@GEB8FYS#gZ1D=Xz7dP z{;c z2e@pfP4pu;0U0RV5K;;YI^vwfUK_@p3v%e?%XAR|W7m`)1339t@O9HB5#APd zT(=aQGJu4?kAz6{M@(uCGna+UCfA8AGAI7be}FttX2bgGf#EU928fq2&H4?Hzm%u~amzQhfm!@F?m zLtOm8#<3w@=B_gtTe$lRZd&mmps4j_l!Db;C}`OWFecZzTGfSI2xIm<=&yLb zsXWMWapyNgBSu|#HAIu|%Pt1|MyV!d$X_PO^|0WRXf&m0$S_NV)qZT_^jFzq=jHUy z*m&wte8AFZp1d#TWu%)#O2mx&7)eC3*15_OUN>JRthd!}!jSzc^~JgIX*`Vlhabtx zG1C}zS`1GvCL_ z%KT~E{G!Lojwk=pu$Dm4{T*omBK^T zVG_#(+i=Hrr9GyD30LPbH9sup9c~JLy;P$&NDH-3nGT7QDR1TiF<8W z28VmU?(-G3$tu^UW`zGd4*1r4^*2Aq;YIf70nz&!#?^=2|L8x>iJTA;PwAd4OD2Q(L|%x? zjB%dED>kanUDc_3>^ax8F>%jyt{bQRCjifq{&Jz~J?Pbqs*`MRo-qDj?7df1ll$84 z?VNTIBGLo|rXnIBM5QSNvJ?RU0qLEHh!A3oGzkzAm0mLi0i{KR5L$?ofYeBziimUx zQj$n-iBg^kA#*?PKH7V&Z;yAM?lHatPBIu7Pm+JR%XR;*d@%|05EYK<5ZaDx`O8Zs z(vy74+XMGRKC!)_L1}09|9oj+LzDQ{QZcn9Yop&0{;shFK81ea&N-jbZAU_m9(&7w z(I0qGtLefz?mAnx+`?ixMY(;)u%4QuAFuThv=kcxwc1S}*1$Wg+<&W8Zg{@Fc93tz zh8{F}!`B*Kdyv1TEjgw-h^1T~g5IlwfJVxu?mWo2E2@cV*D=6!v5;Ua9G){>8v8%T zV;sX%JmIXwT4BvjNuhI3b}|^RwrXAp#wb(9iWB}aRt2Z6&rbMfn-mCtd0jTH88)hy zLLSL$?}42>3xH-tOvp{Zm;*WPC$pAB^+blxw%yp zd+H2#ErAVs!ZC~yVgM1rJCxy7?w?&*{-nlg(A{Hdq7Rz!dqy2SM%ufco_Im=P8Bs` z{K0;W(yRy9Dv@r|r*#fXWX>R2+!Jqk5>?kSV7;P8KNX(^P3^=l_&DcBn2^mz%5Pjw z_F7ej9MZr=}uL^vr?QUSEofdKab`wDVZ&GmXbt;{;F6!*k2*erDn+IL> z$*bp_LK7@e}J+cG2>vQxwHk+gGKe%S7VZ z-S4XQ(f8BlAMbqceSYVjYnx-p$b!f>ROz1OKAl8`fk!i=7d`S$Zd^zR!t)V|M_ynokW_?jyA zuCO0C&+)&;c9AoaP%CbK4sBU z+bN-(3E};>p3kyxiV2-^X?yIv+ZQPk^0Xk!JL9;vEB)QbJC`SLh#ogaZzg!25!`XNP9Ko<0fIAaoY0uBk!l3H=^flqsx8X^Gyzs zU9Xg$vfpwb$Ax%F_vDLaN9X2-krx%XufGxc>0`6tw2hSM|GKTmat1ujmgRY11Lbhf zv@ktI%xLcoUdys#S;p~CsG%HA!Xl{5Uoum{Z&#>-%dvI zKJjxF+sLrX_lf-^-Qw~-$!lcjb6A+Z$uD=l)N8i>+c3O1>WY?S|K%F~O(lqO#veaX z>+ge-xYF{d)1$3U@!b}?n(Doide{nsqiwUiUT@V}wUM@a!-`3%2-T~Jfdv{k9o0Iy zzP4V{FGJNC_ulwwm;1w-xrV<(uJ+X!J7Qs0XC)M05BDj{TunAOjTauyJm!){jVY@- zVb8xE;OF+Tjrk)O`*a52!Wnhs#*+K4(}_j2`!(rhzK~J ze)O`(669jaR=HpAS?hD}FDicAz@(BOo0tT|@%35+#QIVGg`vs~ggD?rmprk!Eq{hP zyCPGZhbem?op*8lTnu$y^wl{d)prd~6>sVMF^E^6xcR3WHj5S6Ec#qA782)qKJnav z%rlBaw(HyHomIyUnVtJ-X|V-KMr>&FwLnEtB%34%%iz9dclf?ao^p7{B}es@aeQE> zW$zT4N;}q09?=@Kp&TpAm5Fw}V~tYU0&Z7oRbP}hODcyw^z(UzYZ8qwVU{OuIh#BC zXUwhrD02v&bo@KVE@P-=g73!jO~oruV7;C9vOxh`oIndSCv@Wt0;BWo^B)?EDZE3N zmC5re8x!is{3^~3+>5e~G99LOlrJ)WNQKvBoNUj!+!hevQz9tCeGPFxklaRAcr3f_jsS`)@!jYe!X%@ z&u3tecJXf1uwfeygfTK=NdTtV?w@`ASBUR$U^}^h#-a#h*Tq3kug|nTtY*hW;`6Ha zxgEbH^l&aqJP!W(89G*Gn+K~`CA(r1vB$+#1}PuSwUckzRP}4Sm)DW&H{?fya*HN%$=B-ERf6ybK#hPm zCu_W;>~lt+7q`2~bYFz0v@C;;F#knLY*Y{gz|; z>mpcqSGjz_3{j46kha{pl`m1nJMO7EAU~@G`3sXks?&|ep8?GuEnfjzkkWFGmX>-c#MV0ik+a7pFlyX|@xu2iBPj}YKs1^2` zX0}X6wVpwIHyGL6Zflw-ee!pfF5%c_Q%-`;+3uXV9Jc0PyNbrf-+TO3OWL0vl!eFP zK_b7z=tZfSkkrbYI{!?<5p4^!v96-Y1f~Fp&QfdCx&P4oO7bVX?e)E1u|TV|{K2&9XCyV}KK)p6(8*b@A|bMSoYcQQUsArorn9 zgwt=Uv-6V~t(7qsSlo?E!|Na8D97%gDH`UFqZL07S~gwx z*dAB>L6b(hM$R?OfZ;DwIoa?m|2#-oC|h9K>uGN%{}@|c$Ix%3TMMQ~aW-YG461o! zZVe2A|0#4KTjgA6ZS;X1_>4{ln*`y@4?KjqDp!rFvqyb)wYCQ9D8)ufn?F9vza9MU zE@x-+iy83|dZIlmDM0csMY(Xyf9$5h6@^ob1r&e;!Fs!0aQ-i~wvPL+9_pYH`exP> zx@s^8`Lx}ke$uxNZ z;spB5l5Py~q2+BQsK&L1&=NmApV7QX)S;}f$ns|_R9hI?RsZ{fl0emtG_@atqBl{I8bdc5b5Y@63J9g{Ob;aJQ+-;;$@Z^@zO{|mN1n`|vKF$f zI^6G58r(01tOe~eWCMP7koLrQipeCadgLNqC`oAbS|wWS&fq30!X=pM*zOk3Y8k>j zq83k!SElqwMsYyQEI}B~oyJoB*_ZF5a2EizwMK{zYrgK3%0K(&U*9&(nH2QfO!~=7 zbGbbEEP2u!Pwd;jS9+eWOjuYj#IR!mF{LK%+{+N3Ixc-K(UoH~u(oRXV>H}gvai8QZ-%EZJ2r7;jGOJoIEAw$#4WR__?=HjNgX$SxzdMd+7DWuX=qSluwB9k2XzQ0HZW*2JIBHP6P6OZtHj#?aW13$;!Czhj9rKN{y_njL6< zQhF6m;U*N;MqQ*KiygcEnM(q3=yQ>;9~I^3rt4{Zmb&%%>0WseqpQW&d`LS9AvEIA(h9|zD=O+zWZFc83f z9*JLWlTrSr(QF*-)7efAdiVw#H*ePE@yAxtUib}dpm^UAtGNBobL{Mk2km$vi{ zuGH&ICsBWZjD*2no9aYawLIk&$sO~L_vNT7G{T(v>Au}X4LzeXKM!4YhX2R1GW}+F znecUt3nsC`+lhp~=WLPnQV}k7qm2tAwa7>7Wobh<^RkiS+USu+WLc;yf?Qj-R}0sJ z`xBx_a*DjE2A&QUAB zCt!p?$Z+6yhzFZT>yddfADY_Owt)){<2k!Q74ISdNe* z&l;%pSGW4%QnGaQ82tAZsP}(MevhnZ3fgUUO2AHo?k16({**=DZfEA7KvcJkRQm)X z&hyA%NCe7d10pgtu_U-OGRt!_3PP6{M^=2EQc3M@Tie*p@sL#0Px?lM(kiJ%LoNFM zzMe1q$JWa@_?di;((5R3wy*t#uhN2Wx<0`|3~b=#QM*fB(qa zHO*i~LmDo0la2deOEt69dk>R?X`6rYe`(ukrT(d!EMt=*p|h9va`<6U-vySR*SszH zs*-IrMTUN{VP3{v@a0Ojx$T{;^Z-k`)HT=dU;f#5if_A@M};XJwYU4Dod(TN~D0&$y?l8b-&RQ}tdn&n>;D zq*7`ZY-|6wz0avu3!R2SwFdpg`}Hv^3~rtreAjjRFR$Ads&H?Xay@(9;H^af`TC>jV#a@eR5*POkP`7}w#jh( z6y$7$4bMQbRffU9=o`*hI>?4*u>|nX zX6Wnh>TUR+D;p?#!_shh-;FF)xly4qZ24a8pM6(I?-(o3c#0fCXA(pdXUtXW2URNs zBFut2)ZKarlb}ay$0Q;4!+eX8P>mFhx}p^~cgKo?Dq0+MjVUq|udW%s7^3b)em_R{ z9YuqpJJN`|;W- zMCVR-?#fbc?DV<<7RZQli{nh{EUg26Vq(%i$gN#{b#7SWEbwQ#r^Ug>iW46Lf5PrO zJ1OxmN!s4O-{paiNk?b-%1`qlhyCel!&|R%Z5FTXdoD<*$DsC;B7(O*K@#x8eB z)k^$Ffr2R!yRE}nnYvbdKjYM3RIIF!IT>l&QQFJ2|B<|8o}Hy{KLQR4ej>}*8#IU5e*l#Q7&ic8 zw#VV_{EJCOys-~gA5u5qzag27n04q(Jr5p-)AYfd0k1u%)WRg26!%dgtUbml#>)c32O)UJg zPm-$6qSx}2+n3$k{0g5>F{fE$33u!3pDP^|ztkbsNl(2{Xl$RV<#6+k#J~0(`+Ft5 z!@Wt7t>Syi|D_?t(kWAD-@7|0w?VU%h*S1mU#QkdBaLK#BlQ$LEmaoFwMfpT-8Pxw z#X%Hh`gY?_-WSN;yW%>mdHi%WFn4XGCTyf_l#+F)^9~iE_OWzkf#CZ9X1vOBOXO)+ z0ZYxw9=LwM5(ZgWA&Cr#4FGBO=iEI&25DNk;&ZX{Pg! z=eOoZVA5>DN#{koq;mV3(fJ{0<$0aDnhxk(%Y4UlVrZiZpjfz2H-vq}x$|`eLzmuY zILE_m8O8)uc({046#6@s`@WgHHfn>>xI6p<<@Jur9JdG@*>U)f8}C0NNqi>ZiY!>? z*9>4O99eW#TH$?P^4c_TbAA6*6s5yp8@Pf%F8m)6;&$N!HPTSu?qjS?V5nHLs(6>f?X^r2DYSZP4-9ZPrVjt?bd#H~yDuWh}oG5{ed= zQPh5LKKV;SiL0y2QlWKqYwh5D;+>)5#=J_(NTtR_nch{=#qI-f!vx>2Zd;MS!+jqO z4_56HF+0!v*S`I^^YyMvt^a2BKqF%A-DMvMIWq_=CLj1zRbV$v^k1 zug3cb9a+MYf&G=^%Ytj!ZkAs3#b82|{Nb;gsIB3Ry}(-`ZU}K~yJL0Z$VQ6ht--Z5 z@7m1q4kmIm{x0@o^rb*QGcIH+K4Z#^fK)hcb}qU9TpHLV6`q{@mgyUM*X8xAw9lPs zX6MrUXS3R@nckKsh4r`I3_Lv0bo*`Zj6%nR%^COAD`61%y$1bIU+JsM2#HJ}EbarR z%2M&29imRmiTL!gjH0)ND{FuIoL?E<^EUfuUwRU6eeVS#ny{10e@OGE zNc z8QT;MxGN9xcvmFx!W+oHOPc-X^SQmx_U&r}|Ng%u&D#G{(!6iq(|-v6FG!kEzcK!Q zN%Q}dYX844X`WFPWF2tQOUY~QZB_BT`NHVRn%(dt+f$L(50yAp#{IMJOe9>;>Mf}K z4W1lgErQjxXk2YI-}r2pzj&!G)U0Cq0^qE&24>Ak9E201VYb+a2hq-tb}zOnvA{C+tx^n z4cP>ez<6m04bxVR)(Dm}$4KfXRMK^mZqvDZW->bEq3G46yp?@>cQA+o+z z19-vJG#h%vg#Yf(5T&MOfEdle_XFBgljV-a^AtZVHDP1AAIt_L75k%p7cI!%&fZes z+L8|WlVn=eagx=0*@ntpK#mo4;K!zWrwQKSS9igo%L)s8&(-J^t zsH@RFGhZI$c-SJh8m$x75LTn-=x%Bsy;j}=AQj;Nbr9^9=>r3iJO~SvU9~O4B~XqG zh~PZ7XRC+TlPC~dW^N~Ff&Ut(M~b?~gC_}e`~^pNqeR^}w08d?7o5&W<>vbF#qi*K zrGa3Q@VIFS>QDF0!-AuByT1cvgOLuc@>ou1BOF;u054|@Sqmn`*m;%H5HAu;g?JtPl3VsQ<@WFP zv#$0(1uhNj>Cv};pOL9O(|cqnB^Z?N(^Lf#UffzvHn(2FE5NYlQhUFY_5MV1TxquL z=fx(wHa5_co!$Er=oLmlE{23BNhKwhm){-g!Tl-%Kf5Dd9+;T%ZG)x~j>3ItDGCy` zjHIzCwXY%85D?)tEiz^U`2N@Y_fQA^NHrIcq>Z9UL*t+@OLo(=_+mIMHn?TK!*J#L z#`!FpOFgGGD?HnFwFOhH5_^RVKa#BA%P69T*2&nvj1YNq1v`e|9ZtlFl`sLvh*e3* z39M&-CsRI(?e@>U6Mj;j&>{JsmNL_}Rk0x?i(xdafSx%m45kJvec;d53mAcue20NN z4pbN?J7%biyA5^(FhYPu=X9M@7coY!KNWu-(6k=k2BP>&?Aep8=H}52QMG< zka-<_Ie1F>(uXh4LnOjQspgt<{-RqaGsKFyO5l^Oo&iwYIFn)D!F8NZ zDJajX=?KIo{zT=-d2KL`0uCXV6aJ1nB2}txH@)Z<{qlP+2^dn00^Jt`$CG~7g2do2 zaqHvpGL%%xuyzD!t*6|%<5dR&nY_3MJC^J4qCCg)O6*yJIKo|nHsgkn_^-Wj@#{)R z)2j9>zxsH6OgyunFXpsG%Ic(h5R| zf1CN_83nuaY1{oP3`)UPTI?={#JKy8DY_QJfB!jq+AZViNHN9MeRwZvJ~;9d7H8nE ztx9&Z4au9;HI+6w1ywyIe>x80@L`l?rHXU1gP4n7MjcE_l}}YAhu0#l?u4Z|zhd)h z^ABaaJdm@Co;4BYIe$OC{NNP$%dM{taEG?s_6k}d{CyxI32_QYUFWE0#Z|&I*$4=> z{sXtAZ;HVaGX>ClNpAtDJI^zV1C>IBKcceb#B5rIV47rqUCi4_4+OJIZ?V2qs-J1i zm+=0;q(p-(Y3ox8<3Vh6CFpzOpIslh%GGB5!^!;p<=6pQup1+8>eSa(^#!IRrM!zLW|Fww4nM(HDr6*YU}Uib>qc%* z!b-?GWbvo-W*vfSLHkCruH}VfFgi%_P)O>-wH4gWZBi{|6<#vgd#I3;C&u07ws6YbVye*~@TE z9k)MU_`K}LyB9Y3N)hHkxn-Xq%2aP><4#W>N&6bYNp^QX&~9cFK|T-4FI z>K^QqH{7n;Z1mLMIrn1O-O`@}!HW(Q^Jedu+$B4rDA#Cfj!W#OiQ%9_Lo>Q5{KGS( z1h@!@h`bK&H8KaTfYYRNAH|`#9c&3ohk^fr?B4GBP*0^HZQ4mxs|evRw!Gu!l)nmim7@fz zJdaNNmHY|MY95+Ggggtz9LYh%PK&OsX8^W4}$%0@gOdOJnf2IwjQDjt^PjL`FKGp zXff^4qHq3SvI9=BP|Edc!mq%w@}u{>^&B2^caj&q$~uIsznSDYB~zr?zK(^RFzu_O z914;9)*0tuK5i;H&^>~6x%+O|&!leu?+c?{RxL2g@LUHAiEP`>L26tfV%$ijTq!E~ z9sQDo+Gq*(Ne*beB{Dd_M{bqJ_cH(4w?gDm+88Hbkz~NT6QtK#OX9SM&fKwRm=Q-f zv`rVUF~WxyV<&7!eZRtV%K-e(W!GV?zt+_mRr5o1x1*SgbXhZ>ov5vkAQ($wR}QCG z4YXA9;lq6N+kQ^}5v+`W+0&hWlIt!bi~aHwt!6p48A<4w`s1sXkfprv-9=^yrv;qH zJ37p6x*VCtT=NUM3tmov_`jYA^tqJImjHot4dyY^fD;ZV@R-C!>=j^w3xl{5PU)S7 z#~a6B&@i4O;TTZ8ev2o*jaN)t?h4nS2b2MEcZN47A6S|?4sQzelJMZnycmnPD$0sf zY?}tJdr|*J$td_xE|W4rvAf4x0gVuHe%)t4KkDGP2p?`(bQnEoWv6ux3M(#&-7R zJ5r>&omye(9j=a1EQ2RscDp2HwAWJP*o&G%#3~f%$CbYTf21G4j?`z}W>ib{Bw?6h z?)1TCJ5bv6Y+GItxRpIe;nq8WwyouDJSDy-Nvwz~N%DT!DmE5uu`cWhdZkLb0mV%9 zGg=AM%6lVfiy-W(lTf3Ogu}2I@vSOAPzW0?2~0S14O`gyt3f^gg)4FsqS~>hG7O)w zURN~3BRJCF8TPNK)6K&mZO2U*Vm1Wk;HLp6XYgm_Bq2mWy=4`}^XH#nh^EiDuZ9uP zjiusGEjtFJ1om`Fwu0!x23}b&+c6`QyeNg2AFN$H%$}rm-omS3BieTmakOteZOp0zE!pmfye*s{5KZo|6}#nll7-y_2T zxf10npa`b6+^a=qoD>scNYjJC^I7++`C6B?DAzbh3(c4#jo%W3+>M`=Zz?Bb_&K)M zAN%&no=boCEjQDqlf_dIUz+CHuM01<8UjS_yv-ib@TvoJKuQ zIR*wT=8F(H5g*wE5kfoWd?AaaPVJ&Rlbp9ZF#(aEG=6(Hu*OWP4pb!68%Bq;Alg9e zTsBCT)$hrd;_7xWWPzsk?E0kE(}=p1!yWKALkLh!+qXQJ@ebtAwe%dT{ra3xIdC z0EH0!T>OF&%S|CEbLv!e10gmL9%U=&xmCxAx^-4R;#IN3tB^4`*IHrx@l!} z7F$)aP=!su!}I8-l;T`~{t{r_c?2|?V*(aVah(itDE>@8PpvClgvQbrf*f0#66Zma zLNG%9c}Zi3{@6eF9Z4@q=qC3Gh#U#D)Qw%1AOGiNQIMYR1DeywEsp#?fV&N@6MSWXHobQe$dP z7MvAf>gkjowR~|d?LLq$INGx-hpmRlx-Aog=nYP6g+%RjDQvMNoO8H)Ph<&g*JUV8 zY-?4j0)r2D{7%SxG+&tpxK3Dpr4xSxtRlre?4;(s0qzMgL_WdPSsmnE!Uw{54-2v~ zz?vkqPah5z4l)|V*|Cv0Z?+Uq88lsDoCK+Joq-EX-MAc^W}a>**jT{!cBYCMbGK3` z*B@y6yrb8@i+6MF>{Bxvi6Uorh$<)3Zq&&x)v}HZA?O>oqSgw3Rhi z+fSO_5G&nfK;wfTA^|S?l#bWu1G0QEqOm#Ui7%ICGLGDdfjOuKuj8CFc#eaF5IW0vsY9#4gwPS^QZ zm~jD0@W;@mrGhzQMBS1YB~V!e%Nu+@;l7j~Tj{+lsGR?kI@hLe-#uOXC{m-r5mYBj zM6J{kyb94lJOTQyAc#1du(D|&$a7$G4{pYlC$b^&t@72}tx`6aQ(@KE@I;(l@zRrN z(MNV2t>;>J+t0KJ665}aff5mMlx3-jHpVjnS7GG;?gFj4uSmUmjJmx9_UCR1F2)Jb}Z z;ppHFdk)#+7x>F-^5*bqyUuRtcB0w6vm8tMN2D36%%j2eQmL?#jUIy3o4)-bQ8vN+Jmmk zO}$|I)dmEIP?i71i0V|^0P|~wW3waLlaJg8^1W2-^FfYv!{~jWkC$obW)4o|fV5Vy zQEtV>7YPh?^Y??)WUzs2uvO|c0}kLLOS{P5koDZ}$S3c{mCsZNx(PMiEo5guW?T%+ zHdE({alqw40Tg%tD~7(?OORP2oK)9_%J_qz&y7{5o<@2ck=_DgVV}@AsOb~_;i2(# zw1q=eQ$1(}lxBOH(X^G@KS^1=hW5SCm_N{_uW#@9vFJyhzCE#Jt&jMkEOXBC*RDDV zs)hWi(sHfgT-lV3MLst@`QeN=|2JTEhM2-_qj&&nom2aH=}e$~!LM+W=v?nn8 zfI-Y}ScV-}AxRtbf<$tJ#cuLMhtO*wzZEWO*2=6Ulo)%Re_iH0?H;ZhkGo#DK#*uY z$ememIs`oh1a)W6ZxxkRXlc4*J+w*{2ZNh>3A)yTfu9(SN9)v(YY$&Bg`D1{Et$Me zya+!k_y~53Aq4=XV@mof-`CrVy)FWf+8a~)db;7sJC#jE3wW*J$`G351Xi(2rl(T~ z%&l;`4LtdVz>rB_J0PMQL_9Ob(6y8P?9EL}Ws9bo<&gfT(;|Fha1HzhtlJsF4bK6{ zyN#Hr`5}%$d= zE5pdZ#CFxG>_FnQQq(@k>?$YXq}d3e=_w$T{iL*H0e_sQ zl#MEG@51SqfqsVdl-4E!!J9m;lO7Nj5ppOepm=H;F$6~;#=-W;3l=1ri%oMQoCd~j zb7uuF3YN}V8Vb~CQhsPQLf9`m_H`&hvI<$@zjL&Hc$FjQOY6Rh+4!pxGt)3!ahLRU zg8=G#C~+(5TC2x;*(OBcxG1pyBKQ=k%Ngq_S2rJPheICWEJMLEtMI*PwtILjs<58} z5fu%uFSKE#?p)Q@@BOB=r=w;7%GmK>_2>vrv1B1UD@F@sr{A-NEHKYU`FgRY`3f8)DZe2mS zVXp`;Mr%_@Qjn|QOYk%WqL>(YQJzyGRGkh^7-6H@vpkjGbCa;Ky|!F1kED!7>x37V zG=fLqI?k}~c)wqLkh5o(c6U0#Co-T0(nE~V5$KGy$^%gyt(sp$zz?~^gvRilsMc?= zF#g6SIq1fu59g#&HgU?+wm7lYE1|F$JFyM^;*e zf!!H(dR)>xh_zKVlLAHT+TKHc04fsAR#-s?v857mF69gALFdU~B}S4N zVJIZ3?DI~pPC53cIbU3%YW{f$F&-|-NAWZrhg+4vyF@(eMyj>YQs~shuNx8CLxwWo zYeJhsEtu=zc0$i6h%Gnf$58&>YCUiG`#|&cHy+bVM+^ORMoHtNJO1e9Pg$UhuP#fQ z^0_qdm)746_AO;;^))YL{K?mb!?fmu=u77oi+-eM$eTJ?c3&}9rKuLNl$9^^jSrPt zL;kf_!SF>$0`fyWQxIZTtLC5vUbT(uXn{DmkTrE_xT5v!6cE_krS~W)IA5AE^3YY- z=+;QBnUqrvqiImfHvOAcJQz_Y=;9ZY5ei;q+uH$6mxqlTp8b47@5))KZBQtJR`;%R*Y) zWbj9n<;z%0)&g|(;i%X6r9_rhjQp6=~hl3hbx+?|%NO>rrEC>>u-Qff3>`sO1v ziGos_@6Qk1NtIOnmFM(Zgdw)R|Kkd)PdrPrd^7Q9X|Klpmxk0$*T?8<5l-W6zQa=QOpFbkE~g85i7bjVVZKfU9BfawX7xmLU$o+bhMZo zXhRSNkHAETGYouf?6J6;$l9utdA@P!X*Mysu^sKnKFa2AlM54K&lVLeIJ(ol*S=h~ z_ohnUN!1k6dxtqH5sNJgOfLImn|ii_2YW|B9M*f6DQ{nT<8s&CdH91>$LP6b(x2h; zdr|_+|t~6qzp^b$b}ye1=fw*Q(PD zYNgpksYMwowLiw2cVN`fHMR7dy!5U)Hg;_YLCgq=f@-QQ=k>g%ks}4>D z0WoG5H}U3^Loi3Cu>lXbTjc>1-4EFy8`9!%tbfLH>ya zv)jht;c6Z<2CTL$xW**8EltVf+#D+8ZVIw6=+lY|kc0Ssg=4MqeDKEMmA8Za7Iko@ z$u-G3s;4oZ!qa3E60|H`)s_7Q(>mG=&+}5NW-!8p2i?U&Vl0gC0u_l;?<+c}URilB ztFL3AZ^Zvf=e-j1mygQYvy%c-%E9@x&+58*saA;@x9mIYY%I%8zC6cMcr({PiVf=J z4gXA)?<<|tMsh|WVu_`m;(o*VP@%n?tG2`w9D|oCcjYyg?{u1K26YVxDp)dlh}Sw%0)OgMvh}2U~h9t(BhaS8Z8 zupKwJrm?JHdUWl`?4Z^QFf{D;aI=lOHS(yU_S;&edN9>|>FPt@77p?0^nU#LJqi?Blfv%`H7#Ra8)W24)WQkgrcIVDKfF9~53l-_w- z(URkn@O&cGj~Nq7E%JYo37U&Wpd!!*cpF}s_sj1I8ZI7xx7O@=(96qHB2#ib|7ruM zZ3wL7_(%^#BfBOW10557jemZBdG@r<`*5PzP(LTOs}h+gW} zn}w+}JZK!>yJ7+*(BQ5=+h|fa=qEFlq#Z#N1*(7TYIclLix(elpKx800d2?nOTQ=% z1&=>sHI1yTX#KUezDg<*^bKfb7s*CH__?IOgv=BGJQf6kHMAD@ z0Bn120SPl0dCw_iFZ+nL+c4L#;cz@!s}JhNr6u8{*wEvi-~Dx-U=-qm(T@y_texE_ zZVui$M{HQulN>zR<;C$_8l*&HzYTSM(d&yaer`vzgd&me+q#S1a-gq>st#c^Wf=*w z`RLx<8808b6X7NUnQCdt6F;m}ZEd4nvwxuoOz*8AQV&5yAp5bx{TpcZ5aFMRmmUa_ z8+8Q>F!E$JTFRB%O)cmvp~ctsq0B~ca%>Mp8%@7?^V;FyQmW60q?vl>xGsrq`oTl< z1O6P4L0yzL1X0uANv2Oaia^Ojxs#yR;X@40s2C{hY!x2eXc4pJc@`8R^(Mc>uoaG? zbo3Gznb88j)X_-IT@#S*dTyPy_ov`DCXjxEhX#fEmR^iAij?Zct7UtjoIndW7y>j^1WD#Yc8sJ>z0^{P;lCE8R+6}SP$5@9 z3&{{YH*gUaLdBU4$#6J5Jvr1MQ(jgAy4k^(ZD4nk=h5HU(CqMb0(d^rBd<<$9|)#C z=)XR~sNa+t*6K}AI$on|Xcl-uH8JFxcy5D|b$$-{%UFx_PrXlX6VsZJfsF9L6ea6y z-3%+MTR{<3fp&LDFxxq^uHh|QO|z?2AZS8u`8Otx@z8p_sS9yJixB53k=2>BYS9TT z(0Ilc>~HThRPrybF{ z!>xz0J$HZtsg%`bFYaj1hsLpId{ZQ=cNn}?iIs+Dun&IjaQ-#8nP+5G&AY?hj(*!X z)~pg%V!>jZ`sR$R-vNgLWo7dWdph+x|D24>I&8ET2Y5zXNs4{u3;6ethPb6ys#2Z>p>iJPK@VQf$?RfmlkJ_2(1{vhZ zi9SN;@$I3$pz|+g&2eMs^6O15goCBX-d?4LH_wx5lR2ta5(_U_T3Tm)-@<(w-AZ+A z^1os=+Bo|%*WG*V6G_b~#D1?o0k4W@f?*bf5Bf^?woh04_E;w}Ao%^(?7hQmXxH@7 zWd)HHoKg{XzKygWV`#9HFPmjP#t)-lyVXILh#JL5aw^WD2pdU@zcNWo z1ic&^NHv}r+zAt)zZ`dp=dN&Mz4a>SD)WfSnSdn24}?Uj-5lYYakI>TzRKn2vI_Ck zph{<~P`mEVQ=UmqfzsCd#^Sh0@**>GmOrX91}`O@Ab3H>QS7+XW+YFx8xGOVA&KLR zztXAudqAjiDUZ+w8syn~{=rpR?+~{07;P4wnU-IWKit9_CP6Us+(=4i0!$D8$71&J zCysi)2^H+2U>1rqhTxiEzCrJRnK0UprJSOj)Y~HD#{B^X5`?4>7hR}MED{fi;%jReGkF&B^3t`2}NTx7;V#la@-1$ zE9E-SY{u-$bRXa(^osTFWngn_?A>3ty7O*7K$-`*q#DM^gvI)7`rTuHFY%IB4K7i-`swxWxEP7p)dW+Yx$;Y=_QvxPV%?7#=b4STZZ&Tue8X?~d23}qb{-hdyM#-#OI z)$>GZ0u1tIc|(sjrgKvo?o&cF+*Ok-kTmLEK(BqSFHZK&%X{oXM=>J5`yBZiiIYl{d#k;#HVuzY5W z;(}h9?cu&e9MX%Ibc<(IKhwK@2!MCyE7zp;e_(FqvHGR|+2`-Rz+RKn=3guIzpOs= zc@<4KZ3_+`efO_1LkjmP9K?4rgh8{ME+(NP3GTbM17D+CGqxK4A4<21lIR_krv+m1)0;?D^B%KvZS2y<3L{zyBS9G zrouk|R)rzKAB)?h$$(iHw3AeSc!kOWL-z^m5cVqQ@WTpCK!ZdjG_*}#egp<4 zZNxAi9^_7xQ^Py1!&Fm%w5_gS(^#9v`z zOkNFmHWUA*s;(jDhP)!fOjT+^mA!BLwb@;Sd3 zmF>{Bu_%v?B(xJWKg{}SzI;{pzNU$=Ptb9lIRXFs(AQ=72k}ZIf9VX_umZGhN3TBg zYaUtFq;JOw_EU^-l-+!IZU4TYd^oRB0*@hLv?ihcvD5G*VxDEYc_^4}JK~UBZl_RC z82w=8ZKqvO+v`q-`VGH+hXc7s=P%??o7>K}%|EI5b(HCIV*SLWt6{$eXMzt7o;;ZU zw&)ILYTR|cGk1RM(te%rc)G#arQ&a8m#)nf5rVyp#Y6vBjc9EKx)COgUHW&^+ArGL z@Z($LKLP7BPDClm(Pqe{Eu5}k_`Prh5%K~9(wu<4T9Mp>zUKg>O~Q(=RzpI$i&F<4 zcx$pIaW?f?=bQNz*N1NFjEDy&Tx*)=kjDcl#*h+9u%8qv>`$nn?F3gbKwMKH$+812 zdlXvvbxKpBz!dgg=&>6$(NgMn8Z;t$_lItR_owOni+GO zYOa6JVyIcqWLA`Q&ZnhPbJw}iu0O9k)J9%qJ#6dqEa}`|^`xxSC13kg5V6o%DHa_9 zRex)qkVTUqQRNZI7a_H!2`Z%9zwv@{Ac&$gC?zn+c3^ZVsY%$?UiJTj(4pWOOIRB$ zadq4}5vfh~14E8rktZ6`UHFDlREgJ|Ib?)k<01*P1&%+F9i&l1Z_wWJevy0I4*};?~Vok)9hOo?pLX$vQ8gUwqA9?$vLjs?psrv1{~}i8I{eSagx8W_3f=8$^LBV7p`BqU?mBA$n( zUd0+Rk5vLIe14~(rN!^gYxL8yGh_v$$C$C2&(6%+jNM5GY_GO;=6+&+6UH&ToM#|p zDz>e!{8NeWaKU=K`kgMNfUvKk)A@f0Zx1ry3!HAtEeCmWi9~E8T>XT37{C=Mr-fP6 zd~JMO>T;@N_PAT8*rjw8wUD}gLh8Bkg5xcecYK392U-eIifHLU@H5nVo{3W8s^WP2 zmNoko$;8*-U6Wp1>%W`EWC$QF<9bD)DN3j|aHz$G{xf+;hlN*K{b zf4d+}``EAyDK&Ww5IRzAi1^c&hmoozR>wFuCPYXw&IGicJR)_8+}T2wg|5di;#|Qs za&SH1OPikWPtG*0#+oxWGKvzbzu3(Sz~iy?t?>9rUW*-Vq6-Zs;(_Fq*C2!BpF)!4leklN0 z>vtLAY@5zQc{hy^mUCb`!Qg%m?r4CS`Q!`}U+85?C6-@%bt%}yJGm&+=R&B4dhk@h zamGvI*6T0NrrvfxOuFK;d#ZD9sd+8ylF6*!tZ2V&SVYj>GtO6Yb>9}4hn5XOfgB9+ z%(HqGK-J~R^qqq?e~a&gmgf8!c>T_^dp;QTn21}Uj>_gAz#A{qD>C)f_aIS*?XDR? zP&`Kt!_6TzQU!GyL0H$Ke8?VwHfDtXG&Pz23f6{6L?2^FVlaG;l@LD0>@s&t;p&0~ z)Ass8ht zy^S)%eoQ>%Z@QpK=I?0#ZqRex;eh#=+kX4OAj}7KgSoe7$X)B+@{k{L+TWdV(CAhH zt#u&xv!h~C;f3booeYh;wCQ5V|FrcH_ysGb#x_kIBO{WE|{x}ioXHIK=Tgd zYxEM8a1BZCz{Pfr_)fW;#bi2=AiW_u7Q>zt*bAdEUHK{_&ga$*x3otx@>Ubdg9(eM z$hbSF?%p{S?HFojMVtma$=h_T<<&1dVd~{VwabYPHYbd~oG>9CVCmL4kLi;TmK_lS z6^_bJj@3c8E8P6UncC%lkggbd9CQm$YBwKh9VpcMQJR=%yD&2IndM$n@OG~6vx<{X zK;QpUIm`c>KZj{b@n8W{stlqe=R`6VLogp1-iF#j%IRFqMrLjvHo1&ATQnJzdOgtd zRM9Br*52~+@|W?aUY#m%`4s|vq$QBbqzWgfr*~pBrTP+Dt3CXUMt>aSQ)q`N%yHF6 zmJKmB4Zs4_ghW-G3S1Kh-ILfTG;Hfi2rK>eeZlt}-hI-?lzaoBHkFO&{)%?oD+@5T6l4?rDtFj12Lorx>j@aKg;dq_-W8 zZv=n?H4y{YL$xeTB86w`aB8u-5R(EWhgYd}6Xz2MQRF~cloe_C0i6b5I@=zh^9 zBthRIMY+}bJzoxnb^s>8{=6 z?&*w+^RBM@b2pyMM*CQeY^VA#&*xbT9JUx`KJ_?!roRWN(8kq2BPzoYFg?a$FoqP^h zOhxXMB0!u3DrR>A=|Huxuc}CT8O##V;_hW05iPb;cm0R)u#4w>4?x;(Tl~cjq{_~0 zlfL=@A`?pw0G7=2mSZ~$OTEXxuJZOwK?*uYiq2PY7b1=)vuZHOE6cwWH@XOVO-ZWJyp#zk^7HtO+P&7)Te zp(bRJYv{O^!_ifW%`d8w%qN8X-%z!S(2llPhb zclYKWA!o>Z#_fv$`1SpBQS*~)So@AvV;!>y;n5OCw_9(YCqs|uQ)u)0Eq(ISGv>DI zr^;MUR~)R&p1GTLGhZ)P^3-jYXun>>&5vKd++n7~sn!HV**d+M_ObGDUKuLAWKu>6 zAuY;wS3%vK)|P<2C&VD{TBfOkIbBo6V1&qVmygsN+z{H)HbJNZfN3RY%=UHY+Aa4f( zzOkpNDx{%SyeI>VMrKLEMHcmOWDH(NP$k0#Dmmw)#Xf|Uh(Yo$7Ad&v0@%!)mmPsD zs(N4#^pBB095%{1jfE`6$5IN-KOwcAlWW1m!$JmYZHU?JC(` zE3&X_p&0UIS|li0AiO*Xt(Lebg_Rv$$^JM_?1Q=X@3$Sy_uIDXYBs}RUlC(B-L0+E z)lKJqMuuKR#R=Q6d8P8prfaGf%MQGR zsrjsooK8pwIySVjO=8_nPc<(Ryy8K($BuRj(bV1`yr#Q34%}m}o4NHqQU9x#Y&GjQRz=4UJs4>j2n+KAABI>L(mme} zhTZ&ZV*AI+t0G`9g%=%}+Ue;@(01@D8Tutvz25pHG>XR2oVFGXmhOJ@$g zY#n?DESC*E?n zIW3HDS4+~HLUOTu&Ht2UALaC(!rRC};T4soArO5Z2HQve1K`C-4@uI6U1>-|>0Um< zLUJBK5Uta;Nl_9)JoyNFTzV70NDm`n$-=DUfCh;#&7>l=h!oRx&(z~3Zc2UB1WML! z+|SR^t+!l1EBlA1#1o>Wwsqj4bqmrG$-CV{phnqCS`i4pwDFXg@lp@51;J6$SqS~F zMiYgD1P}XBvYSZL5Z*Bg*^nl`nT_)+an~#CO0G?|5yH6f)4T_m?OaWe)hRm*71ZPi z>+h3sl2aQdjtNk#7WKZ=LbP)~u|CEzIo|1Xwe@`l@|ts{$u^U2yRj2*YnoqV{^CZw zA#qgo@?BaXE_na(zB76P?|1sH4BeE@D0P0jTOUg}Z~v!%<}k}$-QS#eQsv}_AQIZR z>PZL*WeQfU+j&Y2C1Dh0ny`|FxQ+kLRTu+fyn$Z9U*DE0hGAMLcyd z)MHpx+-~YIs=@k-_AN8+J+(FO;n2Ifo_{7~qoqvHuM?>^jNC3o*Hr_fH0gN&YVKTM zfZ>&3yayciXuFo<09HA^%D8) zA)f(gD-O+~r_5oaLWy=2^WRN3H?o{Y-M_ex1ZdO_I}0KjGo*2MN3*s&I+0IO@wTr* zqRupa!1$lAA-cMo=lrwlf;MK*{?hXTDPpNK3s+;parpHc%>&Ar;(Ni$-WS#=F}r8x@oUB7r}h#9iekCpm!ZE>#f&NUN;n}riOJ^hOFYU9@jWL?D4K#%O$jj7ZKV>mL47!@9J1F#FxZ)$YPb#BV=a>%Xh z(F>b+{^aO_iHj}qpmQoJVBw%Q>qJzb^5?t7LQ;p*L%kEYUT3|g469p@gIyTmIGgh( zyF=ouOFy5aj5Qj-l$K#}PmPI zg2{Hmk^KI)tZ~QjTKUsXkiTYGKEUDCx>GSK^Q^rh#q{X$PULr{5d*$ZKAd1V|5S?2sPKzLd@w@AoUlHr}gUQC!eGXK4O* zZf3A`T<&2~-?)fm$UpP>k#|&LRUW$jMr(DRc&j@O>4$z|&9MBCbQSZ3NX&6-R+@|9Bp^_&^r zJv?ER@rk0*S__oWqrKPhjkX4;JH1F->uSe&akW}rc#}~QK`bW(VzW~)y2LD=h0_|8Vgz32(x5f4eb5Kt7KQ3hU!cXZdd)64}HxX+Bo!!!(s z2WQ`Z=rt+7*R!=EHB=~Q>3_)E`GQ{nx&d8pQ1UM%T9c4;GQkhfh3=}|$C{%3gYgE7 z#Mt-W3@$;ZFsO5UYUXEOHdIHhS^mG{HKIIwt?Zz@<&b9In>h|A(Ajo5nfQh?6|T8+ zhG!3R#~+7c(S~}qMtuwOPTj9-1HN~knHZx#g(*SvVIftEq75w#Jb*8rCcJ5vz+0kt zG>VZVS3}SxfPFaj2-qUbYIEE~S{K%LYF)%)s{5MFbvy9ZU3}!On6`1Uc{+CLMD>Vq zv$BiCXXU;q8Nb7EdQ_@X*~vQ~-LY;YwW=vfCyfzaGRrHZSb)0# zGtmoD87h&t1F1%~q;>fogtnU)>FsT*l{(WfsCgV zl%3Bj2wZ#GIJA@(aJ6~(o8feGLw0}!vya+>;QdKcn^Vi?C8KW8#!&6!6$K?ebE9jS zymbqyE+4)~^ak;Ui?#Z!X3N%a<&T)D^UM#H#Bc*zNXY(-qPzdh681W7yI$QGngcO` zq`S_pV&8qmBWRP!FHQq(%riIcynGnqTA=4RZ-R4e9d2_<)ze>^^ZF833#c5w0Xk~k z?>cYq(K&tcK>4+x#%IBYpX46D@$((x`nT#U0sNPV4N(TBE?G|PoSRh<$#m$mRDm8J zldg(@0UyABH@*3H(-!VN@N+oPqcmc->YmJ?*YKZfmBw&2gJXl&(A*r>D$G24`4$RArOSpN! zD%9bAE4>iRL_M53Jc>L7Z&Ot0l^nSWbk>(+(Yo;*8_|$q@qLlWu6(Glb=)5-r@5H z$yBr|WX1#s096CE-BQOQRQ#u`OSc9-4NC2ZM3I)o($8Q%dUB+X6?CIH-%Bu&Y%?@t z)8gtoXkOY#{y6wK@7tnUV5yGIF)?X~p@{nxbLaD8o1d>)_E^pJGgi#)0t3k1azghw zy6*&g$^So3&`0k3xFw3v#r0G@m6o(wPlQIs(iGVid_I zg*+`B1bo~c6tb|o@oaeUU|8Ot*U;$6u?_-pMgt{Pv1`r#l8V$Op?jtsyLK+o z61st!S(ypXF}Cp*?S-Ah5d&n!eq$r7p9f)-4G~d(Q9^cjXQWkDA{#F~5@B$lG5w0h ziI^lI9h$%9_q#l3;XyjaT4m#UAy z4*nXyn90JuxM-MT`*c^Bc&DZRVb(;%m9mR%&n`U9V>qh-b49hESA!>eH|V+U;DUx;`)={KNj}r^%afZxsyU5 zn}dv!IaT@rBZ{sMXx0YBP{_%2AwfpEXAPHr<^7QXwN~Gq5{uZW(o)icg?;cN1U2YQ z;NyF8Xu*h4m*jaHzh~;QnC!LgGON7{%oF|RBB2RKQ^OYJz`asEj0)M8?goY`{uR~_ zUdyf>jYp{d80!~5<=lNqZM6$rLpDU{#)zv1GCfVO6*mX?Ki2xoxf_sxDIj@Lt(~Gp zn_m43%FykEnp&vsaP<#RWcvzIExD5d2VjX|G&K<8DTyLQTAXrJ?!I36747z^ZcQve z2c1OA$=k{`BW>6>|B}5E$PtjHq(bp%LQOL2065W}e-K!Vh1h!t6WY$g3FVKpWj2l! znaY$#tYh#}|C`yllp~{>9`(Z<50=-pI_BNK(c^Ercke=8F(xby6~;4t9X&@%t#?6r z?vrR+&)h3P-Bw3Sf41UldmT>Yo}F*7Y7Awg!<_HsK`WO_o_R>KIPwhk65Y6AC?u=l zSYhv{NVSEg0x+uuEl3W-Jm6^Nj8xIkDVMJIN7um-aPDV|C>4ZcH7XYIM zQQobI^RIw=m5fX00f}L2Q63B9wWYj13|5YPMJW0~DZGfl~T;+aid;}huRbmxs zjK?^P7+J)@#?)5a>j!ET6((f8f-QziTHYSO3a>2iC0P%+Xzt6X0BwSmTN`^fQX&se z_{?!N>{t)q6Xg;Ghtp5BbQ-7#o~fnohy}|3w$ZoNjo%+;?LOp&kI5SUJaBIO`**YFFS5yX z_t?EorB*+qlCw`bGxd^-i*ujkI{VJOnt5DSG!)*L%#6eqe{`;IJ{uJ%6`L(Qf)3?D zDN^Fz1jTPkK#Ul(om3@75h21g?PQ?rI3Iz#3lk~EFH!eM&ko4;kS|E&x%DEds?-YD zUMSQ&5-p0hsFBwYxJf$t64|pWrrExX!A$uYN!%IQdlGr`6f*aq4D%&~PY{YP*r z_vnk!FDGOF~5-sUG#eESgtx& zBep-4vQK(#NNO+Ka9Dw>kx>KX2wgGZ0Lib-oDfGg6HPjH)z?jJlVB3VdT84N*Bq0> z4lGaJ9d&)&b72I&V7%at^D>b?W^X+}TpSOADUi~|+aHyZ^(3E=Fz{3+wvr@Srp7%Y zg?bGW={sk+CxE_GVJ{M+t(!uW_inG(fW%hzdMzA7`QEN1qP&@7(uqHt)k3h)?R{AG zZk4hd8bkkr&Y|w~Y6{sxIPd)ro{g{v3Wc@3jEJ5+YYH7rm>h!9)VJU7-4afC)NjbKC9;t=foVsnB9aBvf!4uTj8pG4p zeD9TzjTc7caASe`)VxUS00szsJX*pjzl|WExdqZY>BdQ;B>Jtsx=FHg5Th)syqRfk zIOpRTon{(nqM1mkX_RAF z^{-CqT)Nsa7$wAf9nj9eOF~=CNB@!?^@WbnIQ3zzKo!#Oxc@-UXRESAD0xc;Zg4E7!eN3sr}GE^}NWd&at5pNr!kKE}#KO<%s)n;qz|JzXQdnp6DIZ|B=T zHo6cw4h*65GDGVuHNyT!S)>szY5-kfEy66=6+z;qn;M772njP4VL;!x?3iXQXotd= zc?!W~*mLRG_qB33dxGa}DYOi5jAUob?x7uGv4v7+AWUPbq2S{@gv?0oD{yP5ID}WgR+;wj zF>Jb5UG*bMKViREaCxOFvNC~s3m%Kq2ien@WbMNPw`*Dbart|Yy8*L@M9d!27FQrX z&M>ZuiMxu6+&j$C3Kumi`&Ks&EInO-YT-PXvjg6XSl}&~2NSw@qW}*?Mi)j~KJ2fZMt{IU$X0gKM9^57)LwQEx5H z#8=xme@eMio2{TaRLRXoMVBkFN}tsiHL9?E)5lF zVGVwNk2o7$K6eiiZAR~2*}txQZR08G)}nH+aDuKx-U6Pj{0Le*4j9vSf5c(rIfu%w zkqCAGpBcf1Qp?|eX&%(gvaNnkOtri^VvLK@eP9T`%4_Dl^3-j5{n%bnfzrp@#DNha za6;4r`fkoideANo54rPKzG_&Iet6UNW$k1KtySxzbG z8k@>39(pnJS%;PE%+hvcAMgHY?Q4DfXgcGp`J*3>4|p}jrIJ(gD?#>lR{#kVtshu9 z=B!9-bY}{ia&lNcsCM&H(m!%K8ZX|37J!2??Z!H=UN}oOAvRaI)v&$b!NIA$mFY{0 zezs zgC?I9ry9*WHpRCiRR%sz$R$l_K%m4#OLpD;a?q}2%`A=y(Ay>yW06W#?-%~vRBa63 zB}EJo{^ZpH%vkB!TkpU6Y7a`+4GndZFAtTE&x~5Vzg?l>ZLe$>Hx$}J*#^Y7vE^j@ z=v%-jd!X+jk)}k7U79q49aCRkJV1(fl@O9@S(&#Yf@?ARNObR!<%Juv8Jpl*c@HNJ zry5Gxd<2;^kH zlaEQT9Lyf6H4vYGP^;kP{ZTi3cnD!t{1Kbw;@Q`&XBECRd^;}u@d-cW!x4{cv_BF0 z`oUv7sZuxuG`uwHpsJDWt3h_fe<2CUHP(Q`Bg4fwL-G;Ge7w_V9_`y4?QfD-*HoE@ z^JwP153@8X4;aFWk~+k7g9YoZ<;Zn#6;gO5APqnrNkAKH*YXGeDWLX3@4|buY4~2m zLJ*Xr02SXYRK!z^2E59r^B-w0lZXbvO2$RJweK9 zrOMYX?8N>JV%lZ!Dv80A9{4wuKQPrIwnxgz2Y6i;4b|A;DV?jHc?(5+O-!}t`0{NA z4$}w59Z(PH+F{Gv;TKAFjypFewZG)XS3dOlA>HU$o-wd|ZQ^cBr)|#jFAINA_#Ec8 zU)K9wdi+JGO+CtQ&c;Qjy8c9!g~Vx-5~g4KW#;Cjoys#=Mt^4oyH1&hO=%6g-Pv7t z*rk~F0+Ynsoi4hTukp7J7u*tY!SW$?t1b;2+=rXQ7Z*^vfl^z`)0d6? zyJ>do@|p@#b?|euZC3J>BuK%r-aP4v+j6nc;_Np{m7xY-_Q}NCYw8+{r;j(2ejJ!G z_(fYu1|20hkz*P)03Rw$E1gzU94DWWd`afmizcHwAK9}pUXbk$3=s9lckhTpXhM$e zx&p{4bO8!S$JiLBgA>AU*?-pE?<=Up)}t%q3DTh!$onfVXj@FwhDjDIoTCi}9lm=u~ zNl;y*>`~N83zS9^Mms2bhgN)8i%G^vJR#Vua~zc*Jp#mZX7;&e9OY!HPgp*3h&Q>FG7P~Vl5_q zh-}Q~oE3?uwW5R{H5{r%P4Kuim2tBqjv7@2PenVFzL;ARq<)iHG8q~5t<=rlf#dls zrdSBrY>eY}*#?dFYix^&SjcmB~>2yPrh2NpE4w_08 zr-mJzomcC=JgyG1)iZUbtc<3h{>*dfr2i(1WCiMcb{UjQ*+i_XPOaM3ZHB8Vv<_=|M@WiDxT}2GQ6JLJPS|hD&5>=Q z%vd3H+w3?ceOrAz(u5=@6oTPm3p~PuWko#37JpreVjVv;LOCcG9qFBCy7&;WYn=?q z?<2(CJya#K573t--Ymh{0=a_y2pa(2IkgSM>L$Q>f!)&0A{>1WXx8C@G#D|Ep2HW* zdaK5qdA)C0pN=WJfY!V$!XKns;`MU$*^$HcuxXorDtCx`Nl4{ztDy7K3MCT8F4 zdGngt^NjCxx#b%*{(YsT_CH*juFZBg{vB)lEqiG)T(+wk2o+IdD9WTLamPkiJ3f4R z@!=srH;!!cB5=i5K8YYd_HkGF5$?cZ1^K2!;Q=?btb1!krmJ_qXX?wDTvu9W_rHPm z=y~eFW%d^F_C(=2J&7tGCfGzW4W#UEDV-!6HvuE@iMKh2L=n7N4nDjHoceN!us_Hw zeC<-fi&+idS_^L8!K!hzRRlg7ux_P}t;%-mPSfvG`e$GV~K2(lJpKjK~_FlKdozgHtcJvCD!V|T=Gh8`#5 z&QFH>-FDj)t;;|8sTxajZb=MvhoaB0fiqd^?X}>MwsIs^WaQQU%t*=Wt!!On3e`^gsRyP>dd(QrWm-abLO*^-w zovZq(U^oMZhW$m}UkE<_cazr$!m^m;^1rH4B5WTHs*WYj_uiPWt4(%!%{N)ly#RD( zvFDt9%R7I%4{^+%dj*|dY^ocm`EbkbOqAYgkYL=EQ>fd2?(IR&V{+dQ8ocT4RMqEI zJPzykbGQ3S*e};Y?aSy>Gc$G>UUu}U89VFVMc-Av&`QNsRmI6_)Bo2$WQ;^C(yj#3 zraKz?xqd-A(rz(cJ-&} zsF)|+S1;R5Shti-K;<<@$!EcSA$%t{L&)3Bq#0w>K>Z8DVfq%^r@>^q0hgBS#%ptt zHEQv$btAgNVd|eUiPF5m!Q3XM}Sk&tXR1Th772#*DnnCF`bx8=uY79w(K?uMh)H zK(+M!iPG@r0#F%BkYZ1RCNvFF{!m*Tr0AFGvT=(cgx!v8Fvp8_b&wMxyg9@UQ{0J- z908M}v@93K%dpvZ`?m->nfx37=f%%y6FIgoZY5jr$p+kG1IrfHuAKO*4MWRXr!Uq+ ziu;+g@ya-<8EfvxWWP!CJ9l;|NN=lCL*IL7Vn~slt1{uHM)>6}XBShj(JCQLXgtBtZ*I9kS3qG%s$DgbN96 z>nz&1M_YDfqOlgv8jO`}X_f8ZSCY>XipY0C%@6_=x`HoDv{u{m?s=KugZYkfBoB`V z-$yUjJtin&F`FDAKO_nom*^=_7MxQ!b=`1&93Ce-MvjDv+$B`I0S;uVIw_$(kjYct zMb>vldt4l?{Yp6rR`duRQ^|&+Mew45)VdM})z1xZET|sQ?x##*@QKL7pvO+9XEBMMC?Qg+|NaunH8DPb zuolTh+yuJf%V(PFqj;Kax(^7Shsc&DjM)AP@^2drynsrYuO1XZDip-h_j7jWCKD|j z?E!AR1SV9`)&Sy@I6jJPJ+K5c^FLqDUTppNRDQl;mN2u3t0U_hnXu1s1D3fj>P`tv zVkgUeu9Kq*t~u6d5=M9Xj#U!6SjoRI}c9`tn}=2Fgb!YL9^Cm zTZ}sH$ZVW5slsA?D89KM*Ny#Dl&Q9R)}>_5iJ8FE^9qxACVX~#>G?Tfty5RcAs1Ow zxO_tR5=?=A8f~Y72Ji)CA!@tyj^y^GtW zni9jh*Q2rn8(d@iRRZw00d`-8_2iJjCOIWrzZ6`6!cux65LP&L>kVgwxhqmef z!lV*({_b-<43|USrITW3Qd}8Pj5{W8<~?Xod3&rj+Wh<3$#2tYgq@9-^3@MNTfYd@ z#~n!v^aEyM4w{{I3<*)fYD8LxgoI*|^iaeA`?c4t*Do6zUgdjjLDXfPp19n*XYfei zD^AzA`;+P*PR0pamDvst+YB4w*Y|l2*c<-3*b8-sA3L04qMJhKhUOtOLtpdh?&~L< z8N!+0&XgEy%3xmQb_i_ePx$neoPYpV4__?Qu!vBPVS9g_n5lo{GS2AgENh9rv+ zntgiR6q>L+I_>?YF$uxsyW{Tl)02c1D#YjucJvE-ty_`m+>tQ6w>=-JOZMbeK@x3p zc&J!$8?MS;gbT=YRA?g_#TWJ>>af6SCuBVF=<1KBoZBd0f^C+PH~x}FM*;d>sI8C+ zo$$~jUqfPaU%U}WMuSyC$1Ooq2O#k4@CK{aTTA~Ma1{AFVGk*${SNumtCv+0d`D(! z83|)w8|NrDDHG0)-^wXMTVF4lT`~7bu^QJmG#`}HzntxXJsP;MP?)50>T>UqjQ{zJ zJ$u!j{&-3eNdEY73Kh#aGaCMCSEUhzyK2mQzkVm{hWE4H(#(i$!%iO)bpo!3XxP(F z?vKZlkLfWC49z{q2J&`a%h0cgaAoOSG9Iy3Gr4qkC3yl>?p%?Zr4RL#^!|Kmbo8H> zzh*+7iAa9C5_=?InaN8pv-N{_J|HX%h7^%1=!!m|8!tO6y$99Od*c^~9Nr{_kC3etV;7Cj^(Uaz!UAj9DmKL*zG@#|r>>mesHGf{ zMuOb@-4aLz)M9w6r``8A2``O^+9W**eXPt5_?V*yKuuYK%Z-tBH;O8V{rgGrS4PMo zqCgYYEIzngY6jFU)M9pk`9pR&^yfB4j#rcUS|M`<(MS5cum#6oEutI&vv!!~HIkxm+dB%>5-mc-Ozj)2p^hJ3bf$Os>H&)>9P8)*OdT0kY{~J_ z74qq&q=44!#bo1&-Wxxi>ND-lqZP2v1FDA?kzEqVqPPhnkQ5(Coy79ms~#g1*qj{; z^g#)aN-oh0z2`zOv)OF+3`@v{d;KTrD;^^HXxfb!$4QXs9qY^87f=vCFx zHP&>h%tWsY?Q5jOj?K`GV)pMgmfU%ja)arcJ2SVgZ#S)(ocSndmosi^`&H zDnhcwdr)RJF&haX6|qve=}W*RhQD}HwX?^aZrLEoq=^Z;=Jt}REk_EfhAQwi7MJ+{ zZYl(LQWed1*%1&`E_G@G;nR-0K6;U=r;+hRSZ(NNbM&=oEG$Zke3L6*#pOs85~tY& z7vMWjcy_GT9xCkSJuH0LJhZUbnJ9|B@Y8l=;Wp|LtTkUX!r(JiK2Xspmtp)1c4;Wv zP6fx{`d5eEMvtMF-GTCLn;YF;AL-lNei}U8vg%&%Zsw~3jPz!#JSXBN&Mp}m;kTUNr>1CmE=IRn~5Dl}pXduyf0I{kSC#2zT2L<6vXMh=KduR)-!`hoWo1St1&%uhX%L?c zEvf`66>583SaZ1cw=I4m`;?0d-g@$Jc8y6|9Yd~@D(M4m!g5F8l+y6*mM@d#Yrp6>bvDPuZz85mqdBjOkMP5>4i7ZEQuFc#b zi!C(-9Fuz4^ptNL^=ZvsH%%A5iQ3;d?Sr(dFS%-Kp1fhh+xTLb3pBo)XV*0T2-MKS zrMKc|_*r&UK4@I1#)Ut#oc79fAA(v*F6lmHW+rM+mOZy&1e$9$c>VZdwhhnc?8oKh&0j)T%-P29ChLTqD7u&OACxY|leiB|}l$H$HR}c~f z-g4ipf@X?xnXewZ4&!@P2*@Csd&Qv5aTetWl*-=B!=WA^p$QtXPlQsHz0+2TpH|J2 zB#YsRWE&CTFZzCXnCnLFF~H+N(ZsCrDlQhq9xn@lqQ+ zkIjyEwc7baiNC~|Ph#qFADt$#x*{F&wvI-oWsYmt zuP;Xz2Cij)EM_pUjSqZV2sly}-?SbVj>j5jnbxi9Bb;|l*S*fhE{L8W?(`Zw?kxLp z`e1}~*K~5Jwl{q{=sx46#fZ=aRvsDCj>IY+;bh)^_kG`%vpP=?Ke+5f+vY!(cec;9 z+To_q3QDxgh#X+L#~pf`hxJx-aI>gTHU4_z>s#NheO{yOmsH$rT>~k3b}46&#ak3( zyY86iCKVNz`Tdak`aER0x%ZqraP7hh@h-w%huo&_4T}wR3;MGl=Ix!~AdGx+B~7XU zLYA~`PM}zbiRT)Oa<)j6S8S6zQSu%ur4o;J#XY1hVP(p96Ud5)QJ@?Ft=nMLNkREq z4I3p~SpT#=P7IHeVv6TfHTsilmj@8nOMS-8V!tirY=3I)eF@rNDy04mpa-DX8A5btuw>swS$te}T)ojseiZ0ea zm4NrliS*9E96vUY@Eo8$T*w?TCZ8R@uhD(v3$l;zms>{4cvXyhug$|fF;qF>~Cg;y>ye@ExrGwVdVJrmqBd3p@MfZ z1F(DDjWj9@NTZyw@)Pp5&ueRf_C>PpOjUG1iqzk%%@Dcj0)?O&fayY6l{h-8tE+X& zlx7RiW7zC4?2Sak8D|?~-hquqC?Q3R>k8rlS0~S%mxMzZ-E$D^oRXD)3NpmSbGC`K zENwxa%D8o0PA5wBJ5rHk*P*>_xV929NcM}m;%e!8J%dJ#)^5wR_)GKln$GL@lJ|LA zbJov^tXmZ0V5)2a9uh1!z%fqH3)+TIYoY85g-swViHi3TZfdF0Ls+v!saiP{YDi#y z)iy}L)oFx`AY1DPuNi0l&>4AaHv!uTI%PRn1O4%nVafj0gAcP!bD^(gU4rDFI=<$@ z)A9ekvQl}VPc=mRGqCdA?Z`w-&GS!B3N;en=5v>IbWd2hx@UZ0ah~KE1z)xqVmj=Y zk#Fg=%YdYLuFfH=4TltkCTDcy%+#$au}7KiN>644ZRYU{4gUvi?*a|w8pr=Cl~nE_ z#Oy*s=;BgLGdqe9Q?BJUTP21xTbYcEnVtK6b_zQ}h;bWJF+|M77pXd4gzTeNc0av04KNGy9ZkFh`Hj0$E zW}$qgl=^7Kq~f>pBfuupr=scc^>PzO+Z>g%{R)^e4wJ zRL#|#;#H^{%8yk4Q$xETwjNpVeX#%IaHV_Ie$PsGGskbyhb0g6PrUm(yfQo^K$L7z z#M&zzLTNuAVuvZ*5|nb;GJ#>(?X07eE}bYroK|#)k?YWRI-bK;GAE%cXZ$XO-|2>? z2LuewK;kWchAk*8sf=zO+vfjrHGaC6O1ZvsHnntbd#H#LD2n+lH3=l}h!VZp$M?Z6 zV=cIDo@e2f+QmZEMO&lJv#34&*0d+E1;8fN)WFZbPW9f5)l+@O9UE zptMM~qlacOY@jAsz8*5(juxcTb$;e)%m};5yT_K0&V2ffj|Z3TnG?*Ex;3ot{9O=p zJlFrE%h=98FNJ0YgyLqmvk>zXRirC)W6JU6{oa{FJj+O(i(^(wD#Rk+CO4Z?Ev-ym zJNH^%*`y41$y5pD)Xn|=&lx!bi?FE;N0L&aj zV7>358Bp~8rap0iOgRWy1{oPdR5Z;F<-1kUtKrMvx^9o*sw6H$O(#9ZF0FRx*$wP^ zJ8NAD{KMt=ISX0murXDlMHl|^@EOxf=v2$wO}JkoXbFzZ5y#|nHCY{DkIKR(zs~=j z7-by00ysMxj!s4AMYI$~Rqpo4tNGvThnJt^j!kNrEiDy)V%`ojo6EnrFF8Hu;MH6M zZ>JD*-x~p}1zh#)C8r-Ig?V4@hcm2hKf3-=xO?=VOP;-XVeZYON{N&DY*Ykl98&Tq6zyoG2Pn2rbIP5Cci4G_uRtT>21W|tFJPQe38-F>!=M)*)i}K@aCPj$(94#-pnPK#Gxnml7E)s&E=LYJrrJB&TYv>0np!jBG$2 z);9VLrA`Wj%=2RAO4BI2$va4LnZnczsqSZ~#eGNKa#JQ~EmAKH(e(7GXQ0ynr7ifU z9U%xqTGR)GO%?@kXwJWm4Lj_8&Ui5mE4}(reYsr}nrto%b=I~kRh(BVyQjD8_4||N z8?>mB4NVk-ElaiB>YvVP@7qRABN#RQf8y z&DuXZ+#-82yEl_`>XyJ_J50GG>WGr`J|`p4XLBD(9sbhu3vjOEl2>L#6O3**M+xXh@Ux99XPU1w_L zk2uHSOgKAUN8TLn5*+00+y26cfi`+cxNxfD`iJd3MG@G93%8iFmNdJWy$|NoyS`5) z`aIC}qCF96=XhlKXA1}9zD$i)?s@TbpzxOD_fcTRsFmus3^l#GbsE+ZvAq)%Yy`Vz zte&=R)R;xCVikc`PswT^t?gPFEer~yY(rvb#QZ+bMmYB5-w$gBYKeE8MpiQw^n`A| z$yUE!Wm1=v@a5z|=?RhaB}h=a)7y1YXYLb~Yz!xQ$5A(B%ke)0Lpov?u4Qe^kC9Ax z=ihzjOjTmpLSe^j_e)0Rv-#IG5vET9NR~(D+pyV|@j8nJBAbLOmxo}xuAyfc$9Ec~ ze$TtI%YV!H+~(i@C|Bvx&niy;P&H`XV7f?ALdpwH>U6Vo$4R<;x~Bt_|GN|c-6)8u zxab@z2vk_o!NltaWd14Z$#YBWD0sUpdAqfu<3*M|S6*Y}@?=&mSAad{v3AqD+BQ1a z7Q}35*LTz#6h5M>8wZ(t8Xa`aKb%NYn!d#}G|7#w{pR)Hn&3fTcns}ewb+V`zcy=O z^aicTzOGZ6s%Ix+B|j#5{?~B==>CMlf}SNbc7%0!n&{9YH5zIvzT)(>ltbCY(s?Z! z57a|JL3JUF&p%L_JPO}j1dpzozK!;O9UXh)P{XnWKs!1ezfaX6CjC~SC zYTp%CiNVu_^UhU(%7nm~*rBxzVyBWUrK*D~2Ozn0e+QnWv(?s-H-4~%_!pwFm1W22 zT!b=0$tKNAc)B^!GiO3WWw>vSvF&e*e7rpITFA%@j$l}DYWRtEQh{10A<9q`XKy|e zSLYw`utfM5F0>^f)Xd<>b7qKkgs-Kb8oL76W$?XSbCZSzy70Qh%YBB&gV(0K` zL<@fM7+u)Nmu;B&jL>uIN#tkZ)1|hM=3TO8_#JCT1310D4?^;gPO_soz__K7pc-#iF)k9xxMa2ui7?07WpJkguyw*ne|nr>pfP)!$)o5drK_J&-z z`Ss@4QPNOUc)-)=n1`(vIqcBcN&Oy#syX}Wr_qM%R`g?Q2^(2->G6ecexDn|TJBh6 zecvZaaC7j8J0VQ@*y{)-Q8Z`?JlBqt1H2pUCi=}=rf0UU+wl?I56K5{B}d2ZAywDi z??UKa>83#@LY6r5qu1JxS@0WkqTQ?}U~ycNtSCwf(t(nx=}rBVQxG~adJPIpO|?3y z2W;6_>fOgxF5Mmj?NL@yT?3m2Q_emcyE1sF-BhCj7mUXfmlmVp6T2hd)b2RQ z5%%v}tSg$TQ9V4a32btI1>vsVp07LZ{^XN(xXOL*ah@A6SLq_p=p64s&iZnkgY|U| zz7S8dKG@ytI+~@gX^wMRknm#KN0A0$qXBd#A_CAeU)vlIuGpC5SycXC$=mdl{`XwF zG4Jrtl&_jVXt?+hz4-H<(mkv#u%=+_8K3UUEiCR&UcMh1SB`tVmy9U9WVWi{Z$ECX zV_zCDys9&+2xkStw>e)*3`I{Sebc@KD~=UF7=>akjUpV_c2RN$rZf;`Jx7>y#5o8A z6jOGF+tN}k_VbwHoeFV3vw0Tg(Q*GQ;e#7TuC%oNJ~{0gdh?zub5cuYlH|XZ3fl<~ z>33R^%_T?DtoG0i21CbI9uKZWuk65mCDwHX9RQh93E1gV^!Xs8W<8yWazNBg^eFjw zvn}wut!0b`%XpBLK60bsOSE^#Q{J^Pi!Wcy&Fh;oaZ8a6R{k&J_kZ<|w4V969ua36 z%cwfd%!untGrOGYoht|{^CfiE<1h+A>NTxH5294)XY9RCR-T|O?Z$PU7+D*89F+D@mvdCOMZ#8-oW9ar~DO)$iKI-*Y4_Rb~X-X~gWUWkziRsICi zy>dw#gxc5MjQSuhF%i@+m*9%tzjZh3{q)dn2iz_<9^&)p>BEY=>W_a&4EAl^K6i_B z+H~~sr1#>7ykEaZG5aw}`1+snMuG?hk)R@!25^rFQns6=%G;p%|$#)}=#y>35Lf%5Svqh1t`h(>e4m%E(|MvgaJ5rA^pZV*LwLaXT z^MS|mno9(7Z3#Llj>>&jO)(m|0cZ9m2c1=2nE3GX5WU+lDRZ78$_k@=6aFi6-=UsZw44iJ40?NZAXb`K!4cj^jZ0 zt=DneYVfuH*oLf6$MXsCp;fs2_58A13dJd<5r(UqIya%Ds~yOGDK`1OmpAWkRJ-dR7~V8?yG7&UuwceC(VuI8uKb)TRkS8V@kblIbQ;+m#<`lF{Ot|9UU`);l~pYQv+a4XyP zM$@myO)iow#!OE6bhlwt0{`xCxqlBl;Xh^le=TGBKfWI2--+|CvRih`$jEG$Np% zQD)PoO)^CAN9Nxt8HfM=_W$bbzZdy`^#cF>=YLO4P3=Ok-2SNDNAKP%+pcf_tW(`%NMvyA^34SK9U7W@w6qNm7#%b=v9z+bIex;{ z;q)0tr?bv3o?hNQz85d~UAY=^Ei?=lek+=AJBAp0Cow5GB{eNQBlrG;y!?Vc9u}5Y zfE06DbxrN_#wKQS%Zt{wE>1VMr}xj-Z-#jzqhsT5Cnos<;rkCCKYgBGfWChFzPk1U z{%8Haacz>3{hycY|8!g`U|gHGY?0j}_usfSZH@u&vMO7)?mMzg_0$Eq;3&2INAGUm zZGW%qS*N`IF%OaY<(or0Gz={HhR}aQ`yV6wzc;Xi|3@SHp9A~f#x*IkOLh~ud9o@p zz%)Gv9?LSTmBW@{OB%7)_nYJka623hJy(8)zj^Pp-lc%wZue>LYdQ*_@5TP&jkmbw1yYaet5|q)f&ww~c z!Q{u%&f{&*n^P>-SwY4>Wnj1&!$3<=N)JiH)uDtMpFbu$}aT-$z0So2b z!4)C#Q)MR0N1pp8Mz-{Y_!hlwaV?mNI}IXC8WeN(y_>pP+mmsBbkf-%Z$;x7#FzuU zOHHr@q@xbBW^!g!VBa~mGW@CMhwtU#jiwdFFdrwcwvn>H9Y1_hKr{Z$nq8c$@u!Z$ z&t`@GI_YKE|H`0||B1iCVDCBh4kC@qGT%rC#v7o00A{vlFh_x!#!@F88(aZ)i2n9K zK6YEDfUdyAWNWltcQ*T1CbLOA(S%kGx7AGl-fzA0At750(^}xxG=iFgi~zNs(_Jbr zJtW!Pn%o2gyS^NdBd^rmBGuwGQ56E-;wG0LS(e3BOyI12)}w9n60z203fz9?_~Z?K zvV}&RrT+y8%T;+>g0BkYpwQ{;8W?&)-3z+Hmg!6Xro) z-#<@P-gj0Dj>)C|)ymJPNw2RRqU}0&lkv;^g&HkhO=kABqGUfr*{_C*a&@U)sAJvy zFyH*RsaYmcYY;Ks+574R-RvnQHXMFI=>5aQK}0{QRXr92zTbEhRj4G|&L+yZVV zQ$dphL^3)8iu$~Cf23Sj(7r)twb^$i>SWGcLFrCnGp|PjRM{?wEYjM&V`8m~=zRp* zrHdDLPP9{d(W27>yQfJS&AvclNFKn-u?%c-nr0KUjXJRz0PYZN>UPW-4k?!$5h0S=)dl@>YfY`tN`mEz z?8K$T^$$r;;ev~9P61F5J+@|I+ODrQqB4|Ro=TAD*cY{ zLi)&wQ6<4?f4zVDJs3$6z1`!m3p&w*b6q^1!N!o{K{N0PNe27OV^#WgyRAACPEFtx<*q!{$z3;>E$?8h*VTr5z;y=Cb~!PDwMWJ zX=2^4TWpgSp%Y2iE45){EgtjbYOCmPx_PNy*_FMT_Xo;BHOCYUs)akGe^EA3LMc0? z6SLdDEK4^_E)KR+_$zwhv(FXF1Pb;-kgSM|tpK?xcA^(&DB`meypn?CBy_TYaf7!o zV>WJXwW5f{6$Z?Q##aVJ*fyb?s1j9-5Z^N}>EOEY1gR-LPf~*~2?n-<=(hr}FHdd( z@{{N8%xai6x3QdBL97}Ggzy~7ZeqmReUa+tJG3+=buY2P+uyh;;+=Vq+~A>QGbW&# z_=oc%gBZ$jE`);@7+*q*TD>0&^J*U)z4PMGwF8fgT`tnJnW7gpzkHS07oTl+^E*nn zXYMkK9p~`#e`!~#lGZ%DcF{%JD__W~ENq*ORL|zlHSW^TG^b~G1%I{0$n9EGIOKE1 zVd3|N=YQ=D#pt9k{^&|kQWN`EOosW5-LG8KSofWn8*N%NbJ=4qPziKU-)Qo^z`3RE zYT^{7?NW2pAlKwWu6?^0kBh6H?lt62-X@uP*?SV)cPp0ZywC{_2@(7C0SX{Z^i81fgFBnZmSv!J&D)R-MGR{F>N|%X zic%9*Lvm5iI`ur%(!~JUL^id%5O5jVkMZ#;3m0&Hj#Low__1e_!o1V^sB!z{gH9Hi zHK{jh8OKc&T};&yGair|Jsz~ODh|b;v-Nska&(V(`iHV5<59^}(q~b!Uo35XAU#|A zDKVr#?ELX*(q~((tY^14^^Kdd2uC0;=U}q-@p=AX&rYAeV(WO_^;Ui-5nrg_8FmEL z5(j{Th~B1Q)D{vMK2ZlO71Yf32+`O#AY){WBunv)2Uh>SF zO#2qEmLSw8hy=XNQ=TC!_rwKMRHpsA?fE00Mfn&x-W0B&wq4NCqSf-N|RFZu;g6k8J-nm zH|U{HNzU`oeBGyGU#yBTXDRZGETqy}0VuFHK5n$ZFbr-FwofgYCl$#Vp`xG5zwx?1 zP?1tAbSdK4dUBoHUJy<0KL~3(k~GhUybX68&6>X)s7<)C7p1SZbnPu(p&;#&_n}hV z6C#BG&emN#^|Ta%d*!Yz$4uUmx@s#9A-|n%4f$S{)zy^*<(Zm{gpaJ}-5LFw)gtJ} zN_X%@4vsKEprji}e#2&7i3m~vHfc-}>I58&NF~czcz!ldBP3%e`PQo_tXM;(bX5-uOnbnM3)wbCq)R&^Thh(G3~Wdu+Pbvq<;BU z4!fQiVuw!6sxorS+I2&O#RoQ4(QsIr6cMhc1_dP(2u3M{4cT7pzifE(wuJ%Q(7m^Z z-w~atl)3bhgYB?Qt#kmr9fc-oz&MdnFECoV0k~{TXFq=JEJjCSJBB(=RGf0fXc1F8 z3k})57V-f^Q+{c8=86)L;?W9YP-OyFw1OMH#;F3%s;b+U8qtFgoyAjwkRYjEm)tKs z3g(+Kk;lO*qU^%38kQI(qIm7xI4Mq4*xOmM6Alg$O}(PXMVF?Om~K?Ax=x|xKc5(H zccxgE2?K*yJFfU?s!sY%Pr1d!cP~Vl5I=kgcka3rkJL{Dl=E`$uXkee!rTc)9>zTB zcwI`~og;+mH|mDToxYV$Td`k)?~1I?_q}fnKfKnOZ$kW2fP;$YseK`NmuX4K;m1j8 z6(;xkL+l@kUIav58mx55)_ipBa83GO`YSU)&Y4gK_*OlQ;*+1HyEYzxbQXr1#gdXx zNkejSm>Fo-McIC3n1vuNf+$@={7!*WvUI;21$zEQuyb}(CrItyKaNN0L3&_}>srpxc}<1*(jJY`@zyh+eNRqV&`Ob=?8+9HD7F`$JA< zq-Hwdt#ltFyWMVgiRl;#J@+S5!RghJdEcOe(6)!cp_E%H9j%Rg)M4qXQeA@Cm9<|= z*8(>llebF$DpB9~qe+*HRv>B&tew>}19;6WQZT;*(Zke=*VIVfkk(R93RUmO+{};8DK8@E=r}r6Ay2AAcE79GkKV*qX_tj=K-l`Axxf7bR#Iy@k3qtK3y`1}Xit}~; zPV=hir|*j%$w=LEZnj!aj56v!74YYUH`|EXcr{l!H-U+F8PYL$$L#s_zbbt4wV8W_ zM--!L{|>tCpHDoIRkO=Iq;%-@(~DWO!yG5`N{7r_dxf%v!p27-yJ$za0{wi?H=p(v z94xt%{a1Bx_~q&=dC0%>)s%eIS8c7(4lI32=NXnFEGIx`BEd>IfM^=%UfBW53J}SF zjV2c2Ip~x^#THRq7kW3+mma3A+mb*~i13C$ie9Aag`s5VL&47Ok5V__FH zPl^hTth(`-bV;~z%-)8qG;S%zD%&K442O=G4G%1tTHbXE5v{E0Z!`d&R_%iD6}lzp zei>1&S86?kGLb}zIMTlWLtf$}K&Q886z)RrwnC%;C>3j8xW=p^$q2Ikbjr0=a*P3d zwQeiPrCy^2r=Z<#hFSS&6xeTyoJ*;to7uQ`zH3>jYcJtzHzcu8j0Z@KD@Uh-N2yYp zR0m!Z{77AqI5fZ|=oB#N>d{T5X-&=&qtM#Lvx8PEzY$Eq4rjhu!|X(3OUm}ztVV9m z8~q?F!^A@R#|}`{zG|9S(QW*AzQDHV^Nd~#a4jjFE%F=j z7^O$QWu6Rmc^cPx*`IDdton^6{Eim+%}$I<)mfF0zQ@J`bVR@EcCs$fMktrsZdOgi z%w3&10QLoJZDPS`Q64R)-EQN)_~!+(ZqsmdM@09GZldpV2%AQ-Vi?@vwoj7pRU2r| zUfuW|F5#RGL^ zsFx8{)6-5dsNA-(+{vV0nbjlL|6-9S87K|#>uB~4c3o43ABy*fQ2?3o+N_e~6kKU^ z_q&C zwme4IFNYCvsY%iU#7utwYF=+5-J;#0dQlUr@+F$BFu!(;oxc1Xr#ESr$)j|hBX8?3 zgKrOTW*dJj9RULJoWf68$P07XPHPyT+~;7Gzy}A|!bjv&P#(cDVL{F5^+eF$)kp^D zZ3hUQViktGIIG-%Ji+iIQqSmVjjYyXex73(h$s?OJAc?Nq6#rFwU#LQ@oH*zJBW~C zYom1LXEb0n&_d9E#cr~$m@^$nDc!reWY^`3RaPDlc?vN}9~zxmI{x_M!Yx1gs5 zC)LE6m9HuPw>y(PN?IB#oOVyt{I&{lonABA&;pdIpI|=1%CeaF2Z)X-O9B3T+OGyJ+kJRTesVL z8#`?I_`&_ebwkhXwSotsCU9!u-+0YkNOYsL#;M-WBRznv^+)J~M(4|iRp{Ao9^8UOEDJCt|CE4! zqMmGP(Hd&w8D0RVK8D3XgWWS~u+rQ=e1rnZD1c-D1!Yrkkm*{o=*%QBW3~q|Vco24 z^+>a&u$Fk=KGEH^*j=#V{(ONa-O(=!GV{C;k6ClwV0;Is2ThStCncStiaPv`bP^7Z z1NV~en?SZDI`;PHselm4$Z|;t$OsF)QuX#-zy$m}67gz%m`Gl98oSY;?WXbP!f-5m z2>@iaJlUuOuy4G}0@Brr3D#g(oV0y(_R*+|x1m*bjka5_S&jxVto?F@M_tN30gk`GOe6^1 zt)ilhZA?5EJ_O_74Qvh3@Q}GS=IE>8Zj4f(u;!4{-qAYyTLZr;XB|GC$`Nq{kk@g- zM|BYax_C}ek#((_qnl9a2vJTG?*sR@2ux}Plm*F^x`y8vh0U>AMC=@ULPCLT=6W6q;xT|GEwKT76+)AU&}3KgJXBSiM9Ql>VyHx-RL#%E6?a%Xj= zy3%0~!LS+VG`~msa{Z`WYDzO}SDzJc)#6yOcB+*}6zWv6IAPm=eC^D)`i0s>A3tL#+8wF{#~XB`_Va zv#^+t?OxeF05Q%N^#1A)9}^KZhgNqG;6b#@b~o$EHJ~p~8 z`8fZ#zI_4cvDY4)4ZLh-Zs(Oxdu5Yt@~>SaS>Doy!?iN#i9L?_fu3qU-chZggQd?c zfW8&D^OK=toYGwqWASn65L#hbatUZrREfMZkWKfJ-CTi0KavLj5=M;+t~27`bFeBB zS3dpnS0!cKxZfFSI_bm{1&`4WFPIO7>4j{^_Emckr5 zsj*G}-Mdr4!J!cm5xU&9N|1<|JzDkf2~InbK2uY-P;k5O#>3EZt3neSaf0OUBFEqV?PP=gFWb=nP*a!|YA;<>3z z1;qibDmx1h>KdJ(m6R`4qOmey((J=NA6X6DJnPmmOoPy=ZvFIW_O>nk--IUFq_uHg3CPbddgpr#FgW`}{rJV9OB^%nkC) z<+;7;zq=~APWUAB<7QQsOnWX=H$FOfC{W8~M`HCb0EUMy;a8GX?hTVQ$?P~T_Fe*(5?yV!_I9>cEbO{9P0gudOw^Xnb9Sd0S;w5D$!WSB(>veSk3HR z!=K@Aju)?!(8x8^VbMq%nHEZ!b91+|&;|$TvFN(^&GD{IBTJEJ6iHWX4B{*Gkopjq z@w+7s6(B9frW-w(+4ZlCrlE-4jY#_DFvr$|ZMqPRv&m9bCq6}2Vgv_^&!B1$scPMA zL~v2BucC8U`Y*vDf8XP9>47G8Q;FIBsd2InnZw=#SbYcJ6LY1TNw?uEG$IdhR|lvF zWu%dysPs46=^2 JC%2lQucVH_X|CY= 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�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 literal 0 HcmV?d00001 diff --git a/information/datastudio/New features to DataStudio.docx b/information/datastudio/New features to DataStudio.docx new file mode 100644 index 0000000000000000000000000000000000000000..d6bfb4dd46239d057dca0cbca7e7416b5e7ddc15 GIT binary patch literal 254615 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

+LLzFi* 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 z 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͵G#&$*Wi zAmI_wxX@6YuMJ|w6^XQ`Fm_!XN-crnNx?>ml7mnraBVW6`2RlNgQZuvj7(dO?MpJJB@*YrelvI5hW_3gL+k zU6e1(8^hsIoQ45PbpAFW+3AI4tKq&^ytOC6F8P1VsCwOwm#%Otw$HDK+G!Jx(i(Ab zv!Ytme1)nlSOT2k;U|XDoOb1Z5ORnS_n0osg#40Tn^ReB{#kwB{r0i3KaMX8N5pLO*)=VlnPM&iAh;J^^QWzF%it2@ zFviMaP^_|njH6@98THKFeY4OHn=3a7aLaY8 z14~%A6+uIEOwxze{4d(ThAW9L6p7D(bpz+7wgOwIwt&fo#r?Q2$<%}ZrMq?_UZP;j zBWZ|rAU~0{RXHqCk==v`FY3)Tcm_l39k}Eld>$-0Qpc<-G&nRmOjIYbnEQzG;v>-M zN%HT6dys!AzJD@@)13+1YpKJ}BmZsjWn4as1=pk@lej}PUI=r`s5rFlt*-}oG1#d; zKWg^Ztv_phHcYiTmz3OIWvjSSj}F95p{38`T*7V#<8L}d+T4B= z`^3^T2xY3{KvqVK*qwLIuNu;J)K!d|vTzHNFNWPenQ0JoxwO;SFf4SxP3R+&5S`T{ zRFMm@b3-RiqJiiBvjNo8EBd9^c^m(S;2Wez?fc-PvM)(Iv^p@!y#s)u8~<{%8`yV(Z{Z?xYcv ztZ*ioQa7;`Dx6;KWLfD61AZo0npRzb)XxdE*U4pb64(GeB<#6&h*w5l`DaWfF0vHW zBGoYrd#%F>nTUZ&5%(^@_7QhLR5!?Ok`mSG4wEOih)nSrXrHSjnW^ZFd4q`wGN7Gx`SYD{M_x#E`XR1Nl)<6?UZN4PjkK4jgHLVYa;O~Umbr*R zc|pV91cOrXr9q->uvh7l>?>+qu?R(@06_^D{XAN89kMC>=yS^}97gjbOkq~dawEIq zP_L2yz=~FOU-6RKom*LL-}QVQu7;+hl#Rw0+~CFM5z1`}(32fS<-5&7CsWclO9!XF ze(}&5a%t@_%dB&D&DTjO?ToY=ewA0QrmM)lDZaJ&hA1mOCIo>^%^)+bPC5ZwO}GZ( z1UabwTZWbaye_G8455S?P?V=9m!v|HBe)2DdO;6g6nNVWElcFb@kK0&9=Y{G6LIXWsVHs$)ZIvEojxewh1MP#yo0g-CH3#+487mfS|Np(@>CI%cJfg zcnpYT0D&DUV*gb0h(9cRCcwU~71rnRM!V|)mpWnS6aV{LDiD$0klH2`8^l^LIc5+n zaeOc2DYc~jLehWF>Hz56N%wA(97n5x`LrU1s5j40YZg*6+d`$Te1VKyh0YT`-nLS4 zRbrQtbGYq~pu+i%{>2{%!QJ(fph&4vEd4_40CESvO-&?fZh=;W=Ibea1UOIb@1GNU z=uSo%jDyewAD&^b>P=P|6QhK*O1v>EH)-QB)ck6EBtMqksM9gkJ?eLQfrAkyu2N}-mVw2RH#ct_(3!S_3HN3ES5SGYrN zcU8WbA8lzbl<$0Dg}TC540dBo}qaK z9JJUH6>w(?O_UrP#Wd|GzzV@u-!iVIdAg6_KM88TSS`70P1OY(X)XhQ63n@LDK@0W7u@3bJYtkvWejf=ZaUn{TH|$iuT2pXW}wnRsr%z=14BsOBtm?)C8x@QmY7G zG5kLFm8zz!@LNv$q8L}EVOq!Bh7dIUV7Y_U$K;(Hx;hjdwItVC&f76eYc}=(V=f&e zy&tE3rhH*sG61W!&Wx{vsWO-q;~2&fkn!L(t0Q_D`v~sCV$9tt$igj_v)(VZ=n*TI z5&rCdDR{!-gz{6D5G=E7P0hE3T-j^$9U)H@kSBx@i#b9#Cj#IL{{kU{y^I|pxjOAe zsl=U7I)(>GA>G73gtwAk%xTI1C_gpv1pcmXrbIO(D~vjyyhDPc4@bF#K3 z(HVQDHHRoKn0|+);Byy{Pth2nTunAwCB*EXaUYDD!J@lrSExBVG=nKiSLFfCa3v9J zH<3C^azfa9@*auGl{xdUIZ)ry2X#6Q&|RXabw7ps4eEegyp<)<5f)MoWRq`-3=@y! zePxmEf(ddkxhAyDVHa`)Pf!PXtQ0W3iB7YoLh5^P@R4?oSKEW?g>lPX%X7RCZIo$AUYJhunkP+mI5#KBD0g~JdyUGqo$O9w9A047nzQA0AWH4P zt$bt!xK4>jfK6N#Su(frGafgw9Y4x5V*8%fIfgf&J{Lr=v1qo1?uP>tL4zh|&Ki_9 zIGjiP@0PA6HwD||{PA_&x31+=lPI&jR0}$N-MO`6nR5DA-{ndtr#p|2vEb2t6`P+2 zJ?|a4o$@nhJ*LIAP%}3x%!lcHxrBH0t=08{i0#KZ;nthr6B2;jOZaQZN*PmVGByQR z7kx&Fn%e!LbZH^%Vn5-;)M(3fu6dlL6F(i@de2H(Fp*^GqFGwpJxMY48Co4<7ExbTJsm8<>_WS_^glCjJ3g!R4)ajYSPYCCRoy zu{SSW@dA{-Blht6#Hb>))mf--aXq455k)^fG4cVBE>yeuDrkDP6Vv#VnVZO5E#R5Zu{DlBp&j zutg>gFN3)u^T(?*YXxM9^rjF@@Y`3m62iz+NES>X*lJG>Ki{IdC{loI>k=CA-E!D@ zXI2p)(Ls{Ok+^awAVsse%HY|k|Ie3MA~@k3=lYhE7R?bAdM4?8*9DSrvKefv^UJWx zq|V!KtIpdST;}jke%Yhl6aMSh^K$=?Yl6XJpNQODY07Sn!4Y#{3$M2@nMds-L=((3 zmz{BfffJ{ig6YA!m*X~@bx%c}cS^(P__~%_Iv9BLYi`@DUsAF)>^zw+J!gm%K2&HTpsg{=d3yT|=n=ejH?j*9rAy85>z}3#N+sqw&}r}T zq)?l6@ayPZkRwtJPj2(dNeoXV?VBZTVZ0f(QWE?1(S3{Y?>J^T<_yI?95eCf_}19= zT$or}z;!H?V+@MT14{5Uv$lS`(JuQ9yunvKT>}^xdYVF8sF@Qx=`J8|Vc{Yqv0=)V zemthC*bp+FVkUrDKrDa+q1!Fm(`mGU>RZepwCdObS4rne-g!jy4zPo19>gB+)YsIh zW8!a7=*BH%fg>!nP)cYjX#j`ZG%$(=}qo;-_r;4xwXmtSm(~ zPk19>0)ZJreQ%rM+(R9w$yF^pf-<6wocj$!0UI1k+o^Bzfj;p%(@4J*q5mW}qp#GF z7QC7rxX0~icaC%-&UgR0!FAff{W_-b>q$0`)*qES3)2brOLrc#DZX^}=;&{H9SU)Q z$&Vjb*gINv+1w6){v{Y*nz$4y@Mwo`lN=HUZsr@TGP!Cj-gwU4ir{-zu)(aBb-e&s zg0>J>*nq2o>Ob{GT56ZgJ}h1)^NnO?3k@a1F&A_a!kpHYUsp6{!2O5UX^{~TL13EL`RlQf7LVoj(> z(9UAQtQ5d6ra;^yJ_G$_d4WRMB1|95&csYI0R-}WZXs@Uc$%vBf)gI0JfYNBT*DGA6ThEMlGbhVk8f}4+!7OI?oQoG8__DQEYF{lM0y=Hy- zn7tF)C&Tbl{^iJD9E;LJ< zaX8x5YJ58_Ua_ zgt&eK*~H8};7FN6hfPi-X&OMj<#>NyKJkQ*93%FJCt$PKaM_O}m14noV+ikq*pD|T zv}REGfEKS79DJ|#LSW=>fo0){D1_Jn_V(c=Eq-RKT4@WJ8^IfX-z_WF6fzU7bh$yA zhMNV3k`wc4?dJs$t z7BHTP6?!ZgRS_bDf$Rw``eMDXodeq^-X|nKp!-f{#$@5qu26(ID|EXT7=M!!aDkyI zO6YsO2X;BMk4)SPGa~l<3@3ZBW(;2R-~uuW}uA3qYB;BYrE|yn5qz+aA`V>DExJ-3#`2pgK%-e)w2R ziUvQvy>nV$C#GY8_geYKuSwzQ!ZY%*8-w=9{jra_USB~G`t@H`w$d)`4*7*_pg8XLX+ckh}H2;XhoOSmc|B}n8Upu)6ySgBjAeI6v7;F0AZVjq9JEt~o*&FeLy0{5e^#)`oIwk%qmXD4l zLx%T68lqyU%>PU}CBMqy8 z(>T56dmM$CE4y;GV~pkLc8OcP=kbqxD|MN4TptCo)orlkbw`zJu?@~=xFP)X7iC1h zTcqn|XD&W9Mlkgo`|=AO5y#%YB5T zsN35&0mzjbiAg5D=+<$aUZcJl7eOc}JVg95TJ5B0%cl7Hiagd;9{#)KPZ3G<72tS4 z#+~$lStofQ2;tYkq!@aT7i;|m^i$};lQi&G((WT;sx09=V8qZ&Spa+M13Holsq&Z^ zrljPd233>_1m~$2y$oXL4ADJ~yqnT{W@Kb|?MSIElQ3Dco`elFT zUA0^Onqg|&SYYrnX5>b}0=8=fBF29<%APOwEc@Wg zaV$Mts_yh8z+LG;k-ZO@99$e2@p0ba=D^hj*Z5Nn8irFUyd7f!cIR;ezE>>B`eK{S zGUg3rJWQU%bHOjLhjYR~JrRruN|O{@#?9YB zcdNRl^y2CS@sD9DH|b}>1Wg7m9FHt-Pbk!`Nf@VA*ccgA%Ee^ocv!?gb`iG-U0Pvv zz$Ss?hA?+xGap#WM~ckO2}Ee9bcz%Y_M{xa{7)AvvmvqDkte0?#o`bsY-&@E&Bf*S z7?R6;f(ri-6m%`k)eqFAa*_=x;w<1HL3AsQL#bd)B@GQvreZ+>aT5GSK@_iwtVEOp zXbE(NST#^&PHJt+a}?O5^3TX+j7tehawbXpf*HTP74B)qfCO?M4Rps$sDv~a@YUai z1%zNt)E*zNq3maI`GLEZEgMP`5&|+?9bcAwDJgkfcl_zwAETq^i)|fc9UpnSrfXXW z;{R$cREsO`@cH3(!u0lA{lALv{c%2+0V?Y83zfcbivFcwn{e{z{Y+3aV~l|*nZje$ z$f?^i*a1Z}C6_-ivQD0qg08CuQKOrkVM#a-ZKE+RsuL%8W|HO;)KWSptsxg zOVk*O6dU+j`+dCONjP$1Ajbl5NFxGCWj>>yK`5mY*^1r{^pw!`XHb#w(G%b^pUw zTjGRT|8aBw3;s;59MvD|g6tLR@hTAoCrobss<>0!@oO9=Zxx=S zA5!7Ko3qao}JlR=zLqRF^-t{`Z+Y}*~c(#DV~2M=|&wK)VG9F z2-gMOEeH%P6|1{2)yIiaO&|mcu66qMuP%(d%J|7@`XW)IlSSu0SR%t#%@^MZko?jX z4Ry8`jEzh}%hIDlE5^Kn>xU&fAz%K)@Az03p=ryzEKZ>jfK0>pi~XT@mG}uZQK!)1 zZ2bS;_EfEg_*$JccYNb}`sUKjdx?6O52jrYN_8JT{#CU5W<`Ups}H8lIo-mpjbcw} zb?93^aSKI( zb5vz9`37-#qGkqU1A?Tjn)3I4ql`mrLy zammLwZ+i`JW47&#BZEG^dH-(NXKTQ|J1TkB`WXn20gw(G|MBbr2kU(OR<}~Na~to? z-p(J#zRAfv==lC2;Pc1&>LZ07(iV+va1rZEdNH5Q4#x_|7nGW!GH2s`)bH?j9(En z+S+AS4XO<{jU6|S4-t=!VJsMx#pgt(gj++rew^Ntl}6yjK8B{3=F07{cdY&D7Qqb>>Q1tN{?LaAscMXGjpRtvs2}L@L2j5P(w^>V&6PnvXXGA*I zB4f#?f9BA&?HpvhKzw*$iEdlGAP^(yGzb{ZXMtsV@A55T>!Cq{7XR~dxVng<*J@sd zwRsSMrAYE1|8*=7`71%3oTw>S{jaI%Z?!MEDv7UV`$8-l7Nw%hDk~W|excX6g{3AW z+GD5AGIZUJ<@JmFbj@kc{aV%sZOb_$=JB+k$q6YT3Z2MtZVx>1(eJ4ro;80ejZyFK zMU``X?_Ow^%&~M-)pLD4!VXh9UiU5aabVmA$JDu^(~xs*)(#2F)(_W-ZE1CtyxC=3 zlwO*^>eg_JI$*u?Q#`>sc%V$O;T+rY=~lW0uB_G9s?=}k`6vC~>aP@j_1bzX z>s|X+$Ag=FU5CRu4~LoL{gv_X;(Yuw|9ih7KQebQj^Tf>$;!ZGHq5a|{M#}RJ9*Za z<Tuf|xZ?E~H{#>DKEO4D3bPJ?RmNV>g(tIkA zBQ2kl{JoU(DT|NL>ScK$cIQt#Iqi$Ki?Z%^DCvtk@U7FLI<5R3Oo>(y$|~F{>;^Wk zGRXU)Pz6|l+SP_)EAi7Bjx#M@H{KM_{VsACAfQ8Ej(LVCLf1OJ@4SVZ4X+$^u=h38 zd-bL<=G)6B@V(5dMvz_uXJu4%{Ti6*q5US2G2n3o$l>4?#u^$o5k#<%51OdS?Focv z9#VPkesTMQuXNCB<_~g7eRP|gjU5eA$znaF9}7cNO>)V((iSjsdFUXr6EY`%#sHZq zVcZzf6KbBlL;6i@Cn%xvLRGj>D7$GTb}edYhh*xKq^JM6P&I+N+I6c{)@ECXhV@OV zpDGv287~Oe2F&dQWZIe>ba-YlqGAH`bEEKyFk!>j99%OKiQBC;+Lxq-FDQVW!NYpk zgNNqHjqSpU;^pE{N>DC}dW0Fq^m;q6_?(%$wp`?Co1V#g%6SG>LoD#OBoNI(ykkc;uK5s{(mAK{by)Ds4flsr z-8+5M%M?agH3+O}LL)Yy9PKsMk#s0_)r=9ana{i)3f`}p{|UR=TSwt)z6(qRoQ9T@ zusw}1GxGJ}L?8cRL22bMG4 z{ciKTDQBglZFP;6y0_OUb{{OV>A$Y`-O}}N!lH(nf0B-|Kj)KG3#a#`#iZY~LOO?Q z?#kAZyCCDGd&+)q_59`5PbHdUD_zr>?e_L3OOGN)dLI|4k#b0NGwt1@c`PQ)H?u`< zB+GvD$r^08El`3p*Z*$LoI(`{-7KA|eDKC?8y<0MnbH_=5D!hc8Ezm?YoX4eKXa># zcwNr2x>r`JX-BDkSFq|o68TKAGMEIjNMI=b69gPr??+TUa#tGghLD zhfk@L@?|LKw!(cvMkU{98-AES{ZOdd0+X^-X|gI8{P0agfSxKt`q@|WO~e-^J|ngy zjf{6V{|%Ao0;$Ck9*E{f@v%U1PEjP>NaU!2xc5E~AL& z8^S8wBFsr#^+nqZt@y&wHOyL29dEG6A9(ale<=>-E!2@ntBTYJNa3C$zO0J_G|am` zX!#ot9q)nK4+V-Y62hRsNq@mai!v)2xe%ImyzWb2U z7R$<7jwLYIM$VovqxdV9X1n$;+j{R$E@dr9J5vlbT3zE0OywEfVP8{r{G+7yzVj1( zH(T$KZ%>PDxs!A5FZ2l~o`r4=5jlec!#T!rd?o(|O=LoVZ9b!03u-54IH7U`Wq`P$ zW2fX4+l996ng{DhQa<4H!;CX+K7;DF(g;E+3o>%}siVzO=ZC6kz!~*VQ0U!&s>8X3 z33JzjRvB-Wg7^8hSjyr_NrfFLtX ztQbfg$9Hlzh8_|^S3}k2EMz{<4p{^&fqKu-!!^==26Wu4#ms-?Is0MaK_G4`zyMUH zckR?+f!k0ckGV_i2bJ>RiB?tv5>4)0JxYE^as<>FuB3)fY!ja!HmUSgwf#GIT(8#@ zF`;Y2;UP?}m4Vh}Aw5i+ z@r-|?_Zsw1lh1u-BIRmLt)O}J9%ullG%&WW>kX)B=-2m;ExB@&pD*}PdW!FZ;UBx^ zcC)ou4HxJ+sip6x8!kAx?!dWWdi*KIzUt0K7VGE`yUi%)qhwextQ^a^TIu)ZG|u9) zK4afa8=3gypVPXflZq_QUa~$m^~Tau7hf`_HZYT!00eW@-M*f#Ea$i&KLK-_q!T9a zgn=`qMmTen_1>a+Wihc_9KM-vwO{NAX4sBDc(YK3WUFxKfgp-)bwtpfo|#EMScxA8 z9TsZZ>>Tc%f(ksb&j4)=95v>AUn8%J40g@ONKyh>aD~eK$ww{@ik!q=f}aVb8=-rF z_*UAAjs=DtT&VH|LFIapz&vL4wB+EtxxYK)P%SoxQp+^Y6DxF&F2i`Spc-LWeo^TPzHS^+-3s{dexRji=$0 z1UPD%(HdT?Q_>ywD(Dc);Thn3UfFYWeV1Z;PdTd4ZMRa04K4Tt+ka{|&-Nt6#^hDG zSBcKCCpXXP=0k}O9%t*O?{{yRvTBg$5O;K|qw3Y;YrRh0yg~ZAUH|N*QlrYqo=t-w%T`E=!5QtHo&Le`QcbBQ_zU{^wi$E}p?XWr6;MXx{CRdl@FYm0 z@OJPIM0=(~B<0pr?dCb^Bk&G>E}G0)%&Wlv@P)kL90Ly&loiU$gR6u9f{f%O;S$tY zJ$?ncAi56SZymk@J>!Qe23ueg3djE#{F>3xHZ61G(RWX^Lo=ppv}i{)(}M}Dws+0= zzO)dl2q*hj-kB%Mcn+O~y2cSPVULStx^uWlVTL~E>s!g8t`qrZ60;Q#Q{B_P19L>3 z;O+}MzvF^(NBsROX>Lb9ok|*-skE=c@PRpg-%TYweU$?*Q}q02&ZiuG{`>#KFFC1~ z731S0bM+Bk8Abo~L->c9jx8;H6?%Jld5yO9eewD7< z*XV1#{ruaj^L?xVwo@sJY5uy%qK@a@aEQM77gN?hdH`~BL~(_;O$Lk{er;{ zzd2P%s`Q(8FWm)Y-e|0d+U5MH++(EOQ*^5HVThjA;x)JM&FApkTmfz z`%FW+_hB@T3db7K^oxaGEDSUGO8qYyY6J;SH|Qu03H#mfe}J})C&4vpPy%r2+chk^+zKjr8#lh)`qSMmAYQ}ck3m>y6Tw9(E+N<$IWgYdvQ;WujX%~fxs7|HSe zwR8{PTv>r9S>r+*8YL3n7v)tupr6FE6MI{rX!D{Z50BqS@!%(*wnKAyo z?fWsxt>*;UUZi5%=lw1zKhhCA(&FaigzUnw8k5D0EmRi7^?Lc>Uq&NZQM*6|l)j2_ z_G>aKdjU!78`nEi-sxpmb^;MOeMH6X@GtuA1%3APJ~7H7!QwPgli@0Wd)U7!?<;%V z*t|XU&iZSg)r#qTH*s*#*qd{?;L6~)m$O7FZ$jfbUFQ)(yXzEsGk`P1-_0~BPR$p* zp{QN)x#5(wk-pQd<=QBox;X#Tt0JtbIDz9@bpBN2Al04veMST)4vibXgU(f9)KkPs6l@@fm$G9eR zPE#tZgq3d568aiBCAG% zQ%P?3r9$<}nDoQ{oQq*k4BR9I6bsslispw%TWn(qQq}5MZ^QsrqLH~9Z_Lh3T$W`N z`QIUrpfrY!NCQu+uhlXe|J~w2+wd@{$^UEi+8;mEjB#a6!FM)Tu8r;vYEG$F*i%T^ z1F}B8rgpt|+oowVCLkp9=SB+S(ARFWgwwYT;d^)m0gW*%=M3k^Wj%RU(kx$CX+Ey# zJ|4VZZ)4z%Q-)hSYhpA|p>29!_srB(=8`O*`2co60-J}`N-ebujn*lEPfTR}2QdQs ze+MA~ta0i-eEWM9l0vcI9!;3Va|0jls%+T{{D{^v9L1x}X+GDtZmA3k%&w0pIOFl{D8l!itIP~gZU4W%) zhP2yf0&Pw5E4~<5_pomNn$gnH>Lu*Hx$hIvjYra}Erq_sX8@m%$}vlvT!QffTd@}W zkh4eR0KO8CsACtWbC670jPEWDxeK&`qKMk&nryDakux$b+c{PLoXw>h?LYhLp87m4 z>`r+`hR%ZN^xU~FW@SgUU+%TBou>!M?-t)&xqrFjae&&>n}4n7;xN4|La0*M?z@Yb z2A#L*M#(M1?>o|O+T67~yFKM&+11yy*YkKzOy}+Jf-7#Ep@N&vIV;ByGKrPyS7$G+ z^yDV>s>clcgwMvwF;i z@sHfM1nWJ>(DO7{h-NTx=<%HB;@rxGLcKx@ia)Mm*+BVgkC*@{-wusuwvpp%3rhv_ z_M`3VhuzPHv=I;VeZ?xQ2Q4kG#UqyNcUZW6`Eg-;{qx`I3NijE#|p+=J1BM>JGT=4 z66P3(GiFzLW@PLos>9@$JL6 z&S-skMmx7X#J{GOMgddqfWijeruQWpw1aX!!pnpzA zU!h51k9rF2Xy=s=cAoZgrOWkw*#+upkD@@ev#}a@Rb@oM%4OfXM>@HE1y)}9DTK^I z-TtqS13NaC?T&eM89SyNExD%Tkg{DIeMwU~(|n1XV>Ag>)vp`07Nhc5dnxGBB) z34pG~ zu&-!-y^Q43=Djw@I-H{)U(3VJKElpswEmxil-@((L?&HXz--M0PryU?(hCA~Y`8Wp zI)p7bJYcX&QAA{{uaAOe-G8@SZo)4u`4>vQ4-FoEHn_XLtvF$R%R*ThYI+kdtB=hfB!^%-w--TpLw+c5BA%Ek1J%r&KvK*OS4>4HVt zhRs7lAzY9*GT%gdO*6MZ<=ts|6C-kJP#roFrRR}7eK0ckdNQ$h&#%WkRgB|_dyajN z9J{`k-srE*X(D@+Ob@*NoHExDziaSiL0+*vPJ!^K{049T;a>+&j}kB1dt1}yO+2<2 zgS;`iI>@U%B^;fs`P-n_nD+&=`JCe$7`16?4wx9o+zinp-3(sOP2&=uB|Qs(W8cQg z*EIgRsQsGY0eRz|pX0v^O-5~bD`+07REfv(FM>L&kvf@zTQ^4br0;m6`H~yXt)hOn zE^WUve8;@wpDd0MX2)Xbj$i&~?&^JawBK7m6?}5AImva#92vdX5ZiX7zm@Njj`lx1 z>*i?M7`d71sOI+d=Vso|U(pNRF3gwoPG4wH5ZbztzWk6Mnu^{{KU0b6W9@lSyuh#& zR6i{H><}jXwjp7?^YS2e85>ZzbLJAh0i*S=)zPif|V=ty1V|arqPD1%xj(K45 zmzPg|-bop&Y03-qovxo@`+v_#*3-U z9djrJrf|84&)hQt!4Q2brp>mT9}5=u@xh(8{e2#cfn`%_orc93b?XF|u<+sE_t8uD zOqOpgN(idT1D&sFdmR6CT-kzO*r1SnW)PfeU*i+ zdt|@V@Y2q}JM?;Rug^@Jr5_Isg95FAbIJ0;D?GK8sP!h(rH5eqeBxaB>;{8;!cTdc zObY()J?7o$E~D?*VgLHmIpy9#lYUG|?mf(GzjsNKi9P03zk^9GX3S*G!L-QXCipzQ zI{q@{=$4oCEZ#6^l_Z0Uwfrnx2F$(W+Cj}yz;`;L1dn8M-5a8cVD-KjNx-+}^pAbo z%+W=vetcg-z4^WV(PYBxm=vXlW{+^w?oz3LjOsd@+dE&^qxtAD>QP*Npz5m^+Bc>S zucbZ0)b#}~IGq1KkAd%zR+a?SRQ`3+j>Ay#mq1r4=cm;tQG7q4KuBmKR_hx5IWuDO`% zxsp0S*n1lD|NmEfdX!M>Jxs>r3`vn-2YgfnY2E@Qip5Z&0cS+j=h^!K?a7wD6i<9a zD|feQZd}hfLkeFb%IS6QYSgxSjRU6Y@1hVvUvu4DDy34y#&`MA7h2pm*0ao0>k8Bz zges-HvK7jx_nRJEDo};(hYag_0AeB0VZbQ7z_G7SIJFlU=7-yL`jP5ogL}i{k4=Ur z;p-28axt*bx5DxA(mB^~@kN)L-#*eq$f#eBN_|)UGU2fP7jVcv33luzcQ3y*~sxBPbE^@6` z{XW-39f|mqEq6fm2<(60>2%8Fxbi!Z0`b|6=k#F(dLab?Wdc_{Vs~}>%myp zqNNkY1-cc-Ht(HSSNavW-yA|7xE;D}T5?oi7M(AQtI0V0KHBM?KYNn5 z@~ug9byHrk9edUA#?^mDxzgY6_G+cTPTE*?RM>5JJO!gM>T`lmUpPq-kG?33FMLqO z@~fQXHYC$eltK6Uef!q1N7m+lUkH}|j3F0ZM7xK{V3 zKI)$cw{JI2E$LU6V zokbTg>)zW3pDcvK{@oHtO;wXxN}e3^2ef7*8R93h90Nx9Q!t%=mm;b#p=Y+}vlb3B}JSLWh9_oOrr5c#ov0?jYOz5Z- z8=Y$P#{grSSQ$DiB)5#8Xb?oapOAvoS!4xEe}Ol@c|DoOOoPi356w4~rkQr{3G%R@ zRlnnrlqcp@H+%;vOV!01Gpjj)B75Se+|0jm)D$kMeIh1jLWXW$W|##I)@CGSOPRZq z8d7c{c~Pc-WwfuQnwc2he2!|kWT5g%h zy?nZqkOvfM@aXxW{rVSh^QflQ)`(KXNZTua7TNW&R!8#_J4E8FBe~|uY4?pU%QK6| zZzV38T84c3=GH0FlV1GxY&x>kz~@!~s@dWx9fe8#_6YE3$ywQKR z?7+vaC-hl50U@9dgE|eOk5aAODp2ivFWVHlL#6i|J_wDKh%K9Y#Ogfwe?#PDT(mdG!ctA85(n}O>iwoVk~c=AV7ZYZ2Y^QB7uc>R zL8^Yhd^SAn708;99|wT)?bY#9&Gu~&CW1?f#YKwGX_EO-3uo%47e02%mKCkeZrVLe9${Wj^y;C( z6h?z{eHzfC7Pccr4BCSk$zVU>`NS>SkHAe2mc_%(O*ieQeBtT~wNv=GD zK{CxaQbCccx+x|)~I472uT9C9FmHa{yg(HI(AYIOcYEPJ$`QJi4WEaRFlO9{E&B|vm`Hp z?=&c~HnJX|UBp$s`yaDR+D(D`7e1G7@?h}A&Ki^1H~;kR9F^9xe_qno+K4UPGMv^W z>^~nnMM{)x|Gm;J>v zFD(2{%Bhqq&s=!o-&@;YS2+Gum%URdl(Yi->RWMdOvcp=pQs)^o=1F8qJ&y=hQWS-bx2jEWeM8HBV0A|ONs1R*9ZG$0^EW@L&;BM?MHKq7{u zm3d4nlY)>&h>Rg3lOiNS7+MjTK|)JN;>097%CLoy{;&Sm`_}tDLO=Tmh)_{~b` z-fORQuj{_<-?feeGb_9jlC#LY6Du_i7;Qy+M62INt#-`*P{q|n;J6*o3W#&>H#!(vIbC<6`)088?+qUY_|=A5 zNfq;jw)aW<4mzM@l3Y#&^S@s?ebn{bfuyGq#qOAlv!^U?>10>*hdOr(D%{s}ScZWi zGRf`yC&xKXOlK+FM4wS_tqE7*nu)JQo4LoiSdtyXPS$HHM~?0r{8stCQ1tAvPA-}RnkYKlLh7004i_LNPZR`?R|!+uwDNrjbDU9qXozU*S<*X(6dt$|aSgV8?1 zNKeHWu+itJM%5}m=+a+QL~;adxd^fz=dv=1teWoYm$v-9V(Cq{?A#Nm%dLz5#X<(J zfR^jvmwC-Zeh>EZC48$iAwBgdONbY`f0tVRj8_P5?oKD!3(l;aV{;g~Q`;Jh+s&Bc zb)A$w=%a>+%o_&8_7(3DjOKe1W-QVyM9sLL!ruWxN%q6f57D;PgV4Du$=+KTm}Nmf z0kb2F-&P6I)_xi!IaZQ+O1|>LlwUiCFxnw(8MO1-7g z-YPwgSk&$KT(n$O4nMUg47m(Vc^n0?#Xu`K!M&QJHCxt!15M8zWR%yJT$&=bmo=z+S_% zLd#5(5l2~hodZX9mZ$!qQ(3;z<^Lk2nZ5;%be-$oJ+m&eR$Qa)&RrD^y1oiCJ?c8w z%d_xq?R@Q5_FeYma8HM7{-F}(ZW+@PshRg47U7jEw8(^GnckI^p;dy~`>!iH?SB#5 z!&#N&p=Qc_G{2B?2I6%W>T-Pdf{qohZS_+YpSguRBtb)cDVR-L`Xf)f3mlq+m*J(* zwUh5X;e-a8-A(+k?c}!@JwTjFxuU=L^s6sv3@Wj$@?O zOt(KgrQL1gnwELsc!|St=9%*!N#AXClq8nm|SxCDc|=Ka`)pI2e}GtC;Qz* zJHFmHA!=fcnMpQ=*BM4-pd{dmqoGLJHY}m_#2{W-uOaJI1<_1^>p*cAgp@>*P1UQL zyK5$8l9n-0RB1HCJCe`i=qhHFd0odMKqzbQDE1Ok-VQ49S+84M;5xN;zg$IRUIfKo z_?nA-f$t^y?P@L`9qMmUFemD65jPF)*A{@H_ashyZ zUIgMz*|_&QNAe5@*@psDuf?B!xKDf12#f)rYO~9Ktms(flr-|u`GMbz3w{2t!voo# z=|8yH3qE6{Z=Zs{ImdhZ+)Hqowkoac)HJP4z+Eoe`cHnSuM!Lr2e*$huA;rxY=|rT zdfGnLJ|5gWb_Nbvvk~uwI|HGp$g~McG8e}=!ZHF#6jgv8QV-$?6re_CO;3nGeY10O z{}AYov=gIz%s&O-ejbiAISBD?FC0bduH9@~JN6!K5}aPisIU5ag9>@bon5cjokAZ# zZ!Q%dAFY3(uG<|$o42EjK}aJi^JoKdhp&DbgQiR{#iccb?KY0Ty3o+mH!`D>CvFYZ zep}7gzgfzS51J}B)w8rH%2wQza|Inh@k?Q(bWGAcYjaNBIsf5lbh^%&2JJ(`m4eC& z&0AI_x%w`%Hs5b~%3rH@D%*)!5lVHOHWutM#m$97Isd;zMPl&>eSRLZ7mjj`s-NsxiVi(KV;8M!(3V3fkA%PIl8 zVu_c+bc`y7n6`V*)7_v7Q(`){KEw06bFTC;&c(W2=zD3)u%!d(owt=v0;Q7gd+ZJD zl<1exeq@aE$xwT!$|0(j7-jX8p8OIVDf9%Ut&1q?sdu;Os}Y;mk4h4IMGDiF{zoo~ zGEK+_*z?+j2F8q_-^NhTQbQWagQg0)r*_VmV)^NB;=@(HGHHx~8 z=-h?bAi`10;E>brC20%-OL{Ppw&NcyN~SyBke%r69E`eobUt_%ivT%ToGwbO76&md z*T#nI@oMm9OIQh7;Y)QbsB^_O@ct=Yk}-%&X9rQ@d8!gQI0@ebdsR{8|03eOM5uI@ z+BAC)qo#qn_sc3S#b|b#VfZ78Sj}YqQLxH*)G~)fICIQ1R6SnLjy{Oj^9dO^9w$KUMl2`~6;Id1ctbcdY91=QaL#;|^%j|b4Ra_ce=M~W_M6I(z5pkPq?gffQWe0P35YlWGP&i9zy#Q?ky}Fg|AKXd?SmoQ z!xfjmPjbtaqAh zM{p@^U=kwZV*Zg)^cAkjFiXh;4_9@v5coaB6hq?ID4sMWct&;td9tkAPA2;NdNqX* zs@sB7Wum)f^wgo^RWD+ik<0V`nzpL7YD`7563NZ6q^}w!I#e zZ2GyAfdJIi3^f5WWlqUfgzD(keJN2MV*Lasox?qy8*1oN8K1reQ{A56o_NgHv4?B) z#^!E3OOGv5r`h3F2z%_yt!2IB-sZcO=sZJX6b2tp6{|*$jT{+!RPoK3bBXRHtLhqC zQp!Huec9;vcqZ1MP<2lgmEl_r^>ByVEoN0RNbTnv4=@Nz{z@r~#EPT#-j*ca9Znqg z4t;A+{5_4sV-!ODdaYPRP{OBVm}*cTlgQ9QoEYHMx5As3{}ACh6TCQ738mc_(P2kZ zC18>G<yFJ*BCnG-)6@oDxzB(>m;C*gF>s(wJQL<>E2_ zr|V5&QT9sRW4?wkf=^SM`Fle{bOL#6h~jEsJ67f$T=(o9be&?_KXm`<3_@17w z#pqR3WQcX@geQE9KHVIa6BV(_v9vG!(w;fFJ(cT02{UCXp1-VzF3%?p3!JIPmc=ez2>j?xs5 zf+LFKj3l;F*i%2OG}*1mmZW6HV>FGJl6`@{Z&UhsKr@!`jJ5MN~ky zsS0z%WX=&kacUH4$s#knCt)i_{eQOe965~{m zW9$^;@Zw>B)b?+0TXnu?eaf-caV(PxZVEE3p*2?ZY*k9GaH{r`7dl{bu{$ZjM*x?! z57uI(2p9H{4#J#h!9o(Qgt(2vM$29Q3dAqDj%qkX2* zvclEJpFv3}Mxpu(7og!!Ge>Gj?-iF{#~_PW zH?Jt_@=V3#HQ%ntY0I{uDzt;kXPubNnF`lCsV%NH4!)n!>kF65+s+JLi_fnvb0R#- zIRZ9{J=oy0l+Y6B^EqfG-Vi};^gRrL4A)d&J-}{9?*2llFYCZ3YaD4F1s15)umn)0 z9`YsWuRoIP5TAgesVohW)(}PoPmIH_)B8FKaPoxwuf>nJ)0l%I4XVISk1~TzZ5*Y^ zVhPOnZ^RVJ)%S>(EZubwU)^HGldfi8L2eOak_4z^v>jiUx6vCeg*S~kfG|+BJ%9bg z_fB_>gTwk=afh=n`REEF>n>b)Hytji9dOXAaK3((P^2ZB?0zF_wezT}>cb&h$%uul zl(2$%npC#sgon_mS1%&r{S4 zu?3(e9_+|Bye2*vrb>(uu#?#YyhhMBYXRW8YKVW6A^xU3gU0&PG>q0r=+Q-ZO6u%%;s<+n};mx`fl7549Kj$G2QbtSY- z7S6b(2bbF)xgt{SyO(3qbu}#4p>%Gd_2ftG@5bgj^3(Pv!{~Vy;)H zF5L-wUp1i3*fiDGNx2PrSaH5TK@=eVOU?2&lA@qEeo`AQF6L@&F=4EETay5*K=cRP z&J@W3`1T^hRPxy#l3HH44KRE#e(fMfB|ffwAzecqCnffTL#L3bn7!2V z^&?q8&Xy%1`3q{qC?lWKm+fTi4RLb8+@kx<3HQ7m8uK0vdrutwe)PmocR4Nv*XUAf zeg5cu6{h#H>gXAa^v<`WzuuPC8Wf&7ICwza!#8WUgYa z+71WB@bd}V+rta$=}ra3%D1%4OFGHc#BZqdlfE0r40-XBs_SL@*J)xuk=#q}jihR^ zecgHk`lhIkKNwuJTSP7qvSpdKNykOE_<;ag0$X?Z8rDJ7_{B9nXMsaXNia9FxRUtD z>}Jbmne;s6y*$#TVRis++|B`J`>kD@=E;$?*6fMh_HbG>uyJ7PKiw6UK+zU(l4uhb z3!e+cD8p%jfQ4lAsY=rEVf5CJ5+69P3v_pwVcvZ={~-2xiV~?6@EzXD-mb2mb5HAr zA}7pzunt4>p>tP`9t{=LKdpUQpQ1N^Wo|xn&_s_B`bVZo=sZ8;K;j{wWLUZ?R?-;` zA>X@9=3b~N4`&R2%pGYTF0*a9NjtrB7GX+EB{+U6^JzEm&b$A)*QRYKT@!uSV8^L; zr%$QfjvWJ4ZfRk;3S&)lckVL`0S{D*%!aDb$78Z2qrj&DALu#uoIUiJ$Ou@o|)r({2%Pd*jIQ`nznon%wrk7`K7NzLXu1?4Y4C?-$_ z8sv+6ci0lHM>uv`rGE_6!6~J4E(N;UR5kY}Di&!Jo_%Jt!!^sn`Np78wu`^2%MZ%< z$k_&MtI{KmkvU3A`mW{?g`R_tg@@>#;c4exhOq`@LmpfpD4UmBGxh|_V1bXFZzBdN z!nY@1QANp3V?Od}nYpz31Cn>-O+#Y!e=?k%r@~UAsBt!;1H6uv{LS!6XD(|~{a8zw z@olE~cr+aVbSkFwti7H>Z@B9<6~Uy*!wnNt_^7$qgDyiL^i1 zfl(i;zPi{O{qvaNgr1k>X#IP0tvi2ja2Tntg0CKpQd4_(=$_gOyFU*%Jx`fDRT6m_ z6x$E0F4huFUeWQ0jEqySSTV%vbH^fs-LGe4R}6Ce2p7?>g{dRT6+2BhnsZ0gLN8R&BuHFH8Vb5FTttUGStjpNBX(TdhIRL)-AV< zpDFiy=(HTk??DCqrGBd2HCIE~+BC9ql;fHZcN;%*_Z8Q9AJohP(+{CvUHKYXuzAru6i$kY@Mx zFexz(RuPRahN-|slig>YQQI_75RGG}+w)PRK1tJm5EA`DxVEqz5SOt~UwfCRng*R; z*e$k%DO318UyAgAOs4aFxdx6dnfX1K(xi2#eqFsm-K@RHSdq6-!JcX^zACN`S>n0&so>ecMg3dT-{qh zUC>eze~^sOq}YT$RmmH`J2JWjX2QD#xim;ipkG@$PSS(#@+s6JUHHXK(dM7mAN``S z6>cN1;_d(m8o4i+B@fF!BE;NC6Jqyf$%}|}jv{$aKo+sLu;Q&!1s-3GsPK`owg+N8 zwQl1$%CGDUlqmD-p6M%GtxU;5@qSz!SK|-mO{?+ED{(B%nN`Dxt}IWFY3_GjtENF~ zg9aCOX;+!-t*o;#(nqe4+{!CA7uJ?ZFC(jd|oP; zHT^yNIel(=u>JcjoogR;*`Yf391}F13U}H*JV-F)Cw32XIi+jkbF7Y+nUw2VULy4D zyI0k#BEHG*DG?$j!UU(^_$tE-^a~^n*l4P6XRl!0LSUV0$Qu`Ssq#AXyqrabT&*NB z;`AI@QKZ#@+!1UVkn#3~=v3sZn#Dpaeu$(UR$iTiy5f_i%Vfe(tz}q_PdVlgEG04-obD7en#==V8^6D3oSf|C&qaA*!Qk6~rk08hYyJ=!C-n!*Jc<>$I>ru=QE<$-9hd!o6PPqL0Wz z;FboJwMY9N9j#xFxR7a;}%KZdN4er`j~d5 zXY(&j+dkP55C5>9qRkH!lic8jYSIaj76+$HI+ErxytkWwm?1n|cW!LNxQ1$ROxy$AJL=I+*=;An4D`^db5 zl{TVnh8OUoV8pK*qVQWkCGq=qPa~y6(e|MN84OyxH6{k)oKu11P5rNv&TtFGl;JA!v8 z=xla^BhC%hS7@bfJ99XthM4DIT}dSHxhzu8 z#M+VGXBFnI`xTsMCzb;!zh>8$>Ex!3ibXjpudK;Ft_n_$HqYJ~e%9Lgkol$Q?+w)1 zu+>FSy$p;hh}^~UiQVT%DVM^il6`=KB0#Ez_-aEj#E7#HI}xPK&kEH)G0O=tjfMM8 zuCNi3eP77?MOICZ<}V;U?LyIB-DP@h&CLxNEdxtR9qvT2Q5E{?pR=WZwwc6)6!sLBhS;50#TMLSnAhQ}0tJ+M(vq);1|8U%L(4sI`T z!48)FW0oz|vQ^|Sq_oANy4X9&Dq0=$*GGrk;Gs~+tevgS+75qq8)Y5-va(_dwCzU- zIoRC-+J)SOYFNVUne}YU>7M4*j?EkWL4I9J+6Im(i{&Wzc2(27vsTxO*|2@2Sol4K zUugFd;4K>Kc^Sv2RoN-xD98@<%QD55f(H%7y<_WV2_R(rWGo#;l?5hQLeYtq~9a~EgWeF;W-rbMSCsaF>aBoA+ApF zYf2DtM;DO_AuL7FImzLIwi9Q{J-$q$UNnd-3)$&TKvKI3`%#2&*jLoNk)HAl8M)?A z8!8?`PHfE|&dNo8spwGfOX)jy%1FggC=vJ*B5i zVgL!|Xc5ysqf8ZQWptDWKG~Xo3Ps0kkB;5=jBjn#Fnv21C+@Xm`NPc67#S zjCJ5u6-gGpH5Dc&88S8cly@z%hq^(0wiz_W)5i54j~Gd-^|W5*185J;2;5o6<`sn6 zOccp$iZ_0h=NgM_&sVRhMRfFmz#GStqwLz1G;HAMOEX@D&db;Ozh0yu-~u1jg~V#% z^JhLG=A%*k=$rgl^Zmh9Gb9_(9z?|h4<-)~>p^NLHSUVh3oyI8fHHsIWgE%xM?4ZB_xn9!n9GQ*M`t2Uw~-4lB>z8Gv!L4!cUO%~8sj<@Kv*mSwz zkTd_4eeH_3pCnyvDb5|-oc)0ZPC96A-ODV=!4`~eM{qu;Y*N9k6x;H9$Jy?K!8|O z-ahncQS*?1ks+aj>`h90^zKx4oz&ce;?~ZwjzPr#I*_T(7q5Ez*RIM9u#XZJ>5>q zUQH3ExQ5bh791J{;e?V0k1>qp$93Q6B8@VLJH)xsNDH#U&)YFP)sI@INX9=X{Ql$A z=XqZy)%(;#e@QahJ%5y*H7rE49=i(yNTH+xo$k-dt1h)SC)ISPY%KIZ$|`3`1e;#y zJo38n!V>AqO^8@-i?4wlv*A9@eP47N(f()B;rH6xd@vggmb>8}_ zkIfWPdm^Im4d$wUdQy?faqHnmRz7#lIA^eo4JN5Tf%8Z{kBY5FP+13Hxv840DM~7p zZ^lE|O@(E!OhjdA^H)h*`S;PfbWg&hx=3m62lUzE4p!E)`*7Kq_ycPUziO!_> z7YzelJ~q|&AHbb)H|8hk6jBy_I*K15$m0JP-7Hwx_9Jf$KQXy&wCUy~QnWX=(8xsL zgI7?a;5pz(G^R=C^eCzFtlq>1#Pxjhw$fEd5(VlrY)!6!iHwBa>p!}}r#!lD~u*vKTPPLwjX!39gP^$8&Wa#rtjxS*b7fy=Mn>*73?~9j`S8-SV)8 z3!0YB>t>HwJJ(`Y#Q&7CQ|EYMA7mH{>|7IU@eV+2N@F4`GaQ!vP`o?@< zNHqqXd5ahdY>AQ(mLx^Am;wCOSk{_^0y^E$;V_9lwTVaRo99Wk0GoB^0N74Bf3m0d z8H9;FO|X*RIFkLX_*FHa@V9GIzPmFQ7uQBpVcq!^-uJa=fIKvyh$8>>=inL*@V`0B zFQ5np+Wy|KxD6?i0lk&}Nt#5~?(Yrxt(3B|$$IxT{J;F$OaA2-DV^88p;oPT0b8eH zCdk_Q;~1FJ4|A6!0#*Q&iWiT}uAjy%{pY7q@^23#No*0rUNkNP?-%d~J~8pr(<=-G z$bDjg{dsxe?+u$S17+#Uzdl}(H#$vnmva(4nG&!uec6Q-sEz!+p|}+*J^&haMxYIY z!?gx6@345WAoaV60?Qc#I)e4T{w8q7@IT-eGgX=-di#L$_-8*L$WJoYWdKs0FVFr_ zHMSZPJ8MZ&SYBKB@lRao%Li<@8T0@BS&Q8f2manrdaai&3IfQP)y)Vv zaf$LJ3?vP0r-P9KU-r<@f+rBD|K*+j%gh?+5cg zc#Zt;^7!8^=6C!I?A}p!bvPFRgGRvnG7X#ut{okq{@DM=`lse2U22@i-mf%CC^d>mduvY!|ySh<5aaz+3qRRp>rx>Zam z-=NiP6-@3d*L9s<*xFT4_G46qrqv-1Xg}qya&2t)~?GN-_+eEnIzuAnf_^TbQT%k`<+WNyEkP*P4V@LFTULou;{CHxWg~NUMRY+^PqaY z#>eLMZd>N^ZIJD44=x=I6zP!ThO5@ei_-JbE(yq zUiifW>n9amc{<_c)3(-l&A_Fz?)N^8_{r6QUbL@B*rUs^Fdwe2{^Q=K8KGVC*^9|n?^!8v?Gzll z&bs<9Zetr#Li)zngwdT~l3YOJAQOxBCN6YJOrh_@Xot`Uz*4+jUG20y^VfTVoxlgU zd{OKtEwxRVHgo4x6?#r{J9ho9|0}Wz1zHZHyrt<|e{U$M*1Zk0OW`~pI9RZ*1u8TJ zE%=}yWd5jSiP){NzeQ6JELMorX8>)RYA$-8Tf$ej$v(a-$rh2ko+0k!27M4bq9T-$lxhO zt~-c@^tpgSU9G2&viZuHoHI{XyXOHfCR72Py~RbqOn4p0`no@A$vxoqU67;Wdz|>P zV(K`&ZwLX(+)J=KUgi!XsqAjIzQ<0J8U?0Rk+g1E2a(8!vOhsL39Czi4p|*T4C;DO z*)EZb|0z3UTMl3s-G7s%kU^}`qFWVdNu~B)Q>YLsct1+;FfSW6u)VL^a7|Q}%Hhv) z^rLkAbogIlsUmBTDN{xAd_EY3l?C9Q=>X7_Q^5ldlXXhuEyNwiSqvJ=ETgQ`%MU;0 zGTRuQoc4VB{E+Qf46Qu`k@)@n!A^zl2O5Q?HMF)fz#qrTd!4WDEEt>DVp{4kldiZL z9g%FB_;E4@(H4uJvLC6pe?;0bsGirsk{Mx*)%2Lzha-{=*VK5s?fGj5DUb0aGf~~L zV7(z9@vc4W4zdx|@%IL`aq%^X*~vh4uO7V{1y~P_wNlF#90o@ z82U^N6Pxi-8!y0R=le-lCZ!5Gmh(cVwvN>k3(k#1Wstjb;PEvw8Q|Dt#5YTgZ?i)X zvf@k7Xx^H>gBS^o|AX^u^K(+B9u|%Df~vC_>$bImLO39BA!_7;Fy?jw4^=w z$k2zbPtWoa85)X(gqtMo0R7`RD&-c4CA7@WkR7&>$0Qm0yM$ojTx21L}ULH3`2i!7j~Y3Me?2H@8IZr;$|YWbEO zb|V3gn2UVxYj@iDY~#>ZL!ZrSx^)8pD1+V9VkT5WC97)9{Qx1=-40_|{-N5jM=wNj z??Ky-5Ykp&>Kt;9Yse$qDDaSrSN5h>lQlf%W&h8u#Tpk_>N zm?n(;C>GO zxi-?wy<@j2G?=c%X}J*B?kq$zoO^?z8s-IYsN)Y3&}hc} ziy|4}i0KISX5SAShF2ARlC?ZI!gDnYSF4 z6gZgok}ZXn5iFW278XbcEs*?fsW0ySHY0RokKaPNLI;-#B3@fql4|rFBNQ-H!)1&b z;Ar0iCjkTA@IpgugwL4RnZXNLt@5&tEhp^wgLvchr}g>;Y1rN2S*QUgX6s{GDObg^ z?k{^Nu}O4rc^v8j%Ei{7S!t4;UKPZAJg^F{k20ahJ6M|}ua9X;DvV!JrNv=sE-cf) z-}c&l7>cr+IfS7QSkEp3zYLhxSJ>Yzzbx3Vft*{<(FK{SQ5|l-LjU zS~DXdM_FdUd&DQ;gXJ)W=Q)ZofG-bq@Q@@~0U{X;r8zr8AarLVK~G4LA;vCXYeS9F zX8RDFPsNmst_<{~QMxC)jD{LR{WDo^@x0l}`tcol;!VvglWd+wPdLZ9!*|cs~X6ItLpY|sY z46^Hdrz=PB)Rfq1-hesKQ(g(+cxCaOqZRRtB?8=HgpQs^h=1}u4s?fq$cgNOKu;)< z>_I7m%lnH83hypZC)@=KZ76PpWT!zC#G3-i^HR$kC}AuP8^YX2wB~mwu!CtzBor)L z#wGU^X%Bh{GfRXt1c#53BI3c!GhIMceMdaVpG<+ihNYz3d}J>`$p2OT^!eGnDr_J2 zMc}ca$+3Q7&Lf~cu#&(jL5gLs7m<&hfyQh=cH4gbI)bB$?^u(ucsZ#gdI%9#Q3*cc z{Q*MCW;~quxgB$Y+FlV{LJ9V;8kla5;&^+O<^8svUbI2@d5$ljrAJ<_7%j+%YLmT} z3v%0Sof3`$Q5_ZV;9{-e=OfjpJ(W`<=$_X})LubA$6qLGH80s@{<+sCJAcmz$Z_q{ z>2mQsS>x_3=fE;Rz2xJc^ge;B>tt^OZey6WY$C(+LiF&#eZQ{u!9Tb7|GmNdD-cV_ z)}ZvU{`Uv_SkjM2vW^lBI$1`bF>8%Ow?~Rk#sC<(v)%})(So!3fyi3GGq2}KYOrjp4F&c|BwxtG>2Gg>JS`s za%^37NLz7xzI$Fz5B%+=Hpm&a^lfT=wQtu)`E|BVKK=gGjHko#a7K@cEnTNSsT^p0 zTZPC~r6|Bd-PjSxECQDKi$&XG@rJH`+|L%FBvK_fkPq6`38|ZSq5UqwP-`jD}vpO z>IovR3$IMVLP<7bq%)!A<87hgQ?nID<7oHtFUzKkOa_0#2cx&`^sSCDPtX-~rp-A( zhaZ;g1eTQND!pCD)BfJzTr=~!x?IQD`{ZzlDX86c7=AXbe~%%avI#)SMrbz{-+5`H z{ms^H7F}`Oxnf=|%Kd9=_IqnbpEKs+G`(MnQGc-iWt||Q+r(~3!h1W3m@3g}DKTHK zA!ChiD>;aw+tv@Z@f5`tBHBxuREtzK{24bUL5fXAaMXGqXYVG_<>&mWLjO(;qk$oF zDu?^^cQiVm@y1tgEC6C8QUz&JqTR*dHH?+=#241-hP@%6rj@FpEk{w($)>}S1B4jk zv@3Xl43DFR+$26ZAkpZp@S4@wm%H58;Ye~EZD8&*2rk;*APVhFV8_+B;yObGYSV@V zt*VY>u%~TOy9de;eY<<)-Ui9z@!^bJiaKNWFx`1$om9fgujm;;|e zJ7cXkJ*;SM4B5-TaRotE_G@0AQBR2Z*MjRm+8YPG&8`GwjQ{@?;9tt1n)B zVvK2Mf8cA+IhN?;14a<=NA1u`Om`oX>ZDx3QhD`*;vMVsJPz26V9L!kGa{<(3CVe+ zo&sVR#RfukoIsJu$L$pV45AIq1Q|N&+l1y&EZ_Qlm2O|Ic zG~8f}d{;PyE@(=_=y46gv%=z>Y_1zSMqJ}Mfq3iqY+;mSz!o*>>hDk@&8AvXMD;W z@SJ(IweHXkBI`w6f+ zxWrpNLv!_OJq&yYUiM##E~yV?70-9!l7SJa!7O0_oo+wpmU*6 zt?1-?vSe$$l7W^U;@$hjTOCfEv7}ViajRUd9Z8+eIo2=hKNMbZ&_a00IAuS@hT>%J zBuc5JbyhgL_{VWvs;nArOq(-DKAqB1`}n+pl*?Xia96W1c^M!*0|^NAy49SmOU){U zs(){ICwlzt&ykFC&8@bXMf!>U4s_M~Mz*_OtpDfFQ5>}X3^2bZ4BE(;^~WSfU>JER z^6CDKtS%X#)gjxFn@IXF4!X7ME|M@SKu{I`uE;oZ5wVMyC(uf)QF0f#WmWcun0kh= z4&-_%}Fv05hJ>qqd9tjCju^)Q%UV8S$N^4(&Q0HOi@16AK7ZYW<6l^B6^S+Fl-T9po*{U z`Lce&{~_95RIz@BKZ1+?jn}Z+d*x}i`fl%hZz$ft(*5GIxKCq-2HAsw3Pm&uBtvyiV&NtskU6(~C7Vsa2hYI)QDD>dST9ANf^eN= zeT>YLEVlvl@hYN5pV!FZ+L^$JieN1C`?O+Ax>EFVM0H&ZsuRhLUQU52BLC%FXf&>r zBsDBiA-@5GB%4KJu9UqYMaLT85+QyUOvS-Dm}0(}U64NQmw^Ui9{+NcCN*2Vgq^tg0ztJQb}JSTu#IfVBg6&)w`~4%()F-7&kRowZ~c??0Y{*}N_uwb8z5X= z;tEZR28QUTM&jbcJhiTypQKK71sGiyZvjf^NV!{?vM|`znSS5>^F+a z;JjRg7!R*Jg3}z}9VKGbbs8x)xD?Lnygq}$)QQN9slpJx?`_ekD6d#U&zXGvoGPN} zSjP>;{0GlitfwNPy}8#}lG?H^W!?}-Kh)m_;t747G)2CBWyV`vT#2%2c(IdhDNTmE zW1z!{p_;L#D(Tf^+zY zE$Rjr28}}fJ2Z5N4WVXTrZ+&YFKbZ!gq@qsqv00m>{K)A)%5~)P#6_l_iVt-h;`=+ z)F!b3yP=;Hib`q;hO|6KqSP;Q@kvM(v^_-W$lJ>i8MNmY zaJp%$iHXB445qh4%E@D&)YA-tOMs*4yl;K*aM=-NXs?MwhKH+DD&bhZb9nx>(_a5} zt8@IfHB@D>><81!f@rmDFuO%l#T@dOj&VqtDwucg;>nS<;HP~KwY5W$j6jz8XP9C*a%6#_xE6D*x*lontGvl3STeP)t3RL-)q;50n9>~w`pOKN&P3QC>y2; zE*A@evurTZP;XxP(WS6m<1o&tk=oTCV(PsRye(zx*UYucsx$C!7v8aGB;MS4NZl?6 z+(tg+p)Y>O+s4%=y)K}M{ljwX+a1$leCJsn4t6@^{hzWNSyHIDYuWSK?(Qzbny!{> zAvQzl*`+z}A38ZW#Rs7N+oGTcsf?Wh7B9&7Hx$X8kJ|J_q9rnJXCMTRpNl5in%(2k zHw6rhF&unB1STA%<$U@jho-riDaAzNcAl)!LZXK8bI7Vh04(>-Z*ortd~GoUgMWYY zEv|G>(|Gme@CqLn&y$Ko-cj<@O2Nz7WFfNz(P`?*LCTL#8k0$LSPk#uf^ygit80>6d$-EMFZmy)j)Z`5mt zKO;h%ADMzysG%(=A!0YdS7mgOiXggM|2!SN#aEl^KEO2m(Ned3eZ3h=pe2K)0YKT& zf+h}ce8n81byz|>|C*WHC_;9a@%97@1?+ZO8hfu;GhDGyV6QV_n-Qr-i8tOuOx14C zEiSha{HeG2;dhnoiQoa%u$uf4irR^ShJKXR3;X%jxUoSJ8TFW^JOr4cm4~ z15xJ)aTh=7A<0v8mEy5X(812c4ppVBHk`s-RY_Zp`jzjQW0i+dZP>}M?7JI?+*4=c zT4i(bn)JA>&1;8x=Z}9>^%~FrH^Emi#=?%q78sjO}Hc0vUN1OyZWS`m;jDx*w!)CL5E$gE6h zM1&9lnIu9;TAAk-1iG0bW0*n&5|Am8xrJs7V~`<1Wrjo!vf8SS_vj0QS%g2D%M zb$USC*#UX@)t2m>C2E4aPypJzWG&)ectl!GAhHG!SntkQi70<-(f7Mxu`N?Q z3O-R4Ks?jt^-`)8SYtg03oth;G`=k(6NQ9fMdxSR zlhQ>#o#iIU9k;Q(&PMiB>ofgsHg)t1WQ$Q`gj`B88HCH#k1B6n$=~{%FCJ~P)Ysgd zHR=A6y5-f+ZF{`tj8`SCYWjUNNXvH^qpFuUCC8LjnNsWi*IdxQo$=R~w(v}1JeGvp z;4+7Wf$z+3E7-FXU6AOtpGw?DN51ug9^)7mukoZNLaQM$#~G3Z;gU6IuO*ncc?q%w zlCH!m*dxC6)6=uALEnAH`aovI_D#D?buWncIl(1EMdCmUgh(P9T-S>e+pHK~wbSeS zm{XIx{wLSnSp`%OBferlGPyMJ(^L&%sKgVA3C(MFwXz72_=x8gVcH_gZfJHCL_f4MLZYL?K`9kam6Sp+j>@0Qc==PGE}wzv)^}Mmg%JzP2yfg z8JV7CwUZ16d&}@^#Ja_WS%syX1dIr8D!06P5j=>5gMKF+i-*{YF0-iW&iQLBY&^%g zd=Aj_V3Q0ysuu^S;_Dt)SaaJmZCaHGwJ53Nut>!GR+sak`cX}i_msq;IOkMHjeR$& zf%!>NxWMv#G8Sw#P8FEA>f{tJWYO=iW>=A$gdVlcG6}odtSa}@lj)p0(_aATWN|y~ z71Dae;E;B{QtA5D3X4fRpVE~2nkg*Hk4yZo!kT!{yg>BuXK;xCRRs%@zEu89W_VAO z>n+f!$98cz9z<&q*#VK&GC2N!8m=RB3B~k*#k|%5BLDP5H@A;VqP3{-f3?+}v?3^2 zv`Id9$@$A*3hch#E1TfxuyDOlA)XZajJsA3NX=Dd$0f7HU4g_Bqzf#WBu^jiT&VXy zSfQ=tVyZ<)19hlUv%tKJhFzzz{XN_K3IalYe46X`a*o}#dCaK{k)Yp&d-ufHdq?Y9507?rYeM_fAN z!S4_+JJMCV%&%3sdkwhvgh(^Io?4kU1q{Ca4`DH9o?8z>)!}K;i{TsWkfH}@8vs`2 z$I}^Wb7vEoJ{`DN=y?+bKoc1l2PN4gvOwQVQwIyfO#zw!4P6L&d6sMp6G&C8P?{9Vq3_qlt0UXkbd>6W#D(Y?&sl9kMdB&x{z4bJtZG4C-AjObdnQ~2IHfO>zD5Lk=0Lg@bC zjsJA#49$Fd90ErBcVbkr-4ECy*?2NoY{~!yp)EvbAw%MBAZ-4AWdQq2jxAJFOXp_C z;!OO^VTBiP`N?};4fg$yR7L0N?G+q zIPd>H@@1YnHuV*E4sh+l=&`mM81hmp5%5GbgsEY&Y%vuoc=%Vm$u#J$AvakLhpVyIVAU7x3nbOFWdmXCJTUTB!7}_mfY?;|mJ{k3YG0|1cM1YZU|Oao@nZ zqx0eM#ecB|jSPprp*1zL-E&)nluegd)A1IijDg3ISyWCWc+_=!1XkZ9o1ub$R+q<- z(NMS`%G}Cb{&w9s*{V8HvAMn7Go;$2u6oT`Y;H|YFK0??-p_d|JY*mwL_1Y|^E;nF zwQ}l(&hudDRFZo-W)l_A2OA7u4c*RM)0=+b#LU;_Ss(^mp!59ui)ihXnn=Y zxd;%p+Kb%^{c0uSZ!FBi-R&mSKyX213HL4*;5GhzglM(EmGyK3_uhDqV?fg)^(;pp zz=0-{poOwXvU*$|6MGV9y<0!krbk>|4-y)wpCF~0UDzOQ#tycLCj?x2Z8Yr_)%yA_ zD{wYow$m9`kKYtTE)_uBCfl?^SkBBVdUWSF5>X17%iZnHbyF$5Q@ZMLys4EPwYfTJ zQ#jI7G;0+qupM@2aL=3_#cE(oy;SD@j#2l;TxLmaig>XHTv<|`DD^fN*dBOl69?wI zQ7SvcWGJ7L+H9&a)8}PhvJNrr?Ccs;Oh*U?XVro_nt0pQ2-8oAf&P1gVpl2H8$%Lj z{GZmM)J>G~>sOdQ($f|8*-AQ-Ui_Yy;ws|{3~G_biXyU#EMaF$9BH;T#C6b=<{40} z{$khY?;|%p2A$WuG7wy)_2F|!U!Rb=DVj1<(;)Do7j7?5znpx~<7;1Hz)DrU(KS?N z`H4iW$AQOy4r8om;0ZdSQSL1FHP$En%#1HjYm|3+)hSoL6MJ&C@gO|i2zsKCE}x># zB#%9^!iug+ejhwpP~9!LH>UFV?i15TBCbpF(*t{!Ky1l6=+8B^F#~4Z4x|!{yupfh z?)+;eB#tLBLE3cgqo~)@b{52e{)3_Yd%1$?V(WX-Hh&0j2^bZL}o3Y3_U4xOm2Z{wrel1cd-jor4g{GF&P1oJ<#lEylpoz#?PKdQuH@s1* z6Z;Bxmg<)bjgx=(r8oL5Sfrw7-et*m`v3^W0{`lQa2w>%boHS9YZjx6t%^;MlDj~o zsQV^|FsSjrE%@m*Iz<>~MZ4BCNyY!Q_UK);YL}^5=?bk#;=&{WyCD%Bry%IcACG#t zw3PaR)^)$;izD+!jhRG;)zOo!05z^*=)%CWKMt2_4zG2aWxFR8n!sI3vdvJR6rVm( zx?qMiH|`t%t4^O!b+@`#-$((aGTGbj@Tu%Jyu{=>*d83l>%g5YVv(EDuwKJ6T|L>n zQ>?kBXpU?k5q*heQ+6trqvjJ99))CV3aAyxF443TAc5O~V!fk}nxve=wKi@HDm0lg z(x;Jox-1VWBnho}2to6+mJ^j(qQFCw<`VP`RzVzIugk0074;Mla~+7fu9Vps-?jI= z<@(569?ZbMP4|h&Wu03)dpM+GR%~kiRFg}}WcKsP`ZXzv`7GpfQ|#r)S!%-_aGqC} z-!bl+*<6ese9ftNlFR{}c)eLhNzY~V*MFv7Ojx|pqOZErAAI4V z#Tk(kVnQZKljl}xDJ3@fD!pNa<|k|3*x6OuXPb-#d@IP&dTuTZx&GJn zZ$;`D!wad|(ka)b5s%o8>>FK-)yCD4x9c_mS?6!+2{`=ll$=eme+uBhdiyJXEI9Y2 z*gv;GHoOjX5O%0p^Km0%=Kedtcrn?Tts7hIJ_}#VHESGMSqsxJyx-nHZfPU6+_)1I z6nLgy!N|}2-M}FPGo-cJQkxF>un-%Jh*<8d7I~RFSvY^1^@BWt5klN$BXEM`^O&ys z?;jdPKVEr`xsY#B=2}wU^Rz0+W82j8qNMQIz5AV>p0Jrih|fjit6ektk5mlMNdhK= zG|;{Hn`=&{ctUJ5(!p+%*p0rElv|lN+>mc-s$=Uw%=N0ac1U^mJ=Ih->x-g}x{{bB z;=79Hvu`##i1(b24B~Xto*65=6MK$xnnm20V3~twP`qJJ9lewm{&fs;@nqBXc2OM|R_my5%wC<(r z6076ALvll?{@<$Yf(lhb$71TlY--*%yL}2ZxzDYFdW#5P##`iGmLjJjP9}yGTUGt6 zvw4R>e96Jq)V{8nk+HsWZ*-YmUQp3dM5=w~Ay^&xVr0%`*21`yDd94mxo61Dg%EkN z>n-52y>J3m-GdY0s4*5!0t&sDE2HYWa7o`>so2GL@fKwAYCsDJlbbG z(Pn=)Wz@WBHA3w{)9Lpe?|UZGE)SHUI%ug6+Lv_rE%j0kE?CV6m8lAB z&QA9~t5o&(zuHX0EB}?p{Uot@y6k&X0`zg<47LZOhhsV?VvcfDri`#5M1-7bUavIn z)s7YQEEudyN&C;IGIhqwNXP{8roqzPvCoYY%+PW14c(7>(HA`tV9@_KeFl6!`$p0B zZ2&*3e3_|3O#o@R{!0(hQpI`+n@0BD25z%J+_1ea&X+XF*NxC_iEZc!3HfOuGGC$2SH#1(N+10_feCf%AYB-?a_huP_7*w&M_uM9G=k5Jw zX>q%3b~(vD*EVa+KBK8^n<0H_qy5kTa01UG()c)v09toMM_&2?(g2VC&rvIrm2#oJLn+d>b<~`jJj28AR{nvS z1xA03OyWLj5xZ2Va6rPjkY2HBD#$7fN?i*OK)Ig8eMmuUqe7OMcz z=0~0n@vZOk0D@5wqnc}Uqtiu2@}nn2yzQywT}BPsikpRfGMv&hnTrFx#BhSV%kb%y zkBs$5kQZoZI#up2teEx7SgHSQu&v_3EdN)eRpd)m7o&QMrr8QR;DQ(H>`E)lMu($!yhvT7Y4*Ca`M|wI|$8eLyd}Y6+EEz;@ik z{*r1BWA$cLfIhqpv3q|k5{1`IL|L)1Q=JgLK?H*+2qdjP1QA!z;#*3;fr2`dx))5@ z=j*n#O(#QS^KO)xMalEl-zoU6?djut^1ywH8Y~W1@4T_Q_%nMdu9kCQ=`Kfuh3m-G z#;CFiICa*Mj6sZ{#^oy$p{|v0UmlfRF665x!Xm#k<9?rW+K812OtO0Z9YBrze5 zaSLF**o?kZjLLIvlFY>?XwUJHqVe=~>DVd)dA{W0v9-w1yN}=WCKXG9`|=B3r~jfA zBzF7oC*DvxXm&V3E{L>Y8FCa@_MkJfEBlPgJ?SliPl@htPyNZV9Ky8Hg5HdWpgUAiEn79!kKSfq3VwvNY=7ZMlyR(BcMQo4QyyG0Q31gU zVkrC~VPRvBCp^Y6X63pI!dQEG4A`mJTMQ%w4E3k7b3v2=t0v-SCpHQLdQ|38a3C>H zXdZXY4$(r0E!#O_EkH*3_iaE~+ud*y@t<2doTw)a?NMv@>ZI_osPSzoOR)I)GviVn zcNn`v#1}i5#Ete;DN_ynL@EpOOa5XC|Y;D}8{m6lqYn$p<<^P6Ul=hmPY%aWwMy5OLS z+A0+#+K(w`@WkTHjqFQj-*Ex>Sa=5@iKj^W$Gd>PZ2Q%Y1;|vg7cSFl7A@E_t3}74Zuh9NXY@(bP0AYRa;u*0kCt%57IujMp zIqSl{KBcil0?DDMx*xek;~JNf##ZKE^jbYAX@oYL-r5dzxY~RDe#)b_CHhydym3(N zJhx_Qs&;ie*5Fyb9f@(;%%Y;_Qomhhewm7OzgVz;^G*BUH&;H-eJWDvzwbYDidjN`ZilY;U6`KL7VN=V|o%E;TYkMa8lcC#ZfzC0W zucw9PPi)QhQbcYq`C3H;XG7v2bRG#v8xCj|}{| z2_^lWU%H@`8Ej{7=ii8zLJb{$H(e`hi6}?o2$*hogA$(QWy>wxA;wbVS+I`wz@9>J zc6dVD@kK*5*clX9=f;S#K|{_~cZln|hDKk_9a&Hx(?t)%Cy=`DIy;ZW_TtnlCH^WM z;}%07Lj`zaCQwl7lYSAYtA`N=3?rF>Q-Eg;3gkMefMjWKgCb-XMC?zsd?}^Z#)tTq z&j`Bfe!o>X#vClq_V!V~&y6&-_kZ84r|D8x^Cs_&``z0G`j)m?OFHN6%Fg%t*;?jn z$n-pfJm*l>pJkc&9@eM$+;qsfl2vvJL|6t#r{uk9-+cHzCl&fweg+8!Ch?m_FAhyO z3hXF+ELxp%inWVNFcN(0_dM4*`nP^I;6a~U>$k#gTzy>lqG;@M>gJ{Qg^>xx7Udac z+53AI+&{?j=Rt#MzWoo|ar+*6ETz|PQP>WOT3(kEq!#c2>Gm#q@u8_Qw%57k12&`c zogX)zGQwUdlbWJpi*8eYwzY^P<{DVhTRsh#Z{kSpNJ3Qg-bA4N5@xb&fvT3;m=UmQ z?~oBuW@$22#&qD7z9>rsUhZ&B!(y~NXDN#yJ<6~^}gXID(ow{k4(u=r`#tV#awZo zI{o*Nd!zQ}|9Mcn&YSjB^eCQVNS)R>mtk`)Kok*K7ohray3!^%^9^3bVy@ZJ`eWnP ztbgOyZus2Vu1O$(J-oyl#GWprwgb0V$PZ9~u)GES1=MB8S=8~a2tF zPUL$HS?zUw?}m5HO$~AKb&9>XN1OhaXU(DqjRFsaIEEA0$5cK{A5bU4uv%`;4@CLg=>C!@1Rn5w>n!8GRmAySFu0O9lni-!BLkX^Awh zlut03vq70%O){-|G1V@OvO1B$W7P>n{XRwj+2ir}=UnUZ+gkc!y>)mAGw9D+G6$TiKtO_LHK2EQ;w}4zZw`1*FOT7RR`DOpKcUJs zObopw3W*_zpm0B*reD|(+^z6t%s+o9r4=2DWB#NQV?#xbE%1imr+rvHv1sdB)Nq%H zgdG2<=LlF(9v1r~*pBUv(9Pl_Ik^PXRl7%rL}3wUoW=`fb@n-EiPhCa=f z{QjY~pyK=Yy19>;uC548<=oRt*$CNs=RFl}hM26=(L)3DW#6!wFbneUpIJ_+s%!P@ zg=f=0NdJ`^pZE0ZCK-OhR3uhM{5rPLS90&*G0&UOcD-+x?_5oeafZj}$MI1NyT6#A z4E-8hllAbX$F5jjTUPHE<$)I#->z1;Q-f~H4GBQ|i%t~DxMmAxJ@iFADLA}=88(2W zhfXJ-BG-gUzKeG$N2;e96cZpJ#mmZRl@YTdqN&No+_9)TYV;*v8u5O?vjy z8+cm{9GydbK<$GIcJm0>A`%b=I$cut(%9*VCO-j(eNq<43EuMD!OtHGZn`V6M!_YB7><~H;Z;A}Rn`+x1V}666WU*FB&s^~tgnve z`y;f`4-ZXvozSB^K8_qLrpZKr1xcT}&vM6sQK<~7#2E-$+!VhLBr;M>=4A|#P^r~i zIo!$D6;?))BUaV-8b?#%cIFeBOM1b99+Q20s@#mw!Q;IcNgCA$7UKk#+*84LSUG(s z8P4ZB@(?v^F#k^?py52c$xJMc#Z-TU}GLtPjH*WclA5 zx6ul?zF+*QbaBigIK(FSbCbrhGV_mDUo)i&BQ@J zhY9YVv&%2QNr#)sUjHC%-q}igi51esTwIa=Sz#)7I6i*>;_) zUQs$Jw1-y4O>f2?4r)|?<(Jc4RtIB3-1It3j1a#u%<|~HSpy;A;|4w$@DbkA!XW4A z=-bqHN%MmGi?7DE`JV+bH}TFzGY4}#TIG~0mym(LQx`SV4E;2Z`(a zWuK7ya-pe}kocX`1-9CMzT9cKYTeV*Lt=hj@(FM@5E0TPG-S)Rh(#eVn};m|9^W!@ z+R6d~{9h0f(o{SSL7&{t^XUg%3Fjqeqvfszevkud&y?zhBpsZJt*OB%pdA}o1?lN+ zEC^OnmO1lOasljcA%6Wmr=hEg(N<|M@?2QCSgJi+?q4*p%GMmPfW0%DB3^LP>6) zK3V=YJ3HGY@`v{KK?U`oJ7@gHtkhE~rPU1I-M{-i@C4c(K(M91-fcV1)G&OI2g@Bh zI1r4qn$!JiZRkkb)g23)MMjzRcSgbfHPO@lam>ivQ+7VFDlhUieoab=|5X?`vp}Vy z1fT_H^;Y|bM3$qHyIcwrD`sZglGO&PHSF(!HBR~@>*Hzi`@#$JR|BLUOkTL~*vHYX z>oe?Es1W5c0(`j=dp~)L^FUixoPmu6-H4oKd+DcQjP#g-e`?DRLLL_G`9nLU<0=ES zo$B0N=vFoEb1t=nD8*Ssi(HmBV%g9B znc!=3Cim1)!W3is6~RbnF|6sR#FLQ#CD9T$gEWEnDR=&2p$tUHr$@TIuJ3wV_Y33H zx_)8(R+uDF%~Tzb#7k+q-1PTzRFJP33)~1smnfqZdfH6$CMjw{_DX-g_d04WE`Un< zvE`GT4ZZLO^V;@));Dx@{I?XEP|~xYXG2=Ga;*gyoRbbZbJ-=E^9hF+@8*r`_PK3_ z{b}eP{H*K5<3(Bp@n>M)4Pbcpr>!RoX1qLENXn8trl|Sb%$C-Y8!6P8!!%H=`9Y&a0F}M9Ry%74$lO`3#FJpL0wN4 z+KQcB8O{upMg2N#6f_6p+fE=Gex{jBp4p=tNrxpGYTOr=CQ8|BbT=Mz8!ulMomRMA*CAmy z%DSTUDEJk>fTYy<3(|^8%2!oXwRLp$^luv6`PtOW{H}$iy@R8Z^Mi*jUXQ(>`1m6H zLPEoyhofFZM90L&#U~^tWn{j|%Fg-ykKE#t(z0@VMP*fe1Bu+&^uD>Jv#YzOx9`u7 z{bRK8iOH$y89IZx^!dxz<(1Vn_P6glyLUn?$4;C$ ze&W!P|2eg!Q%mc*mrQ31&-+6+bZ zKSTSEk^Mg#*sK3nBm2*R{f}|ckDNJv6nyiJiyna<;Vr82a!xoKq!zRdP*i+=etqZ0 zmi>5u-TA0nCo7z4!9d|s6qHBt;*pL*Q^H`vC_OutQ$YxWfV7261H}uS@BDPdKWKBM zx7NnKZOtz^N4DG1KX>UjWSoCQBLr?q+f(iqHKjeI{Yl1x9bzYUgpT*kD^7S#Oj!Wl ziwoya+uil_Tj62hCNCGcm$&UF3j04kNiF<_BE+45w z@E7M2W}qNi6U3q>ZlnFnP`3v&sNJlwFGgQ_xP*N|kmaLb2kIdrG zgW6lzCz>*D{j$eoZr=~CzEbR?cu`Jg&Rl%JbuA08c+pt$-A+_~9oTUi8|ZJ4=vVoE zo!HtaeLdSVr;4=Z*l95Bo!WIDw*DX&Ca&mGDB4;vQGF-7K$7M$>-ta!GBBKmW!Y;$ z_xxG=;L)Akw5J7t)BsC%Kyy$DqKTpjyk==x&;sbtV}4XoLRuC9+d1}rREJ=;-qoUn z_tjPtG9~*O*#=6*eQrAR=jHC_?#Z+4a3}r1&Q1-qWIZ?6M7gILEzf#FUIN`*bE#<< zY2Vj~2tHz`78~0YPEn!hh+HtQ0HkR>Ee_d*awH1d4gofjC2qlOCa;iP)joP|6azA# zy$NB=L>6rbj7G6V7+GL4eH|)+bOPO-l~8?qeeAv@p7=U_KT#X}(Rc$~^dmMjnWyW= zJI$U<*NgYp89wyM1OgBD7F(G!!Q^V_t#$&29G-kKg|A7*I79pe`Am4)h;O}aF2nwA>+4pbDW@+3T2 zq@`R|lZ0oGN#C{3VJX=0q_X(RT)V$kTkSiTKwoa|z&Bt(2ri-?7LhEKoKju=3#||R zy%Zd~6Gjf0UG(XIq+$7?-o#XS2@*AVYF=$53?_o|>Ru3@vITtpVO`L=FsJKT@MIk% z@d6|s0{V@%E}UD9AjXBZA9ozD-QH2kvAx!JQLDzI<4}h;Pm$o3Pt zi^$mvLXk|!#vu5%4FGqlRw$={f+dI$T4u^b8GVm6+!H7WSamNnI`^c<8VsjllmIQ* zXqzm9Du!~s^B!1Y3~h0T=%ls z%iUOTg^AF-20rp2=9wIl5AT z@q7*u{&A6T8FG5{%g%1p<+1Am?$Uq6To0XBzV>10RhUGCD8W+eYgugZ@TJ{CYkm=XzyKFY_wni|e)YaVJfJ z(GNzQzMHHFGCL|bTTHkNHP++QIaN{R=>xiilAxQH7=gc1E(HqDaAbgV_M>$$86r%E zrBK0kNk#BC-Mj=KS@CA$K4aTx?@E#LsD`d!RMIzOo~-8%l^<{n3q0%RbRb-(>iV-M z*=ksh`vx0`iPMlC{d82zob191zUY}>Fgp)XJui1LUc~XkB*R7(?QAb% zdG0!rFF8#vO|>k7gs{2)0@N=v*`&ggxeuSn+Q)n`JI8+T>CE~QunmK>y*bLF?YVM` zC?cFAY@bf}c_3|jNh2q|)<}y97eO_BV6_j#V9MRZ zn2c#x)Ia$$aS}YPWj`LG^LyK~(9~0QG}nhP$*jphjpFw#GNETjOgryV;9Cp?31wM9 zQa~4}rc{guW<9bJ@s&#m2TGdz{TIbMw#C5F0E*Y^SH#W$=X#g3K~oyo76IfqQ&@vTuOqAdBvrU2L18Bv zx*$d+1rr4po0Dk~ZU@RPw6o^Sjr!g^H1uA^BDPBJ|#TAE-G$RH%NV zNj+Zl8D7HnujPx?>yBS;x2x;w>br${7mRnRw%z&F??JwL)i0IbMnhK}K}eHVZ2p>k zx+v?;-d9$7FHsx~q0tugQaPsbY3SnX(v+QK{;5tJpn~rdNr}+wMv9!^NV30@ z*_j`(@+I6tbqYU1P9IFJBYCQ9_ioIM!dZ`cwm&{y4UpLcJGK4ya(8K%$8h@R})P-$6Ms%9HjDKMVG0lhR(wb1vn| zmEhMUb3GcsLV0q8F)m57b~j4Fd?IW!ynFAUFTn^_=}Xu7`$%G#wadB%t*mj0lny9v zZ$RI=y3G1gPlpX&TjiY_Gm9hjPvKaKBU+(E%0)l%d+<~>|06F0$7igAlvU5F zEy3zE0aAo?MBuS z`Hof+xpv)Sg!mHp%pH|##pslG7AB%QUhp zf1o;9#=`p`dha7>?IV9Ei&m%y+G{yb5c^m>yfl0oCC#Jv^%jb;+@xhtL*M+>tfzLP zuzmACjc5y6%L)CmN)KBC!4x?Dac1lFs0{j+Z^$p;<`j(i^EuCuh3|d?n!n!!35d;T zp`ar7IdmkqC@{1ngf;7&*==&BWy%Qhg6)JA0P45zvd`^f6f)L(A~eZCRY3gx@!h#6 z*5*#*yMhBa3^2zMXMn9Ej404p1l;aL{aPfWnR6n2F1Jx|rhGR%E`pGr#L?9pimf(f zLgVDrSm6l+i2C`#ut0=T)d7lPWwlR=oE4Nw_V=>VJt)7NU#D%-tR7~;STDP9yYMIz z%=F*9vo?}Wj+1bRPL8$lBj_cP-mLz3-xeNUKLlV!qx-ddKZjl;m2{(2s@|~Ae{%DJ z`r9AZ>poxESzw`G0hfx|v%EM|VD%o_-+qcGu+KWS%+$p#!q0O=05Xf$zt1R@m%vZ# zw)=dTI@rov+yh`tNb=MHceyK7s@Iufl-cFt6wNSxK6Kb4DXp`WD$88e5=^f{MnrWN zu0R6}gP2ipJDFAnKzv5X<&SP!n)g5d_jt5S>lqHGt zdP)(W3boo6@&J;clCD5GUE`8=BBA!tgxV_hEUz2eAfJp51bKxN6(A&x36%t9AFxc? znTDGoeIUPJ*Hw^U&zR3LdCB;rrVSdobOBt${xyHGZ5)*Qy9$X|&_e${auINT0KSb& z$#79$>8(1v$G6|W5Y3SKSPi6p#}P2+*PVh=gZsKADN6M~GrMYl>68^-wkm~@8zXI= zV$Kn}?_yL?k(~$dc;Yq(T8@I;X2;<(tN*D|cLJ$6>PXeka!@fc(mR=84259ZfZAzwGgg2(1>Vn3bhyW#} zGjybjNGjP~#toKWa)I6WCii3selE{l&5=9--e%EMjhdLu@PmDh*z%qNTbEq5PG9KU zK0oh)bcyP&YnMC-;9k5hDO`*`tCMTqwiie zjQqXa@%OMPC}=4%BX-#F3sHsV1*|{C&Yon>B|b#f`-}BOr=>6BiS55I<3``BQ00OxeZWovM(5 zi|^`UU8WJk$?LaK&Pk4beL@EM5w$wk*azbZF$CCkK+7ClUs}*w<2u;n`STR+?G(v@JJM!&T=3mC27LC~0W%B)fj!e^#rpnpGh5Z-klttBx$hfX!1LV5>9u?`GApa}Jwi@D3fM%6e>g}h zcndrdqzd;NX)wCV4zVAwGkpw^jZwxNwi9ez7YeyEhPG!S&|XZbe+XL%RI%Lx*Y4mI zx?X&qZ5vw;v^kPQ4Roi8o3i#&@wcAnc)uezy-RR)0Wr`P6VYY4U82e<#M_NBYoJVq zhHyBTBImD7WIS*&*=~4qwWF%7-eJ!Cws_?s6_OAlA{_M45a0EOQc#XhplDoPb<&%) z#jMl!V~reDLkc5P@*Vy9!&a+)x13PHZ&2Pb$BVwSG;OM|)Xb)K+fVM>ut~PQx#m5x z!7%Yps6c0$kti0=xiFz_1Z7`#2i+V7hw|Qn6ZiCT;;tb?$T9#zC~2K23-MAMD&Xra zl5m&VE8`ZRO&LO``aIh*7BCr2@UJ?Xr9U{nBL&{3Js=y-pd?d zKxF-%H@dV=fAVk{#7j+vMiQK@;UuXwXdS#O{Vd0x4NphgzNlINLOe!yxljuhNVgS9 zpvcv;_9{W68)=jp6Pkp!FJF7UAR1ubMY+<>-hZi$m6-9vo*|{jHFVSrMpgL@5|JYQ zmGrGO`8w#vY8BvfmlX>>faoBT_@Xrv-HE5ap`QVp!g%B5ZnzY<=op-VdMN_88 zSvs=t=4j}G)BqlNP+o?20n+BksV0+S2h6XCcHiLdo^wBsU$pP;h3qF;Ji5GOP5y|m zU{tv`yIiXjQnWRI;|4PKKeg@K=NA1{(!aQ5>9DL@um$=Ry?G(=rbI_2`0B9S`d&V_ zaATWyef2vuF$H(bpR9&Uus1DQ7wam=dapf?Fk(wsSogerPi=Rm1?p5sDc_sWj`Y9N zBOSFn9IL%P7c8vTD^G6fEKuv<$+2Otj3mH&BWuzgws^t&oA9FKTqR+75WWmKXRkp)(iYij^B6 zpk9qF!I~!@1B2{rYgbDe5p7!r41owq7N(SEqE~pFMuv#4L>TW?dM+k%j1iSRWz&cz z)+faCcQeYDYIwcahTitF2fp<9SR=b^-5aJs*T;Ae^y860^5FnhdJQY4p#zcjYmrai z0lQ#Y$nojqcAsA9=foxC!dbtF@C35Im1A9NQ)_#3hTTPK>t6ow9Dehrzt7c{!qE;x zLkEwKrJoB79n#yk2Gd_xWq-B)eyD+iXd}Lx~QXEyK%Fcx?eMFl%9lXarRyAVr4;y<%RY5rSbM@v?< zNYY!06{em_e^fnKaEs7OK;J4^!Ai98u@+aHPeRTEA-%cFd!>~%+FEWXckN1rvC!55 ztR9Rv`Ylj1V4Dzj^Xcz&LFacFYi940)S>*mkMQG0B1HhcYyQFr$H&W)xh)LfI$Kf) z`+A`%2eqxGD;VwZ+AyNzEJ~qAy02RhJX@jln%Q#A!C`Yg_CRDc0C%KL`IF}Sn7g~y z%2urn>tVycE`YE`a1I;=w(U)zCRYH&FD-%5%QW6~^e>~Kt%laGO`qw&gjVJa-?65W zl*c{eWTKvY?{P6Bzo>QXk)YHCMV&yL&%!+L_{7Ps?Y<~F>LR~=>} z8uP@&!zaK;&Zoc3Tk+h=`#FLPZhO3@WMdo=+>()B0L5)!kqa~Z-x-rcw!v3g-+@TH zcB>y)Ih2Y;D3*BTD)DGvPwMxp9AlVZ{hUoC3`a1JKstV479v(E`&gf`lv?UJ?-%jc6*drKTO|>lhA9Yjbtgj6nqp2FxCv zMk`dTMC8P3L(c+_U?MAYrDz{d#zMk^7|H$E!9Z7T;GRih2ort=L4h=~7E*Ku4eyCQ zyu%EXTy^S)=S zf5HqDj*-n4X}Red43T*?(@Gm7%FdN-dF5tqDMp;wA)hQSTf>oHYw<(_W93BI&Pfmr zGAQ*#MR(?SD8FYVqv8haSl~GlKN+JNQC>bf+kCKy(*HYa|RDa-lAf8vWWTXQ*Bb^z_u0ZOM3d&FYm^}9+G9n z?PE6}VlofVOMKw9t+_m$PslW#_ZR&121N)sT+|@PCohBA0%ddd^F*e*ayMLzr-0hx zKIH@J^O;rLq?lcO_qC&Or*iD3GNEE2i^i7ClEs|zTQ$8i~q4lQ8GC; z+IH)$`@$N3iJ$HyZf5ep&wsr?r%SN8F-HgVNDBV0{iE5Ty(*)r;f=Ik+0F46+RGv2 zwJWQopEI-M%pI+JZ&<1lRZAJl%2x+xXq7OLe{pN5K5$7uj@CCXlHNnn8q>t6cCehR z;Cw4N^Vh~}D3|Af;DH{4faK7^3)G3HE<$(iPLM35oExaEW7)Le?OJ!OF6fwzeU7%Kea`K*%2PuWr}zAQq%MAAe+g{) zWlJS+zz7}m8FpU}KPdJEB~ciC0B(^DGL2fS3*(t;vwpaQ1 z17zYqi564-C=(Qd4)O+G8Oxi+K5Z+Iw@#ayN4qnGr26E@499x0PfR+w{5RI#J)Y_Q zkN>Z$tD{he5bLU>h+UOKiS1L8kn?$BS4qs8C6-~ftK@vxRYI535;M#pIfdE6aFvkL z7GkzVIpw`_c*pGey|3Tx_PhOlfBgRZ{^76w2zz_KUeCw#@p#{K&~V;7}cV*ncTpvInJ!{(53r_9fb zk*SnJQbGx4a@(-f4jRJ`+C9hoMTDl?=J4TH5_lY>wtPj!rTENEYUExXDgsty*?8Qc zqhA%bllx(N*xFL)#E~%Dp?!-1`3MP>;uzcAT)>c=g`Dt4_9z40pur~{ZHVKN^qMKW zJmq#*iJY+T;FOf@El({_-q@K_g%z?ADX^}}^N7H8kU z4zPT2#`)8WUHSN9&5f}n-RiHaA#3+*ukh9ySJ(C*srX@~#d`d1bE#9y(;AErZWC!b zDjK$yqrrqW@;+dd8d~Z5wIM1YiF}yYaS5=F7Y^4ysvDUeGVpRaE zvF;_L1!~KnuARy6k>7+5Cq?I8H05}Ut+K4cM#0*4vz_VY78D^~Y1A&VDEP>5?}3uS zvLHThO;s&xJv|qy_32BBWMIvXR~OHD+>a`tRtAm5#a9*w-_OcP&yB`L<9?Ma-^jYf zyeVrswfE&Wmf!XpH~bD{sV)_qYx2mqy;mg;P#<`N>6~c3=aKYd^!@A8(}zr6M^TlB z`o-~`Rqz5r(mUqok(#P-a-rd&BB(UJX889S#tOB{^}Xa^^2qV88++=Wd zGp3kumEPy_icT8cDXh~~n0;8&oYs5TkA?_aM!qc={qt>Ukyb40rzk8V4@pfVlbNcm z*a#?Rgx)7TFx9JMAGP810XHNnXcGETy4a_9%C6W6e{O*VRE2ajsFv7)<{4{wi$|oc zMuWXEBHZoobFeYRsY1v;rKm_mII8$UcB89c(iC3XZxYiZ+GXrB3?Q0zCgO~G;XXih z3Q0`_-|P1&*yKJQmKcr;v9NUXx;}n+@ai#Y)4ZALpi<`zvESSv;}P-W5Vy~)H`?l< zYqdQbgL&Q7Rs2E>e@4}FkF3_!I6$}MZO;65BfxB5)RloO{U@p8pB?mETppoveqbqM z{;OfMZi<3T^KHfTk03`B9h^m0A0TM)P>=wlO&8(RP(W8@VQ*=5VqGuRhDXv8`5tvX z8}!AtZaBQGGGIj2#(+C&N~^bi;|oC&j)9q#v)TxtKNfnEU7+noV<9{`#Q2N7gC|** zfJG3Ug16kN>>}|iEW(&g^u>u_yRjx_$+KgRWI^e?n6n#KizA%I6}4fbo+O>UwWbK0dnfdg3FlSvnsgis za_N2iR`u^@?_MN7VPWoZqVA>XIOdpUIyhVni>|rn>O?blnX%~{UM1DCP!9LPCyMNU z;uAP`97kI^(ff=j38(|v+>}K-F1*n2foMOl(e)Bk^Q3YoH34L@kz6iby&tO`cYs}X zLt-kNW+_Gz?#z~goNKiO=lld7IMZSFPGYwcSg4k^$hraWy5BVOA4sh+!k%I1RHarS zek0!gzApaX;7YzF1X*zc)*iiR=Ce*lmf8t92S0jY8rK~ji!?R!5#3xf?q3rz**h&a z6Ogw#^7+Pf_}$>(z;eU~f!*ISQz@b4^-HMSCwN>)FG$Sdt8tX70@F3+kg?EWv(n|0 z&1ZX@P`sTRW>tZGTMp&G6(6D%$=ivM(v!gCc;|ft4C(I`zN9R*g*w8tjKB&5kG`?- zt2B{g3d@J^Vl?sTTjQ(@i%j~&crPVl@7hpr*zw2Hwj@4|d9lTtvb_w`)1!0e@^M;S zs#xz#a?uHUd&lfgkWH1hn(omOe8z#-JpDB9y8pL#G<^qx+h%_fS&uvhU9%LW&XSxS zs2wS=+cBA=NZ#fs+T1CEcM5jT!xR=sI>p29 z6%Snp@5A=!rjy)@i80lQXC|o0c*;~0t=2CS7{3DcGf4*}*I~Ps*yq3tQz4b&am7^R zuY?%=%Og_Ab!`LoR?R=uge6vnRe2HR+D+I0lw8Rz)LDJqT#^t&pB;;tmhw#a$THeK z$_+&*50sG3!bmi`kc!5+G!>H7hx*EG-IkZZG6|(^QbXeAcNoxF>X3K!<+0?a1lnJ< zceYA~X^QwSKn#PMWNt=2Je#xkzK2<0QiW(JT!n;@ z;4^fQpwv+oEg)d)S*Uf)s6TeSkm@i(J~N5=5R3=DTpnPZ53Fj#YB$jhAJgY@9Et)e zF{?RGk&Mry*>Ng&myZ^FHoursy;lLnbo^xkhM^YiVhx@tLmYDom(;rz#dQv~3wa8u zFQzkZ>Ro)tI6(B*aW=OIf-Lu`_Vy6izRbb-P2cHodek$Ft?}vonO1wR&2CT?9hh{- z6wn^p1MLM}C6238;Ny+Goj^(#3Z5?0o+~hXMLA&oUn)>{U}?Eu4n((W8$sZ!LSer= z^j9FMjw3;UVg+!%!y1ybBs(5p8NT!DseWoXUdDf|&M!1W-7Kd#yDQ0OK>ev@Z5<$Q z@(h$q02f!#NlHXKnr{T9-`AYL$U@7hd{sp`@Zpb6 z=%(mX=?!hY@KT*~KYrNe716gR`b|JHXTM+F*Gm~0t40AD@8Z-QoD%BNOv)Sx*JFwq z`X}Dy9V@>Fmy~`YW_0DKrUB&^-bNG3;$x7i41S*(@{n*+$U8p;p&&;0=?csfB5r}C zi7myVHXCTd*83J=kd_;gJ}6sq8LT7toTz3$0Jg6^km-QRZRq_hgF|bGgHWy9BbKQc zuW-F@&B-zJImo>7iXWad^Pt3k@2lCh)$ca@k995lW22wbHp1RQG9QMUM_0^BAOk(r z1Q{ztD-j)?B#1as8m^j!#EQl*=-X2~0S{{B#Jry(KuuinHflZUGE(2F*#NueQj$14F(+Cw#|pwi!obW1u26P9W}r_mE7TXnAcI(IeEdsCV4$LsaT^8V={^ zd>O80!G*sLFC+J=BB|{<0g1oe*TZ{<9>v}16nCi;S&>pwEK$7P3 zr#D4K9?CenOUV!Lg|IlX#?a>9E&5(~rZsa7m*}pw2IV92ZrF9=kiqyr!)6hu`0!N)X(&@56NItW|0#F%SdsHBmgt;L}xhipJoa$NH0V25ty0uUG-;Ay13;Wd} zw(#|@qHkKp((`4(rwxYQFXAYNAb!h@Pr)Tc2tO4lv`V&p)i{*1 z;MsUTTg|f|K`0n?o#H%Nfo%z9!-iysXV++ZtIThN34cMHBZW5AH)e=-CMTq^Zs*L< zA|)DPM@bqdk!4#(DIFue*lH4ROwdyRiY9FbWIZPvV##}W@cRD!!3A(mvjiSXKx<7v zIFz&SWJ10r*DMUoupMzosjyQhEQ)zJ^RCM-xZ`yfUHztizr(@2WAm4CDXkqBJLaEO z{XE9-J-Ko6ic|Q{!I_XlgQpJ_yeq!TnjCYR@5-AWy>dV&B7t`5{Bp@c`IYN)#rP0! zBk|Dx*CSe=iE4&PC zUL?1u?==8xA5G>2)}}H0Vk@ue#?T#|5%IvdTV3lM;zSVH2y#LR z4iLkH{fTwdUEmrTh;M<=dz~oR zysf%+T5X#4tX= zv=r5-d*>MK@TpK-#k{GSS^1~LY};i1<$(bC&xVEgvN=Qk=^II@$l6+sdgXkxgCw^v zSI#~SJ@~BrWM7t6``~K2DPy~8UO>-Mm}$>McC>Zw=jAdpw>f_IA2%H8qnwzJI{Lgy zyAISmEiZE|&^{APC~{GXLxtuA?9@Cdiy=a$%A=AmLP}c;^?~fb<_q${V6xJn6i+AF zfiY#o7GXEH=Kq$^$2~zySO+X=ZOl3eYRvHmLyuw*Cz~={c?MEssrQ_j2Q#n|8-=GX zvH}Q|!5Ve6Chff+mPn_e60SW&tjmA5ZkQqwZ~0+qMX)fgrMVIO!)D0fj$u81A?-9Y zu2nCpS57W%m^!ANsvs@ZqF%JA{6RTM8HXYZ?r+&D(hEa`iyL<>nHMFr%ddGWz4{## zHJUp*Zk^UPevW+tgDO^?RCoo(QA8HoL|16^IgUcr3Q_Y-1d5YH(9(4nrUTy|ivsF4 zhT11jY}VWcD}~YcL~X@Q7Czj<^Qy#1c6vCRsuaXl00JMd6;PzD)5F;yU^&K9>rQ6mBG_-|bck4F4)RTkyN^&LADW$a-tJ z?GQ&UiGXQ_tDiIr2iOAT^l*#1ugy>g$(hpG6YgDN*RnO_V%o+@h+Oc3=t=c3YiwVp2OxB3a^tw8Ua7*)O>$RmPswfjJ}y!oK*V-qN0H(;u_oG2~nIj zJL-5h3QWQQDXXuMs-&Y5NOv)ME42}s;uD(j?M(D;Ecx(&!4aT4bs4wQL$WiCtu7eP zPT?YSfvmErw+$tnFyqGMKw!P!b%?bcBJTOLjNn&tVY|SPeor<((9~>VhJh>cwxkd$ zuD`kxV(gProaK8dOhY|nGVlcbrBVBhm*>;&cpM>K^W8JqwXe*qo_WQ1)_+!Xz&1QG z_})1er##(vg=S&pgSKZ<>EfBc8&v>R*QZc>rp;gCyJ2Oye+1pQ`}cicw0dmh?J!4W zvyb4-ml;)A`s#ZTNCU20W-tMGmrHkdNQ+WIo`q86TI7#8BhbWb9xz2op}m52pp#I? z>5^D9k7XrRhc(UVPH+O$1dj>&s{u5`4Dq}@2d00J+Is?4rA*U zm=Mu<^H5CMHROn1oAubePLB@qOyv{8ZviHYnk3#%?zdAtHyjR{jk+JO9}Gr+R6jKb z(NMcLeB^EEn5h5{`XR&Hh1B+eylF?p9D}E>Jp(UB&r-|EIrTno=BC$dD?7NXZ3}j7b;FM@4iXw-Ix@ z)^ZS8TZfIWnxBUPcWF0*yv`K!(YNaEq3h33=vP__xlC%Xf<{^wT2rbo zp|;z@-)Qv5LpcR5Oks|#KC)tfwrK(up`sd!;$+aeIQYKAMxkkYcVc+i!nZ}g3pkGn zV-pQ>!5z;=sUzX+WV$bF|s7p4|H z+cjnwC6%97*U3d8IWn4mOexW2Y(4U3ZGx@tmBA{!Gx=@6@xq;B2wk(R;Ma|Dg>j<1 zTK%3chr+smRh=7B7S)&d?>z_ zd;DFwc2|$twNrjI zhHWL1SAA7Cxa@P1h}gQU!4;$uMyBPf)+ReFX?QTTi0$HMOjeX&aT+n?Z2=`6`(KZI z8w~I^FzQ93M#8I~--IfP>6CHg=HY_Z6fLawFEN%Kh&_^+%1LJF{CXNKk%cT8C5CaE zH*z`Kz=V#R%957*GVLL_cwm8KA=0PGPq51>dj09+pL&8rbWcZ?Ur6K(&!SiR|J`y` zx4J&GAQ5r^Vl12pwQWwtSE4%qM0RJ`ovV_zgbP&ElNw zx7@^l{|!+nX{nThh#jO0z)~6l;?;pziT1x+oT2{AT47&JvGgjKEuzNX&pIkv;!<}1 zr}0#l%=sOJyxq3A%O8o=T{*^mje!IPh874co8_;>brqHQjD20>?45)hbdF@5uP{xL z-3F4F4Pnj+)m$W0xC+)5dg)|$VL|ByiCi06PPTO(roP0o{BJ*m_zm)?v>^yc)&HPCw1M8bP4L@UTX7HC7eLC@z^%m^k? z_wr`Z@=|;hJ9D!U_p4dVYLPJJg2*jwOv_<%+`aKtOUq!Psk3F7CEh4G`*HEJyQE{A zkCx|`REcKe!u|z@e;FpL-~=>^rkm?4#v_z{(6c=4b3iy*MM6t6cYmRibKQHC*z!iH zQz%dZQ#|UE1-`&jC=ioB&HL-^*6*R`NId$T%K-TG!*fyV)9V=f&UPam(@5d5Qu z-aaq79>KTB=Jh+;#OJ>m+i#pHcRO2ks5)onUiz&9y*$Y?_uZlcdXcw2ef@Hmks7aB z7aVQt{ASA6%GYIesO*YyIXRRFL1$_l%st)FMPa1)dBFEjnQXg~`o6O2J*OCm%TjqxNjPKZ|}!3L^X7h}Y} z_|?ck(rzX(r27)s%9xiOrNnCMfj!VSBYz~E&pL}?1UDaNmd5BuY@CN4i{mUuq2un^ zY{9Qk?Kcet**_OZu1t*fj+)ni+QN@A5XJ9e|DJG_M`(q&^Oj2N=~g1DvX9nIx8aI# zx<*w^NO(%mv#KK|_dLCYf&?UBKmSDnb(Zb~zN{i8h*CWJH;~z_y#>TW(`A97#G$Op zmuTk&21t-DBP6-0#j|db9rYp$yEd``Po_m=nLLiD2u7(TElFYJ$5wMbjS>1_Zv6*r z2MheS?{>Uq@}2y;rhWePAfLN`Jg8yvaMRGYV|<)! z1e8;Q%Gju}9K}V%cA}4Pt!?R1)M|oS3TyuqbuZEXf1q#SC`P9Lcx59c7r%XWHOIK* zaYU)#obu#cjn1R92u5g_&g6V{W^Nbc105Y&-7c}_($dU|1+O^J>9Lb*fmpjD@$7N`diiXz?DdCRN2g-m+gb^ftB(BuS}Yd*-lKY$|oKAEb-1O^X$}nnfdjSE0}Q& zI!>RHhba34fi4c9ziJKQC1-^RT*V~8ewmi^yaehlhnf2d7sI-;(Td^lG%~#9KX>uo zw}7TodQTUlUGS?hb7@h3IPen)f-~KHB*MnX{RT#3?F6thJ>_;Sfpt zcL<#+{Y{b~>`q4*NcZu~EhHDs@uCgtb}3SVPaqww9FyJx(9$CaSc)(^C9p~2M>VcW zD<;Nv-#77miJesE8^^%8%?Eh7x{a0_=VkwJlsH0^)V2ZqZNq}NO!VP;3e?E^h^qqO zmky3H1EMd8E%1(#t|I8C;wK3Q@t*d4lDkOL0N%-mVn`DUrenNn?2RhB((4l)_;7Z@ z6z3s&2U`r*%Gj^=ATqg49G)M3gWcV2R$Z;Y~xPjopuwSUM&Tz9E9 z-fsNXZuI24y4Dw2KiQFQh%8mT0@rqE7kuDE-#I;j&wG70x^8M$v^tOL-p3Tq+y4=e zHO%x-4=^K~RyqAKn20i}c^XPYnm`CCJ1?n$B%G{F6;@Nt@8G_%6-L2WAD~z8=fZNe z{3nRMm>CM4e(M5j5l0;i^Bh(cb4@(?8qBXKzjCAAGr#6P8hYQ*^Us8gU&a9ayAXQA zh#gW?LoL9kN-qN4{~KDQgAvsb3Hv$`XE}xp(EK&K*fi@CAg( zt2CSj`W`dq6mg2Hqyd^8Sh#TxYEEboa}tpINa&kS=8^KoG5S7(aqI_E-i8Eyfx>)) z-wB|3PFrup{I@dc#lZ#E1(E)5OmEDjf`l4(hp;=OUJkk6XFe)mr8hOpb@k?Ep7Lcr z%Y?R-tOx|KE+<=_|QH*7GgChQ}iW#McTJVm-S5Lk1T_|m%il}ADAw)M3~EAT{=AdUpD z_CjGb((@tPm$`|Vv@vIURuMz+sZFP<&|jy&kvfW94U(VghSh#)a}p@vmVF!(7C3v& zRTUpBl1wQkWx{dFZhtEnklyw@*i%^mT_XOz{9VAh1VtP;*wRa6GrCUvXY-?8bnsn@|?ynG?4;nHFgTM`RPCBSLQi zcA@$$&CYo)Et%d9dDT67;p5Mr9$PeawIv*KNkaxM9`a$Hj1E$szE>h7b~-=OJBjUe z(QC=Hy8R@?l^%h$xoEs6G@-U^`ZRg8`4miP1r|T{A8UJ?B?LzEY2+$GO;IyToiGKq zHr55)qnP+32%#(CJPaY(2}cV0JF>?d$Li(JIz#!I75PAiR~ycOP0=CA{i|7g!{z?H z6Q&EB5?e^?|Fmxo@e8ohohaL5v6ft?^WhuGni&iTyru3fAC~DK!s~`|ooaXlJI(o) zwA)=43R-@0xZCr#D-y`+uutNUA*O=v(9#Z4ThD$l>XFyHED4kz(by?HmUAV8KGyGF zf@!{AzpA*XdBMQ!-Q3Jz`IMlSXysF6;VGK@vtHR;N&go{EW=3eR zc&;JZoo&%cC*KaQ{*`f$1l;}XT(&`XaQjsLuAJ+P3cEP*{Y3q_x;%#NE|jfJr)8Ec z!?eZNvp_jDNY91t)58(g7@aKU*IOWkp4?u?H`*GY?$i=>y_<{mW^1**@F5{3f;d(v zw9P*AH7A>T${Z6``A)W#XXI09INsqZXL0F^{p+017}x$%pZlDx?BAiAQ$nKb+*k5h zz@ocjqdFde{6IQg@>L__tEt8U>UI+_-d1of*&gczRHua$3E?RUB@Rq+B3nsnO6@`|#ZLhtjiRT3X98sHGCzvDVVH>%;v79R z?zXalMfTrDW8oSG!-KOQKK2?{-0%6dDlJSXXzPE(+4X`~2)YB^Z;cu;=J?Q*Y$zl-kuvDr9FcwLHENViWXTL z8X7nNPdtTx!qB&Hup(Ia3&@F&{JpLHiCd}?|+(O(CHg;)U#-MBaTFrDjan{{D z#O~ORF_KvZX7Xh1h*7JutHgKpfhYyH({Ty{?o@Yi4oY`!7)q@gKr3LWEk_qxQE8Ao z0kuUn2J{(Jry4=&Xwp_bVjrlsmY?pRe}sqY+rJ&UtpA=TxgbDTHEy0s5?IH&39 zFVA^@iLVD#PTT|?wH|a|wD;_qI(@L>dT{gKAxEC(ow)hqz4?uW+G~Nlmq|_0r%YV4 zow=-AHIXSa=y$0CeS8d>syPh!2>!d}&A(f=vG;@16?kau9Ir%Qqok3|8#1N8L7%|? zKA5ZBr~sq*9fB>;0VR+30%HS3n(`sz9bf+UD#PLIIEELIGtoKGViVjU+v6*t%QQ(k zl9}2KbE(mQbt+tH7bY>BL8sF86Of7!xS%z)U`sCK>oq~ZHVcfaHK5zs&ctxMwsj>| z6{aQK4`BZXm`7c1#wSai8NpEvY52(XZI!Za07;$f$mW0jIlcEONl=`vkYttX z1)c}iT(Ti^XdGjxiey|&?6T`uy!KyTEHbQU)>OkF{UtxE`PTYvnn9k^+rW?kF-GvR zalyIRn`mc0$hn0a&9)zsZmV(>QMP$~l*)kt*uW`)()9@+^!0g}YC~+tZiNRGpZrF> zCmqXXZLpCBBlNoO*9O~^E3M^nyZ06U*wwGNLb5RQzVd|DKu2khD-E_En@%jWKku4$ z)ius`q;OYhSLW5(y=xu1u|*DyU1DUP;&M&zl#lW4}q8g(h zSMH{ZEB8YW05%V#*@6`+fb1xFBm%9-ik7%`yd+)Vu^_Skbp2+IQ5XYsfVNp4GPnem zj>J%tH2DAJ+(*5tQz55p#n%b;PCvTyZCU~dnb@A(tPKMZV)_NUQ!{d zwT&foR3{D0%T7qx`M_G|{ixd+MPL^4(c}?6;x~AQqC&6as1wlDSb;(5Ca`QoLk1-e zpayu|A>;7cVe!i>vC|;I0x>j%I4gV4k!PEJB)%BuV#|a0lg6(=Je^qW@j(R4JeM8$ zAX6dE;S0m3SO(D+yliH0vw8M52Ts96T{ZHy;wZ;C zqkU)&YBG_ZQ`6q*`#aG@v?gT4h6DmN1NCpEj>X7?&)HXQ4}6A@i3Ea3%VPOQ2oE(e z(#H(G*;?Q&7*DYonz3nf^BXiPYbJdfoX%fZQVS~6(K#+A4$&2{KV$DsKe74onrV;G z+&E{&*daItrCUzwo7mQ&fCJ~-1hZ8JXP*S;i2O+fLO zlA~QYu;in_d=OfZbXv&K!jj>PiTG_xn+CN%Y8POGG zm7P?HlOBycb+9?(n#PN^!!Rf6XwfP`BQUwn8PFH1ty-rO=J6_Eza8Y3j}Tfiz-lfp zf}fLLok+3@3a>uu#amp_x+GiI@{pZhDr#wMdF{<@RH~iEprPXS`ofsJAX+W;&BP(^ zwxOkUkz!BznI;*`K%oqKaBB2WTY2iz9;6AAy zT7~3Ca|go|{|xU3ujkbB6U`lnP6qquh#wBY}r`G;lPSfo2GlKBGaP^Nwe8(z6Ev1VL2VhCzR5cLoC5a|RS)6fH zetV<(E6V+I!@5|23O_n0osxAquv$Hiuk zO%Gfc`}WQB`HLJPB_(-J^IZJqUd=oyFCL0$PGLl0NsKHT`su>;%sodk+TDqn0UqrRN7^ zdr6lh^6W+tMO6v`=!%4zM`J`W7IpF(0(VJgUsC1ls!5I?ePt(?l7@0@7sQbf&}?g9 z=Ty#~s* z^kfNm8wxOTXA5V~UOgzR?;Ib&;=73|VF@iX^sqrr*YZOynconAF}4B6ee>4ZKfIoGz&Gp%U5^IO|i z$28+5@FXR!&fu&y&u2As^Mzpr+(@84IWH1BK&_*`o^282Uq;NKdkf@u(v6o!OZ40Q zbdzNlppCMu`c{^i!JMyGOu9*sv1Vos>>9)sl#r<#mUGZyV1CU=JWZa z7hpz*Qc#1o5}##I?Cb3dGP$UyGIcP?pf@`S?IST_AE*J=rG|FC+8tbMg>Fh6&e;G( zhPnq{#XJh@2-q+p?Wj$j(SL1tqye;>x_YEQ^XIpaYH`lFIvpFO^|{s68Hw-J=GUy2 z0?HYmzw=iJ_|b$_(#SGCaa~h-7|_ndNy6IA_e#O#MXJNTS6Qx6J)>{ko{JM6J;BICEnmLan;z`6 zJzFPs$}Rcizw6!ao89KQ4s@Z*3SH|wCDQ(Td6XeGdH_{rEkZBa6+`BwTN+15<`PDl z`6=426~}Zl0hhBYn4=Ivf<2d>|4=W7wa0rsk@xJ@@JuF*R#a5u>RYhrJz#{dj5j#u zxbQZFuyuP}zmlL47JKX^xLAsz?Um`xn?S<=%TRXC^ghZV4pSs`0m3yVo1hwbNSTq^ zS7FzY@#fxvzsj_Sk7F{t8)_eu`|$_Ff~%`FQPqi*+weGqK3F-0PSHLxaHpQxA78K+ zu?H}HL_qH)ZgT??;tk?!7+5E4)V^VsR)nZk*{`;FVENgi?f}b^F+1Qh+kn~38oZ=) z_U*A4|UAMFqWV~U^NdnuJlGiCo(m<2PxYF4i0wn*s z(G=+td`i9Jc9KP|NV`_3sEU;x0vhrqiavug3GL14g_YKLlEC z!Wif?5#b-erC}m1%&Eg4%+JSE%-x4fn=yMlv$F#ZoqK1jvuEH-Y5*Lk;gTHjD8L~&wLWCT-?_^L zKXy@nOli7qCAGABbTY4G=*7&m4l~7tsqI#I;_VM>KkF06GU(^c9)EXy$f+wSlbo4f z4Ys$t21te=4?^{*iz2nzgCT6m&1L!`xn^gizvp%~U%m$o0EcAS%?)6qaF%3DXsvRu ztMrD4grxOWXDloJX?{<3A*HjHCO@aGozO13Ab~%`m9Y6zIngeb4J@AVa1gD8c|}y~ zEI4HkMHN}mOrsAh6zRM;&2ZkaC4q}j8Td3VmprKfi4x;&ISmggK)bee(|86z>ljyz zLnzgJSp0WOtr2{;)O-m42d5rj#7WQJ{_xdLdr-PzV4$0Fb*N%&hHv%ZPL+m_y|P{W zP*@vzJCM*(DJR=c+XhD41AUJOR3&2E@`NGmxcbV{L1KcN1fN{b%(@*JQjgwGr1^}j zEZ&sO*o4%}dpfgNO<6XK`xfp24(_^ocRxQW(9fb>Eq^x4>u6!z|2p;Q_eIQ(pSh{U zg>KW20uNp}lWmke@{`eMdR)n9UPmoj?^*6h%e{7iiB5(*NO70Xl3>I#;S^upTF7w^QWn7k6R)0?}LK~YF6Wb%?6N)6e7^ub{p$L)<3K z!Y8$c-S6&cIO1Bud4W#m?8y*aFVOhQ7mU988jvxt6j-96`SG#Fw7S=oD={#S0^~NZ z+#uQ}w~e3kU_eyQX)!UIX#I5jK+{l3y5L>*F!VC|f7}l2KQ^C-Q- zjy}#*`e|VD)KBVa3g{@oiX77^fw(YXdfAks;uz_S@N5PtaHalVMj1W_ST2`$|kPE_m^zE~bnV8GX6bdd(?xf`07jonpH8J3||`eFn|I zc=0fFt%Gi*ij%_*E-q^gU!K$k+v=IPkXQMs$UpL3yJ)}2G^GkH;5b3J35Wj3IwpLC zseHB^;Ql49u3w256{FY=^&zaJ`Ly#8NSw)97vj)M;B{S!EAI=RWf2x2f~#2VgiISP zn@Fd@DDLFB}*58loHqBAgv6Hb1_b zo9r%_16mk;vlq?kW-rpeHRM%n)&=yHmDzuHZMi=Cw)w9(qlKL1i3r*5S|ChBi6tu& zqs5(@-CSJ6)Y7Bh0Nr?!&5NK_Klx<5{OG6M6-U_vOI4&>4n+su)w1ue7n`iz`i?gp=DrpJNb7B^`X>~iAE7q#55|)eX7;ZK5A*Idr@z!va4_^AA7Z_HJ^oJ2y_;{ zca%dF2V*v&7BLux7s(nxrgN}xRSaw^idpc0X8eB$ z*33PT!JG)zuz_>g>fCzpXh#JCBQo^n{%xq_ z{pnnE?C(E$H=g;w{^iX3pqP8=Sw1OmKD?RU*EfGD%Ov&pgYU_(1D76^-wd>IWvFjH z7N#j6_d-IDOfz}T=j*b(n%%&Y^=Ny;_Gn>=_r<`~(SOS7KI~T3D7AzQZV-@N4UwC(j^@P;- zoeFPxH(4{ihQng~f9&yC4gcv@qFw=pssBqw#a0iO-`yYl zbNJ!KU;jv#_m`dncK#{dS>8;9wfQLl!C2JG;rdK~kpOuw4J%98i)-sSv#R%R%2w7) z=9z`37MosuInMSmdi&#j;J(l2OXL!<0Y4pl4%xo{?sY@#QV=|ERUSgPE-LzG%ulKp zZRi(eo~d&Zrk3~lkTq4rR`0v_O|LrhbL6#9<~iXU(QBBV|BiJis5vwLYUzf_;O4Yh z`jh0cgjGV|NkoyTKS>(#TmULV4N{d;pfOd0STNMl06F@lx|P_aQ2ZXpN-)=(>NLm- z72X=E3|HKRi5dZuqqQs-$I3A|_xiU9x){8h|L?)i>JT|{mwqK#@F3jT@qrZ!Yd2Pc zQ`69j*4fLAkmG(PeXKfOYRa7ZKGAR7`rf0m45W25sG;sZGBzN~F4P#a(;@>P+79EQ zn4|uYWCrYL6mNPu@amyhj-LjEqbn7 zkIYJ%BoRV<#|D!+=Gl=`on)kiwFcuP+uCJ2dDW!z_+rvMP%{)yfsWv-60J3E{(Wy_ zTnNumj_B$6@EiYf!xOv`2ED}*%0nWd>k=&$>Vk8Qplle-k3r<~NPPsXl^Z%i@XJNCsfR|Hb!$aJ9Ho7r-w+E#`L)UD$*~TO`O1Ls-GTIK`Io) z(GIY7>ZTAZ9PI&iqXZ^Y(bfPGl3Bir9X+r_6yv{K&pu4!*knP0LAEffn5`r08yUCH zbq7}1FB;AWjN>LM{N!z7uxftiuFpCX4(Mp8jM%(;I=%N)Sy*}I^^>;vthg)ig0^a=c8#sEhKMOrL#TNZLseA?QL{v8&51E3vfs7e zb6xNGJK-2uecyk^^x@mN8Xf&>~ zw2DUPjpC+hlXVk1wWwb!KUUkCWn18g^SeO(wN&=^dY4Wa`i-Ydc zmMGH7Y4r*@J5>n`vh#kWWx2-EjVu>_4OPJ%QaUO&i`iie6O%&OWyl++)7ls;1nM?W z%~m>A1u`tVep8P{w*+5gz_e}i;+)?>G|+e28}{h%bxs7qolJ>3l1Tf`Isl@L z3=LcYorBexl3`xi=9lro3h|}GkR~YQupc0v*bR)tM`@kZ>XV`MELa7g?#jQi<^DA1q0`&p%IvUn;})}t;$H6l{H8@W zx#HnS2^o}}yr%usXu(D2EZN#H>uPZW%i8=LS?Bu7;oUb1VjtiC zTJe8NMtHC!4pC`UD(@ZCj;}ra2GN!yfRYQj#w(v!+sd-%jAC+ZE1!iSCy7-LrCKe~ zdO+8n$&PW+{P+oN#EIq-v1l52AWM;qXK2tvXw4KDN%&c(Is!BRj7=;S5ksn{yN6Iz zEBz{>#u;3uT79;yKY->i6CFH(1RVCZm9<6^ba{fj8!?v01BvE{_#++>uGA&t6*Iw`c2@nqWi#8=600mlsz!(6jJh}tTuRr3lV>B0_jio zR;gZv`_|CaC^*2ykC|3TFrkbj?s4L%CQ+HDq^`@eBhX;~cizoBsyqP;-)2ow--fgc z_I6R@lTGP^XN>$pRX+RAngp_njhXWsZ#}Yc51BC~)NFwjHs$0nzBsSlrOvD; z_f|j^oEGll~;;qxLWLG`X062fr%9*#AuS; zc#tm9@vZwO0|Rc!K#P*K5x*FH={9Az-;y>AkqD~ZW=E9r7ba00fJ*0>R(AH*3jT|q zuCI24IYq5kSil(pBAxpj#Ye-Ebz|n)#~P!jMYb)A`dnow+bQja?>^3pj)S`MTqH@v zqDq8UPwsZI^33qVU5n;yQ_aZB(05)9I9FX$FaY(j^26H&rzCe<_- zU6L5pps3Vo&EIV`7lT=;CSkx1e?$7p3BfJ`CKJkWRGo|(HUX=;=5gg>FGQjL&r*tE zj0mo?KDkGS_tl7XAuGmgO#6(niHpJ7v~BM6%F!JBtX<&D=V3VxXR&mBS>@ODbz(== zi>VA1nJPzDg{zp@EXfG;$VFx9)B2Q$XxIFewPRV6MSbbm%mf z>y8v(6S_hv6&UW1} z>KUgohT6<(I8dpGrL!&?Pz+F>OLN@)L$*b?Td3J-OMWbCR}c-iCyMI`weUu51L9vy zrIao@r$8@5l%`ulw`ik*7tL8_9S{wRI`L&tAz)~?%L=7cLv;m_k2=}vI@_t26BjXl zR+OzSlExIy)DIvFzbt*aJTjNPafi_upwdTfB3eHxR69SWBrBTD4JeF|% zFJ>hYOVUFRl!#2lt7MVY6^HH9EF)5UCPH5di-YsfEC)ac;4O5Do zX#x+3jtXzfhRAN52=gVL_~7-yV7MD;fi5TDK{@Wu-HwOwVSxr@L5~S@JWvJr7VYU1 z-ifS;EPUT%hDwszEA97czL-*H}u{M5=Fmy;cy>kUA6dUbJd!Gbf>2JZe%6;a5G9~qu`x5Vu&Fhy zdn{mf%r%ed5NCXCX*^bYt-byBT0ms2{e0xlv=v_)5lbY_DrzrZP+Hv2b4a5#$pT)L zRCeuZmn?eF7uwQ-LMyuzlnOcM9ho`*VGN(iRkX5#8_uQYHhK&WffFVH@@OqCnx{aE zR1~vJS$F~XWS(J+h7SXyuV0eDkdJ;yTj-9`r9yOgVn~mo*{~1zw~{LmLV{Wjx!e83 z*2qqPH2}IIwyi8*JUqwv^mkL(oSFmJaI3^8;>_clhXG=pT^wDv%z>^@v`%a!C`>t{MC-8D%D%x!Gl@#dF- zW%R&Th&d*8E{?E3e!T}d7FSpYuLG_m29j^k*@;4PRqu>Y-kL%$)AdWdr_EA1i_g}r zItCZ!r(Z}(<$W!GJ=WQPaPK3pV4TCn#kR+UqyxbCJ2!U5w_t78uOzFof?!(fm$=}> zx}op0QkIXdPq!Y24;}dF_@vp^ju}Z+1BQ_iCmmfd-4{AQ1`S~+>vA(b3tf$0yvy5irtH{lQ+IK+fE1N6ijvtRgx^+Hy79^d~yH6!}ig=Z7x{U z1!@q#P%?>wv<@q}`qYh0ck#U@u?1+LPZjmL@kW6egTklVjdgybKLDJCJpt{g=y<1#Nxd+U*BJ8s zqjW8d&a#+XDdbdio@Tq^AczW+q#V3fP7{pv*(S>dB-+qmnW3ZPCrW;WWj+{!;6{`}-R!0s^FYrtt^Z0#LYV3MM)Q+@^% zJMdIRGO4V*%43J_>hiMM#&+l?ue07kZ~(+q9Es<15{?bD@p(`j^Xcihj~iPuHjU0t z11M?dENDw4xA;!E$@Vi;jsxT5eqA=ZgG#DhFX$3tfP_uiQUR!lZkMA(X@+>=h9sXt z!IqPXPT`S7Q`izXj_y{z#?3#HjN2cDxL3MNtHlBik>}qSIvD^vm|D7L3(bxK>JLxr z)BV=7WI-KCgg8K{B1?Ld&br_T^liT|3JD2b>|iAo3~agx)rFEbRSEs!n4Gj=znFQA zlM36BK26iOn0GX_`>&1xNsqLJLAnyDtr(%uu3bEvswZm??maSn*>l8twfvJnw|HA* zxvXLW+#@gCDa%btVl?3$CGF*A_Jn-IFb zKlO}0oM{tPu^6hO_R17Z2MY>UlYX{ZrrMsA3pGk^{wfG*sUAb~K7@0w4UQv6V~x63 zFDoxD$CSob{%H>-qTYDi4Cs}!b>SPwFWsP3L>ibr$_aXJLk*~Wp4l=X<^J9WBSR?u z%#foE9@`)$NnWp_)b%|`UFX+@1ZbvZjKOSfN3RsRry5>f=gNrFcG3|X{6l6d(sLhq%6S(e7Y$2=d^B7LjjHMHK6RAl2fP%5aQz7 z&n*ewHl}rPP8-JM_3LtP>3|R>eM0BPaae#LIYJ(Y!xdez_nA~UdcqJS?yZ{&SRRKY zvpX5KA8U~fyFqcn+!#MN09bATyIBAew2>c9o5K|ln}FO720e$^@TAhOL)8-LJT-u* zp&$CEkX!<+iQj)hr>A+$Svh-0eBzVIjPM1TMUI&vWh8zsDA}`N>}9TMKJZvJB~U*$ z5d}8iO#fc5&-p?&S|0Lo^kB3~bt}Ng+<2PGsp@lrOI&xduX}V}j z0|nG4??nQ|)dXRuFYn$T2WT=wAfCZ@t0rXaqVpw$&THRb;quuHH3N~=YmNn&!pc%t zZ_6R^YCv(!Pk@4@bM9JELsO!7q0@dn;JDI1i>^#AE_PDQ>B=wFT*WAVgJ&Uziwl>0 z{xBj5fL_`;N>l@D5NbO)_h8Z^q8W@mGs;s2d@5~GYgb7`(>zb_bXzw6wD@#S8 z$94FSniFyh=3M}qVC#wJWVO5gL=7D!@uN& zs;4_?8xvVSI(VfzdqEd2bPBIVUxk=ZeP;~XG6v@52+D8)d!h=69g%0(XsULrxdlgn z@0nj-o9^3=Ln_#^4mEZZ;rVsa{HyX3%O*TK(hUOAeG2*2oX5RMtF{?t#_bjEP|E@b zpE7h(uU@ds@z#B-0IN!^V##xwJDJXJch_mhyD)a1nhJfAW=^dPp5K-Uc|Mf!Dol?ND02UKfe zHthCZTeW)d@~Q}jsG^*IA`XM^u_dL;HmM9i%M!h3yd39cwxNr8gR*i0Wt>y zpx*bR#iE72q?O&K%HoC3V51`#OYunz!JiCph5=!#F&Strra6qFg+$ZzsdoS=ZSt>n zVX`*_T;uFLo#%{48$BhC-M&_j{V+=d{drjNu$|%+tFYu{#IIF!d6lF1wa}LJA7xFx zs4=JGRrZgw*octDxRy6vYCtchnJ$bL85c8JEa1plDiR_k9-GtCx_ zre#};{LL-(Zi5>sE$Hi?E~EI=9k1BtbNCf}LTMNu`1{JR=R@bs$^;GO9QvfdF;U_` zJ>V{!!G$pR;WCM2rYyNm>=oR0Y@Jx7cnwtS`<->A3FA9CDBvXAHU~ly5F4T3@zcUd z!KuF?^(b4(p^L{e=4=bIK9jH6B#y1>j`cU2-y_lvx;iP_$-3V1ssN}!<^!eZPnfBy zQ>qU*bvkt*8F?#^48A~%cA)fz3Y{KfT=hvM&FLKW35ky(MQeO^Xld4sUx`Nq=l)U- zmsO&!JpiZ!wR4qwJF3NzD8#J5(w|o@D1T6ih~8XJNNhfqJIvwFZkmomSNJqjdEj;q z<9-VJaM!R}1)RyuP<7%;`Vm66$70q;&7bCmuMDo9HbSpWN|!*B{VTuS6Lolkj7>z^sZ?gtPk@jvd%=VidI(9uG%pT0Nt6N$RYU@q1Yw zmz>VtPj7nmri8s;G^HSMx%{hYt?YU<2*N_v7U=C1oJ0zeFjlvz*?%yEslGX(rS?W% zWEZwg0rN;v=j4xPtO%wt9Xa2&=-to>_e>j~|)kk(yvOEZ|sn85^*92@f z_-i_9#B%d7T+*%zR+3UC**9X)pxHp2xJ-Ib)vk5sV{)d8PbgZd;#eih@9_dy@{=x4 z*As!Fcp)uHXY4zK)!!W_K)U}$ZchKEuG@I$jakI)eum^|V}Xa^`yzbwrA~oC%A|{s z4%M~V6Z`W}hldbNQlQW#_GP~XISmGd`O4L9(E-tpZiBsTqS7+JGTUM~8S9R}(DgW0PhGmbB?RzjJi-Y3SI1SDgR( zarrSYyWr7)_{kySq$Cro4<-PZxW%?@U@OAmHe>=*NKo zlVXXOr3TWO+WDWtLZS;@Z3`gqJ@dje!$t5_;5x+Sn)d;XFX+>vLR*80{6YS21S6Z>nFU4dP#fr~VxXX9FY?p;z zdq0iv!XMO`d#dIs+a4+8T?&Lw-k5QkwKsk}BQxmf@8{`tmRNh~Djo{w=pQ_5{MMKw zQ}))E`BB?c4Sn@bnOhI(HzTW(83;0!+*TS@DzwlLsu17y6YM-cJln!2;q+l58YrBp=8@!vt!6|#! zDKAWKTSjOs#jOk&P+vxKqhAnAI^rYAm$GTR2^|S&u~-i@|Di(lRQzEDKA|GsIh5@jlZd|5JCjnqn&xxwOwdh^xZn5$5**_S?*G(yPsb$b6n$kTi&tY#W`}S&IroM z)n(SX&-21vZm8OZxadr@(P(4p=^lBo9+0f?+#zM{MSJ8uzh=UEyLnOH}{*!ATW499L|ctw;z2d_m5=Q_ymvpMNaDhTKm zIgjlNEL^6gxX?oI8-?POvT3`74fo5$9I826K_5DLY2>^;U7r?Ri#TI7j>8DwqXGuS z(X2k2=yt=oJSKuSHWUKB+Yxt5iz&;b{M}-aOa8iPclH1v8>5%cL-)K*1(f9_s9z{QQ*w4R&X4TCQPQx># z2php2x@6(_{XEdd0{aZD`TlziEf1u;DJSAn)STt~E zs7?OS;Gb0i{>#UOGUS@ALTKLiZ)WlXKi-;Nq_s0odfMi{e_NVWvGRs4cKzIi#X#g8 z*@<`4HtWk-Pxt)OD}Iq_*f_?;G*TDP>N$@%ugifL>Q7$WX7grT)42iALrib?0m#>T zxuz+qfr$7%hUA1;`k@o`a-E!cbk)Kq4$*ArNP9Wk{tllsny7|5~i;-K%R;%fF9edc|KRuSQc+yrXxQ{$k2dE26)) z>?WOvOnd)`BRs0Rfmqn&F~!B-#;thj8dz#q_^j3*c~3`&PlRJ`A8r3CVura1Fl3;B z1bE}5kV13Aq}y#;K?U?eD|0;1;~_nvE%ik6KA?ogGX$Nc<{joCXDleIkJ9mYgOT3A z!HDyfepSCTJ&$H1Nx_j`<`2MNxQ#y?OWqiWs=95k3w(8`(x8EOf zt3QZS%eH%XTBL#Fxs!`eBQd0zdu5C~FPm(exEK-k)%5IpBi0$COQS|D5=nQ((xpW+ zH8pQuzU;%FTeifaKY_F38&>0y{uB@o@erGZ?iyTspUHtf=j+g7=BQ5yez0cXlcpkW z$+^s>bGM=&-H=%-hE_(YNcV?Sszr1guv5TOSX-)F3Z1QzZcDXc)C^K%dXLi5+672+ z2GI62W~5RZ?mb`6Cd5rBMeHR~&zkQS);wR>QVx+qQ9u6YW^K zZdrr1gnR#xe3Ttu-K&9tY-@gQFy`ggc+A658#|kpa`GQ>T~^ zzz@@3GfcPt{_X$h_4h&kj}GwnKmYY76Z-`wp;NEVoDyL=&3@_(`>DTrnS_D+cJBW= zHW1wZe4RRd=Ipui%okWLvI1YgU12(X>dcwbXV08FclIps?MUG7OlR58UA=zu)_D#K zcV-cPPQ~Z1i!X@k)pc`Oj#9*w9tON%xya4K%f~M+At@y-qpYH;rmmrR`;NYW;awwR zD{C8DJ9`I5k4K)5y}Y45fkD9`p@^{Xn3u6}@d=4Z=^2?>**S0C=9ZKKF6QWp%BuQ? zMqE?#hnChJd~aX>z{kN)V}$Vu;^eofX%czq`|`? zU9$hjxY&WXPMIYbnnU*ObxU0m1ABC2Fb z;d&S_dXZa9nIumAJGB29*?%vv7yqv!`(J_m-*HVdT{?3LxOr#TnE=xCjxI^*J>Z}V z!+ruY6w+w-HgtbXukR%P#gvR4UPur=ts@pSS|p5wzx!F#2z0Nyo=05+R=8~vYX4Ot z1#L09H)HB%MSX>(vIn~u+QV<(>&zyT)saf&w|uxpucw$kf6HI{bAe(GPSjLIo!eXh z=Er0E^_wN1i>6we0Ykk5jcNN_6)&eq?)k?EquqzB5^5E*HHxyUU3H38_Tg6j{t_Il z$pADc2_d|(G1jJ!CsmHFO!nSXKgI5nHlO$uE`Ga>?YN~Y4j=`Y?`gPDsF98TNKY_aT z7d#`fwo9su*7^(7Ggw0tUVPg`>=bodb8L=dPH3D0dckAkFwN9YtDOMQR~{$tLmY(1 z(#d1$@^@oBz)fnuy?=7ZP@`hvpV7s`fTpj83dd>3Tjo(P+y!=Z2H>-4~L-@_Vcm*FO9tVwrEBUT=L0xdv@P zY5Hds$+wJ`bgUshLRzyu6Owzz3c1x=>nf#&N#vhB9e2M3{UWIunPi(~mY0!dee<0T z7yk8@mi}wJ>pMJsZjA%I7*-2-Fx{OkHPaDAO#2?))73m4#jSvTQdf5LWb?-qfMmDL zCYZG)9dBj}sgH`c5EqPJ2TAP>O;Gj^XBN(P%0h(!lVLc}tC>7j*kJ?EABPEhEMUy` zma;Irw_3e}o1;pv?AeCZ+m5+akOfva$4AB;Ol- zOB4+u-F4oYmaZDhe2r_ByHZtqj+slAFHzzfYtrHtYBD|+DYM9XX~_Y;zx6(R`r#su zTl8Yf4}(T%e_+|PafgZ-#%U}AmTmboGsE|$kD~uk;J=3bA8#`wLU*ya>uNiUvgAa2 zOYWzksp~zR%oOnhEO}^~W+$XdTO}2MekYJ93mfsIIonCA7TV2Y2r{&l-&!*?6=Je9 zBPeRgAKaJ9NL!MRF#HPS-qlDa+H(qF7qqBL=ZgPRn6=9X8#9IspmuHINL^Du`g09X zSQ^igUte^pkODQjM>xUX&3P?~cPyAS?UYY6Tf0_;8;!SNuwo98?((}E!po^HiOmY{ zZwON;7G7)d0(mGUaaAoh`hWYBd0pBD9rveMjg3BwwY7(hjq6xhF`s#QzNB5cVs1G( zPqX3DAxoAW%3Roq`DJWazw+9{n{_BjW_7DzPt!4E=8|+p%NKw2mvI+;X)!>G^Dm}< z9x;Cc-B>MUN?%-88Liro(70)~q?cz#z4APGQ`X}BM6G=8_%~c;zib6A89>dm(!|pj z;JtQIWBMank_&{u`bu>@cAc(r7R7>dSEL_tzy2-bFvKP-8Zr-Gzo#H`Pr1$}rU)+vzCi z7$%n$5IS-@3erQ(h!L2)$T3s5Ew_J;X7|vckv4FWL6uhqr3hbzw;L_an6$ZF2Jz6f zX!`FEf&GOddHS%;i)?4?+9<=QPE^_4TKcs2VQ9}v_ir6x@Xw=)VWn$bs*lF#zm{LI zzI?A}t|c?X$x(I=^*UV%Hzs{XNko-b+6EG1sMu!bJSedg98|C|-I+Kw)gf5)*iNj) zLz25xVu?@rmvgD_qk@{*u+pH~iOE2q;`h(fG6yB9WV$&n2yTSSbGw3DewVp!t7-{t z%1u<%JSk!2bNJqrviVIkL{i2HLNv>v3iPx#y2^ZLZZDMeV-^@7N`7c8;MfS^Sj!G| zj4kP}ANGd{6&J6EoH}b1CU#^!HsF0==Lnyma-(<$;bOTH+Wf5(szp`s5I9SaQE0*U; zYg^y^svFkEnbKJJ5Z*rpth<3FOrld9@xZon;-lT{o;PBY&j{fH8 zX5{DRA9yXtw#Uu*9q8_VSRVevvf25F+WboXl8^``Cx&iOtWOmhFlrjd>`m>P>JUwM z%R66ir5{8bvpMz*uOxrjdC*>87-n@?Hxq^^(6Mi){x%`lR8i2^B}BlS_2Kjie5{O}mIG8K+U=`_zn})h>*S9USy0mpRxrWw9t^ey-4T|pZa{r4- zXVNXxjqZXZt8Dtn>#hA<7vk*r>Pl*yaoEJk`pe}Ki^v5qvsOx9VS((QU6eme9yjI6 z&n+(`c|M1jqGo?D6d>4aJ*?0XUMrODn&`YfO)Ih@fO*WQ&aih-;*B@k${^4hzr@?h z)gxP+qC+<{u&QLPad*fAsJ~Vjzdq@h<5zyDll9N{vt8lX+8g5bZdKH^9_O^FX4|48 zoME2sw0VE}7jJv>`0WJD_4m8Fk*uXE-B}^88z;6GRe?N!Kjgl@rj~OwpW{!0Ehn)L1RkPWgLAidE+;=Rt8<)gvEloFrFV_lXO+j`Qg{muoi9<#kib)F-CCo`xV6 z^K8XxhaL;m*_lc$t9a$_B@E0zN7u#6Oy`tblI9ZzRGjYiAA5$R`m=77+MCHK)x|`7#amhbRCg@K)S*QjbC>lq9 z(N%~8g*;CjvF{{q!#f3OJUu$9E#pX&0*T4HqiKmAV{`#@SHcsB1F&o-5eLjEUMbM1 z5jQSmB)RJ<^6qGqn2((!b_NNnS?jvUzys1(VKghxQo3@|q`8Z(3DqtkN}T3q_B9y9 zF%UEqCL5dZsxi2F+1Gtbg>cXhpYW8r;NcDb&ZK4;#%K$thmh6RB21cPXXU6 z9ShvNjDs~a#PuhZE8i~f)jj=lyq_dZUQ@4dM<*6v+zGUMk;-CiQ}zQbDX&^Km*IPG zy#CKA5v91QnJ($}t!U=JNteV0w_>oTZTyOE3}thawWuwyi_SQ>!TT*TW@z`)$U*9{ zH3kVF(W7RB&d`M9R{;NPm8G2e3AzUf#Ea0nN0l#sO9kQQB>*CXL_>*><o6x!Guzuu7 zR~nUP2-$zBUIKA{b6pFy>-?>bs`e@vbe`t8+uQmOiZ-9D*>~6zKm?U?m*-+OCP%9o zKVd*0sa={>VAVG-*{UfNTMSj>pKlHg6}T6K(fKkv=Qvpxi4K*hZ4{!fd%$e{wWk{K+UqA^d!nQ zU%Tj^#{u2&q(s*j%LVPco&!kwN0ay`eIeI@dKrio3yB~_h8*_^gOKKndBe*3ev7HL zOFgZRyMiT?RJ7(C&SShDvBjmqVeVBUk8@UPTLq9xq#3%>By(+X&rn(84QTsOo*C@e6X7+@h$>MlS9Ny-@*Je&LOSXj!?YEb* z>KU(~Lh55rAPYTFG9PJXY1}I}y1(|=BA_*#b=E}9LJltDVCf|p0^AB^y6Y|->597R z;ereiO6qB85kFe~=S2e%noKw6iEXUdBF?(`IK~xwmU@TV=Y7hsoCs#QSVDh25+JAC zCbf;cMHZ+wF^ahD#^h-wC=ZTxas!P7SX&G^&m*kb=b%$?{6}-+7+|3RK6m>a zU3q-#ap9H<_oU1i0)2}Bepm-`C$kwkQ$bUXur`bpestQwgsbZ(^NQixaGK#F+0O>6b~PahLVt^K zh-2gFp&(Z{MXeh^0YzP<`Ss6Vr)&WV z-Q0*SeK!tTnj7_emV32NZf$i)gV~s~%lynRIO}v)6E2p|qZyYZC3?RO6EXGpj6!A3 zV~tv<6W=veX0Gf-D2Z~VgvwQ?kp&rIXZchvVhqsFq&)2lBMeYR6V-Y*Q`|QtLCi`6 zE6Tgqnx#MeTwG2Za1Xo|e9u4!jdUR>Fh`_&?vV;EpqhMMK6+KXN6@asyc1G|xoung`{A--&5E*uL zwC9ybC5mbXTVVm#hnqW>Q`0R$tPwT>TH|g?n$%3%?#%WOF;u==1>0D7QD={+c2Vt= z7>l}$C{s>|)TCDqhkReFj__4`yYoUp`9z z@$_hR=!H69ruM0FWrEtyWt%xK0S4(c1ww4pVta41=|at{-FbIE1r(^sB$^dSf0A#$ zFtR-d29VFVA^omV-$kOFOTpDcla9J^dBG*ENBS*|A9A@LJ+K+qkU>0P^9HzG|C-xH zF3y3?C?f-)1XlsdNkL~S=~omVU5TnO8uT-L(!?~vhHBVnDrqrJs*kmtXU&^oJ9GEN zGWiY%E3ZTMQ~TrL$jiacigP@&E~z-;-cP)D2+;*;QerjNUU@#ld#n;L{DB3!Faz~i zpC5)=6{fuX7CnNSTn5M?Jcj@JSWo7Sx*DwuQS~|RGY>4V;ZiwnpS+7w zHmzCbxBUaGBZ%ZO39Rzr&KCAQR;{Lb4}BMCDd7lnMMin$v<)dr(EXelccQ*6aM7i7 zRHDWJ8>VK!{n>-Czs*Ji;~jH0)`jsJj=T6K#|Xq^w`z6{Fxfj9O>V$(ehHzQI`xI( zjT0WSZ~#cZY4Y-QY7Ki4(W!_HY1*E%$pe5$Oe#Og8NiC-Tz@OH;^%&p_Bn@qTc^(} z#Ci^Aa+8T$0|kBo3DYvzb*A&YC2N(0MRCFul}$%(Hqh^ggCw(l+ktI=2u!B%3Bj%r zJM9wsO^%i1hvqa9HQFrQ%hVwcnMT=(?uX-|$*M>aJK*5%+Y&t*lbG zbTw$~SX$5a!95B%f$jx(GJ;dFkl%vASJvuQ{nx{X%Ns(g=S(8}B{EoUx~zfZQV*)V zheXW9KFEmBtA|3@Da#xDThFF@-uh-a00B|Biq?uh{l29T_uvl&Sqa1O(Q#&yy&gF zc-}~C$JFEil;XChLRSXRAd%!EMpzc*EgA3iCS~5{Jp~mrT(#s0xh8PG)R51%aqfch zm<9S`RX+bq$NT0m@dMhuTIG5$vkb}+k%YL!DLsZB1QZY_DwZXsKiNoZ<*zK0o^GFAp4Ce2eau;BKkF+| z%g@Vywcjki_{E=Al`>y@+}$tS(i0*E=9kUnqcobfr30hR0uUdMu15mf(*%4ppF5>@ z0kj2)ru6$=g$Z34ZMWjVA58A+UIDmuhZ`-B5Le+Ys^K$W-S4=lwS5_(+gB}AyqG3P z*G^yWJt*X=qh4~A85LSq27UBPENW7F8Fd{vzGAdz7fn3vnXV^*8k*d+V2=AvVU$+F z7+1%M>x<3Fwe3b2Gjz9I_7JRMgxvkuBcgJtvzhWazDc_ri3?LQLm%w^{9p z{lo6InaYq~Icm`t_uKLkRYm&qR`SS7ACE=#^=AisWGZ@|ofFWFkGetF=OW7SEC#=- z&1>?>j=rE`0@qg)HJI@$roGIOZB>2r1TfJ06lHnqWH*l1$tQHRkb^zDrl*iY)nVmK z4xioG)yEb+?P8t@S-i%8W!6QdAW=>EFY?9#XpQdq=$^4J{#JeWKMS2Nmz59GQ88gP z;o)yV*2!{7eNA;R;Pk)jOtnGrH>G5xh^iaFo}CoZS;*Mu3w4tleH3(GYfY+?sLDphgE5A4mACsDA4S~5jPgf0O9d#ipu8q4X)^)UYd3C#i{_M-@@sfH0m^RWNc3=0r{V*J38d~WJwPJ-wSdZ!q zO1J-UFZ*yZ_d?;fD!jr##Hm2PABIBR5Ld4^oe!eDx>%>bL8lE~SJTo*jFR;TbZ~Wd z1*~b2|J$?7FqqA1nUk%Icm-Rv^_YezJP!?9zS-1!rQ?AjY}|<)c6n^ zA%?AOvhBolAZH?HW@+48Gq~EBWD76bR;qyaVR&Y1bi(#Va3V$}($IPm z4Bv-EDiH3p=EK6j6h~J&PrE={ZBwtQ+F5>l;?>xS@O7Qu5ik+xRHe)U)*D|+Nk3Jt zqqOO{fhsdosRnbT`UyE4YclJmMlGD<{@6Y&!XXG_+vAi#>LB>}V#*gdYg0!eW0rVM z*rM5VDGLbnUrdFb!VhQw*zL9(-kc6d3jD?Nyt~VZB`ys6}ZW)W@Ziv7MfXq0O_#i6j%JZ<{4!n4nEXZl0sAXMVwUtZ;XM zoDbt~$;;QXc|8(EkK6uj)XF;R@&RhR))T)`h4HK{%IgAoqcHGux}A4MvVE>s$}GCq zq$!~ukkN-rEi_&^CHIayN`1ANzpH128%oR#%Ek13*0fJEPwHpW-?|jO@>c0weG5S) zL2_qIH8W9p=8qRjA_-I6-V6y!Xk4&VW827SMB3u_)*rF$Hdt>S%^JIK12k!`DN=_- zj@$lBDT<}5tVF)`Ez48O&{X)$bNBPJlj^drz78*Af=aR*Ctc&!j16G}CmZwuFp>5w z_^q?))f(qp4_dJtOlCkPkxTsbnK)L_ic3NNHUT|T(&3@A(flbdBBR#3`6a(8wCe|X zwzquvkb8iTOLq{*jc$~;go(%8YlQM;D{gD!6TWv8F28HKaiDo_qgity8S{O@&u?tV zqCQDLwm@=&`^b3kksxLR8@(cbZTNUqLG$+Yo%1*Cb^mQx8Gh5b8U1yV0&HU04wIsP ztyn^vc_JK|h^;>-8lk@1Rq2E~1-Z~E75GFev?|om4b|9m(x|Jc>k}PQBq&OqZ=u@V z!DZY}+A=kmg$bR?g=<;YQP5MbiU0|&rUFm4CQMiayv(sZocR8*HQi^xI>w|qX~vuY z$MCG`PAM%;0&d%y@++97H12yGy}2)7V>DZp7>ito8DsuP%nGJ`^`FPH)W1D?S?4~Z z#Lz>wTo20fEb=wNT=HNBwU|eRl`bySrTUG_p4XIb(u{!`;7#kBjn`dep2jI%T9(tf zersB>QqS^7*$Qf7t)I)oCzB+_Faj7MXE#qu;BcXyNhg{-+(SG&xm-K{3jMdZ(Y*yW z%nqOp8G!&yrBz~U8ac=J#YW*5d6jYF;Ou_&b8~-Y9L%>9{_9gdY-k5|G)3d3P6F|N zT4Ib$H9tTEAu7h7d@?P2&E!ATqxdaSxl~WmGsmBl4NH-{-G5l3)Wt39(fl~MmLL4i zj4z70#+LUFGW<<(JQ|L(fRHUO-SVUW1Cc}{uK_^g?U>e_UMw5kfHqpO4u}GY&KOd9 z)~zWz1@4P}f@_*?iQ7TCiLPAKf;iNJ+yb(9xJ}$^^o)x`a&@vS{GQLeh?7eourYd! zof^7D0XPKr{4Sf5*a9u$Z5ziRS`j4km~h($PZInV#;lMb-bxYf0Yp`ELlb;GnvZQ5 zv9Q{?Z_ssR)lfi&va`8REBYPdzmdQyVD8Bqb4u5Av6-_Q%P95tm&;GqPCU_f^~wB^ zSjeyVz1sN2fwDB%Gp=kp*vk=RuG4fY>!FfN7!D~Wa0#5EJ5|K1!$b3?;ho0l>V+KCffqsE51Xmx3Cbq&u3+|`;Z1S25xhwK zXitp8>H&XwOpS9pkE6&f?Gh7z)GgnI@~;1Ss<8X)&vV(c-6G5OQ=q*WB0LL9mL3NZ zqi;xkzCa6%fnQ$s)5CXrjg?KJ-H?rS)p0$4x)T{>7wN^uBB3IaPEix;Gibj?|~fjsU2Y=ro84h0x!5-Y-!T z+vArEn5+Z%JFr6PlDw!HCI83_4J%tEI>wgiaMm}B%LU83qdrXHyom6>n4T6*ICDSk z_PAU)?>P+k&P^3HeVh!Ky?ssO%t4En!la^c%;C;Ghw{fEf7E#t-M~>6dXEJ#dPhT! zG!tkl6<%%Ev)j_WXw3f7YiGvAr4iS zHs&?TA7$~5#l#7)0uHX0_{yPa>+dOR#<@9K))U6oKR==Pt+iV#Z7-K~+@@?wm zpXyIAd%CBf(_R0gxUUS0s_Pma#70C=836&MrMpAvE*UzcJEUO<6=?zK?id)lq(MpP z9C|>y8M@;;=>0y=qxb#3-}mRezH?oB=D?h__Bw0t6?^Si-YAA2725*7ZY+k@&jGW? z0AAibiay2O%L4xxvlPg7odzNXvxXIN*pp}A?Q80Im~eB?JNt}|`Zn<+2brfgi(&@f5=Ff~36WJP;ZQSpKN&LhSqaC3Pu zRl0~$Fe^k@{_#uD-Q)G}Ce0es*%!u7%p&+KTM;jf$Tdbmw$3qKsQTa11U8^qAF$SnfS7Ia=geFLgnD8-_*8H_PYi z(6s0LSoSnF;uYDL(FoXPD?VDqD|e&Euj8e_$xrYf@;WeAsdRX0kfDHr{Yz;R!(!c1({zAS z^@}6Y^yM#u&Q^2see2fcczac3+tvsC-f#1?)U>72&45JSDM+qi1#9{@L-XdkMfu}n zQnrW_$lom9-#kf=C{JbrAkNS7c82)&iaPoF_T;MWKA(nqOIRk7v+F zZ-@x_%JY@aR{F#Tq^$K1oXO){NKG@g1jcXu&G zTKvup?3LE*zC)hIeHsVuM;4%V{u{-h`w|r6FG1)DOBL#?^?$1ITK172o*QT>t>e}o zJWYa#zj-_fP|FxNql39U@7uTJ5Dl0WP12CzUu&+OD$S+)oFt(=HSR8Gl27{9+M-ya z?UBTui{=*Rr)0JcCbeJ!n%sacTZ={?N&+!r6%1+@M=)>WNXnFkSKF+VNlwig&d#-&B1qAr;?qlLiQ z6Ut%3FoGbCW{(@&6sZS61)p}#OE~=uF>bGVWFDaxjICX8#c9asmao_Y=|XSy?VBGA z?Va0-J7@qWgfuFbR3r9+Si}c5H}%V+#+t@WhyC6-w|```HIdlDI`E5}lJGPoz9&KU zsh2Dam?gzTB1fZ)o!+R$#)Ne>hXF}$%@(4+$&KsF;9&9`r1V={uaQpc{6X9_q3~RD zgV_a(=)8)@$rz7wP3Ljck&ExwxokbSvsY7Oj>5rTx=eP2 zh?R2-y}<}_F^NpMi+Nr2ezdQflwiKK#hlh6FCit^uek|ZWqiUf93GjGmcG7uY)G*_ zbgnM}tPBs_MxBT1eDpj?II}1;D@>>bZ?(;Vy$kn)ppc{FAH8@-xmp#2W#?ke)u<-( zQ=X9ldl!bq0ee5%TE4kNVu|wNqGY9^0um|c?J24F)0`z2!`Qewj6Xdknl)#y$389k zE4Ab%vnDeoUGWSj&Ck^nx%X|?VYl8FDt}^nv^=6jsez>cEdKA$r3Oxl5{-!e=)vH- zHJU(wt#Ejmm(4=iIKhZmIZ+Zq-3N`(7k-u@Ew$-P!>tIOSk$T_p&5JoSczKvybdOv_F1?$fx&1t?5QzDo_pb((^ z(~@Q;MtU17W3&)vn{I!3SuxDJ_;-O7w3rg&!ipf!H7#Hbu+r^oz<)w-5xoGu?%0T{ z*?~Yf_E!aM%7_?P_WTSaA^b|oIbj3oZbN$LKE2IAC&GX1|BjR=E?A2~K3J6~R_PAn z`9P@qL5#hIkb?@xwZ|24HsS4z4^Oam$1|=EHaBy{UQ6hjSC#9Qwmxao4wI!79JbVZ zWh$bbF2#&F>erL`JVYu9Gcb|N!_VS_BW{Ma@Bxn>y?2&Td zHQhw-Dw!Du0`-S=G_J{E<#d$5-Y@hT{*dlT&x+1%d7_<-n56_Mhib%xb8+KLLScAJ}4p zK;Wv|pm%|q*Fj%J=&yl(kbu!ZHlcwaP-SpLppX<#e{aKN#uXVJhno!n$#R!16-gHz zPVpMRa`W-cuNy55o*RyrD9`;}oeS9Go|83qh&8`MH4JvLzkXol2t9OaojU9#s%?-UwY*s)d|-wz=)f9)r2Qc#5uE622BrIw58V{GQCaosNRGVI6Je z7ulL-K5)+azC3Tztj$!zlkns|s=%|%%ak9Ikt?f=qjU^Sh+q&TbfgBN@Z=2rz zB5*c>YB z^Yvl<*{;CBi07r**;qbL1QSj%ehkp z!9EtdJnof4o<=oNo_jvs>F@MZqnauqx-5iU`0sdGV~iRa*xM=s%}bvzEc#HH?6ER^ z{v(p~@TQq^HuKCa8$DaqtF|X2@kWZfa25l-M5b{@3)@^M7skrW&85aw&uL*vaA2{x zmm?~gAC)t~f&t=uUz;zA&1Fx;jo;B?Y~{AAvoEmalzfsik0@OB+%H$Lp7z+PxLBVR z^W1wVgvGt)c05tY5BF?$JtIwh?RjAr;`d$P5;bzU)Zor()3Cr)r$uuMiOtWGnMd)) zz@8afyA$`W`Iywg*H6L#U0R_<>$rDoW`rvCJJ3IcYEAo?Rxvh(`_Bk%5`+3&WmyBh zV+$$ZceN<4^qhLGjq_Qr9FH@&Q|*TOdMtD3&_+royL#-t?zI+ev|i(LKh7#+XP3v6xju3lnCGH>A0$p)a)F)po`fg~)ovein+C0q;$%VeTO?7q+DseI( z`MCyPaaNJ-N|>;ZuhWPlX;TeO@b!$vO?Ai2XQBOme)lLTd}*A%jgo>UBLU_#|L|%! z@?CSX>O^0O#M<+2*zP383B5HyL$b4=GFdaVem3AceSv=Xgrk0Y*K=!RnC5b^jc9Ko z*^h5fw6V#*e``EI+?kW98u|ii+Pygw(P2)hye`2W+TY$U&WUr!7{eQhEEnX|+i&8g z(a`s+si~PMU+*Y5GM)fPuA%t$8iEF*^maN}=|5E*;)x)704o@C%^3;Hb#4{?n;}-A$d#^yJgV=*`;WbEs5>PAnnh zmdAG|U!Zf2m2WN2&l~7*u9qDGoeF3ZEslGn>A-i9uqY+n)fWjicIeiYO-50e)~ zXpNZAoy`v4+rCZ1X^kD3_Nq)0i_S6qVBA_=~5?2TSO9mzN{2 zG@~C8#(z>Qi_QvY+^wL_B@$6 zyo5ytHPT#eQF1g~1kbbRT!d_+&U{Y%r_Xm8tj_XFdnPt(4&##*q{v;wcJP*3%o~oL zPZQ!Q^G45~-klhH(_z_RTZ0!aC-!ke!ybe1yk*0g3%0-8B9`zxV*1P!+hsq9qv2!&g~>m< zMq92bb^bAT(c`4(Q~`q~TKVqG%txdo?P0MI2GCn=J>C{(R{32D|E}I za&k@``RUU=tU^PT;l`#rm#TS{>ZFZ7NI~{xC$WcsrhQ8CNF*cm6zS}K&Qo~4H3`mZ zt2>-NtZ3M7uCsRO99@dK-0Pe!(mp%u^^iZ`_H^@01B|lht;*@35ieBr6Y70=K zU15bBpP0z4obG01;RuQHICSplPsvp&EGQ_r=qNmstiiB#N*$m0V0KG=DG}vn+?RIl8GYoAg6h1+ z7<`(j1}_jRCl*+JYU0fe)>%&u+^?`s@1cc^q>qP;m79-@Yh6#l;5*xDdKLIY=clhj zq)PROd-fy1|jyoRF! zZ&~tmyj>8kd0H1$`*y*-zor76ux#7*Wb^50wDo$ZH=(ztg*d_{+PTNS9yXLhvG~3f zqo%%L)31D9Ye-zc%+j5xE@!-DTD|XX&wL#GSw`Kc!uJ;UA=%Arz8e~_A-D(x`q_(2 zQ+{nJ<#ffyH#bvg$hhysVW+Z(8{#6(n)dcpx{rab*mLmV40I}Qdgp;$@Ck)s;?&3q zjh~Kmk|qE#9y|!QboXM(o?4Yl<=*?uX!EQL%yYNOnX%komGW!wRLY8Lx1|N*PGd@| z-ubol_;0UxZr%S#yG}K)m+mHZx|$5}qF^GjKag=Um!gC0zaJ53e$Q|JuTaaj^La>ZFQA%zjUu`@{gRJ{?pvS?yqMZ5^V?8-p%$Vk3J95i-I2qEu~4RUGU! zJW$UfOTeX!SSx3Nt)hx9vdQ|M!Aw;rMCZTQSiW5y$^j(8_O0iBp>J-f#715Vdbv`y z$5i)>S^H_(#SJ2dU`S`hg5*$Yre9r;F#RU#0cBf?TEweD4v#)7?$^ZCQEqlLCW$Hf zY^r1_kHwp1TTwXZf4TD;gCVZ_tBAQ5VsoORqTEGFS|MiEfuW(H(K;Sg$V^amUlW$V z(=wA}O-(H=OGjNmK3O0T^yo;*OvRkCva*QtMzB<-V(~yAVa`YWk$r^Kc|+g(%Phqg z7YjNUmM0AmT@~uc5}l*jfdR!FrPbn#X+YcZ9Zp_0SG64+95m0J?5_>DR1!CD=bqmH zJw-R7yGEyo2my4(X;*1)q*X(dI9ZGnx}V?P-dDC)t8pVP# zJ^watGS?{I>-+_oX_6B}z%j1%F)Fq0_78KN)A8u~y-ek$*@6mxiS>_p830k8}keCKNH;0qR#(=cqqAAoiFKt*@xCI3(1cYwVL}FV?0;K0)DG zJL%e(Ts+wgUq+MJFiB>YApSCT_Crq*b-DniT7#;UHELWyJR z6N8oJ6L=m;jcf--USwTU=u}(*eny!x9Ygy#&*u|@6Zbe@F(~%COoytYx@eth$BprF zbA}DKLJ_f1aZJ7!avDzC>T;MyZHeJ4t=<@qF={EhgNBY;HFK0UvGOX69BXS&_lJIn znq|X`zmFG{MSNaAYF{O{z=j3zIxurqXj9XX3*$)1vIQEnLGz5tA*o^bCAs7H(dEkY zk&<={ehwN6@6n9wz>{%cw_qL*1ktv+oX}#2gsQS)Ehc>P;An z4V((eqlRA#2@R(Vy)kot!Su*pOBbNy4UUwQf6{hpQUt)Pk)@lrmWD@K3e2$ar1J|Y z*CA3;bHmlcgZo24sS$PQ+yw044G~b(@Hze49}eeYy)C82y+&=&R_lymR2;^wiOnaT z(au+WceQJP3G47+Z_oY>>rPGc%fO=x`t9j+nVEhuVoNRPHk6^keq$kOgHX$SE_U6A zY%v&mU+I<)$-6I{{d0lKHwnN#)K+>d5#vv!38A#i^|w>j$#fe03K%&n_&GKuGMnEX zrlSboX65<}yI1L&#I4kdX|b^s7eE6+ zHegdzsDi{|;BkhY03=*OM7n9YU`XDf7pml-wNYPj8{~9jkQKAZ#E>2?!SPT;SXki^ z_MnBR$rE*|N1ZW76pPamYk+F#D2j@Vclc&*=2Jr(#YCgL(L*%T>UBTK8-!kIQc@k$g%*GNMaARt)Ahy5Dz(wMm4Ku&?)J>6z zrC6TI$WnC(!o)glz{-Lr^ax@(tg+4sys^t^P|Mc!#B*p*VA2`p_Yw{e*$287~#tXg@){DmJW(SZ?hr{!=9fXs`*(a9(63%+NxDyx?iFzK!nWDG@YJ~;)?6ld z`nkOB&ejES%F^|SK)=&XhYf8>doZzfZ^^zZ@BL~dI$;dgpEEy+{>HeOq`=G;tJEdk z#gkL^-oHvL4**lnuN8o^y;4GGAi@;Gs>AMhv#!NLpF(;m^_l1%;S`TkGts@l3M#~F zW|hGn9QUd)(BkgOCfgMe!QeuvAOc;Hn8DgjAe-8&0G^*g=~xnU({pxGABdlHkC!i1 z`%8*RVXlF@FzGU4k#YQqe#F7n7;r*PBEU!PqSHbn#F1GW$Z8sXn)SsN)NmgBmg!6Jp&|0Nm9*(`(5WX<)jT(cvEIs(uG ziyEo7BUO$Y_y~`)Y{wLlRm})-0qVa{{w@C3e|>B_DQO!3`nQPW@pyVN@J#6wR2TJc z4uC+xDUnqsCeOR&!;baT_+P}TezlfM)C9CbiGP?OA9>F6G;EM;(eM{Aq;C1xTbMjn zDWA9!Md4+)CUxg@`=S4f#W8RbL z9i2Cpk>yd56M&cm8zT*c!0gn@b@8_buhj&hufn!_uYtx@**8|858|PtP{Xd;#|CD{{bQ0eh`xoj<{*&-W!)3din61y9x0+i-t- zJD&#E*tN3n7fhw-slj{7JLm4W_=zKLvZo&IqqU&CKg?^Fm4-bxw$+v5)czx3!p*fL z{#2DCsohFd=kA#jBwB1P`39&A`Bu9jn`}RWL^NvwYz|mJ|I9FC?#M?r0=@2U#Txma zvql&}W#il0BZX7}ex~d%z%-N|zyKLfnwLq{BcjCE-)i!964Cfk+~+t77g9i&DBE^+ zc3=YME4YhksR;YnxGc5%ZCQX^wFie7lQS*da~q4TdOOpubiV66XMQu{+aOovTU`@g zg2_SWS@K0iFM^!ssEmP|+(99#fNV$uQPAE*VE*DDEfsQ)5?`HGUp+BLhABoJzxKyH zP4cL9?ds+*HlA`A47McUQY||TSmogf@7I1wsY9`u1)H=_6Eqm;$S1cOE%cH(CO+cd ze5Y>o@L@YA$- zK1;)8pD1e@P(C^jSQX+Yj`^FMD6%+O%KxfGGo3i5#VB_fz%;7#irE z-}jA)ifQLL%&Rdlb||naZ@StcxBNUiKU|eMa$M^s=p~2CZa0UH`#uCP{(z0D-EJiS zLM^9d;6j}S58h0!&*mcqDb`CO+6@Rwj}T(ZGBg%QOt(z@7G-~}d# za4p8R_~aI>IyAPwx{f@PY_~4H6 z96dT{JYyeF3&o#uRx!(&@0X0o1L{6MNlHp&x7qW3d8Fg+L}Hi0A@OU6tR;}7ViegfKwKL_~GUWemilgIYv9>7JkN{7pn7Q>CYR-y|^pMzLO#>Djf zh0|b4)c)e^@f%f37nD7GUn(j_;OO{qY=oD7`67Rr+YS7NS^~m3thV@ARoZmMY%1G4 z#QjNxD-@dSa!@s}F@odY%yeb7RC(*uXEK;En;wKpp{5jr}Qje-=(O+sL4ryk*{t~}sdTsgXUOF(HHV&(EK0n!?d(rmZ z-YBP<2r-4L#M5`z!N?UA9@vF_3p7ctm@{;Abo7@{1AoL4fPaOkt}Hxus1miqTdsO6*VLWg=y`UR*bUH2VX{a`axy6Z(Yq20 z_N#9Y_FDBt(j#D$020nS&R(MjnfAPrfG5rlddQ?%!s3H&{?v^(!l; zYu_3h1zGN*gTBtNkw@O2)+T#|1|n=}C#6iiKl8atoC@$t`ufwi8GqdlW2bL_{dGI3 zkOth2MoejdK zM#hms7N&7oX+y{@Kaq#n*g_bl@hry>YwSaT68ED!Rkf?Ti}z$6A~mR4_;6T;YNx9` z$eD*)rv_(eMl?$92s!X?pj#6uL40rrGB(9tyBo0NYq@Az|3I?NXiaw$xy*+;f@flC z_Xeb11!iAQ#Sxx=bDph%jy|=kW>2AZxQ7cDicb#lW^F2cpNi0!ejL~$NNQT@Az>b9 z6jvTU#FdeX8yJ0yx$-PeX>jEjSUQ2|+WUUt$pU(l zGosBpNLqYMhoTXsns>*?=;jGYpBj#gP0F6^3!!cmS1;yJ+}G=el35zCn9}8rC^DD5 z%ihB6=1LiqFP@5pg9EEelkLl@XR_dki6vvWdB*UtTkAcu2RYRR!4~6&4J6T>YlzyG zaX7;uwE!BBYOP{9>00*G&A8Mc3kvtrQDFH5!wJ1vQO-JFhSf)kfsn!;$#Vgc=>cH3 zVS{5zY!c&;Th)5G130lA%%CGdVEcWskh6wQkK-c)&|E&_9|+Mo6I`pZy9#iP6OAL6 zHh)YBVlx$5a2dat&hLc!Sz3t(sT~>^W(}$|$5hCf`NUfeSFz#;Sz&g$9x6s=9dI#m zhd0owbd9C#rZDs5_L%z+GQ;8cC6MsU`X%Zmk;{4ZLDJaw9YNGRg8;i_KMHD)r1f-J zsD}t60#}X3l@h6Q^IX?#o_Cv2i6qS7i^`M*R#mOklst(uQZiIFbbq=$N+N0BDp{H$ zkmi2EhuI`=E{V!Lkt_bPDJPN)hFuTv+W9Ku|^gQ^#p}u3BP}2y<=77at+ZZxPPmT zdMc5U+bm2&n2cLLVAVyRZON34f%KuRS~A37SSv+2v9nGn!N`@2up1m0;3QpQcCV~t zMU!6E-pJ^yM+>78gstMs&7tw$?!NVNja82gQ$LPfw?GOKJ@Kj|h#ExJz`@AK&ch>D zFC5N5ljL*pzMhM-h6(6Ks^6axppD`a>nH)9jwaI=B`p<^h%rRUQ-ys!1r?E4Ejsmt z$8`)F6C92&0pHHD8#ljnVmQi_t?`q5c6EBWk$k5#jN{x_5;Nb7Q8reqd@2~|U@dw~ z0uRfHtBn>U_vMul&vYz2%+2|~^nOl;gLmOfq3l4E<(v38D=W<-ay}g9A-#S(W~a{7 z+@5g67@BdFYNW!%U6!)Xsq8ek_nN3sL+(=bBDvYrhYX|w4}*H<^V{Ix4SOl7so~oD zDzH@%9<@Oq_!5Hv(VijQ8&ycGR(G#(#Ucx4(B!pBjG^|HaW(A4$3kv6&2jp#`FfVR zYPS=D*WGR>UDsXmHu7V_wk0wQ_V4ces%-f|`ul=jakk{bBXO9Hg}DcbB^@6G>= z`8DFvAOhYR>_8?&hwIQksc7ZWD_ran+Ya8XPGU$trxENh^XlU6etc@E#SmpT%rev5 zC-~5|DmxGtUn1U!yABUIWY&}5^L)ym?o~KFO-27%&$nSbm4}E;A^O!cQy;&RO6eiY z9NU(AqlEpBlhd+VR+Gx}L-uSJoNlb~e7F>zxU0OsXq?s`n}HnaT%u{X@hEWk*6d}_ z*ON6yCG)S2b}WpT$chv^J+@=&hWAQkY$A7_TH|7mO|o_(QvEkAbl8eJJ9NxLorbL$ zS@_cM9CPd;yfTwkk@2hX9f;cMI>yDrl3sOvj0w6IDm83pQ~0@X*@`;GVHKJ!_l2y4 zjxp^gcB?sQ^kZwyldJ7r2LKvCp(O!jQcBHwk%%5UbLO(ODNnhN{=qe}}7h}1n zu*>#Pa6jM}KP#-v$?Q5S^d6l-c4>g$?6iV9%UH8r(dv6znY~#!wGZw@LVIp3&=}DO zf7Sikk>#$14(@7ZYE7@X0{Y&PvRrzdPyAc8!7t^R*rzJ#qO^Ic?LP!TIrSNzbfe@pOV#AmOd#Q zuk>`~_IPXdoI|U0o@`7z+j;JMDLNWvEgPgYi91HLRns9tI_+<3_*gn?(~VZ_2B&!V)-@(uQsc)??+tuUh-q1Mv(#cb9t z!>kd;T%-Op+YPF*Tdaye!xT~~Pcwu|95dqx1$JBKz_IUIiW=|D=7kZp$B+at*TjK0 z0_>i$JS?H;eWIRSO&{4t9?lM+V`MiDbCq`=GQDKI6#S6A8hm4Xw<@4ImMGRHSoIM= z2XG+F#jT14#%#Uo(QclbWLkFSQePHxFE(%TVj-)Hlw(c|G;b`tW#dLQ!$M=HaoFC} zt5+F2}$@GpBEMqO-~KiYE>gYLeOTjzsqfh^xYp8sH9pixn7ahqta0T)N0*(E; zDzW8gZ)etVy0OvmOn(8h0*q^wq%&oD4)%Txlifc!U=IsiX#c=(EXu;i{QQE2Fd;Tm z&xBNA4UV~%>wauN%zV?{cq2ems@p((Iv2w{L=|e8TyCAr0=E-n8#KM#xb`KEkql0q zHX5yzt@lwdu13PTNc2>^&lkN2LZUXji;Kg@Y7%zc7T;oXA*UPa+y||8k&{#Wgea#5HoDFA(KY(b zW)Xu^mo?MNy`3GVDA(!Z?1Px`;`3e$lj7riy14-3lHf0DNRAblkzO`S+H1S(hjg(T z8vGN-7KSFNeIGS}BMcs4muIC8MED0?aLnf5bL^We({pyL=RHAtXsyxON73Pxj}WoW z?h-Zfc;l%2Le4`ut$*iPiW;B8vWYkAz0>;=l4W`~W%(8tjb0wY4)GOs0~EGzE$&8V zb`?1Gztgws;PHE;Gg(ZRj5_2;<^;X(z|MLo&=u3UFgrMSu1sEu@?fF|G^>hR>63T-bAoEV-S@|X+n zh7{JBO#A6W9&??v*DEORewPk$ZkJvmixx z*l=i^e&%~Nd2>-$)pB2r^bx-4RJp72i1}AGFF+JOn`y0@ZH{Q~0nT7r;W$g619s^9 zP@2W{Jk2rQfqZkbDM5P*>pHaDiPspb75h<^dLB}UIt{hN%!A07q(V7Sq=NX;loYZ* z7*I6p;#TlN>zT9TK`?`IVhi<&*l8~VgB$}2806<{i_|3N@vlVkfxsmF}bYPxoeIC&EsdU3JRk{CkwDQL_cR$q6!ZNyHV z5{#)plhtvwBqkKfLC z?<@5tW^6M}J7qU*L1t;BM{dlPSSipg+{nT8$FJAz&HQ>gmMZmhWlbAXPM2vS_ zV*M<~q>K1bOpk~lB6rAMHy{@c$=Dmn z_v7BI&gprEz`4cG(-1n^PBn1vgCbZgQBL)(kXRyrNSW9nO^-xb9V2^GpvIi<1Y%H( z_FR^t73_3v!s{nvs&eYX*|}IMY>FMnGa@%Poj$;sni4LZ{K9)KWasK9E>>2Yb?7O> zYN+0#qMz5?tc`~(`yJ?I#_M_PK=F z=o_Nk`Pa)hBIXStIk$zOd=<1ly4mo7j2)Li^~*TWnu!tjMjcb0XL6n#Ra|^L9DZw^ zKP|<|q&NYD*gA2rYd|&g^(N=LNjNQoX?6Yii@{NsP)TI)6vG z&c5mHjg5<=r4tdW6Q_%XtP@<}bw@)$Or}=o>nrD^TRETGR>d#%w&n7KuGyVF+DKIT z5>uW25P=iY2Fp6J#nI8+t4-gC=V*!hI9MMxhTq+C6E$NoffB4h-z;$GP|!MGwXkV= zIVP~BzPouAs6JODAedb_s7Ww$Y}EHPB0H{s{2hMD-9n;Df$>9BKDwYntQMj|Q2hs1 zuRSG{B+GBenn8UwFlllvfT$Tz-1AwrsFTG5M|lCb;py?@7p2;j@DZ1%&54n`hE4%( zb77q=G~6N;$-S0su(?fk!ts#1*VkG%8=`L4TMJfnEZ7bodSK^FYp>fLsC=lLx8>ql zaywP10Q0-N)i5{>#~@wdF@_OSz5a6F$4IBYc*6$;NGQL(wEaY*hapb zBrxZ<-rMocRc9^nekr}NC;6!M6M|e7@~WKTKwA$N!kqK05qj7v>JGQaO$uxm_umnuWD-{eD49 zVy@Jet9JoM*A+XLp4HC*1XX1&K9=7GzMHyFoXc&?%0Ht6NyU-KQmtuHJX1U+M@+f%Fw?DJ6iAb*EMkp9|MVu@!( z>QxBmpTcB6H$qGvXEW4p2@-UofjF_XJT>2i0d zmuF>BLEV-uvvH4`-FH_zdoSnI2+OUzQ4q`zwf9?3WWVih>b}JwVR7{m+RFGLjK|)+ z&~oB`bDlW@N>EBg&rh=)JC_)tb~w+d@;r~o_OzD=#u|q+dQhC7;e2Ah0pO!`ETWZxMv$@NIO&d?0e@ec{z#9~J2v9>F;lA^4@`9MnR@W0ij^OmVdV^@E+k4-vH0%1G+w@MJTx zY|0~${p6ZH0Xa+K>__2e7!dZ7p6}3$lQObU2hFHj2oCeWd-93yxuz3L_026xs7YCn zyvX>crwN0-5#zI<4-=}UpDPt#kXAMg3@Po-hL60Yln7I_%YVhr5!YYP zns_;)3_(2FN()E_t!!GnB6tr?f5yR9`RO(l!Nr9192O>9>fv*n+xjoN>K+8XeP*QX zXaCeM2du|`zquKMiQv|U7WMllw)kP+bWI8y`=iS)OP;*ujR=wuzlqT^)32|v%a9HW z#(IB)O*k{7^SHh)uBB=r^Y-d(mq$=W&cIHp9y$gQdAWPUF|^xw;Wr#w7+X3B6j}vc z?PBy+U|)G0K27M)z;55s)f$-<`hhc0&p#G6Rg1|k@O$^p8p5Uz1=@od=>HFa_RtWr zwz3BrK}X5O#?Vgdsx8WuG~^l?A9-+W3(&f=<^Awt^7-af(R^zG&GY3(PfDfsfaC4U zslji!gkJv3onZ%iH3_IZ!eABVkf=9_ebmprD&zU9uFT%x~OL z^CF$=KOVEGX8%DVOcVXN>TuCVv2E#DY+yN>ccipNJ1_mlC;Zmwv3tvg4W1%Z%0v;U zeigt_J*KmO|a7YZk`nrz?s6H|AjqrBt8k{eNkZZ@dGvnHh zd}Y+P{TADHdqpub=m0t~tS=m8JgND_>HYD#DVb7z#RcR|AoN?TTBsna?yvxhKU%-i zu0NtxftQ%r$h0`8RNCfcu;8qP-tAKH=Not#*Vk?gC1IJ_SVYBunf|)@%^F6xAQvRfU1cPI!jx`HzlWJT|yWb`*wIZxxB-&!ZH>D z1x~KZOQBtR1Om2v{gq+l&o%^p0HJ}N0iV5N=>OEBzYzTQdhiMX2=o9bUBl@A(u%)V z`lnvJg7{VG*1uqWO7Z_x*_|t>pVw7oR~MiJ$QXbI=G}f?zo2V@|Ng5|eQR68e*%x%%om{m9=s2L zUrEW;^$YwZ`hS8u*x6fK{u{wRbNI$Dc;NHuJ)(h>C_lC3|HP*&mHO+t0>K?c|6RfU z&Z$3D>=ocIVg-H&{F}o4lWW_UmG2M$yU?Tl;KuK#A@^^Cu`{~tMger{!c82!$ z0JPmdffM(s;dla|ckBTX{nb1F63^=Y(n)sqE*6IW0sQ|Wn^gcie%5VoVrXgjH$C28 ofNDMhh$h4PQ#NOR2mA@n^o#Ht0Ee#p#iyVx;4X9mP%5DR13NJU0{{R3 literal 0 HcmV?d00001 -- Gitee From a7485c0995cf4fa136a3044425db95cac0b3e3ec Mon Sep 17 00:00:00 2001 From: xjp Date: Tue, 20 Sep 2022 16:56:13 +0800 Subject: [PATCH 2/2] code check --- .../common/QueryResVoConvertHelper.java | 8 +++-- .../debuger/service/DebugService.java | 6 ++-- .../debuger/service/SourceCodeService.java | 7 ++-- .../mppdbide/debuger/vo/VersionVo.java | 4 +-- .../mppdbide/debuger/vo/dbe/VariablesVo.java | 2 ++ .../core/sourceeditor/PLSourceEditorCore.java | 6 ++-- .../debug/ui/UpdateDebugPositionTask.java | 4 +-- .../mppdbide/view/ui/CoverageHistory.java | 1 - .../mppdbide/view/utils/ExportUtil.java | 2 +- .../mppdbide/view/vo/CoverageService.java | 34 ++++++++++--------- 10 files changed, 39 insertions(+), 35 deletions(-) diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java index 23c0dd39..151b07e1 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/QueryResVoConvertHelper.java @@ -1,10 +1,12 @@ package org.opengauss.mppdbide.common; +import java.io.File; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Properties; import org.opengauss.mppdbide.debuger.annotation.ParseVo; import org.opengauss.mppdbide.debuger.debug.DebugConstants; @@ -78,6 +80,8 @@ public class QueryResVoConvertHelper { case "org.opengauss.mppdbide.debuger.vo.BreakPointListVo": list = covertToInofBreakPointList(rs); break; + default: + break; } } return list; @@ -143,10 +147,10 @@ public class QueryResVoConvertHelper { StringBuffer buffer=new StringBuffer(); infoCodeList.forEach(a->{ if (a.query.toLowerCase().contains("begin")) { - a.query = a.query.toUpperCase(Locale.ROOT).replaceFirst("BEGIN", "\rBEGIN"); + a.query = a.query.toUpperCase(Locale.ROOT).replaceFirst("BEGIN", System.getProperty("line.separator")+"BEGIN"); } if (a.query.toLowerCase().contains("end")) { - a.query = a.query.toUpperCase(Locale.ROOT).replaceFirst("END", "\rEND"); + a.query = a.query.toUpperCase(Locale.ROOT).replaceFirst("END", System.getProperty("line.separator")+"END"); } buffer.append(a.query); }); diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java index 9b3a2916..435c6d62 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java @@ -225,7 +225,7 @@ public class DebugService implements NoticeListener, EventHander, IDebugService return; } - }catch(Exception e) { + }catch(SQLException e) { MPPDBIDELoggerUtility.error(e.getMessage()); } } @@ -416,8 +416,8 @@ public class DebugService implements NoticeListener, EventHander, IDebugService MPPDBIDELoggerUtility.error(e.getMessage()); } } - } catch (SQLException e1) { - e1.printStackTrace(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); } }); return vos; diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java index 95624f7e..cb118318 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/SourceCodeService.java @@ -15,17 +15,16 @@ package org.opengauss.mppdbide.debuger.service; -import org.apache.commons.lang.StringUtils; -import org.opengauss.mppdbide.debuger.exception.DebugPositionNotFoundException; - import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang.StringUtils; +import org.opengauss.mppdbide.debuger.exception.DebugPositionNotFoundException; + /** * Title: the SourceCodeService class * diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java index 66bb3831..61e1f157 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/VersionVo.java @@ -58,8 +58,8 @@ public class VersionVo { Integer end = versionStr.indexOf("build"); versionStr = versionStr.substring(start, end); versionStr=versionStr.replaceAll("\\.", "").trim(); - Integer version = Integer.valueOf(versionStr); - if (version < DebugConstants.DBE_DEBUGGER_MIN_VERSION) { + Integer ver = Integer.valueOf(versionStr); + if (ver < DebugConstants.DBE_DEBUGGER_MIN_VERSION) { return DebugConstants.PL_DEBUGGER; } else { return DebugConstants.DBE_DEBUGGER; diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java index 91ae9a70..5ea25dab 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/vo/dbe/VariablesVo.java @@ -74,6 +74,8 @@ public class VariablesVo { type = "timestamp without time zone"; break; } + default: + break; } if (type == null) { MPPDBIDELoggerUtility.error("not supported type!"); diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java index 33e40f85..fb0e159a 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/PLSourceEditorCore.java @@ -1383,13 +1383,13 @@ public final class PLSourceEditorCore extends SelectMenuItem implements IPropert String remarLinesStr= newRemark.stream().map(String::valueOf).collect(Collectors.joining(",")); startInfo.remarLinesStr=remarLinesStr; DebuggerStartConstants.setStartInfo(oid, startInfo); - } catch (SQLException e1) { - e1.printStackTrace(); + } catch (SQLException e) { + MPPDBIDELoggerUtility.error(e.getMessage()); } finally { try { conn.get().close(); } catch (SQLException e) { - e.printStackTrace(); + MPPDBIDELoggerUtility.error(e.getMessage()); } } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java index b923f03c..a85867d9 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/ui/UpdateDebugPositionTask.java @@ -183,9 +183,7 @@ public class UpdateDebugPositionTask implements Runnable { flag = false; } } - } catch (DatabaseOperationException e) { - MPPDBIDELoggerUtility.error(e.getMessage()); - } catch (DatabaseCriticalException e) { + } catch (DatabaseOperationException | DatabaseCriticalException e) { MPPDBIDELoggerUtility.error(e.getMessage()); } return record; diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/CoverageHistory.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/CoverageHistory.java index 36c2681a..0012487e 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/CoverageHistory.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/CoverageHistory.java @@ -162,7 +162,6 @@ public class CoverageHistory extends Dialog{ sourceViewer.configure(new SQLSourceViewerConfig(getSyntax())); setDocument(new Document("")); sourceViewer.setEditable(false); - // setDecoration(); SQLDocumentPartitioner.connectDocument(sourceViewer.getDocument(), 0); table.addSelectionListener(new SelectionListener() { @Override diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java index e0a6e7b8..581ead8a 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/utils/ExportUtil.java @@ -94,7 +94,7 @@ public final class ExportUtil { BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path))); String[] split = text_description.split(" "); for (String str : split) { - bw.write(str+"\r\n"); + bw.write(str+System.getProperty("line.separator")); } if(bw!=null){ bw.close(); diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java index ec5050bc..8ea52131 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/vo/CoverageService.java @@ -41,22 +41,24 @@ public class CoverageService implements IService { try { List res=this.queryList(sql, CoverageVo.class); res.stream().forEach(coverageVo->{ - List toRunLines=SourceCodeService.CodeDescription.getRunLinesNums(coverageVo.sourceCode); - coverageVo.totalLineNum=toRunLines.size(); - coverageVo.coverageLineNum=coverageVo.getRunList().size(); - coverageVo.coverageLinesArr=coverageVo.getRunList(); - coverageVo.totalPercent=Double.parseDouble(String.format("%.2f", ((double)coverageVo.coverageLineNum* 100 / (double)coverageVo.totalLineNum))) + "%"; - //if not remark - if(coverageVo.remarkLines==null || "".equals(coverageVo.remarkLines)) { - coverageVo.remarkLines=toRunLines.stream().map(String::valueOf).collect(Collectors.joining(",")); - coverageVo.remarkLinesArr=coverageVo.getRemarkList(); - }else { - coverageVo.remarkLinesArr = coverageVo.getRemarkList().stream().map(item -> Integer.parseInt(item) + 1).sorted().map(item-> String.valueOf(item)).collect(Collectors.toList()); - } - coverageVo.remarkLineNum=coverageVo.remarkLinesArr.size(); - coverageVo.remarkCoverageLinesArr=coverageVo.coverageLinesArr.stream().map(item-> Integer.parseInt(item)+1+"").filter(ite -> coverageVo.remarkLinesArr.contains(ite)).collect(Collectors.toList()); - coverageVo.remarkCoverageLineNum=coverageVo.remarkCoverageLinesArr.size(); - coverageVo.remarkPercent=Double.parseDouble(String.format("%.2f", ((double)coverageVo.remarkCoverageLineNum* 100 / (double)coverageVo.remarkLineNum))) + "%"; + if (null != coverageVo.sourceCode) { + List toRunLines=SourceCodeService.CodeDescription.getRunLinesNums(coverageVo.sourceCode); + coverageVo.totalLineNum=toRunLines.size(); + coverageVo.coverageLineNum=coverageVo.getRunList().size(); + coverageVo.coverageLinesArr=coverageVo.getRunList(); + coverageVo.totalPercent=Double.parseDouble(String.format("%.2f", ((double)coverageVo.coverageLineNum* 100 / (double)coverageVo.totalLineNum))) + "%"; + //if not remark + if(coverageVo.remarkLines==null || "".equals(coverageVo.remarkLines)) { + coverageVo.remarkLines=toRunLines.stream().map(String::valueOf).collect(Collectors.joining(",")); + coverageVo.remarkLinesArr=coverageVo.getRemarkList(); + }else { + coverageVo.remarkLinesArr = coverageVo.getRemarkList().stream().map(item -> Integer.parseInt(item) + 1).sorted().map(item-> String.valueOf(item)).collect(Collectors.toList()); + } + coverageVo.remarkLineNum=coverageVo.remarkLinesArr.size(); + coverageVo.remarkCoverageLinesArr=coverageVo.coverageLinesArr.stream().map(item-> Integer.parseInt(item)+1+"").filter(ite -> coverageVo.remarkLinesArr.contains(ite)).collect(Collectors.toList()); + coverageVo.remarkCoverageLineNum=coverageVo.remarkCoverageLinesArr.size(); + coverageVo.remarkPercent=Double.parseDouble(String.format("%.2f", ((double)coverageVo.remarkCoverageLineNum* 100 / (double)coverageVo.remarkLineNum))) + "%"; + } }); return res.stream().sorted(Comparator.comparing(CoverageVo::getEndTime).reversed()).collect(Collectors.toList()); } catch (SQLException e) { -- Gitee