Skip to content

Commit be0df44

Browse files
authored
Upgrade to lucene-8.2.0-snapshot-860e0be5378 (#44171)
Upgrade to lucene-8.2.0-snapshot-860e0be5378
1 parent 23b8185 commit be0df44

File tree

62 files changed

+70
-61
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+70
-61
lines changed

buildSrc/version.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
elasticsearch = 8.0.0
2-
lucene = 8.1.0
2+
lucene = 8.2.0-snapshot-860e0be5378
33

44
bundled_jdk = 12.0.1+12@69cfe15208a647278a19ef0990eea691
55

docs/Versions.asciidoc

Lines changed: 2 additions & 2 deletions

modules/lang-expression/licenses/lucene-expressions-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
779a843cfa50fc09eb0cbadebe1ae2de35fb80b4

plugins/analysis-icu/licenses/lucene-analyzers-icu-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
9ec124ed1efe19b6a6ebdc9ce299d2a3726cf040

plugins/analysis-kuromoji/licenses/lucene-analyzers-kuromoji-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
86c02792e73efdc762e2e65ea7e78912ca01ab65

plugins/analysis-nori/licenses/lucene-analyzers-nori-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7fd7096cbee02f0c888df1bf391e0fe2d12422e6

plugins/analysis-phonetic/licenses/lucene-analyzers-phonetic-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
9d22bef4e7aa7b651eda01ad99e608018da9527d

plugins/analysis-smartcn/licenses/lucene-analyzers-smartcn-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1600d60203bf6b53244668352f4026653497abd1

plugins/analysis-stempel/licenses/lucene-analyzers-stempel-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2902e1e58cf5d8bbb2ed98d85b1dcddff3b46cbe

plugins/analysis-ukrainian/licenses/lucene-analyzers-morfologik-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d85bddbdc8a890bd90b572b7fe8e8f944af7fc70

server/licenses/lucene-analyzers-common-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ceed9fd2c88f62b9f039e28eef57f5d95e71c578

server/licenses/lucene-backward-codecs-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
24feeb6db1bc38b1a7aa31eaa052b5af323f206c

server/licenses/lucene-core-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d5f5b26c967dce353db5b69f52a22ab1c39e3ce6

server/licenses/lucene-grouping-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
45d506e861bcfe5dcffeab89e08f046934b540cb

server/licenses/lucene-highlighter-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0a6c96eff6c944ec576873e1d1936fd6b265afd4

server/licenses/lucene-join-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
9b9fba1279c24d2daac0a8c54228c0bbc4375d60

server/licenses/lucene-memory-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d723326c2d973928a07868ec97282dea2f3ae511

server/licenses/lucene-misc-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5c5422ee3afeebbe6114ef989888e15a7fd7af0e

server/licenses/lucene-queries-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5006b9e0ef1bc9c9857742c898ab79eb276891c5

server/licenses/lucene-queryparser-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a2e1ef30071d5f5da5b2c515455c70919e131d43

server/licenses/lucene-sandbox-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
921849a9546d7582b530415ceb718896bde3f017

server/licenses/lucene-spatial-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
81aecdc5655a43de5de16d27e7c9f79dd22e338a

server/licenses/lucene-spatial-extras-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
268880a91f20eed94c5e48e53d50b7b9a32680d0

server/licenses/lucene-spatial3d-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
72169e3d35627df0c6f713288a7a32d02fb13117

server/licenses/lucene-suggest-8.1.0.jar.sha1

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3b33ee4801404570028e8431ccb327e37a20ddfa

server/src/main/java/org/apache/lucene/search/uhighlight/CustomUnifiedHighlighter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ protected FieldHighlighter getFieldHighlighter(String field, Query query, Set<Te
137137
Set<HighlightFlag> highlightFlags = getFlags(field);
138138
PhraseHelper phraseHelper = getPhraseHelper(field, query, highlightFlags);
139139
CharacterRunAutomaton[] automata = getAutomata(field, query, highlightFlags);
140-
OffsetSource offsetSource = getOptimizedOffsetSource(field, terms, phraseHelper, automata);
140+
UHComponents components = new UHComponents(field, fieldMatcher, query, terms, phraseHelper, automata, false , highlightFlags);
141+
OffsetSource offsetSource = getOptimizedOffsetSource(components);
141142
BreakIterator breakIterator = new SplittingBreakIterator(getBreakIterator(field),
142143
UnifiedHighlighter.MULTIVAL_SEP_CHAR);
143-
UHComponents components = new UHComponents(field, fieldMatcher, query, terms, phraseHelper, automata, highlightFlags);
144144
FieldOffsetStrategy strategy = getOffsetStrategy(offsetSource, components);
145145
return new CustomFieldHighlighter(field, strategy, breakIteratorLocale, breakIterator,
146146
getScorer(field), maxPassages, (noMatchSize > 0 ? 1 : 0), getFormatter(field), noMatchSize, fieldValue);

server/src/main/java/org/elasticsearch/Version.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public class Version implements Comparable<Version>, ToXContentFragment {
5555
public static final Version V_7_2_1 = new Version(7020199, org.apache.lucene.util.Version.LUCENE_8_0_0);
5656
public static final Version V_7_3_0 = new Version(7030099, org.apache.lucene.util.Version.LUCENE_8_1_0);
5757
public static final Version V_7_4_0 = new Version(7040099, org.apache.lucene.util.Version.LUCENE_8_1_0);
58-
public static final Version V_8_0_0 = new Version(8000099, org.apache.lucene.util.Version.LUCENE_8_1_0);
58+
public static final Version V_8_0_0 = new Version(8000099, org.apache.lucene.util.Version.LUCENE_8_2_0);
5959
public static final Version CURRENT = V_8_0_0;
6060

6161
private static final ImmutableOpenIntMap<Version> idToVersion;

server/src/main/java/org/elasticsearch/common/geo/ShapeRelation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
package org.elasticsearch.common.geo;
2121

22-
import org.apache.lucene.document.LatLonShape.QueryRelation;
22+
import org.apache.lucene.document.ShapeField.QueryRelation;
2323
import org.elasticsearch.common.io.stream.StreamInput;
2424
import org.elasticsearch.common.io.stream.StreamOutput;
2525
import org.elasticsearch.common.io.stream.Writeable;

server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import org.apache.lucene.search.Query;
3535
import org.apache.lucene.search.TermInSetQuery;
3636
import org.apache.lucene.search.TermQuery;
37-
import org.apache.lucene.search.intervals.IntervalsSource;
37+
import org.apache.lucene.queries.intervals.IntervalsSource;
3838
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
3939
import org.apache.lucene.search.spans.SpanQuery;
4040
import org.apache.lucene.util.BytesRef;

server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
import org.apache.lucene.search.Query;
4545
import org.apache.lucene.search.SynonymQuery;
4646
import org.apache.lucene.search.TermQuery;
47-
import org.apache.lucene.search.intervals.Intervals;
48-
import org.apache.lucene.search.intervals.IntervalsSource;
47+
import org.apache.lucene.queries.intervals.Intervals;
48+
import org.apache.lucene.queries.intervals.IntervalsSource;
4949
import org.apache.lucene.search.spans.FieldMaskingSpanQuery;
5050
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
5151
import org.apache.lucene.search.spans.SpanNearQuery;
@@ -421,13 +421,13 @@ public Query prefixQuery(String value, MultiTermQuery.RewriteMethod method, Quer
421421

422422
public IntervalsSource intervals(BytesRef term) {
423423
if (term.length > maxChars) {
424-
return Intervals.prefix(term.utf8ToString());
424+
return Intervals.prefix(term);
425425
}
426426
if (term.length >= minChars) {
427427
return Intervals.fixField(name(), Intervals.term(term));
428428
}
429429
String wildcardTerm = term.utf8ToString() + "?".repeat(Math.max(0, minChars - term.length));
430-
return Intervals.or(Intervals.fixField(name(), Intervals.wildcard(wildcardTerm)), Intervals.term(term));
430+
return Intervals.or(Intervals.fixField(name(), Intervals.wildcard(new BytesRef(wildcardTerm))), Intervals.term(term));
431431
}
432432

433433
@Override
@@ -671,7 +671,7 @@ public IntervalsSource intervals(String text, int maxGaps, boolean ordered,
671671
if (prefixFieldType != null) {
672672
return prefixFieldType.intervals(normalizedTerm);
673673
}
674-
return Intervals.prefix(normalizedTerm.utf8ToString()); // TODO make Intervals.prefix() take a BytesRef
674+
return Intervals.prefix(normalizedTerm);
675675
}
676676
IntervalBuilder builder = new IntervalBuilder(name(), analyzer == null ? searchAnalyzer() : analyzer);
677677
return builder.analyzeText(text, maxGaps, ordered);

server/src/main/java/org/elasticsearch/index/query/IntervalBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
import org.apache.lucene.search.BooleanQuery;
3030
import org.apache.lucene.search.MatchesIterator;
3131
import org.apache.lucene.search.QueryVisitor;
32-
import org.apache.lucene.search.intervals.IntervalIterator;
33-
import org.apache.lucene.search.intervals.Intervals;
34-
import org.apache.lucene.search.intervals.IntervalsSource;
32+
import org.apache.lucene.queries.intervals.IntervalIterator;
33+
import org.apache.lucene.queries.intervals.Intervals;
34+
import org.apache.lucene.queries.intervals.IntervalsSource;
3535
import org.apache.lucene.util.BytesRef;
3636
import org.apache.lucene.util.graph.GraphTokenStreamFiniteStrings;
3737

server/src/main/java/org/elasticsearch/index/query/IntervalFilterScript.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
package org.elasticsearch.index.query;
2121

22-
import org.apache.lucene.search.intervals.IntervalIterator;
22+
import org.apache.lucene.queries.intervals.IntervalIterator;
2323
import org.elasticsearch.script.ScriptContext;
2424

2525
/**

server/src/main/java/org/elasticsearch/index/query/IntervalQueryBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import org.apache.lucene.search.MatchNoDocsQuery;
2323
import org.apache.lucene.search.Query;
24-
import org.apache.lucene.search.intervals.IntervalQuery;
24+
import org.apache.lucene.queries.intervals.IntervalQuery;
2525
import org.elasticsearch.common.ParsingException;
2626
import org.elasticsearch.common.io.stream.StreamInput;
2727
import org.elasticsearch.common.io.stream.StreamOutput;

server/src/main/java/org/elasticsearch/index/query/IntervalsSourceProvider.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
package org.elasticsearch.index.query;
2121

2222
import org.apache.lucene.index.IndexOptions;
23-
import org.apache.lucene.search.intervals.FilteredIntervalsSource;
24-
import org.apache.lucene.search.intervals.IntervalIterator;
25-
import org.apache.lucene.search.intervals.Intervals;
26-
import org.apache.lucene.search.intervals.IntervalsSource;
23+
import org.apache.lucene.queries.intervals.FilteredIntervalsSource;
24+
import org.apache.lucene.queries.intervals.IntervalIterator;
25+
import org.apache.lucene.queries.intervals.Intervals;
26+
import org.apache.lucene.queries.intervals.IntervalsSource;
2727
import org.apache.lucene.util.BytesRef;
2828
import org.elasticsearch.Version;
2929
import org.elasticsearch.common.ParseField;
@@ -585,12 +585,12 @@ public IntervalsSource getSource(QueryShardContext context, MappedFieldType fiel
585585
}
586586
BytesRef normalizedTerm = analyzer.normalize(useField, pattern);
587587
// TODO Intervals.wildcard() should take BytesRef
588-
source = Intervals.fixField(useField, Intervals.wildcard(normalizedTerm.utf8ToString()));
588+
source = Intervals.fixField(useField, Intervals.wildcard(normalizedTerm));
589589
}
590590
else {
591591
checkPositions(fieldType);
592592
BytesRef normalizedTerm = analyzer.normalize(fieldType.name(), pattern);
593-
source = Intervals.wildcard(normalizedTerm.utf8ToString());
593+
source = Intervals.wildcard(normalizedTerm);
594594
}
595595
return source;
596596
}

server/src/test/java/org/elasticsearch/index/query/IntervalBuilderTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import org.apache.lucene.analysis.CannedTokenStream;
2424
import org.apache.lucene.analysis.Token;
2525
import org.apache.lucene.analysis.standard.StandardAnalyzer;
26-
import org.apache.lucene.search.intervals.Intervals;
27-
import org.apache.lucene.search.intervals.IntervalsSource;
26+
import org.apache.lucene.queries.intervals.Intervals;
27+
import org.apache.lucene.queries.intervals.IntervalsSource;
2828
import org.elasticsearch.test.ESTestCase;
2929

3030
import java.io.IOException;

server/src/test/java/org/elasticsearch/index/query/IntervalQueryBuilderTests.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
import org.apache.lucene.search.BoostQuery;
2323
import org.apache.lucene.search.MatchNoDocsQuery;
2424
import org.apache.lucene.search.Query;
25-
import org.apache.lucene.search.intervals.IntervalQuery;
26-
import org.apache.lucene.search.intervals.Intervals;
25+
import org.apache.lucene.queries.intervals.IntervalQuery;
26+
import org.apache.lucene.queries.intervals.Intervals;
27+
import org.apache.lucene.util.BytesRef;
2728
import org.elasticsearch.common.ParsingException;
2829
import org.elasticsearch.common.Strings;
2930
import org.elasticsearch.common.compress.CompressedXContent;
@@ -395,7 +396,7 @@ public void testPrefixes() throws IOException {
395396
String json = "{ \"intervals\" : { \"" + STRING_FIELD_NAME + "\": { " +
396397
"\"prefix\" : { \"prefix\" : \"term\" } } } }";
397398
IntervalQueryBuilder builder = (IntervalQueryBuilder) parseQuery(json);
398-
Query expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.prefix("term"));
399+
Query expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.prefix(new BytesRef("term")));
399400
assertEquals(expected, builder.toQuery(createShardContext()));
400401

401402
String no_positions_json = "{ \"intervals\" : { \"" + NO_POSITIONS_FIELD + "\": { " +
@@ -422,7 +423,7 @@ public void testPrefixes() throws IOException {
422423
"\"prefix\" : { \"prefix\" : \"t\" } } } }";
423424
builder = (IntervalQueryBuilder) parseQuery(short_prefix_json);
424425
expected = new IntervalQuery(PREFIXED_FIELD, Intervals.or(
425-
Intervals.fixField(PREFIXED_FIELD + "._index_prefix", Intervals.wildcard("t?")),
426+
Intervals.fixField(PREFIXED_FIELD + "._index_prefix", Intervals.wildcard(new BytesRef("t?"))),
426427
Intervals.term("t")));
427428
assertEquals(expected, builder.toQuery(createShardContext()));
428429

@@ -454,7 +455,7 @@ public void testWildcard() throws IOException {
454455
"\"wildcard\" : { \"pattern\" : \"Te?m\" } } } }";
455456

456457
IntervalQueryBuilder builder = (IntervalQueryBuilder) parseQuery(json);
457-
Query expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.wildcard("te?m"));
458+
Query expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.wildcard(new BytesRef("te?m")));
458459
assertEquals(expected, builder.toQuery(createShardContext()));
459460

460461
String no_positions_json = "{ \"intervals\" : { \"" + NO_POSITIONS_FIELD + "\": { " +
@@ -468,14 +469,14 @@ public void testWildcard() throws IOException {
468469
"\"wildcard\" : { \"pattern\" : \"Te?m\", \"analyzer\" : \"keyword\" } } } }";
469470

470471
builder = (IntervalQueryBuilder) parseQuery(keyword_json);
471-
expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.wildcard("Te?m"));
472+
expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.wildcard(new BytesRef("Te?m")));
472473
assertEquals(expected, builder.toQuery(createShardContext()));
473474

474475
String fixed_field_json = "{ \"intervals\" : { \"" + STRING_FIELD_NAME + "\": { " +
475476
"\"wildcard\" : { \"pattern\" : \"Te?m\", \"use_field\" : \"masked_field\" } } } }";
476477

477478
builder = (IntervalQueryBuilder) parseQuery(fixed_field_json);
478-
expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.fixField(MASKED_FIELD, Intervals.wildcard("te?m")));
479+
expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.fixField(MASKED_FIELD, Intervals.wildcard(new BytesRef("te?m"))));
479480
assertEquals(expected, builder.toQuery(createShardContext()));
480481

481482
String fixed_field_json_no_positions = "{ \"intervals\" : { \"" + STRING_FIELD_NAME + "\": { " +
@@ -489,7 +490,8 @@ public void testWildcard() throws IOException {
489490
"\"wildcard\" : { \"pattern\" : \"Te?m\", \"use_field\" : \"masked_field\", \"analyzer\" : \"keyword\" } } } }";
490491

491492
builder = (IntervalQueryBuilder) parseQuery(fixed_field_analyzer_json);
492-
expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.fixField(MASKED_FIELD, Intervals.wildcard("Te?m")));
493+
expected = new IntervalQuery(STRING_FIELD_NAME, Intervals.fixField(MASKED_FIELD,
494+
Intervals.wildcard(new BytesRef("Te?m"))));
493495
assertEquals(expected, builder.toQuery(createShardContext()));
494496
}
495497

0 commit comments

Comments
 (0)