### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java,v retrieving revision 1.15 diff -u -r1.15 JavaSearchDocument.java --- search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java 29 Mar 2006 03:14:01 -0000 1.15 +++ search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java 27 Jun 2006 15:05:38 -0000 @@ -27,13 +27,15 @@ private IFile file; protected byte[] byteContents; protected char[] charContents; + private boolean firstLevel = false; public JavaSearchDocument(String documentPath, SearchParticipant participant) { super(documentPath, participant); } - public JavaSearchDocument(java.util.zip.ZipEntry zipEntry, IPath zipFilePath, byte[] contents, SearchParticipant participant) { + public JavaSearchDocument(java.util.zip.ZipEntry zipEntry, IPath zipFilePath, byte[] contents, SearchParticipant participant, boolean firstLevel) { super(zipFilePath + IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR + zipEntry.getName(), participant); this.byteContents = contents; + this.firstLevel = firstLevel; } public byte[] getByteContents() { @@ -80,6 +82,13 @@ this.file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(getPath())); return this.file; } + + /** + * @return the nestedLevel + */ + public boolean getFirstLevel() { + return this.firstLevel; + } public String toString() { return "SearchDocument for " + getPath(); //$NON-NLS-1$ } Index: search/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java,v retrieving revision 1.71 diff -u -r1.71 AddJarFileToIndex.java --- search/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java 29 Mar 2006 03:13:59 -0000 1.71 +++ search/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java 27 Jun 2006 15:05:38 -0000 @@ -13,7 +13,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; -import java.util.Enumeration; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -182,20 +182,49 @@ return false; } + ArrayList entries = new ArrayList(zip.size()); for (Enumeration e = zip.entries(); e.hasMoreElements();) { + ZipEntry ze = (ZipEntry) e.nextElement(); + if (Util.isClassFileName(ze.getName())) { + entries.add(ze); + } + } + Collections.sort(entries, new Comparator() { + public int compare(Object o1, Object o2) { + String n1 = ((ZipEntry)o1).getName(); + String n2 = ((ZipEntry)o2).getName(); + return n2.compareTo(n1); + } + }); + for (int i=0, size=entries.size(); i indexing of " + zip.getName() + " has been cancelled"); //$NON-NLS-1$ //$NON-NLS-2$ return false; } - - // iterate each entry to index it - ZipEntry ze = (ZipEntry) e.nextElement(); - if (Util.isClassFileName(ze.getName())) { - final byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getZipEntryByteContent(ze, zip); - JavaSearchDocument entryDocument = new JavaSearchDocument(ze, zipFilePath, classFileBytes, participant); - this.manager.indexDocument(entryDocument, participant, index, this.containerPath); + + // Compute entry nested level + ZipEntry ze = (ZipEntry) entries.get(i); + String entryClassName = ze.getName(); + String entryName = entryClassName.substring(0, entryClassName.length()-6); // remove extension '.class' + boolean firstLevel = true; + int idx = entryClassName.lastIndexOf('$'); + if (idx > 0 && i >= 2) { + // try to find enclosing type in previous Zip entries + String previousName = ((ZipEntry) entries.get(i-1)).getName(); + if (entryName.regionMatches(0, previousName, 0, previousName.length()-6)) { + idx = entryName.lastIndexOf('$', idx-1); + if (idx > 0) { + previousName = ((ZipEntry) entries.get(i-2)).getName(); + firstLevel = !entryName.regionMatches(0, previousName, 0, previousName.length()-6); + } + } } + + // Index entry + final byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getZipEntryByteContent(ze, zip); + JavaSearchDocument entryDocument = new JavaSearchDocument(ze, zipFilePath, classFileBytes, participant, firstLevel); + this.manager.indexDocument(entryDocument, participant, index, this.containerPath); } this.manager.saveIndex(index); if (JobManager.VERBOSE) Index: search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java,v retrieving revision 1.56 diff -u -r1.56 BinaryIndexer.java --- search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java 14 Jun 2006 16:44:26 -0000 1.56 +++ search/org/eclipse/jdt/internal/core/search/indexing/BinaryIndexer.java 27 Jun 2006 15:05:38 -0000 @@ -26,6 +26,7 @@ import org.eclipse.jdt.internal.compiler.lookup.TagBits; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.util.SuffixConstants; +import org.eclipse.jdt.internal.core.search.JavaSearchDocument; public class BinaryIndexer extends AbstractIndexer implements SuffixConstants { private static final char[] BYTE = "byte".toCharArray(); //$NON-NLS-1$ @@ -633,7 +634,8 @@ packageName = CharOperation.NO_CHAR; name = className; } - char[] enclosingTypeName = null; +// char[][] enclosingTypeName = null; + char[][] enclosingTypeNames = null; boolean isNestedType = reader.isNestedType(); if (isNestedType) { if (reader.isAnonymous()) { @@ -642,7 +644,8 @@ name = reader.getInnerSourceName(); } if (reader.isLocal() || reader.isAnonymous()) { - enclosingTypeName = ONE_ZERO; +// enclosingTypeName = ONE_ZERO; + enclosingTypeNames = ONE_ZERO_CHAR; } else { char[] fullEnclosingName = reader.getEnclosingTypeName(); int nameLength = fullEnclosingName.length - packageNameIndex - 1; @@ -650,8 +653,12 @@ // See PR 1GIR345: ITPJCORE:ALL - Indexer: NegativeArraySizeException return; } - enclosingTypeName = new char[nameLength]; - System.arraycopy(fullEnclosingName, packageNameIndex + 1, enclosingTypeName, 0, nameLength); + if (((JavaSearchDocument)this.document).getFirstLevel()) { + enclosingTypeNames = new char[1][nameLength]; + System.arraycopy(fullEnclosingName, packageNameIndex + 1, enclosingTypeNames[0], 0, nameLength); + } else { + enclosingTypeNames = CharOperation.splitOn('$', fullEnclosingName, packageNameIndex+1, fullEnclosingName.length); + } } } // type parameters @@ -666,7 +673,7 @@ if (name == null) return; char[][] superinterfaces = replace('/', '.', reader.getInterfaceNames()); - char[][] enclosingTypeNames = enclosingTypeName == null ? null : new char[][] {enclosingTypeName}; +// char[][] enclosingTypeNames = enclosingTypeName == null ? null : new char[][] {enclosingTypeName}; int modifiers = reader.getModifiers(); switch (TypeDeclaration.kind(modifiers)) { case TypeDeclaration.CLASS_DECL : #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/SearchTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/SearchTests.java,v retrieving revision 1.36 diff -u -r1.36 SearchTests.java --- src/org/eclipse/jdt/core/tests/model/SearchTests.java 12 May 2006 08:22:04 -0000 1.36 +++ src/org/eclipse/jdt/core/tests/model/SearchTests.java 27 Jun 2006 15:05:43 -0000 @@ -74,13 +74,19 @@ } } public static class SearchTypeNameRequestor extends TypeNameRequestor { + public SearchTypeNameRequestor() { + } + public SearchTypeNameRequestor(char enclosingSeparator) { + this.enclosingSeparator = enclosingSeparator; + } Vector results = new Vector(); + private char enclosingSeparator = '$'; public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) { char[] typeName = CharOperation.concat( - CharOperation.concatWith(enclosingTypeNames, '$'), + CharOperation.concatWith(enclosingTypeNames, this.enclosingSeparator), simpleTypeName, - '$'); + this.enclosingSeparator); results.addElement(new String(CharOperation.concat(packageName, typeName, '.'))); } public String toString(){ Index: src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java,v retrieving revision 1.80 diff -u -r1.80 JavaSearchBugsTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 23 Jun 2006 15:38:44 -0000 1.80 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 27 Jun 2006 15:05:42 -0000 @@ -6794,4 +6794,99 @@ removeLibraryEntry(JAVA_PROJECT, new Path("/JavaSearchBugs/lib/b148215.jar")); } } + +/** + * Bug 148243: [search] correct results are missing in java search + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=148243" + */ +public void testBug148243_Valid() throws CoreException { + addLibraryEntry(JAVA_PROJECT, "/JavaSearchBugs/lib/b148243.jar", false); + try { + TypeNameRequestor requestor = new SearchTests.SearchTypeNameRequestor('#'/*specific enclosing type names separator*/); + new SearchEngine().searchAllTypeNames( + null, + SearchPattern.R_PATTERN_MATCH, // case insensitive + "Inner3".toCharArray(), + SearchPattern.R_PATTERN_MATCH, // case insensitive + TYPE, + getJavaSearchScopeBugs(), + requestor, + IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, + null + ); + new SearchEngine().searchAllTypeNames( + null, + SearchPattern.R_PATTERN_MATCH, // case insensitive + "LI*".toCharArray(), + SearchPattern.R_PATTERN_MATCH+SearchPattern.R_CASE_SENSITIVE, + TYPE, + getJavaSearchScopeBugs(), + requestor, + IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, + null + ); + assertSearchResults( + "Unexpected all type names", + "pack.A#Inner1#Inner2#Inner3\n" + + "test4.I#LI\n" + + "test4.I$J#LIJ\n" + + "test4.I$J$K#LIJK", + requestor); + } + finally { + removeLibraryEntry(JAVA_PROJECT, new Path("/JavaSearchBugs/lib/b148243.jar")); + } +} +public void testBug148243_Invalid() throws CoreException { + addLibraryEntry(JAVA_PROJECT, "/JavaSearchBugs/lib/b148243.jar", false); + try { + TypeNameRequestor requestor = new SearchTests.SearchTypeNameRequestor('#'/*specific enclosing type names separator*/); + new SearchEngine().searchAllTypeNames( + null, + SearchPattern.R_PATTERN_MATCH, // case insensitive + "Member3".toCharArray(), + SearchPattern.R_PATTERN_MATCH, // case insensitive + TYPE, + getJavaSearchScopeBugs(), + requestor, + IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, + null + ); + new SearchEngine().searchAllTypeNames( + null, + SearchPattern.R_PATTERN_MATCH, // case insensitive + "D3".toCharArray(), + SearchPattern.R_PATTERN_MATCH, // case insensitive + TYPE, + getJavaSearchScopeBugs(), + requestor, + IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, + null + ); + new SearchEngine().searchAllTypeNames( + null, + SearchPattern.R_PATTERN_MATCH, // case insensitive + "H3".toCharArray(), + SearchPattern.R_PATTERN_MATCH, // case insensitive + TYPE, + getJavaSearchScopeBugs(), + requestor, + IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, + null + ); + assertSearchResults( + "Unexpected all type names", + "test1.X#Y#Z#Member1#Member2#Member3\n" + + "test2.B#C#D1#D2#D3\n" + + "test3.E#F#G#H1#H2#H3", + requestor); + // correct result should be: + // "test1.X$Y$Z#Member1#Member2#Member3\n" + + // "test2.B$C#D1#D2#D3\n" + + // "test3.E#F$G#H1#H2#H3", + } + finally { + removeLibraryEntry(JAVA_PROJECT, new Path("/JavaSearchBugs/lib/b148243.jar")); + } +} } \ No newline at end of file Index: workspace/JavaSearchBugs/lib/b148243.jar =================================================================== RCS file: workspace/JavaSearchBugs/lib/b148243.jar diff -N workspace/JavaSearchBugs/lib/b148243.jar --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ workspace/JavaSearchBugs/lib/b148243.jar 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,50 @@ +PK4†Û4META-INF/MANIFEST.MFþÊóMÌËLK-.Ñ +K-*ÎÌϳR0Ô3àåâåPK²îPKS‚Ú4!pack/A$Inner1$Inner2$Inner3.class}OMKÃ@}Ó¦YS[kýªx<¨‡†Ú£"”‚ =(½oâ¢[Ó?$©ÿ«'Áƒ?À%N+â.¼÷æÍììÌÇçÛ;€>z5ÂÞ³ŒžüÑá•1*TtZÑPÀ"´§òEú±4þM8UQN°ÏµÑù¡~tÈ0V„n?D2žËTõŸiåÏ:#ôƒMo_Üûd™FêZa{:*>BðÊþ,–Y¦2?.¡ùï¼@?Ó•Å¢2ׂG: mz°¢É:9Á1x@‹xó`Œ‚+¿¬?ÆÙ'¶>XÔà2Ú¥ic›Ñ«ÌͲ¿Sb mæ_ÚÁ.öàpªƒ>ó>«C8¿PKy•o”PKS‚Ú4pack/A$Inner1.classUNMOÂ@œ¥¥µ|UÔ³‰ñ@W !!1!zÐpßÖ?.Ô-i‹ÿË“‰?Êø¶…»É¼yoæíÎþïçÀWj„ÖVÄ›pvó µÌF,Bw->E˜ý>Ek{¢´*¦„úí`E°æé«ôP‡ë£›ÐY*-w‘Ì^D”HB°Lc‘¬D¦LZÅ»Ê?ûäÓ{‚÷œî²X.”qÙ³¡I@ðK}žˆ<—¹ƒ€¥j‘É1ï¡òZUÆGË×àØ0‡ør\F‡»°ì?ÆÝ7š_Ljðíjˆ3FÿÀ}´J½]b]®3BçpÑgv ÷PKʽˆ+ó[PKS‚Ú4 pack/A.class-ŽÁjÂ@†ÿјhŒÆj_ Ðƒz0ô\D„ %÷MºÔÕ¸‘$ö½zzèô¡J'›î²ÿÌ?ß,3?¿_ßfxtÐ ØW‘œƒ¥‹08‰¤B¿»ø$“’ñ\iU.Íñ$"X«ìMºh¢ã¡›à‡JËííËü âT†a–ˆ4¹ªüÑ*?ª ´ÃzÚ+ÁÝg·<‘kUa{9«F¼?Ö2_¥¢(dá`HèÕ?ž +xáÖ:Áx'T‡øò.¬»Àx 5½£ýÉI.«mŠº¬^ÝÀ±gxߨ?G—Ù¿:PK#+5wâ)PK-?Ú4 pack/A.java+HLÎNLOU(ÒÖ¼\ XPš”“™¬?œ“X\¬à¨PÍËÅ *.I,?Ëxæ奂¥qËAäq+0†*¨‘ ˆ?PK¹ï¥¬E—PK¢„Û4)test1/X$Y$Z$Member1$Member2$Member3.class?PMKÃ@}Ó¦Y“F[[?ëIŒ  ±GÅKA¢”¢Þ6qÑ-1?$õy<øüQâ$†êAÄ]xïͼ™avß?^ßø4[…Ê ß»voÜ[÷L=†*ók>¨y(`ºù$½X&÷ÞE8QQA0?t¢‹cBsgwL0Fé?²Ñ„å “Ð t¢Î§åŒ+ÆŠÐ ÒHÆc™é2®“Fñ sÂvð?U öe:Í"u¢Ë^»ªÞ/w#8§I¢²Q,ó\å=Bÿ—‘K„öƒ fÖ*aã?5f¥ßjˆMð <Ä—_Î(8òªhí½`î™E6£Y%ÚŒÎWó|å/TØA—yÀCÑÇ2,¬°Zc&Vë°>PKœ?GÜÄPK¢„Û4!test1/X$Y$Z$Member1$Member2.class}PMKÃ@}Ó¦Y“FûågŃ˜ƒz0Ä/AˆzPŠzÛÄE·Ä’ÔÿåIðàðG‰“Šé¼73of˜Ù¯ï?O>† +Âv¡òÂ÷îÜ{÷Á½T/¡Êüš? Bw*_¥ËäÉ»§**æ©NtqFhîLÆ8}T6š°´`:?NÔÕ¬œq+ÃXúAÉx"3]ÆuÒ(žuNØ ¬pB°oÒY©s]öØUÕQ¹Á¹H•?c™ç*èÿŒX%´ÿQKs?OÝ$ì-X¤æѼe„]ð |ÄÆ—3 +Ž¼*Z‡ïXzc§›Ñ¬’&ÚŒÎoór¥¯TØA—yÈC{` +Wõ°Î¼ÁÞ¬PK‚RIt¼PK¢„Û4test1/X$Y$Z$Member1.classmOÁJÃ@}Ó¦Y“FÛ¦Vž„Ôƒ!½*^ +‚õ õ¶‰‹n‰ dSÿË“àÁð£ÄIŠ‡î›÷f†73?¿_ß"ì tãJ™* +‚Çà)¸Vo‰*#‹0\Èwf2 o“…J+‚}®s]]ºGÇs‚5+ž•‹.=Ø„A¬su³¬=îe’)‚©Ìæ²Ôµn“Võª +ao}FpïŠe™ªK]÷ºMõ´Þ…à]å¹*g™4FŸÐÿgAëý'„ƒ +îmœ®[§8Ÿƒú>ƒQ° + +ôN>±õÁ¤—Ñ^%ÑgôZîa»©ï48À?£ÏŒ0Âv™íÁùPK*xÜ?ÿyPK¢„Û4test1/X$Y$Z.classMNÁJÃ@}Ó¦Y»Mmmý!õ`ÈYé¥ QJQo›¸è–¸?lêy<ø~”8»öÐöͼ73Ìûùýú?ãP GuÚuyö?>¦OaºVï*«•}Én˵®:B|a¬é„þñÉŠ-›g-ÑÇ0Á1aR«o6o¥nïUYk¬h*U¯Tk<ߊQ÷ja\ìœ<'È»fÓVúÒøÔ3ï??\Y«Ûe­œÓN`F˜ï¬¦×Ú_Ì b[áìþ{c̲À?Áé'ö>¸èA2ÆAŒ0bLþ8?C?àSÎ’{üçþPKªH9+ì>PK=„Û4test1/X$Y$Z.java+HLÎNLOU(I-.1´æåÁ‚Ò¤œÌd…äœÄâb…•H•(…j^.N¨pqIb \Ö757)µÈ,?G?DÆPµ D1PK-j¬MŸPK¢„Û4 +test2/B.class-MËÁP=S}P?Š?°ÃBÖX?X5,ˆýmÝp¥Ú¤ný—•ÄÂø(1­Î$gæœ3“óù¾Þ&è:0Ž–7=õ—LB÷"îÂ?Erò·áEFš`ÏU¢ô‚P s•¥‹-X° ^ ¹É¯¡Ìö"Œ%¡¤‘ˆ"S¯DSŸÕ?Ъ¸ÁÝ¥yɵ*|{9.²Ñ'¡(âæF‡™_rÀ=QðbÀe´KÑ@“±õ?àÙ.ß;¥ãýPK +¨ÿ¼ðPKd„Û4 test2/B.java+HLÎNLOU(I-.1²æå*(MÊÉLVHÎI,.VpR¨®ååPK?Úº&%#PK¢„Û4test2/B$C$D1$D2$D3.classeOMKÃ@}“¦Ù&F[kýêMÈA{0´=*L„ ¥÷M\tKL Iý_žþ”8EDwáÍÌ{óùþñú`Š±€E6ªnfáyñ4ˆgA<° ƒ¥|’a.‹ûð:]ª¬!8§ºÐÍ¡sx´ ØQy§Y̸z?.zp<ôaqŸT•òfõœÉú^d…$ŒÓ*ÅBÔJÇ¿¤Ù>©†à§kcÏî]µªsy¥tÞ€•S½Á».KYÇ…hÙØ3ó¿ØÆÁùcFiàKx‰µ9A2×âGàS ñçmŽÂ.úÓ7 ^Ù1à2ZiaƒÑûI`»Ùé[1b;á¦>¶± ‡³|ì±ÝgïÎ7PKs\tyPK¢„Û4test2/B$C$D1.classMNMKÃ@œ—¦Ic[ã×YÈA=š«âÁAzPzßÄE·Ä²Ûþ/O‚€?J|‹tfgæí{o¾>¿ÌpìÃ!DFj“¥7IžÌg>\Ât)Ö"­Eó’>”KY‚w¥e® ƒÓ³ÁÍÛgb€ ÂaR¨FÞ¯ÞJÙ=‰²–„¸h+Q/D§¬Þ˜®yUš0.¶w^ÂÇvÕUòVÙO#¶/lÎv×4²Ëk¡µÔ>bBðßIplÞC^¾=-™g¶’áœö_NÉè³J{ + Ï?0zgâ dôþLì0Fa·¯?{œ`ÊoÌŒ°‡}8`v„àPK0Ç8õQPK¢„Û4test2/B$C.class=NANÃ@ §iÒ¤?–Â?zDáJÅ¡©??"8€zß ¶ +)»å_œ?8ð…pRT[{ƶìŸß¯oNBx„ȱuWérž‡ð Ó?zWi­ÌKúPn¸r„`¡?v7„ÁÙùšàçÍ3Ç J0D@˜Úðýö­äöI•5fES©z­ZÝñÑw¯ÚÆÅþà5!~l¶mÅ·º›‰vÙÝ'$wÆp›×ÊZ¶!f¢ì×æ«Œà­2œB~Bg$.¿†ÂÒžËOŒ>¤ð ½èc,˜ì$ôýÃ'˜JŽ¥w$qŒèPK-œ}Çå,PK\„Û4test2/B$C.java+HLÎNLOU(I-.1²æåÁ‚Ò¤œÌd…äœÄâb'g…j^.N¨`qIb \ÎÅ,…]Î"‡]Ò*Y "APKAÐE/EŽPK¢„Û4test3/E$F$G$H1$H2$H3.classmOMOƒ@}ÓRV(öËZ¿êA‚5^šVLˆ4½/¸Q„¨ÿË“‰€?Ê8`ÝMÞ{óffgöãó퀋=?aXª¢ôœ‰=µ/mßµýSÛ÷4Bo.Ÿ¥“ÈôÁ¹ ç** úyœÆå¡yx4#hãì^™h°ЂNèqª®O¡Êïd˜( È"™ÌdWñÒÔÊǸ Œ‚ÿfŸÌÛl‘GjWÅúä¤Z„`]¥©Êlj, +U íýC‚X¼`mm:¿g¾+°Mèÿ^åjð°~Õ!¾ü7FÁ‘SÇ@ëø+/,0õÚÔÑf´¾ ˜Wë|§Æ.zÌÐÐÇÖa`Äj“y‹Õ3±Ú…ñPK‚…ëŸPK¢„Û4test3/E$F$G$H1$H2.classeOMOƒ@}C)Å~û­êAR9j¼4­˜=hz_p£4 Pÿ—'þ”q 4ÝMÞ¼÷fvgæûçó ÀG:B¯?yá:S{fßØÞØö.t¨„îB¼ 'ɳs,dX´«(‰ŠkBãätNP'é“4Ñ€a¡ ?Ðñ£DÞ-_™=Š –„¾Ÿ†"ž‹,*umªÅK”þZãK‚ù?.³P΢²R›ž—S¬Û$‘Ù$y.s}BëÏcC‚^<]eíÚÿ”ð‚„áZ{ÛsË´‹cð/(ñåÝuVN¥?æÙ6Þ™(0µ•‰£Us ›U¾]a]Ž#¨èa€-Øf¶Ë‘˜íqÜgvãPKc¾íšœPK¢„Û4test3/E$F$G$H1.classUO»NÃ@œuvL‡w:$@?•P‚h¢„ YP€ÒŸÍ .2¶d;üÀG!öL +r'ÍìÎÎÞî}ÿ|~a(`ºµªê‹hΛp>° ý¥|“Q&óçè>Yª´&8W:×õ5¡urº Ø“âIyhÁõцCèÅ:Ww«×D•?2Éa©Ì²Ô&_‹vý¢+oN½$xŪLÕL›3=7+üÛ48˜kÈŒpˆ#x8fv +ïPKÅ öKPK¢„Û4 +test3/E.class-ŽÁJÃ@†ÿIÓ¬I£­ÕzPñhñRÚ"=(½oâ [â²[ßË“àÁð¡ÄIš]ö›ùÿ™eæ÷ïûÀ5N‚òìüM¶T “­þÐY¥íköXl¹ô„hn¬ñw„Áùņ.êN0@œbˆˆ0Î?å‡Ý{Áͳ.*&LóºÔÕF7¦Õ½ú7ãqÞ?»%$Oõ®)yeÚz´¼jgÒ{k¹YTÚ9v +S¨ÿ2[ÍÖ²†g?í!¹²‡P‰Ê: + /¿pð)I€Duf€‘0Ý7H<ì¼£ŽcL$&R;–w‚øPK© _…ã&PK‹„Û4 test3/E.java+HLÎNLOU(I-.1¶æå*(MÊÉLVHÎI,.VpU¨æåâ„ +—$–ÀeÜTÜÁrX%= !rØ%? ’Øe?a²µ` +L‚ "PKfsJ®PK3†Û4test4/I$J$LIJ.classUNÍJÃ@œ¯I“&¦öG_@èA=oJ/!%ÔƒÒû&.º%n »õ½< |Júí*…îÂ|ßÌΰóóûõ +à§1z„¡•ÆÞäÅl9+‹eŒ?0Þˆw‘7B¿äÕFÖ–Ý)­ìœœ_¬ á¢}–)$úˆ£Ri¹Ú¾U²{U# Ó²­E³?rü_ í«2Î}ðé-!}l·]-ï•s +X¿rY¡µì?0FšSB²?rã ¼ÀâËmcf¹ç@ÿòƒ^zH#/8bÌþ <‡þýØãcž©?Op‚dPKD—˜”æ2PK3†Û4test4/I$J.class=ŽÁJÃ@†ÿIÓ¤IS[k_ Ðƒz0Þ,^ +BJЃÒû&tKÜ@vë{y<ø}(q¥»ì7óÿ3ËÌáçëÀ5f!$ñ ƒÎô0& +G?wÒqŒ‰ÄXj§òÎýPK2ïºóç.PK-†Û4test4/I$J.java+HLÎNLOU(I-.1±æå*(MÊÉLVHÎI,.VðTñR¨æåâ„ +—$–Àå|!+?Qý¢•Ö*›bFÿ™ç­~ŽÀéàñåTŒ)³"p`xú†?W~ “ F3f? +\wƒ¿p‚)WÆ÷q€Ñ7PK«ÙºÞé=PK3†Û4test4/I$J$K.classMNANÃ0œMÓ„º)-… åˆ?¸?¸TBJÁÔ»,p)vù'$<€G!Ö†C½òŒg¼^Ï÷Ïç€ ¥ˆc§¬»,Ê|™¯RÄ„ÙF¾É¢•æ¹¸¯7ªq„äZínƒ“Ó5!^tOJ`€Q†!´ÒFÝm_kÕ?ʺU„yÕ5²]Ë^{ýoÆîE[¤ÚùòŠ ºmߨ[í{DpÏ}BV£úE+­U6ÅœÃí<Í«r¹â©žp N¿ˆ‹S1¦¬Š ?áÙöÞùA0&ÁŒ0fÌþ˜'ÁÛ8ÅŒYðÝïCŒ~PK©…—ê8PK*†Û4test4/I$J$K.java+HLÎNLOU(I-.1±æå*(MÊÉLVHÎI,.VðTñRñV¨æåâ„ +—$–Àe}<½€’µ¼\@PK'´Øî:GPK3†Û4test4/I$LI.classENËJÄ@¬N²7F÷¡? xPÁ›‹—a`Ѓ²÷It–8?̬ÿåIðàøQbg\Øn¨îꮦúç÷ëÀŽBŒוcù/àz÷‡'˜r-âù GÿPKb¥‚ôâ'PK3†Û4 +test4/I.class-NÁJÃ@}“¦Y£­­? xPÁ›ÒKAXXÚƒ¥÷M\tKÜ@vëy<ø~”8I3ü™÷f†™ß¿ïw8ˆ"î )¦;ý¡‹Z»×b]îLÉ£u6,£«ë-!^6/&ÃiŽ1ÂDYgVû÷Ò´]Ö†0SM¥ë­nmÇ1oÖR5œ{ dÏ;­Ì“íú‰¼ínréœi—µöÞx?Ï ++—J"%qþ?;Á(˜=Æ7_8úä"BƘôb„cÆü0Àù¤×N{œ`Ê9ãÞÇé?PKŽ/ +Má$PK/†Û4 test4/I.java+HLÎNLOU(I-.1±æå*(MÊÉLVHÎI,.VðT¨æåâ„ +—$–Àe|€Rµ¼\@PK¬`=4APK-?Ú4 +.classpath³±¯ÈÍQ(K-*ÎÌϳU2Ô3PRHÍKÎOÉÌK·U + +qÓµP²·ãå²IÎI,..H,Ér8¼Ô¼’¢J…ì̼[¥â¢d%? ­’’>neÉùy0eùEéz©É9™Å©zY)%z9‰¥yÉ@«õ¼‚\ã?ýýB=ý\ƒð™–_ZRPZ‚b¯?>²cPK¡Ô#X‹âPK-?Ú4.projectuPA ËÉ:[‚F*]ï³Ûõ¼Úe‡r1g=š„;?¨zçÕž?1Í;(«¼ØmŠíÝ¢`42a%L×?v%£ï)°éŽ?€NP5¨V^z%xôV®edRšÁš€hUo?4ÒaÐüÁ£ð[Á;8ÖCȶ Ó)ÁèoJbÞ5|¤’zÿŒûP êâ¹ï?Ïs§ŸøPK¥?GÃPK4†Û4²îMETA-INF/MANIFEST.MFþÊPKS‚Ú4n²Ï›!apack/A$Inner1$Inner2$Inner3.classPKS‚Ú4y•o”¸pack/A$Inner1$Inner2.classPKS‚Ú4ʽˆ+ó[pack/A$Inner1.classPKS‚Ú4#+5wâ) <pack/A.classPK-?Ú4¹ï¥¬E— Xpack/A.javaPK¢„Û4œ?GÜÄ)Ötest1/X$Y$Z$Member1$Member2$Member3.classPK¢„Û4‚RIt¼!?test1/X$Y$Z$Member1$Member2.classPK¢„Û4*xÜ?ÿy¡test1/X$Y$Z$Member1.classPK¢„Û4ªH9+ì>ç test1/X$Y$Z.classPK=„Û4-j¬MŸ test1/X$Y$Z.javaPK¢„Û4 +¨ÿ¼ð +? test2/B.classPKd„Û4?Úº&%# ” test2/B.javaPK¢„Û4?Þ^|ó test2/B$C$D1$D2$D3.classPK¢„Û4s\ty?test2/B$C$D1$D2.classPK¢„Û40Ç8õQ‰test2/B$C$D1.classPK¢„Û4-œ}Çå,¾test2/B$C.classPK\„Û4AÐE/EŽàtest2/B$C.javaPK¢„Û4‚…ëŸatest3/E$F$G$H1$H2$H3.classPK¢„Û4c¾íšœÀtest3/E$F$G$H1$H2.classPK¢„Û4Ëgrtest3/E$F$G$H1.classPK¢„Û4Å öKctest3/E$F$G.classPK¢„Û4© _…ã& +˜test3/E.classPK‹„Û4fsJ® ¶test3/E.javaPK3†Û4D—˜”æ2:test4/I$J$LIJ.classPK3†Û42ïºóç.atest4/I$J.classPK-†Û4Ã`"27D…test4/I$J.javaPK3†Û4«ÙºÞé=øtest4/I$J$K$LIJK.classPK3†Û4©…—ê8%test4/I$J$K.classPK*†Û4'´Øî:GNtest4/I$J$K.javaPK3†Û4b¥‚ôâ'Ætest4/I$LI.classPK3†Û4Ž/ +Má$ +ætest4/I.classPK/†Û4¬`=4A !test4/I.javaPK-?Ú4¡Ô#X‹â +p!.classpathPK-?Ú4¥?GÃ3".projectPK##Ñ,#