From 66a17bea7c72c7dba5b392467b1dccbf84087986 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 31 Oct 2013 16:22:51 +0400 Subject: [PATCH 01/30] Fixed signatures of str() and unicode() (PY-11162) --- .../PyArgumentListInspection/unicodeConstructor.py | 5 +++++ .../python/inspections/PyArgumentListInspectionTest.java | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 python/testData/inspections/PyArgumentListInspection/unicodeConstructor.py diff --git a/python/testData/inspections/PyArgumentListInspection/unicodeConstructor.py b/python/testData/inspections/PyArgumentListInspection/unicodeConstructor.py new file mode 100644 index 000000000000..b47f64aeb7d5 --- /dev/null +++ b/python/testData/inspections/PyArgumentListInspection/unicodeConstructor.py @@ -0,0 +1,5 @@ +print(unicode()) +print(unicode('')) +print(unicode('', 'utf-8')) +print(unicode('', 'utf-8', 'ignore')) +print(unicode('', 'utf-8', 'ignore', foo)) diff --git a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java index d89792bdb079..e0b323f4cdad 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java @@ -158,4 +158,9 @@ public class PyArgumentListInspectionTest extends PyTestCase { public void testPropertyReturnsCallable() { doTest(); } + + // PY-11162 + public void testUnicodeConstructor() { + doTest(); + } } From 55b045837594e7bce99cc85239603e962b5017f6 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 31 Oct 2013 16:38:20 +0400 Subject: [PATCH 02/30] Made 'dict.fromkeys' a '@staticmethod' (PY-11169) --- .../inspections/PyArgumentListInspection/dictFromKeys.py | 2 ++ .../python/inspections/PyArgumentListInspectionTest.java | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 python/testData/inspections/PyArgumentListInspection/dictFromKeys.py diff --git a/python/testData/inspections/PyArgumentListInspection/dictFromKeys.py b/python/testData/inspections/PyArgumentListInspection/dictFromKeys.py new file mode 100644 index 000000000000..e089bef33c2f --- /dev/null +++ b/python/testData/inspections/PyArgumentListInspection/dictFromKeys.py @@ -0,0 +1,2 @@ +print(dict.fromkeys()) +print(dict.fromkeys(['foo', 'bar'])) diff --git a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java index e0b323f4cdad..affc095d1c3a 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java @@ -163,4 +163,9 @@ public class PyArgumentListInspectionTest extends PyTestCase { public void testUnicodeConstructor() { doTest(); } + + // PY-11169 + public void testDictFromKeys() { + doTest(); + } } From cebb81d18816e980067c083450619fcb44c3461c Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 31 Oct 2013 17:33:02 +0400 Subject: [PATCH 03/30] Fixed pyparsing imports --- python/helpers/pycharm_generator_utils/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/helpers/pycharm_generator_utils/constants.py b/python/helpers/pycharm_generator_utils/constants.py index d50f7048c924..6b77e73049b9 100644 --- a/python/helpers/pycharm_generator_utils/constants.py +++ b/python/helpers/pycharm_generator_utils/constants.py @@ -224,10 +224,10 @@ SIMPLE_VALUE_RE = re.compile( ########################### parsing ########################################################### if version[0] < 3: - from pyparsing import * + from pycharm_generator_utils.pyparsing import * else: #noinspection PyUnresolvedReferences - from pyparsing_py3 import * + from pycharm_generator_utils.pyparsing_py3 import * # grammar to parse parameter lists From df9dea59c0a67261fb7f0c7be159f8103a077d93 Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Thu, 31 Oct 2013 17:40:17 +0400 Subject: [PATCH 04/30] EA-51398 - decode should not return null --- .../impl/providers/FileReference.java | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java b/platform/analysis-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java index 69c2b0cdf326..207b819fff23 100644 --- a/platform/analysis-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java +++ b/platform/analysis-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java @@ -163,40 +163,39 @@ public class FileReference implements PsiFileReference, FileReferenceOwner, PsiP } else { final String decoded = decode(text); - if (decoded != null) { - if (context instanceof PackagePrefixFileSystemItem) { - context = ((PackagePrefixFileSystemItem)context).getDirectory(); + if (context instanceof PackagePrefixFileSystemItem) { + context = ((PackagePrefixFileSystemItem)context).getDirectory(); + } + + if (context instanceof PsiDirectory && caseSensitivityApplies((PsiDirectory)context, caseSensitive)) { + // optimization: do not load all children into VFS + PsiDirectory directory = (PsiDirectory)context; + PsiFileSystemItem child = directory.findFile(decoded); + if (child == null) child = directory.findSubdirectory(decoded); + if (child != null) { + result.add(new PsiElementResolveResult(getOriginalFile(child))); } - - if (context instanceof PsiDirectory && caseSensitivityApplies((PsiDirectory)context, caseSensitive)) { - // optimization: do not load all children into VFS - PsiDirectory directory = (PsiDirectory)context; - PsiFileSystemItem child = directory.findFile(decoded); - if (child == null) child = directory.findSubdirectory(decoded); - if (child != null) { - result.add(new PsiElementResolveResult(getOriginalFile(child))); + } + else { + processVariants(context, new PsiFileSystemItemProcessor() { + @Override + public boolean acceptItem(String name, boolean isDirectory) { + return caseSensitive ? decoded.equals(name) : decoded.compareToIgnoreCase(name) == 0; } - } - else { - processVariants(context, new PsiFileSystemItemProcessor() { - @Override - public boolean acceptItem(String name, boolean isDirectory) { - return caseSensitive ? decoded.equals(name) : decoded.compareToIgnoreCase(name) == 0; - } - @Override - public boolean execute(@NotNull PsiFileSystemItem element) { - result.add(new PsiElementResolveResult(getOriginalFile(element))); - return true; - } - }); - } + @Override + public boolean execute(@NotNull PsiFileSystemItem element) { + result.add(new PsiElementResolveResult(getOriginalFile(element))); + return true; + } + }); } } } } + @NotNull public String getFileNameToCreate() { return decode(getCanonicalText()); } @@ -218,8 +217,8 @@ public class FileReference implements PsiFileReference, FileReferenceOwner, PsiP !myFileReferenceSet.isEndingSlashNotAllowed() && myIndex > 0); } - @Nullable - public String decode(final String text) { + @NotNull + public String decode(@NotNull final String text) { // strip http get parameters String _text = text; if (text.indexOf('?') >= 0) { @@ -228,7 +227,7 @@ public class FileReference implements PsiFileReference, FileReferenceOwner, PsiP if (myFileReferenceSet.isUrlEncoded()) { try { - return new URI(_text).getPath(); + return StringUtil.notNullize(new URI(_text).getPath(), text); } catch (Exception e) { return text; @@ -504,7 +503,7 @@ public class FileReference implements PsiFileReference, FileReferenceOwner, PsiP public String getUnresolvedMessagePattern() { return LangBundle.message("error.cannot.resolve") + " " + (isLast() ? LangBundle.message("terms.file") : LangBundle.message("terms.directory")) - + " '" + StringUtil.escapePattern(StringUtil.notNullize(decode(getCanonicalText()))) + "'"; + + " '" + StringUtil.escapePattern(decode(getCanonicalText())) + "'"; } public final boolean isLast() { From ae33c21aa118ccbf6a2a68c4e052c1062b49a4ef Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 31 Oct 2013 17:47:49 +0400 Subject: [PATCH 05/30] [git] Log exception if it prevented to start the Git process --- plugins/git4idea/src/git4idea/commands/GitHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/git4idea/src/git4idea/commands/GitHandler.java b/plugins/git4idea/src/git4idea/commands/GitHandler.java index 0816bb93db0e..adbb64de75da 100644 --- a/plugins/git4idea/src/git4idea/commands/GitHandler.java +++ b/plugins/git4idea/src/git4idea/commands/GitHandler.java @@ -458,6 +458,7 @@ public abstract class GitHandler { startHandlingStreams(); } catch (Throwable t) { + LOG.error(t); cleanupEnv(); myListeners.getMulticaster().startFailed(t); } From 9de3be0607c65f4760bf8d01450dd3322e7e1ca2 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Thu, 31 Oct 2013 18:31:49 +0400 Subject: [PATCH 06/30] GradleL code cleanup --- .../integrations/maven/ImportMavenRepositoriesTask.java | 4 ++-- .../actions/AddGradleDslDependencyActionHandler.java | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/ImportMavenRepositoriesTask.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/ImportMavenRepositoriesTask.java index 25c4faa5e170..031914507419 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/ImportMavenRepositoriesTask.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/ImportMavenRepositoriesTask.java @@ -204,7 +204,7 @@ public class ImportMavenRepositoriesTask implements Runnable { if (uri.getScheme() != null && StringUtil.startsWith(uri.getScheme(), "http")) return uri; } } - catch (URISyntaxException e) { + catch (URISyntaxException ignored) { // ignore it } @@ -219,7 +219,7 @@ public class ImportMavenRepositoriesTask implements Runnable { if (uri.getScheme() != null && StringUtil.startsWith("http", uri.getScheme())) return uri; } } - catch (URISyntaxException e) { + catch (URISyntaxException ignored) { // ignore it } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/actions/AddGradleDslDependencyActionHandler.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/actions/AddGradleDslDependencyActionHandler.java index 02dae6b24ac8..09e96cc39be4 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/actions/AddGradleDslDependencyActionHandler.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/integrations/maven/codeInsight/actions/AddGradleDslDependencyActionHandler.java @@ -19,11 +19,9 @@ import com.intellij.codeInsight.CodeInsightActionHandler; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; @@ -91,12 +89,6 @@ class AddGradleDslDependencyActionHandler implements CodeInsightActionHandler { } } } - - PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); - Document document = documentManager.getDocument(file); - if (document != null) { - documentManager.commitDocument(document); - } } }.execute(); } From 35070955db2a184083d40787f9912b29966f6960 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 13:38:59 +0100 Subject: [PATCH 07/30] hide skeletons from project view (PY-8916) --- .../projectView/PyTreeStructureProvider.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java index a408f1335fa9..ae923ed2d7e8 100644 --- a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java +++ b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java @@ -17,15 +17,21 @@ package com.jetbrains.python.projectView; import com.intellij.ide.projectView.SelectableTreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode; +import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; import com.intellij.ide.projectView.impl.nodes.PsiFileNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.roots.JdkOrderEntry; +import com.intellij.openapi.roots.LibraryOrSdkOrderEntry; +import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.psi.PyDocStringOwner; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.PyFunction; +import com.jetbrains.python.sdk.PythonSdkType; import java.util.ArrayList; import java.util.Collection; @@ -37,6 +43,9 @@ import java.util.List; public class PyTreeStructureProvider implements SelectableTreeStructureProvider, DumbAware { @Override public Collection modify(AbstractTreeNode parent, Collection children, ViewSettings settings) { + if (parent instanceof NamedLibraryElementNode) { + return hideSkeletons((NamedLibraryElementNode)parent, children); + } if (settings.isShowMembers()) { List newChildren = new ArrayList(); for (AbstractTreeNode child : children) { @@ -52,6 +61,25 @@ public class PyTreeStructureProvider implements SelectableTreeStructureProvider, return children; } + protected Collection hideSkeletons(NamedLibraryElementNode parent, Collection children) { + LibraryOrSdkOrderEntry orderEntry = parent.getValue().getOrderEntry(); + if (orderEntry instanceof JdkOrderEntry) { + List newChildren = new ArrayList(); + for (AbstractTreeNode child : children) { + if (child instanceof PsiDirectoryNode) { + PsiDirectory directory = ((PsiDirectoryNode)child).getValue(); + PsiDirectory dirParent = directory.getParent(); + if (dirParent != null && dirParent.getName().equals(PythonSdkType.SKELETON_DIR_NAME)) { + continue; + } + } + newChildren.add(child); + } + return newChildren; + } + return children; + } + @Override public Object getData(Collection selected, String dataName) { return null; From 74d8bc04e4208fb6aefb9d2ea3b73ad1c0c55c72 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 15:08:48 +0100 Subject: [PATCH 08/30] add some more builtin functions to PyNames (PY-10544) --- python/psi-api/src/com/jetbrains/python/PyNames.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/python/psi-api/src/com/jetbrains/python/PyNames.java b/python/psi-api/src/com/jetbrains/python/PyNames.java index e93a12099cdb..81c05df64174 100644 --- a/python/psi-api/src/com/jetbrains/python/PyNames.java +++ b/python/psi-api/src/com/jetbrains/python/PyNames.java @@ -169,10 +169,12 @@ public class PyNames { "__all__", "__author__", "__bases__", + "__defaults__", "__dict__", "__doc__", "__docformat__", "__file__", + "__kwdefaults__", "__members__", "__metaclass__", "__mod__", @@ -304,6 +306,7 @@ public class PyNames { .put("__rdivmod__", _self_other_descr) .put("__reduce__", _only_self_descr) .put("__repr__", _only_self_descr) + .put("__reversed__", _only_self_descr) .put("__rfloordiv__", _self_other_descr) .put("__rlshift__", _self_other_descr) .put("__rmod__", _self_other_descr) @@ -338,6 +341,9 @@ public class PyNames { public static ImmutableMap PY3_BUILTIN_METHODS = ImmutableMap.builder() .putAll(BuiltinMethods) .put("__bool__", _only_self_descr) + .put("__bytes__", _only_self_descr) + .put("__format__", new BuiltinDescription("(self, format_spec)")) + .put("__round__", new BuiltinDescription("(self, n=None)")) .build(); public static ImmutableMap getBuiltinMethods(LanguageLevel level) { From 42f4d0f6f86e8152d077d3b0aea4870de7cf8642 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 31 Oct 2013 15:21:56 +0100 Subject: [PATCH 09/30] expand ~ in WORKON_HOME (PY-10336) --- .../src/com/intellij/openapi/application/PathManager.java | 4 +--- .../util/src/com/intellij/openapi/util/io/FileUtil.java | 7 +++++++ .../jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/application/PathManager.java b/platform/util/src/com/intellij/openapi/application/PathManager.java index 501fd0457aaf..2f2418b2ca35 100644 --- a/platform/util/src/com/intellij/openapi/application/PathManager.java +++ b/platform/util/src/com/intellij/openapi/application/PathManager.java @@ -416,9 +416,7 @@ public class PathManager { // helpers private static String getAbsolutePath(String path) { - if (path.startsWith("~/") || path.startsWith("~\\")) { - path = getUserHome() + path.substring(1); - } + path = FileUtil.expandUserHome(path); return new File(path).getAbsolutePath(); } diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index cd3668c73250..677587c19876 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -1213,6 +1213,13 @@ public class FileUtil extends FileUtilRt { return path; } + public static String expandUserHome(String path) { + if (path.startsWith("~/") || path.startsWith("~\\")) { + path = SystemProperties.getUserHome() + path.substring(1); + } + return path; + } + @NotNull public static File[] notNullize(@Nullable File[] files) { return notNullize(files, ArrayUtil.EMPTY_FILE_ARRAY); diff --git a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java index 26a215da6436..5bdecd7a521c 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java @@ -17,9 +17,9 @@ package com.jetbrains.python.sdk.flavors; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -67,7 +67,7 @@ public class VirtualEnvSdkFlavor extends CPythonSdkFlavor { public static VirtualFile getDefaultLocation() { final String path = System.getenv().get("WORKON_HOME"); if (!StringUtil.isEmpty(path)) { - return LocalFileSystem.getInstance().findFileByPath(path.replace('\\','/')); + return LocalFileSystem.getInstance().findFileByPath(FileUtil.expandUserHome(path).replace('\\','/')); } final VirtualFile userHome = LocalFileSystem.getInstance().findFileByPath(SystemProperties.getUserHome().replace('\\','/')); From 22f2bc20089810b1740d0c00839a1d427abc9825 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 31 Oct 2013 18:53:56 +0400 Subject: [PATCH 10/30] IDEA-115729 Removed jna-platform.jar - existing jna-utils.jar should be used (and also for pty4j) --- .idea/libraries/jna.xml | 1 - lib/jna-platform.jar | Bin 1218171 -> 0 bytes lib/required_for_dist.txt | 1 - 3 files changed, 2 deletions(-) delete mode 100644 lib/jna-platform.jar diff --git a/.idea/libraries/jna.xml b/.idea/libraries/jna.xml index 7a9e4319d055..d9fed3852d8f 100644 --- a/.idea/libraries/jna.xml +++ b/.idea/libraries/jna.xml @@ -3,7 +3,6 @@ - diff --git a/lib/jna-platform.jar b/lib/jna-platform.jar deleted file mode 100644 index 4b3d567c62096eb7eac47f41c255720f1e7a7588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218171 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 z ztb5dW&>!IDVn7_jyu)xvH`g&;4YwQ zUdC%HR#-%0^|}a%E<#W#2M>~9-}(hy4A^xzC98p7ts=Vp_>3||Js8F#L1SM|bS?{m<>>}&=JkOsKe0lw8$rC|G_$!> z*~B_9i&a%UDV}t>N7YTfZJ4T<>~3!~LgK(SOjT+Md#s*TGpm21@@Qps&q<7+RQ2|! z%kK4TIV(*$mfS|RkEET#5E);rl0Ngt9UR958N12{ValS{~FMn(A@g5@3=$~Sai7mpsf&J$+ zAoQU$Oz`XVLim(7%A54=&BegUx9H`q`uMgq+}}I!`~ zuPcve{`cYfuj>5w$1l>XxLmw=Q9nP1RjL;C0aqSZ@cU3P%;ASzIZKEt`3?04{je*) zslj7DQX)^tZ|Upb){Gz3$B*gd<0bN>Jf)XUlmPgj)?&`-hiCNitX|H$8aCz$`J^is zh=L^#x$-GjKJCh9#+yY}bIIWFVI0j{h>>9=ug!oWB3bTh+TV0wFHFgdfG-6HD&gpjh?CtCv?(fcY*;S3#wvPi8Vs@YCIGSm+nKw=pr9`*K zMzujGCkE{COjlcn2D55GEZ3uPIzp<`R?>n8V)wr8don%y@>A2+L|4ZUg!i2MT-$iP zW%$SuLd5_=2Mij<*(pDn-vj7Z`s~OkrcomXDQDwr1&7sLi`C!ghj5w>0WXQNQ+`vUAxyc7ZFOb>%r%K4;eLqC&H__sAB4hzy)I<3}0S zExm0^bMvGpEZ*726sf6Kk=+Drmm}Q+gF{P7YcL*MFnr#PEQI zAw?K(N5J4n8*gDMg6F+Qjtpi@QDjY-5Midw)G!P} zHhs2DFq#oZGvPv+)QA~cc>h4=q;1NS!Oo6eBFAO43w#>Yqj5=YoBgetJJU**M0a-3 zs8JHT(&x(OUHO6|*Dt+IvDBnzrWmb|9X|}Z`gG?SPFH~x;K>Z1QaN;xxI9?`MF&6c z(T@unnVVQY<6Y_dh30k`s;-ld@or5L@7DW-j;)<+9MafScjr|&%3$O+W0XXBjTMI|Xc}yl=Lmkx^#~hW;tW5p;`> zZ^B?Y`P*_TiE^4VKL~Q8DMvI{ag_R(4xiZ4VGx)s{Ax=wR*j37L|K0QzduuRCkv~jVwBr={|alc4@mc zg$*RFshT0Rf}$ukZRr2on$3quTxM{KA1sJO#oJr<5zVe``vL7~1Quo4P~&#)GZSbc z$M&Z!!rQi~2ZWecSWu;*e=aR5k{{%0?AS=7a6Y59f{wV|gWFH^Yy3{%3D_O#Gk)Xj zz94`=lt*9YV}j^A=EDYwLSC{8WS zvr_iNSy@f$@-tFTJrzZdN{uE%Of@}7R+%^>sfx<8lB}3PmYGk~#^b>^=Q){mPO7x( z;MIua^e~Rn2L~?0cDKOl*?>e<=-ifL)UXCE=k*vVY(q%C8@*Z^#!$x)bPdRzXgCj} zZ@WuAiuO`RZa;E^-H5t&;`UlZ&ZB5NcN^yMYZ|VD6pS6JCJoG#lrIrWXdly*mgh`p zCe`$PobnGa6CXv8d5|ehQoEoPE&i1{xgH{b$7Vc^_c^Y#$1Wm-D{|#lS8lVP^sU5Q zndLYasbS=|g!$(DLJ}7R7qh&)v&P7aBaY3>dH_+{^$>ppY%t0?=g0+_jVy7_hQyOH zcSExFGjn^^6~$GBI`=WTctPg16M5ztS+D^uYGu)}b;YrD>G-;m%96^W$K->RB}MnF z^J*)LD@*QNy>3e7l!xW&%JjSCl~t(=Qr(VD)vfd@(_M*YWZ`*Pgie+0XXR++lybTF zsFYTw-y^qHdit&{zHVye)UwoL(oB}A53DP#obseBuAI6Yb*)KQS6QkFYqWv|kqY>j zTfu`>0hddYP)1((|$`iBdNif8y-LuP0P&lrU@cF(b}C z#a!Hj;O8`I&3ob2UxYyR#cR&^OhtLSW zp1U{8ThSyx%=JU)g+GGM`AJ.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%0AGyKH3eUB9lERS|lTGpy zf7n`e`=rHUBtJWU>i=}4flDeCxcZl-XDk9xFH>oE&W2}7w!|e=Q7w3# zS|dOt>6m@bK4Yi?T#n^uQ7@A{Uef@3h?p+F^NT#D8~0! zE-Q*z#zjsP^EE52@#&=%mW+wXb)7C0%c%<2i2OtTGVqWM_+2>1JL%b?aA(pcNC?w{ zu-3WXZHDV>fGyn&RVX*S%?NRdIJoosu72%F0GP@)I;a$gl~Xa?A%Tkmsr$gIC22^^ zN`N>5tuJv&iBj;1h>>q1R&uSN7#vp(pjd-vtvocGFt=6<$k?HilPJeWdxp;|c~A1v z@DP@nqp*ISl(`nbZTjgP_OTxhKf^FNQ{fE=o2mk7SW%V*X*<%2jh!&JW2rN#rFX-q ztnVLa<^)>}0F=C7OFB^EGa<84+iE2~if`Sxu#&8{dUmX3}K@ z%>pkDx_t{s<||w4foaM$5kvaB!MnNFlb+qy+%Sc(aMw)QiPmxtOen9c|G?Y42NuQy z7Nnbrc@yz~kxOkyPNgK;+u?vE;@yrEya>`A`2DVL{t8e|ML`cLU2YS&gzZ)!c;wI9 z#z{j>FrMYa<4G|b0NyPYu++v56aZ5Lm{&jaC^;aB5cK)&d7#Fa(0+O zRxZb5b78;PfryzP;@GsaL&GFo@J4{fE`O{$8_)KSc9X^Na=(Z++4na-O7_a!nQ3}h z|KNF2SdtZ!xX=EvO{R%`S?&T}Q5~j62zAj-?#wJfVw4Ipm9;U+U9QKOeM8-YL!;fI z6MN1R6V6M=Sx!-q>>U~y8pfx`2H#C~ct_#6(fli=W9%Ip9uZND{d&B^{$_WCfKGRv z?%w4k%OKYTCT~+xmx?nlS!@xrJ!A~!?y44eZ;|Y!Oi;B0Y0?sQCJgB`!qTIaeV6e# z^AIBle;yf;Ko8}td73&e^*#!12Ffd9fYZ~atQUX}3>c3AkI7^%iBjTVVzMV&a}A~oF8H`X;R8kj31(MFL>%rK&32qtA`QR zuQ7GH%O6jPRYlwlkPjXTH2glicd8a*Ac86jFY=FydJw?W{TQBkq9G1@r*2CsX$mRPJ>gJ%qa3JDH zE`vh8Cj#WvuvIv@p{0T*5Q7(}}KAw0A#&svc5}QVB{Pk{=EaaAa{kegj^N<-6P&n3(-rJ2O z8ovh8o#rxj>$h(p)gVV=Kb5zB=l)<%cJ~kV^1Y%r|c?$BeO425{ zT-Dc1i<6{jcn*MmHZZha3E%lk)H)O>g@SC+1om11q>`k~;TJlCLQjNKPrhpFEHdDz zhzAW>Iw!Lu#iRgv4Um435)t^-z~dzGwLmP{d8F%P`;m@)SW}A#4W#`}&Rx_&QIxU8yupMvjy9Y4c;g|j@_VK>{)K$hjRUcMX>5mh?H_i4Y) zu^k{Gxu<_*tY@He@6mJamz4&_{ojZHll~PEb3E)3?$R(&=6ASLa;mf)2>Z2{;chgBpXq z9O^$i+%pW@U1O_{5K)ycS_<>sD+6~zdUhWUsZa1NOQDYceKF9V@IruJ@b7+Z;>LlY zp1$1N-BKnMZXjlU$3V}>NI`B~FR*@G*)Qc3AlhuMJ{aWG^q9C|7**Qo&|hk8qA*&U zD2#Tl1Uj@w$`h=-}j+ennRNl~Lc*tca~fcYuSq^#)2M zP1-sHId32WI3=WZtH0bcFop;|n3~#UXM%uCW(SE*hoC-TR_9chMH+?*{R88orFx)c zZL}Yp9U z+txzt4cZ7yHajeA$LGIHwfnsS%lS1GFO%_idyQ$78v+-mVstvic-(u1^>bpU(rgb^ z7@fA!u?0%;!-0oXX)*tmuAlhRzXph?h_nbRXrV@@@Dlrip%q_JfX zjng;3eS*Wq%Z^zl!rfeuE~YHSkx%z~%``aLBj5dsK=)OKlJ@d-rk>75E*8(JlGG zj1O*VEwZ>FgiFwz5-EgbTf|35`rrtZ`CcnNLg&Sqs9o%}ZC<;?`}euR7aFl)`5}6et46dm8CpjeCx6z8AuqU%UM~v9({@ji}lG-Ahm3; zKOAsNyS_2C92&#KaR=GUPj~KRv4s&bofe4Jz%(&=+WUavCYAn`)j}{Ndu1gpJJT-O z^c|s+P=6#-24DWd2!V1=g-BSVkUgMJc0&N%L=H4Q!1FB;eWL?+ezC-|0I)VIOi`q! zrNk}Ovl8)Rd^-Ppzy+Ze0+ zY&BGD*#?9xoh@NmCsb@qAOQlQgg^o$1PCpVkN^n;Fouu>(i8GaFXWe=kdR7xLMr^f z@6GJ)?A=LwvJA=Z^EYVUeP?H9r@VbL^XAQ))ugcvngLw;*?+$LIUHI|f20ZyX;#_% zqnd|zkUe0NEzV@CaDU_#6LQxKte&tBdRa^?kBJkZu#V9#o0DSV!xHp8cZL7eqeHYI=AOw z-9D&9_Y2CgiwIe}bNMRNfZc8U*Q7h4 zIktfK9BUjb$H(*3xcFE_=X*A2u9JEhZ<)HkT+tI1B{OyEepV?;hGm3Lh7CH=H43j) z@z<$%rz^T%(KA%M4WbgyQTGL&!L-3URxNDmwwGn zIatWS;3nORA^JBQ9*(V|*my=3atp9_W{X7-zq*ASJ($rgg<8nbQxGo2?bTZn)g5gO z^^H}DnnX2*UDQiXg0Th!bN}!bS{#LDmN=?V#&u&-s6nPyloZ?8ZAlJF3%kYoPSo?l zdI;B0A~-_NH1`R+PljJ{&P@w;&SP3LJ`)XovbrDrQlU&F*)N?Y^Gap3T^R_4nwDfQ zPKKGBOmA(1%tMOR3;VEPA|a<_6^B)8X;xzsH9KL4m|^xN)cm$^T}J*#>`mOZ`R}me zurMKzRve|;js_Fc_fqH?X}m8rvc)1Ap@m^gBS3xY4tRM4o=F>(K-sDTYp}H8i6$EY zQfUn93|jn=^7&*$n+Ig_=v}HSOw3WpI->-XtT9SKGaNYf+Ef8AtN0Wz;F+Geg z(o_`~jzexOjMFkd$t`kU1P%$vtw=kb%Me>(wiNUb4T)NMItP*!DeQ-YZN?ZPE1x4) z_Vo@ZX%*)H{>CW8M4mVV_GJ(r{IjheR>BYhD&{bR8a_++r7a^nhX*^mhUsYwi>)fw zKDg(gAZpNd4y#P<-H8(g>Y;Mwr5)Gg*cK;xQvmj%>giN2JgiSX(;h|+*w&_7lx9X$ zTA2h{w@qABU>9VFAqKS`93wbn1pnV{ndWLU{yPK;eW$qzlv0QjU%-^$xhWbZ0W?*^ z#lX`vO!22{7$-|W4EgDm3KRT23z`lx7xVp5k13Eyzbgfj1yMk1T@w-QaL253ikngsee4lEcwO$9UUvsJE3II2U~|wyfY8 z3SqlS{xyy7Q##XCI{M7Vl)HQUWae=)uHsH6BYi;A-a)eSBJ-(YF!N;ewHAJ%uMM(t z-mjgCw;-eRcLpBNYcNw#t6G{5N8iNKRlS4gk+SmiN^){ehK=s24U=P{BqpTOEi4yc zyAJ%1VG>~r4ALzu3WCF1P@DKgT^0C+mjI!hVJgESv=WFuf{2RM**DPBiC9c!nD;S+ zm^hDqt`3hkNBtJaMQD2Q4H0I;Jx1M4RJj5}+^otKITkj=X@}jaqv=?9z>w=F^_nO= zvYl{1281-Qm9#|BDT+>2bef{mnbK!WhRw9Fm{svWtBdk0o=ziU?v}9o4!s6-M-kN> z(Zdry;lO{@Z0%L6)T?L=O`=B{GSHVk2b%Pw+2(mpW~cScW6f_m1kpu*r{lqK@q{n^ z)A}x)A0FrLm`}yR7Y?6#WVjHAe!?4Wn`BUc(dH;$6f@JrI~dJ*m8UrGW(mb!Nneex zR#Qf=f>`oZfng(PHzvOPiAyUQ>Pv~_HxoYk96RZZM<*(cMl-)W$$^INWJ8>Cn4CAd zEP|88TxHQ=j4CD~J#*F_za}zL9&<)pJPIHcNjB2qWJISbIt`MKuyoQ#vQQd$lO>iu z6j2+E%MdJO;e3{U?ocGt+H*4`qk-6SV`J%Haq^T@jQR;L))Jlz;VNYwElbjnorY1Q z7^QPUCPDI%TB8`lcA7nq8N@7vlk+{=2ZFW3;MnJdymNneA*3Pwk<-AO_%coYVcpNh ziGOigYb6!K3D}?kmBSda4r0D39?GwibT||ov^sxTp#qk>Yt4m*}|Y9DuO z>We}Yf8t67*u>^0V$jh!WS_@J)dWUmWAAu7e5v>vi?onxP>mY88s;v-jXmFbtv0-o zs#H2ICCx<%L>0+Jay>wr2_Iw12F=3^jKE0q;LFA_H4kNoET!Z$BuS%0Qi#StS0bF$ zqBcYqNe|j2RsiaNP6DM}FEeqUJSEQp&Dj02^7(T=_03C#puc00;FzCCP;^C}ibamL zBge!eWs$jfd1Rg)IW{ixBJ&9x=PDOWLdUzvB6Na_B7_#WD38!W7okLEWRZ((LW^A# zBecXt`Gl6bC{AdZiwX!WcacNrL>EmWw8BM&gjTw!h|nq*6%#tiMUx4wc2NnTlU+20 z&?zpOO6XJ4D=-}QC3L!rW)WKNqN50%;iB1uHn?aGp>h`; zO{l^}#}KM?Q5m5s7ja`&yJ#NWt8vk>glb*HExpl2$I-oni>Nn?Y;qAT`$aap2&a{q zkvbRQ*fKLx@1jM78eBwb_ei6QmJn)k(NaQZx@Z}pW*03d)Z(HO3AMUt1)(+0 zLY*#JPiUu$&LGs~q78()T~tme>7oikyIfRBXt#^12=&mV*N&WLNA}nexM-Z*4qp>H zQ`j7i<;P+8Y1oyf&9fsoO>&ACOYMh8JUfE*hLZMr>@?lgn;b+kFpS}F7(!2KuO1vs z4Q}l0@9u+N-pBw_r8M0Abav!?+VjPcc!|=Ez(wSw_WI6&0W6NFAlTCsw!5<*6^1p9 zbRXb$WCZHG?9OrR$UgFZ;rRgfkF2mG`zd*M3$98Y23OPDD|-jKMxdxfb(}u}r!49o zjIfIQdn)ike!$%f7kuD#RCAfsH|`=K%O>LIu~=|ZaOOP^_0WF@lbZ;4Ycx# zdJ4Yk5@@w3R6TfUa7UdTxs0+>g|ZB$4#=ez74wbMh?Rp$lr|84IlTt`uD)-{j$A<* z3LJ@UN8UsgjKU1`^mYwZUoemwN~*N4q*f1vTt&~so8Fr#xGo8&qJgYlOTpFsSn~=5zlGjaIhYz6@;T}{Ds9H8x_0Dx%Bkj@ z!j8O^Dhz9IaQ;%C92)BMGVwMluJp?RuO>-&?otcxksIg{d8cU*&v-X(q|`N69(Lp= zYA)Byiye78!Sa5W7v6!1zFZx)BRA8n+DbNQ7_uYpBx?ch07*M?3q|Du*^yhR(dAHy z_KVn&+a&8}xE!@3@1iP`wdLD2+L7BSbjP-OdY^>_LFCqj_MlBkzXFR{DI1+(SQkIX-f)KNGSe?;-aQwDuNxFO@N|7foPC z?t|Zf+Dbd}K7>gdDLe9h{FcSGBljZ-cY+al05{~Km>qc#C6)yaWaI;gB7^P72T`=D z!Os13aJn6N2zSszEeH16k%#eH`hBn?A40xrQvJx+BbpY+jy#GFm^N)|$*axxcH}W> z&}~N!;t|zCRru*!#2hpBgay-*Nc-jvsKv4yy5I)gKaD0}r^(;t^t)XC-cG+^XhLy1 z>3666eIfmZ1dAiQrKfk-a7P_NUiq;e(#)c}LkWHv;rU=#Gd=WE;=autm7N1aID&o; z1^rA$XXBrGOeF$0i4h;P%%iTyieukmp2M}46ecw zRc@F82`1x7MsdTjd|o8Ot7yNG8yxY1nPuJJ82CoUZkCG;?u}x6?eaz~Z9k%5_f{Fc z3VEwStv$GRHlVkVcie7`zBc#nCHP*|bJ(cVlpJiXtx)&S@M4m@SKim>2EIZKRo>Cm zoTx8vhJ|aGC4xHj*}*d{)s>A6Rs2*Gu)MjFK0f?tZLDW$)KQUWtuJq)RxR(SEN`w# zG?dpV)L7Tp%=aL*Ix5?mTN=S7h5Wm*rn(s%84OsF9+# z3}^_00nqMIeyf_xx0YAbRm(EfG&Z!#no2aZR@YV|vy}0sL^~HEM!y?zi`cciqq({g zj@)YL;VBGT8rzyHt2^q;8_N0FVhXLT=%}P>Krrg4NCj0?x3s2()V0y0h*P5CR8`lM zx7DRZt8FgdCZoBj*EUyIH^?9=BE7J=x=IF6?ps=$6AiVpxLXn}ZRK^e@Jn~LCK{?5 zx02|_?|Njj9$Cjdsu5jO2)-}yS!b8)eTiHq*t`G zHB~paR5mA?T03B)o*slRf~u~it-_BJ3_y%&h|$(iRoz^N@`Ddr60M2G1{&4r;jJ4J zm75!?TTpSt6jb?}s~g)|JIY%sQGc>J{m`mv6-?EcXhqvpb|{{rR%q|oSe>Zdh{veR zXSS7Bq0y>ZH>&p2?lE6-J<7Pv)h&&6Z8C>cKb4J5+nQxk)btIFtqH11xC+K38W zQ(m8_+ol5eep_9gf|QHO@+L1=ic>1<%H0B^F<61$W>{vEL$MF4BQfX z;juk@fT*xb5JnxCnls3;ySxW=KE50{(;4X+#sdwh;oe;bcT!zx~xPkAu9kYJt61p>`kIAC8=iQ49wkWpL6)p_7n~JG~=ZD92E$LH)FfkiMKW zy1AL8CYOGk$;dGKY4L+f@X2D5>IY0gg&{!AW$BGmkuP_~>&Kghmc$5DdYtitrz3k_ zu$IUS)U%pi`;lSxFv;aIp4QXrN-1G?y6?xGMG3pXTEa(>Y*Xi&`LSVxRT$JTP||ad zh8L=(0n4c(FWgTAzT_b#9;%f@G0QcIbu0pS)J-gp zCZ)l*{8^yJ@#+S&H!J*~EB&9V{GTWJKUd42uw=zt0omXMBCvu?--Xmt&@*6^>V|;7 z={-8cyL5>6=@9SKA>Qjk^);znE2J{6kjlG4D*Fnl5)`20a5Y!>lH@mu5vuxyp{e?X zF{%1>lJ^UvP)AmN16k;yPl-!NvcbF8*1wx!iM+S9r?)Rj5q8pontFgFKAK&|DDUrr zekL`D7M1~9dIyK$`@xHVSu_m&C_<5pfX=oL*1DYtnVuHnJ*(1E9Su4K88Ohq7R#_I z%*lHDWDl;1@wWcd&Y>;{ZRGnXU%I0wr=8b*2O7P*GyJJk zpdtlVw0lv!n$EqweFxy0I62r)Ce4lvsH(1HSRf$;a%u==55~p}V1^87Ne;rGnNt}U zOb%0ai@k3(xt}#Cc$phi1?3HG8K2^QbTFazclk|rLlb_OL(K=SNwypyhwvm}7?uw) zE+E`8(uGz;HVe!9pj7KV;5B&>{Yv!1abIt@9F%Yfs(wpvl64MX3yOnb(uL#_!{Kzj zhAW`AdI*vX7Iz1H%#qReur3!5Q*0lSNJVr%AfMx-1$rPJD6ahJG$+X@yfr1cV2TR^ z?1IE(BzG`pd!>$7bapFIhjal{t>@#XJJh4!uBoz(-_p|^g}SaaDU?(!GKu=m;V$H| z0D-P{2I7q#R8>vy!Qd~2Hld%~a!@MaXKkf?E>Tt4lY(nt`h+{X8#?#m7o|{_?B7i_ zFd4rSdk6ZGdoeJCqhd0ppHkC12-UCaftyv;7^l>ArU#P1#YDV-N3iIB**QVJME!jj zr8<>cD{yj>Tjl}}(iusGKzu5bdwY@=KoRKa-eE9?JeCO%73o2GT%O9*A`fLM@&fRc z^(ToF{SdiLwxn`vBN}k9w;Kv>IbuTgE4Q{lvD!wqij1^DGSaLQ+8p+q)A|Y`4t9FbYGT7-GU^ z00)VBC54b0gx7G0NG}Ld7(pJCF{;r(UQj_G{-jDYFAw2lT^0o57Pq8E(qF(qUTQK% z;Gs!0ChqO>qBuO_@nAka@3x`jt`X`aw)T*kXkdUOQ?$Hqf9C{#B!N`HV#0Y53iqSoaWBnp=4cZKNhV5o=K9Sj^CO z=7nH#H2?!xC3q=LIck6c?ArD&=+D7zdA03WC_<`CS-K1%jVK~u+DMX??n8E>;9PmN z?foh0N$}tW)E`D_+lc`76Gh5cxar-8vedTs@?$6f#qrWElxh2E;@v599{MXdPe^l! z`lS3i^t3H02yf(vemC|v?%Gw=IRx=hNVqCB0==;eh(imCmM2+3-$Ca94KV0K!BCg> z{~!tcM5UbvlW6As{7tFe{(96jvd_O&JpNq)d5cEPuj%dUQ(55Otr${JwQ=}x?*IfC zUBhm{-MvT;ov8`|H|*<8jUYk05(fhG zB`-j+(ARXOQ1kd5#n6#|#L5S|AhXG5bpd`h^(I^TSb)cCD{DsjQEMcl3u-G_%E@7= zgIhS5j-04SZmJ~F=t9J$W>RuTp_btTR3Atb?V$i}QDgW>R<9e8kgT_8Z6&n;N>E#= zY8qvgfrQ(=^7~=i+%P;WySO4eJhF2?8YH!!Dh)kPZ6ySVznq4l7b?ns zkjjAjUR4k$fQ#7kd9@DXck!f48RS1}ci; z$eA&CqJ0}4+}nu{5kKAj%iiw(%I8j5jwE9In`Kj8RSMk>IG`%Unsc;zRf-hlXiwRX zw9rO5WRz-G{dQCZD>%7)WEiOoVA+xxZ5QNLaatJoV_Gn%D!Hq3q>qYG2VFifC_R_& z0^-!o6&NF-9?@MV2fJ8uPTE`n3EAi20)=~dSW+la)ySY4H{@-uK!Qk?sjOy%Az5T` zb44&mkR8+`;8XO5Pz5TWVq}O!pF%Ylne)e`Fw*5^cQl&{@yB*v={{k1B%s4 zv^d3D@|d5Ku$`<0mE&8dZYsVpHH3Y}vh!o$_IyrtKjqRL4o*@TbaCA4qEVmu__7YP zbak>6lsD9Pv7l)vIntd{D8F@ZBRKvzXb7&a_kKFF0c^O=!hs+q+ zxmlZ8=pC6siICK_QUqd-U1eJ^h;FaJdNwrc!D714QLVx-h7E>VdT9vf^5#Xs2cU0A zJBi5^aDn_}MpK-Fo#6B@thGEoo2D`)ha|MtRMj~QJBMqJY_}s)i4Grq?dW4OYm;Ay{2!3rYw2wr1Tl@u{JR4qouPUI8GU% z(MYVl2~#;9PB_wmyIV36?3%F|^=XxTunhD15(gNQKR13{!gBDHA=-{?lSw{8-5?Ll zx9$M-Nck>s)l%fWAdFu4hemBBJ{E_LzV;_v^+%`_NSpgyo11{@r|!t5EI&f3D3%U}*ms1|&R+MKbxft> z;uW-exxlA?`)i+#9RV)M%&9b7RJny+D9x;)5P`)f4bLxl?K8|B4nCctU|vvrcfIzR z39UV^t|T`X^2eenK)R1mp21LohSWZHVs?J7u4##J?Lo(2h$Ajx0~yKWDCT{)6&=n; zQ>yR4Zc-NAafGU49N%GR6S9clZUYq=Z%4m6c%YSsUw=J9xmDw%kb0A`G}F~!i)U7J z*aL8crUpl&Cz|Ojjo4|DtOfP7VdOkl%c+PHEmy{%HiwFUj$}NQ5G+S#B~A4HLKp(W zU?0;O);aq2--fvKHD$UC19U#BbVj?>FJ|WMU9V#9G?^Bx-;4$)DVv@*&bUK$TANJm zO%CH!LZk8sm(Q z9hT+s-Ou2y%r>Ntl}5pulf|A_vFO@oAjh#SnBVc7&k)xi+4lzPQhRZ*4m0XVxuBHU zYk+=KW$#GMpaSVPC6jwp`i>G;3SM_)Ya>wT!>WwQkekV_J(7j~D>DgJChf$KTcd}^ z$cI%q*tbWO^B;IQ3SBH;PPWVLx0JI#*5Fr?ISzBV6|cd*MJgk|Ccp*zk1VT>BTEH5 z%#bI87~%-$V`1Q%$x=1yLzvIjk1Q zWVzgO&AYGy^*mZzYT;?;uxE6OnTcj*kK#;dCgSI3%w%$mmSuuSy*kNi+Vtx+k9hb$ z+&tN9GJQCxiX)XVMbLkfeW_oF;n%(pRGS6ZhD&y}(#rDOoHLQJDz!aK-ZBT$Xcgj( zeoJZFk@FkJbVo9uQ(u_54#s+JSc%D%gLfaHx8*wN$~9h^UP?+$-qLJ{w;iE8yTUMS zmg2Ex4vQ0Vmo=nhetXl%u*%u~L_7b74(x4B$u(^pdlB|RJb?XccvHq_Ny*7%T2nGv zPA(%}*w?GxK=t9~4ix9eLlb|brdH}53oF!HD0M&AIgg29;}XIkUSVS7m|`d3I2IMt zzMo9?Q@y<6y*L&=ce^jiSy`FuONc{hU{4()iow?X%HYcotzm5AuDB->J94WrUN@RT z5CcyOyd z_==1nTc+D6gBVh?<Gx;C$!jAvkD=VGB!6e3mYsqs!;%@+@7x zK$ria%NObLCAxf>E?=R`SLyOKx_q53-=NDk>GCbQJV%#r)8&8Z@*TQ-moDF<%lGN> z1G@Z>EXUIeD1U<*BrEdz)u?D=ya(#`v*F9JRVLThy z-mYF1*76u2dv53q5!RIW8ssK?m3mn9Vvh#90#VVIg|r6PFj(Rf!XHpchkXsa%TC1& ztH*%tqIxFGbFQ4z2NdsNrNxY0cdr-DtgdSYm8Gx`0!{1hB9cz@!bOa95ux4?*1WFI z2^Bqz*ObQ!6+293b8I>F$?*xz=}L}IU~C$28yMaO0gr;=U4l}-)MKlqyZ93(aw@A_ z9mA>CAr<2KSH$7xAu&ChyHKCi(zwwOVRFe|Pzi6iET$)ia};h^A+_xiVPCYqx;2jT z+QWothD%99oEp+Hqk5Y(MA%`Ft-OgjEEf5w%+;}b=;T2jBpAlNN}X9YcG1azIV2@_ zA6Q5<$%~t?KnS+QWdSX%qfim!Uyu85(C{U|mumPj;5Taca^Nd8{3hTlHGCED z)f&DA_{|!=7Wge1z7F_$4ZjumZ5qA-_(l!i1pIalzXSMY4Zjok77gDDe4B>f1$?`P z?*P72!*>DSt>JeAL)XFW26YEhXgrug>A@6w52jFkFopJmDHI?~p#xzGH3(B^LYP7s z!W8-trcjA6g;sYY1_=foUR~jb1{lmoICWzROp93=fK>rlDaI*wQdg3^nsK90j&Dj5FBG zd=1Be3pDHiPttH9aFK?KfhTJiXR?}8G>nr`%xM~)4m?A{Gl5GrJPY_J4bKLiqv4~0 zkMXgA`ZvpbY|aIq=VJryVIJ#ab3X8K8a^KQ1Pw0$Ug%>3?Po6XvAGy{iH4T~FVpaH z;1e~x0(hl{R{@`-;nlz=Yxor4Q+;fJU(C~dY_0)btKoIPr)zjU@EIE309>x&3gAi& zR{>XRxCXdZ!yADU8r}rFS;KX}^%`yfZq#rS@R=HJ25!-CD{z~Jw*YVTv4QWyZ1=Ib z4S2hTcL1NI;j@9y@v(vL)$GtP@yodyCjRKuFtzti4O9JhX_)fUtzmqxW>UlWUd>$^ zhI}%2YnbxWqhZQVuaB93&+{?!?;amB|7znVllXV9cAxmS-^T{zg_-g(%L{FsWszaaTt|n#J|tqqc$$%^6b~{Q+;dWG%n8p?LO6)K5nD*U#H!t z`qIX6oc_hyeTx5j4O4n=&@kPeg4b%ObHB9&4sbR|REk5S@ztzWF|F>zF(tDSNDZSe@OzGX> zV@~f*A9H$l`Iy`DZVgj=zFWi8p7;2e>+4<()BE3}VS4|2HB9-vPs0@deHy0t@Aon1 z_kJI9ejo5L=l4MkQ+_|7Vao3Zea!vWLq6vI>tPL3|MejaQ~&jdhN=I0RKwJNJ*Hvm zzYc1c`me`*%>CCPA9MfpgpUo9mrwfG{4nrSK4$s-5e-v)eN@9#pC8jO-G5rcByXP4 zFv<6iYnbHwCp1j*{gWCd`Ti*lQ+_|KVUn+(@iEKS&uW*q8~^7Zo?Ci(iThGW2A z&@he1{>R5$A79ikmG?^;rt*GS!&Kg{Xqd|TRSi>lzoua-@7Fa<{QC_JQ+{x3C5>HSK>6#v&6rue_nFvWk- z$6VjP^)c7??=(#5{a(YA-XAnf_y4G2y8kB))BFCcVT%734O9HTYMA1`+U z#V^({#h>hBeqV`?`F&F~OwUi%Fr`0D!*qYThUxwc4b%OZ8m9M``k3E8%g6lwqclv< z&(<)dKS#rK|7ZrbkTBu?4AJ!rtQ~zNt)-d`HYl()@e^^U3jQ+z~reX9S)^ZJ_|FBNfFvjoJ z3Jn(muheic@G1?L0H37cslcl>JRSIC4bKEVMZ>dzPt|Z0@M%8g_Fki5YM-?}rtyHa z&c_`8bPZGd^%|!3J43_N{u?w*@ypY2g@)<*N)1!{S815itJW~3SEFHizE;B&f1`#e zenP_(f0KqO{$>qR{JJz;uVH$=LBo{aMhz3cHffmn^-K*Dzcy=___amD#ILOyru?;O znDVzp!<3(`8m9Q|8m9Q$G)(cgYnbBi&@jb6OT!fZYzdK1$tt*e+`ZC%6k&DOO{-(p?I^m^;9Oy8#H4T|2V@^O>(cE0}(^}d@`_&Zg+ zTNJ%jh2N&|yR6&!xjU>oncijH⋙YJxuSl-oy00)_qLhXT6{4{ni6aAGAKe^n=zz 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
JX$tHLXPXKW_U(yJ=t#+eD9(3yYz0|w z?R!7EXJfcv6WfBDjBNMYK_6Ta1h>W5a;o23rfL z7tiz!rhH~39p0g9b--<$DX3#f;joPm&R?;);`QPUaH>LzSh#t?#E9=Z(DF$I_D?vh zQh_1Km+@!u&uH7ejdzNFK`TX_*#a;NPF?&<7{*x<`5^X?YJ+WTg?OGk_bzp=F%y1g z3>FzXC!z-)60zM6i1^ZmWel<^T5x!xZ;D1HY~;HPVyVw>b0?@XT;=Bin)9V_VBKa zM{DA56XhJ^nm9+dCU##_!tYEoT4UO0n({p)IK)+mySNg)xl&vuw`z#DN>9R9qo03| zy<6b?_gXyl>o7cT!1=eL0M{E)qT@|smw2<-C*F!HZxy{bb{xmXaO@>G#^K+D`O^jn z9R4_<*e~L^bVVOPFTbKs_?_kVYVi<--zanJ!kg##{LrVT#UeT#X-5% z$Nnyi{oNRedoXJ6#Mr+JWB(qMI=c^J_&$_Fc|WH42k_4B$CdYqBRDpSV>ja1%{XR{ z{Z4J{n=K?5)yDo+*|C2~cI;1SW52;Y_A6Z&QF!#viig$c!=IGoMd8O3FV*=lUKAD~ z)TvQM$s)AfSn7RI7M^qxPhv|W%a$7ti<+cZ8;jP&-Y&}dwjK~u-)Uh(jC1^)s6D{r z4~c0_@j8;F>NBG5F>w+8Hzm%A=|H?0O=ex9DOs2N$l6qNZMr61le$~%s!P_S8=K0` ziJ3TMR#T>~>_IX6lcK6l?VS;GPK&ubI4^r}o;*0e&aBIv5%pKxoHpL|^n-O~^bs-h zj9BoPSlE=b`go5Ai&N2>l#QF{D`;f$gH84Wc~7p0)>POhSICpgiOAE$SHx2oVHppD zZA{Y2VN4$(K87LvI9~fFaMr&g^y)tl0{kgd&-n}{(Px3UpBL9+A>?N9MWFeYfWBYG zRQW2V+t+|S-w==Dw@-*~0sgnecg1(aFYx^v@jdZZ@!z=Pw~e&;jxkMq*O(=~XDr4s zPQKgl3SW!(iF4xrfEnG4s(_CGP8lfn72+}RQS@g7H2vQ|7EI8laduc#cqylcV zxHpML3_W~5`u-@$N3XaO{rD(I%C#UfpTv`xxUaebK|{t;i?%0?`I4f8kQmePtRy7U zjLCT72f+hAjoy(xDj1&uB`4kgCy{y@gA&iu5E2^@kf-qsWv+v!_^kBT{~W#zobset zDi3{r%F}ShMnHr`ga{yet`JX%OOSVxq${SMVo|Rp0{K&&3(+Caz;_659}Tt>6V zi%36{r+#T7h_tv6A}z5Hslh>{rH_ea_&yz>#(pR#G^wn`A(pR#G^wnn_ zk-la!bpQ})Sr(CS$RClcb1g(#IZ;IVI_Oz0BCYZul5r6b3G1`!)X4A9B1ftX$dPT^4E9Nu*it;y#~}+-I%iK27Ht zX&yxh8G+9)gBC9U6 zHrII_WQ}i${{)SH1%yI!tTKqDTfud{2V|j!pt#N{RF73$=NnnB(}1%S*SQ=T*MH&K zI5de@gQtBD$Z{RTTE%r@8rP}Ka-GU7*D-Cb1A^e@Its@3Ev|EiNIs2jgyK3sK!Hw) zESF@F1&4m<$8@YyEnI1uD6ae{%XH=d5%`ykpA{RA_1vMf5M~eQu`X}n@XaumTFl#C-WZP|veb%-qMg^!L8eJAyUKe{< zAY5l{ye59Tt^}PEn-5S0eMoF+O4KF5WFYo6KPI-~f0Jp8eaSkrDOH#H$l7#tZCOoO zP5N%Jwk}mu*4PBSR*8M(b(sf63vo>CS==gFhx*8n@X8?JeX1@QeMGcM99!9x;%y;? zDxr-HsRrW~HECODOG}|G^}(i!JSSI1Ybx!NE9J=*lw@V0?)1yFM{&<3gcQZr|ZNW#xXFbYs9_AadF0Y zfq2XqM$GGo_^L4qIqszRK92ng$Np-Jz{gP9Gho&M;27zK32ak1mV|Vvt{~y9 zu;vN(sJ}yN2TN62dlh8RUrEWXPW(aqU+l%QGM<9=Yv4U)ynBWDGz8Ivl(ZaS3saR+ zUdDUa6ptehpG3K>S(L+}&lBZRdC%54ltOIhR#|Be5sWyh{ebStKU?7YjXyTEd9mpx zUu=TAjD=0KZxEYcAy6iqJlJF*(>6$fxyZELLZ%%KGPOS@cH)0XWNHP&+SMdcs3VI^ z9TJ&#*F9UvbQ)w`;PV5y)sg8nm|p(?WV!{&^g6NB_(!qIxD`z6O^B^~v$)cDi|94p zDqd*Z21)OBaf@+>xE=0vcj4H(jDLaH|8_8~yTs>=yCLbl15E24@!vT1OC0-)aW^8S z-T|g{PZpVOmdNy5OsW@3Wcodjsb3<~AAn5PW|8Sw7MVVmMW&@$WZEu~>GwdUD?)~=ko`>fXf)8Yzs{7UDPE9EH%)bXpF<5$V!S6i1p=d^gPI^}uJDbJIq z9JEe({%O&xPC4Y9a!8)iM@tC$c19eQT*lM=Wh55LrgRlUeBo=BgsWMt@hvd}j%Ews zVz%7)uDI0ro@g`vTkL^n*;Q~XyT06hr;t&FQvg!!acV2Y<< z#zWk#m{&V*-b|6g_)}n@d0RIV^|Sk$88z~Jc`C~yp<+{Fb$a>S(}Wm zP1U4ol6Q+Y)tNP^#-{W+F^HLQtf{On{h$~kNmG0BwH)Wc6WN0&J7NNF*d8*NJ3gP*g>ZiCK~3 zVt(X=SQZ%(>m#FLcVtXl6*(zJBd5gQMXndGh}V$j!;zcB zCnGNtUyQt5d^2*h_;KWw;_=9<#Gi28Q<1+nGLe5U>LRxovm&oG8nC|}`}QWaqMJ8davaR?@m_ZCZyz#-u5;W<3qVfihIPPbHySY>F2-vby};5*TKPatA!# zhy1fd1-L>ohaj=15gn)CooqNO{_d=Ju}4^lyipStlExGzdefCsU2psl1H_ey@7kyo z*@OwRw4tgNs}e5(GR?e0yzQL0$wHx*HpR|~mjMr64n;QhptzZnR_)0t{|eQ3Bt>oTI8QlDdL~SlE|H+G4d~>De^Y4J#v@0 zJaV@<5P63<61hhVMcyf17`a!xJo0YwhRAy{gjjYN&lVf#fK{}Q%`um?EC&m#%2nUwKM@bk-e@xd)vD@dvHXHv)bKz0xz#xpE@edB_gK=kM|zV7BKRQoYLGd zTLybaMy#ChGQ@>|b>9!mPcwKh<+CN23y*8>CO&q$XL`P=^0HhBtHLi#;L;!^SEPC+ z!3Rl+q5$(_BJv>-XGS&VlC@XyX8L;gllKL9BLmbcrb%=z_2$h2+u8%J8*3`WQ09@E9}0rZGiUnF2XN(gGP;(qfG% zYn&i#t^|ow1CzLB`%SckYY$MCo?a%zUJ=`|tL;Dz(rzq-wB7wj>v^T?l`B6M+$46* zb^S=88X5@huTl_n^bZ{!y#{l}O@VUaw{VYa;*AR2ixFQ#2S6qVS>xV26)eSjh>*mitHF$>7FrX3r3-tVqFGe zQ&R>OnN1nw1m7~gXt+wzEUP439583|K34`yHm$*~M%icbp=>7fB@yI^4AizKNiYqN zcPWzpYzG$E{O1{CIKU(;hC?M>v0^)B1-}iDIb5hbE%T(KnHvN_4yy^1W?)8dH`8!2 zArDcLXTsNtr55=|@!27`K8ds(8aqu=SliEPicF-H5>v6@p{Vt@K-HO=_v&*Z0uedd z@qmamM2#ra(s)8#HlsT6c9DjrY2HaMs^ozg4~Y~E4rywiaL*}&mjljU&X#@2?b?|z zX=jvr&n_vCs5zjrbJ2zQ_*V}*>q4;(=~ml8*>{5??}su@ra+G{x4 zxH}b&I+kSYkzPY=*`9N!1PmAte=V3o!F>!%Z zu5p3XopD*l6{+;3P?u#bsVtxzTE8-oOnbVqfzeB`7MT*evSVPVzjN%^A*2gZF>-Pu_v}HrwUp*iQ3J`KK@F0kJSnQvAPF#EKsZ1VT=^Xy$ANR5#>=)pg__n)k*t&ebQjk$NO3bj-f0wGQ1@A_3Y^C-iyK} zL3jgB(As~bUY!d7S>mD4XF^y%PDBlu!p4dG5phi7vTdM$@Nn1gVWuLgMogs>d~YSO z%8&k2MQsMOA4;&Mz$szY6st2ZQ&3jN=!Ksz`S5AN#3fiVbWeof%$#ta(*C64V>scSd4*yE(9xot{>3IsGF0Fo_(bP*#}; zrWU7Pm1Owjz)`SsReC2193&^M5#?SE{PCNP|F{+AUVc^pK-lT#nPSq4GM|&Z9{iWJ zkQcE5_6ze%O7dXoR|j^QXW~fa>Yh94!4pTuhWf~i!G*W&>uezxHpJ2(rm0?`eKICe zYVgF#Ua%noG50rjD;R-{SHZB(1qgHS#3%*^3@`Aqmag3^+ZlP-f^$p6uLE!Bny$Fv z@(`MX{ZtgdgU@$A4$of^0)BSngC%^JyffekQ)G#zAQtC(7a2&2;QuHN6O6~Mt}~bV zq%iE-?s_n6*PuhM)-h(^kSt<6A>tH@j+i6;qbjy_ik|UG8Go1T2P>n(tGFzl8hhls zEUE(m2yBy!r!18+4c}yEKKz&bR`TCSuZTqsfx9`RW(N2!LDfp_oB%Gj`0u0!#I!Ul zJuM;)lSTB5h$*dsz^ZXi5jg^2M@1@f4Hjz$Bv8eYCqXYDP^_ZJo{|jKO4jTPJ`V5+ zAMnQjehAAeZ?Ngwc|06zxsCjtIc9`GD*TF&R<<`f2~ zcp>@?Z)Aa_!=%Bi3eSQytO_5+cCyzX@$iRl_`!6rettFpfIhoCqL!M7EvVX#ce>l+_RTc z4D_HKIs~!+jEwdUDFZKzb)-T`oCcAgrGsq)^APRbJuQ2hdvGC-AqP?l$J7Dq_h#+) zC?*+x@7deRJMjuEa+TxAwmtUkc`$CBc7Sl@X%Il!$K89b$ll+y;P1J@xj#bM6FjZ? zN`k?9Wc+0B;8=fY1n>}25W7p-0A#Xk;YBLua%FWsgJyjc^Ys}hEF0jk7KYc_UCXbR zPYl29o}FhU7(||xq=^Nd+9jguK-``7B>Y~jwI`#^1yK8Zwjq{h+f&i5)!Nh0 zuG88Vp*3A=&p>;o)}Dp-Y^^;9ZLTHQ_nU`3yg>AvdI#Poz89k9BM8u-E(HOU%Zo+d z2h+MkZeQuDS`nf=W-H`pMO^9P1S^%H=xMEEc`oIm#bgfG-Sf&f3ddZk>`)&7K zeH09rpY@oeg#|r(U=Oxfdmi?CG0orLxiExdWek%&DJs%H?nNkY2t6F4X~%JC3y<&X z=<37@t;aDaFb%J5Y2=ldCXpQj(r_MAkOK8W>r(5=;*HqSQjoL<0W3Z{AO&(TTcTag zIO2H%?A+!FRPsP|j`L>iM!jXK!ZU2vB@-*!*6x*3>Vt>L$ywm3%ZGS7MRBQ@`g!fS0{kdC$5sgq6ZnM~5DhwZ~8Y0{QV z()bL7$InU?+g=*0m5L$(%m5fF;eOU?2f`O1X?{^cu&vb!0y&*p50A;!a0RQ7wVH4x zhcv#b^{N`u1-0W`H8l-JOmkr+wp352feqJT3u+8&w})fi`a2t7vedfUUYJCtJ=A#UgQrtqlJ|W00y+=}s;`C0vH;oz zC$++Wz(q5Syzy)RDW1fIvT@oJuvqeyU(bd`CIh1eY5^`BA8Pv<#e!;N=X)bz7S8Np z&}A`GEDBy7^t`kXM8dNa;7e;jNL1}>E_;&H;DFx&Op+@n76^;?;QZnKA!#8FUv%p&TSsHeJdFIq2 zTBG1nk2PPo)T8n|Dk?f$#&2>+4&$C5vBSNiu-6!H%q#^}4@_0)Obtx2*y2_$pcHAZ zL0Qra%@ek;;KQk`zn{u0N_n4jE?(ymS>n|CX zuK|p$?Yo;h^cU&Dy7NNGP3yh|h1$wJdBIY3W{zi z*x^$!ckr_l^Rp20*4x8+(ArsDpWU-}JkxIt%^&lmA;c8*whd%~SO|#_W)KMYBYnMt zh_q+`iQRg@M?MH+%HV~h(IW##hf2X1q$$Oon-{RT%|=T#$|fxP#@%M_7eyB8014sL~Rq>J=R%=%^5ZUjV=7f+Z`Zh|3eSiPS&} zor-NO_83zD;!YmxR*If@^s`&GfVA)BNrqZ$uX591)3~V(Mq!YOY7HJh92YD(9T`lOnW!YJ5cX!8q$+s9b6rPwWFj`Qs z4{453!at2K6_VH}Yc7$TMpVl1^oe5R1Ra0NPmm*C9=Sk@D zdCv_jzGXF@_( zqlcK4MCbysgRbdELqH0-z6A9%C0F6q0@Ly!bB{3U2Fn6GH0MKTqHrIxal}PbQEXU_rO^bBpjunSs@~AtT$9Fr7BW_Ll9&J`o=t4aB-QV|L%l!Whjq>}@>TGQ?4(k&`M-0AO3xJ<(%z^MD=#W2_5Nz9+ zf^c+Z3n}~BwD&Jb(L0QSxX#JaE_0P$) zVOz;kpl{Se?En`Q^wHOze0}%0d~F%8w+k_@&-9{G(!OzyZOu(FLj<_k zkn~3Y5y>yHNH>DQ4)A_(L;Bj@k}eX0Uqq^>V!{9-jJ3_*%R$xM6N9xAavOutN>0Phkf0-fLSLH z_qc~YAh4x2dqMl|Jss^W?R%T|?CILNlRqQMC6oQxicX1_!ln|+Z_U1QAO>JD9A@q? zUS~Eqn;A%UsFK}jcE$8qK- zBm`R$Q4ok8YN;?H&F>M+JxUFnfl-*HC^gXW1#4>V8Mxx}$L?>3;>1rlvyObVTW{#@ zKhjSh;C|0!yaYK>nJ8%vH7Ts6m8m@}s3Gu(KOlJ!WF>xO<0VQlTPLa6s&y=9;)cfi4UB%#_K(>`6Z!d`Tkg+)AyNbh7L%MOL4Xq#=OTOJi72G=lyF^k!Si zuc-{Y!xvQG48%_=!5JiaYs@g@G?WhF9a6~Mu7^R6OV?WqfuR;zVM@;s>A{llHFxDJ zoUGqJ3m}29M|xc#A;9Qw)Q-dgw?-KrHggpvLV$Rxkprjv)tNjLF5~4jAR)_Icp{ z7Xb2$5|p9=Wfmx0h;=VIE>lUefwrM{1X_;8u|$d)1<#1216K9!E9k{nHIR1ia9I}Q zMRMtl{Y1?o+yV<{d|n9_m2U9ZN~z&9OQlAzw31Egs;o}Z6PiSErnFF#Jf*=bp}YX% zEUXiH$kWjA|N7y$l$f@Tw%wF8bSc9_q0WovT++UA4%HdA5@SQsA0Ys(Gk6;alP;{p z_`waS#MqZ!uu4pnp7i!yi(^i4o=z}R&kau;{ox6q3_n`|Mkf{?`>&#y_UP0fl%{I^ zy?LhI3@NFZ%*IkGIZaAT`Db53^~q~}+*FvK1UyyY*|@QoK{Ldv@m?-PL6<+4Zwe`7 z2Mwd?*pHrXVKuzkLdy_|JS99^M$~gYY9gYfnNg(3cg**GLU)dK2hvZ z=b?~CV-Q8WoZOGSH-2HxZRiF+YXM-qW9ym2E9mq&hpt)B&LPo3dt`&@AeHZ@41p~; zBc(Lrrj6#n;Xx~XRC{X&sd#}rPzwF5b1^AXCwhl_k0}tTJZWMbe}YVyUzEmoI6Q6aMN>8pT)%l{JZ;P(H4nbcT|$T67VzJE-K#w&{VA8Hr4d zw1*QwPP!#`vM2(R-ciw20Ja*bA{s?ibPc3NJ8WVSY#RisCyT0)UZB3<-N~XH@DPoo z8v*_@fZvn{yq(R-cD|yB&7_VgP&&rNv3Lk+T{-qh>k>FlyG|6_oUBgshaPIU7j%xF zPzFew)O&~=7Vzewc3x6UVY&>ctjI0Jgi;In1-+Fu53rtQU+oe4WbnVmd8PN0o6f~$ z+FN(Z+fW8QJKrrxMSM(UK${Sq3AHXZp{%zda^=`#mP=@#A40#*4#D{8YY_c&*);8x z0Ln8ygK0l2gDHpP0q|s$3%!N&TG>yTUxb(d1)P|SABIZW!)lMi`CsT$0z0i`7+Ija zauemko*ke?GNSvLL$|JuFjH(4D`+vLY?5Lr!Kp>F#@d-;xj4w|_JpL2c(oGL?wJz<4nMpXjpbym`ar6lJh5$H z5JAx8hflGAOnjsL*N@7IC-GL*=|DTM)oFPu5#hv1+r`KfSa^x=+27TU2M+^7o(dR~ zP8?xs{C=eSIE>B>wj&I$2;4+apnMBE(VL!@u2!tjhUtww6}>5iViuTU#Ionu1OT@T z2-`c4dHI(M$R5jSU-wD>w<{w$#BLK6_Cn}sS%Q>b5ScJV>wo$j4|S$B>4VliEST1WEQOPL2wl--tn!!@Rfh^JM9LAvq69w7x2p$F=H! zS)J@TkgQJi9H>fEr}1r8m*G2Eoq^C;u7pP3Uae3Z)jGeP)h_T$L}rPLV3lJMT1`^x z+#)s3YK%2BPKa!+u(PEg+--wUmlAW(o{McgwhORrz;>xuNE>Z2MHg>8 zZ1cRxXj=YvS6V19M-AbQ<@X3=Op1LfX6GtL6mliQ4{pen4ExdxRz5@F@Ab6RLM>L1 z?Bn~7U}N_6P};*88GAgpVJvX+DQ>q7_8!G=rI6`D^xU3@=y@pXSAH4=w&W|8b!EgJ zak(j=3=}pG+1<%6l@+%2*f4Yk5$4`DzL)|pF1%b+_@V4sAEp!b)CL|D)Ef2KUbq+b z9JOE4c{XJgkkVvjF-QmWe^6o)6Hik_x(K!-dg8>fpn&PO}1ZQ@5w43l~hr|W33lbOQE>p@~Nhx=wAa@<8N>`WT zyR5nbGFYXO!PpHcgQ2Xt(}i73Y>rTKB!?|^Ee|z`dea%6|AFAYed-ip=S?AK4ZNQ8rkHgJg zI}AVhGI_XXFG^3h@Jx8fm&-%+&ure?vV#X>u>U->6&lzDjwYsjX(}`z3@HN&d`{DC1~0$RKBv-DO_AQV+Wp&w9=U=imU2}zkI z=%+|Xyc4@c)5KhGZ3QzRlOVyWHL5|aW91e&)-fcjBhym;+6l0Ju8#RuP`LcgAJw#A zorj-LWMoHo+cvK5dB_Mn(GV`cFZiNOl@z!Xl6ca-ok!mbrS90*N*vwE=UEQI`Pnci&^d`WD3m^uCd1U{2H>-`@?ajY1MV_}}yliM$T zK&8n{G|bM8ABbI#I-NI22)4Z~O#DC%+|1})=97zS#=O-0_aWAWpC)vypfGQbzUK1n znVOs6QN}<41c9Nd0)4LWg&M;=hBW4=W5TbcJhlvcO$O~*4guMQzv3!d6zKjO5&AP} z*MVzGg5x?Ao=SzFPK;)tE8sI3JP}e$wgW5}U*L!m8$jF*&=wV7!AOJL0E^g*MJDzV zD2Fy}v_lvOh>`@Cxm{}!G3B{YiQ`gqh`kK7@#PYNO&e8+2Dvw@L(z-(A}E^*mL69T zXIuq}C0foP4#-!cQ?JrM+MQxt#WV;51gXj+vwQY)PO{=E;wgk`ydpQSBK8{XIVZue zfIyO}W&omqLqLv)F#tp@ACkKmFdE%7kt1< zT{^U5?FFk!$2fUx+$=IcV$oP8~$aaB$urcg3x}BmH}OT2&e$o{y=N zI)zSKCUP3sOCjKdNW5Z=6gtot=pU2Y>(vuPNF+;M7BJ^>#>Re<^KOZrSGZRo^p5AHJ5?ur(4ADBK8gsv3KXlXha$27 z9Lzyzm6b(L(5d@NS_O+|oVEia2}=4)#+Cq7gGj}eii+4W3DWkLR3Pak$$nA*sN}o= zn~H%8lX)_wsO}*egMk`m=@`t?XN9R4AMd0X-zu%c)!^qU6S3}g&SLJ&`ANcHdtO>q zn%o|jJHGzK+vh_A=jSrqAYk0RD{#*=&vUI62C}{NK{P7pF$#0OOD8x$lKG8if#`ze zf6*6|j{hxwvi2@J6(gN*#xb}a7Pyv0F%Z6$kl|Zc-G`dZ8ivrY6JjZkFXPv8ey!k_ z%7K=DPDwr2%@)hl^4&q2IpG*Io=Jv@Rc&3pr@L!UTld}r+uQc$9^A7J2WvcM;vh_4 znhgmqkfq?F<1rs6H}(w<3=NEK3Nl|ow_pr7vUd15`>8m4Q(Q8>g;JWP5wsxdicMy5 zu_^qj5!Lyb;Y4xN?)G`+ZeUyqOjZ<$2I*#jFM%x{O>XgYa*GGVR%LNfVfspOBdPac zXfy^Zv++$Z_`X!S$Jv&(nHDIFBLEUWKC>~QD6{d)0p(_xjbAAt*=Az}iFZg{Z+PW6}WIxltr%>Q=>PExzQI%U62~#e5p{X!oEwOwKDm20ve2Q$Ur)*PIy=DWbO?`ceH{K;y*4+uYy5Nv}=7-O@YtcKpKo>>-~Tl3BXQ2O|3 z!t^c3`0RnzjA@<;_iUxBne5ZGi5Q!Gz+j$g^L<629;fD%4a8+`9v^1t2Ip~_fwOnd z&m?8EWnsgv4JmB$n!@^@4N;pw|G!LM^AoV%pK69f+mK1?s-0;jMEaUvfFk@7jPO?y zl%fhHNMG|fdhr_#q}{vX(%1Z6d)^7Aule%ZKRJC|k$Ks$`e#~A)YBz+SfpE=4-x(2 z`w)ed#KLhXzJR5USU55-d+i0QBE~v3Zd;^@w0cu)%WiNHWy8fus5 z2!gp)c1rqcON*%rzqd=_1X?|?THkB&zBRd*xS0cKwpirlsu1^A)oju4X?0VPsn4M>>HRQUdQ$2}^2B?>*rAK=6 zhD!?)+YdYH6;KHsldQ_%VcSY+2i0w*nltZN5m&ZS8g!Md^lA-KHMCzUqfUJ!uH-O9 zM*<5anx_)f!+NNTR1wRi$4E8K%1P1D|HYc0ErOcJ550UR`o2Ac>bxu%>NLtjdrw<2%?R;8e|iW~&IaJge|>A2(3^asAN2%M3h#&J$T&$N^L5t*vzNd8!b zl&4%stOtw41kos!XZA?`>E@7$zO6Tm_K!&37?%}AU^)n5i8eiBUR&^y%9Fi_DnHUY zHmH(aN}Vaazjt_`cWAVE_$cBzgP>U_);kxJh#dwledf%+;u#{Aux#S)Vu;9QD$97R z7$-*LXNg6i<;q}FkN#>UUt1nPC3D}L{rndIb3 z%*oU8absU(T-sny^R~9;?(XITx}4)7K<9<;rLuSS&@C_53!x2WLFo?xG%vvO3d@_m zfJ177*=sLYerJ?04*1ot8oM`%7+`)vX@l9}@l3Y%G>~%*R-;mwq9|+xmM)$A%eun(jN) zhG^dYp;16=#&X~USZkuM<9Oe70G2p$vbA@#*A!a;Xaea}Qix9OJ#>6*=rA1hvLmv! zYaauG8?O%H&x%vJuPG6S4xzAS?~7Xoq(m`K97nG0{$cP;*RxnTwu@)(vcNo+kyi#V z6~B?nfLhmQ5Mc=iqE^~2e3n|1IO_gC#|r@e;rbSI)Uz3e&dRMNu)fcYpb&r}_|x#Lp$;pOKzf*qR1z zAk3&rETg2uKqJP>t)hJk6&+s0lq$7JSUWQaVEh@Py!+lE3n@O?0q=y=`FtZfoOB z7cGPkZx%CrrI9Te5Y??Rli_%AJ-<{^4B5$Y{lXmEag;eVJTQukhNTb`3W_C=6PQ|6 zSrPCiu*U#mWdfk5Q>bc@cY*)kEdzaRl9XF5((wdiPBZX)tK18HiIo&_4|x7NMap=W zgk*by*;ONDPHA+GomzlzS{06iw9t)ft`ttriP!^Wf`nDLNEo)#(GDy_nn zc&n)}!3*Qv=^Lhb)WQJorsRtIwV|oDphu*v5rLFJ&or7vDv`2n66pG5>`lQoW|ht!)Ls*;*!C(Eq$m()LMs7wxe7V{~X99-b(|Mo@drEd_lCncBgmGs2nu#qIUfh9Lb-%y$b@#*m zz|RH%3V4+kmqRL)0AYhrCzXVWa0dOT5unM?3 z5Z;0$18_KzA5}AHm!wJz+><4D(-A`-({niQ{NR!h;D5;?pW=TqpqH2N4IeVS;2AN_k)MM~ zsGv+^(~R*f2ZkF_h3}!|_HaNIjs-1px-bJ&qjal{&zw5Iz*Da5g-P(c9A~oJ0(~;|$?ZItcHtnDUiyV=@qv9`_DcB{2*v9_&ZyS#pf*o7_C4d5QWJJIry zcDis_NjvX@wDW!>wRWVP%dzaqE&^{Y0QuAnLXqkQ(k#Ve4{BwAJd2<)KQoDP2K29pl6z=J6h4JT!y;S>@LGwE=pOgdbJ?@aY1 ze3w^OejFtg`REaGrTjhs%dHSs zL3o=co)2*>1?7$jotTLDFwCM%M0^Aa9TO2Bfo8=-#Ls6UVl2BJ!KkO8>^vXQzbW|0 z9D(MN5^ZR2!?qn;XlHIU=O5qt#dpk(qQVzGq17DXnJzDT1U-~)jWggsE^7HTO({B3 z_Rex5DYhwmb*)>4OC^`(kxUIUp>l%mrLmA|k@va5=nPo1Lb66)jVq#yWsbDGl`4?6 zE5pbbeoYR`T)aI)SWQ^o#!FF?GMru%GPPR(`wu}UYjnN@;ZrGS(5zyZO;m`KW@Q4! zAtRx68L$UxI#w}|EzQU#r({gOM7Zd;q{gEt1Rcz(@C#12^diVr(2Nu)C&5`Z6PyF) zKP4D@^+tiAI>r7lb+}Ths6^3olf7kSy#z2gr*!fMs{Z^t3_I&t$SmdhBm4RU*i*j# zpuOk8Iv9+rSS$mPRFzyphC3aPaP^ouH`a1-`O>7Q<#t_COov&RhUF%cP=cVGnNC%W4?XBQGT#QaK$%RRYVNty3c4SMr+S{v%W{q*I=M>dg>&*nAQ% z0(h2wDJ-54=}BeZAh6qIF$wwN(T@NGE9@y3rWkZ~bY~ACivmgp^BZ3h z#xPOkHU@;vB$_=x$TxU4NiGV^(2Wm!v&AAq6!x{tKDIs!d36JmLt+(vx|lUlB2F;N zX|hBd-kJ#z2*1MC(yl%pX}Y1{jk7~A!F;A%80sITjtdoQvGS_WmM-K=wgmNp%mYk9 zt<+N(#lV3i8+;FPi&udySqR=WzUQLV2GVU{%i60(Lv;iz?pO-9GI-9z4=RPp&yj!S z7a|?~C2Ft!3KEztxK=_Eqt%=s7g-=(f@|CjO$x5j$3;B)8)S3&t%PI?t_l(bSESts zEW&KCU|s=kLJn7Jt>GsQz(2q|Es_n@Nablc2{_&T1G@XasEqwbWL^1_c9UAGy8wiL zORbyG@sMM&2e;r&s^m>jhc?|%UFHM*uYmppy8oo8j6S77ugXHN;H#l@sAQ8<{=9pFq2lENTGC;>+7d|PlQU}TDV9A5AbE3Q?auSt5*8mImHzN(! zp0)x4?G?n-k$UUo67j_GiO@xHzrGO6$$q7du(ctGQG14@1ousP zt2H%}l)Fjy_S4h)e~Y2uCp77%CDKE>Q4BijB%?_0t0C{6 zRW+ALDrt(*hv{(`sASWW1n9vWw45aDbQ7V~gou{o@^IplkDjRo>hRNq6ZK*BRZSrS zcnwb;Ogb;|78F#JnZPp%-DZgpO1{qn1kO(BD_JCxqUa;i^y1`GV=pgsVdS)+Tfs$f&ifaI{%QH*Xd^VW*1IayP^?)UX=b}u~ z;hv81(QS%A3FqVk!h_xr#$8AHCXW z?+cgBBl21Jx_%Dm?Xa=j5(Agx7GO(al5Gl$G)xxJtYMH5KvG|dd=0?94wu(&h^ojp zB~Yb|QP88V0}!%@BuG;rnyF+VIpE^}k1{`&I_7}?4#0mG;J*j(|CI+k2Z9ovok4^v zVkBX(IYHJV>7XTyDwHWnSrj^9P6m?49D)A(SZlWKg@*DS*%lxtJ$= zhm}*^c163Db`-)>44t$Tv*HCMki*cUf`G?d8VaT#cKi1|Q0p$t|aU|8NY zE_(03#y%0=Ga+>-*z~7R$9|(>&b41g$T3iu@l3^zstWCtKJf-YoEfj7Ons{EtHD<( zkK=91t*X>cp2kEDkiT%$$C^m*E~)uPeh5DCBT2YzYohY`iiy=QlqmqNSPLyhm0!j6 zvvzei-a^UEKh?l5f{49J_OwCvi~YM7EQrGQLYrl#X<#gCSbkb$8tP)FksPBY&gGuE z#A#8fq;f)^M~)tO5)bec7~RuYU=w08EMj%h2)vS_VnLKKo? zw@4SPx!BG_dl9y9xpG?_2Y&jIgIgm)@UsR017x8rPoSWDaBEjrhlhV6LL^GBDLCds z-;%mitf&1durzK~SZ8511^X7|f|Bv5s$5M;O_yGRm3 z@dRP<2+jyfN0)mm7`XM(cG>?L`B%4K^7FF^C+dUb%gprmubD7BvlBH;XLB&- zaA|WcOKL(rMaVh7?83SWSx$E$OZ{-MvozDQHc$6*W@?C3sd+$Q(t3~}xJ+H{T$Cz| zJ>$oZGX7-_R)?u}t3MK+BcE|y>Z;?zFP1w%UMpnc=NEiYP)9ujYP>Q7^3O~qD03^+ zB4n8S%6dn&Syqy|2NKu+AA9csAJ=i-i_Sqi3t&+QRRaT;lux ze{;&5vx~E5LCR6??}FT&ol~aIH(&o8et%3Y#k$$^Q!`qKBWjshi1Eyw;ux@joB-vT z<+ETiZM$3I5i%mNbBVw%3!2IeF-sv}c_C)iYw^PCWJ~Mg+YK|of(nBmR6nh%sOea( z578!UaM3GKZv+T>9PN0M6s2LvbqIp+RO5R7}?Bo-Ry3>~dO3O1g^ zBHV$9E$?`Fj)kI!i;XX_;F~X4iACiXv3Pt|&oz00%5Gno{|3%)e&RAoI5?pt2Cojn z(}k0B@N^|M9!^d7z$Ej7FNF>_f!@L8(u6065xXwao6V(q+ZRL9| z<4FuBo+W7-Ptm3F8_*W~RYTXK+M|A<--KeQHR7vG0^RVKl-t^9T9 z9R7xsq>r{brz9f6Y!*d9TJeQtMg+j~lu#!wwh^-K4kkjY-N2zNF)ER;-mfBmIgB2)1HmD$6E`YG^ zUKsD>A=D`6!%gLlP5IPd2!)SN`f>G}62xMp9t97Y)O#6v^m5}^DIUPCQb@g;9X_S! zm+(rI@Tioam$F*|nJq3qpOha(lB5s03M)YYQWdHSX+Z$H4_EB{(9Z&r^K)0(tI$Bk zLkkio6xb2qTv6)TtH3aq4mDtctH7%ZljS8hp2H#n8l({q4<42Z z55EB2T^?DB1Ce|l{&Cw=rbsRgEg-3SML)jJDQgH^o(j(jj0&H6_rD)I@&m%oafvkw zbjj$kaf0fC0-BqSRL?Kr!>HyXQi8ktbqU=4j6+U7k84%NlbO;ySXAPOBOOHE4|UmB zfJ&+bn{x%a6FQUr`PM^6K7@0cADSnWS|6cJ|Kqm0!cBj*7L9y}Uk~%^rTlsszh2I- zSMci*e!bFGkJ{>0wtCDl8Y|+7##XNed0oWn$5yYwTkZ{8y%wx8BfN>NUWXy|F4*ez z$a*Fxwt54G-SKo_t2a9JQ%T2GkNaXUTfGUl+Ed-#KzUEv>diQ=bW~@eb+&p7?lO$D z&b<{mSE696x9MVZnQwO<)VX)y)-e>&pBu2%J8{c(dS$D3;Z{ewJ=2rww$;0Ft9@`_ zAl=(OWUKcSIB&Jpd(kV;`M0g!hZk6dZqNH!vg7x{Rv*APy0Q^tKicYpc+9deIrDAeMttYCBUMox`cY9C}imCvRZ^ z%R@fB1@fvvE~R^pr8_#(q96%5}nD$HG)O`;6OT? z9ylrO{s-t18_~y07(y;|?nQf)Feg2!KA}FDRDG&H2~&A|4e%?=uN=Py`E`hKv?m^c$(o_fb z#_6AHRTHOJEJ96im!26Hs>5!n)H%1whxu_D?4Ag5o^{WQn4KeVk5eq0pr0+R%;lU! zaf)@%sW`25PO&(}x@TM*Jp%8vbAptVUc}xTahl?uo^hUa&(=5wtnL9@=H7N+1Abd_ zk?I2{P{HQXFUcAApF|0iNx+m(*q2@$27=)crXmiad5qA|%fM>FDS|_?l?REWI7=kO zaUv;B6iIQYNQ!esQXDOko>oIR6Ys_E3dKm4FEa8kM*by6ei-@tjr<7mXN>$P@?%Cm zkNjC9e-8QcMt&Um2aNm$X8PV>Kk z*!jGwl;7W#-&OMa-{p6;{QjQ&u94s0m*2Mh{(<~X@HYr16jRHemGV=(id$+P6^f>Z z`W`0Zhia8osWw@)YOmF#4qHoAm$gb|t@RkzOES2ZNm5x1ddPsE+IuHOS(K&MgG8dP zMm+^WAb;w~4uLiZjd2)Zq#jH?y3MH<0%<+c8<1~9x&i4%q=+~It&n;e|AIcMhh7Jj zCF`LbQVWfndg$ELLg%I)wr90q^w&e@1T95+GtzxX>1O8^q_-kHfRyfbZbwQ#(g%^! z?apDON08o$^e&`Fk*1JxIUYmWjY^C1$i$yNEXWa^vxhTco#H>TU)k2o$eU!JDDCB#^KaAFvR=7?UU_O z?Qn}Wm!~ggQO9+>Wd=l-qJL|nomn)%QUj6vG|#K^p-55>AuM`xo18M?k_OaPP~i2F zc(s_)-EwNg;_b*!&*VqZ`7tP%YrmJBGgBAo{CpqK@_6+hy01O6J%jxLT8(e(ax67w zs=e!rkzCD14Vz40W^#OPd}IQ?I&H=stLb(EaGi|ofEz+Y9xiX-8rxx8;?|kIVyR=n znp|JNnKBjt$m8}Yn0k5Ty1uiT-4*IOBDK^L!RkVC7k?lF+tF)O;A*^gr{`w&IPV*X zT6u%k1c<6vNdL^#xeVA)T>x!z(Ng)vEEaipv5jz->G|MT#!;b`0bWGq1|MNTS4x2c zrLIq)u|7_!B~yar=kvD8BypymuvK>w=V@<}(!3%kO{l2L2hu&0^5e%tkWSWdRvlMOJ1aLkvH8SRmq@_BG zEpZ8|B&WYN3TIF2ng-MDKelv zcs;IBN>>47mG<9$UQ5{hyq2*0`K78JNAfb73Q4*SCDBO{a};GW-2jx8>5arxkcvNj zq}ze2G7m>GlJ2HTHuBW?Chu-P?t`Mm?;Q@N-_in1yW$B|`HZUi8u4_|AcN-^JR?fp zsG|Z1EqihskZSEde>u=rhVEMhl$8kf8lc^4k!}LoN(A~Q+y{ajM6jM+kvj5O$UFH# zGb0gHZqdQH@re+UHC6{)A1bGJQ0#J>;9B)SxL`DNMBT|iN5r<6rf4vEj8C=mtAkIa z6ABLTj;k(aGPb%~3?w|tumsn#1yNZ?Cd6{>%tSsnf-i8(=gyB~@kfSA5s1XTU{x-G ziXagO69p)SN?Gb)k&O^}Pp60^tmO}SgI8r92$H&J?wA?JR;yg@~;OxT3 z?;@3V0)PxHYRJxwj9vg3kb%PlN?{xh-Aoswl8&2TBDCxLCYih5L7Xrj>^OQit<%bj zBfvXIzEr`P`9s*N_koQsAJapQL)=I#eZPALge$^q0rqP?>n+U0r)XTON z!~`+VguWy=3HOkRowZet+-unHz(FnCJNS@qV19CL{9-UDrlI0VLt`lbe6wZl3_=A zI?5|U3))3)LGT6fIrj!jD3hQmdZw?~c3*qZ{TU!6pBEA_#<^a#0ZbzXkHgW3(@ToT?atia_@h)X07oZv9lxt|w^8 zYrkJLJ*N^wyP*91w5t2+&d=d-__D*d1lPl2mRG%BHL!gxjcncSZbHiF!wfsJ4OjP~Z*9OHZpO7L=?5%Yeux{@ z(vz(g>Z^5aXR!0yhGLx^f6?hPjH~0g)y}1-WeEYsKd)R@9^8N$N3mWu^lU* z12{_>?Km!Nrrrg|pDm?!l^$Ijk;uvD!hS_YmsVm#hYsL%t%g;Bu9LrbBe-*L!yQC> zjwb)+mv^JV{FG9|n#iZ-=cYE1+b`m|tcl!*aG~c#E4|LI8u)9_<}1i}iDXj%dPj7G z7>eoZI_W&_9G~J*CsJw=S-L2xM=JjmydGOqePaY_;&cML&U^^4+4EIReLWlkSTtl` z`etQC;11OS1@2h)VO{xf=bCiYZ`}0vf7o0DeFA(+StS;XQE2t0N#Y<>F&N@B^`g_t zgld+U#H|Unu1*^R?YGq}WTAQMIkc$Yh&s&BtC=|mqxEy*z_3ox?a8?m^Y9HAx#pZ_ zH~H_Fn+I!d$;`R2@!9F|vEGr3`7x9^D?yWsX~f(T#r`oh5llu8rgT)7dKj}j2zPFv z#iI%Wl1yTpPjX9)dhNPCij>g?X9W|CCPbhGB?Eeuua_U%_TuDzJ#pV7>V^RRsqq`c zgJdYfqvFH6y#2kI$DX*RMFbScIHdnDQ}Vs_5l< z9fP050+mq@Ipbl)QQryppbAZ+-eow{39K~A*DR`(#Es(`7`2Xq_W>qL(At+f}3S>hS%vle}jJZ7|Wt8{*ho9X7AuT_pM35T(gie*$CnSVh ztr}He_2kuA3ef=j&m*{*gce))C;{EeV}`105MJfF`Z^X8m094fd5^k^e#g_U(Np0) zC;>WxvXuqz;od;H(~*;zih!oRANU`lM(3*f{TJ5q^W~VEqK-BPcH&HF%wC;MO-xLU zx=@^v*{F$Vsl(;+xE%k#d>bVnA4VY-fo}BkIYyqRlNF0R${ow zrtHYsd}?N9aWJW zyt1XfXz^C)4Xm7{UWfYU=h72-9nSAHk&O(Oa^Kxit-Piw^qY4)?>BGiTAJrByRzoJ z!5b##+a=x0dSC03rhr`+K%}8Bav293#vOd{I*4=|yCL8j$e-gPhn&k+h>Gik4E<=##%D6YR!xk|ot>JwxaYD+Bc0|m z_Iijwx(=VQlgso#C1fzztT1>PpQOUkCjX7XVd|Kghd{@q=BTY<$f8R~hZg2%pcH)=?gu9; z3g2~(Ok2G)sa~dDZmU-$)g$VaNuX#u1LTn24?qM>+C?vgpkTU$PGtcF2$P)>K_xYy z<{1jxo@l-C5CjxMpfaQfQ99niFaTmjw8tEa(ENuWx11Q!Z4bR6=15U2ehn?i@j46sfnEvTHzr9xLzGEaFKl^5hp7zdILEtF0?U1i$Q=)^dmC+p#cn) z!U>O~9uVDNXW9%M0_p-#Ga1OO&}EItHyQb6y$Dug{GyXhr!Kfz60ERrk&vEGwp)nEYrK4^aM4wk-rC4 zLQDrCWo3Fww6_zKqhcgpjM__SN4x~jXt7Wp1nRKN)%~EDb(Bsz31euV-Rc758kAjJ zg!G~o`V&(S6i`>;0#tx&!OWUbN0FwGQvJ6ZD$zYid*Sh`59t8XEYj2JA?R#}XzlI4 zdGE(tP$NH3_9&rEL2i5zeTrcc`S8tpJJ}iV#EKEM)e+it-$f;fqx?$Mp>Z&s1jn~d z9pG0dFCT|$8kDH6534fr{B{mTM}?wsR5Ves*@Ys38b^@S2nj9rY>U<}41szO2UWAs zk<`3{%IVn=EW;?|tML6=FqTKoOwCV@k@!t@rp0#3Id%4xPuna+u8;tujkKj+6g_++ znX!pYUPBI*N4J1dt{x%jhje^$EKhw3jCdtj^d&|ngaBY4n!5qB??2}K>mR$!3C zM}mBMoTVVnIRYIg!Q_Ko^C?jku@&?RqD*E&9d@)zZdNajMhT7X7e!K|stoNNo60L? zpojtdH*`QdXE+=_iqoJNcsKC$vUyu^Fc!!EoKN6t9?A=jC-Q>feng?qBqs6UQ2_Os z+U#I^J1iDx6|p;V?+e!FnGsOMCTc}ETLC*go;J;oo--4*^rf%RacRWS&Ob^D=x!ML zx5yQdHPfx0MrPKCT*MV+EEm<3S|E&ToR=TOb7XaIt@^U6=-CC!u!^D8u<5GILI>kH zRgKu^Ppg`$UC%1J3fdUdyP&2Al_V(jrpw(eXvsGG+9_3O-IlGuG3or6x-44oQVlG! z4IkoBH;N>MZGR<7f#_P@Q1zwygH^3nl{fTL_oKCH_p>Tdr4ClNRzvP_O1nU0wOZZd zHdK2%(3U%Z>K;S|hoow)qH+ToM70_eDoV5zs@x#jGnII2HJZ5#m9Bz%FI8!)(H!kO znaz2d)0~}XPVa6s<~dad%^x(4t=ipM^^{7AZjIZp)+&EQR!dLPD54WuC&w`=UFh%K z7@HGD^LBd8+vzl~3Mm^^i8odQv)q9aHlkU&dA=KCXbz9b!9??O1O-J9*V+8&{LKD+o6@Iq>0a!_;oekFdbqQ1 zpeL0J33qnTk@04&L<9airQL&*7bd4JPc9^>!LnP%$2#XHCa&HCow@O|k1t=QCrx2CA!p*V;!WrzXdt z+RKZ!Q|RDqex`qBd~$SrTHk;XR8!#T^c6l2ivek1Ha~M|d^8_;rOv6KV{*1*>f*@w zBwt8gAAEUPvEdHsRzTVug}6pd9B{P&l9O~Eb`YG^j1<1zQnxK~T@*zWq5!f}J%Acj zXebhWp@n248SRH?V`w%8XCvICM7apiCA`x>cPl`WFF(EkyO~h)M)}@^JI>*OJ_uUmclI~n=$xvL0MIhVfzfhSO=y7sv%bM6p< zi{5~Tj?JGvo1c;3!4_jJxkQ$Q-r9NxFRaT)xNy&We&(v%R0kyFrY_Jd2ByJFx>CIz-Dv~z zS}Hn1c6g}CVcz|>>)Tz)T z95+MgMEytY4kuX!EC7rH3PqYo{UcpT3>N7+qNzwro1nU;r~3Ju1ieiF2i^-b7J{6T z!j*k^Mx(~W_o=8(vKA;Vj&{nK}VREq9c-A2a;V;!zD?twaHJl=mo=%! zK4v z(nukvdoVjVELv6tncyaz=Fy!aiRf3t*I;^$*DA*GRX08AV#$D1)6Q>=BL^|&-I1MU zB?c0JT9QsrXLVr-Hwzq6uabEH@jW6w?jE0=!y7At#{JOLa}50ZioI|+vONo*6Nm1E zbbS<-9N3&3{;Bzy(R}AP9SIZxshianm=OfvX~EJ=;%K`9jlv`}1RhSRm#UZ9>gCM1 zx?_*3S4JaqKo|D!^Q_9D)s<9_QR(c}>NTRw6y-lNjDIm;(d(12gnb;_LAGOXpcj2S zBoV&o&G5*~X1$exhu)rqtGYKQ5ibb8-lg81RPRymg^T2*dcXQWQhiW;h|PdI<2#}k zXvADai#?5fTlDNIiER7Z0=oj>3v%`t9MJeeN~eKX+lywk-56MVK~QrdKQo!1pi1NB zsLkL$#!U&1U-!uDoY=yP+a^$=44LIb7B6Z@4i63HONL$if+prsZU?wvf$c6xtv@fs zxji=}pay(^07-oqvmU)VgW%J&2E%w(k#$OlX3mnUkc<6SK9H^;0U@y0q*L+MJYOP*w z?>h*Orpr*?@`JUlwXKOSs1;ACl~1ZwI@2nd)vZ;n2ynON)MK{wsUQ9#hIQu`)Y_-i zx@Xn;ig4|aVt-jJdrIB#HPyxurj;M<`xxnE0HjM6Bb);vJBSfJi4i;vsm&0^_FnwD zPmMrhaS|Gf55vpst8nf0>VEY;T>UV-%6@1$AsytW7X_FAFw6kS&&^M#h@AE#K)}gN zdm6q@bLoN36n-H9Ldt}-Awq2fBk``_*Gjkzkchm9QG4wKkVJi1wNQf!X!+n-5~m-dVym{0 zN;l|8?YqHT4lr9Rqq>5XWvM8%${jEqu4W}(L$DuAZ@1)g*w~l}EcYVE3z;7Jc=>lM z*Y65kbdQ&M;cc)0Y6h`@Kzte}*qUF$4*)0rLrQSt)94ZixfhC0!`QIkmY~Vxr!Y!Y ztFYu4?yadN#6@}U@zKM-jT3>NW7oKSLt7S};TqJoI<#VYExw?K(x7%Sy9;VP3DuHN z%Mxl8Tm{3Ah1z3F6kBYAn0wJy`@^VR&FGn|r$pSs5Y#hgM@IAFy^y8@;`YMv`xfat z&ND2*wyf@)7&!-)LSi5f!TBY+qYWZ|u9*3HKqE`t89*${1)wp(Ncm19!Z2lxTAKul za9fhAFp1^0F$qirp~#Gg9-1G7b0)PhlLs_ zs_W>%As(QLqPN&cfGozBBxXYmM5^V14iS$_*kewfRwo)?#(d&FwPWrADge{~fwvd{ z5{OyFld4kd_EBL*yG}rdEqL;_DuF$_xN`%rj19;UVcF;u7I4B)g~F=CC4plM%(B)> zNJ*{}23-=t=#6M1Y6EUU#|~_u>4c$XsItY*4pp@zvP0D^wb`MXmb&aSs$MJnvAx1( zwl*5=T}-F+tHnurv-v(`>1`%=5Yg zv@F(237@zaM8;M?KLd*B9=2dk?|%y3VL^G;+8x3>xX6ijG~>G@-eE!M*19=_cWAw4 zVlFKxLu(i_Iv$}6w+|I|>BEG-xQ(dD+Ze_-{^9YDr#=f@gCCfaEoS?Kw#?$tj1t@7 zM}=M39r;W2o&F=kFK%7TzK*$<|I^Tl#cbe(aQ*86Q~oa!5eJF51yJf%AQ1h=~II z&^g#5KlA)_-D^g9opX0W$+yJ0_uDyjQm>U*BSZs$lqY(+mPR234N$;0TMKFq#f>Guvk)mI8 zdI^CBFn+%amTL zDnZ^7#1i<{?Dw@8L>jYFoJQ~ABvdKisz**c+pG`F2i{Y1`g0WTUBVB&7sz^)>lJ37VV;BLxx zQGclqP#Ff8Q?MVnolY;hh|Bc#!%Y;TaToA+Zi|H7QaBnm_5r94I85i%#2Cyo zN9N9p|K_T$Qw-M*rmlm|z=H|6ByR~{OOLF#YI~enP4OGlygdy zrXT{`_9)!JDO5+#!_c-!Ux5)_n46l`T`sDg;+#E(YDsxs){-*d=_^o$nuFHpT^KK5 zoWlrTZ>bN*9xp>TLUY@T*m%WxrXr(yw$5I0n35(n51l=U-v3YHrvC%UhHSOMV_iHLSf3DMT zHUxvPSTA+XHg*kQW;M_#p@*g)0y&q2_#gW#&7dO$L5(SmyP2*f zF9xXyijZz3wgPNK`|93--=%zs(c778gHRy`1Qoz+XmLPumn7Ok8Tt}1skI+&y04%} z=nh~?bk1=Icvvm)tUF+6LvI;2Feai9cNC%!cmDmJ*K7r+ho4fG3VNf{93+HBT&Tk! zXp?b9Io4jo>d;{@ec(E*hMXU`>8D$>V{|Xp&ZjyU)EIul(&{)L>B4ps&s`pVT7ndc zioO;Jh#eruegISoW7t3+y1@qGc^|@2#C?;-AS`t@vU~%Cltdalr~n9G#9E>1{AKzK zi(MT~>PZ(dAT!DyyX>e4ltMK8hTts(Mk6lem_&$UE?5itNK;vkxx%&)TO>HkE@!L|bjcR)bbY|OW#bp$C92*D)0{tYCdTjqMi z+L44F9bPX1bPeTr%3|-c8Efsu>Ln6X?S8c>iQTteBCA2QpOuUy>9?NGo-3h3?(eW7 zCntQ~N55_?yplw&H{WohU)G5fsgkbS5Bwvh-z;Zpuni0G_y;`f-BSORu=FVA$sz*3 zmF2|>)O=B;`8ZngQO9NW`~>(qngZ$UAI=T+r-$1I2L`~*zOEQ|6l&-i4qT&sfn!+_ z)!W#}LCIalK;>fA4i)ewoRR#a(u)>TQ}LyU1tPgB`t+ygR#%0k8fQCsEHr0bk0SW; z$M77D8uu)*sw8$>#f~-BF1Ws`tWora1wCV^wMY!NnxWPza3a2n;B5)5w#{m^H>|BF zW*e&736y0QkdvFFTI~&M50IHQJjs?)iQST43`D{px7&eKY=KaHIgp>Nc(V#+IHA#Y z*rH1(?Y+rq?|wYW0&1<*PpDexm}^}azr%MJ9j=x7$Y|1b!tC&)=q_a*JEX(Va<8y< ztzPr2s;`EX&r-5-o)8CHmU>z>esx!%uPtbug4!}r4b+lB%kP%j+H{Fv6>Y?QB4^-( zpqVwI*RuuvWS?L$`h9w;+C>Hl^5oe7-4mWoE4Zht(b2U?*CE{o&ggceIi!POp3T_l z#!v5qehxoJQ9vo44f!5E(r)T+gpjc3C-|FRbqFB}D>z15z&T{y0zCoz4;op-7X`E2ek>%=#}Z#m1UU69R+kSLt|PWggsOIUY7b#_O8R=9UA8eR@g zTXp`_B$RBy%W|;$GH~kVd4_gB!)V0@BdGjvZq@VYv2!rcf(^2;j;aRIP_ATDHZq?m>=N)z;>kFRMyu9amB7xSCqWHPkwW z60%Jt&d_4wJ^p;?c9I$*Z39Y&LafYG#gx9pYwUnijr2 zBh%C4leGI-2y8B4XnSZzoP&>w+1&UX-3eR|z+WK7iwugoz!YMLVuAJg{N(7=Se}e1 zbaiV0R5${qq8uR${ETWif8|?CO>11|B`~sd$r#k4E_lKWD>OI~I|T{kf;l51yXz1P zI}^h2FmLbJ{5U0+j^0I&>IGKtwMT?Awg{;PR)V>e&{1uqR;IRtwvV|sP+fz?nJ3Q@ ze2Z|Wi|{y|aljB8EQ$q8(&L>1ZRSW6q67#)I8~IC<-jyJvZ^07`sLoTg0;YykNBAzTGO#+2 zCLLA21;3U<+(@}c3&f8F?!5kG`$xwA+*XPoo_P_g!-ZF&GX`#yPSfd9rMlM^X0I(i zm!j#H;UYQ@OSSUD;6Qpf)tx!s+augFVbj9`6{?#!iW=a0advKGQoF$5=vaVPxZU2@ zFB+W{a9l-u)pU0{C%U1P`T|&S@UqPpssPqH`#Ohvppu&DNN01@yuiWI%!}=Py`7nX zo}RwJENZLcr7UifjklZ`T})qZdtY~VCY$LKzuHhgl@fdVoYzx1=MHpF<+W1?I?@Aj zF4KEl^SjuPHgtz&Lcz7~)L?H%A1@wtE=r^Ndb_1lk2n=%Gd=y?X~bVW4xI<8!{XQr zRo!!wkFdaM zr;Jp4E^`vk@fzfyEzZNK!CYS#Ru*319e9qA! zX$G%BQy`H#mLBd-cVa1`cj@6=A5`^f`D-9^ybD*+k@WDfzFe-aryLE3;Bk&(Oeaf0 zPLr+f7rBk&yffZ`V_21zq5D`iy}2l~V3`T-`W=5g7~k>P1GgL-pA&V{doi`H1v!Il zX$pyE+B~g@|5pI(r`n&NXHc>hBfk{+Wk!BE@;b3Tae#sju(e>?Jb7{9z-11o=CSJm=>wBhT?YYUDXT zDI?GEK4#?Gk?%0_Y2-VN{Bh*Fj6CNjW908f{)Cb5M!v_$v%S4Wp6%^3@@#Lvkzb0D zN>DtDG>a9u4=Mkeo>A8OlwJ8LRaNzQ<#;5>;f6-Cwt(Hvi0c(~M}bc>lpDTJp(KVI zp}e9Jlq|!r(IHI8cJ}9g^Qq75sRtH^53wY3=Y-HmEe#8y32#A2Ncw|(EsYCb$FJAh z>J7GfBfuk6(h8(zE)%m%O4F0u0%bPK^=wcY+OwICZXgKR69Pet+oYhOjru{T52Xis zb*OXT8qQTYgHt_n9028TuHtOW4fJ)(Rp1@ovr>j!1@hruO%G)IdQ;tm?l@4IbZwof zlYKanwXF*PkJDP50|U9ie&;wz>Su96|SQ@9exap0yg;HyCG1nw2dtG-% ze^~Hb-Xf1ccd=)vKhvHA86d@M^~%O8e3}n$^F~&eefstTyu95Thd}Yp-5pRt(=`O{ z0;A<>;rlzisV??}Q_L=}5@#R+ix7--XDc{&z1_qLZYr3^jvh=(p93@Ycw>+XT;J>M zP6zu2c_D*yGk{!RU3mNS)`I13jOl^!Yu--2%^O$@f8XFhyPgE7sJH5RyvxI~cr*8= zWtZL&?si|gXSh4ldqSFd&~JaovB81f;nYA{b_js9zbX3%0co?n2>z%EHK?R7Qct(u zIf2MvvFTbfuFycdW>SB!jwmi*WfafcRr)A`;6}aXYEO6!$Et02Z$AlG4=FB|2vHf- zk6%PJbxLm_I5=?4MK%4rMm7DsMm7DsMm7EXN|d|GC{M?)_3!KWwSHd5ul4gfeyyM1 zfbupP<>~mf{(T+4*3YxPt;X{jwe;_6)Y8vu)Y8vu)Y8vu)Y8vu)Y8vu)Y8vu)Y8vu z)Y8u%MEedI?K_P85hH&m@^=~eqsXU>{4wO)jeH04X(Qi>{Ba}Sg?z@yYgEy1k46>! zd@r8wGoJ59{vIPgfPB`-=a3&X@+Xl$W#msIKV;`EakwmTtTN}Jo zhvNDLA+AW+lJ24_HNtQjvsD0|gOn1&i(d0-J6MSn#%#fW3*Y(XOP?!i5qP0Peguoa zt7|cfzN<)HvZ)KYb6rlz2{Ak4aRTr#@ zpvqEdPse^yW-p>vi)g}?^n+ZyT+xCn>4n^XH?{^`DbNBW*o5q!c+vqm)Mn5?hZrKb zlgJeTI^^PLHqU3|RB?gMHEF;7?cY4L@n=vyKXFbVe{@1?4d${N5~`6QJ8mSXgXTe# z+RR^D>aabwB08q6K%v$7C4`obP4XnQcwoa1PG=BNg9E7P-&|Q_{K886zb96h8*#f zhN>?Ef30k(fHqX6)<8#GD+jiGL6qz@Y-s=?3DZ8jq~o@-5L5F@klzXjI$Y%UY1HtH zQ2=8ty9LmPB@4&^Gr}PUAC^0zn~&Jo@H}a2&yy@jd|0aI(3LL%nfkI6rj@|l*5FlW znbQQIf`*3pZWBa{-UDc4NSKqvFRiV$O|-R^02m=3M7-X!?B4c^;M(w0Dx|Z!5*;`G z=28p+LcqMRGi-4ELK}Tiuq7A)CWMm*0cUiW>h~`O!1NzBdkpB{3OTuDNZPn=vWwsv1S5iLSPx-8`HGxk^4pxk zo^oAeA4Fl?&NVyMfFRb;B>c9k#3^q}$y7k%{-xy$6j-X2#7Byl4i>N;b|2+|tcBr1WH9*% zs2Kw_^B2^jA&NVu*M=UIf|`I^+T#FOXqY7I?<)LT2A~0v1ac8r4b25L6nhMahzrFU z084yjM_ot}tcEWOOV4^ORLWjw6j1FIpwSSvqTK<5O*_7zs@FWFYQCmy{MYc%Z^xUZ z7!41p1Hg7bsxLN%7T_utpwle_t|I1$6~n?DVh&d&i9Pzs*9YGx8J<>=M99R?f@LBDdq z&<#mU+J+>Tv|ulL%N_590m$`GXpXT#iArds!X-d>RPqY_d6Aaj`F^8_}k{!8h)*n)qjKFwxM;i zD7t`LZa2hvBvlZLVWLYidxPa&y)7g0_^Rd*2U2fV=UlGYmeF4Hs^=Ij9l+hO53p-4RZA~b;?r7I z^liNMheEr$yga&~pV&Xo)(XIOZbGWGR|8k)Ny9;5keeC+ zxPss|FUg+&{%e4-^Fwciu{T<1bHQ)UO=A7DBB2mw8VoCP9&hG3w~t@@Z5rg(s#}>k zAO^VnLclE@_GH1`BR=y&X#D6IccTg6t1~&-6N%|d?!AS~lAga)Efx<@H?Q!p3T^Jl zjm_wk$F9y%3Rs0WzS!zP^srMYCqx-3XkC$%t`SH_F*aD8&Pnzy_l(DMl8lCc+umh3*|v&Y`^$rj?p!D2Fzz za;k80SL>6TCPP{>@jYO$?#aCpP=Ne73-d;-mc<< zz@<^OSxr)zhM*gq%1|`WXu?bW+Js+(plwj2)?Iluy37Xb@f)z~D{c#ReZ_6U7gT-i zuF73sc}gWi%~=m{tgKZ|b6QoCwHk3t)h6$fiq(|y&@r7`X4V|eBTEE&iUDo7tGbX04q(yB)Ie(4T1HPfOYs!SPJ0o zfc0jA^(KP#CJ(I3m0Jnm0o!ZUZT#{)EY!|VoXpS6!V9a$SrQJO1n8BR)>XsnJKUr$ zcnE|UIk(?enmTZ?u@DaR{6T;C!FD>vfrO{e_-*71g(rfC)H(QG0Jn3Gi&{bWbWpd# zW1*Zg;7Ah6{C6cOI;4}ZmL!%|%VLp39w4nO3x3Eps%=TE=$+!Ybaz?Hap7~KoU`Uf zM1X16N`&cjtVEED0hAPDfs`;^i*N{NW5IO7aSbI70W$b7{RRL-RzO2gx_VSlCeyIr zfW%dVgOD=S4nb9_7KW8|S%71WWU^p!yJVpq)=hxK`v8d#016*7D%t>G{!|VbBV6b7(ueV6QxSc4 z{bI+s^#(jj5M$U_3xV;C{MuwIIOqfsv*5b1 zX`K+H3w<``LZsi1g0&fo2-G7|P&=!$ls&2t0?ovMixyp7qbLj;X=P<|( zawMRex~n{$jpgQX?Fn%gyPe#IKJUT`%>gAK)`S)+b_lL2Ih=Vkm*$01E~-z}w*m;e z`=>IMF&Zs zT>=!K?{CR&pSpN4KMBM4=Z_jKtpe#Ux59I10bI(3-+_b1)lY<9R+5a%M7g3YWtxQ! znMLk4x0TQPDWiQ9@PzOQK7wh?ynt&m^)vyfnR+nq6XqTzay}s#aGVzA?!o5{9Pik4 zypw?A9mkcd2JxCO{GvfkYy~yZCJoR|a(OD4%)Z(kAl2%8N=!5Rz6Q$Ylb`^9&M1j= z2}|;Y*hCpg>(qnRA#&)rU<)25Klhq%ee&mVj`0%*In0e;%xC9DE>4H`^!2x-sr9NV zI6F#XY~H(32ZU=!Q<7ZpO0(1=q|8M`=P~%rMCtiQEW?+Q7125KjB2bI;NdRLvq+$- z|HSd(_5ry3$@CuUgQp_Sm<0iWd8=D2vILN>sRBi}TANNJy3>rn!X;HI#hmN0)i|?Kl z?xpnU9K0gXVG$i6;f14kVTpT}Hu1;l1&Qo2{9o$c=o!on(mH=I*9EZYUPUjuQ$uhc zk%NN+_NU5da5fFMLcQ(itam#BMBjZE{;krf9=!Aj8-T$(HrUyj9vD6evuDR)6mB&6 zH{jiX-EQ=+(6vC|5t+jX`m59qbdMxCILq+QQ`RwBj)rawD)8FCRJnZKl28-qiYwVI zIV%2^jiH3+TS>-v*tdg-F@k8aCiKC7B3(ugM=ihssBxynR~6vhG8Cbo*FJ^(y!I*N z=e18EKd*fX`FY;oVwATP`E5p?6+J_alFc zk-ruB1EKtFMxO1t-N?6Lv(v2}zYl`?R`9+>K&2C^P`YAS2PZ6YPu zX~)Zx&!@fx1}Z-ts4(J`%1ywp^Ys3Go8Y+uP8%3T zd0+@xBgkFo5L?g21D%020;oV+wLHWZ*WL0aZ$fEEc6STVW<%qPM) zrskq32ZTu;H~ee}ayGd2ITpxbp-{s!>&|N%dt1TCBg#dYTXAUqpb8epULiW5ty?w* z!R&>{G=n5%A>DtIedOpTkzcFXN5`>ty71e_#k2-LRp;n3kXTwVN6vl;C$M+ArG!Eo z038FQLbzD81fXUg#Sc~3CqWy4)wBT!qWjCXH~r2Ru}Ar#KTNaV@s?OH^HZGnYjLhVebU3HB8=Z5l% z-YB*@5oRRUj9u0ORo6RKDaXsEJFLX$w&}5v*?cbBvB`TLn=;8Vd#1+bC-RyNF*%nzk04ZI z;8!e_`bTEKYA{;SI6c}wGcIlfSfEX>zg28Oychs{67_FFF2{1;&a12h-lhD$7 zIO20VoxB8`2AI?#r@>Xg-5g*(C@r-fVtPvlDtb~?KryRw2&SG@P>ia6Qq^cy(9L*G z$0eff(&IP-`cd*d;(cH1#IA>g;})qCs}tq2hAc2NU`%T1j-3eU9zj3dV`+|^tsN(}Hb4Yjv=I-^d~8Fd30V~u2t zHHkCoW^qQn1mB647JS#XECs`CnHImZk6M=V7NcKxISnALNsN;rE42;Wa-6x0D8S%X zjH*qa7+@qmhP2$aD%SOgLr!hjb5w4SMi17s89j+bzeS!Y1$625_316r-sfpD}MCFE-5 zfJlllkrcxsDF#JSj0;lYw3|f5a|?1G2N>YrtncqhTt6*SRpR`qhS!%VTQapeQzx0E z&NN7-iJ2!IBM2zoU6ucpQ+R`)t#}~7Hw)(3&^*_~LGm!1y@XFuX>hEmz_qO_fFrVyjkwhBmmI2mAU`^1tAE6%(t)h9*Q;6*qAW60 zUoL+I!sex3=b7)$Po86N<(;wX=KQSm%Fr|?$v!>RtGqjU@?45@%u**}R}q}mxtTqg zNmy76|o#E#}=0oSJ|=P&9>gxdH&fq2K#gM;NBViuO_Dpi@D8vm6;fl6JL6<13$ zYid7_7&%ULmYObAI%hz(e4y0A!!&*?mar9iOuc4g;%xw9U>5FW1L*kK^SbEt6wHk-6%j?LRj&b(Nz7L_c2j>_ZTM zbx%#6i~BlZvw&BKJ019^UoRQf*;~%&Bewrwtkz0(f%Wh0s-jml*w-tN?dqSKvDLo= zW%2o9r{h-~ITtP;!YvsKqd71ps2ff~-5=UiR&Rs#I+{Z4FEx90auoNSTMU#ATEX9>vt3hD7kEzn2LJ?|{h#2m zZ>t~jSYg&uuZwp$y6?uC3GWap3F>7nNJ{`)8X2;;7uc55Xv%?WPD#XE+XD6BM9;M? z=yKTI@cNEuS(f^#QUh<)QEJw?j&y}_`soDdjf7Lqws2aDPQK?y(A?q&NC@5*v~20% z4!hgIo@T(&Af{PkoZD=B#tN-20W&bSN4sE^qC{(Rnz z@NB7*vBtK%T4dKZ=VnGGX93CbPS;{k0$z_eDoq{Zvxsjwdft0K{)m*fzUup@X59&} z)FY)v#79|5K<&kC4fy+PVuS9PANLzYD1{q@U)ig(bNP!sc^uTEkiqc|5GQDb%^_&E zDE&SZy9Y5k5TCt3tPE|>%+27_p+ z_;_91v0zQI!j}M98W}zBvJ$4}=WL5y9EX2ha%XXQ$g^=auzpZ_xD->}IW?0%H#0Tw zb6QAz7hc`5EzVYuImT%x1&_{S*y3}B$|xUebaE^+DFaoFfy(qER!GbZr~7|jiAfRw zBE;BRx5*D*&nD}27H6WIO_S7wgxi?9 z?D;8gFyqnQns`R1>f0x#WPpf zqfcy%Y4^zNoZbXvjarblG=Ni+lP#sWHMa&!D8!It4+dTm#zK?Z9pT;rzqV`ud-PrN zz)#y2bZo0q67_N@RvrGkh`1b$aB3Vc0eIAvtQ|w1Z11&U0)`tOq@EBu1&aU$N%E z*)t6ehsxbFjaYdy8DyHLuUKj>I3ST-8^N( z(&wuTuwN&(-dca_6}B-hAJ{072f=c;*LvPOT48w+!4vW1MGEcf*&9enxka&+=Oq^{ z(AIC*Rx)WdSdF&Tl(d>Hc*JW^$iVN(mgx2Ap0l>KG-)lfmM5(h)=E0C#jA@G*>8-l zknKgB_vnYDRTLdY85UtGSXfXz2C_K1XnDn#XvG>JE!~O=GVHbmo75NK#A%5yZvX`o z-SPl1ilxmV@(J5QOv)0fAKo^!t=8yvgn7XbokzD?##?xbC0iknY6GJ<^B&*<#+paX z4=gdv(h8TU7O#5_!>+_gaQ-xKE?Fuc)jX_d^9(FIdDP{&mDudkHR1Y{SPv{zP}Gtw zl_DJqE6$_^Ft(VR)kEH5O|r)AVsub&rji}hQ=w6+I2+nOI6@BeE^B7|{(Y(bOy4xm zOAx?KPNd=CzJ9X&v$&$ggJSgCGct|yEa1Jc7boo{(2eyI5KMNDpP3n%0nXl8MfGKRlQBpx2tzZ`cCyON#CvBBk6n9`y_q8`hcV#R3DM_ zqt5*wQy-K3$JHk!{iON{Nk6TAQqs>TI3z)Pep>yEq@PvLutol7o%f$mpO^d>ocxpO zDak*Lpfr5$S;UlK`epU=lKz7FMM-~2{i>w@&3W(F)UQkaH`H%R`djLEB>i3Wdy@XX z`U9-Qg!-2HHl!+lh~Gz`rOUq!EfzfOLe~#ot-nUCzUt>x%~10Xo}rRp;`6Fj>-GH+ z9@Qo`TVOD@3yb}aaiv22cjT1%TWI^yt1r#THXxvAC-NCwzZ>ZZq}@pS)c*&S>RNTL`ZqXgt5suoE|2sq(sM}9BOOONf#)wGokM;e z(7^czTj8~48%)=j+n-kYBKGq{f7XD0?C0-o>?+rMvcZhRuBpQy&@V(Mru zcG$6cd_g|f!O`ig$JcQh!*$gGqGW7!H~rF_;4|I)>VY+iSWkG6?izw;ZjB=P{H6nX zFL(JczzZNLDov$KOoP%IrvgTcaT@4rD6jS+EPkMAk{NTf93jjcy?|56iCvb|FkjbZ zt9vMN1qKXRtQq3dRs$Y~Lg9onwP*mvJ%+{iq7N~rRsW|lD{4ofzBH?K(CUCIVE%Nb zdUozAImH$j78cI>>dWI}RCud7pC3PW9vs`6X-6Pair6M9=#O%c1>#9i-YQ4~@5w(co5o?mi2jrWC^RZ)f-C-O6s`3YL2Y>wKb z?qfI{s3J{1etKqR3LG8RWK9IfMcHClaUtII|7B7OGkBJ2l#AHH;7dlWAH6U^RcM-r zj`cuZimf#f!y-;|ND^t|G7?6I;CjI5)XK^oJJ+sTUbVb>c}=U`nrN+Ut@GSU`5n1YDw)==faanD zW4sJniarndYX_=hS5^W`TqBtGN+8E;#9C)1XtOmKH{QJozhEDZUx*3;t04YD7*k;G z{6)J$TB@%E^>zT=XeGFFn*8sWfd(Q1~Xvbd64d)F$cD}C;!tD|2 zhq0J545!h4wq~7PGsy~glPp*Zfw_) zQA{AGOb|xql!B0$ADx?@$zyfUpBShXOgdE>V@Aw=Kz6ztW#^i_5MQ|Y<3Dx^+fhE{ zExloP4Gw$1jzLh-H_#EWDmT&%1>CnF>dE!;;37^(7Fd`PmM!7751x`i{dvuWs;JZ8 z@cPY0p&+4!vdJxdlUMMjBI6KeY2Rb6k`fy~UagS&Uzaj%)fPJIy+v$Jwgdr-@+uV? zJ4@|fMDr|lWD#%q)3eZajArOMO<&}mwT44`mi{dnE0*6Y_z74riVAq;27oS#P!%l-f9#v&%OGJPZv?fAcVNXxNgq*VNpu1dO z>QTO9meBbNe``r#Q~(8rWL~qyY&u(k>xt_Ha2DF5;&9==0ED^zpggVz1!s3$4{t58 zP@5PO;091DMBwSUZz-T1ksa;Hm&lLr#jl9_E@JZ{Td>YS)^Q$mm`@eD0lBauQ4DF0 zV(z>A5-zA}YeGtJ-FN8{Nat+;mQFnEMquf>EHl7o zZL1I-7@u|&d`;(H2&Dfdqj>%dg$bYKug}@)XKnR_t-cTe$)7YJxe3N?^^}QKRZmQu z9GS4yGkBbqg4z#JBm{Q2S?<$-c~!cMXYotFABWA%C;9FfssD@kb!;e?25T$|6gzeE zNxnNS?>>hUC)?FG07*fd6GtA!+cjq==I}mv1_pU=U*UgOBp{ z(W^2HU&R!*4-O2#VeAn2kx|2_o8dl;GODQEZL6>07d*nE0g)0V{W>3%u>f;Q8u0U+ zL-?dEHHVB}IlGBZ^7ZNY$qO>lk$sk9e{k}`arYRU1)%A{5(*4A$*K;$B;(=i|6c~&=k3rVmWqtw8v+GJ zgHX0T?QXEb-pMu#Kkjb15DOavr#D{k`NXuh3BQiR%G`v;gO)lNH86$y(Rf$SC3d>4 zeg%k~OV7!+H6F86q$0DfVxgC14xIh}4Pb4u{{w|b`Ui9-ApDk;>VSn`Eis3>eJ(60 zSj!qP{I?PdOcz3k5Gnw(q`?FCth3c^_3H?$6E!X7ZVwe$JMC_LTm2?fU`iI_?*33Y z_Ou2CT&I^tGywZ8OGWPcFd<;f6W7X_t26ntw)$=STm%7BH3~>zt8W5`ws)mU0#Pk_ z<&&&>UY~@&0|+-)C)eT>o|tm8`^HF}izBwwE%%j-e@17teV?U|lb zx2?WaVih@STR$FJMb*=~z;6R2b1sY(QDVn9GZ1=-V=(PZ<{ttx(GwIXHFDzw=GAyj zm#gRKj{s(5(2e_+iUVfCZ^@XtQ~$^CKkdzBpyh15Wslr zww72v9xR*%+@%fyUgX*9Srh&h!ZUUv{_h*rn&aRXcZd5Q7zNrUKF&}DiUI3Re*#(EE% zAlyBi<{VtH7&wlzi0%8-?g;l!r{Gi(v#ZI_zO^_T!JI zzY@%MZ1q2)_xwWGpsoG_=T^kP1gJl=%INhH0!YCZV{A?b`HQjN9Yimp3-0mgAayZn zmoqq)K9YA@m)Mj(5*4ku$dl%i)Q@Mv&=V{FI}(iFXV0wWmMQ!(~M7~_dvIBr$$ z;Si`TM!!PH2XI`vw~rAYxn-O5YgIggQA4BC37nx@=_x)0OKRg_Vm{O#25sC-xFZ#a;rb*h?U#<89uj z<87t~X&-@9>?4qheFRdmk3iZbLOKhI?XZ(Tz8C84O#5jkfiy?^2&AW>!pQVRw2MGG z3>`(LXK1H^bQCJ^OwU67o$0t!?*mYhV*VoSBal7_b$F)pw2we~6>9KIU#1?B^p)yS zNnZt3cwT=k?IMsqPJ0NXZ>1ds(s$CX0O@;a_ki?+P@8A^VfAB3$>Rsshwo1ycL=G4 zv{t;QKcyN6;-f<_nk{%Hy%tbLf&8kkww;Jer27y0v5 z_%L{L62EkOzNdvhzZ42(41u!}DdUK*K}tvFH^K~qnmt>Q--dK2^4hlHOO9>B&xvZ* zAzVL<`$sS+cOp&Wd2QqHwAeV@gZl%xK8W-r(jnZx7wL;pBA>q>dQeQq)UQc;PW^_Y z7tn5ApTzT1NN14FBE5uE+dMoiHV-dHp0*B;A$>K{*P))*BYgvY@%=a9`kRry4e8sF zz6vkB3)L|YV zQNBq_nPEJYQ1I8hrj80>2#yIsvB-lL5I2KjbE|-G(iBo)69O+1g z_9=}xIuCeyR47*4eVuwG(RBgItUx@fVt@`f zBOow~!rE{O2%HraI4dgksl!tAsRLDH3tQ8wkdoZ9LYKsvHsf5t*aD_+bILq{91pS$ zi7!LNxRSwSs~AkS8o^`{LLZM~%i($jrvly*C-K2RtO{<}9_IQVfWLG!a01;husAz1t2IyC71gxX$*Mvn0746lsx z*Zuq&qXKK5TC3nZpRdEnjPvpX{B?nsClcyn9gd!QX{o zPN*vhbv25yfOALF^b+K@* z#^u{S=JRc_>7$rx0RjUc=X!wUNU3-T%v>8Zw$-b#xV0>`gwr|=ZA6$#zkJn~MkeO- zrP$)eOSXDVfe1U=54Ij!ldE)yHJ2;*w$WNj)s6dY^&E}L>$sN zmJ2L-Rw{{xlR1Y=6shJX{l~)5-djVVjDj?fsq%a6^w6~` zg4bQ18J|PU#ry;qVOyi^zYS zG=agPc~O9EPLcg6k_?+>GHj}MELi3h@a3)o?|lfk@WWE3M#r0-GEstK$p$1q_(^PV z7xds+dJ+w;+0mTX`INH#)@sYGm!q|>K*^67r6#>nC5jl@%2JOyZ4Q-MU#!$uq14Av z>Z=zlHRY7r;govZX=}Z-wWe61uS21)$H2b9D74;dYCZTyX{XSxqJ>r$EA&k$^vx*r zEejT!aSH8r3Jvw&E>`N>QR+L;|92Xt21m6=O2yIOlzLF|oGUD;9bZt1FQ{5gC2?hG zvhF=7^}SM}ChOc15gQ6jF}+B;@QhwjDC0R*H?-zyRsW=RLQ(-PtXtLxv64Pyw9Z^f zS#VW3=ZO93l-iF{EAeh4LOSXqcRi(&{#w%Q`zYwLACofM^wZwtG~xh1g|bLm9tN+L zTMZ|(F1>;gfKj@Y!%#MS1`pwP3SYFwWM9aUW$lmQQ-u$CreLM1FW^Hn$iKjcMv(u4 z4;hwx1_qGUGNd$r{9Sx#jQWfC@Y*}^fg-fENvSscv~JPk-PqEEUNwJ8ea+1;(fQB0 z`4*l3sGDD^^KW(Y%XIz`H@{rxr``Mtoxk7BuhjW|H@`~fkGlC*o!{%`SL=M6n_r{z z&4D~KEo(89>#&s8bB-!y-Y*H~{uAJ9|2X#Lr@+wsG}xCvi52xzU^V|Vn8}}2Pr|#- zGwKQTOJMi@3Ua>(Z#v(?mA`}^oxg^YmwyF2^xvQ)TdlroCDhMZ%hk_YtDw2LS^bi= zO?}Nl)D=!Rw0Z~5!N%DL+SzktwjJ>ZvK59HprsK)Q9D^129*ZGUU z+?BO$eNxtqvbM?|c}m@&my5+9cTZGpo(anu3f)@S&&v7>)-8helP{3NKZ^4=DOA;J<$e0mL6;!v6%$k-h_W zNPi9&M}L8Tf2IBrll>p+Z>@Uu_n6-Qh3WkVAM99LooV!@?4?Qb50gX@Oa(+R*kG9E zdYrE>2TO;nkPYA&Q3|j@qyW3%Y-%_1cfc>vL8Nyge;3kY5UaE!?L>MU>D{<~0%;wd z>q9z;lHL*Kvfs7k9fx-VT<}AgQXGbl<~gTk&Y4JWi2w7vm}Jan@Gi0 z4|Olv5imfaC@wJ+j#6rfE?sPeqkQcZzWxF>7q;Gjb>*UJ)mUkCKvyBG#|rG8By#$g zT8j0oO$;gbssiJ&A#7s!y_xZEe+LH^Kg9paT8W|6x1$c=YAwZX>tLpvP{}&5f7@)e z(N;HNdKX+qw%Qb4Np+XJRbs2nnu(#giM#KM;^TSqsIBR*6DKc{SLIddwHUST-BwmJ z$t<~Mfl9N2lU|r06_urINs{*s3(shJwy-k`+3mr7U|DO$gj!{?7Jfvs5CHlbEMOj> zfOE2)Xw8OU#diy?7m;Hu#bs^H_EyNf-zLYfE632`%vk_^oUj02j`6gzcI-shagCO; z6fMVi2TFM-CeH4sc76>&ZmuM zdI!6^iJ4pAi~Vo%-UBd><2)Oly@D$^6oLRru!sN!HUJbmDN$?(;6Q*x6ACGil3)-3 zMMxk(0iY7k1~Sob zJZf;+jHo76>TE`V%6PVOpf5St+QCCHSUhkj)!*MMFF{Uy4#4;?o@R=3G_{7DM-uAD zP|t~;-cvn1Ql^e*Cv+Yu*E8SAMkVxt7-FbXwwBo~`G{3^OFq_e-Az7LwS7vqYE%nu z&>V7wnk0RU*j%Za%v#IlDm5Qeo@HS!9;sEm`_w9|rjcN9B<)1WE7m~0f@7^RhKdK) z!gYtUM)_eRt?lel#f#Ue)#~cg3kusXyLI)Q(g&FG0S8oO3XTKn!3D%jNA&GMG58WV zdHc{Nb*R0wD>c~JE#KTx{T@(ynZqR2xVTFy+06qjYTSXr-hLE%=8;zHIgG0=Nwtmi zwj4)IS)OUbK9^^D`(4LV>KR*b598`~4NvXtiogegM{C!BTH6j-S7$pXW*y<}S%wD;NIg(MYPgjEN0vw>7>MAC82VhH1E8B9JM)#bEB^v&1b$K& zG9N!SG21^kJJxV=V5GhC&Qu#|A!{Rpo7d6_0j8-B717gV>M&&kQc?$Rd{?@^b;R zX^tnAIkW1`yJyYkRDhVN!E=dx5C?)%+93N*wK&Bk!hTlKh$;%DYhRB}b@(2F+65tK+o`Gg}-zF7w1MK@qdI{^?bYF8=EP)K6tCH_TEtT2w2 zd(|J$|8Z&c^LQM73c0)HSb5Km>5O9z`}uWi9CNxYA`VDL*L6{D3RY8Q0$NCTpCw@DqD7$Y7AUDJ1?DD5~|$>zXndpX!0&;#%B>RnE9R0 za=^kOam+$gKx!r$5lR1(t#ssQ6^#HQ$FBu166x z7iw4v%m=y0N4%0QBBPxcZn$bltwVu07uz<^(jPSM&@GnPgy_Snes9vh>-BG){;k)) z8}#qZ`nN&Naq;JdV{65olcWl(WdDHRu|CRJSE#GHq_LqA+V zIxz&my;I>uqOcs%8py>2jofmOhZv3}sQ`1cRPV3v{l8GSQ0Y=o#ih5OOtt^pKlqjB zai3kH4B;nW-6EniLS0T_Rwp-e;get+JKdH(T>|1|St@8?ew=03(?xz3f&m~#lG-9Y zHy)J~mm1Rmm;hQVsm|m34ttmM^=BIzd(nfRLRv#bc|2qlWRe_cjGE6lUfUYlHP(Xb zQ3*kvgysz{{w))&k*WbruRyMGgRU_*;K1Z-ClJV*#p}mCWM(b_*5|9r91y7qvkcbR z=^D=FFj*6@3~2X`OB1t9&_u7?X}6oCeW~HDsL;B{?uH5KOAQV>^BN?|Fwb)W3)Z;k zcSd>xHN%58^N`mwN?n8$t_gw2JeY|RFuWoh1S)73=_&%C*PA3w!ThOLa(OIlrhvp> zR-k8zP|LvGR z)>bmEOTnORa&4nr^Tk$=4Ggumrc!NGVA7!xa2_~6tE~kdzu=PgB!psI7}2Wj45@UR zdrx}rJ2}nDhe|Cji|ghMJAjL)aXId#dyc5IZk#PpOI(KA>tlhrG3*Zey7pviXICd} zALZ&I=KvkH(V4+)>B|RF&??KzIW*4bUgq%u9#3>9PozfDYf!RfU_g!*oSS$MsQ=t3 zCJ|y9I?PU9s*^xer6<4fo3XvOKFG>(ZRFL>&|qgQ^35crk^;J=26PHQ4m;TNc?=)4h*09a`7voW%wtef-o zoSfE$E;8I}U8Fl3gegEi8LF3vf@nfW1r_TuK*&OCJATP`h3NpQtc=v|Dqg8t229(G zV3ib|sq?MTosa0w@zw7WkKwLbY<-o?=&8fW7J8a%2IY5gR;^#{Ka)lK&04+hpENRDrVew_#Sr$ zq$f4sE8Ir7XMJVlAnWt3{(y+Aeq1ag5OMm$2d`8`uApEaWgxXHm5}#-v_2qjs6?}R z$RgaCL4;!N#$V8Ya##_#j+Ya#KnJ5Di2ttx&#}qB@jv(Po-`!c-p&=3>kqE3irF)8 z7Es;$6S&JS8TYP8-#el2?MP#AQUv0n`tNqI@*e5yozETo^z#rV_}PgI^P$k)yU4?L z&rDCw&&)RL^e`uIQHV40yp)mWTg5hh-BOAdxPyP~K!#6C=E{`}-z z1M-^Zk1ulF7(7Orp(zmAC!Av{2Ddy$(ik)z3KW~ z7$JOa5@M8$!;kX4sPydlGsU^*VfVsd?uac6ibUban2q=4q58`~^$jSHnlS96)b!ZY z%p7!H-4pZYXU3t1O;Eo|52>;Q$mAgurW8jKu*4;yETzIssm2oU;-m#$s?OYxm_YeT zI5y<1_UxKV1Cj|ClKJ3ym7gVVA{qAp_JX*^u>~SE$Enfjd$(ignahNV0%2#a(ecJE zkIs*s$J1F=5%-rjkdfS4ZSXEI$Bnhz9n(cI^P?dPgz$GIq0i(|BBYGy4r8 zw8(gv-F%p{Mcu$ZDoigP-($r^=ziy=q%$}>IyM0wL&}%Js-(9l4JITvlraHk`0EJT zRPU71N6l(%hBi>KkjrpTv5>zbozE1RDFp*b1slE5nFXGlhsptu!7N4%(I9#U9MCPW zYh6uW7K~!BhP%I@4uzhjgVkeTyl@nkl$>h*;^X3Genoqlzqsv%$FF~hr*UVnvc{x?YB^CGO|eUkxf$%hfKV}pGYe}nrH{s}d z5pav>zx(^&_~B(Bg#6r!>xzc}4^8Z536i~WEXzJ1RMzgfjYn8oi<0_2HfV&R-B~t{ z@W@eqCHd9DFI25fMMOJD)j41bNRerRAh8F?;rY?&@hMoLU}h-kNcOaKr84MKeq5kL zLfMmhW_o6R^4!D9Vni=L#OaM)f`y8O%Ps8M5GfDRI@6>*($hQG***+^u=d{m?j)C$^bnb=B-IeU?qgo-aCo!hMBI6BC z2i$wH49UGkVHlh0$@iF-fiPc?A{PtdTNckKSkM$$crT#~(w-PmkO8=G=?1cK2?=oY z(l5FrA^=nQ(kd}C#&s#zI|0_Ha=M)Y1*%%ERAMSdfOe%fL<7vNlKLa7m@`JcMZ zWn35eOVY!(N=37b??twuWR|~JNqEdw^5vsVHHpd!vlT4_Gy)64ol{Xhn!&EYt$JA{ za%F{{f;NTn80t_yC8GE73Pm!hSY;fM0D7ln zyb^cY05Y%*Bw!aP(0&M;tdiIY0h30!JrMqIe;j30FaO$(=Ofi=1Fc#Ggw4Np;u%R) z+c3sjDK73tD}dgV_gJs61|zS)9fSD23BSx!#<-?R^x5VmGlxF@*KhqCR)wGK7{E6? zxv7iwmN-1Uz7WIL7y0$;Z2m?Z(N$lHh%b}Ae2IsDlV86TLm1cZFplagaRhn&ZbbYZ z8~=-q-)9Z<{~g0$e-IIW7{?p_qZs1*{v;y)pEw@uODJv6-#_EmpGU=C@b@p{Al!e= z8~zQ4c#%W=Et`MGVgH`TzRJJ;fnWc~udngz>!p~+H~96+tNh ztcVrBT&y6!LJ=z*wMybpO8#501q;oC5%jjAF)L=p(aS20T8XGthN)ZSadFtH;3$7;v9G=w?Ln60q!e@%F=@xiQ7Q$oo%w?~reAm_%{GH)m=N zDY;_l!P->lRaWcT2__<~Y*>VQOL6LrGPNMB__=oi+J^l_Fcpp2 zOR2weBue5HwrVGRHQr7xrZYG(3s6)_h(ZbKbG&>Ee*e_uS!CPD_x6mE)xmSqlM!p< z4dXmLS`cd!ZU&SHWC{Kzt$V>6DZ4y6Ip01rt6mXumlnwNlXC$|X2)hO@eTRlb3?QD zPe5>1dHfk@Vc3%qAC_+o$>Df#M+dwwu-kVtVZ$U39E_MCrlYFA&}%ZVKrOZFq(Bs!rCszb46EX#i#7H zBVz4Lh__f!c&&64R!aTba%pmEoFsnr&@?2gnR}<3!rE=^ z;TMv!T4?RFwneP{3F}ttwuE)Sx;cIr=j`9ve%vCNqo;@wMPMc)>&&JVx3E%sw1B2yfq2NWoVij>ALxux|xd;({(U0 z)NM(K4~Y+R-uES}`>m;jbpelIO+cK7cNdsNMIvR zDQ^oFqPb2XUW{CvPJS6o26fyHb(+7x?wJP=Vp^$F_@T(vh^KU9p+3dqe0P{zJogc8CM`J4@GmL;p$pWTiSb$sfy zc1`=-mLhi^=R7@n0fft)J}+%Ey4geR46>%LA^j^!N)!TaEeAtstj+Ceh_s1<{SD*F zz{7L%6BkV5RG-p%1C%a+hL%trHx1+n2Ockyb1CXwcn=-d(tE|*L!(7q) zJA=kc?fVogXu0euC5ml;cChd&NN!s4%`zusXnNuya4`o9aC=fN$*tcknRsY&ZXWE1 zGJ%BVq$eaA(2BWqpN3*HVqL*WM^(8H-DXWzOdhe`1Z3ol49BPLK1S{K_KfuR4hLKx#WFr=~0$| zr)k&d+`RT4a>27^8S?>bK1ySwiJ|$)DbPru_Y0%*-LUnI-aFAgJ98m@TVm4GZe0Q-+n$K?&+A7hTkro3A1B$ z0}z2EfHJjDuc~)PiHBK2^6Eq~riZ0%F1)mkOa&S_KciiN!P|N6X1f#Tjf?Y|OM`e4 z-Ua)6c6<)xk zZ7PKF?+c(TP6q_Fv*%>8tFvuHp)cfx=wftz$;1PfMyIehTvWtfd+3Q?IzvzJ;w8Yq zt>%jBc^Guko>}H0yi&q}UEF?!dcU1B4jSl_ioEvquLAP*{V5kR^% zlt8~Qz^%K?-g8o;ibL3R#wM57MCNCbtb0sg+nQA);do7~?wgs*iN_!C{|eod)_ygv z_myJY}j7a{w<0dut0-g!;z#2ek!bxrKX@1E{!VlRI8 z^#B^N{QH}lw*{URx0c{_gssms4j%~7^9U(tZyUz4A9z~aepMWNRvZe5&x^ygp)Y>s zKp5Y(;TLeXU0A0++@lZc#9#FWHo)>MunSQl11m8LyX+jSxAU;9K8PNdapgmDr5d>w z$dch8g_z5s49* zne(IgD^Ahl|JZS@F93WFgexQaN~+rSMQWLo zITflYu}W$p*xl_>MD{-^j@3q=79Ed?UFOE_)ZiLJXTx(*OrgH5&ZX9Y4)og$FdM$@g@aBY;}%sci3pB24fq`lpbDez$CB>D&|%EW$6q>EkPK@Az}% z4gR+H6(p0rW^F^h;6daHz8krMKMb?^FN)u>eqVgm`cv@_*58P)NsxUl=-b@@Xd*lW z>sc?_z>B|#4ncD9*W(g+`4?2(m}}7bE95eMGtj~v*4rgI42vP_$0fLzh+*rknB_Ro z>$EjXH90odr>&jTkORJ7u<9i$jmyojT|~YomIGC;T7Mk{1rcxzH1Q7j8;ExRm-6?Q z1w0WR!5^RcA2EN>z@ZIP!)xU6UTh%ZC?;+WHa#oult{3<`Agsz0DjG&a`NCQY=)j~ zsyQ4mU&Lxrg8tuxkL5oBEBrHFz`tN?ehZEy-%jJe1}qVAKX>^Kd!g``TBvfoFwzLM z%cH{j9^EKEB`J%|#r!Gw1ol4N2oIZB@F1uAtN>^GtTZY0w!JF*u3Tu%i8sM zQTDW`d;I#>$dfeVg8e}Y`}XdzI3-)p3O+}pg+0VC>Ef!eTO&9rrsxif|H7;I4rce? z!0O)<`>>vE0FYjBT@2#=4qGg`NR9>hao~sZBvMfaI7j`25u}d(99|tuNj7NOM~asa zf$t;1UPL_gT>;b!07Q_Mq-bW?R_HUhG$0AS^0{3nZ)S&WJwuX$&d&m7y`8Z({yJYn zl5ExacC0Sv9%*bkjm5~`UHSV)kY$_XjI8T(U{o#4;(27FmY5hUfT|Nv!a4yu^o&fU z`3!2DlJqzw7>6u^N#;L~J^}G-AO!+!3Or%Jl)MH<`qAdU+r)Q~_9+IC8v$cufzW&x zgeC@d^*>P0GG?{Gp(cgj4)I;9vm}OB_aD{}+G9A5-Q@POo%_=_?2Ce=^TRv>`D6lR zI;V=v8x1=fhtt_1x)mYJHA&}MG=ic9QHOB=P6|G=Ja~)|CmlS~$*<$3=x_p#d=b$d z2fuwNDth?a%dftuxC0J8thH4k2AS$tb{vX|lM!($BJPA}w*(dE^Xj2=fQ5WwNQ=?) zqjT^hpM!2j>5EG#pAOFGV^v6f>r(1aQBQji{fOY5F+~TG3ePn-Gk1Ps3Q9+hx!*0z z5Ad4ZyD*6o4m1P*pz?tZs&9LlE^??9yV8?IDsT9S9530|+29@oj z0D<7Ud_4W^uy@|noHV%X`Kdlf;1$O6j8r|{flqP9;nXE_yuPHo|nQ_K)Nogo~w+WfpkwgF$Z{C@S;ePk3R2tQUo9X z2O$85dbX9oX}Rh7=S0bYP;g(k26FB59~L#Wp_*`0O?VfI>2nE3S%_FW}Uw$3z)>RMql;;@r6sOooZ9MkppWfw|ob=BW|lV-qO*Hn|Q|L9D?GpzAgjNbk`r!oO5Xq!2{yCP)DR+~aNN zwF9Jf6~t8LC<0m=kfTyVap6Ig>A%n}Pfhfm-x8v^s zbS`w2W*ln}vh6Kimg2K*&$PX#67#`_j@>5e^=dMA?;1ey;mNTHw?DP`**G45fW;^V zSx5S0DZWVbSxowLDZb9c@dS4P!82ZGfT!-1mP8oTESDlN9 zd!sA>S}ovPhVq{)Rd1I6jEd=~nBk=td5Z_wbCylk0gY3!7!jA*^Pz}%I3ivP6ZeR6 z#E6L3L6tqws!bOew0N5fDR~!Ra(eE;v4(VSA}gD-*-=Q3?Cwd9V?ogd?-iOC#35*KT!g|2ZtH^#oKpS8TFIO5U^pfCF;TLo<-Kv1|<^1IIrHS;B#Klqg z^Q4)<4vP{>+V zU7VeGaB}9-T|Ma1h9(4xID0V(E60e>PoH>4LKBHqM~Z-(oh zc!W6%9`$lT8P@Owg-}^ZwLq{_Zg5LL(8Apg@T-lFuwUH9jM*KsA}0I<9aouttTSFu zdcvpS*CtwrLhbJ|PaKR--0M~&8iln_=IxO1mXM{}iR#+!z zA~vA9FEC~*;nqCMBAs~LpW+g9iEcV`cA!o;L2>5Nd>sKB;4Hn=^s|vC9s|a>S8~Ur zb<;D`+vttN%OtGb5}`jRbi1arZl2*2?NR^TfkS&gM{;Yl_kd? z9KATn6h8*voY!^U?tu+lCC!-{AK1IBSVRx~Pd+}~_Gj_$(C=}sQ9e*a3qbDGGB=x^ zG0+JRX$tA#-&P!PavM5xpb-~9+jQb~PuGm?E$yGKB*0mRclo0r;cM%qS^8w~iGcJH z_??~CPicv^BA?DQ7u#|P-cl}krMwk%Vs>UKeZR3H?^iS(Q$AF9YJ*Jht*1#tnznR+ zYPfcgZLJT_O-)Qd_aO7?OZORP&*B=Di2?q3;4AGQLz+0r1(IEC1~+QS@V;KKkyN^= zGM!XH8dYJ)T`Ef~sdslQ%ibHgomFLCC{>e33AE2VCX=3=M|EzZUmd%guk1?hcZ5KhrGK| zK{o5V@59w7Dvb_YMDz*#Hni{F$|MR*;P^AZJ%t0 zJ+4BX&oaekY9)h`?N&RJsEXj=6ZS-*NM0Vwx{OALpQrp& zJzP}-YqOSrxU?!9^cZf@i5GVq#=tH>3g_C33G`taci`xNvD7DwrG^^3vThY-n@rF4 z<9Jtm({~uN4H>hA(Rn3gwpGuH+Cp;<*>hfZ(}(n7GUn zYkyuWb6;Rzxo#ZC>prRhx}HRYah@ZkpPhhOiVYDY9=YJOK^fb)PSHYe= zBUkG%mf;FUMFMP$e<$DoseZ7|ydSj!bVd0|i5)-!u+p74%e?Yeup2utKVl3d>HGn$ zZbvMuZuR$22PuK%0Vhho3p^PhGpN=a00&hkF5j|7`MPYx-)!?e+^j!5CjSn7Qs>tr za!`quuK~}09uNHmIdO&Ux9CYSgKiHdM5~g-ybZ+r^ioiG-_bt-+Y@63B*s))q~A5* zCaebx0N?Pce&|?Kn&d68sW4nUfnU0qtiXFt;A3of(7X%Zpq8# zq}hGFxL~deR6e&EGcdKKt|v;k=N@9<4*49(|CT~ed|`5q8I+-`mSN%G702#J$eK<@ zW-CKV*)Pq~A!C!nAL&~c@VQJs5}u`WP6>!=Im>iQNenW>%o2*}D;zQ1hEz^HK~*o) zZ>&gQFUa&8_}VJgL?{S$3S|E{!9*Ne^X&nT@D91LQ}iUbaXI|P1a@J60%U*CuXM+5 zL-}38Gakpq&nk&9A^-+?1E^j)p|A|9_UVCEz4n$E%mO+^1CwX^0I8QiW?U-qwp6Z& z+5wiBDNZ_Cf~6`}A_puLmO#Pos{AcM&<*S=e51r5)bsqu>SD@VLi-9WD@aid@~W(ieo{hcQNjA6KFlI_S{98FxFvI+JKb!!9=iiXz}U|m=B-eCeVD9BCP?!h?>D0 z!FZ56*a^NU+z6J7-Yocp)<8N7!O2T{L4BDrTNE-|>{)>ll2=8kmMNS^--=1G{MjwI zEz(?qzH>5)eb||v%uX;COwhUo=O7~Pz@I>6dM=q#BWDAtF`=bK_Y4fF(V516tkA8v z?QOWx?U>LZISpHCRBOVU+ft)S)ynt$lQ>3(tXVBWplL14Pay#(+{}lkX=&S4QK5uF z-d#z{6so%L-n+5Vee%xA3$r=B0L_qR)!U$43!h8$SO=ke1(t*Jk{(DmN3e{DYQr+B zx0Hpi;!PD_HEcX$Sl=js^(ScVk~}RX|K;F3tG#^G?Z5XgZ}sW>PCVHZ*=T{w@^{Bust1K@CGZNzMGi*Eg5tB1-VBaW$9dtBQ zF11kjK~(`ED~Dx7Q{}L#8wOmL7QXb9oQTxGBQalsZ=W@y5S9$1VFIAq%#^>kBmfF4 zBVs!uo&3EGctw~O>hJ~L%;R*S&w!_5JzB4wUZ2Gpik`_G)Wwhz#cVP3>v$$9 zkWnV&o$RYtY&m{9tFu8~gf3SUXipWFB z9P#U*3TnVTa*~*W91!D$m6*iw)OJ2*Oo@_(n$oKD2o5fIT9kM@cNv|-x-&CJ6Bn!o z;p4MIMgd8v@Zy5uAAIw%-v%DwXFo19fy%4Pb@r5zcEy7hwzI^|8lnZ@22@MYxM4MM z!)j57Imp`VOMwfK?H=fzcH>r5eKl ztkT1_02y#tB7;y2V}_kE6^^il~x(P z7K>0*uqZq4ma+BoXB%_P6kA?{x6K1k(U5bGCO{j?`L!DUKm`PF*L`HA%>tD`+9u95 z3=MSj_Cq8uvH#FUpTab;pdf_dK{r{SlK)62>A^+H;1o_MX$+>lsG(=mRP!9JycbYu zQ_T__Ck^EYtN_9hj$mZMb)<34qiMqH3~?WB1(hByP!yA;W;q0%x+?&M)L(Mb1h7#^ z7n!O!h;37fK9sL&y`(EvUwiGFaK++hGddK6O%F^SgAxyp(oo@H{@DRZ>h`>JMkOLv zJZUwGsJ9N@iPXPztr?L8&cUimRTT`4bMvFqit_|{MQTP-=-a$C~z?hqogI0nQbNAGDR9)+!oJn_;z1nti z$fKFZck%d@%;URpoaoIv&K?{mfZ4b2>6PV#M%sE$^>pzmUhpxjV_EKXA)>se%Yak5JH zZ|fY810<74oVkKC%iJT&6Tq&{EoD)lwp4p^2!(-KdwT{`cMeLxM-CC)H`zMac`}JN zv3u7@OXpzvg<#)hxoF=W*G1Sd&il5X4@-8Uvj?*WwsrsoIi5LzBodV1bsy!aTJIF_ z03*qPkM%uc%f;eUzbRee&D9|1Xm*FZ{ZF3^U0+>hQLA-27DQmli z#oaJMDV(-(d7trR<&as+7IcR;BEnwkl=sv{fm4r>#oa zJ8f0U-f62+_D)-svUl35l)ckdrR<&dZJ7T7WB#g?y>nibvUl1?H~Xjx2R5F{XWN8AK|?gMMzjUN2aw>BTS7{AbPA~ihHk{sx4HPgC#DG04dx6pP3 zv8R$%UMgATWtrH;zjjB&o~WpbifWXSj0&X9-AfzOerCak@rjq*1{)LV)?rsN(aovZ z$@vNGUw9n5ZE$j)HBH7R;PWGS5*j4ztneXaod}$1T^d%ZChG%dFjo8W%2c`5&Ec`M z=V%^nL&3u6OzP4;IWaZfJ1Y|fR=E;PbRn@6ZWqBtYK3xWY;P?0<1c&=njQ*?bKtkhhD5I^JYDW z%wYBpL#4H1%bC`!0vb}3j*iQB;Yrb>R>i)TJGrPkW4%X+7{34xRjKO9AE;F8;Bcfy zlPVQj>%mq)ovKtP#GfF}Xzj)? zuxq4V9)+*QsR*Ys`d7o$%BR&p99Fq2sVc`*=Bl+vUnYxFJn*UgwWX9p0{ zH*?iK4rA;RB?WS9C0X7A{I(rfZHF;tJUu3zR!mO6e$B$V!mcTtL`l(8r@T&P7+5e-~b)>r133nB_UW=g;>%G{1%R@sGzmB)Sk56oGl1(mAE zc!UX5%0Z{dHe^|5S5Pbje0^mGN0sY6dm{@n$VApRS!WV5rIzxRAooL$vpkQVZW#}! z#R|mgV3qk|sQq98Cc+Q(8${RPPz;a+dh11D>xMsa`CSkh`6;A(bGdqW-WWWbN<@7e zWbS5a;~OO9;2btb#FmKIij{p5wRlyv+gcgfv14J(KTM)$QW7Guz)hs zS?v5_(RR$kkj&w^JR^rEU+v-i)>;=pWaTt-S!Ei`9q%<**)_z0R5jSBlFkb(6Yat- z-h1&8!2Fb8hjEXu=6=SmW?qi~1YD{TsNEzpqzsL243BDainDSse7y(5lj9`^NzRI$ zk7H2sndObBQx~`j29?G06c@=+6c^cui8SHn&2luQdM(%dGp|{LX_4&If@-L7lX~1( z>p*Zwb{KXW0E-5Fl_W&vV2@qK$GQZG)y)f9>ooX-)SRQ-_R|Hfe;uj1JFsj!|MSXfJFT&gqweOz6 z<&+xJDNu;Q&d_I%Wj+Z|&SE5E7t55;H_~_ofSCYvLL;0n%Y44cNdra!w>_EQ)P6FU ze?5x9v>(Eb#5AisNcyW_7!Fo&*5>ZC<-t(!fH`oVz6i270rF$`RHqKe|~nNV-dT;vlA{vL{C&~j*6{udVP`wKyH_M(JyKF zb^ME=g>dhBW_sBmhIsO%CiI&t@kjh;cRYO_D=Ph^@1)*pSf37lUH>6aM5Vfy5T>tyDICxohTf8x$T+;4LD^ zIwtQu?;MP$`g&VCM%p^tp>WCMT)@frQ5h|WpC}Yz?%EJ0M`2gMm3kOHib}6OE<@rf zmCf8ahc%lWy{vth6b4%iq9{LyEF27#9h~8 zMdTx{s2a;Wxlqd}L@U~BHibq1O}j4OuPj@lgfXF;u!K=cQyINys>Xrf#iFVc&{ zQ|FmtrZWN31?68mOONKNW|9E0K9NB7sQZBxWI~#P4$v;Z$%XwEj?C?qkPozA#i3TB zY6~@WuIe=}I5*3N!pIJIMrAP}D@ENGkv86#M6t@Tvl)NW#gc|&IM?Ak<)?#^PC)Pq zKZjbt!KwhYV?pS|LW=X+foqg({e;B3iZE0`1IAK^cAz6ingQa5P$uf3(+Y$6DoHlh zRo1<(T10;6N02M7u}=RLSDX_ER_em%(Cv9l>jktw5ANvKBUm|*E3s+yqm^|JuX&UU@TMfzq3pu`(27vCsF>J~0J~+w zD@v}4Drdcw&hPI)Apag@@~hxM|3ThU6{Xw+l{()mBN&fLEhkkdNx3A|Ah9j@D}+9A z#9%gI1~G15J)<)?Lkd-c2V8!1J!UZ4QeQ2qC#%JZ$zR5a02He>ll*O5`mdnh|7N_8 z8u=C&qJ{dy7@j^sad}Gu9=5x_(LVWpz(+tq8p9|4j9BG7paQ7>GG0j{{Yp9zkD=b_ zE4|x zHwLx=kYQz9o^GieqMD*!yapOqE*Q@#DrXL$4z`P0u$PSX)b_5{gJj9*s9madu6aWtW;9h{jTo$5RP@LWV3 zz&@2%cJ=mv0ug3UL@AChe;n< zX&*^FG>^m&6XWSKH;x%9cfVLmE2U(||n^G5$oYM19aI_R=y}TY{^2uR7GE47hI_{4MQ^ujh4^xQL z1<)u*l{7?HX^vwI1J%*+c+tN%>EHGGw@&}o%U^0kp`yg~4d^w77Sz+?w#t}`TEmtV zqAe>tFdV5W85oXMMFxf|OK9qUB#Ae&xL}d&bK)aTxGmVIItANpXpL3_CqXAqVR!x^6QKALs&U#-(9ATd^_;I z)YdX=gd84uJL+!m4Ek4LH{v#8IVwh1;+LE_-WR@UZgXNX(jK!!coN@OZvpzV@l6;g zkP6WdSpIt5`GiJr_0i`<0Mba1(g;vnn5eCUs4W82_Kb)sMCJ_qi-77yG=$HpKv>L8KXOJ^Zex@$ZgNSaN zDt396iDY0dw<@Wv0Ai66ca~wz=L2?IjNT<59&i-2EsK8-QdjGzPE3~PeFdv+gCM-Y zopRGIP;DE8WEtEmM_6LD?dmtz53YyA$5J#6%fB2w zh}bDCZ{d}3-|E;0X&xeLK{F9v1Xv6Hs&oW25jp7y+BLU8&ptzU=}1FRLMlcf9U&fU z2En&EkhMBO9FqjApu)>dMPfurIP5GHiNRZeXm2wHutUr_0A(~XH!ejYRaY@*6e%YK z4+7a9Lh+2lawJ=kXy+(^j3P4<1f&!dfc!)|8FSCYp|qu)tQ>z)jSG)z@L@5?mwUj6 zdAOLmAN{-6`~^I0`0uKijYOTsJfX-|rL?=b! z4QhnwCBorMwMz-qE)l9-qK{q`v8RMKpKvgxcDVy;mwu>S28=;#^q`K*2?aT7t)c%w zKW@@SD40A*<2Qf*k=n~}!{cWUI^@UhQZ#_Rx_@w}kIsP}WPuduD9!~!N6^eiblBMM8&qK*a-!Gl#wB~M#XJ$EIfOIE#gp%D#}x7?}ZH3H(tycGiA0s7p$n2Suyig)=Y8*!TGf!(Rve zW9Q)}+BuCfvk_*)S`Zf;=NP@0=4Gu~IiRkWedAczQUfHB$lCp&9*#Gps@bcY0LOx}~@cm>b{bjrddQegX}0%KK+cZK|_4ZnH3Z zxL|d>)~3u3U{pwDmAznk>$X8pTG|8CX4jry16FW8^O zFZjDt|2iggS_o0fSy~F=C?|hOU{tbPvTu)R0y9%tl}TX=YW{~SV~BGZu8dbD@LgI} zhVMjGIljxPD)3!iRf+G4s%7}Dtg6EIva01!vsEkZnO=y>Uho6hwr#>S13Pq5P8^|K zm_Daz60RB$t`#I)D?zwcJtb-tAI!lNAB-0pgdbQiXbf7T2MxezO(L6;JTkf874Q~W z2f}p=ei;C?7lAPQ@VgpLTt~fxEPVY}j~oH#%a2dH!2nFJscw2vdg$18no^bBpxm|_ zAbt_HSfzeg;W8kEFAq&VtcW#bV z1`yf^#KpE6DP8=OkTxGGS9IV~Fq=N4VPFYz%qmpBJVSG?H0f3P_;URV4-E96n5%wQ z$X{yI={-!bH>*aSigu+@SLQ@p@260htx;#^yEWq2U71&<4wE5`g(cEh7%`27&aJjf zOsQ_QTVqQ{$4;@D!8J_IgMI3R8Pj|7Ywv5?{W|E=`Dw+4e(0J6H>px@KxsIGHSz3E zq*Ou{l?ZdF)WEfQDRv9oqrosK*pf5I*fD`V@@U4SEOEsDCd&3y*i`xU3v!a6xW%H@ z&7bAocxtRWs-k;TI9a`wr8BuNZpC@4xw#d8n~mXTz@~sEU|X20xE~m1ki`H+CoHvH z-Uo_d6R)7m#toHAL4Y8}XC*)?vDiZPN-ltwny{ib$Kv*SL~JXNHPPYv?PXXTBkyC= zdN4_5un>e-P*FQt2=2vDx^R0}$zM`MmFSB;B&MQP$M?|DMk;D8u*=r_q$qK&9KiH^HEhjkbqz;TNaNGSNLA9*O{77k4HMqdSWX5N`VF86h84oW1iuU{p|QCF zD%?shK^*u-^|#*&V#rTB1}G9~4E1#O_Po+)Vpz_~i+oy&C5su)=7%yKUF-rD2%WYS z1rGUYkn{Zi8hwPh0?=r0nkAu+;_5dB=0F?yIj}%b_mD`K8-mRGz7|$_5Xu5XQNg9m zPvGX*psnkjxX=l;#|B52Sd39NaB)&5?v&i1FSpJNI<^#|UHqc2nx34QmT8ZRrh$vz)skcKtASe>&0jjYr}8O~%GqfIZTe?M$7Z2>q-KilAz8VF z%CE*2Rzavv-dkw)q4{T|#!dJpYa0UB%3gk>B8BG+1_*M zkugbFFVamWq=UKw6HrN*@G!?_N2f1MjnYtyYn@BGCLWxCXDyO*6)$#FIm7g$!YIq1 zERFo(&qCmUF;->K+ApYtZLZs;{c20FERrmzQZ%y6rT)sBq$3w`SO_je6_$e5gS4+o zL_mSkY|;sjIAHtTrlIlGDbM)w%LUF=3PUQ;n8TPtj}tIJ2Na}!fvmyb^^i9Bd$Ux> z(JY|?3O4HBO=&NFdh?T<&;UX6Lsp>)waGN`csGd0=b%1u_&=7epwL81g&JTIEepqv zRL1jp=w_%B8G%3xL<|;)biOR!T1i;{ZQS+4^ADL_Fcs zBk@V{w2o;#B0h_bSzIh4;&Tv_-4R9+@syh*j)6QrRd`8Vw#1 z@eEvbobdDN&YqLWuFf`HKzsy^p%jqqLfjxrPbHD-mAPh9Z7SHI%#}bV$n^t8m6!Fl z98a|lj_iP>KnO3F2a_%EgzN1|F*~lf0<`HqIszxpmEFlZk#)AaZ)h;p-;?Y{QrlF| zu|c4tT4cBF?Lo#_`3t=(E|7_6QyeWoa_hRFCp8F#*a@CQMzQ7YlP$@?)()NuW%Of? zSdKW`zb`9`8 zF`x+hA~?C8>}*T*kLVP<*-jz9OV8kL<`NcG&hvY)nwg`@u6yZCt3Y6+y(@VPi`kLt z?}TT-P3BQdWsomXW(02S>Ky>&R7+599~l}*A&>Vd42O)zc)!Ns&eOQA$~n;2JJ2}@ zC5NkXYwu7GUICIGgmN_-4p@lriJR|gEMySDfC zx2Ae~+Eb~vmZW+?N1cJy+4gq(v@<3jW3WvsljAxN2<-~U!||=N#Vu!_6+oPVSQE^2W`LRWBt8D zeV7Ch{c3$4T(C_3oa#B*+27mK4XD8t#M~?Go2UAc{hY$260MCAi6uu=4Tx3tv4Ir8oyYrn zC4!M_qA;jDoQ6$+ZDL>$&^nUFK^C4M-US4X5$+@`l*vXnur+gVW0S~sPcP9MdN~J> zrMorBC|=d$bgCbB=XNaBBOvn!oRcbLOJB?(@!BfzMC!PnCAKqPX9euh%jNagwo`Sh$6MOMyboPLD28^if=>juPp~9gFS)IQ}L8PIq!}q&qb*kUW+eNp>-( zJ7BP72%8Mj$vV#koyU55k)XV@2iSEGYq#2SUZNP3J3$U`Bs_ahkxsh;n4Z%TzQfqJDuw1xPgq2m!afMT` zZQHs!drn|E(x=)|UDz-{oSj`G{iznr7_TCImXvvAbSctTCSHhn>Vs;?{A zni@&n*$L3)O0P(tI|cNg0(t`qItF4JJvcT6!FC?fcL7I*GEc?I+?LOXc($NWk&d>D zh+j#FYhqJE{Hk~^fus^IB)}}gcjNO3WR>^=Jz`-T+fbPG!}iEb%U);pyDUTIym=J; zcr)d@eL7ChkH@V|0gS|q3ve0pbEhnfr#}JF&6xU}og-=&ALLoA&q#szbLryBjYl>a zWX6O5kGu+@f#D8$s|J;iAvN^;gv|hB1GC1DIjE!WNh^l)1kzNyx@zA>D5WOnx<|+4 zCOi#9La&sd6fl`Un3=k2|yyMh1j?WxLdUw(QY!@&1f@N+&<4XHj^A@ zyK#I6j5_gzMt7Sw~Z2x}zegN3)0SYDfxBVI-%AOQ~%IF70tXc#g7bVpq{EUcP717U% z*fS#jn21(ZJTAhO>pv?>pFo#@_&I#5j8iv5Tem~}Jlb_4bR7ySoQ5EQ|F7dZ=oVBX zv^)tzh4>&(ix0_&x8u-XEd$DCU{^JMsoz?GUsXysf$7ubH33~;3?2v!?}_1F31|hW z|6=$flaG8D+CfAA_4jbW+u!(xpFV?!RM;c1z#`)b^3eXJsR-g?yvxAD$T{iksL({S1nW)AxdFdQ zgC(}J1n!i1yJU=50e__e&k7mG1jw|Lp^TUI5xt;5MTf2~g~M;Y+T`{!`SfRUf?Jh; zFyv$DCk&xcZh0t{u+3GlnJQq&;I1roUV1Po{4xYIbrN{MQPr=})&aaO?0*j63PcUS z4_{YlrtIYP|J5oW?6 z<{NrO#8k`x?^1$Z%nRtulitd-VlXKOzZ)cKWL#P$*vVy>OB`(HS}*SEeaG9r^Hpfu z`6=wquRyIWIhY)2>FRCq;Hm+pNmIGfm?&+ROqdoD$OpenAVm<84Dv5ojR=8gh```g z2Vq^7F8|1&d{`XeWk*$^JgCLT&LSu0s8Vj1T-1$RX56K~IkEJ!Wnjlbp8TG*@rh!> zTh6qwJZT7-OYxwAGf)8K$~|rYDQ1nM^JO$;woJ8}p)Ff^8@HxFx{>6?S@3rtv8-d# zQqv$UJOcA_^0L27D4Vl`kI)S`{t0Llf0{H{Gc+G~a7_U14e!Vw=lIC~F zu)G2Sr)Rx$p*buqiw5Bb0wESUyA&C|%vxBWYg>+=X+dgQT$oY$$o0T>)uPh*nU;s= zCuBxb=x?@UDL%`!UJAUKzza0)RkG!Hr+klo@F@_D3bLgxTZP$T!K6D2QHc`~kp(vr z$0*#m5g2Qew1wJkY<6H5zyiY%Gv&gK97W;At-y_qz(-ATBpWxXk$9(iOpAJdz=1?1}x zkYE)|p=2H#AV+V3*^|ayb^EP4<^s0>`fSj*->7e&#Lap87!%*eui8ARvo3qVe(p1d zBmc;NH*~>zZN@Mm+;FQN&h(B=0MjF6EQE-$XGDdG2pq7ZHKd6JR0nlr$U%me1JknX_tyl=?Q>baOy>2+ozX_zN6n8cCZ z9w=osbFGMn$1;jJTTs>J=&O6;;b_KOo9!yvP+$y^D*KSM4rR^){5*1Qa+D}EquEEf zW2h5qc;`x(*I79n379-+L!$)}#zS6p)VnzHp8cs~Dbxpr^?}!1 zp*bAUcw;)dsGAXntA!8PvC*gW=dp_@xfF)kRmO|un~NhrPzO@tgl-VBB4tT#ALd>O z$ab00F30%_qg{#iGNWCE_Hv_LjdqRE=J+d&Hv6wM+U&o|XtO^{McMONjn*2Y&H7FB zwztnS;LOQyKm2g>?=SsWIglhjL@D`SD}9xcsIu$93P?Alt9B#k z3=wB5mc|V L+XbAF^Td9fpxKM=> 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

;-BXK%8J&uy2ag3Y+ zXOuJH%yJf-RelO*le6O-a!#B}&W-cPd2v2DKQ15_#D(O-xQJX77n6(Q5^_mgN-mAd z$YpUkxje2QSHzX%%D9SL6<3q1;~H{JTuZKv>&SI+J-I$^AUDK~o#f8Ai`*4=le^;{a!=e#?v4A%eeu(BKipp)fCtKh@L+ie z9x4yR!{ul22>Dq&Qhp9UFTa3altq6oO zpOeqy3-U$$vwR6(mapKe@-_U6{44%V{vH1zU&lA(Kk-fZFMLbBjqk{J@jdx(d|!Tm zAI3RNAP|)%o*W-1kQ3rWa$+1NC&5YOWH`AT#3|&IIF+0lr;*d*a5(~pbQnn6W5Y!<2rI(Tu-i#8^{fDBe^kdA~(g& z}!h@_hWM zyZ|qh7vaV768xF`IbJF+!^`C_@Cx}$yi#6;SIcYgT6rB_FK@sb9|14j^m*p$?s(cOqBL9kilYhs5$k*`=`A>XP{tMrdZ{s`iU3^de z8{d~7;D>Qe8wf}a5gzR&LQW-x#Zk9kDM3hlk?*OazR{3E{u!FMR75? zI4&WV#HHlYxQtvDmy^rm3UWnUNv@2m$W?JQxjL>P*Tl8t+PIEf7uS>P;|6j=+(>SW zo5)RZGr2i#A-BY>|Fg#p-29J=R#UthC@bmHu_(gdXeo1~AkCtD-ugb6C*X1|xoAO)u zZTTJiuKXT;U;Y4(k;me3@_0N!o`@&OlkpUJDxM}!$1~&)@l5$6JWHO9KbAkibL6>r zo;)9aDlfnbR%kXmf3%o-960ek3;nngQyjEU^*UKC5MtKw7EN{VE za2K|Af!TXYo1tJiZ`b#6QcI@MZZ5zA9hCzsSGh-{jx%AM$m4L;e%rl>frF7x7|Hk*_2l!!}!vle+@OW~3oIp;96Um8jn4APBm6PG*auBDGQ{q%|YMe$+i^Jsz z9Fik(IypU#lB02qoB?N)GvUl~7MxXn3TKnE;~a8MoJ-D)^T>H|J~=-wAQ!}it{_*$mE_8}id+>}ldIzza!p)Iu8r%+b#XnpK5ig4 z#Es;}xQW~pH} z55?*q2&aD_T>S&#^bdrqe;}OxfpGN?gwsC|uKs~=`Uk?*KM+p;K)Ct`!s#CfSN}jb z{R83Z9|)&^AYAN3*?1(k-Qi$kw3$q z%S-Vxc{%<h7bya(@< z_u>8W0emq0NFeq+bo9ycnARWX`V;ck_#62o{#O1De=o=G|ATxApO$~bKgnnCS@|43 zFJHhH<)85-`7*vDU&YttU+}N;Z}@ll4}4v|f&Y|m;=klu__llp-<9v-zvcV*f&4HK z6%mMYL_8c{PJk22iEv^$3@4G3;$(7i9F$YwlyWMZT26!0%HcRd4&g{S9ZoMt;b=Jq zXOLs}S00EU4@4*rM34s}lm{Zn0};vt5#)gg<$(zDK!ox@1bHArdEn9hd3F2wSf5`m zfD6inaACO!E-Dwp#pM#Xq+AM@mdoI>ayeXHu7E4bm2hRb3a%-X)VKB9td0V)x&p^?UI?c|SfNAH;{`!}y4N6f18;kQXA9HzLRz5y~48gQe__}-p|0&A2gVW04I6@BLNI4x&FGt~MIR|WWpG)!94;?cz!l|6xUyUYSCy;b>T(TSQ?7+; z%XM&FxgM@BH^2?$*!`71LVQ0F()Sagrns55Z;ti-M2PPvLansEHEtuf#rl3C#P<`S z4qD$4cal3}<&6;EM}+i!M5sINq3wHO<%SUgT1k0;0z@g#XNo+3}h)8y%RhWsI(DSw1# z$+7R>+49Hu6L}7vE6>C8~@kZ^E19EqJROTff`n?Rba06YrA0!n@@?c(1$<@0SnYgYqGKSU!S} z%E$0=`2_x2{sy0vzs1TAA@V~=`5{Dp2q`~=$PXdqhYJ5geu&`w8yPQdePn!`Ku(Ag#W{lWQDkD7^GjryJQ^p7b7WGSOiqr2agJbo ziA)ja$dovhoEoQzbHr?{yb(ctMTW<%kBq<}ITELn)8i;P8pp^Pa7H;3&MaraS!MD@ zr1C~2c_UJJBQht>rR{U$JaS%~PtK1E$OUmBxiBsw7sbWo;<$ud5|@%o<1%ttTuv^J zE65dbCAl)LB3H%Li0mbkFCvvMBKu5upeQo~%9wU#%D!co{ne8AL5zvM|hSz8-FZ+g6GI{@jQ7x z{#0Io7s`w9VtEPvO#U1%m6ze=@)vl8{3Tu~ufnV4HF&MO4zHIt;EnPoyjk9Yx60e_ zc6kThDeuBx$-D6$c`x24@5cw^gZPkq7$1?3;$!l0d_w*je^k4jQoE_(obK+cbZk$KXi}T6(aRIp?E+iMmMdYHm zm|Pr}kW1oHa%o&fE{n^_<#7eMBCaG?##Q91xSCuY*N|)CT5@e%N3M(O$@Osqxgl;O zH^xomrns5h9Ji2L;#P8N+(vGT+sW;52e~8eBzMMLKa)SlOXX#Fx%>rQA%BTi%B%2dc@17Gufyx*4S1ux32&CS z;H~mDyj|Xbcgnl)SMqMWN8XF~$@}pE`5-Xui;f+#C0i z`{JkNez?Cp01uQ0;lc6{JX9Wrhs)345%RNmr2HIyUVZ_;D38J~$uHy4@+~@k zZ^E19EqJTE4R4os;GOa={FS^L?~(W7ee!;MKt6~M$%pX~`6xanAIB%;ukknXN&Kz+ z9sXYa0iTjj;~(Xp@EQ3mJ|~~Y7vzihXZaGoEMLJ_;E65?}{JBt&a)>qN3u-@o@q(f+QO<-j%UN(%`6--D&W>})IdLvIH_jvH z#rfp?xPV*`7m^F(B63k&OfHT~$R%+pxil^#m&N7e^0aC8{;N&Q`}5$j$6nraVxnsZX>tF?d0~jgWM5!k~`xrGW8MF zP413+$kbC*FS$4FBlpEm%l&YFc>o?L55j}xA$X`f3=fx|!6W2n@kseO{Ji`Eeo-EU zUy@(OqvcodtMY63b@>haru-IuTYd+>E5C=|mp{N`=0SW zH~Dw`hkPC1kpILt<-hPP`8K{I-^KUjzwv$f0e%?g=s+MUI-VRKCy*23L~>#rCMUs3 zH(mj~d1@*q4|9)gF;!|-tV89YLM7LSyl!_Uhv z;1}gl_$B#eJX(GQzbe0mUypO_?}J9a5$EVP@muoS_#OFO{GR+i{y-js$I9dIczFVz zC{MzZNkw0-!NMJhSBsJM$gy&^czMmkQd@b z@?yM1{tSOEFU8B`<@gJE1^!ZAiC4+1@fvw8UMH`|8|006le`&kk+)*?7e>=x7_I)o zX!_ZrcWHb23!`_-d+=U)AKow1Ul^_a!f5&nqt#y+O@CqZQEh(=tG_Us{=#VW7e>=x z7_I)oX!;AI)n6D*e_^!x3!~{Tj6SX7(_a{^{=#Vb3!~Lv7)^g+wE7F9=`W1FsQu|L zjJ_ma##iL4_?k?AVYK=SqvH==5h<%Qf`G?%WZI5xgBmVcfcLxPPnt&1$ULZ;qGz|+*9s_d&_-r zU-@a=PwtNg$OG{pc`zO#55>dc9DDwaQ67jP55y=B#E=JKlm}wS12M`2G30?5<$)OT zK#cN040#|%c_4;75TiU0Lmr4x9*B7ZzZrM`V&1}U%kSWK<@fOW@&|Z~JQk0W$Kwg| zL_A5JjHk#`@icilo*{pTXUZSpS@LZBvHS_1BhSV2!K1FT#uECHOP>bG%eu zhL_7<;1%+hc%{4wua?)~wemW=UfzH=%A4?Jc?;euZ^PT=9eAg_3x6f=#(U(wc%Qr< zACM2?L-JvKL_Ug-$;a^t`D^@*d=h^ve}})9f54~Y)A&dECwxXei_gjD@df!J{#m|+ zFUwc(RrwnJMgA54CjXBAkgww#@}Kyo{1?6@-^O?3yZD~`H@+`Fzz^e`ArOel5KoSe z6UYg1A~`V*lat`2ax$D;4&oGYN}Nhgjnl|!akw0TLvkceC#T0zax{*SGvJJJCY)K$ zg0sp`;cRktoI}oubIG}J9yu@0C+EinAk*nfra&=rou8C{OwQ(J}F0Lon#|`9$xRKl#H<6p-W^!}fLT-s$$*pl4 zxh-xdx5pjij<}QD8F!Jp;%;(x+(Yh(d&#|VAGt4nTJDGY%LDL0c@Q2f55Ys_VR*Rw z3?3mri$}`O;pgQS@Qd;&{F3}K9xcCuUzK0Ough=XH|4kR+wwd3UHLuyzWf0mBag-7 zA%T%G>aEc?aGp@4{cnyYU`* zFWx8b#|Pwt_>g=UACZsZWAbr)LjD?mBcH_I%HQGd zh<}zZ;mh(Bd{w@Nf02L1zsbMjKjiE9hWsbKDgT9U$+z(x`7XXE|Bdg<5Aee{XAA_Q zGRBkR;{OX5;;X|t|V8+RphF;np_>%kZa;va&25ku8Zr*^>G8aA#Nl$#!cj=xS8A>w~$-n zR&s0HMsADS$?b6mxg+i*cg9`huDF}r9ruuX;$CuZ+(+(@ays$_)YmO{I>iKeph}Ezb}7) z$H-&xIC(stAWy`T&trFXEr&OZc*U1z(k~;a}um@o)0)_z(Fyz9IjKZ_0n+Tk>suN4|^i$$#Vf@&o)Z z&Y1#%s7&$X_&9-_5GRro<1jf1PAVtE$>ktUA*aNt{1nb6XU93@oH&=98|RVp;(T&`TtF^}3(19X5xFQXCKtygCp17CX8~2g>;-}?)xW7CA50nSt z!SWD1R33(h%g^8u^0RoP{2YE>egVHIkHRm>FXPejEBICUHT=5#27Xh13%@PDgWr|k z!|%%<;4$)8JWd{uC&&}=BzZEPB2UHB9BCwPuL7tfRD<4@%U zc%i%qFP4|!&*abXQh6C(E`Nbn$Y0`>@+!PqUW3=l>+pJc1Kuca!kgtSc&oe(ZQ{$Bn8pOR1GALXC$ z8Tl+eC!fa`5#5hb&f|JV0aB?|_Q^+ZCDmgVyBd5jTas&>^kvN^4 z9!JU1I7ZHZGs>B8W;qMaDnEs@$=PuZIVa8~=f-*Dyf~kn9~Y1d;zDv^TtqI4i^;`t z3ArRLC6~r!zCZo?IU{kQ?Gga%0>? zZi<`9&2bC4C2l3R#%<)bxSiY{caS^cPI715Med5b$=z`exhL)=_r`tXzW8amAMP&? zzysw$c(6PK50!`E;qo(hg#0WXDL;pwmtVjy%A@d0^2>O%{0e?meht4azk%PB-@m&;$^74nyOrMwESme=65@;ba;-hemCoA73N3*IVk z!`tN@c&EGze(xo;EZx6oLSC-v&v85Y;ty-L(YkF$+>YJIWNv9=f?%)g1C@e7#ER? z;$m`fTtY61OUb2i8M!PjCzr<+MbzDQPiEGKVaUHoXt|!;W4djNn zk=z(Jk(=UXa&z25Zi!pTt#KQLc|QJBUVs)k&ohI@^O4Z{u+NHpTytF-{J4& zAMh#pH2zWk37?VA;&bwOd_lg5f0i%d%kmX`RlbIQk$=U%$-m=2o`{3pIC|AlYK zxA7hMF1{!Kjql43@WVJ~4FsaH#*^dY1ad;0NKTBygfIGdau=a6&aTyk!lN6w4$$@y^sxgahi z7sf^8qPUn`9G8$w;!<*HTt+U7%gN<&1-T-wBv-~&+&1;P5CYSw)_r$SAGw_FMoi?$Yb$1c|4vVPsEet$#{x96;G3=;~DaYc&7Xjo+Z!5 zAIqQMIr3aQPo9rIl@|o!1(IZ4m~~MgUe?9T@>eX7fXhIDKhhVkO@h^d_$vYlVt-8d z=*NW1Srsqq5-yVk;s*j9R|k@JToZ_&^)s%CpY`+b!;jX)W1FSnhXP3(*GrHvSs;)k z5IEcQeAQ9&dW9+^3mI($H(z5}`x8q}}Lu$}{l^e;4`&wye@3$^Mq zpjP!d*{jxR-k?h3It^Baky$AQ;G% zERZ6QJ1melSs*NsJ1N)X3k&3rT^0xn6buU#iWf-QwSS-5J-T%7F(h6fb=qKV4VR2dJL%+dqX{j#tRg$|3A5dj}KDr@r_g)*l*wv4iVP0R@Ejgs#K2`$lvbY zINFn~IY^3LJ%-in)1zPaMnfLm+qAj!)bHEnnJ$Hf59`yfQ2jnbhp|z@Y6H9Xh!;pz zzt4ak4Ttyd+G9xbE?xU^P1^bcyLIW;vdfS@v3_!8!ePDpaF>$BJ??mcg8#;yirb!> zOkBRtfIh=2#tS6Kou?)DAa|Wdi=lm<<7VU4;qc7{4j#tF2^0+mG6pioUhseBi^U5R{hvSW!9dDDns|Xc|9a0S zPjN7iHo#np`Tz9}aSuOUAmq(?48yw(8$N```S_7NdTFW*8Pa7WPjlifLt|g1c!3!avO&ACTA~An3 zIZz(OW0^M5#@HfG8^2kbglQ8rTN6mQjBDcu_@jz}#E-V%x4HN^_;~9;bbw!{;AdV4 zE@O{W_|a{#bzbT}QEc&hZ+`ddKle_oy)!@AyF2%bK_ZYP?`n>)J`mPsbs)*gK+?Pk zHwKce3?$DR^LQC|+{i#8wjaX%?-xiF=+Au^8ps^r9KyAckB{}_b~q~kW#yLQ2cBYW z{6MxqYL?O5W>_E(dnaXx$`c4@8DtsrkAqR(tCvUJWUPz*SDGFF<AbT9^H9+J^Hy$|3L$X4C@km_H2PL1FADhNjZ}LY!4DB)GnOOaQQMz$K<{v^*zJDV@{10Qz|3jgs4x|Y(v`_%ESQ&`_xTL~a_qe3GaLgW$>hW<&C8Nq?PyGq0>gXp&srjU&GK6gmB%q=a z##R(%l_<8X5>r-d0!bcMO6+kTS4uA(GsBZ(#^(eZdk-@_iVd-ql9ZB-{Krbk@cJ9u z)^fs){rB%yO2g_^npgRUN+}W+$oi;0QYYhPvL)lzvd0!rj@aVi(?HVL_dy;$3lLO? zbnhJ&$j6h~wAQ0T{gbp`j<%Fxa#npJ!4O%@!L^}|JGUPf0fy(zDGA4FYxb` z+oO&DXRR$U&S<6AyS2 zrIQS3+H1h$^?*a^voW+<9}0+|CMyh{0Dg=2&qk?=kEE4;%J5_A`r}~cy{4XbDKG+v~^4aEpUeW*k*bo*d8849Y z|M?B`A5S=6PyC-x*Z*?V;NJb`2l+%)B+nov5Ibr-UZ#1nO#5UR{^*PvJHGI&bID&o z3{*C+fTj|1b951U`v{>T16|_ zaS~8uNpVDE$>@l2+ESoEk6-W7gTjweTA6Bqr)lv{C`eXGtbPt$Gr2t&;2~_lS=e+nie;TB5y0!@HQ-n4iW7=K_BWC zl#Y|BG&Pq0FULIAg6Nox(C5TJm9E5NO~ z>Q-MR=c=O^bYHup*#c2OdE^#?c`@72IM{P`gzGug-IV!dtgI%j^O{Lus^mG1K3Z>F*`ak{JO*j!Qhr zrtc`6;boJ!h9NnVNoRZTYJB9}K-!cVVDZMDOc%?Kbmy|UK|CWD22$C=g|c{~;?lsU z4d4;2EQ2U%&j_s_&d-l`gIs4PFVBvWR3Ee-DXBfP)He~C6r;Iamb@QH6KS}hrQ*gK z%sD{-RajT;Kod=X$#TT7*4n{x1mQLdMm936N&i0CiwzcxY-B(%{(WR4!}|7NWFy1+ z^thS}^;+&w|ZYArEXjyh4HZ>0wr9gR4^s)IlWyt|Nn$#>))$!9R0^)rt=GB+`Ap!oRc{HT!^1BkK?rjq_4V<~C%O+8{y zpd}#*2>=4uZWY9lo+ag6Qk_>>SM?=Tzsm8sJ^Zsb3C$YL?o)$Fl~+Tq8cwPU>Y}Ue zhiRhX937BXi1WbOE+y3i>Ook>Di$pHy$(ev<}U_JMSE?y>LEw%UAzWzer6iC@3THG z%yCmNyFf24pKdiYJB|J)(srJj(ed%r)D%>vAis|TdK$|er+t0 z3eqpeI=&s4g?b@!qitaD$j7b|4wVKe%vZq3(4j5^ol@f5LrXGv*4WdkD%)8dP~twL z++R?Mn7Y`hSxiLs0?C30O5CB6i92ELy-S!&Erad>nIV%&4a82643b1ldDGqzfx$hY zty(SCvO3{d6DOq_%?ekWYFK!$Dg0V=omQwL2Rfftbr6i}54=w$acmfOA3oKTxTkZ= zt2RHS8t;n3q_yT!J1k>OPpW3WnXMokDshjhPTZ?%6J0O>^{5SrGTsf0nm?|a zFwIjLwhx4gdiaeXL2EHu8^HH>;;ae;v=JKUL+DlvY&1t3NjP!bfh+4(FPk-Zy+<7VYs@ z*?jAB0zK*e%=0;wo6RKj+bx>OmHbRfb^fML0e`%fziJ|hHssPorlNBb zI3mwy%TkJ>2Q_?(lEHr5ulTtQGghAbtW)cgV7ib5MYFY5WAG|5ZVk<9t*a~_hNW`i zrIoSKC5YAFxEJI7Q{#`1UYk62bQs=oV$q#`d}5a0VrWJSNH}%W-9c%tB+Db?ZQQf0 zp~QEqNLRrQbM0wUuJ+WToAqbeH^{W>+@|Kkc!rn}nZc zVY+Csa4EXW(wgpW1isoNHF$Ja*TCAhf%}B?0d`=AsVfDD48Z!DVrww?bIq9hUE6AP zZ9Uk1vigo;$Jw=`fLL7u40PfdRU0n9!zvHQC{tdu@xgIH`EcPqR^e(>I41hz7F#4o*k>{lN9)F?Me7LM8p*HxQgp`;U{Ek2f zyhUo#OOQB%HF1e*cMeWdcC1x!1*a_qJ8BxMaoiZ5w%b1bk#oO=&hvKw1tSc2HpD3` zxT-gyIudF}LhVeb-3dBPoK=}RAcb@MbG{A;CJRR-)#s`lj|04NU!59MdH$g$iN22K zU3HNfNE|P@>VZ07rgI7PAde66&kOkHg>*d`q50=wSB<*rGSp(Jv8lm{$0xP3A~}$F z{_+#F&)|ly8%cmIF;-dLhsh?62@NKtwCod7Ufy2G>Dp&wQENdBi-i)2-Y-kGtx9!g zVZw~EaI@qVf)3YKH$ zk3H5mdQE)Jx2Y}w*qAQ30R>8@DqUNU=2M7UHA?Z zctxr!g_gQcgVcJobUS=Ujsn7JfhkK@d<;kOid5MePb3x=F4p};6?dPtDyX(9xJ_5! zd@K4%CDu=o7}tUr*Bt=c2}j}Nlkhx-zV=krJzIF?P3je$n_u;mT60&tJzo2iYC2Kv z+*Px-n$b`AcL#pp2j!m*hX9p*RyB*Fx8<&yx2i+Ws#by82q9a^+Dp%>b%9saIAxZ+-5YsamTNRqi=be)j{a+Wnxa zbw30x>MyHy_gCQP`(Z>c{hB)Feng#cKMHF58*0S;O?BD*ZFSZC9d*t9xcYAQ6Y4eY zC)Mlm{F~fQ$?%-T5OiWm!ZwKEI0pQ52R?E&;791cj&HF^eLEboPojMcl^I5!ok9t^ zdw&-Mijx?CdvX7us(B6t;xHt-D&^qwd|lnaGgoyrG;DefM7_$~!_$uHhGUBUnm${F z0nnVgKNbG0#FvbzG^&WHGth!-%{J{=`=HU@isP+dg_?1s2C)^#`@_c9SO4XI{^=l8 zn*8043T!M=Qq1d4b)QX-^rZ9MgPDP$++c`5f@QVNIFZ2#TRV{dD@%Y4) z_6+N~L@$dF`%y{Uq`8U($!{R$Y-Vh7bbj*j$$9uQB&HD4MK(xWTH@L?8>K!ziTVVG ziNA|y*9~H^;z23c&RCjQUK9Bc|FJBVrzt$zSooFspKu|L5-@JXsJL>xff!IrG6


f?IcUBhwmioxx0A* zD3th#f#~2yyM%8(^sxy7NPIh+5SH4_Lf1U~h_(vGjS_+i37cZY;MrD1&o&UNY7(m& zI=Z>Gn|r}dSZmt}w<}$73`CN>+anSj4RA@|aXPxT;7CQoIvm&ISPMLi_YMZYzU#w( z_UZqGqL;tQj;|0-(ihVGL)ly}{LQegLr7}CRre%dS@eR*M4;O)GTokp+MA#Y?EZv0 zkf1L3U_u>APy>7~y+YQj6#sNlIO~RAh^x+keaTKtUzvxq{OWjvBnBtE2$baD#MsR2 zxQrc{vD${BUkF1;R>js@$`qGqNb zZ!}14-DvWPcy~8={WEIs*6yj9IVf&}eNF1}IdS4ZB?yn3g)&hOl@ELO>w4hd;oTI# zyAug_EepLi24{(*D!Bv~O)Q|+5T0K|&Rop#r5x_{u#v?OyGpyPBtfvDnZ8}!nN)pb zFW}f%!6UAy|K)KoM9=6LGcpo>e&vzMju^l+)F#s*pGsjbidP@E8hD#IYFA(&ZUgTS zoCcMIIqo&bedf5|Ja@nxJI(Q+IUX{{!*Zl$8Ac}bgBsQE0Yt8Ttf?swiX4&`5U~ee zV?^x1*%%Rf@HR%o9%J}wC5Ep~V)*JMhA$~Gd<}@F5daN_jjJc)K=;K1os&G_YZICX3U1=)$?E}T_=gch-mTExxjJj-P1z1YVp`gtt}+9&^# zb#P6)k53G`YKXT$m^M?ZxLNhP3exME{)v~&r>EyrzRX}2i2!$1=5xzbRg9B^$ri$@Hn@7#%ll4EOk+&SstSxA zBtDI?b=1iyHpuclToS&&n1tX47eWaf5&y(v3O;cw)K0CZl+e>VnRr@CDvg)9( zs)xQR+0p>L7%xK`*3yLYO*nZGvXDH0PRZy9=RZl&w z)`rLLcdU1AExa?9tf}gPsjA~Zm5d!;eI2t6tZ!2rbfwVC1;$ju9AlqQZtRm7)8ALy zVxO|w=qR*7&6)1*Jg76rbtfv^^y8}9dH1twGe&Ytwv#RK>QicK=TmB%c(K|;_eW^v zk5z5#PgHa4Gipohvub!P5o3}j-{Mku#2wQWIBHvk7NDM+0gDqd zxFLqC4$%e$lv|EKC+T%b(zk(*DvhEWGwwogCjyrYxykR|@buimHKu}@7|&g!)DDZ0 zWjbmte0z{t#KTWak4>qF%B%2A!&;r zqh*U7MwbN>fEGLAYg9bm1T~UJCg4*dVjU~kfNGj?CkI486to8T%{c&66Jy|~@jPHv zg4N>q8;3qB-liJkYo$t!q1TuyQGw{%Xm!z=HdcNE_zfy_V6x7GPpf$UdsOwIr&P^r zm5Z}?A0kSwqRGNE(yrY2M%5hOq}Il_NFxVy@j@f(;nYJI;S{L7Az3Y0b z8#?914k_t0qaV9*N<|(+R4Jj?z%DPt%Hzw z1p%p%h!wHujLqsK2*ldR#8JSmv@bwMw_hEpC1=1hribFa+xX{%t8RxQ-|C>(X1yq^ z&K6s7o=3qz)3s$h;^3UW^X)fsFWMuZrqd!1$9)Yqv4UaJ(c{uRKe^e3pc<4AERYM)g`jM^zXl zlWXH%g-G1W?g2%g21`9KgXd?D1ipT0HawosJOHFg+1rSq5xM#RC2HSyE1fLbW)9F0 zk!uEsi739|z z!Kzl*c78{YSnFw4Q&V^bwycckTs zKZony1(=7o!+g9QFNQQd=JkFI$eZTpBhn8f9?5ool&ti7D2LRbPjy0XYQbBJl+t$) z*BTCL;=>;9pzB`zZcw+Asv&+#t%=_Y=g!lrBi;p*akn}Y?~$H&=w?jMkr)UhW;Z&q z4@8K=69XAi(67b5s@9;Bcn=Zv==nfpDjo3}A;zr3BlS48hpEHsJKy(t8BvTXIrG5U zD#~ZdMLd|!4`+u$G~p%%QMsnIBBXvGuntQjLETZHa+uno6)+bo z8thF&kvo*`O%Lv}(0FKe!DpdLHM^?Cl^DI%VI3L*tryL(daFCoF;<>$f$Hp+!32a9u-9i0ysh$3F1g-v$)TAB_`B8=_s=nd@hf zurxFg!Rx|7+@-ZTfy9P%CnnJV;>F9M$be)b*opTwA>1Kvno5je!Sw-iCc*Yu;c85G zSM7$N9hjoJ$7}?u;iXP*Gd$>KBm+hH`49fX(;x>7tBCi9suF6p<$bqu6B8NrDoXQ( zk081CmbkXOmsy!Qyt278!s5gtWRL*Y4rY_A9(*o2@(MXW^cMF^_@+>h7L{++r-hyK zd{cBLr#RR>=5b2p?1jJYR&5(8()znie2_2OpEMJ6g~1Ea%q zOEowH_Y$NuKl;o=r+yGrhQCOON&+)~*KmKa(Qqqi%z7{AB{l^gl1;@+Ca|6*R)oub z#fzxGnw(pW#SZi%Zy3oxzQo8ZO0b|1isElxqFU&F?8Q7h4GkPnDKfa*mn$<0D?kcS zm@rZmy=LN=h$LU0HjJx>q2i=RCDsgAgI+VA7cG~!W^{V<7-lo8T_;PDCh}^`{Tj^h z1kUJe6~htguHZ~hZF}m=pNHm#KiVOdHdG<$}{D-PmPc<=%cuPUt27~;Qv#^56xEgx+Tb4-SqEa?S!U6+`Ldzri zm31@)5`$*wg0B&XrRIS>6sVv)*@UZ%M`;3N)6?1@lSvY&`Bajw4@q$2_>&T^hh;3c za*?x@qfSas&d(Am9>`Y9Wlb>QgFS^?4!p9%7{af|@6-UZ)0$9{*IdH^kqs zG&51y@Sza0TlHnD60IX*kG6qtpyL?5QYmpDH#{`&)$db?S_nt|R{e`rMZM@zSOu-- z<*EqB?pA%ZWEEOD!(JQ(K4&i&IE-G@z60kma7~6r#EJbqp`C%l9134|L;0I&+!*uA zAj(FZaXW}69Gh`$!I7@I9T>7A7u}}xx)(a&jQC5VqRKQQ*PH1^`on?29P_#529X>x zE1p&PvzdVq5os489O!55-~<#zAmRhFGh^7YVP>{_hQWJOvNjYYlf+;&c?ICoI@*tY zUr1;jJnUWX9vypBF2?W~yo-g}2N0HrjUZSEDJKhsdS_=AuJK|Vl-etVELOPm+;in| zs0hLLu5f4^wH2Pti;P{7TA_p$u;SV@$r3qp+QBz)iGUlxY$5DgFrqs!C;a<$fa@(d z3An+68v(;!SE!F1jIZnQtV-NrVQpBve)so2_0Csge(^`2kjeu&oC!OBBj>s1w?&$+ ztHX*w{_QO;6G8ackJHJ*YOBEv#Ixv3(Wi-!1%&0Iat7szH~2}9!~}>p_76f_o2zz2 zNlKw#p&V&m4e#EH^D-o0QiF)~h8f6Nq}gV&%q5v+YIZcU{F}m0do)3tj**KC?6NLg zNx<}L`j}Ny3s5EX>}0t4cfAOoR9)5p)dGbE+3ZhW8vo+|fwGFfXaXf>0u$qoq=tqD zGhM?&>3j%J9>a%Bs5(hrgYZO-3zB;yN}YcSsr}>G1*WD!ZvT}|%DU7%cBHzzFh4OT z`N2JIbSXNgNXndL`N6buzJ>-Ynn+Mw4l6K(1@aMWw6b<9NC7@4CFusI@NF=oM+*a6 zo}83i(AZ%Be&iE7)SXatSzxObK0Fste6OFb_>xiM$ynL{Hp{m6_?o8jTEfVyF6f>7i5^}f*;&CHs*q3^_n$!Y6C z!}xUxU-v?~lH=D0jKwp9WuKgTqC4MHD1MW@@f!l84L{flm5DFF8;_FRD#eY<)|q_2U1|>kG@_^~0)tQYTn(N(z) zKH2q`;0=*{)zhlsN!6$^T?d{MOjpyX;xz|hraPpz)Eu^2*lM-F^tEgu5SFwCl{Wdc ziRVbot*W}_sH&|wCN*ihHMdb>UuhcGnP_9;_RZwz#OcJH^pI-IsVDhE!4>5pwxQ+^T^!G|ksE%N4D?I3s$$)XJrx{TL?%W6?OO`| zmQ?M>)Bv~C!A4q=oajC}E)IfUFRyw`0Jt0ogDhLLax7<5qLr zW{!T&o89t!aj@%txqbj1x0*BdbKV5Dovc6-77t>5rYIRo&9^|x@d!p*B6#>ZeqJ1# zU^IFJV+{yK6A4B$2u913I!;F?2iFASWgr+Y2f=s+2*$TrEo`+~Fo|=51jCABJ&b;7 zg7In)jBf|Q_ztPbBN#e|4+(}2=ZT4jbPT~OWWLE-H^JkTO0}Ih>NwUjAR!^v`fHcB zws%qyhF=c~R-X0Xth1?s0c3I38{ROAb!0F%Je27V2eZH?orHJ*pL6KJuqF1?Wgt>l zwF3L)3e^-TvySh}WGWybh8OJes}S$ya*Q8zzK*(QW$y()PQSGh?;T(+bs&SQ)`pNs zsjYK%nVodFn+^vD!eQtN61yX*&*I$=4Tn?NV=websjfwe@vt_-!NP$WI}Qns5}uZM zsU_8uu^K!KEymQX!QlzhbB$^aYi19=^=R(pn27u_=4$b`h8*E*{dKyUp-ThdIk@#DPDbXir-;+q!DYIPj(+H_KVOFsVg4f7wD^%ibLu`( zjKRA`G+}Gh5eYJ_W*pQSb(GzMIt+VX@$5t`qZGM0DfYfP&aK%`B69`MKkE%4E>Wrk zXHnH0wbSKPI5$t+iC`y_4CF;x`ocCojEO28VpV+|*{@*!PwYGQV3*FEU^HJl z?Xe9JD=+Ik%4PcV*pRY2jbU7jMtdcI5tF@ezLJDrk{ka(1S^ot%>9^V%ifMkc|lY3 zGSOZzOsqh8PCJj-PApo~dPY@gXV`-Khm#cvL!&LSZJJSZ0TFf?}$cZ-HirdBAC z*dAAd*IpCqTZmdk(tw4kzFZw!0T$KYayXX{Yk!V|NDsxyYq?Q}zQnoi)UaV~c zea?0AP6`i5?7fkjp+FtMR6cO$JVCwyV-t-}V;v_$B6A4i$|jAwLWBRmFsim=5vn5Z zxCko&1g4$3>3&Ez6VI)?RNyP67LCBBfN-u_B2Wz$Iz=GXKN0YJnnpkHl@U#hcirj* zzRCpzzHUX}D^nlnZC3btk3i`_47ve$vl_9kUf}Dqs`e818YG>g*36?PH-Mj?0N(#5 z#QD6`>e2?&C2se(UFZnAB&ie-$GR15>;xPGo~1~rO*e;#Q}N#+5Ze%Lb?XnmxflK7 z?+gl5nj5?F>F(jd%+Mt(f3huZg>dankrZ1?^q~lk23h{D#TX;KuuD{GzgT5C^7Kl_ zPQ=Q}4lX4+`VA{(y062u^A#T}k}~7J@}VoByr`BN1W$;}ZSEEcS%SDB|LZ zWaRQ{7dRdzfzn#aNRO>_{koMlu~z;$N)@{0{_BaM$CA_sNX*Q#7EO7R*@{;(rE3XZ zw^Pv>p>8!iDk_rj0-Yusubm@EuYHd%TTC*ki0B_7b9x zWry+EO)CLerUs$({`z}>c8PkS-do|k4$b9_;ZeDNItw?Wsy&u_i}aMh2aH+ocZ^`TVM$@TYNEslN*`sOKn`n z+<&t(Q@~z%kl5UHAPGD6_+YjvKsiyB;*^M{ zmtnI#i*Ou^=>S@xv+kLk8=IY=Ep&ADh78)iDEYkbB)aAzQFA zGdWs@ak*7p;O!Ghby3}qJ@Jz20rg-K#$@Oz_Nx6!^$^eYkl93H;z+w?F=6qDqgIBN z%5yrahdn(O?HgI2UXg9Way1+2mCZ^9>c1YCM?`M07EB^VF<&2jPa_K9%xb8QyUh`w z9@m*;YCn$Dej}C~&m9DGQ8X&Z-rD3=bUxLdMulBf4@qUPAiMu8xu~>u{19U(aEICW znH!jm*leFs3$w6h`@RAe?LVvvs;vrGkQLb4@p{eeCE>RU&aBaB$LY9l+)i1w=KlU0 zemDsHbiW1*(AT92Pdl#rNbNY7c{IY_o-mCCxW9&Ay~6z^@WB#r_ekg+wRD}b(KTA; zYw48#*l!RLqkaKD|G@iHGnFne$(Ji!U!tbO+qZE2n!=ay&1k6KiT7XDu1c21TPpW3}zg1GTj6ecg!zSugeFE}kqS0z*ry1mv^1QPH{W&GQx<^## zbfsF4y)o!YwFzgNacl#;FU)Pe_48kN$crmn8dc8p4Io@0*DrCaBUx-H65cUXQhXqM z6+wpB#lF~Jl3SC|2J)9ZG#x8Jj8I#D@D!iftv{blz z6{%(CfZd7Wc{2tS>)q^`;J$_49fYukXw9;mUVJv7#QPU9xJ#jrCF)z0jYU2g$>y;H z9ABad5C2+Ohn>ovSnzhy;Wly1Fz%8|4-&2kcr8Jx=)<*uxy7+}zaDVXf|2GM|3yoU zqkaNd!Iv$y$G-2%LK%&&EKG6J7ItMhx@-F<9VmeKyAuyqX4i|N=Rzze91XU^&j&lb z(GMP>wb=WDe|EdF2^=isu#rLy1m2Ch|IpNsR7XJ$ahXmkeiWivPB+c%x&^OM6j69v z1P-vMSTWzX2#>eA!84sqeSe5nAE<~nGI-{2lnq!*y?QyPf@qebof_eE?$MB>2J|Ku_BF zleSzs?ll0bG~(z2-Vi3AjqiQOq5U8{{2fEVNO+|`)t4R_&WD{oVM2x?*+U=oKpzaO z;O1fF2qj2i(mYnk$^Z)3V6OGdTpgVhvIyemJ(!xB9GxSnjFXP)HZD#~O`V^fxjtQ} zrP{wqGKwVbsj;z{h3R>gg!5aYDVdo@lF!L;UUmJe-24}{@hVuYHRjpwnXA_jEj`Q2 zwSI@Pqn9U`JObwbRiV&Hu2pY{LuePqs>8RtS~ zV{Wmi(ZW|m0P-f@#Cw7#^&=@-F3v(tRVv z`9rLYt#%c7Q=OsHOPms-{c!t$XEqqygmOhy3=1k8v!NK6MwS&F-zpx+s}NVaa;6oT z@*z^@BfLJsAIl7YqedbuoCr;n8(}Q8NNTF`)*-lJc=R!l} zoktJua+!fMy(<0mhGJ!`LX^0yil__gnCWP#QGiknG*vSebe$pVUlK*o^+C(leB@JL?$Qi^$9m5n+%sNPc8M%ckuJ&J;>^0mUNqL71$8J?mdpXx`ZMz0_j$##ewE8ScA`NcY$Ls%#9 z`i>gEIjASl%FV|=mv8<|SriFH2m5bB_ozoStSlGmtwhg zaIO(85)h-{e7aImU53dHy_4pHwOcTw-tQJQ8+Y!3fPA1DiC7C;v(ZIYY;1|2gBj?f zB2Q~hxB+S_Phmw?7CA}r>{0N{px(Qz^e0i9u=<2bPkaa#8DuigMXm#!X}YcW-GWPA&d_Zd=fViX?=$jJQ7e)4qdzI z7<3W^e4|DD02hc2z{+DJpUN@+i8v5y>^U+p1XO%@F@(in_n~}`#-4m07$`Yw^104E zI*EP5XbW?%X{vkk(cfyI?%u`T*my@rK+zbAm8kz$s5U^D6%z(xJLlVJrL=T&p2O%J zN!o!WC}g!zZ8_7y&Bl(;3yQy)L=Yjnu*WZgmWmb{gkfy)jlkXK#esJ5{1c{gf~~1^ z;Ep|h;xT%MI8aBBDDVyg02%ZbbiXiOw{#rQqyb*Hi8l%{@RTH;I|*jBsUYAH5rfx( z+53~VXpe}Wf=2}WY!h#mnmmsPT@zc<@q*y_VFl5hN`ZtpD8C*_&*Jchtgw4hH{G*d_(n#9F70H5P7bq4JR)Xw<;p?@q zb<6OgmvQ8Ckp zgt!DB4cLO1RNI`9@fA!rcL}D=xl+bj;$Fd5&f9>0eT(&G*_nL3aWw1wW}XyjOj`MCtEQJtVKsH{yePK*x=H6uhit>WL*hP;a&dCp{ z2K=wx;QS%`RqKsgOr1pT{4D!L=g#1VR`}^LB_#53fVhQF`A^miT)PXx2Y>gV;3AY> zGnjh9TPD1b?rbU_#_I6ru2LCSop)6hE)7F7k4;QhFs#?hLmIn4)lbi|HF9ZScJlE_ zc$Q6w6&;rKI=L*q+k6mq^=9wEt8hD(DtH4n^(MIi&B5rxl=v3&I?U<1vHZ-!?3nDg z09(55Bs~E549w{3rEJFbc*{;au1)7Kr|ZsPYxnudx%tU4=^QNTtx^hE8Ih}e3}$@T z;^kI7OfPaPkDVl#3s`LUNwDH_Rlj#?dOY~Hu&}MQOBJ@PW*-~97tfDQk9W#>P( zd5D#?dM{Ea!K(=UYLiFKj?Q^6kGGUpM~bs`x;tasMuS<9XRj9g1d+IGqujkPIXjOX z-zT4tTiD=Y=K6#T67)Q!o=8uVbjlOh?op3>W_o_&3Vj|6U#cBS0jYjC1CI(c&)#nI zdfSJQ8=aq-z2OhiCa*wt=E}@8J|7D}P+1KDZhe{66B4SiVP<8@TBa&s?{ef-_DXUU zl3(7j++~hA@uJbkM~^JidvP<6<~O!41*HMsS7Q_UyV-)b0N!fB+W>c1@OHpEEO;m2 zT^76>@E!}^3wWOe?+46XaXjzMPQV8(_z+-hPF=Wv1n?~ud@JCi7R>#Sk6Z9Fd99U;&<^{2fJsh|@K9u|GW+(tbfoKxk5Z9R(@sz_2mJKH5|Q z3b8}tm8ipkBqq4D3+XN42)YQ?0Q#baBIRzLcVl9tuw6a=Ufy;At9%czBPQ1M_JE&{NOm@}j=$>&bkz(?PHdl2m zb2}fg(Xt}=Ep#W5I9l=xZja)KA0FlM=z2AjBvHKX4BD-z8Nmv$3CO_ABt#N8lye_d zNGH&aBjW@tPokIsdRc>Ys?{h#n5%$v>MAf;1t`kop-`=M8tGXvu zyQJU`1l@^+&f}N_DdURqR zxOMJ7#HdduzvBjL#P_g}iZ+~COliwqgJY2`_ir}+>9_r(qZEI)qM$tuN~S2&le|PW z>W$Q%tVNy!$y1ON@fDba$_?<}m^=+dA$*P}#|QKk96sn#Rzq~H^Ltw)tsaUht@2%g zFw3!m%qd-uh&D%6a0P*1huxhO$)t2hU0f!m%)?X$cyEkn37Mw>m$l6ES71cE)mM#a z!uUCA;P|&qm@h5!tW!;4ndhN5Jn>`~K4dm#MO z8sP{2Vqhi2!zoUsoH*b7?=+Q|S;;|wwm#}K2V6 zRy?*ACZnZLVGu;NU)n9gQL&i6x`Fv3Yw zg0Q`tgzaZt^$u6P6HA0r`NGr`bgbpb8b+WVPhFguouVe4^bC}am&AT*E`h|g;8HjI z4xq~w!+^O1Yk_q~l<6rrT5N0^F+chEgt-Ch z0V^;&O__@@9<0Gd-@i%^5Nrml7k*YR@%jWy!6sZvv)*g7lXDX$4bBvT`Auc88Ss1L zC#D`TS70qz&+74hObLL502AXR7v?rB2W`0RDf=hJY3erjU_0Qwp^4e6lhdP9>~^6X z><6tMTzyjpm zg7ttSX$lR%t}$zu+yeg&|F((y%puW&-7r$PZ}uO`%Q%FeK|q|=4fZ2;#f;JpuxEZx24*J!jL%%3J9^74w{#=q6y_V)Wwf!y6hS=P zHowRqHfNll=$V*%Y<}jNJrKJbb-;hjd_7FnM<%Zee!zZ{10^a5ObP6V zyv}cd!^TKmulj?5>WdfaA+t1fh;TQ|eu3T{4z!+!JNwnqzynA0j5FQ$(L&%MXuGXJ z&<3)=1K8%5^VZZdI64ROWoC3vuXgWMj_OzGAIkPwm;|5F4D~Vn1$!o8-xXYHaE<@O zaXn@8-H(n=PftvhtmQU6oI~)R$<1CFoi;{9(*~5oTz@$rve^>1Z+Fx_+&0TIGYvvF zIep~}BEjb7hh`V%=6Pq_|2ptG>hPZ*n3#Q}ZwA}ufCx-qu_wWufpyL2fZ1So4Lo#L zpfW>Dj0sfimF6A5ukQC74Pw^pJe zhg>s_-y6Uh-Lp5Y&Ci6F;%SX@hml_mLpCukVdkcM%0uke?W_|8G=3>8f`{(KeQ-IUraqJ_6tq0kdoSR#7MuZm&VtVa&RQ_% zPrn7{01sI3eSiloI1gCw8wqtKM6qGO7p(gi0W){6*Ply(sd@F_2LV51!7l)e{Xz=& zM*u%;!J~jLTksg*aSNUR{D=i#0sN>1PXd0C1wRHD+XWQby9#*Pf@c6JYr)?K`1>vR2LMC#FO1g@0e+1I|1jVmvEUyC{9_jU zTEIVU!LI}SdJF!)fZt%jKY^AU1&oTnZ^8^Kp|<=fTo$!R`~mgTIM-^CYV~IIGcqOL zCV$_q-io7ETmGDSOIU50YkTFz1Tux=Pxr^TQ{{ZjhT}L6=JraJmuJfOe!BKML zY&zAG9(0}m0?`F*J@MaQ#1_ko>pEXWA~d8^b)B!Fl@gD-&ey?=A$cG;@?7s=x;r=6 z<2uiQ;|gu^?9#QjA#l-+Ib<7))jVztDj4_dU^+jX9dcvPx-_3n_4j1cR=#OB29-;V zzU;=JUTMgt27A*Znf@Udy9eDEG%9i0fZZ5WDC^I_20qfC8_Jxygh$Tg2K(gexiRQc z0vU(g7!)Z*wp=#`T}r@_-i<+tV(E+B81*Og(Fk-B+7og9abr-L*#0zb3@VZmT5>lA zMM){Ew;O|s#4?+>F{nk#c>uaG=tcZbTQYHAO;0+T9s;vl$^-8n{16*9&Khi_16>Z>))6nfb=vQ; zF4>bllfq)*y_eBHRw86l`d%KG1p6gtFxHA#-1G)-55yv9W`JJ-!(isUe+SpOn9a1~ zbl^0=8=04s&%sN7h6Sh_EqsZlA*^7`pP}?%Uj}JL@p0CgOZj1Zihj%mtnfZuZ!y<< z(?c@d()SPf7xVVT4dzKbl-5e-OY8RdeBj1<>xMa%uKG<_9}zk)^Gpw>XE&;{^Q2+~ ziO05DHD)t?SP(sSlX!};RUPIj-Ph93VFw?~B;9d)*tb<-*c%0F$sqQmh9LE}%7ttO zQ$_bKH+TtHN3MG7lFv2Bl~hm92v6``HH;0kG3dIgwS`CW!(CQo?Q*>vjbfD#WCn;) zxum$yU{dZ$f6|3kbi0K0?ZWrhofsNSVb|?EN;gYsjdVu3&t|e%-)(-4siC34Oc&O0 z9`i&l>zeKB`b`7l#ObMP?oGp8lZ#tsX^Z+!d|#=@yJ044ivvxsZrHnH`dkJ3$Qv=+ z&D-~xmrqv#$K!#Gehpoz?(@R~Bl&b+ z3iWj7tLVHDXk#Fk&)jc409t|vHv3h`Xbq+ZQkWMb138fFD%z4jB|^{ORj~%~y)n7G zZ^h4x&)|VFkXQpAT$q0K-W4gn&R{x|bHd|fP|-jNTmvi3^=Gk|8Vj(gSzi#KJ2!wQ zlJZ2Mon{-9ihzoWu9?aj(6H=XFE{}+*Ms{~1A0zivD(-4+miE=VtlO7a^Wh_B^P!c zj$bqj^*wc_7O z4FcO-KzGA!^rSCjh}Xi``^g?+>psSA_h71GzzP2Ht}3Z{_u5=KS@hx_>h;)xD+S z--a%A0F*GF#=H*qJ$L3zHq%dTp$WscL)M315)7@Tm;EGpJ(wA!@f~HOqay;!Af~kUDsx(s!}iWV1VOBB%7?13l#@(nQ!? z|g%iIRtG2^MxZg&c3GN10xXNEA1amESl zO(VI<>60ErKcpOnQ}<@LKhvG-Nsj=T>jkVYGw(ad7svp}M7BU~WgNY^C}X3^=Y?Dr zOxnnO!?~dp9@c%z4-a4|fRDE(K5pvQE!+%D{8G1xGe+`Ag#;w*y^(1zlgHHd7lxkD zg_?6+=Y%=yL9L-%W~y6nphrDF1Z3KW=k;{DmoPwJ_(v|Jvcq`1fmg_h8n}h9VI{zDjR3?VUcvh zBU8C43S0m@EX`faT|9AoBp1Q*ZdplKkzv4%i8IG8?z7db2UOs%LPn|k2V$eHYL z9xGZ}LKD#06kZuJc<)GRV89fUE*fQ)h>Pf#DTs~_4vn0HblFctzL5o`AL;usQ8f~W z1bJ}?Ej1QylEp#@pVTW)=fPIu4WP{dedlAkL&N>q92qb9Zly5%WoN%07SS#{n`XF>?&=9Xd&m>CLa-fKybbNn(DRs`ew1!W04MPk?WnJvCbZG!+i>sVl zKD6->5>{}D0}y+p&JvedFJ_)RJq%@lW_hGdEY+T2tUmI>=7m6Z@d?jkx$><*zE}$ht3F#OPdvB9AIO-dJC_L2PZ`X)4^w4~w1&FHpFY9vsXKnqgU6 zxQgQaz(3}Cd*QmJ&oTGb74D^mF+VVEO%vf8XHuE$Fo_4|v3yD3`oaEmcBBW&HV*Pe z@47HRMnLp#uJLZBdQxDY@p!v;g^Q+_D$c<|RgK;~uXy2M`Bo$JWi-eeoTvA&zNdw; z!d*y;y0>zds|^k`g(B2)50d==nJE;3;HZm;;03ykQVs}qBd6Lh*9umW=qw!QEZV?S z8p5j;cY4;gWc`S29X@$?BGx9OG@{j`Mmy>kO2pt(2VoR6qx<|wA2?$0L98tigQjI2 zZe$>Rq{+n!6KU?js}936GTfifL9uFdXamDT<~AJb*5h_x3c_1|nhK5FFqVR@7raY7 zZVq*KnG0~F!|P)%n{BG~V{oEl^FyigV1gOVOKXiO0WUh;XRv|#bD10PpJO325iq)1 zz>xQW+gwZG-cSZ?v2JLad>ej>Gr*2QK+R_{4|M34#XyX7aUd{=M8V!TZPzbrz6Z4j zR-^Ec+khh8O{h~-{bb&C(>wWr)2LO{GWyys@QAo(mN4;~+lE^Ojl5~MXQYdJpo_9yuc4wR!j}soBJ43%eQ>0Q zdKNg)lT(|$8H1(mDa>2FYnDX?pF-xcKiMtph?`<1D08zNb{lB^yj2n?*baH7+`Wz2 zR2NWY>4H1a$stH%c%Mb8x1L(0q20s%k!lM(w@7{KjouH~(6g8t0^-15%+m_`W>$|P znVGKF0F9`cfUotg!`MhAt9QL4)C}bUpewQ5nxb1nj~EHouVagOz;veQ{${Ujp?BqP zOV^5S7xfS$LY!f}#I|4usCNxLu{ZP%g-42-+f$~l(1WCFNwB|xS1Z)&jSZiIA+_+7 zykW_w8XdK}bX}o_t>=QZ6+O4j)Ca@@%Lz%FUJG{TV3}<(1vC9;p_!*7Ozc>`$;`VX7XjSV3?_%S@~s?iE59QtEirrtoyZStUvkC!ROXE>Uvr1#4fzHjMrZ z09QjT7i|lXw)KtTi&~(ueltkgSaHZaafnh0)f=}|ED`X8 zVmq*h)Ac9HtSoX2s+g1j7(f?_^2Q(z;3kbz5r{^`uG8fxN=7Wr-xoO~MVYwN*pNx( z9(2pgeo%SGGcDa|hm$BvPd|?iK|-!P^+Ik^QN~qg$vIeY{B=i!L0)d6%*yzwL~fDj zgQUsL3Ua0`0af`T50SlW@=NJyyi5Q(A0iwR^Ajm#6TE_8KgkXdzK?x-5gqqf z9|EqB;?B#XNa=I}VJ--loSV3BVP<~Ry0s}kF+4rTlz|AQ7|%>2F3Gyvo}cK$_87=! zYa$k`dyV;tp|Q)>h1NVmQuG$Y)>X7UH2T$hyc8dURnP(R2KQ-dAnPBRKBz!j<49oy*aG zYP0v|>FLKOXJ@9b2K%rc9Yny?m5KftZ0Br$e7u&9z$?)-dOnO`zOl!ww%gdy^jPXj zumMaIoq^Hc_Sq_g=8;$pM*v^3;70*ZTJVbiKW4#GfUjEcG~gKvz6SWk7CZ}h&VuIw zFIe#7fUjHdO90=n;3oiolLdb>;BT>Dj>k(anD6(k7R>j1nFaHGUT(pBpI2Bg`~Phg z%=dex1@nDgWx;%(S6i@l-S@wrcHQ@3?Yi&7+I8QD+5hje>LdL97R>kgfe`$I7R>MW zLm~JzA^3+anB(yy7R>SZQ48k#|5ylqtp#(ue%yjNKCiQ2j?e2YSceMu@B0(D|3>Tn zPXd0E1^*P_pSEC*$D1vf?ekSaH4El^_=p8_K77=IIUj!Ag8BV_!-DyJe$#^4-fvkj+xu+` zW_!P5!EEni7R>rSZo#bYcP*Ip{hkH${wFM$IWY^y_i(B#81&7FTQK+ur`m$SPdGIe z4E*7^77YC2BrF*3@6=i_-ruRSV7$LmZ^3wfCuzZWf2YBM@%~Pu1!KNCYb==W+vLMe zGvF2rZUx+C!D|7pvtZs|Z^1~H7R>kEYQcQpZ9eRD z0N(Dy2wQA-c33d$+iAhPzsrJof42p*y*(Dp=l5DLpWkP}e15+LvwsIHnBSw*g84lT zS}^9LbI5`@9}inFzt0g1=J&hBg4w@YL-0`xW`B=aF#CJlg4y5Od|1Zwgb&O2yWN7> z-W?Xq`tP)0tas-w3ub$Fhv1VI{C3CP-?M{~uI|$WvdMp^B zy3QF3?ge}{1ZR9$=F2%BmiIsJ!*W0C!wy1uoqivd`#B5dcnnxD$KyT==6DQRFyBA# z!}9(^7R>h_4#5|E81a|w&P5C6_qpGK*`G@m%=RC!V2qjkOgzTzQBSxUteg! zoUbDm%=RC)V75PM!R+s43nqRTvtX7Vw_ui^uwdSQ#DaPMiUsri9<^Y;-=qbzy%$+9 z>wCKcev%aeq%=)G+nBz5L!L09^1+%^vTQKXJwP4ma=fe)?>%0#mjJn-fuwZ_V z$9>qj4)`TLjIil;=Y|hEkk6cNvS7$(&bK%(_2gp*q0r9DEcoSsUtz%rg?3(P!3c$R zUTwkO4){AP82pd(T^0=f$N6pxhCJnbuLUC%+WCG9{sF*0Xu&@O_%#;%!+?Lpf`1h7 zk6G|*0spuKBNWz2`NsKa3w|@;w^%Ue^UqlD+W^1a zf`1n9&sp$00Ke0M-v#*H7X0&o-($h=1^hk>eiHCg7W_2eXDs*^0RN)@y#+r#Yr&k4 zzhuFjkMFnOp9A~>3+8`y|7Ghw>;DxCX8j+wV9xhnwP4QgU$bDg{}Bs* zC*Y4-@Vf#3x&^-n@NYQ3>CI=MSHES!?B8!&F#GpA7R>MWF$-pYKW@Qq2mHG}Ecp5N zESUKD6Fw~T>61Pz^y&94nDpsW7R>ej2Nq2H^hXx_$ACX=!G8kyGZsw#=d(U6_~LUu zjD)@I&Y$_P%!fa>V2;P$JTV{8!YvIe#sGzl_|03f$jL zCL*7AH!BI}{7*#8o6gL6Z zd-2sGcOe{m@En6=w&Tb-~17EHTw+=Js@9QWb4ALS0<*a`R`j)!nOjN=g;Z^7|a z9FO9749DX*-iG4|9B)UtJ8--c@Lf3GjpIoiksBUKMPN3@kwG{q9J_Gr#<2&-G>&I* z?8Wgcjv3T*4#)F2W^wGZvnBk+njrcERsld zu_WhayNT+@kvI{)14T(xnUo5xi2p+p(=EY2jJ>x9(d66at?fvIi+#21yTxgky>7b- zZh3nbf7Y@?nmh(NoA-r^9usIKg2x7?H`Lph6*~3(Z^UwWIA)>%loi84#G=4M%^tf$q~!{j-vrx7{0 zt0d)jyhME+R(*|y`Wms?*P@=7?6VNV4hu|^%nYR5sErv&Yw#W&b_PGu%9TRliMQ%Hk(Xx$H@cg2>;wt3rume4roHIA)hj~Q^0<; z{Bs93mUI=ewynleTf?Ph^|xr%RoY;t#5-dFnibp`dCl&}6m}k6(jrgHP0U}=E42Ze zpuxyEdQG;ml<_$syZ0uL^WHpjVBh}e2xKuV5%7o#qJ(B{1ao&1m>XLkG;=G+t!h&e z$oq5>n7fN--LC3M0&Qb2jZ6}#TJKL65l67n7FLDun+ncHCB6$Bjsxgre)dS<%a=l9 z_>?-PlE~2D$2tsZVON3mpiS5eeW@T_YK&OpybWP-M4^@wU1X@ zreC|aX&((Qey)HagOwL!-~v{~1|=7DeG9k0S#{#x}H2Vj0LmEjV4W^|U zOba))(MY=nNRb=PfIUL;XEH}hWq=xqY#R=|N5!62RR=nsQYIfYE0Rpo*rfn_=c1BM zsZ8VW22&Y|0<$uMG~6%?)jk0WDyv5 zv8rBMsCuobnma@6Rk7!QOJlC;0LkTXNBlWl_bycN0)FU+-r|9;_c}C02gsw+kEc{3 z+xbzX#eO$7-+W5?RR3C42jD|0`R->`^3v0)q33l6lO>e2(iP7T-#bkqvS{3`MT7!PJ;=*1O<35_) zAe!4huy2fP%2tYGokgUJ^nPN$HNzv^WuNCx^) zE&6_#AT-5m)e)Y>cyj%AkH@0fU)EvA7B)e z002cv(=2t`AA>nGHqP`?H9cW?Gt7xrHzj=>Qyj&t!Tbn#k3jONg|VOf89% zV^c`?Jdf`5@?b;v+M)(W?98bU42$Lms*Gt->c$sUM=S}a_-7` zLe8-fFP^EB^LjZ?%6WsFH_G`MId78lW;t(>^Hw=;BSwT!iNAaBVhZ9Qx6s@GK4Ohd(^|=E4XP4aYrZcgl2FzU})M=nnSe7#u=Xn&bTLi&&9RC7yO+- zfyHsgFtUyBLMTmt&l#kvp*L^{g@CKAS6eB9Z{r^#*{d74S{zl z;(d<>xRPSVp?EmJ_C(q)EU|o4-`klE^=!YDw$4ZH_1D{)JWNW>aSj*oIGS5n@f!S%<|5JQUo^V)}<3 z$UT8Y#@{g%us=eXnT05g{8_|up2>w)8AQZ7Q7&MQorG#gsFs9kO{g~6ZwG4&GX(2n z>~enc38Th{KYDR`9J}t|vggPg(yl~jlCg5fubYKhvtTyys~x{S1pmjGg;iRab^gmk zc@||I`UO^F5rUeOTzUt{>>iZ;iYj6=lMQDBYrOgqO+4!!y*@pjlD%8NYf~3%9{Hj2-KDu^<*x zEh{`TGqwQAT+j3F(QETa7mLqLsBdC=L42vvhQKr2G=`W*3U-gqP5>#mvtx1w-XC2W zMC@l}9-e*RljuW%-K)SFx5!>B7e;3%nMGgJL1=CsyE34+fv-P-ZnS%MP_O z2^BxIL?CS?am>ji_`G{uCeDdM-UB@>k7iC+6b`&k9_c~-1>cM%~4ZyYA?16dVo3#G7;jo0No8FLGGbJ zm=P!uVg*)YH!f@a#eG0hgW%jfeA577g1mejJbI_8Xv`q8JDY0D@FBotwfRelmb(0< zrkWNc%58F6lK7iwX#j$2)Ci7^YRvfptHC=>gE2An#9)mg?xaFtEp!yzM{*mE(0XIE zjsxX|c$U9=+1=muacFD!>q5Z@JPWb__8=oiI@6D|4EC<$Ar=OBEY59&<7%DkG6_4< zrd3+yfi4u`z50O4^PVUuAW)(GPCy5XXzyySO3({dWS|jG^9erD4y_Fd0X51^;)BAt zbaEx54h2&*BocT>*z!W+enCvIU%#SymMl;?goHK4XbK0aNRnQBduYQbaR;}+GrCL4 zzOtrbCsaIkJI=i|RSn)l8=Np&rhHVJ7&bUmOX=R)eHRBH@AIS>c*pv2+jDRc^4kEeRu@W9O|dt~V9Ogw2UT{-I>I0~OMtg>E%8mJg?#inA6w`d#u4hc6EVZjbu$T9Z3+8kGJ5s^^xA1OOs zNdj+sO{?Jbr%qYcCums_PhlbPcNhhuuwrL(x$~h3402sX(_S-tSypH6R-a`v zMbq{`fYU5SaC(-oC}!+p>?gupU4;~F74k0l^@gCY|!DR;AfXbniy>6E=-_eA38E!YAlSNmS{#i@4Wa6%255>^(s}QHqV~a?F z--aJK0n2g~z7{+^gNrx*N9}KZ7swBPm3NPpQTv~hTC1h$qE8fL+$(K(So$3nCr+y* zrB+CQQMzX$okl@1GC1GJQt5+W^d175@M+glrP2{Fc@Iks9_?BssWkoZ_pZMc3x~fY zEdv>JZGfX_pz=o2PcZsGdhwj$1jh`8+#13!g9q7 z=h$|JilvAQnqPp`Jc?>yF%3)0%Mu}1&VRZJi7dTUUvG`Iqn5DDt#UVUnYXI8B!nP1 zf*e$B6>~UQYu)M|)UY-cAD+hc%8|`z{(OkW2>TyCM9<2xM7Gv48rNgyp^;!C&^z!b ztSR*T)b~CymgMxybk+f0P)L{uFnPrNfS`9W2gtH*pT#tX*AVM4~pwAs`-{mAr z)}kd#Y;PI60m?e1@Apttnaz@4svXH;0Qif@Ov@mL7^N=yKp%!$ivw}E7DIRouiQ$ff}^fFCiXI@mygp% zMsG8JnT1SX_No)JRFK-5+cNjSRl>m0;5np-OR+E|a9z-ooKr4`X~e5e;i{*4;?)=! z)A<|MCd4s$IhwcXN#;UY0e)CH)^b!N5krP#g$QZInl`9KmWiwA69)xd2OVurvKEU| z_Iz+o(GlxjSDjuGx+v#+vrP6WRZ-@$v~u5&$~NsdPz`+10?dUx$bxC;u(r;EDVlGv zV6A-9K6=Da8mVeM*bYElkO&}=sV1?`Jqr&3xYIr9`7iIp9gY9SfJLX&n%KA~yEGG%0 z)>MpY=)Q%jJv$(qI0=YdZmE91a^cXBphH6~419Ikz{mPUY>mxWooz97`UXDI6Kd<~ zVS=EhE`~E5{8le0dJ~wy&0#V2Eidi)%#Q;{@plI*uqkyJl6k(XC!3{ci9K?#TR{j( z7kMZZ901{hUGPwP{4wp}O5B>58ylV0py$XCXGS&9$nopxm(0(OW~LvR5k|0fIGaPl z|A8SS4h*66!;2|E7%ecA@7Yx-4h*##C~-|_EP!xS|6+Z8H>&a4>aMetgxkhE2p zw@}Z@85P9%ba0WmQZ(QmCVd`M{flvAreCVG2b1<>V(6IW%=EFzpeC|b+R?bAcB$ZK zg!~M?qY=%8tL4Fj#0!4K#U4y_ZKP_X891f|>%XK2)0t0w?ngchgvQ^!5!ZV`__9sF zp=E#btoi}rFSO``Y}?(D)?UfCSs}+#UTsHHzGu(BbCCs8Kn*3kC+d`0)=va0m3q{6(~0`C}eh6Md9Ubl@gM6ozh! zKi{^5>PVLUr+pu53t$Dw?B?*-QG-M^Do!%sZ zOfs%Iw{-nWIgw{2co3Ga3K6rEd-TMNUusP5Z-=X*uS-7+J07dV6g3r;Q*E&pE!w>UwBemlZM{os@>E;8Cbop| zdejw1SD1!_ow8lZO9q69BW6J$V^dln`#r0(+o9TGXJhc;;olRY;G@p09!|X!$kyPj z3CGRw(%6FIb{u!$xCa4T$RZN7VSV(gztQ_iFlqdqK!p)_2X2ul`j--}=KE>LM7|CX zpj!Od4E7+Q>JXtNsy;7aMZl}PMhAARj-=EO=vSjSyS%!>Mw z*l%|dUuUnFHUiesGNN&yhvkGP%)S2s-)YP?>TNkQVNk(L8^Ak5N&y3EFGd+8Vb3-l%Smj&9 zX(KUatli@1P;(J`cc)eMx%8M*6y%TR==0HM^mn|{AfyL!*2((OZ262kow|M{jp{%$qNNK&t{>t?i zzU+?0pJfA491sIO4-Q!HxF{lgzZCkfke*aysnuXD!zUPj>9nXFnYiqj<*EwDwy;mc zhnrsUx+Mz!zU}RQM)3FB4=uN_TXUr4;@4)s%?cUt@~dd6f`94mMHc-1;@`-E|7Srq zK8N}0k&UIh@c%iOyU$Avt1S3G`^gW!>qlUp`|%VPv@PxkP)pD3cyCgjRw+@uM9~ELuU4K9 zjUtHq_1I`r6gLqBaXmw$3*zud{{M|2t}`Hz1J=AV_F57in$ZSy<)?tHkDJYL3pijc zP-D8_KE>@40`)Fj)@=G0fp5PAL!pmvnbm|)0 zpW*YwKz21#63eAy$+JeLiBf}p7Bv{mAG^k{5x7dHr9<+jtCOmMYSc>;O*JPgGo}2TnpDNH7Ls^X7Y2h@)hdMgTx*N} zgRNbu6=$W zRRxt43hfw-Z#exIJxK+Qb~DLlBIIvl$Pb4u)byX8-HDtur2jfY_mlqXflo?i+y|ee z_l|(CbRa&{@QK_}yj$`7*-NTBB`OMmWGJ56$*nZt2y!QCoTAPbbo3}o;U_m zv|W?`qd^wKPe_qf5kH~8@SxGA8Xn3eFaR!Pym}qNHV!3;)ck{Gn9U)Dp{!2*DXY_f za4H2Nr3O{u_OT@83P{_P5caE7l3Ci%LL@-|Ogn)n{fj)BbXuf0hJ(gN+6}2}VhS8_ zLsG~E?RQXon&yVgZtI4;q|cNQnWzi_*(nlc1tnK)HL6C@s5*iM6cVYWD1(w|pICF! z!{AF+!|kz%s|*dRgv!G-u0n}kTMa8Cf1)}AP%SX0>Z8iE93y_o|HnSOA(`|Dp*%+*XQ{2hJ*R4TgtuvBEsT96 zSF^1M{ku!ma*ZESUN=!jrmmGMvwi9FQieJ@X?mkzY_gHtrb^PD_YZwPAoO`e=yPD`6Xu`#`)u`-Z0a~uCm}K$ zw}`|}om7K&XuhA5k=8cNK`Z}4+tf*A8L63F5MSL@^E;4xL^JCf7`AgTyNtv)k@#v# zphWSNdIF^kQR1X`Q{UM;278eNlJS*DwPwM_vDa40de~Z-27T!uIZlydPm)q09Ig=? zW_>tzSi}{<(2liBLYFElGLA?wb#>=e#vdB_xw33(GXj$|Qlb;-kap>G-6aM2Q${l(~RdP+$r2X|+8By=wdO=Of)N zrQDUCHN)c2O8SnYEkvl7G{m{A z$!Xes2Zd^y{j^A5v=TeqT-kbWj|)lZ(5Ov|ooX8v*O%0*Tla9Aa{KD~;dGL_%0-si zM)e4Rir^O^Bz1{hO)y-EGg~J`Ya8f6`aJwPnZ8Txm2{vHM-n;| z*pcEJ(MnPz@G5?uyu{KRYzzdG6->;@1xOX{b%E4q84}vdAkulsqF^o#rfl7--gh@?_H8TVMPs{9v z|98sFgnidtv+t;2+U#1)RB>LYFbQgY%LL@nC;M&!-t3_`;G-gcDh0*TrEhNRv{9I* z8#W=`;N-?u7hUe=#$?{gzxwpvnFl(dnFy$3VhgK!-y zJrTxvXH=6|Vj-q&m<%?qg^5ptEh<$zW4g%LOMv*$|I^gmSY*P%g%rbu zST5dq|H`DBZhjqtMIh@4Q9Trb5J$M|wY3B~fRQc4F^XhMOTDJ;G^+7|9kp#DH5M-t z<9MsI03Nwo1m$ckUOo{qt zu*9qSM&JKNs3X79p@otb>ex#i7AdMmrai4*>dGe_pS1F!y}j1rF=l`=(s?DLq* z=utwr*5zi0gPtUUVd$qmd!fxk&k(qq!9H`k^7839vb&|*3sI`_T)VH(jN+tesJ3Pd zeWzQ$-L&s)&VoXl&zxs>pfX(@o^q=#&s^m2SzHcUC3eP>LYLEJDe$-o@kR>p&{rAi zKiy>>o3F^@ba@aXp+B?Tx$v|&->mYdN2?&Mhsdyfn*=MubbG^v)uQhv? z{*}vJM#Vw!ysOA#Ar^D-RVsev#R#xbvX#|%&?&#ffdi0UUm1#h@ZiC3@D4o+KiD67 z2ZBWg7QJ(T1QG9q7xDD)Ppneuq1{T@&*&?{=t3~MqKlq=4N6u#vpVv%oO+!JgVgH* z{waiOcZ_u^@#1c=QhOn_4q4zd7QE%fcCQ`7FOfDkL5*IrJGGax)JG|JWGS#atci2O zxZCB%Y0cFto`LUerRd^9x65ls+o3AjBZs-nrZx-A3n)eHA=7iHkfX$`2?w+bH6>89 z!(Cv;S4EBz_A5d|U!~E%U2gOIA{tF*OS#u$DR&jyAbjZ|Ec9mY5bAW5yFIo-2&qn^ zYvh~IyD7!<(2w>!4DnR_)1m&GWae7!fhYXnIIeZ_#j%j^BXS3td)}7)9zt{|eDUH3`E2vbiCxC?27qva3IV zj>At%3d%`oQyw6Y2ByYM66<7)7v|e?O>=bCextq>dent}SXk~hBaVuGh>VPcTO2Mg z+CCZooR7OisK*OY09T2oTM@rDiij>NTHDvl4w{kd8YY+1w0zk{5qjrq%0>H*9d7C3QE4}&MGx% zfjpc8LdU3hSp?U9QtT@zD$J#yr0O&a!jIBWU6l%{etHM-BkF@PZ7$F%qfZ4IK^@cH zBe_Les6_IL91gvz>XS0|Nd~=BHqY!l#;ysB_A^!RFiyQ8t&TON)-IuDqEht;Ju3~h z6+NTX0w`K-xkc*qft?6y0B?!eom=GdY1P3Zf`}1yPqEE9o<}DT9dsG{%0zmGT*vIQ zN%RbcIPtTTLQ@isOAS=KEQI5_0<9@^c^RlTrTzdnlc%W^Lj9#8m|W0#L@-Efd z!}bDg>Q<`<>egY;cLGuMzzD4{ZktoVXPl&9$Hh%_xqVevFQAQxVnP)%pWo z<&c=zOKq6qRhbQm3G+m&8MRsH74<opn%wDq91uQL2qntA!DjdjQm#b^huH5>W?OeI~t9wKb#Wo zXyzfjv?L^E4-6lza?|v#N1@gET5av4_0n)pr-%8NOTz*MceJJ_pjX2W5#y;fyRK|i zsyIBMwLSL~Th>%2r_G16?W*A6jv#f!I&5ZVE-pqTsj%q1f~i22H%vyF!q6Xt6c)`N zu&kU`RhaU^1wkuV3T)aSfW;Up2>TQ}3iQ7m{ff;ePv}Xh_ES}LdOWJK#I!dM)YMU3;PTjy zg*9Y$v~EspA5g1VO5J9w)n<(p5)OSTB#bhb4=P!me6>;NEr8C3Y9bqfeJNr{Wnpgb zO;llY`*Iz2=RCX~X_zdS5y{>X*wR*2vPx9T1lCfa8J(DlZ}fj>;NK*5;ju#eLXSeW z286W}9_eyV)zRshu|O!sVnO3ZbVBcj#v}E9n7-4czK)lv0Q9ocOwC+EGZI7qUvvq5 z5n9D)Wq}M>Y6;&3tq;>M&+TK#?>-((;lG1oG@s~UIQz7X7iZIR!gUUs~3~2 zuXiWZN#XJA4?1a2LqAb@&_WKzKUP}k9{L)~%*d0@^rXm*^@z<$^;fy5KL-j4BVWH- z3Vm*)7>N)U{ZR@YVP#WJtK>Ypht}9wLa8XZB_fzpy}nrg4uclrn}RpdmSh*vKh=_< zp!jDU(V1hO$J~If}ABi@FYvA{OR;X#aNJfy`Z;ARRNGYu+ryx;}g2`a8v9AcSa$?1@igC3S_0{9_qs&?C@7n7uj^F1PU*JP4PrKL^ zmczNHA^{-g}oHmfsly|W|3Ec(b zqA#g0^>Z4|Aeq#C&IIgm_Qf`C1fKr)eKJGw=g)>_jCrQ`kuky^!qif@G}{l=&faNl8~M!?Qs=@Q-A-P!Rhx` zGx#Rp*D(0Cz^`NQ>w#}(@GZb^U~p=$8yTGHcN2r(4Ez=bzZLjx41PQCI~e><;9D7- zu6n+k!M6dwhr#a!ejkJ14}3d=?*RS)gFgs-Cxbr(d>4aLd+%oOhk-xB;M9JPGWcV_ zA7^lqzb6=+=>3Pm>Gw}EIO)5m7@Yd=X$B|$&oKD2z@KAq>c8h1ocj9(27eLwOAP)p z@K+do5AatRob>l=3{LW}m%&LMUT1KUhc_6U2LA&1mkjNe_-$* zf&awdq~CsK@Lz!c%HY2N|DD1A0RAU~{{{R2gZ~Zu9|k{2ZqW#irFUOb0)r<4PhxN+ zPd9aBaEi=GiQo#xqbZfaAy1|>28TSEIx#rvXQDIAy8VFqnL0;sQy1V}89W1cHwMoH z-krgF0Po4*NGfRR&EQBXXzI)0{ebsp@BzS&VDN#!2QhdS@N5Pj415TK=Kvqd;KP6q zXYdigM>6;*;G-G*NZ?}_d@S&B41N^w@eDoz_(TSu1bi}sPXRua!KVQ~n!%?7pTXcW zfzM*_*}&&8_*~#-2G0dhF17V437E16l8GB z52i*2e-?NXgVT6!W^fwM%NYDc;L92OW#B6qd=K!It#H=9qxzi8d{6aZ?L8{*sm%Ap zpSAZeUzko~z9;>{+Iz6aO)bp#u*XfTy>~nCGa}!c)&M_~!Pf#`$KYoHKRbe}{dEq5 zQ+>{5aH`LF3{L%XK7&*JE?{u#kM#^r{c$0K)B6`iaMK3h8yWm!Xx0?dC8kReU2+*# zYcmk|M}LEMDyFi`gdIvEB5UtaIuM%iw~ngUOqfiU<3;Uo^+?19jzTob6?l?hx)Om< z3RFGifJ3|}^1pS#r*`oJE}q0fF%vivCnB5`H#_397e0IAvkyKgz_lMfac2)gl94+M zzaNNCBu-JX@R^Oz!T6*A*c^Ng#rMPTIUJuO@HrCCN8ytKVvoe<7<`V!Cjw&;sEpH< z_?&>xiTH#M7GcUvOykFkKFJ+1ZOo{j5zk044;5k8&}}^cHG#^e+8lD?QXmaNhp-P^ zj^No`n3a%`0vD*gzTO{H4@vkN;qPS1W>WIG=-YNz5_?Kf-2`wY z#B~RKX9O>*Z9A5Hn{4hn+hOStHO|rClvj+tmCk85M546OPEA18>F!!Yu+g}}r`)~t z7#2y0(m#Zxb{I$u>r8I)=dbG-8YnXf>d4?^YTejZUMx08^DA zNKJrblqm{QA!Vj%NiVdM`BLLUy_}C9B579tvYJYN=*Tj57t^%|&gQyBluffMvKKYg zG~w*B{^W4v7ct5s8KZ#?aWKYz-l+A64c*k&FCD752e(I|Cy+Zb9om_$Pcs>vw~SHG zXoJV393Dl1n9sv^GrWv8P-i$AdUSM#u8LOU=R%*E>L-08cR3%Xz$7#>og~qd17VG$ zlI*VLOpv;q4-;pH(8NiU^n_~~B{Bl~W2#0&A=A%5d=gEws<;fUeW&C{+CgUJl+ZDF?!**8KY&?vT%nv67Q@|+gveUfU zifWia6n~xGVD&dv25TBfc~gXNWHU8AJ>JiX&c+k=teJ5b73}UJs)Ay2V3Z&lZtI5Q6-|jJ@*^vyW>ALTPK-1QWdIJ#ax9C@dbMjS)6k72GF3_rEVP}SPy6(r=8h>BEo zG?ksisO-Fub{vqr3oEO{%mg}Fm`EoJljvk&2b>k`sGSvzsL10P6*&MZQa`n+U$M%j zze?6lK+=!36wo5UC3U-!)|!$Z6ELl&se9j%lslypERC}gbbczwO`kFsmWA{zlgyL7;$RyqKQi-)NBFX@86 zG+4nyDGL{+JEK!=NDzl&VDu*|2o+3ka0hGZoBY8T$I3f3c>Td;`YUPXrlw%cqUI)l zqk7q#eo0WPg%!V%+IA^Lhr`r6UN9p6uT;n+<68g)BXE+D&LHI(uik)8I7%5GTW?ID zuO}ueD7L{3fud4J(;I4PQrWz}y3RYa{9A`d$;h1Q#8@No)@(*CjW723RX+?VBubP+ zD@i)^O-X%u^Q^T3+M#sNbPw5jnt2w$AlEHOx&W2cJw%SxJ)uiT>BpMx34(JYLjaou zVFILkhybg5l2zT40`;Tmo(QF7sL^tjlCFC+N}BG;Qgu%@s3pKdM2R%XX3T*3OFpMG zc!h8uG_Qj`9e)4*y|7dWjBQ3$+*&D}`6wjMN@F8-&JEG`xB!OKf^#lER$Lz3*^Y%<5Sd zL{IkNzCqxnQ#%Z$#;GP@cyZt7nTrwsNpXjI|o=)_)Gq94@ zN7@La!lD*oyehcNaJi)ZGFh3Ij(8qQ`jf7>6gO$gF1oIdH+-^Pb5s03f;t$)+Sghv zXUW6~X1Cp?u36B9T|-wT;$R$|TlC_I)}`tMR#?#h4Z&II&Wfg*Wmt!Fstr_BIcgRK zD}pOcO5TXJg1|gcy~i_J5gy6Bpshe>V2zldP8{Uj?@MhAvFocE#*j+h= zcd6mnn8mvh92>K+F?qZXgZIVv{TRGI@Bs{d1n_|jJ_vXggJ%OD%-}wC;KLYv zIPeh+PWJ351|JRlNCqDRd@O^H1AY{Pj|V=1!6yQr#Nd;GPhs$>N&-~xG;H1AfGmRP zW}xLLAId1q>-3kIiGA*bZA#(}CFv0*0b4dScbe22sI)13Fj{>!o+ZHVO5P=!8?~^# zR9FtQVsAA!j{Tuw$xJ9L0^i8;Zs;O-?KbE9nz9wUiY=McX*lwB93ID?-qzTHj zWaVfw&8O48$8OD1r^17*s@!*0q9`X9dOM&DSI64Zm!22RwG6(keSb0`8vQWwV`s6)9s;-DO8E-!9a(i^V+ll%p1N9 z@SuH_rqxF~937J&MmTfCElaxT6NM_C+IAAO2ad3?dbRCj1|v?rYBZfv#i{c~dln>E z>>x%|oo6B;2wxZInDs^OmBj%oT#j6yiBWM(UbY$;BTBUYM zQ2a9w`mR09sOJpUS>aJ6oO@+FFYU6C|9{&(&=x( z9BmrGt03L-if!P`^JA#jPQ+=%nCk`oHS|z=zQ4&)(b!}Q1_Ri>3hi+uHwDbWUk2DS3;-wXC!4~Zl(pHw%*i|FVm7xkV%rRn%5?vKG+@5*N`1BIS&Gsib;70 zrYZXIH<*rSGHcwaB$RDe66b|J9ov+o4!C_Tan$GslnyCM2{L?jyjn>~+=Y7^cPhzc zgl|_;3bpr+ykAMBC!x2mRJ!j}(#p0eogScs7u%K2595t4M~=oT_bXi=Q8Mr!Eq4=P zKhS(ib7OxLg{%p>-ewT?9I`OC55er4gW&FA$_ZF1R$)_%s*{D^r6^0u*#s;@sl@j~ zQK4y=p^*$6lN>E8yD15O)AcNHK94#;v!NE8FjlJO$)cKfL(RK|YM!apJQ?-sZdmgk zp_=!6MCpb9TGxCWYD0F)c+_knYA^{kpNiT{L(Qk7=Ce@qITAG=7p>+;;fwKTk_4DP zgYijb2wXF8V5Fj%Cd1NbWrk$CW}g0@Nl^&shp{ziO?cvvdU2CLz2<~hO}W0M2@1Ge#}4%JAFA? zJE1Z3e{fl7+j=j-1NKMkE^zwLnc77PWPw7rz^@Dz=sSUapu9?&es~$87ts%?Fi1&C zD3mAx3kY&Sn$V(kQ0I__(AM~h8hefU42E~a$lLdwZQZt zf$5I6S6j0eIy>|(rCY(NRdp*WnvaF5d>Aeh>Js5fC2S*SM)wrAtz>Lr!h24jQM zNo~mrr*dO)!d#-s3hgFFB!!d$$qwBRjKP7v6vz(Agep6x5vsK4JKUWiBP2E2(lQeZ zPi-55E*0;R)JkRws)n3ggL#KQQf81tf}*@MVQ9798N+NuW@zyz>TO&-(lCSQJCfS{ z&7G^3(*^?keZ8f5zDosup z^*zgx>6qR}r<3WS?g7b&I9GsZTMIh3L)$Gd9xKqR+IAz2jmUPRw(XdqdRfSyqT!jL z&+eg5h`u@~C^a`-ctc+G5{x*gN@Yw&w0%fqIPFLoPLcXFqa%Aa6q$dT-bRcv{;iF@ zF>uO|S%kF}3@42VyEhQpO{5=ddjqv7K^;S&Lx@0R50R`gZ4Yr6?6OvaxAL>GuLj|6 zB_QX9gu>@~6p5i!P2Oq{V-Y!8y&n~qaP&l`KlPT>J}F9HHM4mCG#Eu=$ooLCOQB0u zyU`7M+NRb2!np2KwVd)k;)*^y^aZp^NYjMk9{zhfkG=R|uQza;;Xj>sVzgNbs}qc{ zuiC1C&^k&K%D`Gu`Y=@;y}DAEOsTMu85{RvwQ`Z_feb?xT%(6W8|n?W)7mRx|6Sc- zywfP9U9?L#XvU3Px}jaN(No<+q`f)~?;ZN=6Z#}?E)DyBp-=5n4%!MqgovsRFgQcn z=ID&nC{YiswGHJ{MylnE6y#bC-^xkrMosfPqGaLUn&vqg$}vYR0(vsUkkvftx(qgKjhO8>u-1 z?am@KLDpRCo9ZvCk#rtcK3b5fznWo7`66lm7`vw7oP&6WjPXqU=UmlI2bsE{(v%jF zq9IY5NYz7+)ly-LStq2wPM>-?u}Rs#_4iD91>dTd#fFpbQA)gitqEZNI2Wm3k%x%t ziwuZIM0ta@r;D-7iuS#hScZtCGDASGM~DqlI8mM@dJCELy6UW`QQVXwGu$p}Czez1 zB8d^xjPz#YahL!`np1s|Yd~r^{bgd=fnlJDL6|{!5UbBolCVUOB)ff~ehXJV^pqDS zn00!M^j{%sla{e5-0cimL9&+S;Z4WtuYkSBMocL=Ij#_z$Ulv1;_+>LV z@f*zG#BT_L6Tch=*Y=zv{Iosi2(IlpM{sS=If7I9#xV4#d}A40+k=k0PvsrYd_Ms= zUEr&?9}Ww{AsfM|K2sQcD)4Cxel+mu3{K^l!QfP$nG8f)>>YoAzr~a`sIQ7pl3{L$skHK+R8OdTI z<#(!5>{9>lh6#(To=_U3Haa9Bkvl%g+ok!tXipxKd+YV?FTdaQtp%sS2*{+2Wg#{- zRy5R1oY2ZfoSUMqTInq0c=aYpidVy4?qv1ib?Lyf5OJ)02$djDD(r z16!ge^9}zq*o)ohOFjFq!(N>isz5r3qP4Ueto2QpzR+WuMxvRxE56TQ@Xo-yF}N1p6?tEa?uy`A zbXNqY^ImeBICfz%n6qgQ7N5h^#d8YQ-Xoz+Mxi!F zQBtF6XyaY&Xd7K?m4KO)+zGT+AB-JPoHpmTnig$(=by*%0)fF=y#aAE71jQ+OPcCx zXVU*>r_EgAuc*RD_LwnQX<1p8K*P#lP4$wdtPzzXvnCuheted%rY_L5WMx)KMQv@` zm@#;FT*^5JmqovZ zGjLf=mA^3yGe%vYKC4y>`OB)SXlSUZuWrmjAWBx#5`PwU9&v$iW0t=6Hx`t~5lgiM zRCvA}`dbF{%1%JmYQPAzMYI{I(m&1;2>PuKN2>`5H#BBoPnMDbbf*g(d(wo|3wu!N z4L{6;loQos7@>{%sGZTJ>3Zojg_K;0!dBJR#z?>!;fkaM>aBV>Q=Sev9Vn@e^d^qP z|IiXfLdE>A27A&Lo~Ay?l!+)1qv1z;yxQ>VgW;xaQ*?FDGbQv$#Lgdfg+IaZPP`NT zqYFm0zYOJDGyRM1BpHK~f#d#pR#DiW(#g=SA71y?QoKY!_j>DpTUuz~hkpu}lsymm zc*hpzu@sK+^2~MC6z=h@`DsufnUD1g+Sk_p=oeq%pZX|?^(#`n+8_N29;)!KPOPus z_|0ooLOOpN`6beSbH5CW9m~8m3EI+$kU-R+m_${5Rm_s`WVS>jQ&&+LlMJ0Bijn|sGgREMl9uYI>dQZ`7OHp(J3NqIJwzQlIGsKWVL7*1*%!^6C+|99OK9mW; zFr6+wx3o;e6C=`MnlAf`iSL320Z;R3>{CXiNr9)0IiWMlt=stW2bMP9ipmm9=F0g6 zwo(mf;y7VNb8Qnfy2?ac?5*!U)vXpSOh776|J%~?DQp)57O~oR=w~bc=!Jz5L5@xp zpIch4gcTK=u(+rrUtId(7ob2urknn^rRB$QQ7F#yuUr(U2v)^xO4exj#P98)T-=1D{)3p2Fpu5^S`C84{eDyh|Qm4mSV+ zU!kefq&VRSi3FSHj(FnZVn`+d&!z)5+$AbhI)1zao5dei|1c9OgGRBWnXsYuC7pv1bo9Zd8BD;d|b^<4b4$B z@LzYhmewLxgMbz$`rnq8x4p7#+BVL|m^ltkfAT;3K#qWK@(W=o2^&XS9K>vv8-{gW zOBY-bKn}xyTUvJ1N>DBES1en(+)rzvyZ};TMA7ZrukLuuEAXHZ@Y6?Whqf_H&;_{XjRx~cfI*vlcFqyk6 z>iyzQS8jUt!`-kC3HZroz?pF~Zp(r!l3Ol+Yq3nfv80vTqV{1U`}ky((=_s`+f!=0$$P|`aEu4;_Cc!?mOo^*hx_ccvX@3 zlLQM)z!G9Uvj4efT!XbB0na28r5tGwQ2lu>y;Yq+Vc@u}6;;o55=7`DhGuBUC2%#q6 znf!TX{7fc`J3iUgb>6=d6onvHSDg6V(sJ8*@iTGPtbprROFt&&ci{QU?wMX=ahZ}CIq}^vukmjjKmBE9sPlKGl&!L3>;;W3@F(w9p@1<==s|D1w$a51bipY zU1-QaO!A#`CZBx}EZVvxj|H|&5^J<5d@^%%JDE+eX8v6$7XeF8_iP;vr( z&Qun+gO!-cbT0hd1iW`=?8+$Q)a?^Y)H&v+KwaB<6V*-$Urc%i zo*e>Ss1L4_p~|ER5;IuVZ`^|3SZEU*sW$;Wx3u&<&xnDAcEn-Th$&Z%efK~&P$l5! z&{Y>2Qf>}51_T<5n#4Re|Fae-MS{^>iC?|gh_1D!5t~jc#RVRJ!Rj93rnvf2L&Cv| z<&4-(W;nGo8id-Bb7HoPVMI1U%hGZ!x0l#kG9? zdNJLN?)Mky+hjc5b+;MOEv{*7t_Y>&VP|y`-n+)`=$`{+Prwhi>37M|wOhp{K5Nm5 z+r%w=^EM;O+6q-nHzBjjqQU4j0)A!CX}cUsQ9u zPwjU11&bd=$q9Iad+o!9q;s2_ngaDPs4qU|h2)I5B*g!n0)@p z@P2#1fPnWDKJcU@6OX^vUlE(jqkZ~Za}e!Mz)v(EJ#EOvQWLCf#)-mMJKJxcIqjF8 z=mi4at2_P$c?KT;NzHyFQHj2Te&F6-lP<&PBH%X!H@#xar?v*p+d^~+%qf*gjBdR88Zn@&@r0p(!{&}ybiPp z_IJQu8jMkwmB*C*^gHMi@SXAaw-P)82sEy*jzK^Bz3aFChyh5zOH`+y4Cy1OI*aOelSVp+DA!Z z^H2P3%z~0I#psAmWoMuJ2Fgyr`y#p~B#Qk%VPn2j&F~b}4MbKzTJO%6zuH|<2zcva za*{Fm=(=y(wRbg4hinq?vz@z-G2ImnfyP)P`KztF@96-_1bnByIlz#5UZAqM(XxcL z`D3*Eea9WyK>v@z*mMZ=Ps%0`<}7awu++U;rJK)|>E z%A;hsEURgXWsTL|x^wFVXd8mzx`M{%mX!kDF> zmvcm~uRxXnQE%bDEiI2Mlp$?wT@{Zz^~3=XP6A#r95_LS1D$z@(fo_&DSvf9;R$$~ zq}p#xK2U{|TmB$~6`dSafC`!?*q%i333vf|WQhb1Iu{nB2HwFhbn61j1pL(UTAd+v zXTVT1-}J%!(-P4-1iZ;GA!tZnO++Qua+~Jgl=(cSLju0#Pi>Z?>kk$Nmc?Ab7QWGO z_ep3M0={joUT(}I7-;YZV@@kWMsBbnmA$^a(vI$m6G}ql3ChsT* z%1ywRJ$tnTZ7muohTP1!`4>w%XcO@2dDj{V`i(WK{KliV|F^py4S)dwZ#)b<+mMMD z&Vx#lehZukv5e+w+sgN@00#noDf#jF@?2uHRsQSVubu*N0)8p^!UlN;#?6)R&1rAl z2@{2YZ?11Hli<^&O$CwbYs4e(+;vM@;Q3Gp_&Ia`)y7=V@03ukF~{794XY>~;(IE8 zpMDz}i+~>(8Q00P5EsAbiiHz;r6Cd>Ffu&k$d*gK(U7(eYgIAXkEZ>04V^J2;3t}@ zyClf2K!R{hUx>*s-*>^@10YSnuNsr@H6&kDAKQp{&3nTKUxF|JKMlKg7!rrqxMopJ zZEOSj#)8V<7oal<_~M`YkPHX-rO6%@x6Qe$&%WRy5GLS#(-R*xBwkXeildlv%Ts^- z^E6CD0$$X+JZVf>Js@c`nm#M3K0!}R$BX007Yte8rqL*ifF+lmbD|gRLBQ|a?0dzS z?20HtUUu7KpDo9*C*UXDlV3Naitth#!O3ygR8qutT}2cg9llP_h1yjJ=5XUP?=4v# zr5=@+wI&D^6N}j+_j=ZDM-vh7``Aal7bi2LdVSX6gb!AM4FSLXm%C4rl~_n8e0;(a zds}cd5nu?{U>!a;Al#PV$5<3SeC&(IJqJPr!#INdYm#CtilXf@6U|Qd&)C>G2f^|H zUd%_G7=`9?N^?KXT(ykJPQh+V5!uY_)0LqRMgo3-{_6rMvUEft2l-M1&7$2(VzJ?} ztNgi`PziVzzg{TMf^JlRoiA?i*A@)x`wF(-3HTNJxp12ZSD}34sI^cH5J#Ze4liT{ zj_iqfJ@EbdvCF}SfZt}=aYOvPV1x#ORboyT-#%pLNoX_z-s(B~-uO9Dh>Ms{?$#Z5 zoC5_-z;}@6L3utjy+rLG>*^ajKXI0#5b#UjaoC`f?4Y)#S6!+XBsH5My#&0SKKqys zu}J4)W6bBZYIg*dyL}!p{i!#dQ1mNk6YzG)OAaae4wo}OI{77k{k?4nNE7fAdk?o1 zd9VFgTe(kM_Uqq&tFyl8%&&acc;tx3qJD7E5eMMZR|xo)|J5f&y(o6m)YLz{`FO}a z0YA5xOXH(&=!P3JVeYZjs0IN)+y8l-46C-yPnz%c9_Ky(0t!#Si_T3a#H32+m;vD{ zO2p)Ib|>F?8zwA*vD`HC_+lCITH-S??Q!?5+j=V+gMilw51u1KTRXXiI*6@KYMr}g zB>t<*P&iHiyiVADzBCJQ>3c3)_}<6xYY_07GvgjZ(sqg!s%WZQg0M#Tl>9KeDx+x5 z$=QGPex@6Ov;ce$%)3vXkGKv~roKD%giJ*t;K%L>PZ`tJ=9TD;AAG8VQ`|yb-ZrLA zbBQHT*I?X2voe~_db5+F5b!Nze^;K5xP{JN*2^TWL){m0w5ffJ>ri;^^qs0QAM87{U&mOp7pVw4^#iVyGp@pGo3|?C`=JT|eyp7}K$?xX z1`{`}e)a>5GXlN_NeD-eF}15TD5_stA6Q;*T!S-)yz}kn$%;b2*I@e5(rm;vSat5h zFBd{Z6Y$Ev)*PF3aAiZ2p7*V_WxZ|fo98rjRulq$QGGB^hAL@Lae3$6vF+81V5<@2 za(aK4FD7Mct}n-GD=yFVxXf0I+3Q30S-Lnt&H0*Vw%Ek{{#tLI{t*_F1iUuAb3y$4 zoGxn=J_l|tUaX&5<0a|y@;Ldhx6-ukn5j?io12F<8ZFKxQ} zCo~rU&tuKfIC&s-tGHXHu2}fa@1Re>^LQ>0Cl8mcP|V|;7ytJB3Hk)Qle%|PoIKnv zPn3$>@u>9-HO&w@gzxvoE8=8Q>~bJowYV-jPh5BH6*vJ$fJJopZ%fOrQ;gV%DNeub zqwU8*aTCl7(^KFHy?kwKijBAv%xcN8x(ab;u9`a0Ei)(pndGYx+)KCSkmLt~7G4qy(D(dqTd3|2v`h8Qq@N-P93IQ(>FGK0Y zm{Y8J!?t26uGw8*Zu3;2W&{qdX5B8AV&iUa2NwN&hms6&Cz#7|e)q~l;ViD_hri!h zbOc5)0YAZ+uaV&5h>T%w5ct`=mxH@dPJ|@+Ct3BGJ>9nNpLqLc^!0VeCTVvB~ zuBpngIK1j%Bm=Ac>Ab7fe-CSgU^G|oC$>p45x2;Xn@;Q94LwT0Yvcp>8WYYhk}3S) zk1zSF8qs3}{C04~19CjXWp~`W;_+;>Isxxr%y_|=u3Z$PLlfbWtm=L{kBIj*=Odg z@AGRmJV*fEblvy26xrye;G%60{jTSL;U#WJR&uNoI|}KJtH#Ehe2=Thtxh}TM~RDn zYp2zV5fPve@I0O$5;qS)W-bzw`>y+?VHfBV@H{TT4PG%?UQ~|>;(AOyxoU?V@XYhL zadg}~qMS9&?{ne3)u;mj?;O7BsCanL)ezdHchP#~?Hh9DB0@$X;E!)EM2=~h7DL`- zv%|Ri$6vMTm$hI*z%%NHTcz8>D2fa`(f#rfdN7BX8_<6s{cxO&j2p1~$TzYPKc*1y z9$gv|HF-Ok(%lj&GFc%Q;ESfCwvWU`Xy)Nmq^mULY;Dx$lLA)#`L=ox_F23y4 zPhp7>@M`g>LMa~N@p$j5fB%3RV-x}?-0Jm zM#(Kc1EPrD78kT->f_@ZFv}3|gZiX%4QL*N%Z78Xg7eyZ(6Yz4=7zBA7#o?F6 zq=f#eoV*)4FtMi{}FH_lJd-T_)*Lq>Z5ae>ahd+O4yv233 zz0zd>5{D=Rc8=fGFUP?zUJ-t#*S_o?uoVgT-RNUqZ8uwS4VTS%?RP}qCv^ccGEjXWN}4ua}<+n=h5H3{u^RJ33#%m_hXawH^qodD$cz)^B;6E z0Uy&d=SwNFYD|wcP=~}xp;IhTvp(JP=&T>=p??W@f8!P3#LLSUY!-#Ml5uK%HfQO> zFzpB?a*})ePx5T?gMns2<_%&n&&KjNbwegC_0;P%IdoPqy=J|p168Lo81!%5ucEB629>J4!r;I}C6 zm@h${F04cVm~kzhSRMG(3LA!i4+R+DljkF@!vhbl+}9uFC*U0|x0gxKhBL>3`?!jY zE79xNk)07hs1WcWXITs5U?i?Z;pH127S|%XLWX#e$76F^%8YAazx?(E)u;ghud^?y zjE7OVCB#x(pPMh;-)S302Laz$-X(Fc5feYU^UilVp}PtA?G8_^1aYjEZN?4t;HvbF z15tVce!F8^y(ANH>7TtjXR>(E^$p4pwpr|jW`}VF_HV4KT8>^OIEGWGXEnva2f+?1 z!|^%cf9d}a*YCi?&(EC;o&@}CTD`J8e8pUX8OK+OYxno5?cg#YT)PReYxm{Gh38pO zGXlPL@1EWszT(=|7hO5xIdCB073Q*a@?6BU&tJCQBUUx%pC?7zYncbdZ!Cc85@yUs z$`XZu*8!&WaWE3s!jrY+@~Jfb0lXzLeuE5gyVo6Ui)`$Rb$8p*@C1Ap-*d4vX~Q7M z`oISti@U*dg#;Iy!&WF~LaaPc{ju(c&E@pKlUK#VsJy5ihZ>E$y<*i%S(l^f2zWd6 z(oOO66Zig*`t74`27Llvv`*g~2M;mveu-CqGYDcuz*~3AZydtMXPQtF6vbyCtRDpo+jSKIMgORuv$z7`! zifeK6PD$c&>Z<0RA^Y{9Exr~5cE`a;T#NZvf6~(ec_QG6S3V{|yZ~GJbTPJ=_<+Hw zL+*fSO~9M+KRpo#aYL2$pWVBnST4UmE5XNZb;!xnqsQEK`4rL~0DktXenFm(xUC9a zfBA|b=mY}ZANA!cGPIq=u6Z^&fg165@9T6^fj`Gk{aReC#5EbQ(DzMW)PjH)sXyP8 zAYW)J%(Z!<&4EeTJ#Q>S^AqqQb;3Jw5H}R5J=Z?jU#x4peJH`lZT6TYr@_qGNplNP z8va?wI3`Z>pct_IBU&hBvT$d+I zMG4|Q8T6e5eXlvsrg}JxYjW1Q=9^P6X%O&za{2yvIEm{~zQ51xiRcdkGiUgG_iH@V zb6rI;=I-@-R{v884NSm?Ev)_{Zg%1tee~I!6!Ba*<)8!$pTnMO_Q^PGK7D<7(#fa? z0k2zbHKoRK#%T^NosqZ}eSh9?!QJQ+0^Va2OqL;zc~GtvLpyAE`odI2A>eCqN?II@ z#I?BSvX?gxf^UF;uSHo8N#b&|;ns{lenQ-fLcn`$Ug;eVqjEAJh^4qbkN&>**?M$0 z0pD0l2gSigOg#U-KK>uk-2^=GVM8T})0`_N-tgqZ_lq4W{t*(yi_IRnj;Q`~!VODN z0Rmp1yf!KhKCCA|+;Z#3-}>(N(7gn_p;a+Ko`slp%@@1N zbJ0=+{I1QvkCvltH#>dhxh_}eLhjZFQfA$5{`Ney4FNypj++@L14A>#R9X3kSj2jp z<#@@NjNXyG{gk?%fbWpC7I{A64mtjW(XUQIXQ;qUhgaoG&@RU~G3b#^2}fOhH%d;x zpRdS1CSDGPUGmf98MChLtSAJ-xay2^8Z#3&QP)*nOaBBd0zTqDV_|HXi%z6-@nWj> zwC=wjfhmZ9FRA;u*i>u%(IWmI=w+U@HAPVf_?@l07aP-zzOywq{mUoEKu8GqF1$Hl zMAzKh6v(l{v8Gz(66aNh9LuOcP{<76go`HMH4{J^lTXmtSJpBq=mFc4E6 z`O>kQGqGz=zz63aTqi>{dh5^H)TN{lgNJ}$oG#c9lQQB1n}ZW4z1f?b=k-o;QSuyOp92jk+0_)N(v z?mus{c`K?%z?-vkcD0M8xMr(wxnfBb6fVI?u4cB!q}Yhbu1_ky@oyO71pKhs|6FXc zOZ>I9(X{#OZ^o@1j)D^K!aVUc8LH7WN>yo>TPC1$3FdOmu;o2t%4WAc$Lx0J!a_!b zv9b8RlyliRIDfAY@Cn@}eHbq{ar+nE-8=aRP$%H`X0H8Aj)S)#&+f3f+=#&}vP4mi zKaaeoW*>T(fES+b-%4>27yhxA?!RpuGCB|p=Q?BNF9u|5k#$5&^v;VvKXNuLRDFU{wgi?x|sThdrsLYrhZ?71ofsBO|huYxc;4v10k6N{B-ePk}-8R zCJK$Zv1ESr<^6;2gvKG@TWLaaJebXkvMEp?bK2>5w>Y`PqE_tI*)tQuFmzvc%M zmgoe$Q~B4faj_EDWL>doC@un02>8vrJlwS!<8+BCO7RjMLFfayrAEn z473yh?>Vvbk>KI4%xzwb{4&O!e!O?dfwgES0^aLzd;d5XiCb#VkINTa1;PZp@p@Wz z9K>-8MU?CF?p%A<<^9kN1bj0s9WKQ{c5Ga;{K<+l&=&-JGrd1D4o2c;y6ewje~O3r zonxekOOK4RHuRsr4pkuFhxo9g;^8E&$D?cCyx}pZSOUJ0{+eh^-B(lRN4oa9C;_PE zo*SlAVn!nv%1sPuQw)iV%Ud+-r;;}zIRsXYGPBU zHC&MQ7}@pJ2T=h6ero<|PJ1|t>-EseBI>uPZ@QtH4#E>h!oc>F%SP^67eKDWlh zMofLqu#GdtKBUx#Y7SN#3+P|LnzufLfD-W2@W$P7G85P4+L=pB;k{G{_!Zw1 zkI66)Q(f@pOezfT#NB>qb-?5w<3#+Nnd+*Ul8U zc>trhUReKjOsXXlC#bhpMLFBEao5bPyD<$C@J9O3kB#WkMa6}I`Wj@?jdrp43on1U zwi`$j@H6d%ui_z3tfHUwn04d(>+a1#ygPumc&^wV2N!Y6H@M#ganscUE`>HE;Demf?Xihg)#c2y zm6hk3y>^S5%OZ3*UCd|1iXuPmH&qCDK7Tr;_%J7F%PkJG*DL08R>~P4`k{6SFlfVn zTUvT~jQEHt9#OV=`6Wq;LcsUwE^lm#ltev7B3?>Cedef3dhSG%5b$1;Yf6oX({5W1 z&3!(5p}}DeVs)hZ_bn%2*b?vx`Mw2lv1;2)ME;tj@f&_b6A|#^tEx(hJc99Do-!@R zg{@S~WaiR;97Di>fVXsRtC3>jDz%Zx99`0l${1J*mB1#SNHs_P!I|fd(YtIeofJic{FVMd3&G+#;V% zFc7IuPrtmT?{ZAe1iT---^p^Ed{Bl(Y81J+E*%a&GzT}`DFnPQeB2_(0n%nGq|qa0 z@cC7vC!P#JAh2-4(0FDX3{+Xj!8St7>4VzLQ@Ze0-H_+Ukn5~=FcjCy`(=+G)}clO zd0eg5oEJ9}iS!s$F=hLg-bQp20k8c7>)XduT({L}9ji`+z!C65H+^Hge8e19O&jvj zgPHK~07h`F_v;lh9NJQ)o!qITPTip2(ZfsHueTdfwNNVI9E+#S?Su01*(|hzi!w~CCCES|7RHS2$6Je0b^?A4dgC5x z(uNhN&fk6IT(ms_Z?}2gkmf?yWr!>B-JJ`omVh(?Z{B|NmJIoVT)VH(>=qNBy!iCl zeh?<$WBD$9SB^N+{uYR7m*p(~$qc##e8KZSkfM!!I`Th5{>_DjrcqzH#J2}!W zYmp<0YRvuQE}tF^&HIqI?Uy3%He>Y`P4RC2!t-W1#DsuXyi0$Qqi&1Ron@=9yi-iM z$FEY9J^4{6pE4}#KjNO;^}8HpuP4gLdFk2H-Qq%@_?Hyv5>fCxiQk#MuKV+MG%^7% zBi;Xzp^ON(=(jZOd30g}C21hwd$H7%9@EQLQ%@F)!y-DLM#WBAcIm^TL6v}~d`F@b z<*0K)VMgXyGbS|xeqtWnQI@jdyk_2$RXPhrC*TLqjx<>&(Wf+N?yP`=?=hb~{3()igywH#9 zEkzqCIEx%nrlPk#Ghf>SgbDb4mM8kk5O*Wpsn2-5{OX@yRG84g1pH(=Zh$l!anolm z`2K3KB0D)tigfgrKla`3xo@Gw1pK%iF+_$mwv3}Rds@KyLU%Md0pA|;M#xb1T7);O zkh0lz_0sX;gb=rkk|u39m=c{i>QO~HuE9#Zq|B=Gjj1(sB0`S;~fuzV5{HpZpswL%=KIiW#y@qR)TD zO?R%*8;9@G+hUSvaK& zdKbX&4(>lrg0@)ynAZ-we{5c&Lcn|Rmev{(Rf7Y>WdC(Tbt^f7N z7IZHGFOI)GDZxTq?m5Trnl=xveFAwEfmaIj-yE4reJerQ*%%di_u-DK18>mHgx5D|8Pc?;L7)PmV!(EJ+&l(v!zLhdpZoK0s;shf?GPXQ!$4 z*M9!T2OdZ#0k83=enqcUXhKhi$>R)UGG7@@}w zSH2b{DjpQi9Grd1{mF_#z@Gsh^RomC3Lq$Vx_tILINDX0noZ_Ld( zAi*oz-HOy5+fx#MdKzR2_`$HjlwmL@U~Fro4QJqgkG^-Gg5gHM&%k#j%W#Rc=pFat z4YqNhOE8z)8a$9HLEB;WJ z7S7s$IuY<%cX3ACoYW0tF(31w`@h5|^jkV{@n%a(D~uQFcJ?y5Rmh*Mc1Zzmf1oe;Jmz*-c!Rx67(NJr}Br zfbW&<10@NUo1K`Q4B|MFCp%`p3?2l0uUt7qf{)9Kh#N2N(1>oWt^8`!LH&{-{=C&g zBjV){EpX`XMFaclzEUgK^S_Lh;SmlS!i}4SZVI__Im>bXna}QwvNv$#O%q%#=yU?! z0eSj(362pN(b|AR$+=9x&tnTG$uKg!_>h=XJTm>GUa-0dcrkuxiX;=U z7=QG}8jC)o@SWd(mLy?ArJvks><#&79fCZr^OxsJ@Cb)IMJ9V=^_=wBXJ3|L$PnmQbj`^*QLu4+l?M?eW zS*UAMp5a_yJPhrHZfGT!Q&ryO4wzX{jKm2!*{|vzW_~3wyhMhf9ST-L$#%Ktjxi&# z7$e|q^wSndvQe{L;9fa#!+rO1#f`s#I6)=XQ-2&U!$6IcD~Bc8Y64^|#vF5fpnhdt zpt(_7T{)ZUDx86;C`+tO%GE#ogTfFj;R>#tqAx<%S)@I88E^ZEhL=gu7CaeY6Pq$i%ak|RS95XuH((eyU@|rv^JzYM_ck`PmFs(Y_@ zDFy%mFF3WI%TkVM{7~^9e&p%DzlV|~7|u0G-|r-tv@JOesoA#KB|SlqfVbKTe>5UW zr-gHJ9mvr{*|o`#7W1gzc&uv`=o9cd=>A`%c;w-fNI^;Tb;mK?{~V(q?BFZW@`n@y zT)XW^BgF&3lhzWm2j?5zMG`yWKl@+aw*zCCfUnaP zrfvpa6t!bGe&UXK_vt^L)V-s8$K23Sjt4SBX&xsrgTMzDb=?a+N5DI2mZr)vC~&#v ziD`dUcGio9pi96jy7M~8(FSQ+oQcUNz1jDMt>|k4UeS%{EJa?jpKUMQ(|bJWY5>n? zTt*yxRBq)ld@|{urIx#31Q76Dv7?7PA8}jV_%G|bS7LAz@E$*JKPlSta;**rb#=5z zcT!b(d*8qGar6cOpUuxQP>zeOEEgkOYWO|;(&NWYgElANhel;~oXo^+_SAuA@?S+w z2>9{+&2T9O(24L_pfb^Q)$b^XnMa1bh_~pB#sp`l`V4=mYxwgKOqj55?7L zfDxR%GrUBGLEDBQ8+OFBF{6G)kqP*9@N1_SQLPD7Hr3{Mu|sFZ_DU!xB^n7AKg9Op z5#zDTuD?n5Qt*?<_|=ENSX@i*ypJx^k1q4U7U!*zVkRd0M6g1+6JwizpJu16H6q*C z5D3&F3zC|{Q{5gcA1~&z@sF}=$3pKB@LXn|(+)0^#9Tfde*gZxm|F?>CVJ!oDK28N zV}EE^GBXA7R{&lGzI%xj+30DCvRyMz7oVJ{++;|4S!IsbQXXyBlmyh(vEYvnVagKl z_Q3jUCCO_iuA?lfiAO=zkdtd5JOn(C$FG;-Ve_boU^PbK9;p0m?5jbD4gv2ET76^u zJoFtpF|RQnX8(o6p9%rLB6i*;!Anf^m*4OD)&e7$fS1gM`(hJqYK(D}@uE%d{PQ^U zC;?yAKOc-qwjq=_cu7-TZR@P@{VfA}WkZz`@Jc%2q3A>_{o}}S3X@xJfesjj5Q&5- O2?ySQc Date: Thu, 31 Oct 2013 15:55:09 +0100 Subject: [PATCH 11/30] IDEA-115602 (IDEA changes code semantic after "Replace 'if else' with '?:'" intention) --- .../ReplaceIfWithConditionalIntention.java | 34 ++++++++----------- .../ConditionalCondition.java | 16 +++++++++ .../ConditionalCondition_after.java | 15 ++++++++ ...ReplaceIfWithConditionalIntentionTest.java | 20 +++++------ 4 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java index b7f95f7bafbe..c30df47d6c35 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java @@ -18,7 +18,6 @@ package com.siyeh.ipp.trivialif; import com.intellij.psi.*; import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.IncorrectOperationException; import com.siyeh.ig.psiutils.EquivalenceChecker; import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ipp.base.Intention; @@ -36,8 +35,7 @@ public class ReplaceIfWithConditionalIntention extends Intention { } @Override - public void processIntention(@NotNull PsiElement element) - throws IncorrectOperationException { + public void processIntention(@NotNull PsiElement element) { final PsiIfStatement ifStatement = (PsiIfStatement)element.getParent(); if (ifStatement == null) { return; @@ -183,9 +181,8 @@ public class ReplaceIfWithConditionalIntention extends Intention { return null; } @NonNls final StringBuilder conditional = new StringBuilder(); - final String conditionText = getExpressionText(condition); - conditional.append(conditionText); - conditional.append('?'); + final String conditionText = getExpressionText(condition, true); + conditional.append(conditionText).append('?'); final PsiType thenType = thenValue.getType(); final PsiType elseType = elseValue.getType(); if (thenType instanceof PsiPrimitiveType && @@ -195,28 +192,24 @@ public class ReplaceIfWithConditionalIntention extends Intention { // prevent unboxing of boxed value to preserve semantics (IDEADEV-36008) final PsiPrimitiveType primitiveType = (PsiPrimitiveType)thenType; conditional.append(primitiveType.getBoxedTypeName()); - conditional.append(".valueOf("); - conditional.append(thenValue.getText()); - conditional.append("):"); - conditional.append(getExpressionText(elseValue)); + conditional.append(".valueOf(").append(thenValue.getText()).append("):"); + conditional.append(getExpressionText(elseValue, false)); } else if (elseType instanceof PsiPrimitiveType && !PsiType.NULL.equals(elseType) && !(thenType instanceof PsiPrimitiveType) && !(requiredType instanceof PsiPrimitiveType)) { // prevent unboxing of boxed value to preserve semantics (IDEADEV-36008) - conditional.append(getExpressionText(thenValue)); + conditional.append(getExpressionText(thenValue, false)); conditional.append(':'); final PsiPrimitiveType primitiveType = (PsiPrimitiveType)elseType; conditional.append(primitiveType.getBoxedTypeName()); - conditional.append(".valueOf("); - conditional.append(elseValue.getText()); - conditional.append(')'); + conditional.append(".valueOf(").append(elseValue.getText()).append(')'); } else { - conditional.append(getExpressionText(thenValue)); + conditional.append(getExpressionText(thenValue, false)); conditional.append(':'); - conditional.append(getExpressionText(elseValue)); + conditional.append(getExpressionText(elseValue, false)); } return conditional.toString(); } @@ -230,9 +223,12 @@ public class ReplaceIfWithConditionalIntention extends Intention { return thenValue; } - private static String getExpressionText(PsiExpression expression) { - if (ParenthesesUtils.getPrecedence(expression) <= - ParenthesesUtils.CONDITIONAL_PRECEDENCE) { + private static String getExpressionText(PsiExpression expression, boolean isCondition) { + final int precedence = ParenthesesUtils.getPrecedence(expression); + if (precedence <= ParenthesesUtils.CONDITIONAL_PRECEDENCE) { + if (isCondition && precedence == ParenthesesUtils.CONDITIONAL_PRECEDENCE) { + return '(' + expression.getText() + ')'; + } return expression.getText(); } else { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java new file mode 100644 index 000000000000..a1e3377c76bf --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java @@ -0,0 +1,16 @@ +package com.siyeh.ipp.trivialif.replaceIfWithConditional; + +class ConditionalCondition { + + String s; + String t; + + public boolean equals(Object other) { + if (!(other instanceof ConditionalCondition)) return false; + final ConditionalCondition condition = (ConditionalCondition)other; + + + if (s != null ? !s.equals(condition.s) : condition.s != null) return false; + return t.equals(condition.t); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java new file mode 100644 index 000000000000..753f032bb9c3 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java @@ -0,0 +1,15 @@ +package com.siyeh.ipp.trivialif.replaceIfWithConditional; + +class ConditionalCondition { + + String s; + String t; + + public boolean equals(Object other) { + if (!(other instanceof ConditionalCondition)) return false; + final ConditionalCondition condition = (ConditionalCondition)other; + + + return (s != null ? !s.equals(condition.s) : condition.s != null) ? false : t.equals(condition.t); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntentionTest.java index 9cbfe40f0d35..d39fe0f02832 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntentionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,19 +18,15 @@ package com.siyeh.ipp.trivialif; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.IPPTestCase; +/** + * @see com.siyeh.ipp.trivialif.ReplaceIfWithConditionalIntention + */ public class ReplaceIfWithConditionalIntentionTest extends IPPTestCase { - public void testReturnValueWithDiamonds() { - doTest(); - } - - public void testReplaceableAssignmentsWithDiamonds() { - doTest(); - } - - public void testReplaceableAssignmentsWithDiamondsLeave() { - doTest(); - } + public void testReturnValueWithDiamonds() { doTest(); } + public void testReplaceableAssignmentsWithDiamonds() { doTest(); } + public void testReplaceableAssignmentsWithDiamondsLeave() { doTest(); } + public void testConditionalCondition() { doTest(); } @Override protected String getIntentionName() { From 7a8cabddb7b5540bc8df9a0cf705c2a07790baa4 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 31 Oct 2013 16:15:32 +0100 Subject: [PATCH 12/30] parentheses needed when a conditional is used as condition in a conditional --- .../src/com/siyeh/ig/psiutils/ParenthesesUtils.java | 5 +++++ .../UnnecessaryParentheses.java | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java index f93f13bcb9a4..bc44d6d44b79 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java @@ -518,6 +518,11 @@ public class ParenthesesUtils { } } } + else if (parentExpression instanceof PsiConditionalExpression && expression instanceof PsiConditionalExpression) { + final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression)parentExpression; + final PsiExpression condition = conditionalExpression.getCondition(); + return PsiTreeUtil.isAncestor(condition, expression, true); + } return parentPrecedence < childPrecedence; } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/clarifying_parentheses/UnnecessaryParentheses.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/clarifying_parentheses/UnnecessaryParentheses.java index 2f7a798fe0bc..baf32bb6fcbb 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/clarifying_parentheses/UnnecessaryParentheses.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/clarifying_parentheses/UnnecessaryParentheses.java @@ -11,4 +11,17 @@ class UnnecessaryParentheses { } return true; } +} +class ConditionalCondition { + + String s; + String t; + + public boolean equals(Object other) { + if (!(other instanceof ConditionalCondition)) return false; + final ConditionalCondition condition = (ConditionalCondition)other; + + + return (s != null ? !s.equals(condition.s) : condition.s != null) ? false : t.equals(condition.t); + } } \ No newline at end of file From 8ab20511ad067c9290f2dce88c5f80c02a5e096e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 31 Oct 2013 16:17:03 +0100 Subject: [PATCH 13/30] revert: the actual "reload classes" hotswap stage cannot be made cancelable, because this way application is brought into "partially reloaded" state. --- .../com/intellij/debugger/impl/ReloadClassesWorker.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java index 9ff1b2bec9fd..d8d8dd469c43 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -130,13 +130,8 @@ class ReloadClassesWorker { continue; } redefineProcessor.processClass(qualifiedName, content); - if (myProgress.isCancelled()) { - break; - } - } - if (!myProgress.isCancelled()) { - redefineProcessor.processPending(); } + redefineProcessor.processPending(); myProgress.setFraction(1); final int partiallyRedefinedClassesCount = redefineProcessor.getPartiallyRedefinedClassesCount(); From aaed311f7fe4a307bbb56b1e971c5336d7f6a533 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 31 Oct 2013 11:54:36 +0400 Subject: [PATCH 14/30] [git] remove throws from methods where exception is not thrown --- plugins/git4idea/src/git4idea/GitContentRevision.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/GitContentRevision.java b/plugins/git4idea/src/git4idea/GitContentRevision.java index 5ce16c9ea1fb..c440b2606d79 100644 --- a/plugins/git4idea/src/git4idea/GitContentRevision.java +++ b/plugins/git4idea/src/git4idea/GitContentRevision.java @@ -199,12 +199,12 @@ public class GitContentRevision implements ContentRevision { } public static ContentRevision createRevision(@NotNull final VirtualFile file, @Nullable final VcsRevisionNumber revisionNumber, - @NotNull final Project project) throws VcsException { + @NotNull final Project project) { return createRevision(file, revisionNumber, project, null); } public static ContentRevision createRevision(@NotNull final VirtualFile file, @Nullable final VcsRevisionNumber revisionNumber, - @NotNull final Project project, @Nullable final Charset charset) throws VcsException { + @NotNull final Project project, @Nullable final Charset charset) { final FilePathImpl filePath = new FilePathImpl(file); return createRevision(filePath, revisionNumber, project, charset); } From eebe810bf4eb9bd92b05ce8285e0174db132a533 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 31 Oct 2013 19:08:59 +0400 Subject: [PATCH 15/30] [log] Compact Changes in VcsFullCommitDetails Change is an expensive object, in particular because it extensively uses FilePathImpl which always stores the path. Use the compacted version of the Change in VcsFullCommitDetailsImpl: LightChange can store only one VirtualFile or path (or two in case of move); Convert back to the Change when getChanges is called. All necessary information (this and parent revisions, etc.) can be obtained from the VcsFullCommitDetails object. Unfortunately GitContentRevision and HgContentRevision require more data for creation, therefore ContentRevisionFactory was introduced, and passed to createFullCommitDetails factory method. It handles creation of the VCS-plugin-specific ContentRevision object. --- .../vcs/log/ContentRevisionFactory.java | 35 +++++++ .../vcs/log/VcsFullCommitDetails.java | 4 +- .../vcs/log/VcsLogObjectsFactory.java | 3 +- .../intellij/vcs/log/data/LoadingDetails.java | 20 +++- .../log/impl/VcsFullCommitDetailsImpl.java | 98 ++++++++++++++++++- .../log/impl/VcsLogObjectsFactoryImpl.java | 5 +- plugins/git4idea/src/META-INF/plugin.xml | 2 + plugins/git4idea/src/git4idea/GitCommit.java | 9 +- .../cherrypick/GitCherryPickAction.java | 13 +-- .../src/git4idea/history/GitHistoryUtils.java | 2 +- .../log/GitContentRevisionFactory.java | 57 +++++++++++ .../git4idea/GitCherryPickStepdefs.java | 3 +- plugins/hg4idea/src/META-INF/plugin.xml | 2 + .../hg4idea/log/HgContentRevisionFactory.java | 58 +++++++++++ .../org/zmlx/hg4idea/util/HgHistoryUtil.java | 7 +- 15 files changed, 295 insertions(+), 23 deletions(-) create mode 100644 platform/vcs-log/api/src/com/intellij/vcs/log/ContentRevisionFactory.java create mode 100644 plugins/git4idea/src/git4idea/log/GitContentRevisionFactory.java create mode 100644 plugins/hg4idea/src/org/zmlx/hg4idea/log/HgContentRevisionFactory.java diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/ContentRevisionFactory.java b/platform/vcs-log/api/src/com/intellij/vcs/log/ContentRevisionFactory.java new file mode 100644 index 000000000000..dcf81e7b18c6 --- /dev/null +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/ContentRevisionFactory.java @@ -0,0 +1,35 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.vcs.log; + +import com.intellij.openapi.vcs.changes.ContentRevision; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; + +/** + *

This factory is used to create a particular {@link ContentRevision} instance which corresponds to the file and the commit hash.

+ *

Different VCS plugins may use different {@link ContentRevision} implementation, therefore we need to be able + * to retrieve a correct instance for a commit.

+ */ +public abstract class ContentRevisionFactory { + + @NotNull + public abstract ContentRevision createRevision(@NotNull VirtualFile file, @NotNull Hash hash); + + @NotNull + public abstract ContentRevision createRevision(@NotNull VirtualFile root, @NotNull String path, @NotNull Hash hash); + +} diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java index 06a117c6db6e..8c3d87f808ef 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java @@ -11,8 +11,8 @@ import java.util.List; *

Full details of a commit: all metadata (commit message, author, committer, etc.) and the changes.

*

These details will be shown in dedicated panels displayed near the log.

*

An instance of this object can be obtained via - * {@link VcsLogObjectsFactory#createFullDetails( - * Hash, List, long, VirtualFile, String, String, String, String, String, String, long, List) VcsLogObjectsFactory#createFullDetails}

+ * {@link VcsLogObjectsFactory#createFullDetails(Hash, List, long, VirtualFile, String, String, String, String, String, String, long, + * List, ContentRevisionFactory) VcsLogObjectsFactory#createFullDetails}

* * @author Kirill Likhodedov */ diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java index d4ebe28d2dc8..debb813d261d 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java @@ -31,7 +31,8 @@ public interface VcsLogObjectsFactory { @NotNull String subject, @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, @NotNull String committerName, - @NotNull String committerEmail, long commitTime, @NotNull List changes); + @NotNull String committerEmail, long commitTime, @NotNull List changes, + @NotNull ContentRevisionFactory contentRevisionFactory); @NotNull VcsUser createUser(@NotNull String name); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java index 11db6c8db62b..14f558cfce84 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java @@ -1,11 +1,16 @@ package com.intellij.vcs.log.data; +import com.intellij.openapi.vcs.FilePathImpl; import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.ContentRevision; +import com.intellij.openapi.vcs.changes.SimpleContentRevision; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.vcs.log.ContentRevisionFactory; import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.impl.VcsFullCommitDetailsImpl; import org.jetbrains.annotations.NotNull; +import java.io.File; import java.util.Collections; /** @@ -19,7 +24,20 @@ public class LoadingDetails extends VcsFullCommitDetailsImpl { private final long myLoadingTaskIndex; public LoadingDetails(@NotNull Hash hash, long loadingTaskIndex, @NotNull VirtualFile root) { - super(hash, Collections.emptyList(), -1, root, "Loading...", "", "", "", "", "", -1, Collections.emptyList()); + super(hash, Collections.emptyList(), -1, root, "Loading...", "", "", "", "", "", -1, Collections.emptyList(), + new ContentRevisionFactory() { + @NotNull + @Override + public ContentRevision createRevision(@NotNull VirtualFile file, @NotNull Hash hash) { + return new SimpleContentRevision("", new FilePathImpl(file), hash.asString()); + } + + @NotNull + @Override + public ContentRevision createRevision(@NotNull VirtualFile root, @NotNull String path, @NotNull Hash hash) { + return new SimpleContentRevision("", new FilePathImpl(new File(path), false), hash.asString()); + } + }); myLoadingTaskIndex = loadingTaskIndex; } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java index daab05f66f42..30c5c374c66f 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java @@ -1,7 +1,12 @@ package com.intellij.vcs.log.impl; +import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.ContentRevision; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.vcs.log.ContentRevisionFactory; import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsFullCommitDetails; import org.jetbrains.annotations.NotNull; @@ -21,19 +26,24 @@ public class VcsFullCommitDetailsImpl extends VcsShortCommitDetailsImpl implemen @NotNull private final String myCommitterEmail; private final long myCommitTime; - @NotNull private final Collection myChanges; + @NotNull private final Collection myChanges; public VcsFullCommitDetailsImpl(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull VirtualFile root, @NotNull String subject, @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, @NotNull String committerName, @NotNull String committerEmail, long commitTime, - @NotNull List changes) { + @NotNull List changes, @NotNull final ContentRevisionFactory contentRevisionFactory) { super(hash, parents, authorTime, root, subject, authorName); myAuthorEmail = authorEmail; myCommitterName = committerName; myCommitterEmail = committerEmail; myCommitTime = commitTime; myFullMessage = message; - myChanges = changes; + myChanges = ContainerUtil.map(changes, new Function() { + @Override + public LightChange fun(Change change) { + return LightChange.create(contentRevisionFactory, VcsFullCommitDetailsImpl.this, change); + } + }); } @Override @@ -45,7 +55,12 @@ public class VcsFullCommitDetailsImpl extends VcsShortCommitDetailsImpl implemen @Override @NotNull public final Collection getChanges() { - return myChanges; + return ContainerUtil.map(myChanges, new Function() { + @Override + public Change fun(LightChange change) { + return change.toChange(); + } + }); } @Override @@ -70,4 +85,79 @@ public class VcsFullCommitDetailsImpl extends VcsShortCommitDetailsImpl implemen public long getCommitTime() { return myCommitTime; } + + private static class LightChange { + + private ContentRevisionFactory myContentRevisionFactory; + private VcsFullCommitDetails myDetails; + private boolean myModification; + private VirtualFile myBeforeFile; + private VirtualFile myAfterFile; + private String myBeforePath; + private String myAfterPath; + + private static LightChange create(ContentRevisionFactory contentRevisionFactory, VcsFullCommitDetails details, Change change) { + LightChange lc = new LightChange(); + Change.Type type = change.getType(); + lc.myModification = type == Change.Type.MODIFICATION; + lc.myContentRevisionFactory = contentRevisionFactory; + + ContentRevision before = change.getBeforeRevision(); + if (before != null && !lc.myModification) { // don't store the same path twice (for modification store only after path) + FilePath filePath = before.getFile(); + if (filePath.getVirtualFile() == null) { + lc.myBeforePath = filePath.getIOFile().getPath(); + } + else { + lc.myBeforeFile = filePath.getVirtualFile(); + } + } + + ContentRevision after = change.getAfterRevision(); + if (after != null) { + FilePath filePath = after.getFile(); + if (filePath.getVirtualFile() == null) { + lc.myAfterPath = filePath.getIOFile().getPath(); + } + else { + lc.myAfterFile = filePath.getVirtualFile(); + } + } + + lc.myDetails = details; + return lc; + } + + Change toChange() { + List parents = myDetails.getParents(); + Hash parentHash = parents.isEmpty() ? null : parents.get(0); // no parents for the initial commit + + ContentRevision before = null; + if (parentHash != null) { + if (myBeforeFile != null) { + before = myContentRevisionFactory.createRevision(myBeforeFile, parentHash); + } + else if (myBeforePath != null) { + before = myContentRevisionFactory.createRevision(myDetails.getRoot(), myBeforePath, parentHash); + } + } + + ContentRevision after = null; + if (myAfterFile != null) { + after = myContentRevisionFactory.createRevision(myAfterFile, myDetails.getHash()); + if (myModification && parentHash != null) { // we didn't store myBeforeFile/Path to avoid duplicate path + before = myContentRevisionFactory.createRevision(myAfterFile, parentHash); + } + } + else if (myAfterPath != null) { + after = myContentRevisionFactory.createRevision(myDetails.getRoot(), myAfterPath, myDetails.getHash()); + if (myModification && parentHash != null) { + before = myContentRevisionFactory.createRevision(myDetails.getRoot(), myAfterPath, parentHash); + } + } + + return new Change(before, after); + } + + } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java index 8b710784a124..6ea9810a3bf0 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java @@ -42,9 +42,10 @@ public class VcsLogObjectsFactoryImpl implements VcsLogObjectsFactory { public VcsFullCommitDetails createFullDetails(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull VirtualFile root, @NotNull String subject, @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, @NotNull String committerName, - @NotNull String committerEmail, long commitTime, @NotNull List changes) { + @NotNull String committerEmail, long commitTime, @NotNull List changes, + @NotNull ContentRevisionFactory contentRevisionFactory) { return new VcsFullCommitDetailsImpl(hash, parents, authorTime, root, subject, authorName, authorEmail, message, committerName, - committerEmail, commitTime, changes); + committerEmail, commitTime, changes, contentRevisionFactory); } @NotNull diff --git a/plugins/git4idea/src/META-INF/plugin.xml b/plugins/git4idea/src/META-INF/plugin.xml index 430bb42af494..ad09f73663a6 100644 --- a/plugins/git4idea/src/META-INF/plugin.xml +++ b/plugins/git4idea/src/META-INF/plugin.xml @@ -148,6 +148,8 @@ + + parents, long authorTime, @NotNull VirtualFile root, @NotNull String subject, + public GitCommit(final Project project, @NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull VirtualFile root, + @NotNull String subject, @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, @NotNull String committerName, @NotNull String committerEmail, long commitTime, @NotNull List changes) { - super(hash, parents, authorTime, root, subject, authorName, authorEmail, message, committerName, committerEmail, commitTime, changes); + super(hash, parents, authorTime, root, subject, authorName, authorEmail, message, committerName, committerEmail, commitTime, changes, + GitContentRevisionFactory.getInstance(project)); + } } diff --git a/plugins/git4idea/src/git4idea/cherrypick/GitCherryPickAction.java b/plugins/git4idea/src/git4idea/cherrypick/GitCherryPickAction.java index 3d938889da1c..ffa399e93299 100644 --- a/plugins/git4idea/src/git4idea/cherrypick/GitCherryPickAction.java +++ b/plugins/git4idea/src/git4idea/cherrypick/GitCherryPickAction.java @@ -39,6 +39,7 @@ import git4idea.config.GitVcsSettings; import git4idea.history.browser.GitHeavyCommit; import git4idea.history.wholeTree.AbstractHash; import git4idea.history.wholeTree.GitCommitDetailsProvider; +import git4idea.log.GitContentRevisionFactory; import git4idea.repo.GitRepository; import icons.Git4ideaIcons; import org.jetbrains.annotations.NotNull; @@ -166,14 +167,14 @@ public class GitCherryPickAction extends DumbAwareAction { // TODO remove after removing the old Vcs Log implementation @Nullable private List getSelectedCommits(AnActionEvent e) { - List commits = e.getData(GitVcs.SELECTED_COMMITS); - if (commits != null) { - return convertHeavyCommitToFullDetails(commits); - } final Project project = e.getProject(); if (project == null) { return null; } + List commits = e.getData(GitVcs.SELECTED_COMMITS); + if (commits != null) { + return convertHeavyCommitToFullDetails(commits, project); + } final VcsLog log = getVcsLog(project); if (log == null) { return null; @@ -197,7 +198,7 @@ public class GitCherryPickAction extends DumbAwareAction { return selectedDetails; } - private static List convertHeavyCommitToFullDetails(List commits) { + private static List convertHeavyCommitToFullDetails(List commits, final Project project) { return ContainerUtil.map(commits, new Function() { @Override public VcsFullCommitDetails fun(GitHeavyCommit commit) { @@ -211,7 +212,7 @@ public class GitCherryPickAction extends DumbAwareAction { return factory.createFullDetails( factory.createHash(commit.getHash().getValue()), parents, commit.getAuthorTime(), commit.getRoot(), commit.getSubject(), commit.getAuthor(), commit.getAuthorEmail(), commit.getDescription(), commit.getCommitter(), commit.getCommitterEmail(), - commit.getDate().getTime(), commit.getChanges() + commit.getDate().getTime(), commit.getChanges(), GitContentRevisionFactory.getInstance(project) ); } }); diff --git a/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java b/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java index f7b4ec8ca3f8..79f7223bc1ea 100644 --- a/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java +++ b/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java @@ -711,7 +711,7 @@ public class GitHistoryUtils { return HashImpl.build(hash); } }); - return new GitCommit(HashImpl.build(record.getHash()), parents, record.getAuthorTimeStamp(), root, record.getSubject(), + return new GitCommit(project, HashImpl.build(record.getHash()), parents, record.getAuthorTimeStamp(), root, record.getSubject(), record.getAuthorName(), record.getAuthorEmail(), record.getFullMessage(), record.getCommitterName(), record.getCommitterEmail(), record.getLongTimeStamp(), record.parseChanges(project, root)); diff --git a/plugins/git4idea/src/git4idea/log/GitContentRevisionFactory.java b/plugins/git4idea/src/git4idea/log/GitContentRevisionFactory.java new file mode 100644 index 000000000000..054f3987e809 --- /dev/null +++ b/plugins/git4idea/src/git4idea/log/GitContentRevisionFactory.java @@ -0,0 +1,57 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package git4idea.log; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.FilePathImpl; +import com.intellij.openapi.vcs.changes.ContentRevision; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.vcs.log.ContentRevisionFactory; +import com.intellij.vcs.log.Hash; +import git4idea.GitContentRevision; +import git4idea.GitRevisionNumber; +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +public class GitContentRevisionFactory extends ContentRevisionFactory { + + @NotNull private final Project myProject; + + @SuppressWarnings("UnusedDeclaration") + private GitContentRevisionFactory(@NotNull Project project) { + myProject = project; + } + + public static ContentRevisionFactory getInstance(Project project) { + return ServiceManager.getService(project, GitContentRevisionFactory.class); + } + + @NotNull + @Override + public ContentRevision createRevision(@NotNull VirtualFile file, @NotNull Hash hash) { + return GitContentRevision.createRevision(file, new GitRevisionNumber(hash.asString()), myProject); + } + + @NotNull + @Override + public ContentRevision createRevision(@NotNull VirtualFile root, @NotNull String path, @NotNull Hash hash) { + return GitContentRevision.createRevision(new FilePathImpl(new File(path), false), + new GitRevisionNumber(hash.asString()), myProject, null); + } + +} diff --git a/plugins/git4idea/test-stepdefs/git4idea/GitCherryPickStepdefs.java b/plugins/git4idea/test-stepdefs/git4idea/GitCherryPickStepdefs.java index e062a67ee4d6..5aa6c58a9aee 100644 --- a/plugins/git4idea/test-stepdefs/git4idea/GitCherryPickStepdefs.java +++ b/plugins/git4idea/test-stepdefs/git4idea/GitCherryPickStepdefs.java @@ -39,6 +39,7 @@ import cucumber.annotation.en.Then; import cucumber.annotation.en.When; import git4idea.cherrypick.GitCherryPicker; import git4idea.config.GitVersionSpecialty; +import git4idea.log.GitContentRevisionFactory; import java.util.*; @@ -263,7 +264,7 @@ public class GitCherryPickStepdefs { changes.add(new Change(null, new MockContentRevision(new FilePathImpl(new MockVirtualFile("name")), VcsRevisionNumber.NULL))); return ServiceManager.getService(VcsLogObjectsFactory.class).createFullDetails( HashImpl.build(hash), Collections.emptyList(), 0, NullVirtualFile.INSTANCE, message, "John Smith", "john@mail.com", message, - "John Smith", "john@mail.com", 0, changes); + "John Smith", "john@mail.com", 0, changes, GitContentRevisionFactory.getInstance(myProject)); } } \ No newline at end of file diff --git a/plugins/hg4idea/src/META-INF/plugin.xml b/plugins/hg4idea/src/META-INF/plugin.xml index 413c49f54db7..890c9f8b3cd2 100644 --- a/plugins/hg4idea/src/META-INF/plugin.xml +++ b/plugins/hg4idea/src/META-INF/plugin.xml @@ -22,6 +22,8 @@ serviceImplementation="org.zmlx.hg4idea.HgRootsHandler" /> + + diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgContentRevisionFactory.java b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgContentRevisionFactory.java new file mode 100644 index 000000000000..777cad412c59 --- /dev/null +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgContentRevisionFactory.java @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zmlx.hg4idea.log; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.changes.ContentRevision; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.vcs.log.ContentRevisionFactory; +import com.intellij.vcs.log.Hash; +import org.jetbrains.annotations.NotNull; +import org.zmlx.hg4idea.HgContentRevision; +import org.zmlx.hg4idea.HgFile; +import org.zmlx.hg4idea.HgRevisionNumber; + +import java.io.File; + +/** +* +*/ +public class HgContentRevisionFactory extends ContentRevisionFactory { + + @NotNull private final Project myProject; + + @SuppressWarnings("UnusedDeclaration") + private HgContentRevisionFactory(@NotNull Project project) { + myProject = project; + } + + public static HgContentRevisionFactory getInstance(Project project) { + return ServiceManager.getService(project, HgContentRevisionFactory.class); + } + + @NotNull + @Override + public ContentRevision createRevision(@NotNull VirtualFile file, @NotNull Hash hash) { + return new HgContentRevision(myProject, new HgFile(myProject, file), HgRevisionNumber.getInstance("", hash.asString())); + } + + @NotNull + @Override + public ContentRevision createRevision(@NotNull VirtualFile root, @NotNull String path, @NotNull Hash hash) { + return new HgContentRevision(myProject, new HgFile(root, new File(path)), HgRevisionNumber.getInstance("", hash.asString())); + } +} diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgHistoryUtil.java b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgHistoryUtil.java index a5315c9bdc2a..f78d8fc23ce6 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgHistoryUtil.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgHistoryUtil.java @@ -33,6 +33,7 @@ import org.zmlx.hg4idea.*; import org.zmlx.hg4idea.action.HgCommandResultNotifier; import org.zmlx.hg4idea.command.HgLogCommand; import org.zmlx.hg4idea.execution.HgCommandException; +import org.zmlx.hg4idea.log.HgContentRevisionFactory; import org.zmlx.hg4idea.provider.HgCommittedChangeList; import java.io.File; @@ -61,7 +62,7 @@ public class HgHistoryUtil { return ContainerUtil.mapNotNull(result, new Function() { @Override public VcsFullCommitDetails fun(HgCommittedChangeList record) { - return createCommit(root, record); + return createCommit(project, root, record); } }); } @@ -169,7 +170,7 @@ public class HgHistoryUtil { } @NotNull - private static VcsFullCommitDetails createCommit(@NotNull VirtualFile root, + private static VcsFullCommitDetails createCommit(@NotNull Project project, @NotNull VirtualFile root, @NotNull HgCommittedChangeList record) { final VcsLogObjectsFactory factory = ServiceManager.getService(VcsLogObjectsFactory.class); @@ -185,7 +186,7 @@ public class HgHistoryUtil { revNumber.getSubject(), revNumber.getAuthor(), "", revNumber.getCommitMessage(), record.getCommitterName(), "", record.getCommitDate().getTime(), - ContainerUtil.newArrayList(record.getChanges())); + ContainerUtil.newArrayList(record.getChanges()), HgContentRevisionFactory.getInstance(project)); } @Nullable From 47fee8e129e11ed8b6dbddb29146a74d6b654ba1 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 13:33:25 +0100 Subject: [PATCH 16/30] new inference: throws clause processed --- .../graphInference/InferenceSession.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 50df51eaa7a4..de5d470e8e69 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -445,14 +445,18 @@ public class InferenceSession { } else if (acceptObject || upperBounds.size() > 1 || !upperBounds.get(0).equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) { PsiType glb = null; - for (PsiType upperBound : upperBounds) { - upperBound = acceptBoundsWithRecursiveDependencies(typeParameter, upperBound, substitutor); - if (isProperType(upperBound, false)) { - if (glb == null) { - glb = upperBound; - } - else { - glb = GenericsUtil.getGreatestLowerBound(glb, upperBound); + if (isThrowable(upperBounds)) { + glb = PsiType.getJavaLangRuntimeException(myManager, GlobalSearchScope.allScope(myManager.getProject())); + } else { + for (PsiType upperBound : upperBounds) { + upperBound = acceptBoundsWithRecursiveDependencies(typeParameter, upperBound, substitutor); + if (isProperType(upperBound, false)) { + if (glb == null) { + glb = upperBound; + } + else { + glb = GenericsUtil.getGreatestLowerBound(glb, upperBound); + } } } } @@ -473,6 +477,20 @@ public class InferenceSession { return substitutor; } + private static boolean isThrowable(List upperBounds) { + boolean commonThrowable = false; + for (PsiType upperBound : upperBounds) { + if (upperBound.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) continue; + if (upperBound.equalsToText(CommonClassNames.JAVA_LANG_EXCEPTION) || + upperBound.equalsToText(CommonClassNames.JAVA_LANG_THROWABLE)) { + commonThrowable = true; + } else { + return false; + } + } + return commonThrowable; + } + private PsiType acceptBoundsWithRecursiveDependencies(PsiTypeParameter typeParameter, PsiType bound, PsiSubstitutor substitutor) { if (!isProperType(bound)) { final PsiSubstitutor subst = PsiUtil.resolveClassInType(bound) != typeParameter ? substitutor.put(typeParameter, null) : substitutor; From 5eb0e62d588cd7e5b8a3aeb95d6445977d5c2e92 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 15:12:21 +0100 Subject: [PATCH 17/30] accept intersection types in casts for 1.8 (IDEA-115720) --- .../src/com/intellij/psi/util/TypeConversionUtil.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 51e2fdf0341f..115b646768c8 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -179,7 +179,15 @@ public class TypeConversionUtil { } return false; } - else if (toType instanceof PsiIntersectionType) return false; + else if (toType instanceof PsiIntersectionType) { + if (fromType instanceof PsiClassType && ((PsiClassType)fromType).getLanguageLevel().isAtLeast(LanguageLevel.JDK_1_8)) { + for (PsiType conjunct : ((PsiIntersectionType)toType).getConjuncts()) { + if (!isNarrowingReferenceConversionAllowed(fromType, conjunct)) return false; + } + return true; + } + return false; + } if (fromType instanceof PsiDisjunctionType) { return isNarrowingReferenceConversionAllowed(((PsiDisjunctionType)fromType).getLeastUpperBound(), toType); From 5bd8b62070a64518e2057af420dcc3a21aa3d2a8 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 15:45:24 +0100 Subject: [PATCH 18/30] fix to switch intersection types order in casts when one of the last types is not an interface --- .../analysis/FlipIntersectionSidesFix.java | 96 +++++++++++++++++++ .../daemon/impl/analysis/HighlightUtil.java | 23 ++++- .../CastToIntersection.java | 11 +++ .../quickFix/flipIntersection/after1.java | 7 ++ .../quickFix/flipIntersection/before1.java | 7 ++ .../quickFix/FlipIntersectionTypesTest.java | 28 ++++++ 6 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CastToIntersection.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/after1.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before1.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/FlipIntersectionTypesTest.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java new file mode 100644 index 000000000000..3f2d1cc448f9 --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java @@ -0,0 +1,96 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.daemon.impl.analysis; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** +* User: anna +* Date: 10/31/13 +*/ +class FlipIntersectionSidesFix implements IntentionAction { + private static final Logger LOG = Logger.getInstance("#" + FlipIntersectionSidesFix.class.getName()); + private final String myClassName; + private final List myConjuncts; + private final PsiTypeElement myConjunct; + private final PsiTypeElement myCastTypeElement; + + public FlipIntersectionSidesFix(String className, + @NotNull List conjList, + PsiTypeElement conjunct, + PsiTypeElement castTypeElement) { + myClassName = className; + myConjuncts = conjList; + myConjunct = conjunct; + myCastTypeElement = castTypeElement; + } + + @NotNull + @Override + public String getText() { + return "Move '" + myClassName + "' to the beginning"; + } + + @NotNull + @Override + public String getFamilyName() { + return "Move to front"; + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + for (PsiTypeElement typeElement : myConjuncts) { + if (!typeElement.isValid()) return false; + } + return true; + } + + @Override + public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + myConjuncts.remove(myConjunct); + myConjuncts.add(0, myConjunct); + + final String intersectionTypeText = StringUtil.join(myConjuncts, new Function() { + @Override + public String fun(PsiTypeElement element) { + return element.getText(); + } + }, " & "); + final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project); + final PsiTypeCastExpression fixedCast = + (PsiTypeCastExpression)elementFactory.createExpressionFromText("(" + intersectionTypeText + ") a", myCastTypeElement); + final PsiTypeElement fixedCastCastType = fixedCast.getCastType(); + LOG.assertTrue(fixedCastCastType != null); + final PsiElement flippedTypeElement = myCastTypeElement.replace(fixedCastCastType); + CodeStyleManager.getInstance(project).reformat(flippedTypeElement); + } + + @Override + public boolean startInWriteAction() { + return true; + } +} diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 12af14a61b5c..60668b722835 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -290,7 +290,7 @@ public class HighlightUtil extends HighlightUtilBase { @Nullable static HighlightInfo checkInconvertibleTypeCast(@NotNull PsiTypeCastExpression expression) { - PsiTypeElement castTypeElement = expression.getCastType(); + final PsiTypeElement castTypeElement = expression.getCastType(); if (castTypeElement == null) return null; PsiType castType = castTypeElement.getType(); @@ -306,6 +306,27 @@ public class HighlightUtil extends HighlightUtilBase { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } + if (castType instanceof PsiIntersectionType && PsiUtil.isLanguageLevel8OrHigher(expression)) { + final PsiTypeElement[] conjuncts = PsiTreeUtil.getChildrenOfType(castTypeElement, PsiTypeElement.class); + if (conjuncts != null) { + final List conjList = new ArrayList(Arrays.asList(conjuncts)); + for (int i = 1; i < conjuncts.length; i++) { + final PsiTypeElement conjunct = conjuncts[i]; + final PsiType conjType = conjunct.getType(); + if (conjType instanceof PsiClassType) { + final PsiClass aClass = ((PsiClassType)conjType).resolve(); + if (aClass != null && !aClass.isInterface()) { + final HighlightInfo errorResult = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .range(conjunct) + .descriptionAndTooltip(JavaErrorMessages.message("interface.expected")).create(); + QuickFixAction.registerQuickFixAction(errorResult, new FlipIntersectionSidesFix(aClass.getName(), conjList, conjunct, castTypeElement), null); + return errorResult; + } + } + } + } + } + return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CastToIntersection.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CastToIntersection.java new file mode 100644 index 000000000000..66affa9cde79 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CastToIntersection.java @@ -0,0 +1,11 @@ +import java.io.Serializable; + +public class FooBar1 { + { + Object x = null; + Object y = (CharSequence & Serializable) x; + Object y2 = (CharSequence & Integer) x; + Object y3 = (Integer & CharSequence) x; + int y1 = (CharSequence & Serializable) x; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/after1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/after1.java new file mode 100644 index 000000000000..f07cf3847bda --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/after1.java @@ -0,0 +1,7 @@ +// "Move 'Number' to the beginning" "true" +class C { + { + Object x = null; + Object y2 = (Number & CharSequence) x; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before1.java new file mode 100644 index 000000000000..38380bc0c315 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before1.java @@ -0,0 +1,7 @@ +// "Move 'Number' to the beginning" "true" +class C { + { + Object x = null; + Object y2 = (CharSequence & Number) x; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/FlipIntersectionTypesTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/FlipIntersectionTypesTest.java new file mode 100644 index 000000000000..ddd8ce49bc9a --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/FlipIntersectionTypesTest.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.daemon.quickFix; + +public class FlipIntersectionTypesTest extends LightQuickFixTestCase { + public void test() throws Exception { + doAllTests(); + } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection"; + } +} + From 6e8c5496454a82683eeb95095d499a178f1b0ea4 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 16:24:47 +0100 Subject: [PATCH 19/30] warn about unsupported intersections in casts before 1.8 --- .../daemon/impl/analysis/HighlightUtil.java | 59 ++++++++++++------- .../impl/analysis/HighlightVisitorImpl.java | 1 + 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 60668b722835..15bb4fe3bd4c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -288,6 +288,45 @@ public class HighlightUtil extends HighlightUtilBase { } + @Nullable + static HighlightInfo checkIntersectionInTypeCast(@NotNull PsiTypeCastExpression expression) { + final PsiTypeElement castTypeElement = expression.getCastType(); + if (castTypeElement == null) return null; + PsiType castType = castTypeElement.getType(); + if (isIntersection(castTypeElement, castType)) { + if (PsiUtil.isLanguageLevel8OrHigher(expression)) { + final PsiTypeElement[] conjuncts = PsiTreeUtil.getChildrenOfType(castTypeElement, PsiTypeElement.class); + if (conjuncts != null) { + final List conjList = new ArrayList(Arrays.asList(conjuncts)); + for (int i = 1; i < conjuncts.length; i++) { + final PsiTypeElement conjunct = conjuncts[i]; + final PsiType conjType = conjunct.getType(); + if (conjType instanceof PsiClassType) { + final PsiClass aClass = ((PsiClassType)conjType).resolve(); + if (aClass != null && !aClass.isInterface()) { + final HighlightInfo errorResult = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .range(conjunct) + .descriptionAndTooltip(JavaErrorMessages.message("interface.expected")).create(); + QuickFixAction.registerQuickFixAction(errorResult, new FlipIntersectionSidesFix(aClass.getName(), conjList, conjunct, castTypeElement), null); + return errorResult; + } + } + } + } + } else { + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .range(expression) + .descriptionAndTooltip("Intersection types in cast are not supported at this language level").create(); + } + } + return null; + } + + static boolean isIntersection(PsiTypeElement castTypeElement, PsiType castType) { + if (castType instanceof PsiIntersectionType) return true; + return PsiTreeUtil.getChildrenOfType(castTypeElement, PsiTypeElement.class) != null; + } + @Nullable static HighlightInfo checkInconvertibleTypeCast(@NotNull PsiTypeCastExpression expression) { final PsiTypeElement castTypeElement = expression.getCastType(); @@ -306,26 +345,6 @@ public class HighlightUtil extends HighlightUtilBase { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create(); } - if (castType instanceof PsiIntersectionType && PsiUtil.isLanguageLevel8OrHigher(expression)) { - final PsiTypeElement[] conjuncts = PsiTreeUtil.getChildrenOfType(castTypeElement, PsiTypeElement.class); - if (conjuncts != null) { - final List conjList = new ArrayList(Arrays.asList(conjuncts)); - for (int i = 1; i < conjuncts.length; i++) { - final PsiTypeElement conjunct = conjuncts[i]; - final PsiType conjType = conjunct.getType(); - if (conjType instanceof PsiClassType) { - final PsiClass aClass = ((PsiClassType)conjType).resolve(); - if (aClass != null && !aClass.isInterface()) { - final HighlightInfo errorResult = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) - .range(conjunct) - .descriptionAndTooltip(JavaErrorMessages.message("interface.expected")).create(); - QuickFixAction.registerQuickFixAction(errorResult, new FlipIntersectionSidesFix(aClass.getName(), conjList, conjunct, castTypeElement), null); - return errorResult; - } - } - } - } - } return null; } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index d24c311e4a53..f552a66c25ab 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1336,6 +1336,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh public void visitTypeCastExpression(PsiTypeCastExpression typeCast) { super.visitTypeCastExpression(typeCast); try { + if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkIntersectionInTypeCast(typeCast)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkInconvertibleTypeCast(typeCast)); } catch (IndexNotReadyException ignore) { From 67ccffd85040d7bebedc0d02c8e5de5e928b9be5 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 16:26:26 +0100 Subject: [PATCH 20/30] rearrange package; check writable --- .../{analysis => quickfix}/FlipIntersectionSidesFix.java | 6 ++++-- .../impl/{analysis => quickfix}/QualifyWithThisFix.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) rename java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/{analysis => quickfix}/FlipIntersectionSidesFix.java (92%) rename java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/{analysis => quickfix}/QualifyWithThisFix.java (88%) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java similarity index 92% rename from java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java rename to java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java index 3f2d1cc448f9..d6422918e6c4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/FlipIntersectionSidesFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.codeInsight.daemon.impl.analysis; +package com.intellij.codeInsight.daemon.impl.quickfix; +import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -32,7 +33,7 @@ import java.util.List; * User: anna * Date: 10/31/13 */ -class FlipIntersectionSidesFix implements IntentionAction { +public class FlipIntersectionSidesFix implements IntentionAction { private static final Logger LOG = Logger.getInstance("#" + FlipIntersectionSidesFix.class.getName()); private final String myClassName; private final List myConjuncts; @@ -71,6 +72,7 @@ class FlipIntersectionSidesFix implements IntentionAction { @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + if (!FileModificationService.getInstance().prepareFileForWrite(file)) return; myConjuncts.remove(myConjunct); myConjuncts.add(0, myConjunct); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/QualifyWithThisFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyWithThisFix.java similarity index 88% rename from java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/QualifyWithThisFix.java rename to java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyWithThisFix.java index cebb50c019ea..beb210744589 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/QualifyWithThisFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifyWithThisFix.java @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.codeInsight.daemon.impl.analysis; +package com.intellij.codeInsight.daemon.impl.quickfix; +import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -26,7 +27,7 @@ import org.jetbrains.annotations.NotNull; /** * User: anna */ -class QualifyWithThisFix implements IntentionAction { +public class QualifyWithThisFix implements IntentionAction { private final PsiClass myContainingClass; private final PsiElement myExpression; @@ -54,6 +55,7 @@ class QualifyWithThisFix implements IntentionAction { @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + if (!FileModificationService.getInstance().prepareFileForWrite(file)) return; final PsiThisExpression thisExpression = RefactoringChangeUtil.createThisExpression(PsiManager.getInstance(project), myContainingClass); ((PsiReferenceExpression)myExpression).setQualifierExpression(thisExpression); From 578826bb301b0a4744f0d543ade30738b6aa7d73 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Oct 2013 16:32:14 +0100 Subject: [PATCH 21/30] disable flip intersection conjuncts for equal sides --- .../daemon/impl/quickfix/FlipIntersectionSidesFix.java | 4 +++- .../quickFix/flipIntersection/before2.java | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before2.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java index d6422918e6c4..8eed99632fda 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/FlipIntersectionSidesFix.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; @@ -46,6 +47,7 @@ public class FlipIntersectionSidesFix implements IntentionAction { PsiTypeElement castTypeElement) { myClassName = className; myConjuncts = conjList; + LOG.assertTrue(!conjList.isEmpty()); myConjunct = conjunct; myCastTypeElement = castTypeElement; } @@ -67,7 +69,7 @@ public class FlipIntersectionSidesFix implements IntentionAction { for (PsiTypeElement typeElement : myConjuncts) { if (!typeElement.isValid()) return false; } - return true; + return !Comparing.strEqual(myConjunct.getText(), myConjuncts.get(0).getText()); } @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before2.java new file mode 100644 index 000000000000..34f28f2733f3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/flipIntersection/before2.java @@ -0,0 +1,7 @@ +// "Move 'Number' to the beginning" "false" +class C { + { + Object x = null; + Object y2 = (Number & Number) x; + } +} From 0f469fbc8469bbf48a06a567fdc539f58c3e2b6b Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Mon, 28 Oct 2013 16:22:25 +0400 Subject: [PATCH 22/30] fix CCE in introduce field to script --- .../introduce/field/GrIntroduceFieldHandler.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index 0211ee378a4c..dad877d0da96 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -140,17 +140,16 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase result = EnumSet.of(GrIntroduceFieldSettings.Init.FIELD_DECLARATION, GrIntroduceFieldSettings.Init.CONSTRUCTOR); - - GrTypeDefinition clazz = (GrTypeDefinition)context.getScope(); + PsiElement scope = context.getScope(); if (replaceAll) { - PsiElement anchor = GrIntroduceHandlerBase.findAnchor(context.getOccurrences(), clazz); + PsiElement anchor = GrIntroduceHandlerBase.findAnchor(context.getOccurrences(), scope); if (anchor != null) { result.add(GrIntroduceFieldSettings.Init.CUR_METHOD); } } - if (TestFrameworks.getInstance().isTestClass(clazz)) { + if (scope instanceof GrTypeDefinition && TestFrameworks.getInstance().isTestClass((PsiClass)scope)) { result.add(GrIntroduceFieldSettings.Init.SETUP_METHOD); } From 28533327badb1ae195cfc04bc2255b293a2233d9 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Tue, 29 Oct 2013 18:20:24 +0400 Subject: [PATCH 23/30] unnecessary 'static' --- .../refactoring/introduce/inplace/OccurrencesChooser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java index 04a67b29b829..444bc492aa81 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/OccurrencesChooser.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ import java.util.List; // This prevents languages with polyadic expressions or sequences // from reusing it, use simpleChooser instead. public abstract class OccurrencesChooser { - public static enum ReplaceChoice { + public enum ReplaceChoice { NO("Replace this occurrence only"), NO_WRITE("Replace all occurrences but write"), ALL("Replace all {0} occurrences"); private final String myDescription; From 12d0c6400b7b3db466d63eb3355716815f15c8a4 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 30 Oct 2013 18:36:21 +0400 Subject: [PATCH 24/30] shorten reference --- .../refactoring/rename/inplace/InplaceRefactoring.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java index 33f23494b341..fc7335595a10 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import com.intellij.lang.refactoring.NamesValidator; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.Result; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.impl.FinishMarkAction; @@ -327,7 +328,7 @@ public abstract class InplaceRefactoring { new WriteCommandAction(myProject, getCommandName()) { @Override - protected void run(com.intellij.openapi.application.Result result) throws Throwable { + protected void run(Result result) throws Throwable { startTemplate(builder); } }.execute(); From 4c1e69746ac8dc4dbad8a04de62dd30e35569139 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 30 Oct 2013 18:41:51 +0400 Subject: [PATCH 25/30] canceling introduce variable --- .../GrAbstractInplaceIntroducer.java | 246 ++++++ .../introduce/GrNewIntroduceHandlerBase.java | 765 ++++++++++++++++++ .../variable/GrInplaceVariableIntroducer.java | 158 +++- .../GrIntroduceLocalVariableProcessor.java | 14 +- .../variable/GrIntroduceVariableHandler.java | 107 +-- 5 files changed, 1167 insertions(+), 123 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java new file mode 100644 index 000000000000..c8c52d3f60d4 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -0,0 +1,246 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.refactoring.introduce; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Computable; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtilCore; +import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; + +import java.util.List; + + +/** + * Created by Max Medvedev on 10/28/13 + */ +public abstract class GrAbstractInplaceIntroducer extends AbstractInplaceIntroducer { + + private OccurrencesChooser.ReplaceChoice myReplaceChoice; + + private RangeMarker myVarMarker; + private final PsiFile myFile; + + private final GrIntroduceContext myContext; + + public GrAbstractInplaceIntroducer(String title, + OccurrencesChooser.ReplaceChoice replaceChoice, + GrIntroduceContext context) { + super(context.getProject(), context.getEditor(), context.getExpression(), context.getVar(), context.getOccurrences(), title, GroovyFileType.GROOVY_FILE_TYPE); + myReplaceChoice = replaceChoice; + myContext = context; + myFile = context.getPlace().getContainingFile(); + } + + public GrIntroduceContext getContext() { + return myContext; + } + + @Override + public void setReplaceAllOccurrences(boolean allOccurrences) { + throw new IncorrectOperationException("don't invoke this method"); + } + + @Override + public GrExpression restoreExpression(PsiFile containingFile, GrVariable variable, RangeMarker marker, String exprText) { + if (exprText == null) return null; + if (variable == null || !variable.isValid()) return null; + final PsiElement refVariableElement = containingFile.findElementAt(marker.getStartOffset()); + final PsiElement refVariableElementParent = refVariableElement != null ? refVariableElement.getParent() : null; + GrExpression expression = + refVariableElementParent instanceof GrNewExpression && refVariableElement.getNode().getElementType() == GroovyTokenTypes.kNEW + ? (GrNewExpression)refVariableElementParent + : PsiTreeUtil.getParentOfType(refVariableElement, GrReferenceExpression.class); + if (expression instanceof GrReferenceExpression && !(expression.getParent() instanceof GrMethodCall)) { + final String referenceName = ((GrReferenceExpression)expression).getReferenceName(); + if (((GrReferenceExpression)expression).resolve() == variable || + Comparing.strEqual(variable.getName(), referenceName) || + Comparing.strEqual(exprText, referenceName)) { + return (GrExpression)expression + .replace(GroovyPsiElementFactory.getInstance(myProject).createExpressionFromText(exprText, variable)); + } + } + if (expression == null) { + expression = PsiTreeUtil.getParentOfType(refVariableElement, GrExpression.class); + } + while (expression instanceof GrReferenceExpression) { + final PsiElement parent = expression.getParent(); + if (parent instanceof GrMethodCallExpression) { + if (parent.getText().equals(exprText)) return (GrExpression)parent; + } + if (parent instanceof GrExpression) { + expression = (GrExpression)parent; + if (expression.getText().equals(exprText)) { + return expression; + } + } + else { + return null; + } + } + if (expression != null && expression.isValid() && expression.getText().equals(exprText)) { + return expression; + } + + if (refVariableElementParent instanceof GrExpression && refVariableElementParent.getText().equals(exprText)) { + return (GrExpression)refVariableElementParent; + } + + return null; + } + + @Nullable + @Override + protected PsiElement getNameIdentifier() { + return ((GrVariable)myElementToRename).getNameIdentifierGroovy(); + } + + @Override + protected GrVariable getVariable() { + if (myVarMarker == null) return null; + + int offset = myVarMarker.getStartOffset(); + PsiElement at = myFile.findElementAt(offset); + GrVariable var = PsiTreeUtil.getParentOfType(at, GrVariable.class); + return var; + } + + @Override + protected void performIntroduce() { + final List markers = getOccurrenceMarkers(); + GrIntroduceContext context = new GrIntroduceContext() { + @NotNull + @Override + public Project getProject() { + return myProject; + } + + @Override + public Editor getEditor() { + return myEditor; + } + + @Nullable + @Override + public GrExpression getExpression() { + return (GrExpression)getExpr(); + } + + @Nullable + @Override + public GrVariable getVar() { + return getLocalVariable(); + } + + @Nullable + @Override + public StringPartInfo getStringPart() { + return null; + } + + @NotNull + @Override + public PsiElement[] getOccurrences() { + List result = ContainerUtil.map(markers, new Function() { + @Override + public PsiElement fun(RangeMarker marker) { + return GroovyRefactoringUtil.findElementInRange(myFile, marker.getStartOffset(), marker.getEndOffset(), GrExpression.class); + } + }); + return PsiUtilCore.toPsiElementArray(result); + } + + @Override + public PsiElement getScope() { + return myScope; + } + + @NotNull + @Override + public PsiElement getPlace() { + GrExpression expression = getExpression(); + return expression != null ? expression : getLocalVariable(); + } + }; + runRefactoring(context, getSettings(), true); + } + + @Nullable + @Override + protected GrVariable createFieldToStartTemplateOn(boolean replaceAll, String[] names) { + + final Settings settings = getInitialSettingsForInplace(myContext, myReplaceChoice, names); + if (settings == null) return null; + + SmartPsiElementPointer pointer = ApplicationManager.getApplication().runWriteAction(new Computable>() { + @Override + public SmartPsiElementPointer compute() { + GrVariable var = runRefactoring(myContext, settings, false); + return var != null ? SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(var) : null; + } + }); + + if (pointer != null) { + GrVariable var = pointer.getElement(); + if (var != null) { + myVarMarker = myContext.getEditor().getDocument().createRangeMarker(var.getTextRange()); + } + return var; + } + else { + return null; + } + } + + protected abstract GrVariable runRefactoring(GrIntroduceContext context, Settings settings, boolean processUsages); + + @Nullable + protected abstract Settings getInitialSettingsForInplace(@NotNull GrIntroduceContext context, + @NotNull OccurrencesChooser.ReplaceChoice choice, + String[] names); + + @Override + public boolean isReplaceAllOccurrences() { + return myReplaceChoice != OccurrencesChooser.ReplaceChoice.NO || myContext.getOccurrences().length == 1; + } + + protected abstract Settings getSettings(); + +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java new file mode 100644 index 000000000000..3be3b0ac7740 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java @@ -0,0 +1,765 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.refactoring.introduce; + +import com.intellij.codeInsight.highlighting.HighlightManager; +import com.intellij.diagnostic.LogMessageEx; +import com.intellij.lang.LanguageRefactoringSupport; +import com.intellij.lang.refactoring.RefactoringSupportProvider; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.editor.SelectionModel; +import com.intellij.openapi.editor.colors.EditorColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.markup.RangeHighlighter; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pass; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.psi.*; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.refactoring.IntroduceTargetChooser; +import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseLabel; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; +import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; +import org.jetbrains.plugins.groovy.refactoring.NameValidator; + +import java.util.*; + +import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipParentheses; + +/** + * Created by Max Medvedev on 10/29/13 + */ +public abstract class GrNewIntroduceHandlerBase implements RefactoringActionHandler { + private static final Logger LOG = Logger.getInstance(GrIntroduceHandlerBase.class); + + public static final Function GR_EXPRESSION_RENDERER = new Function() { + @Override + public String fun(@NotNull GrExpression expr) { + return expr.getText(); + } + }; + + public static GrExpression insertExplicitCastIfNeeded(GrVariable variable, GrExpression initializer) { + PsiType ltype = findLValueType(initializer); + PsiType rtype = initializer.getType(); + + GrExpression rawExpr = (GrExpression)skipParentheses(initializer, false); + + if (ltype == null || TypesUtil.isAssignableWithoutConversions(ltype, rtype, initializer) || !TypesUtil.isAssignable(ltype, rtype, initializer)) { + return rawExpr; + } + else { // implicit coercion should be replaced with explicit cast + GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(variable.getProject()); + GrSafeCastExpression cast = + (GrSafeCastExpression)factory.createExpressionFromText("a as B"); + cast.getOperand().replaceWithExpression(rawExpr, false); + cast.getCastTypeElement().replace(factory.createTypeElement(ltype)); + return cast; + } + } + + @Nullable + private static PsiType findLValueType(GrExpression initializer) { + if (initializer.getParent() instanceof GrAssignmentExpression && ((GrAssignmentExpression)initializer.getParent()).getRValue() == initializer) { + return ((GrAssignmentExpression)initializer.getParent()).getLValue().getNominalType(); + } + else if (initializer.getParent() instanceof GrVariable) { + return ((GrVariable)initializer.getParent()).getDeclaredType(); + } + else { + return null; + } + } + + @NotNull + protected abstract String getRefactoringName(); + + @NotNull + protected abstract String getHelpID(); + + @NotNull + protected abstract Scope[] findPossibleScopes(GrExpression expression, GrVariable variable, StringPartInfo stringPart, Editor editor); + + protected abstract void checkExpression(@NotNull GrExpression selectedExpr) throws GrRefactoringError; + + protected abstract void checkVariable(@NotNull GrVariable variable) throws GrRefactoringError; + + protected abstract void checkStringLiteral(@NotNull StringPartInfo info) throws GrRefactoringError; + + protected abstract void checkOccurrences(@NotNull PsiElement[] occurrences); + + @NotNull + protected abstract GrIntroduceDialog getDialog(@NotNull GrIntroduceContext context); + + @Nullable + public abstract GrVariable runRefactoring(@NotNull GrIntroduceContext context, @NotNull Settings settings); + + protected abstract GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice); + + protected abstract Settings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); + + public static Map> fillChoice(GrIntroduceContext context) { + HashMap> map = ContainerUtil.newLinkedHashMap(); + + if (context.getExpression() != null) { + map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getExpression())); + } + else if (context.getStringPart() != null) { + map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getStringPart())); + } + + PsiElement[] occurrences = context.getOccurrences(); + if (occurrences.length > 1) { + map.put(OccurrencesChooser.ReplaceChoice.ALL, Arrays.asList(occurrences)); + } + return map; + } + + @NotNull + public static List collectExpressions(final PsiFile file, final Editor editor, final int offset, boolean acceptVoidCalls) { + int correctedOffset = correctOffset(editor, offset); + final PsiElement elementAtCaret = file.findElementAt(correctedOffset); + final List expressions = new ArrayList(); + + for (GrExpression expression = PsiTreeUtil.getParentOfType(elementAtCaret, GrExpression.class); + expression != null; + expression = PsiTreeUtil.getParentOfType(expression, GrExpression.class)) { + if (expressions.contains(expression)) continue; + if (expression instanceof GrParenthesizedExpression && !expressions.contains(((GrParenthesizedExpression)expression).getOperand())) { + expressions.add(((GrParenthesizedExpression)expression).getOperand()); + } + if (expressionIsIncorrect(expression, acceptVoidCalls)) continue; + + expressions.add(expression); + } + return expressions; + } + + public static boolean expressionIsIncorrect(@Nullable GrExpression expression, boolean acceptVoidCalls) { + if (expression instanceof GrParenthesizedExpression) return true; + if (PsiUtil.isSuperReference(expression)) return true; + if (expression instanceof GrAssignmentExpression) return true; + if (expression instanceof GrReferenceExpression && expression.getParent() instanceof GrCall) { + final GroovyResolveResult resolveResult = ((GrReferenceExpression)expression).advancedResolve(); + final PsiElement resolved = resolveResult.getElement(); + return resolved instanceof PsiMethod && !resolveResult.isInvokedOnProperty() || resolved instanceof PsiClass; + } + + if (expression instanceof GrClosableBlock && expression.getParent() instanceof GrStringInjection) return true; + if (!acceptVoidCalls && expression instanceof GrMethodCall && PsiType.VOID == expression.getType()) return true; + + return false; + } + + public static int correctOffset(Editor editor, int offset) { + Document document = editor.getDocument(); + CharSequence text = document.getCharsSequence(); + int correctedOffset = offset; + int textLength = document.getTextLength(); + if (offset >= textLength) { + correctedOffset = textLength - 1; + } + else if (!Character.isJavaIdentifierPart(text.charAt(offset))) { + correctedOffset--; + } + + if (correctedOffset < 0) { + correctedOffset = offset; + } + else { + char c = text.charAt(correctedOffset); + if (c == ';' && correctedOffset != 0) {//initially caret on the end of line + correctedOffset--; + } + else if (!Character.isJavaIdentifierPart(c) && c != ')' && c != ']' && c != '}' && c != '\'' && c != '"' && c != '/') { + correctedOffset = offset; + } + } + return correctedOffset; + } + + @Nullable + public static GrVariable findVariableAtCaret(final PsiFile file, final Editor editor, final int offset) { + final int correctOffset = correctOffset(editor, offset); + final PsiElement elementAtCaret = file.findElementAt(correctOffset); + final GrVariable variable = PsiTreeUtil.getParentOfType(elementAtCaret, GrVariable.class); + if (variable != null && variable.getNameIdentifierGroovy().getTextRange().contains(correctOffset)) return variable; + return null; + } + + public void invoke(final @NotNull Project project, final Editor editor, final PsiFile file, final @Nullable DataContext dataContext) { + final SelectionModel selectionModel = editor.getSelectionModel(); + if (!selectionModel.hasSelection()) { + final int offset = editor.getCaretModel().getOffset(); + + final List expressions = collectExpressions(file, editor, offset, false); + if (expressions.isEmpty()) { + final GrVariable variable = findVariableAtCaret(file, editor, offset); + if (variable == null || variable instanceof GrField || variable instanceof GrParameter) { + selectionModel.selectLineAtCaret(); + } + else { + final TextRange textRange = variable.getTextRange(); + selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); + } + } + else if (expressions.size() == 1) { + final TextRange textRange = expressions.get(0).getTextRange(); + selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); + } + else { + IntroduceTargetChooser.showChooser(editor, expressions, new Pass() { + public void pass(final GrExpression selectedValue) { + invoke(project, editor, file, selectedValue.getTextRange().getStartOffset(), selectedValue.getTextRange().getEndOffset()); + } + }, GR_EXPRESSION_RENDERER); + return; + } + } + invoke(project, editor, file, selectionModel.getSelectionStart(), selectionModel.getSelectionEnd()); + } + + @Override + public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) { + // Does nothing + } + + public void getContextAndInvoke(@NotNull final Project project, + @NotNull final Editor editor, + @Nullable final GrExpression expression, + @Nullable final GrVariable variable, + @Nullable final StringPartInfo stringPart) { + final Scope[] scopes = findPossibleScopes(expression, variable, stringPart, editor); + + Pass callback = new Pass() { + @Override + public void pass(Scope scope) { + GrIntroduceContext context = getContext(project, editor, expression, variable, stringPart, scope); + invokeImpl(project, context, editor); + } + }; + + if (scopes.length == 0) { + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle + .getCannotRefactorMessage(getRefactoringName() + "is not available in current scope"), + getRefactoringName(), getHelpID()); + } + else if (scopes.length == 1) { + callback.pass(scopes[0]); + } + else { + showScopeChooser(scopes, callback, editor); + } + } + + protected abstract void showScopeChooser(Scope[] scopes, Pass callback, Editor editor); + + public GrIntroduceContext getContext(@NotNull Project project, + @NotNull Editor editor, + @Nullable GrExpression expression, + @Nullable GrVariable variable, + @Nullable StringPartInfo stringPart, + @NotNull PsiElement scope) { + if (variable != null) { + final List list = Collections.synchronizedList(new ArrayList()); + ReferencesSearch.search(variable, new LocalSearchScope(scope)).forEach(new Processor() { + @Override + public boolean process(PsiReference psiReference) { + final PsiElement element = psiReference.getElement(); + if (element != null) { + list.add(element); + } + return true; + } + }); + final PsiElement[] occurrences = list.toArray(new PsiElement[list.size()]); + return new GrIntroduceContextImpl(project, editor, variable.getInitializerGroovy(), variable, stringPart, occurrences, scope); + } + else if (expression != null ) { + final PsiElement[] occurrences = findOccurrences(expression, scope); + return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, occurrences, scope); + } + else { + assert stringPart != null; + return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, new PsiElement[]{stringPart.getLiteral()}, scope); + } + } + + private boolean invokeImpl(final Project project, final GrIntroduceContext context, final Editor editor) { + try { + if (!CommonRefactoringUtil.checkReadOnlyStatus(project, context.getOccurrences())) { + return false; + } + checkOccurrences(context.getOccurrences()); + + + if (isInplace(context.getEditor(), context.getPlace())) { + Map> occurrencesMap = fillChoice(context); + new OccurrencesChooser(editor) { + @Override + protected TextRange getOccurrenceRange(Object occurrence) { + if (occurrence instanceof PsiElement) { + return ((PsiElement)occurrence).getTextRange(); + } + else if (occurrence instanceof StringPartInfo) { + return ((StringPartInfo)occurrence).getRange(); + } + else { + return null; + } + } + }.showChooser(new Pass() { + @Override + public void pass(final OccurrencesChooser.ReplaceChoice choice) { + getIntroducer(context, choice).startInplaceIntroduceTemplate(); + } + }, occurrencesMap); + } + else { + final Settings settings = showDialog(context); + if (settings == null) return false; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + runRefactoring(context, settings); + } + }); + } + + return true; + } + catch (GrRefactoringError e) { + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); + return false; + } + } + + @NotNull + protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { + final PsiElement[] occurrences = GroovyRefactoringUtil.getExpressionOccurrences(skipParentheses(expression, false), scope); + if (occurrences == null || occurrences.length == 0) { + throw new GrRefactoringError(GroovyRefactoringBundle.message("no.occurrences.found")); + } + return occurrences; + } + + private void invoke(@NotNull final Project project, + @NotNull final Editor editor, + @NotNull PsiFile file, + int startOffset, + int endOffset) throws GrRefactoringError { + try { + PsiDocumentManager.getInstance(project).commitAllDocuments(); + if (!(file instanceof GroovyFileBase)) { + throw new GrRefactoringError(GroovyRefactoringBundle.message("only.in.groovy.files")); + } + if (!CommonRefactoringUtil.checkReadOnlyStatus(project, file)) { + throw new GrRefactoringError(RefactoringBundle.message("readonly.occurences.found")); + } + + GrExpression selectedExpr = findExpression(file, startOffset, endOffset); + final GrVariable variable = findVariable(file, startOffset, endOffset); + final StringPartInfo stringPart = StringPartInfo.findStringPart(file, startOffset, endOffset); + if (variable != null) { + checkVariable(variable); + } + else if (selectedExpr != null) { + checkExpression(selectedExpr); + } + else if (stringPart != null) { + checkStringLiteral(stringPart); + } + else { + throw new GrRefactoringError(null); + } + + getContextAndInvoke(project, editor, selectedExpr, variable, stringPart); + } + catch (GrRefactoringError e) { + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); + } + } + + public static RangeMarker createRange(Document document, StringPartInfo part) { + if (part == null) { + return null; + } + TextRange range = part.getRange().shiftRight(part.getLiteral().getTextRange().getStartOffset()); + return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), true); + + } + + @Nullable + public static RangeMarker createRange(@NotNull Document document, @Nullable PsiElement expression) { + if (expression == null) { + return null; + } + TextRange range = expression.getTextRange(); + return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), false); + } + + + public static boolean isInplace(@NotNull Editor editor, @NotNull PsiElement place) { + final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forLanguage(place.getLanguage()); + return supportProvider != null && + editor.getSettings().isVariableInplaceRenameEnabled() && + supportProvider.isInplaceIntroduceAvailable(place, place) && + !ApplicationManager.getApplication().isUnitTestMode(); + } + + @Nullable + public static GrVariable findVariable(@NotNull PsiFile file, int startOffset, int endOffset) { + GrVariable var = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariable.class); + if (var == null) { + final GrVariableDeclaration variableDeclaration = + GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariableDeclaration.class); + if (variableDeclaration == null) return null; + final GrVariable[] variables = variableDeclaration.getVariables(); + if (variables.length == 1) { + var = variables[0]; + } + } + if (var instanceof GrParameter || var instanceof GrField) { + return null; + } + return var; + } + + @Nullable + public static GrVariable findVariable(@NotNull GrStatement statement) { + if (!(statement instanceof GrVariableDeclaration)) return null; + final GrVariableDeclaration variableDeclaration = (GrVariableDeclaration)statement; + final GrVariable[] variables = variableDeclaration.getVariables(); + + GrVariable var = null; + if (variables.length == 1) { + var = variables[0]; + } + if (var instanceof GrParameter || var instanceof GrField) { + return null; + } + return var; + } + + + @Nullable + public static GrExpression findExpression(PsiFile file, int startOffset, int endOffset) { + GrExpression selectedExpr = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrExpression.class); + return findExpression(selectedExpr); + } + + @Nullable + public static GrExpression findExpression(GrStatement selectedExpr) { + if (!(selectedExpr instanceof GrExpression)) return null; + + GrExpression selected = (GrExpression)selectedExpr; + while (selected instanceof GrParenthesizedExpression) selected = ((GrParenthesizedExpression)selected).getOperand(); + if (selected == null) return null; + PsiType type = selected.getType(); + if (type != null) type = TypeConversionUtil.erasure(type); + + if (PsiType.VOID.equals(type)) { + return null; + } + + return selected; + } + + @Nullable + private Settings showDialog(@NotNull GrIntroduceContext context) { + + // Add occurrences highlighting + ArrayList highlighters = new ArrayList(); + HighlightManager highlightManager = null; + if (context.getEditor() != null) { + highlightManager = HighlightManager.getInstance(context.getProject()); + EditorColorsManager colorsManager = EditorColorsManager.getInstance(); + TextAttributes attributes = colorsManager.getGlobalScheme().getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES); + if (context.getOccurrences().length > 1) { + highlightManager.addOccurrenceHighlights(context.getEditor(), context.getOccurrences(), attributes, true, highlighters); + } + } + + GrIntroduceDialog dialog = getDialog(context); + + dialog.show(); + if (dialog.isOK()) { + if (context.getEditor() != null) { + for (RangeHighlighter highlighter : highlighters) { + highlightManager.removeSegmentHighlighter(context.getEditor(), highlighter); + } + } + return dialog.getSettings(); + } + else { + if (context.getOccurrences().length > 1) { + WindowManager.getInstance().getStatusBar(context.getProject()) + .setInfo(GroovyRefactoringBundle.message("press.escape.to.remove.the.highlighting")); + } + } + return null; + } + + @Nullable + public static PsiElement findAnchor(@NotNull PsiElement[] occurrences, + @NotNull PsiElement container) { + if (occurrences.length == 0) return null; + + PsiElement candidate; + if (occurrences.length == 1) { + candidate = occurrences[0]; + candidate = findContainingStatement(candidate); + } + else { + candidate = occurrences[0]; + while (candidate != null && candidate.getParent() != container) { + candidate = candidate.getParent(); + } + } + + final GrStringInjection injection = PsiTreeUtil.getParentOfType(candidate, GrStringInjection.class); + if (injection != null && !injection.getText().contains("\n")) { + candidate = findContainingStatement(injection); + } + + if (candidate == null) return null; + + if ((container instanceof GrWhileStatement) && + candidate.equals(((GrWhileStatement)container).getCondition())) { + return container; + } + if ((container instanceof GrIfStatement) && + candidate.equals(((GrIfStatement)container).getCondition())) { + return container; + } + if ((container instanceof GrForStatement) && + candidate.equals(((GrForStatement)container).getClause())) { + return container; + } + + while (candidate instanceof GrIfStatement && + candidate.getParent() instanceof GrIfStatement && + ((GrIfStatement)candidate.getParent()).getElseBranch() == candidate) { + candidate = candidate.getParent(); + } + return candidate; + } + + public static void assertStatement(PsiElement anchor, PsiElement[] occurrences, PsiElement scope) { + if (!(anchor instanceof GrStatement)) { + StringBuilder error = new StringBuilder("scope:"); + error.append(scope.getText()); + error.append("\n---------------------------------------\n\n"); + error.append("occurrences: "); + for (PsiElement occurrence : occurrences) { + error.append(occurrence.getText()); + error.append("\n------------------\n"); + } + + LogMessageEx.error(LOG, "cannot find anchor for variable", error.toString()); + } + } + + + @Nullable + private static PsiElement findContainingStatement(@Nullable PsiElement candidate) { + while (candidate != null && !PsiUtil.isExpressionStatement(candidate)) { + candidate = candidate.getParent(); + if (candidate instanceof GrCaseLabel) candidate = candidate.getParent(); + } + return candidate; + } + + public static void deleteLocalVar(@NotNull GrIntroduceContext context) { + final GrVariable resolved = resolveLocalVar(context); + + final PsiElement parent = resolved.getParent(); + if (((GrVariableDeclaration)parent).getVariables().length == 1) { + parent.delete(); + } + else { + GrExpression initializer = resolved.getInitializerGroovy(); + if (initializer != null) initializer.delete(); //don't special check for tuple, but this line is for the tuple case + resolved.delete(); + } + } + + @NotNull + public static GrVariable resolveLocalVar(@NotNull GrIntroduceContext context) { + final GrVariable var = context.getVar(); + if (var != null) { + return var; + } + + final GrReferenceExpression expression = (GrReferenceExpression)context.getExpression(); + assert expression != null; + + final PsiElement resolved = expression.resolve(); + assert resolved instanceof GrVariable; + return (GrVariable)resolved; + } + + public static boolean hasLhs(@NotNull final PsiElement[] occurrences) { + for (PsiElement element : occurrences) { + if (element instanceof GrReferenceExpression) { + if (PsiUtil.isLValue((GroovyPsiElement)element)) return true; + if (ControlFlowUtils.isIncOrDecOperand((GrReferenceExpression)element)) return true; + } + } + return false; + } + + @NotNull + public static PsiElement getCurrentPlace(@Nullable GrExpression expr, + @Nullable GrVariable var, + @Nullable StringPartInfo stringPartInfo) { + if (var != null) return var; + if (expr != null) return expr; + if (stringPartInfo != null) return stringPartInfo.getLiteral(); + + throw new IncorrectOperationException(); + } + + @NotNull + public static GrExpression generateExpressionFromStringPart(final StringPartInfo stringPart, final Project project) { + Data data = new Data(stringPart); + String startQuote = data.getStartQuote(); + TextRange range = data.getRange(); + String literalText = data.getText(); + String endQuote = data.getEndQuote(); + + final String substringLiteral = startQuote + range.substring(literalText) + endQuote; + return GroovyPsiElementFactory.getInstance(project).createExpressionFromText(substringLiteral); + } + + @NotNull + public static GrExpression processLiteral(final String varName, final StringPartInfo stringPart, final Project project) { + Data data = new Data(stringPart); + String startQuote = data.getStartQuote(); + TextRange range = data.getRange(); + String literalText = data.getText(); + String endQuote = data.getEndQuote(); + + String prefix = literalText.substring(0, range.getStartOffset()) ; + String suffix = literalText.substring(range.getEndOffset()); + + StringBuilder buffer = new StringBuilder(); + if (!prefix.equals(startQuote)) { + buffer.append(prefix).append(endQuote).append('+'); + } + buffer.append(varName); + if (!suffix.equals(endQuote)) { + buffer.append('+').append(startQuote).append(suffix); + } + + final GrExpression concatenation = GroovyPsiElementFactory.getInstance(project).createExpressionFromText(buffer); + + final GrExpression concat = stringPart.getLiteral().replaceWithExpression(concatenation, false); + if (concat instanceof GrReferenceExpression) { + return concat; + } + else { + assert concat instanceof GrBinaryExpression; + final GrExpression left = ((GrBinaryExpression)concat).getLeftOperand(); + if (left instanceof GrReferenceExpression) { + return left; + } + else { + assert left instanceof GrBinaryExpression; + final GrExpression right = ((GrBinaryExpression)left).getRightOperand(); + assert right != null; + return right; + } + } + } + + public interface Validator extends NameValidator { + boolean isOK(GrIntroduceDialog dialog); + } + + private static class Data { + private String myText; + private String myStartQuote; + private String myEndQuote; + private TextRange myRange; + + public Data(final StringPartInfo stringPartInfo) { + assert stringPartInfo != null; + + final GrLiteral literal = stringPartInfo.getLiteral(); + + myText = literal.getText(); + + myStartQuote = GrStringUtil.getStartQuote(myText); + myEndQuote = GrStringUtil.getEndQuote(myText); + final TextRange dataRange = new TextRange(myStartQuote.length(), myText.length() - myEndQuote.length()); + + myRange = stringPartInfo.getRange().intersection(dataRange); + } + + public String getText() { + return myText; + } + + public String getStartQuote() { + return myStartQuote; + } + + public String getEndQuote() { + return myEndQuote; + } + + public TextRange getRange() { + return myRange; + } + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java index eb19b097c90f..d7d3fb7c33cc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java @@ -16,25 +16,29 @@ package org.jetbrains.plugins.groovy.refactoring.introduce.variable; import com.intellij.codeInsight.template.TemplateBuilderImpl; +import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; +import com.intellij.openapi.keymap.Keymap; +import com.intellij.openapi.keymap.KeymapManager; +import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.psi.*; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.ui.NonFocusableCheckBox; -import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SupertypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrFinalListener; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; +import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; import org.jetbrains.plugins.groovy.settings.GroovyApplicationSettings; import org.jetbrains.plugins.groovy.template.expressions.ChooseTypeExpression; @@ -42,30 +46,41 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.LinkedHashSet; -import java.util.List; /** - * @author Max Medvedev + * Created by Max Medvedev on 10/29/13 */ -public class GrInplaceVariableIntroducer extends GrInplaceIntroducer { +public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntroducer { private JCheckBox myCanBeFinalCb; + private SmartTypePointer myTypePointer; - public GrInplaceVariableIntroducer(GrVariable elementToRename, - Editor editor, - Project project, - String title, - List occurrences, - @Nullable PsiElement elementToIntroduce) { - super(elementToRename, editor, project, title, occurrences, elementToIntroduce); - } - - @Override - public LinkedHashSet suggestNames(GrIntroduceContext context) { - return ContainerUtil.newLinkedHashSet(GroovyNameSuggestionUtil.suggestVariableNames(getVariable().getInitializerGroovy(), new GroovyVariableValidator(context))); + public GrInplaceVariableIntroducer(String title, + OccurrencesChooser.ReplaceChoice replaceChoice, + GrIntroduceContext context) { + super(title, replaceChoice, context); + setAdvertisementText(getAdvertisementText()); } @Nullable + private static String getAdvertisementText() { + final Keymap keymap = KeymapManager.getInstance().getActiveKeymap(); + final Shortcut[] shortcuts = keymap.getShortcuts("PreviousTemplateVariable"); + if (shortcuts.length > 0) { + return "Press " + KeymapUtil.getShortcutText(shortcuts[0]) + " to change type"; + } + return null; + } + + @Override + protected String getActionName() { + return GrIntroduceVariableHandler.REFACTORING_NAME; + } + + @Override + protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) { + return GroovyNameSuggestionUtil.suggestVariableNames(getContext().getExpression(), new GroovyVariableValidator(getContext())); + } + @Override protected JComponent getComponent() { myCanBeFinalCb = new NonFocusableCheckBox("Declare final"); @@ -91,22 +106,58 @@ public class GrInplaceVariableIntroducer extends GrInplaceIntroducer { panel.setBorder(null); if (myCanBeFinalCb != null) { - panel.add(myCanBeFinalCb, new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + panel.add(myCanBeFinalCb, new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, + new Insets(5, 5, 5, 5), 0, 0)); } - panel.add(Box.createVerticalBox(), new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0)); + panel.add(Box.createVerticalBox(), + new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); return panel; - } + @Nullable @Override - public void finish(boolean success) { - super.finish(success); + protected GroovyIntroduceVariableSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, + @NotNull final OccurrencesChooser.ReplaceChoice choice, + final String[] names) { + return new GroovyIntroduceVariableSettings() { + private final CanonicalTypes.Type myType; - if (success) { - GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF = getVariable().getDeclaredType() == null; - } + { + GrExpression expression = context.getExpression(); + StringPartInfo stringPart = context.getStringPart(); + GrVariable var = context.getVar(); + PsiType type = expression != null ? expression.getType() : + var != null ? var.getType() : + stringPart != null ? stringPart.getLiteral().getType() : + null; + myType = type != null ? CanonicalTypes.createTypeWrapper(type) : null; + } + + + @Override + public boolean isDeclareFinal() { + return myCanBeFinalCb != null ? myCanBeFinalCb.isSelected() : false; + } + + @Nullable + @Override + public String getName() { + return names[0]; + } + + @Override + public boolean replaceAllOccurrences() { + return choice == OccurrencesChooser.ReplaceChoice.ALL; + } + + @Nullable + @Override + public PsiType getSelectedType() { + return myType != null ? myType.getType(context.getPlace(), context.getPlace().getManager()) : null; + } + }; } @Override @@ -119,4 +170,47 @@ public class GrInplaceVariableIntroducer extends GrInplaceIntroducer { : PsiUtil.findModifierInList(variable.getModifierList(), GrModifier.DEF); builder.replaceElement(element, "Variable_type", typeExpression, true, true); } -} + + protected GroovyIntroduceVariableSettings getSettings() { + return new GroovyIntroduceVariableSettings() { + @Override + public boolean isDeclareFinal() { + return myCanBeFinalCb.isSelected(); + } + + @Nullable + @Override + public String getName() { + return GrInplaceVariableIntroducer.this.getInputName(); + } + + @Override + public boolean replaceAllOccurrences() { + return isReplaceAllOccurrences(); + } + + @Nullable + @Override + public PsiType getSelectedType() { + return myTypePointer != null ? myTypePointer.getType() : null; + } + }; + } + + @Override + protected void saveSettings(@NotNull GrVariable variable) { + GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF = variable.getDeclaredType() == null; + } + + @Override + protected int getCaretOffset() { + return getVariable().getNameIdentifierGroovy().getTextRange().getEndOffset(); + } + + @Override + protected void restoreState(GrVariable psiField) { + PsiType declaredType = getVariable().getDeclaredType(); + myTypePointer = declaredType != null ? SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(declaredType) : null; + super.restoreState(psiField); + } +} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java index 3d01195b1c4b..9546a20a24a4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceLocalVariableProcessor.java @@ -46,26 +46,26 @@ import java.util.List; /** * @author Max Medvedev */ -public class GrIntroduceLocalVariableProcessor { +public abstract class GrIntroduceLocalVariableProcessor { private static final Logger LOG = Logger.getInstance(GrIntroduceLocalVariableProcessor.class); private final GrIntroduceContext myContext; private final GroovyIntroduceVariableSettings mySettings; + private final boolean myProcessUsages; private final PsiElement[] myOccurrences; private GrExpression myExpression; - private final GrIntroduceVariableHandler myHandler; public GrIntroduceLocalVariableProcessor(@NotNull GrIntroduceContext context, @NotNull GroovyIntroduceVariableSettings settings, @NotNull PsiElement[] occurrences, @NotNull GrExpression expression, - @NotNull GrIntroduceVariableHandler handler) { + boolean processUsages) { myContext = context; mySettings = settings; + myProcessUsages = processUsages; myOccurrences = settings.replaceAllOccurrences() ? occurrences : new PsiElement[]{expression}; myExpression = expression; - myHandler = handler; } @NotNull @@ -75,7 +75,7 @@ public class GrIntroduceLocalVariableProcessor { preprocessOccurrences(); int expressionIndex = ArrayUtilRt.find(myOccurrences, myExpression); - final PsiElement[] replaced = processOccurrences(); + final PsiElement[] replaced = myProcessUsages ? processOccurrences() : myOccurrences; PsiElement replacedExpression = replaced[expressionIndex]; GrStatement anchor = getAnchor(replaced); @@ -84,9 +84,7 @@ public class GrIntroduceLocalVariableProcessor { return insertVariableDefinition(declaration, anchor, replacedExpression); } - private void refreshPositionMarker(PsiElement e) { - myHandler.refreshPositionMarker(myContext.getEditor().getDocument().createRangeMarker(e.getTextRange())); - } + protected abstract void refreshPositionMarker(PsiElement e); private static boolean isControlStatementBranch(GrStatement statement) { return statement.getParent() instanceof GrLoopStatement && statement == ((GrLoopStatement)statement.getParent()).getBody() || diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index cd2d27b5bdbc..6f4c0ccca064 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -13,24 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.jetbrains.plugins.groovy.refactoring.introduce.variable; -import com.intellij.openapi.actionSystem.Shortcut; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.keymap.Keymap; -import com.intellij.openapi.keymap.KeymapManager; -import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.util.Pass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiType; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; -import com.intellij.refactoring.util.CanonicalTypes; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GrControlFlowOwner; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; @@ -46,14 +38,13 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceHandlerBase; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrNewIntroduceHandlerBase; import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; -import java.util.List; - /** - * @author ilyas + * Created by Max Medvedev on 10/29/13 */ -public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase { +public class GrIntroduceVariableHandler extends GrNewIntroduceHandlerBase { public static final String DUMMY_NAME = "________________xxx_________________"; protected static final String REFACTORING_NAME = GroovyRefactoringBundle.message("introduce.variable.title"); private RangeMarker myPosition = null; @@ -130,7 +121,7 @@ public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase occurrenceMarkers, - RangeMarker varRangeMarker, RangeMarker expressionRangeMarker, - RangeMarker stringPartRangeMarker) { - context.getEditor().getCaretModel().moveToOffset(var.getTextOffset()); - GrInplaceVariableIntroducer introducer = new GrInplaceVariableIntroducer(var, context.getEditor(), context.getProject(), REFACTORING_NAME, occurrenceMarkers, var); - introducer.setAdvertisementText(getAdvertisementText(var.getDeclaredType() != null)); - - return introducer; - } - - @Nullable - private static String getAdvertisementText(final boolean hasTypeSuggestion) { - final Keymap keymap = KeymapManager.getInstance().getActiveKeymap(); - if (hasTypeSuggestion) { - final Shortcut[] shortcuts = keymap.getShortcuts("PreviousTemplateVariable"); - if (shortcuts.length > 0) { - return "Press " + KeymapUtil.getShortcutText(shortcuts[0]) + " to change type"; + protected GrInplaceVariableIntroducer getIntroducer(@NotNull GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + return new GrInplaceVariableIntroducer(getRefactoringName(), choice, context) { + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GroovyIntroduceVariableSettings settings, boolean processUsages) { + final GrVariableDeclaration varDecl = generateDeclaration(context, settings); + return processExpression(context, settings, varDecl, processUsages); } - } - return null; + }; } @Override - protected GroovyIntroduceVariableSettings getSettingsForInplace(final GrIntroduceContext context, final OccurrencesChooser.ReplaceChoice choice) { - return new GroovyIntroduceVariableSettings() { - private final CanonicalTypes.Type myType; - private final String myName; - - - { - GrExpression expression = context.getExpression(); - StringPartInfo stringPart = context.getStringPart(); - GrVariable var = context.getVar(); - PsiType type = expression != null ? expression.getType() : - var != null ? var.getType() : - stringPart != null ? stringPart.getLiteral().getType() : - null; - myType = type != null ?CanonicalTypes.createTypeWrapper(type) : null; - - myName = new GrVariableNameSuggester(context, new GroovyVariableValidator(context)).suggestNames().iterator().next(); - } - - - @Override - public boolean isDeclareFinal() { - return false; - } - - @Nullable - @Override - public String getName() { - return myName; - } - - @Override - public boolean replaceAllOccurrences() { - return choice == OccurrencesChooser.ReplaceChoice.ALL; - } - - @Nullable - @Override - public PsiType getSelectedType() { - return myType != null ? myType.getType(context.getPlace(), context.getPlace().getManager()) : null; - } - }; + protected GroovyIntroduceVariableSettings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + return null; } @Override @@ -231,24 +167,29 @@ public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase Date: Thu, 31 Oct 2013 16:09:47 +0400 Subject: [PATCH 26/30] canceling introduce field --- .../GrAbstractInplaceIntroducer.java | 17 +- .../GrNewIntroduceFieldHandlerBase.java | 81 +++++++ .../introduce/GrNewIntroduceHandlerBase.java | 2 - .../field/GrInplaceFieldIntroducer.java | 220 +++++++++--------- .../field/GrIntroduceFieldHandler.java | 133 ++--------- .../field/GrIntroduceFieldProcessor.java | 25 +- .../variable/GrInplaceVariableIntroducer.java | 14 +- .../variable/GrIntroduceVariableHandler.java | 5 - 8 files changed, 247 insertions(+), 250 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java index c8c52d3f60d4..42aba9b55d30 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -21,10 +21,7 @@ import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.SmartPointerManager; -import com.intellij.psi.SmartPsiElementPointer; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer; @@ -53,6 +50,7 @@ import java.util.List; */ public abstract class GrAbstractInplaceIntroducer extends AbstractInplaceIntroducer { + private SmartTypePointer myTypePointer; private OccurrencesChooser.ReplaceChoice myReplaceChoice; private RangeMarker myVarMarker; @@ -243,4 +241,15 @@ public abstract class GrAbstractInplaceIntroducer extends GrNewIntroduceHandlerBase { + @NotNull + @Override + protected PsiClass[] findPossibleScopes(GrExpression expression, + GrVariable variable, + StringPartInfo partInfo, + Editor editor) { + PsiElement place = getCurrentPlace(expression, variable, partInfo); + PsiClass aClass = PsiUtil.getContextClass(place); + if (aClass instanceof GroovyScriptClass) { + return new PsiClass[]{aClass}; + } + else { + List result = ContainerUtil.newArrayList(aClass); + while (aClass != null) { + aClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class); + ContainerUtil.addIfNotNull(result, aClass); + } + return result.toArray(new PsiClass[result.size()]); + } + } + + @Override + protected void showScopeChooser(PsiClass[] scopes, final Pass callback, Editor editor) { + PsiElementProcessor processor = new PsiElementProcessor() { + @Override + public boolean execute(@NotNull PsiClass element) { + callback.pass(element); + return false; + } + }; + + NavigationUtil.getPsiElementPopup(scopes, new PsiClassListCellRenderer(), "Choose class to introduce field", processor).showInBestPositionFor(editor); + } + + @NotNull + @Override + protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { + if (scope instanceof GroovyScriptClass) { + scope = scope.getContainingFile(); + } + return super.findOccurrences(expression, scope); + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java index 3be3b0ac7740..fc05ece3b41f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java @@ -145,8 +145,6 @@ public abstract class GrNewIntroduceHandlerBase getIntroducer(@NotNull GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); - protected abstract Settings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); - public static Map> fillChoice(GrIntroduceContext context) { HashMap> map = ContainerUtil.newLinkedHashMap(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java index c37d13ddd471..2f924f9e947a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java @@ -17,46 +17,36 @@ package org.jetbrains.plugins.groovy.refactoring.introduce.field; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.introduce.inplace.KeyboardComboSwitcher; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import com.intellij.ui.NonFocusableCheckBox; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrFinalListener; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContextImpl; +import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EnumSet; -import java.util.LinkedHashSet; -import java.util.List; /** * @author Max Medvedev */ -public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { +public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer { private final GrInplaceIntroduceFieldPanel myPanel; - private final GrIntroduceContext myContext; - private final RangeMarker myExpressionRangeMarker; - private final RangeMarker myStringPartRangeMarker; - private final GrExpression myInitializer; private final GrFinalListener finalListener; - private final boolean myReplaceAll; + private String[] mySuggestedNames; + private boolean myIsStatic; @Nullable @Override @@ -64,93 +54,91 @@ public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { return getVariable().getContainingFile(); } - public GrInplaceFieldIntroducer(GrVariable var, - GrIntroduceContext context, - List occurrences, - boolean replaceAll, - @Nullable RangeMarker expressionRangeMarker, - @Nullable RangeMarker stringPartRangeMarker, - GrExpression initializer) { - super(var, context.getEditor(), context.getProject(), IntroduceFieldHandler.REFACTORING_NAME, occurrences, context.getPlace()); + public GrInplaceFieldIntroducer(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + super(IntroduceFieldHandler.REFACTORING_NAME, choice, context); - myContext = context; - myReplaceAll = replaceAll; - myExpressionRangeMarker = expressionRangeMarker; - myStringPartRangeMarker = stringPartRangeMarker; - myInitializer = initializer; - - myPanel = new GrInplaceIntroduceFieldPanel(context.getProject(), - GrIntroduceFieldHandler.getApplicableInitPlaces(context, replaceAll)); + myPanel = new GrInplaceIntroduceFieldPanel(context.getProject(), GrIntroduceFieldHandler.getApplicableInitPlaces(context, choice == OccurrencesChooser.ReplaceChoice.ALL)); finalListener = new GrFinalListener(myEditor); + + mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(context.getExpression(), new GroovyInplaceFieldValidator(getContext()), false); + } + + @Nullable + @Override + protected GrIntroduceFieldSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, + @NotNull final OccurrencesChooser.ReplaceChoice choice, + String[] names) { + return new GrIntroduceFieldSettings() { + @Override + public boolean declareFinal() { + return false; + } + + @Override + public Init initializeIn() { + return Init.FIELD_DECLARATION; + } + + @Override + public String getVisibilityModifier() { + return PsiModifier.PRIVATE; + } + + @Override + public boolean isStatic() { + boolean hasInstanceInScope = true; + PsiClass clazz = (PsiClass)context.getScope(); + if (replaceAllOccurrences()) { + for (PsiElement occurrence : context.getOccurrences()) { + if (!PsiUtil.hasEnclosingInstanceInScope(clazz, occurrence, false)) { + hasInstanceInScope = false; + break; + } + } + } + else if (context.getExpression() != null) { + hasInstanceInScope = PsiUtil.hasEnclosingInstanceInScope(clazz, context.getExpression(), false); + } + else if (context.getStringPart() != null) { + hasInstanceInScope = PsiUtil.hasEnclosingInstanceInScope(clazz, context.getStringPart().getLiteral(), false); + } + + return !hasInstanceInScope; + } + + @Override + public boolean removeLocalVar() { + return context.getVar() != null; + } + + @Nullable + @Override + public String getName() { + return new GrFieldNameSuggester(context, new GroovyInplaceFieldValidator(context), false).suggestNames().iterator().next(); + } + + @Override + public boolean replaceAllOccurrences() { + return context.getVar() != null || choice == OccurrencesChooser.ReplaceChoice.ALL; + } + + @Nullable + @Override + public PsiType getSelectedType() { + GrExpression expression = context.getExpression(); + GrVariable var = context.getVar(); + StringPartInfo stringPart = context.getStringPart(); + return var != null ? var.getDeclaredType() : + expression != null ? expression.getType() : + stringPart != null ? stringPart.getLiteral().getType() : + null; + } + }; } @Override - protected void moveOffsetAfter(boolean success) { - if (success) { - final GrVariable field = getVariable(); - assert field != null; - GrIntroduceFieldProcessor processor = new GrIntroduceFieldProcessor(generateContext(), generateSettings(), false) { - @NotNull - @Override - protected GrExpression getInitializer() { - return myInitializer; - } - - @NotNull - @Override - protected GrVariableDeclaration insertField(@NotNull PsiClass targetClass, @NotNull GrVariableDeclaration declaration) { - return (GrVariableDeclaration)field.getParent(); - } - }; - processor.run(); - } - super.moveOffsetAfter(success); - } - - private GrIntroduceContext generateContext() { - final List occurrenceMarkers = getOccurrenceMarkers(); - - List occurrences = ContainerUtil.newArrayList(); - for (RangeMarker marker : occurrenceMarkers) { - ContainerUtil.addIfNotNull(occurrences, findExpression(marker)); - } - - GrExpression expr = null; - if (myExpressionRangeMarker != null) expr = findExpression(myExpressionRangeMarker); - if (myStringPartRangeMarker != null) { - expr = findExpressionFromStringPartMarker(myStringPartRangeMarker); - occurrences.add(expr); - } - - return new GrIntroduceContextImpl(myContext.getProject(), myContext.getEditor(), expr, null, null, PsiUtilCore.toPsiElementArray( - occurrences), myContext.getScope()); - } - - @Nullable - private GrExpression findExpressionFromStringPartMarker(RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - GrBinaryExpression binary = PsiTreeUtil.getParentOfType(leaf, GrBinaryExpression.class); - if (binary != null) { - return binary.getRightOperand(); - } - return null; - } - - @Nullable - private GrExpression findExpression(@NotNull RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - if (leaf != null && leaf.getParent() instanceof GrReferenceExpression) { - return (GrExpression)leaf.getParent(); - } - return null; - } - - private GrIntroduceFieldSettings generateSettings() { + protected GrIntroduceFieldSettings getSettings() { return new GrIntroduceFieldSettings() { @Override public boolean declareFinal() { @@ -169,7 +157,7 @@ public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { @Override public boolean isStatic() { - return getVariable().hasModifierProperty(PsiModifier.STATIC); + return myIsStatic; } @Override @@ -180,34 +168,50 @@ public class GrInplaceFieldIntroducer extends GrInplaceIntroducer { @Nullable @Override public String getName() { - return getVariable().getName(); + return getInputName(); } @Override public boolean replaceAllOccurrences() { - return myReplaceAll; + return isReplaceAllOccurrences(); } @Nullable @Override public PsiType getSelectedType() { - return getVariable().getDeclaredType(); + return GrInplaceFieldIntroducer.this.getSelectedType(); } }; } + @Override + protected String getActionName() { + return IntroduceFieldHandler.REFACTORING_NAME; + } + + @Override + protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) { + return mySuggestedNames; + } + + @Override + protected void saveSettings(@NotNull GrVariable variable) { + + } + + @Override + protected void restoreState(GrVariable psiField) { + myIsStatic = psiField.hasModifierProperty(PsiModifier.STATIC); + + super.restoreState(psiField); + } + @Nullable @Override protected JComponent getComponent() { return myPanel.getRootPane(); } - @Override - public LinkedHashSet suggestNames(GrIntroduceContext context) { - return ContainerUtil.newLinkedHashSet( - GroovyNameSuggestionUtil.suggestVariableNames(myInitializer, new GroovyInplaceFieldValidator(context), false)); - } - public class GrInplaceIntroduceFieldPanel { private final Project myProject; private JPanel myRootPane; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index dad877d0da96..1279f74003ce 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -16,25 +16,21 @@ package org.jetbrains.plugins.groovy.refactoring.introduce.field; import com.intellij.codeInsight.TestFrameworks; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.editor.RangeMarker; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiType; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember; +import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; @@ -47,7 +43,7 @@ import java.util.List; /** * @author Maxim.Medvedev */ -public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase { +public class GrIntroduceFieldHandler extends GrNewIntroduceFieldHandlerBase { @NotNull @Override @@ -100,45 +96,32 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase occurrenceMarkers, - @Nullable RangeMarker varRangeMarker, - @Nullable RangeMarker expressionRangeMarker, - @Nullable RangeMarker stringPartRangeMarker) { - if (varRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(var.getNameIdentifierGroovy().getTextRange().getStartOffset()); - } - else if (expressionRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(expressionRangeMarker.getStartOffset()); - } - else if (stringPartRangeMarker != null) { - int offset = stringPartRangeMarker.getStartOffset(); - PsiElement at = var.getContainingFile().findElementAt(offset); - GrExpression ref = PsiTreeUtil.getParentOfType(at, GrBinaryExpression.class).getRightOperand(); - context.getEditor().getCaretModel().moveToOffset(ref.getTextRange().getStartOffset()); - } - GrExpression initializer = - GroovyPsiElementFactory.getInstance(context.getProject()).createExpressionFromText(var.getInitializerGroovy().getText()); - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - var.setInitializerGroovy(null); - } - }); - return new GrInplaceFieldIntroducer(var, context, occurrenceMarkers, settings.replaceAllOccurrences(), expressionRangeMarker, - stringPartRangeMarker, initializer); + @Override + protected GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice) { + return new GrInplaceFieldIntroducer(context, choice) { + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceFieldSettings settings, boolean processUsages) { + if (processUsages) { + return GrIntroduceFieldHandler.this.runRefactoring(context, settings); + } + else { + return new GrIntroduceFieldProcessor(context, settings).insertField( (PsiClass)context.getScope()).getVariables()[0]; + } + } + }; } static EnumSet getApplicableInitPlaces(GrIntroduceContext context, boolean replaceAll) { - EnumSet result = EnumSet.of(GrIntroduceFieldSettings.Init.FIELD_DECLARATION, - GrIntroduceFieldSettings.Init.CONSTRUCTOR); + EnumSet result = EnumSet.of(GrIntroduceFieldSettings.Init.FIELD_DECLARATION); + + if (!(context.getScope() instanceof GroovyScriptClass || context.getScope() instanceof GroovyFileBase)) { + result.add(GrIntroduceFieldSettings.Init.CONSTRUCTOR); + } PsiElement scope = context.getScope(); @@ -156,76 +139,6 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase) { - org.jetbrains.plugins.groovy.codeStyle.GrReferenceAdjuster.shortenReference((GrQualifiedReference)replaced); + GrReferenceAdjuster.shortenReference((GrQualifiedReference)replaced); } if (isOriginal) { updateCaretPosition(replaced); @@ -326,13 +329,13 @@ public class GrIntroduceFieldProcessor { return GroovyPsiElementFactory.getInstance(place.getProject()).createReferenceExpressionFromText(refText, place); } - private GrVariableDeclaration createField() { + private GrVariableDeclaration createField(PsiClass targetClass) { final String name = settings.getName(); final PsiType type = settings.getSelectedType(); final String modifier = settings.getVisibilityModifier(); List modifiers = new ArrayList(); - if (context.getScope() instanceof GroovyScriptClass) { + if (targetClass instanceof GroovyScriptClass) { modifiers.add("@" + GroovyCommonClassNames.GROOVY_TRANSFORM_FIELD); } if (settings.isStatic()) modifiers.add(PsiModifier.STATIC); @@ -341,7 +344,7 @@ public class GrIntroduceFieldProcessor { final String[] arr_modifiers = ArrayUtil.toStringArray(modifiers); final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(context.getProject()); - if (context.getScope() instanceof GroovyScriptClass) { + if (targetClass instanceof GroovyScriptClass) { return factory.createVariableDeclaration(arr_modifiers, ((GrExpression)null), type, name); } else { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java index d7d3fb7c33cc..a8732988a2c8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrInplaceVariableIntroducer.java @@ -22,7 +22,9 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; -import com.intellij.psi.*; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiType; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.ui.NonFocusableCheckBox; @@ -52,7 +54,6 @@ import java.awt.event.ActionListener; */ public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntroducer { private JCheckBox myCanBeFinalCb; - private SmartTypePointer myTypePointer; public GrInplaceVariableIntroducer(String title, OccurrencesChooser.ReplaceChoice replaceChoice, @@ -192,7 +193,7 @@ public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntro @Nullable @Override public PsiType getSelectedType() { - return myTypePointer != null ? myTypePointer.getType() : null; + return GrInplaceVariableIntroducer.this.getSelectedType(); } }; } @@ -206,11 +207,4 @@ public abstract class GrInplaceVariableIntroducer extends GrAbstractInplaceIntro protected int getCaretOffset() { return getVariable().getNameIdentifierGroovy().getTextRange().getEndOffset(); } - - @Override - protected void restoreState(GrVariable psiField) { - PsiType declaredType = getVariable().getDeclaredType(); - myTypePointer = declaredType != null ? SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(declaredType) : null; - super.restoreState(psiField); - } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index 6f4c0ccca064..463db253b406 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -141,11 +141,6 @@ public class GrIntroduceVariableHandler extends GrNewIntroduceHandlerBase callback, Editor editor) { //todo do nothing right now From 0f4872fcf430ff46420487cef2cca73adc4b5cc2 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 31 Oct 2013 17:26:41 +0400 Subject: [PATCH 27/30] canceling introduce constant --- .../introduce/GrIntroduceHandlerBase.java | 89 +- .../GrNewIntroduceFieldHandlerBase.java | 81 -- .../introduce/GrNewIntroduceHandlerBase.java | 763 ------------------ .../constant/GrInplaceConstantIntroducer.java | 178 ++-- .../GrInplaceIntroduceConstantPanel.form | 2 + .../constant/GrIntroduceConstantHandler.java | 68 +- .../GrIntroduceConstantProcessor.java | 6 +- .../field/GrInplaceFieldIntroducer.java | 4 +- .../field/GrIntroduceFieldHandler.java | 2 +- .../variable/GrIntroduceVariableHandler.java | 3 +- 10 files changed, 119 insertions(+), 1077 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java index ec3aefa1c717..6e147414b669 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java @@ -21,7 +21,6 @@ import com.intellij.lang.LanguageRefactoringSupport; import com.intellij.lang.refactoring.RefactoringSupportProvider; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -32,7 +31,6 @@ import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pass; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.wm.WindowManager; @@ -77,7 +75,7 @@ import java.util.*; import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipParentheses; /** - * @author Maxim.Medvedev + * Created by Max Medvedev on 10/29/13 */ public abstract class GrIntroduceHandlerBase implements RefactoringActionHandler { private static final Logger LOG = Logger.getInstance(GrIntroduceHandlerBase.class); @@ -144,15 +142,8 @@ public abstract class GrIntroduceHandlerBase occurrenceMarkers, - RangeMarker varRangeMarker, - @Nullable RangeMarker expressionRangeMarker, - @Nullable RangeMarker stringPartRangeMarker); - - protected abstract Settings getSettingsForInplace(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice); + protected abstract GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice); public static Map> fillChoice(GrIntroduceContext context) { HashMap> map = ContainerUtil.newLinkedHashMap(); @@ -296,7 +287,8 @@ public abstract class GrIntroduceHandlerBase callback, Editor editor); public GrIntroduceContext getContext(@NotNull Project project, - @NotNull Editor editor, - @Nullable GrExpression expression, - @Nullable GrVariable variable, - @Nullable StringPartInfo stringPart, - @NotNull PsiElement scope) { + @NotNull Editor editor, + @Nullable GrExpression expression, + @Nullable GrVariable variable, + @Nullable StringPartInfo stringPart, + @NotNull PsiElement scope) { if (variable != null) { final List list = Collections.synchronizedList(new ArrayList()); ReferencesSearch.search(variable, new LocalSearchScope(scope)).forEach(new Processor() { @@ -348,48 +340,6 @@ public abstract class GrIntroduceHandlerBase callback = new Pass() { - @Override - public void pass(final OccurrencesChooser.ReplaceChoice choice) { - - final Settings settings = isInplace ? getSettingsForInplace(context, choice) : showDialog(context); - if (settings == null) return; - - CommandProcessor.getInstance().executeCommand(project, new Runnable() { - public void run() { - List occurrences = ContainerUtil.newArrayList(); - Document document = editor.getDocument(); - for (PsiElement element : context.getOccurrences()) { - occurrences.add(createRange(document, element)); - } - RangeMarker expressionRangeMarker = createRange(document, context.getExpression()); - RangeMarker stringPartRangeMarker = createRange(document, context.getStringPart()); - RangeMarker varRangeMarker = createRange(document, context.getVar()); - - SmartPsiElementPointer pointer = - ApplicationManager.getApplication().runWriteAction(new Computable>() { - @Override - public SmartPsiElementPointer compute() { - GrVariable var = runRefactoring(context, settings); - return var != null - ? SmartPointerManager.getInstance(context.getProject()).createSmartPsiElementPointer(var) - : null; - } - }); - GrVariable var = pointer != null ? pointer.getElement() : null; - - if (isInplace && var != null) { - GrInplaceIntroducer introducer = getIntroducer(var, context, settings, occurrences, varRangeMarker, expressionRangeMarker, stringPartRangeMarker); - LinkedHashSet suggestions = introducer.suggestNames(context); - PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); - introducer.performInplaceRefactoring(suggestions); - } - } - }, getRefactoringName(), getRefactoringName()); - } - }; - if (isInplace(context.getEditor(), context.getPlace())) { Map> occurrencesMap = fillChoice(context); new OccurrencesChooser(editor) { @@ -405,17 +355,28 @@ public abstract class GrIntroduceHandlerBase() { + @Override + public void pass(final OccurrencesChooser.ReplaceChoice choice) { + getIntroducer(context, choice).startInplaceIntroduceTemplate(); + } + }, occurrencesMap); } else { - callback.pass(null); + final Settings settings = showDialog(context); + if (settings == null) return false; + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + runRefactoring(context, settings); + } + }); } return true; } catch (GrRefactoringError e) { - CommonRefactoringUtil - .showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); + CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); return false; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java deleted file mode 100644 index 7ac5353d99f1..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceFieldHandlerBase.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.refactoring.introduce; - -import com.intellij.codeInsight.navigation.NavigationUtil; -import com.intellij.ide.util.PsiClassListCellRenderer; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.util.Pass; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.search.PsiElementProcessor; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; - -import java.util.List; - -/** - * Created by Max Medvedev on 10/31/13 - */ -public abstract class GrNewIntroduceFieldHandlerBase extends GrNewIntroduceHandlerBase { - @NotNull - @Override - protected PsiClass[] findPossibleScopes(GrExpression expression, - GrVariable variable, - StringPartInfo partInfo, - Editor editor) { - PsiElement place = getCurrentPlace(expression, variable, partInfo); - PsiClass aClass = PsiUtil.getContextClass(place); - if (aClass instanceof GroovyScriptClass) { - return new PsiClass[]{aClass}; - } - else { - List result = ContainerUtil.newArrayList(aClass); - while (aClass != null) { - aClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class); - ContainerUtil.addIfNotNull(result, aClass); - } - return result.toArray(new PsiClass[result.size()]); - } - } - - @Override - protected void showScopeChooser(PsiClass[] scopes, final Pass callback, Editor editor) { - PsiElementProcessor processor = new PsiElementProcessor() { - @Override - public boolean execute(@NotNull PsiClass element) { - callback.pass(element); - return false; - } - }; - - NavigationUtil.getPsiElementPopup(scopes, new PsiClassListCellRenderer(), "Choose class to introduce field", processor).showInBestPositionFor(editor); - } - - @NotNull - @Override - protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { - if (scope instanceof GroovyScriptClass) { - scope = scope.getContainingFile(); - } - return super.findOccurrences(expression, scope); - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java deleted file mode 100644 index fc05ece3b41f..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrNewIntroduceHandlerBase.java +++ /dev/null @@ -1,763 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.refactoring.introduce; - -import com.intellij.codeInsight.highlighting.HighlightManager; -import com.intellij.diagnostic.LogMessageEx; -import com.intellij.lang.LanguageRefactoringSupport; -import com.intellij.lang.refactoring.RefactoringSupportProvider; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.editor.SelectionModel; -import com.intellij.openapi.editor.colors.EditorColors; -import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.markup.RangeHighlighter; -import com.intellij.openapi.editor.markup.TextAttributes; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Pass; -import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.wm.WindowManager; -import com.intellij.psi.*; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.refactoring.IntroduceTargetChooser; -import com.intellij.refactoring.RefactoringActionHandler; -import com.intellij.refactoring.RefactoringBundle; -import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; -import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.util.Function; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.*; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseLabel; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrStringInjection; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; -import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil; -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; -import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; -import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; -import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; -import org.jetbrains.plugins.groovy.refactoring.NameValidator; - -import java.util.*; - -import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.skipParentheses; - -/** - * Created by Max Medvedev on 10/29/13 - */ -public abstract class GrNewIntroduceHandlerBase implements RefactoringActionHandler { - private static final Logger LOG = Logger.getInstance(GrIntroduceHandlerBase.class); - - public static final Function GR_EXPRESSION_RENDERER = new Function() { - @Override - public String fun(@NotNull GrExpression expr) { - return expr.getText(); - } - }; - - public static GrExpression insertExplicitCastIfNeeded(GrVariable variable, GrExpression initializer) { - PsiType ltype = findLValueType(initializer); - PsiType rtype = initializer.getType(); - - GrExpression rawExpr = (GrExpression)skipParentheses(initializer, false); - - if (ltype == null || TypesUtil.isAssignableWithoutConversions(ltype, rtype, initializer) || !TypesUtil.isAssignable(ltype, rtype, initializer)) { - return rawExpr; - } - else { // implicit coercion should be replaced with explicit cast - GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(variable.getProject()); - GrSafeCastExpression cast = - (GrSafeCastExpression)factory.createExpressionFromText("a as B"); - cast.getOperand().replaceWithExpression(rawExpr, false); - cast.getCastTypeElement().replace(factory.createTypeElement(ltype)); - return cast; - } - } - - @Nullable - private static PsiType findLValueType(GrExpression initializer) { - if (initializer.getParent() instanceof GrAssignmentExpression && ((GrAssignmentExpression)initializer.getParent()).getRValue() == initializer) { - return ((GrAssignmentExpression)initializer.getParent()).getLValue().getNominalType(); - } - else if (initializer.getParent() instanceof GrVariable) { - return ((GrVariable)initializer.getParent()).getDeclaredType(); - } - else { - return null; - } - } - - @NotNull - protected abstract String getRefactoringName(); - - @NotNull - protected abstract String getHelpID(); - - @NotNull - protected abstract Scope[] findPossibleScopes(GrExpression expression, GrVariable variable, StringPartInfo stringPart, Editor editor); - - protected abstract void checkExpression(@NotNull GrExpression selectedExpr) throws GrRefactoringError; - - protected abstract void checkVariable(@NotNull GrVariable variable) throws GrRefactoringError; - - protected abstract void checkStringLiteral(@NotNull StringPartInfo info) throws GrRefactoringError; - - protected abstract void checkOccurrences(@NotNull PsiElement[] occurrences); - - @NotNull - protected abstract GrIntroduceDialog getDialog(@NotNull GrIntroduceContext context); - - @Nullable - public abstract GrVariable runRefactoring(@NotNull GrIntroduceContext context, @NotNull Settings settings); - - protected abstract GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, - OccurrencesChooser.ReplaceChoice choice); - - public static Map> fillChoice(GrIntroduceContext context) { - HashMap> map = ContainerUtil.newLinkedHashMap(); - - if (context.getExpression() != null) { - map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getExpression())); - } - else if (context.getStringPart() != null) { - map.put(OccurrencesChooser.ReplaceChoice.NO, Collections.singletonList(context.getStringPart())); - } - - PsiElement[] occurrences = context.getOccurrences(); - if (occurrences.length > 1) { - map.put(OccurrencesChooser.ReplaceChoice.ALL, Arrays.asList(occurrences)); - } - return map; - } - - @NotNull - public static List collectExpressions(final PsiFile file, final Editor editor, final int offset, boolean acceptVoidCalls) { - int correctedOffset = correctOffset(editor, offset); - final PsiElement elementAtCaret = file.findElementAt(correctedOffset); - final List expressions = new ArrayList(); - - for (GrExpression expression = PsiTreeUtil.getParentOfType(elementAtCaret, GrExpression.class); - expression != null; - expression = PsiTreeUtil.getParentOfType(expression, GrExpression.class)) { - if (expressions.contains(expression)) continue; - if (expression instanceof GrParenthesizedExpression && !expressions.contains(((GrParenthesizedExpression)expression).getOperand())) { - expressions.add(((GrParenthesizedExpression)expression).getOperand()); - } - if (expressionIsIncorrect(expression, acceptVoidCalls)) continue; - - expressions.add(expression); - } - return expressions; - } - - public static boolean expressionIsIncorrect(@Nullable GrExpression expression, boolean acceptVoidCalls) { - if (expression instanceof GrParenthesizedExpression) return true; - if (PsiUtil.isSuperReference(expression)) return true; - if (expression instanceof GrAssignmentExpression) return true; - if (expression instanceof GrReferenceExpression && expression.getParent() instanceof GrCall) { - final GroovyResolveResult resolveResult = ((GrReferenceExpression)expression).advancedResolve(); - final PsiElement resolved = resolveResult.getElement(); - return resolved instanceof PsiMethod && !resolveResult.isInvokedOnProperty() || resolved instanceof PsiClass; - } - - if (expression instanceof GrClosableBlock && expression.getParent() instanceof GrStringInjection) return true; - if (!acceptVoidCalls && expression instanceof GrMethodCall && PsiType.VOID == expression.getType()) return true; - - return false; - } - - public static int correctOffset(Editor editor, int offset) { - Document document = editor.getDocument(); - CharSequence text = document.getCharsSequence(); - int correctedOffset = offset; - int textLength = document.getTextLength(); - if (offset >= textLength) { - correctedOffset = textLength - 1; - } - else if (!Character.isJavaIdentifierPart(text.charAt(offset))) { - correctedOffset--; - } - - if (correctedOffset < 0) { - correctedOffset = offset; - } - else { - char c = text.charAt(correctedOffset); - if (c == ';' && correctedOffset != 0) {//initially caret on the end of line - correctedOffset--; - } - else if (!Character.isJavaIdentifierPart(c) && c != ')' && c != ']' && c != '}' && c != '\'' && c != '"' && c != '/') { - correctedOffset = offset; - } - } - return correctedOffset; - } - - @Nullable - public static GrVariable findVariableAtCaret(final PsiFile file, final Editor editor, final int offset) { - final int correctOffset = correctOffset(editor, offset); - final PsiElement elementAtCaret = file.findElementAt(correctOffset); - final GrVariable variable = PsiTreeUtil.getParentOfType(elementAtCaret, GrVariable.class); - if (variable != null && variable.getNameIdentifierGroovy().getTextRange().contains(correctOffset)) return variable; - return null; - } - - public void invoke(final @NotNull Project project, final Editor editor, final PsiFile file, final @Nullable DataContext dataContext) { - final SelectionModel selectionModel = editor.getSelectionModel(); - if (!selectionModel.hasSelection()) { - final int offset = editor.getCaretModel().getOffset(); - - final List expressions = collectExpressions(file, editor, offset, false); - if (expressions.isEmpty()) { - final GrVariable variable = findVariableAtCaret(file, editor, offset); - if (variable == null || variable instanceof GrField || variable instanceof GrParameter) { - selectionModel.selectLineAtCaret(); - } - else { - final TextRange textRange = variable.getTextRange(); - selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); - } - } - else if (expressions.size() == 1) { - final TextRange textRange = expressions.get(0).getTextRange(); - selectionModel.setSelection(textRange.getStartOffset(), textRange.getEndOffset()); - } - else { - IntroduceTargetChooser.showChooser(editor, expressions, new Pass() { - public void pass(final GrExpression selectedValue) { - invoke(project, editor, file, selectedValue.getTextRange().getStartOffset(), selectedValue.getTextRange().getEndOffset()); - } - }, GR_EXPRESSION_RENDERER); - return; - } - } - invoke(project, editor, file, selectionModel.getSelectionStart(), selectionModel.getSelectionEnd()); - } - - @Override - public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) { - // Does nothing - } - - public void getContextAndInvoke(@NotNull final Project project, - @NotNull final Editor editor, - @Nullable final GrExpression expression, - @Nullable final GrVariable variable, - @Nullable final StringPartInfo stringPart) { - final Scope[] scopes = findPossibleScopes(expression, variable, stringPart, editor); - - Pass callback = new Pass() { - @Override - public void pass(Scope scope) { - GrIntroduceContext context = getContext(project, editor, expression, variable, stringPart, scope); - invokeImpl(project, context, editor); - } - }; - - if (scopes.length == 0) { - CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle - .getCannotRefactorMessage(getRefactoringName() + "is not available in current scope"), - getRefactoringName(), getHelpID()); - } - else if (scopes.length == 1) { - callback.pass(scopes[0]); - } - else { - showScopeChooser(scopes, callback, editor); - } - } - - protected abstract void showScopeChooser(Scope[] scopes, Pass callback, Editor editor); - - public GrIntroduceContext getContext(@NotNull Project project, - @NotNull Editor editor, - @Nullable GrExpression expression, - @Nullable GrVariable variable, - @Nullable StringPartInfo stringPart, - @NotNull PsiElement scope) { - if (variable != null) { - final List list = Collections.synchronizedList(new ArrayList()); - ReferencesSearch.search(variable, new LocalSearchScope(scope)).forEach(new Processor() { - @Override - public boolean process(PsiReference psiReference) { - final PsiElement element = psiReference.getElement(); - if (element != null) { - list.add(element); - } - return true; - } - }); - final PsiElement[] occurrences = list.toArray(new PsiElement[list.size()]); - return new GrIntroduceContextImpl(project, editor, variable.getInitializerGroovy(), variable, stringPart, occurrences, scope); - } - else if (expression != null ) { - final PsiElement[] occurrences = findOccurrences(expression, scope); - return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, occurrences, scope); - } - else { - assert stringPart != null; - return new GrIntroduceContextImpl(project, editor, expression, variable, stringPart, new PsiElement[]{stringPart.getLiteral()}, scope); - } - } - - private boolean invokeImpl(final Project project, final GrIntroduceContext context, final Editor editor) { - try { - if (!CommonRefactoringUtil.checkReadOnlyStatus(project, context.getOccurrences())) { - return false; - } - checkOccurrences(context.getOccurrences()); - - - if (isInplace(context.getEditor(), context.getPlace())) { - Map> occurrencesMap = fillChoice(context); - new OccurrencesChooser(editor) { - @Override - protected TextRange getOccurrenceRange(Object occurrence) { - if (occurrence instanceof PsiElement) { - return ((PsiElement)occurrence).getTextRange(); - } - else if (occurrence instanceof StringPartInfo) { - return ((StringPartInfo)occurrence).getRange(); - } - else { - return null; - } - } - }.showChooser(new Pass() { - @Override - public void pass(final OccurrencesChooser.ReplaceChoice choice) { - getIntroducer(context, choice).startInplaceIntroduceTemplate(); - } - }, occurrencesMap); - } - else { - final Settings settings = showDialog(context); - if (settings == null) return false; - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - runRefactoring(context, settings); - } - }); - } - - return true; - } - catch (GrRefactoringError e) { - CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); - return false; - } - } - - @NotNull - protected PsiElement[] findOccurrences(@NotNull GrExpression expression, @NotNull PsiElement scope) { - final PsiElement[] occurrences = GroovyRefactoringUtil.getExpressionOccurrences(skipParentheses(expression, false), scope); - if (occurrences == null || occurrences.length == 0) { - throw new GrRefactoringError(GroovyRefactoringBundle.message("no.occurrences.found")); - } - return occurrences; - } - - private void invoke(@NotNull final Project project, - @NotNull final Editor editor, - @NotNull PsiFile file, - int startOffset, - int endOffset) throws GrRefactoringError { - try { - PsiDocumentManager.getInstance(project).commitAllDocuments(); - if (!(file instanceof GroovyFileBase)) { - throw new GrRefactoringError(GroovyRefactoringBundle.message("only.in.groovy.files")); - } - if (!CommonRefactoringUtil.checkReadOnlyStatus(project, file)) { - throw new GrRefactoringError(RefactoringBundle.message("readonly.occurences.found")); - } - - GrExpression selectedExpr = findExpression(file, startOffset, endOffset); - final GrVariable variable = findVariable(file, startOffset, endOffset); - final StringPartInfo stringPart = StringPartInfo.findStringPart(file, startOffset, endOffset); - if (variable != null) { - checkVariable(variable); - } - else if (selectedExpr != null) { - checkExpression(selectedExpr); - } - else if (stringPart != null) { - checkStringLiteral(stringPart); - } - else { - throw new GrRefactoringError(null); - } - - getContextAndInvoke(project, editor, selectedExpr, variable, stringPart); - } - catch (GrRefactoringError e) { - CommonRefactoringUtil.showErrorHint(project, editor, RefactoringBundle.getCannotRefactorMessage(e.getMessage()), getRefactoringName(), getHelpID()); - } - } - - public static RangeMarker createRange(Document document, StringPartInfo part) { - if (part == null) { - return null; - } - TextRange range = part.getRange().shiftRight(part.getLiteral().getTextRange().getStartOffset()); - return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), true); - - } - - @Nullable - public static RangeMarker createRange(@NotNull Document document, @Nullable PsiElement expression) { - if (expression == null) { - return null; - } - TextRange range = expression.getTextRange(); - return document.createRangeMarker(range.getStartOffset(), range.getEndOffset(), false); - } - - - public static boolean isInplace(@NotNull Editor editor, @NotNull PsiElement place) { - final RefactoringSupportProvider supportProvider = LanguageRefactoringSupport.INSTANCE.forLanguage(place.getLanguage()); - return supportProvider != null && - editor.getSettings().isVariableInplaceRenameEnabled() && - supportProvider.isInplaceIntroduceAvailable(place, place) && - !ApplicationManager.getApplication().isUnitTestMode(); - } - - @Nullable - public static GrVariable findVariable(@NotNull PsiFile file, int startOffset, int endOffset) { - GrVariable var = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariable.class); - if (var == null) { - final GrVariableDeclaration variableDeclaration = - GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrVariableDeclaration.class); - if (variableDeclaration == null) return null; - final GrVariable[] variables = variableDeclaration.getVariables(); - if (variables.length == 1) { - var = variables[0]; - } - } - if (var instanceof GrParameter || var instanceof GrField) { - return null; - } - return var; - } - - @Nullable - public static GrVariable findVariable(@NotNull GrStatement statement) { - if (!(statement instanceof GrVariableDeclaration)) return null; - final GrVariableDeclaration variableDeclaration = (GrVariableDeclaration)statement; - final GrVariable[] variables = variableDeclaration.getVariables(); - - GrVariable var = null; - if (variables.length == 1) { - var = variables[0]; - } - if (var instanceof GrParameter || var instanceof GrField) { - return null; - } - return var; - } - - - @Nullable - public static GrExpression findExpression(PsiFile file, int startOffset, int endOffset) { - GrExpression selectedExpr = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrExpression.class); - return findExpression(selectedExpr); - } - - @Nullable - public static GrExpression findExpression(GrStatement selectedExpr) { - if (!(selectedExpr instanceof GrExpression)) return null; - - GrExpression selected = (GrExpression)selectedExpr; - while (selected instanceof GrParenthesizedExpression) selected = ((GrParenthesizedExpression)selected).getOperand(); - if (selected == null) return null; - PsiType type = selected.getType(); - if (type != null) type = TypeConversionUtil.erasure(type); - - if (PsiType.VOID.equals(type)) { - return null; - } - - return selected; - } - - @Nullable - private Settings showDialog(@NotNull GrIntroduceContext context) { - - // Add occurrences highlighting - ArrayList highlighters = new ArrayList(); - HighlightManager highlightManager = null; - if (context.getEditor() != null) { - highlightManager = HighlightManager.getInstance(context.getProject()); - EditorColorsManager colorsManager = EditorColorsManager.getInstance(); - TextAttributes attributes = colorsManager.getGlobalScheme().getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES); - if (context.getOccurrences().length > 1) { - highlightManager.addOccurrenceHighlights(context.getEditor(), context.getOccurrences(), attributes, true, highlighters); - } - } - - GrIntroduceDialog dialog = getDialog(context); - - dialog.show(); - if (dialog.isOK()) { - if (context.getEditor() != null) { - for (RangeHighlighter highlighter : highlighters) { - highlightManager.removeSegmentHighlighter(context.getEditor(), highlighter); - } - } - return dialog.getSettings(); - } - else { - if (context.getOccurrences().length > 1) { - WindowManager.getInstance().getStatusBar(context.getProject()) - .setInfo(GroovyRefactoringBundle.message("press.escape.to.remove.the.highlighting")); - } - } - return null; - } - - @Nullable - public static PsiElement findAnchor(@NotNull PsiElement[] occurrences, - @NotNull PsiElement container) { - if (occurrences.length == 0) return null; - - PsiElement candidate; - if (occurrences.length == 1) { - candidate = occurrences[0]; - candidate = findContainingStatement(candidate); - } - else { - candidate = occurrences[0]; - while (candidate != null && candidate.getParent() != container) { - candidate = candidate.getParent(); - } - } - - final GrStringInjection injection = PsiTreeUtil.getParentOfType(candidate, GrStringInjection.class); - if (injection != null && !injection.getText().contains("\n")) { - candidate = findContainingStatement(injection); - } - - if (candidate == null) return null; - - if ((container instanceof GrWhileStatement) && - candidate.equals(((GrWhileStatement)container).getCondition())) { - return container; - } - if ((container instanceof GrIfStatement) && - candidate.equals(((GrIfStatement)container).getCondition())) { - return container; - } - if ((container instanceof GrForStatement) && - candidate.equals(((GrForStatement)container).getClause())) { - return container; - } - - while (candidate instanceof GrIfStatement && - candidate.getParent() instanceof GrIfStatement && - ((GrIfStatement)candidate.getParent()).getElseBranch() == candidate) { - candidate = candidate.getParent(); - } - return candidate; - } - - public static void assertStatement(PsiElement anchor, PsiElement[] occurrences, PsiElement scope) { - if (!(anchor instanceof GrStatement)) { - StringBuilder error = new StringBuilder("scope:"); - error.append(scope.getText()); - error.append("\n---------------------------------------\n\n"); - error.append("occurrences: "); - for (PsiElement occurrence : occurrences) { - error.append(occurrence.getText()); - error.append("\n------------------\n"); - } - - LogMessageEx.error(LOG, "cannot find anchor for variable", error.toString()); - } - } - - - @Nullable - private static PsiElement findContainingStatement(@Nullable PsiElement candidate) { - while (candidate != null && !PsiUtil.isExpressionStatement(candidate)) { - candidate = candidate.getParent(); - if (candidate instanceof GrCaseLabel) candidate = candidate.getParent(); - } - return candidate; - } - - public static void deleteLocalVar(@NotNull GrIntroduceContext context) { - final GrVariable resolved = resolveLocalVar(context); - - final PsiElement parent = resolved.getParent(); - if (((GrVariableDeclaration)parent).getVariables().length == 1) { - parent.delete(); - } - else { - GrExpression initializer = resolved.getInitializerGroovy(); - if (initializer != null) initializer.delete(); //don't special check for tuple, but this line is for the tuple case - resolved.delete(); - } - } - - @NotNull - public static GrVariable resolveLocalVar(@NotNull GrIntroduceContext context) { - final GrVariable var = context.getVar(); - if (var != null) { - return var; - } - - final GrReferenceExpression expression = (GrReferenceExpression)context.getExpression(); - assert expression != null; - - final PsiElement resolved = expression.resolve(); - assert resolved instanceof GrVariable; - return (GrVariable)resolved; - } - - public static boolean hasLhs(@NotNull final PsiElement[] occurrences) { - for (PsiElement element : occurrences) { - if (element instanceof GrReferenceExpression) { - if (PsiUtil.isLValue((GroovyPsiElement)element)) return true; - if (ControlFlowUtils.isIncOrDecOperand((GrReferenceExpression)element)) return true; - } - } - return false; - } - - @NotNull - public static PsiElement getCurrentPlace(@Nullable GrExpression expr, - @Nullable GrVariable var, - @Nullable StringPartInfo stringPartInfo) { - if (var != null) return var; - if (expr != null) return expr; - if (stringPartInfo != null) return stringPartInfo.getLiteral(); - - throw new IncorrectOperationException(); - } - - @NotNull - public static GrExpression generateExpressionFromStringPart(final StringPartInfo stringPart, final Project project) { - Data data = new Data(stringPart); - String startQuote = data.getStartQuote(); - TextRange range = data.getRange(); - String literalText = data.getText(); - String endQuote = data.getEndQuote(); - - final String substringLiteral = startQuote + range.substring(literalText) + endQuote; - return GroovyPsiElementFactory.getInstance(project).createExpressionFromText(substringLiteral); - } - - @NotNull - public static GrExpression processLiteral(final String varName, final StringPartInfo stringPart, final Project project) { - Data data = new Data(stringPart); - String startQuote = data.getStartQuote(); - TextRange range = data.getRange(); - String literalText = data.getText(); - String endQuote = data.getEndQuote(); - - String prefix = literalText.substring(0, range.getStartOffset()) ; - String suffix = literalText.substring(range.getEndOffset()); - - StringBuilder buffer = new StringBuilder(); - if (!prefix.equals(startQuote)) { - buffer.append(prefix).append(endQuote).append('+'); - } - buffer.append(varName); - if (!suffix.equals(endQuote)) { - buffer.append('+').append(startQuote).append(suffix); - } - - final GrExpression concatenation = GroovyPsiElementFactory.getInstance(project).createExpressionFromText(buffer); - - final GrExpression concat = stringPart.getLiteral().replaceWithExpression(concatenation, false); - if (concat instanceof GrReferenceExpression) { - return concat; - } - else { - assert concat instanceof GrBinaryExpression; - final GrExpression left = ((GrBinaryExpression)concat).getLeftOperand(); - if (left instanceof GrReferenceExpression) { - return left; - } - else { - assert left instanceof GrBinaryExpression; - final GrExpression right = ((GrBinaryExpression)left).getRightOperand(); - assert right != null; - return right; - } - } - } - - public interface Validator extends NameValidator { - boolean isOK(GrIntroduceDialog dialog); - } - - private static class Data { - private String myText; - private String myStartQuote; - private String myEndQuote; - private TextRange myRange; - - public Data(final StringPartInfo stringPartInfo) { - assert stringPartInfo != null; - - final GrLiteral literal = stringPartInfo.getLiteral(); - - myText = literal.getText(); - - myStartQuote = GrStringUtil.getStartQuote(myText); - myEndQuote = GrStringUtil.getEndQuote(myText); - final TextRange dataRange = new TextRange(myStartQuote.length(), myText.length() - myEndQuote.length()); - - myRange = stringPartInfo.getRange().intersection(dataRange); - } - - public String getText() { - return myText; - } - - public String getStartQuote() { - return myStartQuote; - } - - public String getEndQuote() { - return myEndQuote; - } - - public TextRange getRange() { - return myRange; - } - } -} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java index ff5a264036fb..55d65de67fd5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java @@ -15,127 +15,120 @@ */ package org.jetbrains.plugins.groovy.refactoring.introduce.constant; -import com.intellij.openapi.editor.RangeMarker; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtilCore; -import com.intellij.util.containers.ContainerUtil; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiType; +import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; +import com.intellij.refactoring.introduceField.IntroduceConstantHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.refactoring.GroovyNameSuggestionUtil; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrInplaceIntroducer; +import org.jetbrains.plugins.groovy.refactoring.introduce.GrAbstractInplaceIntroducer; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContextImpl; +import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; import org.jetbrains.plugins.groovy.refactoring.introduce.field.GroovyInplaceFieldValidator; import javax.swing.*; -import java.util.LinkedHashSet; -import java.util.List; /** * Created by Max Medvedev on 8/29/13 */ -public class GrInplaceConstantIntroducer extends GrInplaceIntroducer { +public class GrInplaceConstantIntroducer extends GrAbstractInplaceIntroducer { private final GrInplaceIntroduceConstantPanel myPanel; private final GrIntroduceContext myContext; - private final RangeMarker myExpressionRangeMarker; - private final RangeMarker myStringPartRangeMarker; - private final boolean myReplaceAll; + private String[] mySuggestedNames; - public GrInplaceConstantIntroducer(GrVariable var, - GrIntroduceContext context, - List occurrences, - boolean replaceAllOccurrences, - RangeMarker expressionRangeMarker, - RangeMarker stringPartRangeMarker) { - super(var, context.getEditor(), context.getProject(), GrIntroduceConstantHandler.REFACTORING_NAME, occurrences, context.getPlace()); + public GrInplaceConstantIntroducer(GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { + super(IntroduceConstantHandler.REFACTORING_NAME, choice, context); myContext = context; - myReplaceAll = replaceAllOccurrences; - myExpressionRangeMarker = expressionRangeMarker; - myStringPartRangeMarker = stringPartRangeMarker; myPanel = new GrInplaceIntroduceConstantPanel(); + + mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(context.getExpression(), new GroovyInplaceFieldValidator(context), + true); } @Override - public LinkedHashSet suggestNames(GrIntroduceContext context) { - return ContainerUtil.newLinkedHashSet(GroovyNameSuggestionUtil.suggestVariableNames( - context.getExpression(), - new GroovyInplaceFieldValidator(context), - getVariable().hasModifierProperty(PsiModifier.STATIC)) - ); + protected String getActionName() { + return null; } @Override - protected void moveOffsetAfter(boolean success) { - if (success) { - final GrVariable field = getVariable(); - assert field != null; - GrIntroduceConstantProcessor processor = new GrIntroduceConstantProcessor(generateContext(), generateSettings()) { - @Override - protected GrVariableDeclaration addDeclaration(PsiClass targetClass, GrVariableDeclaration declaration) { - return (GrVariableDeclaration)field.getParent(); - } - - @Override - protected boolean checkErrors(@NotNull PsiClass targetClass) { - return false; - } - }; - processor.run(); - } - super.moveOffsetAfter(success); - } - - private GrIntroduceContext generateContext() { - final List occurrenceMarkers = getOccurrenceMarkers(); - - List occurrences = ContainerUtil.newArrayList(); - for (RangeMarker marker : occurrenceMarkers) { - ContainerUtil.addIfNotNull(occurrences, findExpression(marker)); - } - - GrExpression expr = null; - if (myExpressionRangeMarker != null) expr = findExpression(myExpressionRangeMarker); - if (myStringPartRangeMarker != null) { - expr = findExpressionFromStringPartMarker(myStringPartRangeMarker); - occurrences.add(expr); - } - - return new GrIntroduceContextImpl(myContext.getProject(), myContext.getEditor(), expr, null, null, PsiUtilCore.toPsiElementArray( - occurrences), myContext.getScope()); + protected String[] suggestNames(boolean replaceAll, @Nullable GrVariable variable) { + return mySuggestedNames; } @Nullable - private GrExpression findExpressionFromStringPartMarker(RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - GrBinaryExpression binary = PsiTreeUtil.getParentOfType(leaf, GrBinaryExpression.class); - if (binary != null) { - return binary.getRightOperand(); + @Override + protected JComponent getComponent() { + return myPanel.getRootPane(); + } + + @Override + protected void saveSettings(@NotNull GrVariable variable) { + + } + + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceConstantSettings settings, boolean processUsages) { + if (processUsages) { + return new GrIntroduceConstantProcessor(context, settings).run(); + } + else { + PsiElement scope = context.getScope(); + return new GrIntroduceConstantProcessor(context, settings).addDeclaration(scope instanceof GroovyFileBase ? ((GroovyFileBase)scope).getScriptClass() : (PsiClass)scope).getVariables()[0]; } - return null; } @Nullable - private GrExpression findExpression(@NotNull RangeMarker marker) { - PsiFile file = PsiDocumentManager.getInstance(myContext.getProject()).getPsiFile(marker.getDocument()); - if (file == null) return null; - PsiElement leaf = file.findElementAt(marker.getStartOffset()); - if (leaf != null && leaf.getParent() instanceof GrReferenceExpression) { - return (GrExpression)leaf.getParent(); - } - return null; + @Override + protected GrIntroduceConstantSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, + @NotNull final OccurrencesChooser.ReplaceChoice choice, + final String[] names) { + return new GrIntroduceConstantSettings() { + @Override + public String getVisibilityModifier() { + return PsiModifier.PUBLIC; + } + + @Nullable + @Override + public PsiClass getTargetClass() { + return (PsiClass)context.getScope(); + } + + @Nullable + @Override + public String getName() { + return names[0]; + } + + @Override + public boolean replaceAllOccurrences() { + return isReplaceAllOccurrences(); + } + + @Nullable + @Override + public PsiType getSelectedType() { + GrExpression expression = context.getExpression(); + GrVariable var = context.getVar(); + StringPartInfo stringPart = context.getStringPart(); + return var != null ? var.getDeclaredType() : + expression != null ? expression.getType() : + stringPart != null ? stringPart.getLiteral().getType() : + null; + } + }; } - private GrIntroduceConstantSettings generateSettings() { + @Override + protected GrIntroduceConstantSettings getSettings() { return new GrIntroduceConstantSettings() { @Override public String getVisibilityModifier() { @@ -145,18 +138,18 @@ public class GrInplaceConstantIntroducer extends GrInplaceIntroducer { @Nullable @Override public String getName() { - return getVariable().getName(); + return getInputName(); } @Override public boolean replaceAllOccurrences() { - return myReplaceAll; + return isReplaceAllOccurrences(); } @Nullable @Override public PsiType getSelectedType() { - return getVariable().getDeclaredType(); + return GrInplaceConstantIntroducer.this.getSelectedType(); } @Nullable @@ -167,13 +160,6 @@ public class GrInplaceConstantIntroducer extends GrInplaceIntroducer { }; } - @Nullable - @Override - protected JComponent getComponent() { - //return myPanel.getRootPane(); - return null; - } - @Nullable @Override protected PsiElement checkLocalScope() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form index da9c8bc90939..9d495a7b2e90 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.form @@ -18,6 +18,8 @@ + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java index 926c51eb5b77..9d03af8b5a78 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantHandler.java @@ -15,7 +15,6 @@ */ package org.jetbrains.plugins.groovy.refactoring.introduce.constant; -import com.intellij.openapi.editor.RangeMarker; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; @@ -27,16 +26,11 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.refactoring.GrRefactoringError; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.introduce.*; -import org.jetbrains.plugins.groovy.refactoring.introduce.field.GrFieldNameSuggester; -import org.jetbrains.plugins.groovy.refactoring.introduce.field.GroovyInplaceFieldValidator; - -import java.util.List; /** * @author Maxim.Medvedev @@ -99,65 +93,9 @@ public class GrIntroduceConstantHandler extends GrIntroduceFieldHandlerBase occurrenceMarkers, - RangeMarker varRangeMarker, RangeMarker expressionRangeMarker, - RangeMarker stringPartRangeMarker) { - if (varRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(var.getNameIdentifierGroovy().getTextRange().getStartOffset()); - } - else if (expressionRangeMarker != null) { - context.getEditor().getCaretModel().moveToOffset(expressionRangeMarker.getStartOffset()); - } - else if (stringPartRangeMarker != null) { - int offset = stringPartRangeMarker.getStartOffset(); - PsiElement at = var.getContainingFile().findElementAt(offset); - GrExpression ref = PsiTreeUtil.getParentOfType(at, GrBinaryExpression.class).getRightOperand(); - context.getEditor().getCaretModel().moveToOffset(ref.getTextRange().getStartOffset()); - } - - return new GrInplaceConstantIntroducer(var, context, occurrenceMarkers, settings.replaceAllOccurrences(), expressionRangeMarker, stringPartRangeMarker); - } - - @Override - protected GrIntroduceConstantSettings getSettingsForInplace(final GrIntroduceContext context, final OccurrencesChooser.ReplaceChoice choice) { - return new GrIntroduceConstantSettings() { - @Override - public String getVisibilityModifier() { - return PsiModifier.PUBLIC; - } - - @Nullable - @Override - public PsiClass getTargetClass() { - return (PsiClass)context.getScope(); - } - - @Nullable - @Override - public String getName() { - return new GrFieldNameSuggester(context, new GroovyInplaceFieldValidator(context), false).suggestNames().iterator().next(); - } - - @Override - public boolean replaceAllOccurrences() { - return choice == OccurrencesChooser.ReplaceChoice.ALL; - } - - @Nullable - @Override - public PsiType getSelectedType() { - GrExpression expression = context.getExpression(); - GrVariable var = context.getVar(); - StringPartInfo stringPart = context.getStringPart(); - return var != null ? var.getDeclaredType() : - expression != null ? expression.getType() : - stringPart != null ? stringPart.getLiteral().getType() : - null; - } - }; + protected GrAbstractInplaceIntroducer getIntroducer(@NotNull GrIntroduceContext context, + OccurrencesChooser.ReplaceChoice choice) { + return new GrInplaceConstantIntroducer(context, choice); } private static class ConstantChecker extends GroovyRecursiveElementVisitor { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java index 2e2f0007350f..bb13241a8d9e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrIntroduceConstantProcessor.java @@ -69,8 +69,7 @@ public class GrIntroduceConstantProcessor { return null; } - final GrVariableDeclaration rawDeclaration = createField(targetClass); - final GrVariableDeclaration declaration = addDeclaration(targetClass, rawDeclaration); + final GrVariableDeclaration declaration = addDeclaration(targetClass); final GrField field = (GrField)declaration.getVariables()[0]; if (context.getVar() != null) { @@ -102,7 +101,8 @@ public class GrIntroduceConstantProcessor { context.getEditor().getSelectionModel().removeSelection(); } - protected GrVariableDeclaration addDeclaration(PsiClass targetClass, GrVariableDeclaration declaration) { + protected GrVariableDeclaration addDeclaration(PsiClass targetClass) { + GrVariableDeclaration declaration = createField(targetClass); final GrVariableDeclaration added; if (targetClass instanceof GrEnumTypeDefinition) { final GrEnumConstantList enumConstants = ((GrEnumTypeDefinition)targetClass).getEnumConstantList(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java index 2f924f9e947a..0eb81b51075d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java @@ -68,7 +68,7 @@ public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroduc @Override protected GrIntroduceFieldSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, @NotNull final OccurrencesChooser.ReplaceChoice choice, - String[] names) { + final String[] names) { return new GrIntroduceFieldSettings() { @Override public boolean declareFinal() { @@ -115,7 +115,7 @@ public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroduc @Nullable @Override public String getName() { - return new GrFieldNameSuggester(context, new GroovyInplaceFieldValidator(context), false).suggestNames().iterator().next(); + return names[0]; } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index 1279f74003ce..eea2625282f9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -43,7 +43,7 @@ import java.util.List; /** * @author Maxim.Medvedev */ -public class GrIntroduceFieldHandler extends GrNewIntroduceFieldHandlerBase { +public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase { @NotNull @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index 463db253b406..ba48be41d77f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -38,13 +38,12 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceContext; import org.jetbrains.plugins.groovy.refactoring.introduce.GrIntroduceHandlerBase; -import org.jetbrains.plugins.groovy.refactoring.introduce.GrNewIntroduceHandlerBase; import org.jetbrains.plugins.groovy.refactoring.introduce.StringPartInfo; /** * Created by Max Medvedev on 10/29/13 */ -public class GrIntroduceVariableHandler extends GrNewIntroduceHandlerBase { +public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase { public static final String DUMMY_NAME = "________________xxx_________________"; protected static final String REFACTORING_NAME = GroovyRefactoringBundle.message("introduce.variable.title"); private RangeMarker myPosition = null; From f382bd4d8a2ceac10cba77d2b3da378685275bc3 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 31 Oct 2013 17:56:48 +0400 Subject: [PATCH 28/30] simplifying --- .../introduce/field/GrInplaceFieldIntroducer.java | 9 ++++++++- .../introduce/field/GrIntroduceFieldHandler.java | 12 +----------- .../variable/GrIntroduceVariableHandler.java | 10 +++++----- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java index 0eb81b51075d..d1df3fefa1da 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrInplaceFieldIntroducer.java @@ -42,7 +42,7 @@ import java.util.EnumSet; /** * @author Max Medvedev */ -public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer { +public class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer { private final GrInplaceIntroduceFieldPanel myPanel; private final GrFinalListener finalListener; private String[] mySuggestedNames; @@ -64,6 +64,13 @@ public abstract class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroduc mySuggestedNames = GroovyNameSuggestionUtil.suggestVariableNames(context.getExpression(), new GroovyInplaceFieldValidator(getContext()), false); } + @Override + protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceFieldSettings settings, boolean processUsages) { + GrIntroduceFieldProcessor processor = new GrIntroduceFieldProcessor(context, settings); + return processUsages ? processor.run() + : processor.insertField((PsiClass)context.getScope()).getVariables()[0]; + } + @Nullable @Override protected GrIntroduceFieldSettings getInitialSettingsForInplace(@NotNull final GrIntroduceContext context, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java index eea2625282f9..a21dbe17f654 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/field/GrIntroduceFieldHandler.java @@ -103,17 +103,7 @@ public class GrIntroduceFieldHandler extends GrIntroduceFieldHandlerBase getIntroducer(@NotNull GrIntroduceContext context, OccurrencesChooser.ReplaceChoice choice) { - return new GrInplaceFieldIntroducer(context, choice) { - @Override - protected GrVariable runRefactoring(GrIntroduceContext context, GrIntroduceFieldSettings settings, boolean processUsages) { - if (processUsages) { - return GrIntroduceFieldHandler.this.runRefactoring(context, settings); - } - else { - return new GrIntroduceFieldProcessor(context, settings).insertField( (PsiClass)context.getScope()).getVariables()[0]; - } - } - }; + return new GrInplaceFieldIntroducer(context, choice); } static EnumSet getApplicableInitPlaces(GrIntroduceContext context, boolean replaceAll) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java index ba48be41d77f..39fac55e7348 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/variable/GrIntroduceVariableHandler.java @@ -119,8 +119,7 @@ public class GrIntroduceVariableHandler extends GrIntroduceHandlerBase Date: Thu, 31 Oct 2013 17:55:21 +0200 Subject: [PATCH 29/30] preview for introduce field --- .../GrAbstractInplaceIntroducer.java | 22 +++++++++++++++++++ .../field/GrInplaceFieldIntroducer.java | 12 ++++++---- .../field/GrInplaceIntroduceFieldPanel.form | 13 +++++++---- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java index 42aba9b55d30..32004067b0ca 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrAbstractInplaceIntroducer.java @@ -124,6 +124,28 @@ public abstract class GrAbstractInplaceIntroducer { - private final GrInplaceIntroduceFieldPanel myPanel; + private GrInplaceIntroduceFieldPanel myPanel; private final GrFinalListener finalListener; private String[] mySuggestedNames; private boolean myIsStatic; @@ -51,14 +51,12 @@ public class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer initPlaces) { myProject = project; @@ -262,5 +262,9 @@ public class GrInplaceFieldIntroducer extends GrAbstractInplaceIntroducer
- + - + @@ -11,7 +11,7 @@ - + @@ -35,13 +35,18 @@ - + + + + + + From b5a9cef9d47f36bddc8b9f3e6b21b7f69df55140 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Thu, 31 Oct 2013 17:55:40 +0200 Subject: [PATCH 30/30] preview for introduce constant --- .../constant/GrInplaceConstantIntroducer.java | 28 ++++++++++++--- .../GrInplaceIntroduceConstantPanel.form | 13 ++++--- .../GrInplaceIntroduceConstantPanel.java | 36 ------------------- 3 files changed, 32 insertions(+), 45 deletions(-) delete mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java index 55d65de67fd5..df6623b42a88 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceConstantIntroducer.java @@ -15,12 +15,10 @@ */ package org.jetbrains.plugins.groovy.refactoring.introduce.constant; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduceField.IntroduceConstantHandler; +import com.intellij.ui.components.JBCheckBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; @@ -163,7 +161,27 @@ public class GrInplaceConstantIntroducer extends GrAbstractInplaceIntroducer -
- + + @@ -10,12 +10,12 @@ - + - + @@ -23,6 +23,11 @@ + + + + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java deleted file mode 100644 index 5bd7e5bf48df..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/constant/GrInplaceIntroduceConstantPanel.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.refactoring.introduce.constant; - -import com.intellij.ui.components.JBCheckBox; - -import javax.swing.*; - -/** - * Created by Max Medvedev on 8/29/13 - */ -public class GrInplaceIntroduceConstantPanel { - private JBCheckBox myMoveToAnotherClassJBCheckBox; - private JPanel myRootPane; - - public boolean isMoveToAnotherClass() { - return myMoveToAnotherClassJBCheckBox.isSelected(); - } - - public JComponent getRootPane() { - return myRootPane; - } -}