ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/build.xml
(Generate patch)

Comparing jsr166/build.xml (file contents):
Revision 1.163 by jsr166, Fri Feb 20 22:33:13 2015 UTC vs.
Revision 1.182 by jsr166, Sun Sep 13 17:46:07 2015 UTC

# Line 1 | Line 1
1 < <project name="jsr166" default="usage">
1 > <project name="jsr166" default="usage"
2 >  xmlns:if="ant:if" xmlns:unless="ant:unless">
3  
4    <description>
5   ------------------------------------------------------------------------------
# Line 28 | Line 29
29    Alternatively, define ant variables thus:
30    ant -Djdk$N.home=...
31    for $N in 6 7 8 9 ...
32 +
33 +  As of 2015-09, there is incomplete hacky support for jigsaw
34 +  Build for jigsaw using something like:
35 +  ant -Djdk9.home="$HOME/jdk/jigsaw" -Djdk9.src.dir="$HOME/jdk/src/jigsaw" clean test dist
36 +  "docs" target is still broken.
37   ------------------------------------------------------------------------------
38    </description>
39  
# Line 38 | Line 44
44      </java>
45    </target>
46  
47 +  <!-- HOWTO printf debug: <echo message="prop=${prop}"/> -->
48  
49    <!-- User-specific settings -->
50    <property file="user.properties"/>
# Line 52 | Line 59
59  
60    <!-- Tck options; see JSR166TestCase.java
61     To profile a single tck test class:
62 <   ant -Djsr166.profileTests=true -Djsr166.profileThreshold=100 -Djsr166.tckTestClass=CompletableFutureTest test-tck
62 >   ant -Djsr166.profileTests=true -Djsr166.profileThreshold=10 -Djsr166.tckTestClass=CompletableFutureTest tck
63     To stress test a single tck test class:
64 <   ant -Djsr166.tckTestClass=CountedCompleterTest -Djsr166.runsPerTest=100 test-tck
64 >   ant -Djsr166.tckTestClass=CountedCompleterTest -Djsr166.runsPerTest=100 tck
65    -->
66    <property name="jsr166.profileTests"     value="false"/>
67    <property name="jsr166.profileThreshold" value="100"/>
# Line 93 | Line 100
100      <property name="java@{v}"       location="${jdk@{v}.home}/bin/java"/>
101      <property name="javac@{v}"      location="${jdk@{v}.home}/bin/javac"/>
102      <property name="javadoc@{v}"    location="${jdk@{v}.home}/bin/javadoc"/>
103 <    <property name="jdk@{v}src.dir" location="${jdks.home}/src/jdk@{v}/jdk/src/share/classes"/>
103 >    <local name="have.java.base"/>
104 >    <available property="have.java.base"
105 >      file="${jdks.home}/src/jdk@{v}/jdk/src/java.base/share/classes" type="dir"/>
106 >    <property name="jdk@{v}src.dir" location="${jdks.home}/src/jdk@{v}/jdk/src/java.base/share/classes"
107 >      if:set="have.java.base"/>
108 >    <property name="jdk@{v}src.dir" location="${jdks.home}/src/jdk@{v}/jdk/src/share/classes"
109 >      unless:set="have.java.base"/>
110 >    <local name="modules"/>
111 >    <available property="modules" file="${jdk@{v}.home}/jmods" type="dir"/>
112      <local name="boot.jar.dir"/>
113 <    <property name="boot.jar.dir"   location="${jdk@{v}.home}/jre/lib"/>
114 <    <path id="bootclasspath@{v}">
113 >    <property name="boot.jar.dir"   location="${jdk@{v}.home}/jre/lib" unless:set="modules"/>
114 >    <path id="bootclasspath@{v}" unless:set="modules">
115        <pathelement path="${boot.jar.dir}/resources.jar"/>
116        <pathelement path="${boot.jar.dir}/rt.jar"/>
117        <pathelement path="${boot.jar.dir}/jsse.jar"/>
118        <pathelement path="${boot.jar.dir}/jce.jar"/>
119        <pathelement path="${boot.jar.dir}/charsets.jar"/>
120      </path>
121 <    <property name="bootclasspath@{v}" value="${toString:bootclasspath@{v}}"/>
121 >    <property name="bootclasspath@{v}" value="${toString:bootclasspath@{v}}" unless:set="modules"/>
122      </sequential>
123    </macrodef>
124  
# Line 129 | Line 144
144    <property name="test.src.dir"         location="${basedir}/src/test"/>
145    <property name="loops.src.dir"        location="${basedir}/src/loops"/>
146    <property name="tck.src.dir"          location="${test.src.dir}/tck"/>
147 <  <property name="jtreg.src.dir"        location="${test.src.dir}/jtreg"/>
147 >  <property name="jtreg7.src.dir"       location="${test.src.dir}/jtreg-jdk7"/>
148 >  <property name="jtreg8.src.dir"       location="${test.src.dir}/jtreg"/>
149 >  <property name="jtreg9.src.dir"       location="${test.src.dir}/jtreg"/>
150 >  <property name="jtreg.src.dir"        location="${jtreg9.src.dir}"/>
151    <property name="lib.dir"              location="${basedir}/lib"/>
152    <property name="dist.dir"             location="${basedir}/dist"/>
153    <property name="topsrc.dir"           location="${basedir}/src"/>
# Line 201 | Line 219
219      <attribute name="classes"/>
220      <attribute name="jvmflags" default="-ea -esa -Djsr166.testImplementationDetails=true"/>
221      <element name="javac-elements" optional="true"/>
222 +
223      <sequential>
224  
225 +    <local name="modules"/>
226 +    <condition property="modules">
227 +      <available file="${jdk@{compile-target}.home}/jmods" type="dir"/>
228 +    </condition>
229 +
230      <mkdir dir="@{workdir}/tck-classes"/>
231  
232      <javac srcdir="@{tck.src.dir}"
# Line 221 | Line 245
245        <include name="*.java"/>
246        <compilerarg value="-XDignore.symbol.file=true"/>
247        <compilerarg value="-Xlint:all,-unchecked,-rawtypes,-serial,-deprecation"/>
248 <      <compilerarg value="-Xbootclasspath/p:@{classes}"/>
248 >      <compilerarg value="-Xbootclasspath/p:@{classes}" unless:set="modules"/>
249 >      <compilerarg value="-Xoverride:${build.classes.dir}" if:set="modules"/>
250        <compilerarg line="${build.args}"/>
251        <javac-elements/>
252  
# Line 231 | Line 256
256            failonerror="true"
257            jvm="${java@{target}}"
258            fork="true">
259 <        <jvmarg value="-Xbootclasspath/p:@{classes}"/>
259 >        <jvmarg value="-Xbootclasspath/p:@{classes}" unless:set="modules"/>
260 >        <jvmarg value="-Xoverride:${build.classes.dir}" if:set="modules"/>
261          <jvmarg line="@{jvmflags}"/>
262  
263 <        <!-- ant -Djava.util.concurrent.ForkJoinPool.common.parallelism=1 test-tck -->
263 >        <!-- ant -Djava.util.concurrent.ForkJoinPool.common.parallelism=1 tck -->
264          <syspropertyset id="java.util.concurrent.ForkJoinPool-properties">
265            <propertyref prefix="java.util.concurrent.ForkJoinPool"/>
266          </syspropertyset>
# Line 251 | Line 277
277      </sequential>
278    </macrodef>
279  
280 +  <!-- Define jtreg test sets for different jdk versions -->
281 +  <fileset dir="${jtreg9.src.dir}">
282 +    <patternset id="jdk9.jtreg.tests">
283 +      <include name="**/*.java"/>
284 +    </patternset>
285 +  </fileset>
286 +
287 +  <fileset dir="${jtreg8.src.dir}">
288 +    <patternset id="jdk8.jtreg.tests">
289 +      <include name="**/*.java"/>
290 +      <exclude name="**/SpliteratorCharacteristics.java"/>
291 +      <!-- https://bugs.openjdk.java.net/browse/JDK-6842353 -->
292 +      <exclude name="**/GCDuringIteration.java"/>
293 +    </patternset>
294 +  </fileset>
295 +
296 +  <fileset dir="${jtreg7.src.dir}">
297 +    <patternset id="jdk7.jtreg.tests">
298 +      <include name="**/*.java"/>
299 +    </patternset>
300 +  </fileset>
301 +
302    <macrodef name="run-jtreg-tests">
303 <    <!-- ant -Djtreg.src.dir=src/test/jtreg/util/concurrent/CompletableFuture test-jtreg -->
256 <    <attribute name="jtreg.src.dir" default="${jtreg.src.dir}"/>
303 >    <!-- ant -Djtreg9.src.dir=src/test/jtreg/util/concurrent/CompletableFuture jtreg -->
304      <attribute name="source" default="7"/>
305      <attribute name="target"/>
306      <attribute name="workdir"/>
307      <attribute name="classes"/>
308      <attribute name="jtregflags" default=""/>
309 +
310      <sequential>
311 +
312 +    <local name="modules"/>
313 +    <condition property="modules">
314 +      <available file="${jdk@{target}.home}/jmods" type="dir"/>
315 +    </condition>
316 +
317      <delete dir="@{workdir}/JTwork"   quiet="true"/>
318      <delete dir="@{workdir}/JTreport" quiet="true"/>
319      <mkdir dir="@{workdir}/JTwork/scratch"/>
320      <mkdir dir="@{workdir}/JTreport"/>
321 <    <jtreg dir="@{jtreg.src.dir}"
321 >    <jtreg dir="${jtreg@{target}.src.dir}"
322             jdk="${jdk@{target}.home}"
323             workDir="@{workdir}/JTwork"
324             reportDir="@{workdir}/JTreport">
325 <
326 <      <arg value="-Xbootclasspath/p:@{classes}"/>
325 >      <patternset refid="jdk@{target}.jtreg.tests"/>
326 >      <arg value="-Xbootclasspath/p:@{classes}" unless:set="modules"/>
327 >      <arg value="-Xoverride:${build.classes.dir}" if:set="modules"/>
328        <arg value="-agentvm"/>
329        <arg value="-v:nopass,fail"/>
330        <arg value="-vmoptions:-esa -ea"/>
# Line 302 | Line 357
357            depends="configure-compiler"
358            description="Compiles src/main sources to build dir">
359  
360 <    <mkdir dir="${build.classes.dir}"/>
360 >    <local name="modules"/>
361 >    <condition property="modules">
362 >      <and>
363 >        <available file="${jdk9.home}/jmods" type="dir"/>
364 >        <equals arg1="9" arg2="${build.main.java.version}"/>
365 >      </and>
366 >    </condition>
367 >
368 >    <local name="destdir"/>
369 >    <property name="destdir" value="${build.classes.dir}/java.base" if:set="modules"/>
370 >    <property name="destdir" value="${build.classes.dir}" unless:set="modules"/>
371 >
372 >    <mkdir dir="${destdir}"/>
373  
374      <javac srcdir="${src.dir}"
375 <           destdir="${build.classes.dir}"
375 >           destdir="${destdir}"
376             debug="${build.debug}"
377             debuglevel="${build.debuglevel}"
378             deprecation="${build.deprecation}"
# Line 316 | Line 383
383             fork="true">
384  
385        <include name="**/*.java"/>
386 +      <compilerarg value="-Xmodule:java.base" if:set="modules"/>
387        <compilerarg value="-Xprefer:source"/>
388        <compilerarg value="-XDignore.symbol.file=true"/>
389        <compilerarg value="-Xlint:all"/>
390 +      <compilerarg value="-Werror"/>
391        <compilerarg value="-Xdoclint:all/protected"/>
392        <compilerarg line="-Xmaxerrs 1000 -Xmaxwarns 1000"/>
393        <compilerarg line="${build.args}"/>
# Line 333 | Line 402
402  
403      <jar destfile="${product.jar}">
404        <fileset dir="${build.classes.dir}"/>
405 +      <manifest>
406 +        <attribute name="Built-By" value="${user.name}"/>
407 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
408 +      </manifest>
409      </jar>
410    </target>
411  
# Line 360 | Line 433
433        <arg line="-Xdocrootparent ${java9.docroot.url}"/>
434        <arg line="-Xmaxerrs 1000 -Xmaxwarns 1000"/>
435        <arg value="-XDignore.symbol.file=true"/>
436 + <!--  TODO     <arg value="-Xmodule:java.base"/> -->
437        <arg value="-tag"/>
438        <arg value="${javadoc.jls.option}"/>
439        <arg value="-tag"/>
# Line 391 | Line 465
465        <exclude name="src/emulation/**"/>
466        <exclude name="**/SyntaxTest.java"/>
467        <exclude name="**/SuperfluousAbstract.java"/>
468 +      <manifest>
469 +        <attribute name="Built-By" value="${user.name}"/>
470 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
471 +      </manifest>
472      </jar>
473    </target>
474  
# Line 422 | Line 500
500      <mirror-dir src="${docs.dir}" dst="${dist.docs.dir}"/>
501    </target>
502  
503 <  <target name="tck" depends="test-tck" description="alias for test-tck"/>
426 <  <target name="test-tck"
503 >  <target name="tck"
504            depends="jar"
505            description="Runs tck tests for main directly">
506  
# Line 433 | Line 510
510        classes="${product.jar}"/>
511    </target>
512  
513 <  <target name="test-tck-parallelism-1"
514 <          description="Runs test-tck with given common pool parallelism">
515 <    <antcall target="test-tck">
513 >  <target name="tck-parallelism-1"
514 >          description="Runs tck with given common pool parallelism">
515 >    <antcall target="tck">
516        <param name="java.util.concurrent.ForkJoinPool.common.parallelism" value="1"/>
517      </antcall>
518    </target>
519  
520 <  <target name="test-tck-parallelism-0"
521 <          description="Runs test-tck with given common pool parallelism">
522 <    <antcall target="test-tck">
520 >  <target name="tck-parallelism-0"
521 >          description="Runs tck with given common pool parallelism">
522 >    <antcall target="tck">
523        <param name="java.util.concurrent.ForkJoinPool.common.parallelism" value="0"/>
524      </antcall>
525    </target>
526  
527 <  <target name="jtreg" depends="test-jtreg" description="alias for test-jtreg"/>
451 <  <target name="test-jtreg"
527 >  <target name="jtreg"
528            depends="jar"
529            description="Runs jtreg tests for main using the jtreg ant task">
530      <run-jtreg-tests
# Line 458 | Line 534
534    </target>
535  
536    <target name="test"
537 <          depends="test-tck, test-tck-parallelism-1, test-jtreg"
537 >          depends="tck, tck-parallelism-1, jtreg"
538            description="Runs tck and jtreg tests for main">
539    </target>
540  
541 +  <target name="jtreg8" description="Runs jtreg tests with jdk8">
542 +
543 +    <antcall target="jtreg">
544 +      <param name="build.main.java.version" value="8"/>
545 +      <param name="build.main.javac" value="${javac8}"/>
546 +    </antcall>
547 +
548 +  </target>
549 +
550    <target name="test89"
551            description="Runs tck and jtreg tests for main for multiple java versions">
552  
# Line 482 | Line 567
567  
568  
569    <target name="configure-compiler">
570 +    <fail message="ant version too old">
571 +      <condition>
572 +        <not> <antversion atleast="1.9.1"/> </not>
573 +      </condition>
574 +    </fail>
575  
576      <property name="unchecked.option" value="-Xlint:unchecked"/>
577  
# Line 528 | Line 618
618    </target>
619  
620  
621 +  <target name="compile-test-loops" depends="jar"
622 +          description="compile all the perf tests in src/test/loops">
623 +
624 +    <mkdir dir="${build.dir}/test/loops"/>
625 +
626 +    <javac srcdir="${basedir}/src/test/loops"
627 +           destdir="${build.dir}/test/loops"
628 +           debug="${build.debug}"
629 +           debuglevel="${build.debuglevel}"
630 +           deprecation="${build.deprecation}"
631 +           includeAntRuntime="false"
632 +           includeJavaRuntime="false"
633 +           executable="${javac9}"
634 +           fork="true">
635 +
636 +      <include name="*.java"/>
637 +      <compilerarg value="-XDignore.symbol.file=true"/>
638 +      <compilerarg value="-Xlint:all,-unchecked,-rawtypes,-serial"/>
639 +      <compilerarg value="-Xbootclasspath/p:${product.jar}"/>
640 +      <compilerarg line="${build.args}"/>
641 +
642 +    </javac>
643 +
644 +  </target>
645 +
646 +
647    <!-- jsr166 4jdk7 -->
648  
649    <target name="4jdk7compile"
# Line 553 | Line 669
669        <compilerarg value="-Xprefer:source"/>
670        <compilerarg value="-XDignore.symbol.file=true"/>
671        <compilerarg value="-Xlint:all"/>
672 +      <compilerarg value="-Werror"/>
673        <compilerarg line="${build.args}"/>
674  
675      </javac>
# Line 594 | Line 711
711  
712      <jar destfile="${4jdk7product.jar}">
713        <fileset dir="${build.4jdk7.classes.dir}"/>
714 +      <manifest>
715 +        <attribute name="Built-By" value="${user.name}"/>
716 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
717 +      </manifest>
718      </jar>
719  
720    </target>
721  
722  
723 <  <target name="4jdk7-test-tck"
723 >  <target name="4jdk7-tck"
724            depends="4jdk7jar"
725            description="Runs tck tests for jsr166-4jdk7 directly">
726  
# Line 611 | Line 732
732          <!-- JDK8+ test classes -->
733          <exclude name="*8Test.java"/>
734          <exclude name="*9Test.java"/>
735 +        <exclude name="*10Test.java"/>
736          <exclude name="DoubleAccumulatorTest.java"/>
737          <exclude name="DoubleAdderTest.java"/>
738          <exclude name="LongAccumulatorTest.java"/>
# Line 618 | Line 740
740          <exclude name="CompletableFutureTest.java"/>
741          <exclude name="SplittableRandomTest.java"/>
742          <exclude name="StampedLockTest.java"/>
743 +        <exclude name="SubmissionPublisherTest.java"/>
744        </javac-elements>
745      </run-tck-tests>
746    </target>
747  
748  
749 <  <target name="4jdk7-test-tck-junit"
749 >  <target name="4jdk7-tck-junit"
750            depends="4jdk7compile"
751            description="Runs tck tests for jsr166-4jdk7 via junit task (experimental)">
752  
# Line 651 | Line 774
774      </junit>
775    </target>
776  
777 <  <target name="4jdk7-test-jtreg"
777 >  <target name="4jdk7-jtreg"
778            depends="4jdk7jar"
779            description="Runs jtreg tests for jsr166-4jdk7 using the jtreg ant task">
780      <run-jtreg-tests
781         target="7"
782         workdir="${build.4jdk7.dir}"
783 <       classes="${4jdk7product.jar}"
661 <       jtregflags="-exclude:${jtreg.src.dir}/jdk8tests"/>
783 >       classes="${4jdk7product.jar}"/>
784    </target>
785  
786  
787    <target name="4jdk7-test"
788 <          depends="4jdk7-test-tck, 4jdk7-test-jtreg"
788 >          depends="4jdk7-tck, 4jdk7-jtreg"
789            description="Runs tck and jtreg tests for jsr166-4jdk7">
790    </target>
791  
# Line 740 | Line 862
862        <include name="jsr166x/**/*.java"/>
863        <compilerarg value="-XDignore.symbol.file=true"/>
864        <compilerarg value="-Xlint:all,-unchecked,-rawtypes"/>
865 +      <compilerarg value="-Werror"/>
866        <compilerarg line="${build.args}"/>
867  
868      </javac>
# Line 752 | Line 875
875  
876      <jar destfile="${jsr166x.jar}">
877        <fileset dir="${build.jsr166x.classes.dir}"/>
878 +      <manifest>
879 +        <attribute name="Built-By" value="${user.name}"/>
880 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
881 +      </manifest>
882      </jar>
883  
884    </target>
# Line 826 | Line 953
953        <include name="jsr166y/**/*.java"/>
954        <compilerarg value="-XDignore.symbol.file=true"/>
955        <compilerarg value="-Xlint:all"/>
956 +      <compilerarg value="-Werror"/>
957        <compilerarg line="${build.args}"/>
958  
959      </javac>
# Line 838 | Line 966
966  
967      <jar destfile="${jsr166y.jar}" index="true">
968        <fileset dir="${build.jsr166y.classes.dir}"/>
969 +      <manifest>
970 +        <attribute name="Built-By" value="${user.name}"/>
971 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
972 +      </manifest>
973      </jar>
974  
975    </target>
# Line 913 | Line 1045
1045        <include name="extra166y/**/*.java"/>
1046        <compilerarg value="-XDignore.symbol.file=true"/>
1047        <compilerarg value="-Xlint:all,-unchecked,-rawtypes,-serial"/>
1048 +      <compilerarg value="-Werror"/>
1049        <compilerarg line="${build.args}"/>
1050  
1051      </javac>
# Line 925 | Line 1058
1058  
1059      <jar destfile="${extra166y.jar}" index="true">
1060        <fileset dir="${build.extra166y.classes.dir}"/>
1061 +      <manifest>
1062 +        <attribute name="Built-By" value="${user.name}"/>
1063 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
1064 +      </manifest>
1065      </jar>
1066  
1067    </target>
# Line 1000 | Line 1137
1137        <include name="jsr166e/**/*.java"/>
1138        <compilerarg value="-XDignore.symbol.file=true"/>
1139        <compilerarg value="-Xlint:all"/>
1140 +      <compilerarg value="-Werror"/>
1141        <compilerarg line="${build.args}"/>
1142  
1143      </javac>
# Line 1026 | Line 1164
1164        <include name="jsr166e/**/*.java"/>
1165        <compilerarg value="-XDignore.symbol.file=true"/>
1166        <compilerarg value="-Xlint:all"/>
1167 +      <compilerarg value="-Werror"/>
1168        <compilerarg value="-Xdoclint:all/protected"/>
1169  
1170      </javac>
# Line 1038 | Line 1177
1177  
1178      <jar destfile="${jsr166e.jar}" index="true">
1179        <fileset dir="${build.jsr166e.classes.dir}"/>
1180 +      <manifest>
1181 +        <attribute name="Built-By" value="${user.name}"/>
1182 +        <attribute name="Implementation-Vendor" value="JCP JSR-166 Expert Group."/>
1183 +      </manifest>
1184      </jar>
1185  
1186    </target>
# Line 1063 | Line 1206
1206    </target>
1207  
1208  
1209 <  <target name="jsr166e-test-tck-one-java-version"
1209 >  <target name="jsr166e-tck-one-java-version"
1210            depends="jsr166ejar">
1211  
1212      <echo message="Testing with jdk${build.jsr166e.java.version} ..."/>
# Line 1075 | Line 1218
1218        classes="${jsr166e.jar}"/>
1219    </target>
1220  
1221 <  <target name="jsr166e-test-tck"
1221 >  <target name="jsr166e-tck"
1222            description="Runs tck tests for jsr166e for multiple java versions">
1223  
1224   <!--     <antcall target="clean"/> -->
1225 < <!--     <antcall target="jsr166e-test-tck-one-java-version"> -->
1225 > <!--     <antcall target="jsr166e-tck-one-java-version"> -->
1226   <!--       <param name="build.jsr166e.java.version" value="8"/> -->
1227   <!--       <param name="build.jsr166e.javac" value="${javac8}"/> -->
1228   <!--     </antcall> -->
1229  
1230      <antcall target="clean"/>
1231 <    <antcall target="jsr166e-test-tck-one-java-version">
1231 >    <antcall target="jsr166e-tck-one-java-version">
1232        <param name="build.jsr166e.java.version" value="7"/>
1233        <param name="build.jsr166e.javac" value="${javac7}"/>
1234      </antcall>
1235  
1236      <antcall target="clean"/>
1237 <    <antcall target="jsr166e-test-tck-one-java-version">
1237 >    <antcall target="jsr166e-tck-one-java-version">
1238        <param name="build.jsr166e.java.version" value="6"/>
1239        <param name="build.jsr166e.javac" value="${javac6}"/>
1240      </antcall>
# Line 1099 | Line 1242
1242  
1243  
1244    <target name="jsr166e-test"
1245 <          depends="jsr166e-test-tck"
1245 >          depends="jsr166e-tck"
1246            description="Runs all tests for jsr166e">
1247    </target>
1248  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines