# HG changeset patch # User prr # Date 1483991826 28800 # Node ID 65e2b10e8e809a47cc876dbcd0def27840097ac4 # Parent 05e2611ebff6a9141d8e720eeae3f9c6bfcf460d# Parent ab2c8b03c3284fcbdd157551a66f807e3a182d9b Merge diff -r 05e2611ebff6 -r 65e2b10e8e80 .hgtags --- a/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -392,3 +392,5 @@ f4e854a77aa38749bd90f722b06974a56e7233d5 jdk-9+147 5c71ea43933b6c7e8a85eb1a4eb2213011b95d82 jdk-9+148 cf139f925da04c8bd7efd33270a0315d72b338d3 jdk-9+149 +17469f16fbb406ec9f0dd262ce776ab6efbc38f1 jdk-9+150 +37b95df0042ae0687324e1f7dc4a2519e230e704 jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 .hgtags-top-repo --- a/.hgtags-top-repo Fri Jan 06 16:50:50 2017 +0530 +++ b/.hgtags-top-repo Mon Jan 09 11:57:06 2017 -0800 @@ -392,3 +392,5 @@ 5f6920274c48eb00d31afee6c034826a754c13d9 jdk-9+147 3ffc3e886c74736e387f3685e86b557cdea706c8 jdk-9+148 b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149 +6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150 +71a766d4c18041a7f833ee22823125b02e1a7f1e jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/boot-jdk.m4 --- a/common/autoconf/boot-jdk.m4 Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/boot-jdk.m4 Mon Jan 09 11:57:06 2017 -0800 @@ -305,9 +305,8 @@ BOOT_JDK_SOURCETARGET="-source 8 -target 8" AC_SUBST(BOOT_JDK_SOURCETARGET) - ADD_JVM_ARG_IF_OK([--patch-module foo=bar], dummy, [$JAVA]) AC_MSG_CHECKING([if Boot JDK supports modules]) - if test "x$JVM_ARG_OK" = "xtrue"; then + if "$JAVA" --list-modules > /dev/null 2>&1; then AC_MSG_RESULT([yes]) BOOT_JDK_MODULAR="true" else diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/flags.m4 --- a/common/autoconf/flags.m4 Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/flags.m4 Mon Jan 09 11:57:06 2017 -0800 @@ -147,15 +147,6 @@ EXTRA_CXXFLAGS="$with_extra_cxxflags" EXTRA_LDFLAGS="$with_extra_ldflags" - # Hotspot needs these set in their legacy form - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $EXTRA_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $EXTRA_CXXFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $EXTRA_LDFLAGS" - - AC_SUBST(LEGACY_EXTRA_CFLAGS) - AC_SUBST(LEGACY_EXTRA_CXXFLAGS) - AC_SUBST(LEGACY_EXTRA_LDFLAGS) - AC_SUBST(EXTRA_CFLAGS) AC_SUBST(EXTRA_CXXFLAGS) AC_SUBST(EXTRA_LDFLAGS) @@ -192,10 +183,6 @@ $1SYSROOT_CFLAGS="-isysroot [$]$1SYSROOT" $1SYSROOT_LDFLAGS="-isysroot [$]$1SYSROOT" fi - # Propagate the sysroot args to hotspot - $1LEGACY_EXTRA_CFLAGS="[$]$1LEGACY_EXTRA_CFLAGS [$]$1SYSROOT_CFLAGS" - $1LEGACY_EXTRA_CXXFLAGS="[$]$1LEGACY_EXTRA_CXXFLAGS [$]$1SYSROOT_CFLAGS" - $1LEGACY_EXTRA_LDFLAGS="[$]$1LEGACY_EXTRA_LDFLAGS [$]$1SYSROOT_LDFLAGS" # The global CFLAGS and LDFLAGS variables need these for configure to function $1CFLAGS="[$]$1CFLAGS [$]$1SYSROOT_CFLAGS" $1CPPFLAGS="[$]$1CPPFLAGS [$]$1SYSROOT_CFLAGS" diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/generated-configure.sh --- a/common/autoconf/generated-configure.sh Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/generated-configure.sh Mon Jan 09 11:57:06 2017 -0800 @@ -854,9 +854,6 @@ EXTRA_LDFLAGS EXTRA_CXXFLAGS EXTRA_CFLAGS -LEGACY_EXTRA_LDFLAGS -LEGACY_EXTRA_CXXFLAGS -LEGACY_EXTRA_CFLAGS EXE_SUFFIX OBJ_SUFFIX STATIC_LIBRARY @@ -5170,7 +5167,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1482168759 +DATE_WHEN_GENERATED=1483542685 ############################################################################### # @@ -24677,7 +24674,7 @@ else if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then # Default is 0, if unspecified - VERSION_MINOR=0 + VERSION_MINOR=$DEFAULT_VERSION_MINOR fi fi @@ -24724,7 +24721,7 @@ else if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then # Default is 0, if unspecified - VERSION_SECURITY=0 + VERSION_SECURITY=$DEFAULT_VERSION_SECURITY fi fi @@ -24771,7 +24768,7 @@ else if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then # Default is 0, if unspecified - VERSION_PATCH=0 + VERSION_PATCH=$DEFAULT_VERSION_PATCH fi fi @@ -30665,24 +30662,9 @@ BOOT_JDK_SOURCETARGET="-source 8 -target 8" - - $ECHO "Check if jvm arg is ok: --patch-module foo=bar" >&5 - $ECHO "Command: $JAVA --patch-module foo=bar -version" >&5 - OUTPUT=`$JAVA --patch-module foo=bar -version 2>&1` - FOUND_WARN=`$ECHO "$OUTPUT" | $GREP -i warn` - FOUND_VERSION=`$ECHO $OUTPUT | $GREP " version \""` - if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then - dummy="$dummy --patch-module foo=bar" - JVM_ARG_OK=true - else - $ECHO "Arg failed:" >&5 - $ECHO "$OUTPUT" >&5 - JVM_ARG_OK=false - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Boot JDK supports modules" >&5 $as_echo_n "checking if Boot JDK supports modules... " >&6; } - if test "x$JVM_ARG_OK" = "xtrue"; then + if "$JAVA" --list-modules > /dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOT_JDK_MODULAR="true" @@ -31305,8 +31287,6 @@ as_fn_error $? "--enable-static-build is only supported for macosx builds" "$LINENO" 5 fi STATIC_BUILD_CFLAGS="-DSTATIC_BUILD=1" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $STATIC_BUILD_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $STATIC_BUILD_CFLAGS" CFLAGS_JDKLIB_EXTRA="$CFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" CXXFLAGS_JDKLIB_EXTRA="$CXXFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" STATIC_BUILD=true @@ -31508,15 +31488,6 @@ EXTRA_CXXFLAGS="$with_extra_cxxflags" EXTRA_LDFLAGS="$with_extra_ldflags" - # Hotspot needs these set in their legacy form - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $EXTRA_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $EXTRA_CXXFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $EXTRA_LDFLAGS" - - - - - @@ -31548,10 +31519,6 @@ SYSROOT_CFLAGS="-isysroot $SYSROOT" SYSROOT_LDFLAGS="-isysroot $SYSROOT" fi - # Propagate the sysroot args to hotspot - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $SYSROOT_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $SYSROOT_CFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $SYSROOT_LDFLAGS" # The global CFLAGS and LDFLAGS variables need these for configure to function CFLAGS="$CFLAGS $SYSROOT_CFLAGS" CPPFLAGS="$CPPFLAGS $SYSROOT_CFLAGS" @@ -44068,10 +44035,6 @@ BUILD_SYSROOT_CFLAGS="-isysroot $BUILD_SYSROOT" BUILD_SYSROOT_LDFLAGS="-isysroot $BUILD_SYSROOT" fi - # Propagate the sysroot args to hotspot - BUILD_LEGACY_EXTRA_CFLAGS="$BUILD_LEGACY_EXTRA_CFLAGS $BUILD_SYSROOT_CFLAGS" - BUILD_LEGACY_EXTRA_CXXFLAGS="$BUILD_LEGACY_EXTRA_CXXFLAGS $BUILD_SYSROOT_CFLAGS" - BUILD_LEGACY_EXTRA_LDFLAGS="$BUILD_LEGACY_EXTRA_LDFLAGS $BUILD_SYSROOT_LDFLAGS" # The global CFLAGS and LDFLAGS variables need these for configure to function BUILD_CFLAGS="$BUILD_CFLAGS $BUILD_SYSROOT_CFLAGS" BUILD_CPPFLAGS="$BUILD_CPPFLAGS $BUILD_SYSROOT_CFLAGS" @@ -52794,9 +52757,8 @@ $as_echo "yes" >&6; } GCOV_CFLAGS="-fprofile-arcs -ftest-coverage -fno-inline" GCOV_LDFLAGS="-fprofile-arcs" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $GCOV_LDFLAGS" + JVM_CFLAGS="$JVM_CFLAGS $GCOV_CFLAGS" + JVM_LDFLAGS="$JVM_LDFLAGS $GCOV_LDFLAGS" CFLAGS_JDKLIB="$CFLAGS_JDKLIB $GCOV_CFLAGS" CFLAGS_JDKEXE="$CFLAGS_JDKEXE $GCOV_CFLAGS" CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $GCOV_CFLAGS" @@ -52997,7 +52959,7 @@ $as_echo "no, forced" >&6; } BUILD_GTEST="false" elif test "x$enable_hotspot_gtest" = "x"; then - if test "x$GTEST_DIR_EXISTS" = "xtrue" && test "x$OPENJDK_TARGET_OS" != "xaix"; then + if test "x$GTEST_DIR_EXISTS" = "xtrue"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BUILD_GTEST="true" diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/hotspot.m4 --- a/common/autoconf/hotspot.m4 Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/hotspot.m4 Mon Jan 09 11:57:06 2017 -0800 @@ -481,7 +481,7 @@ AC_MSG_RESULT([no, forced]) BUILD_GTEST="false" elif test "x$enable_hotspot_gtest" = "x"; then - if test "x$GTEST_DIR_EXISTS" = "xtrue" && test "x$OPENJDK_TARGET_OS" != "xaix"; then + if test "x$GTEST_DIR_EXISTS" = "xtrue"; then AC_MSG_RESULT([yes]) BUILD_GTEST="true" else diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/jdk-options.m4 --- a/common/autoconf/jdk-options.m4 Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/jdk-options.m4 Mon Jan 09 11:57:06 2017 -0800 @@ -320,9 +320,8 @@ AC_MSG_RESULT([yes]) GCOV_CFLAGS="-fprofile-arcs -ftest-coverage -fno-inline" GCOV_LDFLAGS="-fprofile-arcs" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $GCOV_CFLAGS" - LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $GCOV_LDFLAGS" + JVM_CFLAGS="$JVM_CFLAGS $GCOV_CFLAGS" + JVM_LDFLAGS="$JVM_LDFLAGS $GCOV_LDFLAGS" CFLAGS_JDKLIB="$CFLAGS_JDKLIB $GCOV_CFLAGS" CFLAGS_JDKEXE="$CFLAGS_JDKEXE $GCOV_CFLAGS" CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $GCOV_CFLAGS" @@ -360,8 +359,6 @@ AC_MSG_ERROR([--enable-static-build is only supported for macosx builds]) fi STATIC_BUILD_CFLAGS="-DSTATIC_BUILD=1" - LEGACY_EXTRA_CFLAGS="$LEGACY_EXTRA_CFLAGS $STATIC_BUILD_CFLAGS" - LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $STATIC_BUILD_CFLAGS" CFLAGS_JDKLIB_EXTRA="$CFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" CXXFLAGS_JDKLIB_EXTRA="$CXXFLAGS_JDKLIB_EXTRA $STATIC_BUILD_CFLAGS" STATIC_BUILD=true diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/jdk-version.m4 --- a/common/autoconf/jdk-version.m4 Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/jdk-version.m4 Mon Jan 09 11:57:06 2017 -0800 @@ -226,7 +226,7 @@ else if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then # Default is 0, if unspecified - VERSION_MINOR=0 + VERSION_MINOR=$DEFAULT_VERSION_MINOR fi fi @@ -248,7 +248,7 @@ else if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then # Default is 0, if unspecified - VERSION_SECURITY=0 + VERSION_SECURITY=$DEFAULT_VERSION_SECURITY fi fi @@ -270,7 +270,7 @@ else if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then # Default is 0, if unspecified - VERSION_PATCH=0 + VERSION_PATCH=$DEFAULT_VERSION_PATCH fi fi diff -r 05e2611ebff6 -r 65e2b10e8e80 common/autoconf/version-numbers --- a/common/autoconf/version-numbers Fri Jan 06 16:50:50 2017 +0530 +++ b/common/autoconf/version-numbers Mon Jan 09 11:57:06 2017 -0800 @@ -26,6 +26,9 @@ # Default version numbers to use unless overridden by configure DEFAULT_VERSION_MAJOR=9 +DEFAULT_VERSION_MINOR=0 +DEFAULT_VERSION_SECURITY=0 +DEFAULT_VERSION_PATCH=0 LAUNCHER_NAME=openjdk PRODUCT_NAME=OpenJDK diff -r 05e2611ebff6 -r 65e2b10e8e80 common/bin/print-config.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/bin/print-config.js Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * This little utility can be used to expand the jib-profiles configuration + * files into plain json. + * + * Usage: + * + * jjs -scripting print-config.js -- [] + * + */ + +var file = $ARG[0]; +if (file == null) { + file = new java.io.File(__DIR__, "../conf/jib-profiles.js").getCanonicalPath(); +} +load(file); +var input = {}; +input.get = function(dependencyName, attribute) { + return "\${" + dependencyName + "." + attribute + "}"; +}; +print(JSON.stringify(getJibProfiles(input), null, 2)); diff -r 05e2611ebff6 -r 65e2b10e8e80 common/conf/jib-profiles.js --- a/common/conf/jib-profiles.js Fri Jan 06 16:50:50 2017 +0530 +++ b/common/conf/jib-profiles.js Mon Jan 09 11:57:06 2017 -0800 @@ -55,6 +55,7 @@ * be provided: * * input.profile + * input.build_id * input.target_os * input.target_cpu * input.build_os @@ -181,11 +182,14 @@ var data = {}; - // Identifies the version of this format to the tool reading it - data.format_version = "1.0"; + // Identifies the version of this format to the tool reading it. + // 1.1 signifies that the publish, publish-src and get-src features are usable. + data.format_version = "1.1"; - // Organization is used when uploading/publishing build results - data.organization = "com.oracle.jpg.jdk"; + // Organization, product and version are used when uploading/publishing build results + data.organization = ""; + data.product = "jdk"; + data.version = getVersion(); // The base directory for the build output. JIB will assume that the // actual build directory will be / @@ -195,12 +199,18 @@ // The make argument to use to specify the name of the configuration data.configuration_make_arg = "CONF_NAME="; + // Exclude list to use when Jib creates a source bundle + data.src_bundle_excludes = "./build webrev .hg */.hg */*/.hg */*/*/.hg"; + // Include list to use when creating a minimal jib source bundle which + // contains just the jib configuration files. + data.conf_bundle_includes = "*/conf/jib-profiles.* common/autoconf/version-numbers" + // Define some common values - var common = getJibProfilesCommon(input); + var common = getJibProfilesCommon(input, data); // Generate the profiles part of the configuration - data.profiles = getJibProfilesProfiles(input, common); + data.profiles = getJibProfilesProfiles(input, common, data); // Generate the dependencies part of the configuration - data.dependencies = getJibProfilesDependencies(input, common); + data.dependencies = getJibProfilesDependencies(input, common, data); return data; }; @@ -211,18 +221,169 @@ * @param input External data to use for generating the configuration * @returns Common values */ -var getJibProfilesCommon = function (input) { +var getJibProfilesCommon = function (input, data) { var common = {}; - common.dependencies = ["boot_jdk", "gnumake", "jtreg"], - common.default_make_targets = ["product-bundles", "test-bundles"], - common.default_make_targets_debug = common.default_make_targets; - common.default_make_targets_slowdebug = common.default_make_targets; - common.configure_args = ["--enable-jtreg-failure-handler"], - common.configure_args_32bit = ["--with-target-bits=32"], - common.configure_args_debug = ["--enable-debug"], - common.configure_args_slowdebug = ["--with-debug-level=slowdebug"], - common.organization = "jpg.infra.builddeps" + common.organization = "jpg.infra.builddeps"; + common.build_id = getBuildId(input); + common.build_number = input.build_number != null ? input.build_number : "0"; + + // List of the main profile names used for iteration + common.main_profile_names = [ + "linux-x64", "linux-x86", "macosx-x64", "solaris-x64", + "solaris-sparcv9", "windows-x64", "windows-x86" + ]; + + // These are the base setttings for all the main build profiles. + common.main_profile_base = { + dependencies: ["boot_jdk", "gnumake", "jtreg"], + default_make_targets: ["product-bundles", "test-bundles"], + configure_args: [ + "--with-version-opt=" + common.build_id, + "--enable-jtreg-failure-handler", + "--with-version-build=" + common.build_number + ] + }; + // Extra settings for debug profiles + common.debug_suffix = "-debug"; + common.debug_profile_base = { + configure_args: ["--enable-debug"], + labels: "debug" + }; + // Extra settings for slowdebug profiles + common.slowdebug_suffix = "-slowdebug"; + common.slowdebug_profile_base = { + configure_args: ["--with-debug-level=slowdebug"], + labels: "slowdebug" + }; + // Extra settings for openjdk only profiles + common.open_suffix = "-open"; + common.open_profile_base = { + configure_args: ["--enable-openjdk-only"], + labels: "open" + }; + + common.configure_args_64bit = ["--with-target-bits=64"]; + common.configure_args_32bit = ["--with-target-bits=32"]; + + /** + * Define common artifacts template for all main profiles + * @param pf - Name of platform in bundle names + * @param demo_ext - Type of extension for demo bundle + */ + common.main_profile_artifacts = function (pf, demo_ext) { + return { + artifacts: { + jdk: { + local: "bundles/\\(jdk.*bin.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jdk-" + data.version, + exploded: "images/jdk" + }, + jre: { + local: "bundles/\\(jre.*bin.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jre-" + data.version, + exploded: "images/jre" + }, + test: { + local: "bundles/\\(jdk.*bin-tests.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests.tar.gz", + "bundles/" + pf + "/\\1" + ], + exploded: "images/test" + }, + jdk_symbols: { + local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-symbols.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jdk-" + data.version, + exploded: "images/jdk" + }, + jre_symbols: { + local: "bundles/\\(jre.*bin-symbols.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-symbols.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jre-" + data.version, + exploded: "images/jre" + }, + demo: { + local: "bundles/\\(jdk.*demo." + demo_ext + "\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_demo." + demo_ext, + "bundles/" + pf + "/\\1" + ], + } + } + }; + }; + + + /** + * Define common artifacts template for all debug profiles + * @param pf - Name of platform in bundle names + */ + common.debug_profile_artifacts = function (pf) { + return { + artifacts: { + jdk: { + local: "bundles/\\(jdk.*bin-debug.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jdk-" + data.version, + exploded: "images/jdk" + }, + jre: { + local: "bundles/\\(jre.*bin-debug.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-debug.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jre-" + data.version, + exploded: "images/jre" + }, + test: { + local: "bundles/\\(jdk.*bin-tests-debug.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests-debug.tar.gz", + "bundles/" + pf + "/\\1" + ], + exploded: "images/test" + }, + jdk_symbols: { + local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jdk-" + data.version, + exploded: "images/jdk" + }, + jre_symbols: { + local: "bundles/\\(jre.*bin-debug-symbols.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz", + "bundles/" + pf + "/\\1" + ], + subdir: "jre-" + data.version, + exploded: "images/jre" + } + } + }; + }; var boot_jdk_revision = "8"; var boot_jdk_subdirpart = "1.8.0"; @@ -251,100 +412,108 @@ * @param common The common values * @returns {{}} Profiles part of the configuration */ -var getJibProfilesProfiles = function (input, common) { - var profiles = {}; - +var getJibProfilesProfiles = function (input, common, data) { // Main SE profiles - var mainProfiles = { + var profiles = { "linux-x64": { target_os: "linux", target_cpu: "x64", - dependencies: concat(common.dependencies, "devkit"), - configure_args: concat(common.configure_args, "--with-zlib=system"), - default_make_targets: concat(common.default_make_targets, "docs-bundles") + dependencies: ["devkit"], + configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), + default_make_targets: ["docs-bundles"], }, "linux-x86": { target_os: "linux", target_cpu: "x86", build_cpu: "x64", - dependencies: concat(common.dependencies, "devkit"), - configure_args: concat(common.configure_args, common.configure_args_32bit, + dependencies: ["devkit"], + configure_args: concat(common.configure_args_32bit, "--with-jvm-variants=minimal,server", "--with-zlib=system"), - default_make_targets: common.default_make_targets }, "macosx-x64": { target_os: "macosx", target_cpu: "x64", - dependencies: concat(common.dependencies, "devkit"), - configure_args: concat(common.configure_args, "--with-zlib=system"), - default_make_targets: common.default_make_targets + dependencies: ["devkit"], + configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), }, "solaris-x64": { target_os: "solaris", target_cpu: "x64", - dependencies: concat(common.dependencies, "devkit", "cups"), - configure_args: concat(common.configure_args, "--with-zlib=system", - "--enable-dtrace"), - default_make_targets: common.default_make_targets + dependencies: ["devkit", "cups"], + configure_args: concat(common.configure_args_64bit, + "--with-zlib=system", "--enable-dtrace"), }, "solaris-sparcv9": { target_os: "solaris", target_cpu: "sparcv9", - dependencies: concat(common.dependencies, "devkit", "cups"), - configure_args: concat(common.configure_args, "--with-zlib=system", - "--enable-dtrace"), - default_make_targets: common.default_make_targets + dependencies: ["devkit", "cups"], + configure_args: concat(common.configure_args_64bit, + "--with-zlib=system", "--enable-dtrace"), }, "windows-x64": { target_os: "windows", target_cpu: "x64", - dependencies: concat(common.dependencies, "devkit", "freetype"), - configure_args: concat(common.configure_args), - default_make_targets: common.default_make_targets + dependencies: ["devkit", "freetype"], + configure_args: concat(common.configure_args_64bit), }, "windows-x86": { target_os: "windows", target_cpu: "x86", build_cpu: "x64", - dependencies: concat(common.dependencies, "devkit", "freetype"), - configure_args: concat(common.configure_args, common.configure_args_32bit), - default_make_targets: common.default_make_targets + dependencies: ["devkit", "freetype"], + configure_args: concat(common.configure_args_32bit), } }; - profiles = concatObjects(profiles, mainProfiles); + // Add the base settings to all the main profiles + common.main_profile_names.forEach(function (name) { + profiles[name] = concatObjects(common.main_profile_base, profiles[name]); + }); + // Generate debug versions of all the main profiles - profiles = concatObjects(profiles, generateDebugProfiles(common, mainProfiles)); + common.main_profile_names.forEach(function (name) { + var debugName = name + common.debug_suffix; + profiles[debugName] = concatObjects(profiles[name], + common.debug_profile_base); + }); // Generate slowdebug versions of all the main profiles - profiles = concatObjects(profiles, generateSlowdebugProfiles(common, mainProfiles)); + common.main_profile_names.forEach(function (name) { + var debugName = name + common.slowdebug_suffix; + profiles[debugName] = concatObjects(profiles[name], + common.slowdebug_profile_base); + }); // Generate open only profiles for all the main profiles for JPRT and reference // implementation builds. - var openOnlyProfiles = generateOpenOnlyProfiles(common, mainProfiles); + common.main_profile_names.forEach(function (name) { + var openName = name + common.open_suffix; + profiles[openName] = concatObjects(profiles[name], + common.open_profile_base); + }); // The open only profiles on linux are used for reference builds and should // produce the compact profile images by default. This adds "profiles" as an // extra default target. var openOnlyProfilesExtra = { - "linux-x64-open": { - default_make_targets: "profiles" - }, - "linux-x86-open": { default_make_targets: "profiles", configure_args: "--with-jvm-variants=client,server" } }; - var openOnlyProfiles = concatObjects(openOnlyProfiles, openOnlyProfilesExtra); + profiles = concatObjects(profiles, openOnlyProfilesExtra); - profiles = concatObjects(profiles, openOnlyProfiles); - // Generate debug profiles for the open jprt profiles - profiles = concatObjects(profiles, generateDebugProfiles(common, openOnlyProfiles)); + // Generate debug profiles for the open only profiles + common.main_profile_names.forEach(function (name) { + var openName = name + common.open_suffix; + var openDebugName = openName + common.debug_suffix; + profiles[openDebugName] = concatObjects(profiles[openName], + common.debug_profile_base); + }); // Profiles for building the zero jvm variant. These are used for verification // in JPRT. @@ -352,31 +521,46 @@ "linux-x64-zero": { target_os: "linux", target_cpu: "x64", - dependencies: concat(common.dependencies, "devkit"), - configure_args: concat(common.configure_args, + dependencies: ["devkit"], + configure_args: concat(common.configure_args_64bit, [ "--with-zlib=system", "--with-jvm-variants=zero", - "--enable-libffi-bundling"), - default_make_targets: common.default_make_targets + "--enable-libffi-bundling" + ]) }, "linux-x86-zero": { target_os: "linux", target_cpu: "x86", build_cpu: "x64", - dependencies: concat(common.dependencies, "devkit"), - configure_args: concat(common.configure_args, common.configure_args_32bit, + dependencies: ["devkit"], + configure_args: concat(common.configure_args_32bit, [ "--with-zlib=system", "--with-jvm-variants=zero", - "--enable-libffi-bundling"), - default_make_targets: common.default_make_targets - }, + "--enable-libffi-bundling" + ]) + } } profiles = concatObjects(profiles, zeroProfiles); - profiles = concatObjects(profiles, generateDebugProfiles(common, zeroProfiles)); + + // Add the base settings to the zero profiles and generate debug profiles + Object.keys(zeroProfiles).forEach(function (name) { + var debugName = name + common.debug_suffix; + profiles[name] = concatObjects(common.main_profile_base, profiles[name]); + profiles[debugName] = concatObjects(profiles[name], common.debug_profile_base); + }); - // Profiles used to run tests. Used in JPRT. + // Profiles used to run tests. Used in JPRT and Mach 5. var testOnlyProfiles = { + "run-test-jprt": { + target_os: input.build_os, + target_cpu: input.build_cpu, + dependencies: [ "jtreg", "gnumake", "boot_jdk" ], + labels: "test", + environment: { + "JT_JAVA": common.boot_jdk_home + } + }, "run-test": { target_os: input.build_os, @@ -390,6 +574,230 @@ }; profiles = concatObjects(profiles, testOnlyProfiles); + // Profiles used to run tests using Jib for internal dependencies. + var testedProfile = input.testedProfile; + if (testedProfile == null) { + testedProfile = input.build_os + "-" + input.build_cpu; + } + var testOnlyProfilesPrebuilt = { + "run-test-prebuilt": { + src: "src.conf", + dependencies: [ "jtreg", "gnumake", testedProfile + ".jdk", + testedProfile + ".test", "src.full" + ], + work_dir: input.get("src.full", "install_path") + "/test", + environment: { + "PRODUCT_HOME": input.get(testedProfile + ".jdk", "home_path"), + "TEST_IMAGE_DIR": input.get(testedProfile + ".test", "home_path"), + "TEST_OUTPUT_DIR": input.src_top_dir + }, + labels: "test" + } + }; + // If actually running the run-test-prebuilt profile, verify that the input + // variable is valid and if so, add the appropriate target_* values from + // the tested profile. + if (input.profile == "run-test-prebuilt") { + if (profiles[testedProfile] == null) { + error("testedProfile is not defined: " + testedProfile); + } else { + testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"] + = profiles[testedProfile]["target_os"]; + testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"] + = profiles[testedProfile]["target_cpu"]; + } + } + profiles = concatObjects(profiles, testOnlyProfilesPrebuilt); + + // + // Define artifacts for profiles + // + // Macosx bundles are named osx and Windows demo bundles use zip instead of + // tar.gz. + var artifactData = { + "linux-x64": { + platform: "linux-x64", + demo_ext: "tar.gz" + }, + "linux-x86": { + platform: "linux-x86", + demo_ext: "tar.gz" + }, + "macosx-x64": { + platform: "osx-x64", + demo_ext: "tar.gz" + }, + "solaris-x64": { + platform: "solaris-x64", + demo_ext: "tar.gz" + }, + "solaris-sparcv9": { + platform: "solaris-sparcv9", + demo_ext: "tar.gz" + }, + "windows-x64": { + platform: "windows-x64", + demo_ext: "zip" + }, + "windows-x86": { + platform: "windows-x86", + demo_ext: "zip" + } + } + // Generate common artifacts for all main profiles + common.main_profile_names.forEach(function (name) { + profiles[name] = concatObjects(profiles[name], + common.main_profile_artifacts(artifactData[name].platform, artifactData[name].demo_ext)); + }); + + // Generate common artifacts for all debug profiles + common.main_profile_names.forEach(function (name) { + var debugName = name + common.debug_suffix; + profiles[debugName] = concatObjects(profiles[debugName], + common.debug_profile_artifacts(artifactData[name].platform)); + }); + + // Extra profile specific artifacts + profilesArtifacts = { + "linux-x64": { + artifacts: { + doc_api_spec: { + local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)", + remote: [ + "bundles/common/jdk-" + data.version + "_doc-api-spec.tar.gz", + "bundles/linux-x64/\\1" + ], + }, + } + }, + + "linux-x64-open": { + artifacts: { + jdk: { + local: "bundles/\\(jdk.*bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + jre: { + local: "bundles/\\(jre.*bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + test: { + local: "bundles/\\(jdk.*bin-tests.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + jdk_symbols: { + local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + jre_symbols: { + local: "bundles/\\(jre.*bin-symbols.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + demo: { + local: "bundles/\\(jdk.*demo.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + doc_api_spec: { + local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)", + remote: "bundles/openjdk/GPL/linux-x64/\\1", + }, + } + }, + + "linux-x86-open": { + artifacts: { + jdk: { + local: "bundles/\\(jdk.*bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + }, + jre: { + local: "bundles/\\(jre.*[0-9]_linux-x86_bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + },/* The build does not create these + jre_compact1: { + local: "bundles/\\(jre.*-compact1_linux-x86_bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + }, + jre_compact2: { + local: "bundles/\\(jre.*-compact2_linux-x86_bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + }, + jre_compact3: { + local: "bundles/\\(jre.*-compact3_linux-x86_bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + },*/ + } + }, + + "windows-x86-open": { + artifacts: { + jdk: { + local: "bundles/\\(jdk.*bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/windows-x86/\\1", + }, + jre: { + local: "bundles/\\(jre.*bin.tar.gz\\)", + remote: "bundles/openjdk/GPL/windows-x86/\\1" + }, + test: { + local: "bundles/\\(jdk.*bin-tests.tar.gz\\)", + remote: "bundles/openjdk/GPL/windows-x86/\\1", + }, + jdk_symbols: { + local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)", + remote: "bundles/openjdk/GPL/windows-x86/\\1" + }, + jre_symbols: { + local: "bundles/\\(jre.*bin-symbols.tar.gz\\)", + remote: "bundles/openjdk/GPL/windows-x86/\\1", + }, + demo: { + local: "bundles/\\(jdk.*demo.zip\\)", + remote: "bundles/openjdk/GPL/windows-x86/\\1", + } + } + }, + + "linux-x86-open-debug": { + artifacts: { + jdk: { + local: "bundles/\\(jdk.*bin-debug.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + }, + jre: { + local: "bundles/\\(jre.*bin-debug.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + }, + jdk_symbols: { + local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)", + remote: "bundles/openjdk/GPL/profile/linux-x86/\\1", + }, + } + }, + + }; + profiles = concatObjects(profiles, profilesArtifacts); + + + // Define the reference implementation profiles. These are basically the same + // as the open profiles, but upload artifacts to a different location and + // are only defined for specific platforms. + profiles["linux-x64-ri"] = clone(profiles["linux-x64-open"]); + profiles["linux-x86-ri"] = clone(profiles["linux-x86-open"]); + profiles["linux-x86-ri-debug"] = clone(profiles["linux-x86-open-debug"]); + profiles["windows-x86-ri"] = clone(profiles["windows-x86-open"]); + + // Generate artifacts for ri profiles + [ "linux-x64-ri", "linux-x86-ri", "linux-x86-ri-debug", "windows-x86-ri" ] + .forEach(function (name) { + // Rewrite all remote dirs to "bundles/openjdk/BCL/..." + for (artifactName in profiles[name].artifacts) { + var artifact = profiles[name].artifacts[artifactName]; + artifact.remote = replaceAll("\/GPL\/", "/BCL/", + (artifact.remote != null ? artifact.remote : artifact.local)); + } + }); + // Generate the missing platform attributes profiles = generatePlatformAttributes(profiles); profiles = generateDefaultMakeTargetsConfigureArg(common, profiles); @@ -514,78 +922,6 @@ }; /** - * Generates debug versions of profiles. Clones the given profiles and adds - * debug metadata. - * - * @param common Common values - * @param profiles Profiles map to generate debug profiles for - * @returns {{}} New map of profiles containing debug profiles - */ -var generateDebugProfiles = function (common, profiles) { - var newProfiles = {}; - for (var profile in profiles) { - var debugProfile = profile + "-debug"; - newProfiles[debugProfile] = clone(profiles[profile]); - newProfiles[debugProfile].debug_level = "fastdebug"; - newProfiles[debugProfile].default_make_targets - = common.default_make_targets_debug; - newProfiles[debugProfile].labels - = concat(newProfiles[debugProfile].labels || [], "debug"), - newProfiles[debugProfile].configure_args - = concat(newProfiles[debugProfile].configure_args, - common.configure_args_debug); - } - return newProfiles; -}; - -/** - * Generates slowdebug versions of profiles. Clones the given profiles and adds - * debug metadata. - * - * @param common Common values - * @param profiles Profiles map to generate debug profiles for - * @returns {{}} New map of profiles containing debug profiles - */ -var generateSlowdebugProfiles = function (common, profiles) { - var newProfiles = {}; - for (var profile in profiles) { - var debugProfile = profile + "-slowdebug"; - newProfiles[debugProfile] = clone(profiles[profile]); - newProfiles[debugProfile].debug_level = "slowdebug"; - newProfiles[debugProfile].default_make_targets - = common.default_make_targets_slowdebug; - newProfiles[debugProfile].labels - = concat(newProfiles[debugProfile].labels || [], "slowdebug"), - newProfiles[debugProfile].configure_args - = concat(newProfiles[debugProfile].configure_args, - common.configure_args_slowdebug); - } - return newProfiles; -}; - -/** - * Generates open only versions of profiles. Clones the given profiles and adds - * open metadata. - * - * @param common Common values - * @param profiles Profiles map to generate open only profiles for - * @returns {{}} New map of profiles containing open only profiles - */ -var generateOpenOnlyProfiles = function (common, profiles) { - var newProfiles = {}; - for (var profile in profiles) { - var openProfile = profile + "-open"; - newProfiles[openProfile] = clone(profiles[profile]); - newProfiles[openProfile].labels - = concat(newProfiles[openProfile].labels || [], "open"), - newProfiles[openProfile].configure_args - = concat(newProfiles[openProfile].configure_args, - "--enable-openjdk-only"); - } - return newProfiles; -}; - -/** * The default_make_targets attribute on a profile is not a real Jib attribute. * This function rewrites that attribute into the corresponding configure arg. * Calling this function multiple times on the same profiles object is safe. @@ -602,10 +938,12 @@ // Iterate over all configure args and see if --with-default-make-target // is already there and change it, otherwise add it. var found = false; - for (var arg in ret[profile].configure_args) { - if (arg.startsWith("--with-default-make-target")) { + for (var i in ret[profile].configure_args) { + var arg = ret[profile].configure_args[i]; + if (arg != null && arg.startsWith("--with-default-make-target=")) { found = true; - arg.replace(/=.*/, "=" + targetsString); + ret[profile].configure_args[i] + = "--with-default-make-target=" + targetsString; } } if (!found) { @@ -618,6 +956,16 @@ return ret; } +var getBuildId = function (input) { + if (input.build_id != null) { + return input.build_id; + } else { + var topdir = new java.io.File(__DIR__, "../..").getCanonicalFile().getName(); + var userName = java.lang.System.getProperty("user.name"); + return userName + "." + topdir; + } +} + /** * Deep clones an object tree. * @@ -638,25 +986,25 @@ }; /** - * Copies all elements in an array into a new array but replacing all - * occurrences of original with replacement. + * Takes a String or Array of Strings and does a replace operation on each + * of them. * - * @param original Element to look for - * @param replacement Element to replace with - * @param a Array to copy - * @returns {Array} New array with all occurrences of original replaced - * with replacement + * @param pattern Pattern to look for + * @param replacement Replacement text to insert + * @param a String or Array of Strings to replace + * @returns {Array} Either a new array or a new string depending on the input */ -var replace = function (original, replacement, a) { +var replaceAll = function (pattern, replacement, a) { + // If a is an array + if (Array === a.constructor) { var newA = []; for (var i in a) { - if (original == a[i]) { - newA.push(replacement); + newA.push(a[i].replace(pattern, replacement)); + } + return newA; } else { - newA.push(a[i]); - } + return a.replace(pattern, replacement); } - return newA; }; /** @@ -669,20 +1017,26 @@ * @returns {{}} New object tree containing the concatenation of o1 and o2 */ var concatObjects = function (o1, o2) { + if (o1 == null) { + return clone(o2); + } + if (o2 == null) { + return clone(o1); + } var ret = {}; for (var a in o1) { if (o2[a] == null) { - ret[a] = o1[a]; + ret[a] = clone(o1[a]); } } for (var a in o2) { if (o1[a] == null) { - ret[a] = o2[a]; + ret[a] = clone(o2[a]); } else { if (typeof o1[a] == 'string') { - ret[a] = [o1[a]].concat(o2[a]); + ret[a] = clone([o1[a]].concat(o2[a])); } else if (Array.isArray(o1[a])) { - ret[a] = o1[a].concat(o2[a]); + ret[a] = clone(o1[a].concat(o2[a])); } else if (typeof o1[a] == 'object') { ret[a] = concatObjects(o1[a], o2[a]); } @@ -690,3 +1044,45 @@ } return ret; }; + +/** + * Constructs the numeric version string from reading the + * common/autoconf/version-numbers file and removing all trailing ".0". + * + * @param major Override major version + * @param minor Override minor version + * @param security Override security version + * @param patch Override patch version + * @returns {String} The numeric version string + */ +var getVersion = function (major, minor, security, patch) { + var version_numbers = getVersionNumbers(); + var version = (major != null ? major : version_numbers.get("DEFAULT_VERSION_MAJOR")) + + "." + (minor != null ? minor : version_numbers.get("DEFAULT_VERSION_MINOR")) + + "." + (security != null ? security : version_numbers.get("DEFAULT_VERSION_SECURITY")) + + "." + (patch != null ? patch : version_numbers.get("DEFAULT_VERSION_PATCH")); + while (version.match(".*\.0$")) { + version = version.substring(0, version.length - 2); + } + return version; +}; + +// Properties representation of the common/autoconf/version-numbers file. Lazily +// initiated by the function below. +var version_numbers; + +/** + * Read the common/autoconf/version-numbers file into a Properties object. + * + * @returns {java.utilProperties} + */ +var getVersionNumbers = function () { + // Read version information from common/autoconf/version-numbers + if (version_numbers == null) { + version_numbers = new java.util.Properties(); + var stream = new java.io.FileInputStream(__DIR__ + "/../../common/autoconf/version-numbers"); + version_numbers.load(stream); + stream.close(); + } + return version_numbers; +} diff -r 05e2611ebff6 -r 65e2b10e8e80 corba/.hgtags --- a/corba/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/corba/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -392,3 +392,5 @@ dc49e0922a8e4387cbf8670bbe1dc51c9874b74b jdk-9+147 f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148 00b19338e505690abe93d5995ed74a473d969c2c jdk-9+149 +9205e980062a5c4530b51021c6e274025f4ccbdf jdk-9+150 +77f827f5bbad3ef795664bc675f72d98d156b9f8 jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 corba/THIRD_PARTY_README --- a/corba/THIRD_PARTY_README Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3605 +0,0 @@ -DO NOT TRANSLATE OR LOCALIZE. ------------------------------ - -%% This notice is provided with respect to ASM Bytecode Manipulation -Framework v5.0, which may be included with JRE 8, and JDK 8, and -OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2000-2011 France Télécom -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - --------------------------------------------------------------------------------- - -%% This notice is provided with respect to BSDiff v4.3, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright 2003-2005 Colin Percival -All rights reserved - -Redistribution and use in source and binary forms, with or without -modification, are permitted providing that the following conditions -are met: -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to CodeViewer 1.0, which may be -included with JDK 8. - ---- begin of LICENSE --- - -Copyright 1999 by CoolServlets.com. - -Any errors or suggested improvements to this class can be reported as -instructed on CoolServlets.com. We hope you enjoy this program... your -comments will encourage further development! This software is distributed -under the terms of the BSD License. Redistribution and use in source and -binary forms, with or without modification, are permitted provided that the -following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -Neither name of CoolServlets.com nor the names of its contributors may be -used to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Cryptix AES 3.2.0, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Cryptix General License - -Copyright (c) 1995-2005 The Cryptix Foundation Limited. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - 1. Redistributions of source code must retain the copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND -CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to CUP Parser Generator for -Java 0.10k, which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, provided -that the above copyright notice appear in all copies and that both the -copyright notice and this permission notice and warranty disclaimer appear in -supporting documentation, and that the names of the authors or their -employers not be used in advertising or publicity pertaining to distribution of -the software without specific, written prior permission. - -The authors and their employers disclaim all warranties with regard to -this software, including all implied warranties of merchantability and fitness. -In no event shall the authors or their employers be liable for any special, -indirect or consequential damages or any damages whatsoever resulting from -loss of use, data or profits, whether in an action of contract, negligence or -other tortious action, arising out of or in connection with the use or -performance of this software. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Document Object Model (DOM) Level 2 -& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -W3C SOFTWARE NOTICE AND LICENSE - -http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - -This work (and included software, documentation such as READMEs, or other -related items) is being provided by the copyright holders under the following -license. By obtaining, using and/or copying this work, you (the licensee) -agree that you have read, understood, and will comply with the following terms -and conditions. - -Permission to copy, modify, and distribute this software and its -documentation, with or without modification, for any purpose and without fee -or royalty is hereby granted, provided that you include the following on ALL -copies of the software and documentation or portions thereof, including -modifications: - - 1.The full text of this NOTICE in a location viewable to users of the - redistributed or derivative work. - - 2.Any pre-existing intellectual property disclaimers, notices, or terms and - conditions. If none exist, the W3C Software Short Notice should be included - (hypertext is preferred, text is permitted) within the body of any - redistributed or derivative code. - - 3.Notice of any changes or modifications to the files, including the date - changes were made. (We recommend you provide URIs to the location from - which the code is derived.) - -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS -MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR -PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY -THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL -OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR -DOCUMENTATION. The name and trademarks of copyright holders may NOT be used -in advertising or publicity pertaining to the software without specific, -written prior permission. Title to copyright in this software and any -associated documentation will at all times remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on December 31 -2002. This version removes the copyright ownership notice such that this -license can be used with materials other than those owned by the W3C, reflects -that ERCIM is now a host of the W3C, includes references to this specific -dated version of the license, and removes the ambiguous grant of "use". -Otherwise, this version is the same as the previous version and is written so -as to preserve the Free Software Foundation's assessment of GPL compatibility -and OSI's certification under the Open Source Definition. Please see our -Copyright FAQ for common questions about using materials from our site, -including specific terms and conditions for packages like libwww, Amaya, and -Jigsaw. Other questions about this notice can be directed to -site-policy@w3.org. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Dynalink v0.5, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2009-2013, Attila Szegedi - -All rights reserved.Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the following conditions are -met:* Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. * Redistributions in -binary form must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. * Neither the name of Attila -Szegedi nor the names of its contributors may be used to endorse or promote -products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Elliptic Curve Cryptography, which -may be included with JRE 8, JDK 8, and OpenJDK 8. - -You are receiving a copy of the Elliptic Curve Cryptography library in source -form with the JDK 8 and OpenJDK 8 source distributions, and as object code in -the JRE 8 & JDK 8 runtimes. - -In the case of the JRE 8 & JDK 8 runtimes, the terms of the Oracle license do -NOT apply to the Elliptic Curve Cryptography library; it is licensed under the -following license, separately from Oracle's JDK & JRE. If you do not wish to -install the Elliptic Curve Cryptography library, you may delete the library -named libsunec.so (on Solaris and Linux systems) or sunec.dll (on Windows -systems) from the JRE bin directory reserved for native libraries. - - ---- begin of LICENSE --- - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to ECMAScript Language -Specification ECMA-262 Edition 5.1 which may be included with -JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright notice -Copyright © 2011 Ecma International -Ecma International -Rue du Rhone 114 -CH-1204 Geneva -Tel: +41 22 849 6000 -Fax: +41 22 849 6001 -Web: http://www.ecma-international.org - -This document and possible translations of it may be copied and furnished to -others, and derivative works that comment on or otherwise explain it or assist -in its implementation may be prepared, copied, published, and distributed, in -whole or in part, without restriction of any kind, provided that the above -copyright notice and this section are included on all such copies and derivative -works. However, this document itself may not be modified in any way, including -by removing the copyright notice or references to Ecma International, except as -needed for the purpose of developing any document or deliverable produced by -Ecma International (in which case the rules applied to copyrights must be -followed) or as required to translate it into languages other than English. The -limited permissions granted above are perpetual and will not be revoked by Ecma -International or its successors or assigns. This document and the information -contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL -DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY -WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP -RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE." Software License - -All Software contained in this document ("Software)" is protected by copyright -and is being made available under the "BSD License", included below. This -Software may be subject to third party rights (rights from parties other than -Ecma International), including patent rights, and no licenses under such third -party rights are granted under this license even if the third party concerned is -a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS -AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR -INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO -IMPLEMENT ECMA INTERNATIONAL STANDARDS*. Redistribution and use in source and -binary forms, with or without modification, are permitted provided that the -following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of the authors nor Ecma International may be used to endorse -or promote products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. ---- end of LICENSE --- - -%% This notice is provided with respect to Dynalink library which is included -with the Nashorn technology. - ---- begin of LICENSE --- -Copyright (c) 2009-2013, Attila Szegedi - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of the copyright holder nor the names of - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---- end of LICENSE --- - -%% This notice is provided with respect to Joni library which is included -with the Nashorn technology. - ---- begin of LICENSE --- -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to FontConfig 2.5, which may be -included with JRE 8, JDK 8, and OpenJDK 8 source distributions on -Linux and Solaris. - ---- begin of LICENSE --- - -Copyright © 2001,2003 Keith Packard - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that the -above copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation, and that -the name of Keith Packard not be used in advertising or publicity pertaining -to distribution of the software without specific, written prior permission. -Keith Packard makes no representations about the suitability of this software -for any purpose. It is provided "as is" without express or implied warranty. - -KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL KEITH -PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to IAIK PKCS#11 Wrapper, -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -IAIK PKCS#11 Wrapper License - -Copyright (c) 2002 Graz University of Technology. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: - - "This product includes software developed by IAIK of Graz University of - Technology." - - Alternately, this acknowledgment may appear in the software itself, if and - wherever such third-party acknowledgments normally appear. - -4. The names "Graz University of Technology" and "IAIK of Graz University of - Technology" must not be used to endorse or promote products derived from this - software without prior written permission. - -5. Products derived from this software may not be called "IAIK PKCS Wrapper", - nor may "IAIK" appear in their name, without prior written permission of - Graz University of Technology. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to ICU4C 4.0.1 and ICU4J 4.4, which -may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 1995-2010 International Business Machines Corporation and others - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, and/or sell copies of the -Software, and to permit persons to whom the Software is furnished to do so, -provided that the above copyright notice(s) and this permission notice appear -in all copies of the Software and that both the above copyright notice(s) and -this permission notice appear in supporting documentation. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN -NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE -LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization of the copyright holder. -All trademarks and registered trademarks mentioned herein are the property of -their respective owners. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to IJG JPEG 6b, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -This software is copyright (C) 1991-1998, Thomas G. Lane. -All Rights Reserved except as specified below. - -Permission is hereby granted to use, copy, modify, and distribute this -software (or portions thereof) for any purpose, without fee, subject to these -conditions: -(1) If any part of the source code for this software is distributed, then this -README file must be included, with this copyright and no-warranty notice -unaltered; and any additions, deletions, or changes to the original files -must be clearly indicated in accompanying documentation. -(2) If only executable code is distributed, then the accompanying -documentation must state that "this software is based in part on the work of -the Independent JPEG Group". -(3) Permission for use of this software is granted only if the user accepts -full responsibility for any undesirable consequences; the authors accept -NO LIABILITY for damages of any kind. - -These conditions apply to any software derived from or based on the IJG code, -not just to the unmodified library. If you use our work, you ought to -acknowledge us. - -Permission is NOT granted for the use of any IJG author's name or company name -in advertising or publicity relating to this software or products derived from -it. This software may be referred to only as "the Independent JPEG Group's -software". - -We specifically permit and encourage the use of this software as the basis of -commercial products, provided that all warranty or liability claims are -assumed by the product vendor. - ---- end of LICENSE --- - --------------------------------------------------------------------------------- - -%% This notice is provided with respect to Joni v1.1.9, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to JOpt-Simple v3.0, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - Copyright (c) 2004-2009 Paul R. Holser, Jr. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---- end of LICENSE --- - --------------------------------------------------------------------------------- - -%% This notice is provided with respect to JSON, which may be included -with JRE 8 & JDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2002 JSON.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Kerberos functionality, which -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - (C) Copyright IBM Corp. 1999 All Rights Reserved. - Copyright 1997 The Open Group Research Institute. All rights reserved. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Kerberos functionality from -FundsXpress, INC., which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - Copyright (C) 1998 by the FundsXpress, INC. - - All rights reserved. - - Export of this software from the United States of America may require - a specific license from the United States Government. It is the - responsibility of any person or organization contemplating export to - obtain such a license before exporting. - - WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - distribute this software and its documentation for any purpose and - without fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright notice and - this permission notice appear in supporting documentation, and that - the name of FundsXpress. not be used in advertising or publicity pertaining - to distribution of the software without specific, written prior - permission. FundsXpress makes no representations about the suitability of - this software for any purpose. It is provided "as is" without express - or implied warranty. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Kronos OpenGL headers, which may be -included with JDK 8 and OpenJDK 8 source distributions. - ---- begin of LICENSE --- - - Copyright (c) 2007 The Khronos Group Inc. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and/or associated documentation files (the "Materials"), to - deal in the Materials without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Materials, and to permit persons to whom the Materials are - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Materials. - - THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE - MATERIALS. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% Portions Copyright Eastman Kodak Company 1992 - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to libpng 1.5.4, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -This copy of the libpng notices is provided for your convenience. In case of -any discrepancy between this copy and the notices in the file png.h that is -included in the libpng distribution, the latter shall prevail. - -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - -If you modify libpng you may insert additional notices immediately following -this sentence. - -This code is released under the libpng license. - -libpng versions 1.2.6, August 15, 2004, through 1.5.4, July 7, 2011, are -Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.2.5 -with the following individual added to the list of Contributing Authors - - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are -Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.0.6 -with the following individuals added to the list of Contributing Authors - - Simon-Pierre Cadieux - Eric S. Raymond - Gilles Vollant - -and with the following additions to the disclaimer: - - There is no warranty against interference with your enjoyment of the - library or against infringement. There is no warranty that our - efforts or the library will fulfill any of your particular purposes - or needs. This library is provided with all faults, and the entire - risk of satisfactory quality, performance, accuracy, and effort is with - the user. - -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are -Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-0.96, -with the following individuals added to the list of Contributing Authors: - - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik - -libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88, -with the following individuals added to the list of Contributing Authors: - - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner - -libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - -For the purposes of this copyright and license, "Contributing Authors" -is defined as the following set of individuals: - - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner - -The PNG Reference Library is supplied "AS IS". The Contributing Authors -and Group 42, Inc. disclaim all warranties, expressed or implied, -including, without limitation, the warranties of merchantability and of -fitness for any purpose. The Contributing Authors and Group 42, Inc. -assume no liability for direct, indirect, incidental, special, exemplary, -or consequential damages, which may result from the use of the PNG -Reference Library, even if advised of the possibility of such damage. - -Permission is hereby granted to use, copy, modify, and distribute this -source code, or portions hereof, for any purpose, without fee, subject -to the following restrictions: - -1. The origin of this source code must not be misrepresented. - -2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. - -3. This Copyright notice may not be removed or altered from any - source or altered source distribution. - -The Contributing Authors and Group 42, Inc. specifically permit, without -fee, and encourage the use of this source code as a component to -supporting the PNG file format in commercial products. If you use this -source code in a product, acknowledgment is not required but would be -appreciated. - - -A "png_get_copyright" function is available, for convenient use in "about" -boxes and the like: - - printf("%s",png_get_copyright(NULL)); - -Also, the PNG logo (in PNG format, of course) is supplied in the -files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a -certification mark of the Open Source Initiative. - -Glenn Randers-Pehrson -glennrp at users.sourceforge.net -July 7, 2011 - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to libungif 4.1.3, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Little CMS 2.4, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Little CMS -Copyright (c) 1998-2010 Marti Maria Saguer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the -U.S. and other countries. - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Mesa 3D Graphics Library v4.1, -which may be included with JRE 8, JDK 8, and OpenJDK 8 source distributions. - ---- begin of LICENSE --- - - Mesa 3-D graphics library - Version: 4.1 - - Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Mozilla Network Security -Services (NSS), which is supplied with the JDK test suite in the OpenJDK -source code repository. It is licensed under Mozilla Public License (MPL), -version 2.0. - -The NSS libraries are supplied in executable form, built from unmodified -NSS source code labeled with the "NSS_3.13.1_RTM" release tag. - -The NSS source code is available in the OpenJDK source code repository at: - jdk/test/sun/security/pkcs11/nss/src - -The NSS libraries are available in the OpenJDK source code repository at: - jdk/test/sun/security/pkcs11/nss/lib - ---- begin of LICENSE --- - -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to PC/SC Lite for Suse Linux v.1.1.1, -which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris. - ---- begin of LICENSE --- - -Copyright (c) 1999-2004 David Corcoran -Copyright (c) 1999-2004 Ludovic Rousseau -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: - This product includes software developed by: - David Corcoran - http://www.linuxnet.com (MUSCLE) -4. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -Changes to this license can be made only by the copyright author with -explicit written consent. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to PorterStemmer v4, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -See: http://tartarus.org/~martin/PorterStemmer - -The software is completely free for any purpose, unless notes at the head of -the program text indicates otherwise (which is rare). In any case, the notes -about licensing are never more restrictive than the BSD License. - -In every case where the software is not written by me (Martin Porter), this -licensing arrangement has been endorsed by the contributor, and it is -therefore unnecessary to ask the contributor again to confirm it. - -I have not asked any contributors (or their employers, if they have them) for -proofs that they have the right to distribute their software in this way. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Relax NG Object/Parser v.20050510, -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) Kohsuke Kawaguchi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: The above copyright -notice and this permission notice shall be included in all copies or -substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to RelaxNGCC v1.12, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: - - "This product includes software developed by Daisuke Okajima - and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)." - -Alternately, this acknowledgment may appear in the software itself, if and -wherever such third-party acknowledgments normally appear. - -4. The names of the copyright holders must not be used to endorse or promote - products derived from this software without prior written permission. For - written permission, please contact the copyright holders. - -5. Products derived from this software may not be called "RELAXNGCC", nor may - "RELAXNGCC" appear in their name, without prior written permission of the - copyright holders. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE -SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to SAX 2.0.1, which may be included -with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - SAX is free! - - In fact, it's not possible to own a license to SAX, since it's been placed in - the public domain. - - No Warranty - - Because SAX is released to the public domain, there is no warranty for the - design or for the software implementation, to the extent permitted by - applicable law. Except when otherwise stated in writing the copyright holders - and/or other parties provide SAX "as is" without warranty of any kind, either - expressed or implied, including, but not limited to, the implied warranties - of merchantability and fitness for a particular purpose. The entire risk as - to the quality and performance of SAX is with you. Should SAX prove - defective, you assume the cost of all necessary servicing, repair or - correction. - - In no event unless required by applicable law or agreed to in writing will - any copyright holder, or any other party who may modify and/or redistribute - SAX, be liable to you for damages, including any general, special, incidental - or consequential damages arising out of the use or inability to use SAX - (including but not limited to loss of data or data being rendered inaccurate - or losses sustained by you or third parties or a failure of the SAX to - operate with any other programs), even if such holder or other party has been - advised of the possibility of such damages. - - Copyright Disclaimers - - This page includes statements to that effect by David Megginson, who would - have been able to claim copyright for the original work. SAX 1.0 - - Version 1.0 of the Simple API for XML (SAX), created collectively by the - membership of the XML-DEV mailing list, is hereby released into the public - domain. - - No one owns SAX: you may use it freely in both commercial and non-commercial - applications, bundle it with your software distribution, include it on a - CD-ROM, list the source code in a book, mirror the documentation at your own - web site, or use it in any other way you see fit. - - David Megginson, sax@megginson.com - 1998-05-11 - - SAX 2.0 - - I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and - release all of the SAX 2.0 source code, compiled code, and documentation - contained in this distribution into the Public Domain. SAX comes with NO - WARRANTY or guarantee of fitness for any purpose. - - David Megginson, david@megginson.com - 2000-05-05 - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to SoftFloat version 2b, which may be -included with JRE 8, JDK 8, and OpenJDK 8 on Linux/ARM. - ---- begin of LICENSE --- - -Use of any of this software is governed by the terms of the license below: - -SoftFloat was written by me, John R. Hauser. This work was made possible in -part by the International Computer Science Institute, located at Suite 600, -1947 Center Street, Berkeley, California 94704. Funding was partially -provided by the National Science Foundation under grant MIP-9311980. The -original version of this code was written as part of a project to build -a fixed-point vector processor in collaboration with the University of -California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek. - -THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort -has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT -TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO -PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL -LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO -FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER -SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, -COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE -SOFTWARE. - -Derivative works are acceptable, even for commercial purposes, provided -that the minimal documentation requirements stated in the source code are -satisfied. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Sparkle 1.5, -which may be included with JRE 8 on Mac OS X. - ---- begin of LICENSE --- - -Copyright (c) 2012 Sparkle.org and Andy Matuschak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% Portions licensed from Taligent, Inc. - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Thai Dictionary, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (C) 1982 The Royal Institute, Thai Royal Government. - -Copyright (C) 1998 National Electronics and Computer Technology Center, -National Science and Technology Development Agency, -Ministry of Science Technology and Environment, -Thai Royal Government. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Unicode 6.2.0 & CLDR 21.0.1 -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Unicode Terms of Use - -For the general privacy policy governing access to this site, see the Unicode -Privacy Policy. For trademark usage, see the Unicode® Consortium Name and -Trademark Usage Policy. - -A. Unicode Copyright. - 1. Copyright © 1991-2013 Unicode, Inc. All rights reserved. - - 2. Certain documents and files on this website contain a legend indicating - that "Modification is permitted." Any person is hereby authorized, - without fee, to modify such documents and files to create derivative - works conforming to the Unicode® Standard, subject to Terms and - Conditions herein. - - 3. Any person is hereby authorized, without fee, to view, use, reproduce, - and distribute all documents and files solely for informational - purposes in the creation of products supporting the Unicode Standard, - subject to the Terms and Conditions herein. - - 4. Further specifications of rights and restrictions pertaining to the use - of the particular set of data files known as the "Unicode Character - Database" can be found in Exhibit 1. - - 5. Each version of the Unicode Standard has further specifications of - rights and restrictions of use. For the book editions (Unicode 5.0 and - earlier), these are found on the back of the title page. The online - code charts carry specific restrictions. All other files, including - online documentation of the core specification for Unicode 6.0 and - later, are covered under these general Terms of Use. - - 6. No license is granted to "mirror" the Unicode website where a fee is - charged for access to the "mirror" site. - - 7. Modification is not permitted with respect to this document. All copies - of this document must be verbatim. - -B. Restricted Rights Legend. Any technical data or software which is licensed - to the United States of America, its agencies and/or instrumentalities - under this Agreement is commercial technical data or commercial computer - software developed exclusively at private expense as defined in FAR 2.101, - or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use, - duplication, or disclosure by the Government is subject to restrictions as - set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov - 1995) and this Agreement. For Software, in accordance with FAR 12-212 or - DFARS 227-7202, as applicable, use, duplication or disclosure by the - Government is subject to the restrictions set forth in this Agreement. - -C. Warranties and Disclaimers. - 1. This publication and/or website may include technical or typographical - errors or other inaccuracies . Changes are periodically added to the - information herein; these changes will be incorporated in new editions - of the publication and/or website. Unicode may make improvements and/or - changes in the product(s) and/or program(s) described in this - publication and/or website at any time. - - 2. If this file has been purchased on magnetic or optical media from - Unicode, Inc. the sole and exclusive remedy for any claim will be - exchange of the defective media within ninety (90) days of original - purchase. - - 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS - PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED, - OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. - UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR - OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH - ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE. - -D. Waiver of Damages. In no event shall Unicode or its licensors be liable for - any special, incidental, indirect or consequential damages of any kind, or - any damages whatsoever, whether or not Unicode was advised of the - possibility of the damage, including, without limitation, those resulting - from the following: loss of use, data or profits, in connection with the - use, modification or distribution of this information or its derivatives. - -E.Trademarks & Logos. - 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode, - Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of - Unicode, Inc. Use of the information and materials found on this - website indicates your acknowledgement of Unicode, Inc.’s exclusive - worldwide rights in the Unicode Word Mark, the Unicode Logo, and the - Unicode trade names. - - 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark - Policy”) are incorporated herein by reference and you agree to abide by - the provisions of the Trademark Policy, which may be changed from time - to time in the sole discretion of Unicode, Inc. - - 3. All third party trademarks referenced herein are the property of their - respective owners. - -Miscellaneous. - 1. Jurisdiction and Venue. This server is operated from a location in the - State of California, United States of America. Unicode makes no - representation that the materials are appropriate for use in other - locations. If you access this server from other locations, you are - responsible for compliance with local laws. This Agreement, all use of - this site and any claims and damages resulting from use of this site are - governed solely by the laws of the State of California without regard to - any principles which would apply the laws of a different jurisdiction. - The user agrees that any disputes regarding this site shall be resolved - solely in the courts located in Santa Clara County, California. The user - agrees said courts have personal jurisdiction and agree to waive any - right to transfer the dispute to any other forum. - - 2. Modification by Unicode. Unicode shall have the right to modify this - Agreement at any time by posting it to this site. The user may not - assign any part of this Agreement without Unicode’s prior written - consent. - - 3. Taxes. The user agrees to pay any taxes arising from access to this - website or use of the information herein, except for those based on - Unicode’s net income. - - 4. Severability. If any provision of this Agreement is declared invalid or - unenforceable, the remaining provisions of this Agreement shall remain - in effect. - - 5. Entire Agreement. This Agreement constitutes the entire agreement - between the parties. - -EXHIBIT 1 -UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE - -Unicode Data Files include all data files under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, and -http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF -online code charts under the directory http://www.unicode.org/Public/. -Software includes any source code published in the Unicode Standard or under -the directories http://www.unicode.org/Public/, -http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/. - -NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, -INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA -FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO -BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT -AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR -SOFTWARE. - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the -Terms of Use in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the Unicode data files and any associated documentation (the "Data Files") -or Unicode software and any associated documentation (the "Software") to deal -in the Data Files or Software without restriction, including without -limitation the rights to use, copy, modify, merge, publish, distribute, and/or -sell copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that (a) the above -copyright notice(s) and this permission notice appear with all copies of the -Data Files or Software, (b) both the above copyright notice(s) and this -permission notice appear in associated documentation, and (c) there is clear -notice in each modified Data File or in the Software as well as in the -documentation associated with the Data File(s) or Software that the data or -software has been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD -PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN -THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE -DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in these Data Files or Software without prior written authorization of the -copyright holder. - -Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United -States and other countries. All third party trademarks referenced herein are -the property of their respective owners. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to UPX v3.01, which may be included -with JRE 8 on Windows. - ---- begin of LICENSE --- - -Use of any of this software is governed by the terms of the license below: - - - ooooo ooo ooooooooo. ooooooo ooooo - `888' `8' `888 `Y88. `8888 d8' - 888 8 888 .d88' Y888..8P - 888 8 888ooo88P' `8888' - 888 8 888 .8PY888. - `88. .8' 888 d8' `888b - `YbodP' o888o o888o o88888o - - - The Ultimate Packer for eXecutables - Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar - http://wildsau.idv.uni-linz.ac.at/mfx/upx.html - http://www.nexus.hu/upx - http://upx.tsx.org - - -PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN -TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION. - - -ABSTRACT -======== - - UPX and UCL are copyrighted software distributed under the terms - of the GNU General Public License (hereinafter the "GPL"). - - The stub which is imbedded in each UPX compressed program is part - of UPX and UCL, and contains code that is under our copyright. The - terms of the GNU General Public License still apply as compressing - a program is a special form of linking with our stub. - - As a special exception we grant the free usage of UPX for all - executables, including commercial programs. - See below for details and restrictions. - - -COPYRIGHT -========= - - UPX and UCL are copyrighted software. All rights remain with the authors. - - UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer - UPX is Copyright (C) 1996-2000 Laszlo Molnar - - UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer - - -GNU GENERAL PUBLIC LICENSE -========================== - - UPX and the UCL library are free software; you can redistribute them - and/or modify them under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - UPX and UCL are distributed in the hope that they will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. - - -SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES -============================================ - - The stub which is imbedded in each UPX compressed program is part - of UPX and UCL, and contains code that is under our copyright. The - terms of the GNU General Public License still apply as compressing - a program is a special form of linking with our stub. - - Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special - permission to freely use and distribute all UPX compressed programs - (including commercial ones), subject to the following restrictions: - - 1. You must compress your program with a completely unmodified UPX - version; either with our precompiled version, or (at your option) - with a self compiled version of the unmodified UPX sources as - distributed by us. - 2. This also implies that the UPX stub must be completely unmodfied, i.e. - the stub imbedded in your compressed program must be byte-identical - to the stub that is produced by the official unmodified UPX version. - 3. The decompressor and any other code from the stub must exclusively get - used by the unmodified UPX stub for decompressing your program at - program startup. No portion of the stub may get read, copied, - called or otherwise get used or accessed by your program. - - -ANNOTATIONS -=========== - - - You can use a modified UPX version or modified UPX stub only for - programs that are compatible with the GNU General Public License. - - - We grant you special permission to freely use and distribute all UPX - compressed programs. But any modification of the UPX stub (such as, - but not limited to, removing our copyright string or making your - program non-decompressible) will immediately revoke your right to - use and distribute a UPX compressed program. - - - UPX is not a software protection tool; by requiring that you use - the unmodified UPX version for your proprietary programs we - make sure that any user can decompress your program. This protects - both you and your users as nobody can hide malicious code - - any program that cannot be decompressed is highly suspicious - by definition. - - - You can integrate all or part of UPX and UCL into projects that - are compatible with the GNU GPL, but obviously you cannot grant - any special exceptions beyond the GPL for our code in your project. - - - We want to actively support manufacturers of virus scanners and - similar security software. Please contact us if you would like to - incorporate parts of UPX or UCL into such a product. - - - -Markus F.X.J. Oberhumer Laszlo Molnar -markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu - -Linz, Austria, 25 Feb 2000 - -Additional License(s) - -The UPX license file is at http://upx.sourceforge.net/upx-license.html. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Xfree86-VidMode Extension 1.0, -which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris. - ---- begin of LICENSE --- - -Version 1.1 of XFree86 ProjectLicence. - -Copyright (C) 1994-2004 The XFree86 Project, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicence, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so,subject to the following conditions: - - 1. Redistributions of source code must retain the above copyright - notice,this list of conditions, and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution, and in the same place - and form as other copyright, license and disclaimer information. - - 3. The end-user documentation included with the redistribution, if any,must - include the following acknowledgment: "This product includes - software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and - its contributors", in the same place and form as other third-party - acknowledgments. Alternately, this acknowledgment may appear in the software - itself, in the same form and location as other such third-party - acknowledgments. - - 4. Except as contained in this notice, the name of The XFree86 Project,Inc - shall not be used in advertising or otherwise to promote the sale, use - or other dealings in this Software without prior written authorization from - The XFree86 Project, Inc. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to X Window System 6.8.2, which may be -included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris. - ---- begin of LICENSE --- - - Licenses -The X.Org Foundation March 2004 - -1. Introduction - -The X.org Foundation X Window System distribution is a compilation of code and -documentation from many sources. This document is intended primarily as a -guide to the licenses used in the distribution: you must check each file -and/or package for precise redistribution terms. None-the-less, this summary -may be useful to many users. No software incorporating the XFree86 1.1 license -has been incorporated. - -This document is based on the compilation from XFree86. - -2. XFree86 License - -XFree86 code without an explicit copyright is covered by the following -copyright/license: - -Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the XFree86 Project shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from the XFree86 Project. - -3. Other Licenses - -Portions of code are covered by the following licenses/copyrights. See -individual files for the copyright dates. - -3.1. X/MIT Copyrights - -3.1.1. X Consortium - -Copyright (C) X Consortium - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X -CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the X Consortium shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -this Software without prior written authorization from the X Consortium. - -X Window System is a trademark of X Consortium, Inc. - -3.1.2. The Open Group - -Copyright The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that the -above copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation. - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -this Software without prior written authorization from The Open Group. 3.2. -Berkeley-based copyrights: - -o -3.2.1. General - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.2.2. UCB/LBL - -Copyright (c) 1993 The Regents of the University of California. All rights -reserved. - -This software was developed by the Computer Systems Engineering group at -Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and contributed to -Berkeley. - -All advertising materials mentioning features or use of this software must -display the following acknowledgement: This product includes software -developed by the University of California, Lawrence Berkeley Laboratory. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: This product includes software - developed by the University of California, Berkeley and its contributors. - - 4. Neither the name of the University nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.3. The -NetBSD Foundation, Inc. - -Copyright (c) 2003 The NetBSD Foundation, Inc. All rights reserved. - -This code is derived from software contributed to The NetBSD Foundation by Ben -Collver - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: This product includes software - developed by the NetBSD Foundation, Inc. and its contributors. - - 4. Neither the name of The NetBSD Foundation nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.4. Theodore -Ts'o. - -Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All rights -reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - and the entire permission notice in its entirety, including the disclaimer - of warranties. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. he name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE, ALL OF WHICH ARE HEREBY DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.2.5. Theo de Raadt and Damien Miller - -Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. Copyright (c) -2001-2002 Damien Miller. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.2.6. Todd C. Miller - -Copyright (c) 1998 Todd C. Miller - -Permission to use, copy, modify, and distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright -notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3.2.7. Thomas -Winischhofer - -Copyright (C) 2001-2004 Thomas Winischhofer - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.3. NVIDIA Corp - -Copyright (c) 1996 NVIDIA, Corp. All rights reserved. - -NOTICE TO USER: The source code is copyrighted under U.S. and international -laws. NVIDIA, Corp. of Sunnyvale, California owns the copyright and as design -patents pending on the design and interface of the NV chips. Users and -possessors of this source code are hereby granted a nonexclusive, royalty-free -copyright and design patent license to use this code in individual and -commercial software. - -Any use of this source code must include, in the user documentation and -internal comments to the code, notices to the end user as follows: - -Copyright (c) 1996 NVIDIA, Corp. NVIDIA design patents pending in the U.S. and -foreign countries. - -NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE -CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED -WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE -FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. 3.4. GLX Public -License - -GLX PUBLIC LICENSE (Version 1.0 (2/11/99)) ("License") - -Subject to any third party claims, Silicon Graphics, Inc. ("SGI") hereby -grants permission to Recipient (defined below), under Recipient's copyrights -in the Original Software (defined below), to use, copy, modify, merge, -publish, distribute, sublicense and/or sell copies of Subject Software -(defined below), and to permit persons to whom the Subject Software is -furnished in accordance with this License to do the same, subject to all of -the following terms and conditions, which Recipient accepts by engaging in any -such use, copying, modifying, merging, publishing, distributing, sublicensing -or selling: - -1. Definitions. - - (a) "Original Software" means source code of computer software code which - is described in Exhibit A as Original Software. - - (b) "Modifications" means any addition to or deletion from the substance - or structure of either the Original Software or any previous - Modifications. When Subject Software is released as a series of files, a - Modification means (i) any addition to or deletion from the contents of a - file containing Original Software or previous Modifications and (ii) any - new file that contains any part of the Original Code or previous - Modifications. - - (c) "Subject Software" means the Original Software or Modifications or the - combination of the Original Software and Modifications, or portions of any - of the foregoing. - - (d) "Recipient" means an individual or a legal entity exercising rights - under, and complying with all of the terms of, this License. For legal - entities, "Recipient" includes any entity which controls, is controlled - by, or is under common control with Recipient. For purposes of this - definition, "control" of an entity means (a) the power, direct or - indirect, to direct or manage such entity, or (b) ownership of fifty - percent (50%) or more of the outstanding shares or beneficial ownership of - such entity. - -2. Redistribution of Source Code Subject to These Terms. Redistributions of -Subject Software in source code form must retain the notice set forth in -Exhibit A, below, in every file. A copy of this License must be included in -any documentation for such Subject Software where the recipients' rights -relating to Subject Software are described. Recipient may distribute the -source code version of Subject Software under a license of Recipient's choice, -which may contain terms different from this License, provided that (i) -Recipient is in compliance with the terms of this License, and (ii) the -license terms include this Section 2 and Sections 3, 4, 7, 8, 10, 12 and 13 of -this License, which terms may not be modified or superseded by any other terms -of such license. If Recipient distributes the source code version under a -different license Recipient must make it absolutely clear that any terms which -differ from this License are offered by Recipient alone, not by SGI. Recipient -hereby agrees to indemnify SGI for any liability incurred by SGI as a result -of any such terms Recipient offers. - -3. Redistribution in Executable Form. The notice set forth in Exhibit A must -be conspicuously included in any notice in an executable version of Subject -Software, related documentation or collateral in which Recipient describes the -user's rights relating to the Subject Software. Recipient may distribute the -executable version of Subject Software under a license of Recipient's choice, -which may contain terms different from this License, provided that (i) -Recipient is in compliance with the terms of this License, and (ii) the -license terms include this Section 3 and Sections 4, 7, 8, 10, 12 and 13 of -this License, which terms may not be modified or superseded by any other terms -of such license. If Recipient distributes the executable version under a -different license Recipient must make it absolutely clear that any terms which -differ from this License are offered by Recipient alone, not by SGI. Recipient -hereby agrees to indemnify SGI for any liability incurred by SGI as a result -of any such terms Recipient offers. - -4. Termination. This License and the rights granted hereunder will terminate -automatically if Recipient fails to comply with terms herein and fails to cure -such breach within 30 days of the breach. Any sublicense to the Subject -Software which is properly granted shall survive any termination of this -License absent termination by the terms of such sublicense. Provisions which, -by their nature, must remain in effect beyond the termination of this License -shall survive. - -5. No Trademark Rights. This License does not grant any rights to use any -trade name, trademark or service mark whatsoever. No trade name, trademark or -service mark of SGI may be used to endorse or promote products derived from -the Subject Software without prior written permission of SGI. - -6. No Other Rights. This License does not grant any rights with respect to the -OpenGL API or to any software or hardware implementation thereof or to any -other software whatsoever, nor shall any other rights or licenses not -expressly granted hereunder arise by implication, estoppel or otherwise with -respect to the Subject Software. Title to and ownership of the Original -Software at all times remains with SGI. All rights in the Original Software -not expressly granted under this License are reserved. - -7. Compliance with Laws; Non-Infringement. Recipient shall comply with all -applicable laws and regulations in connection with use and distribution of the -Subject Software, including but not limited to, all export and import control -laws and regulations of the U.S. government and other countries. Recipient may -not distribute Subject Software that (i) in any way infringes (directly or -contributorily) the rights (including patent, copyright, trade secret, -trademark or other intellectual property rights of any kind) of any other -person or entity or (ii) breaches any representation or warranty, express, -implied or statutory, which under any applicable law it might be deemed to -have been distributed. - -8. Claims of Infringement. If Recipient at any time has knowledge of any one -or more third party claims that reproduction, modification, use, distribution, -import or sale of Subject Software (including particular functionality or code -incorporated in Subject Software) infringes the third party's intellectual -property rights, Recipient must place in a well-identified web page bearing -the title "LEGAL" a description of each such claim and a description of the -party making each such claim in sufficient detail that a user of the Subject -Software will know whom to contact regarding the claim. Also, upon gaining -such knowledge of any such claim, Recipient must conspicuously include the URL -for such web page in the Exhibit A notice required under Sections 2 and 3, -above, and in the text of any related documentation, license agreement or -collateral in which Recipient describes end user's rights relating to the -Subject Software. If Recipient obtains such knowledge after it makes Subject -Software available to any other person or entity, Recipient shall take other -steps (such as notifying appropriate mailing lists or newsgroups) reasonably -calculated to inform those who received the Subject Software that new -knowledge has been obtained. - -9. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, -WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT -LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS, -MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- INFRINGING. SGI ASSUMES NO -RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE -PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY -SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN -ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED -HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, -WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), -CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY -CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK -STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER -COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF -THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY -TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO -THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT -ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO -THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT. - -11. Indemnity. Recipient shall be solely responsible for damages arising, -directly or indirectly, out of its utilization of rights under this License. -Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from -and against any loss, liability, damages, costs or expenses (including the -payment of reasonable attorneys fees) arising out of Recipient's use, -modification, reproduction and distribution of the Subject Software or out of -any representation or warranty made by Recipient. - -12. U.S. Government End Users. The Subject Software is a "commercial item" -consisting of "commercial computer software" as such terms are defined in -title 48 of the Code of Federal Regulations and all U.S. Government End Users -acquire only the rights set forth in this License and are subject to the terms -of this License. - -13. Miscellaneous. This License represents the complete agreement concerning -subject matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed so as to achieve as nearly as -possible the same economic effect as the original provision and the remainder -of this License will remain in effect. This License shall be governed by and -construed in accordance with the laws of the United States and the State of -California as applied to agreements entered into and to be performed entirely -within California between California residents. Any litigation relating to -this License shall be subject to the exclusive jurisdiction of the Federal -Courts of the Northern District of California (or, absent subject matter -jurisdiction in such courts, the courts of the State of California), with -venue lying exclusively in Santa Clara County, California, with the losing -party responsible for costs, including without limitation, court costs and -reasonable attorneys fees and expenses. The application of the United Nations -Convention on Contracts for the International Sale of Goods is expressly -excluded. Any law or regulation which provides that the language of a contract -shall be construed against the drafter shall not apply to this License. - -Exhibit A - -The contents of this file are subject to Sections 2, 3, 4, 7, 8, 10, 12 and 13 -of the GLX Public License Version 1.0 (the "License"). You may not use this -file except in compliance with those sections of the License. You may obtain a -copy of the License at Silicon Graphics, Inc., attn: Legal Services, 2011 N. -Shoreline Blvd., Mountain View, CA 94043 or at -http://www.sgi.com/software/opensource/glx/license.html. - -Software distributed under the License is distributed on an "AS IS" basis. ALL -WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF NON- -INFRINGEMENT. See the License for the specific language governing rights and -limitations under the License. - -The Original Software is GLX version 1.2 source code, released February, 1999. -The developer of the Original Software is Silicon Graphics, Inc. Those -portions of the Subject Software created by Silicon Graphics, Inc. are -Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. 3.5. CID -Font Code Public License - -CID FONT CODE PUBLIC LICENSE (Version 1.0 (3/31/99))("License") - -Subject to any applicable third party claims, Silicon Graphics, Inc. ("SGI") -hereby grants permission to Recipient (defined below), under SGI's copyrights -in the Original Software (defined below), to use, copy, modify, merge, -publish, distribute, sublicense and/or sell copies of Subject Software -(defined below) in both source code and executable form, and to permit persons -to whom the Subject Software is furnished in accordance with this License to -do the same, subject to all of the following terms and conditions, which -Recipient accepts by engaging in any such use, copying, modifying, merging, -publication, distributing, sublicensing or selling: - -1. Definitions. - - a. "Original Software" means source code of computer software code that is - described in Exhibit A as Original Software. - - b. "Modifications" means any addition to or deletion from the substance or - structure of either the Original Software or any previous Modifications. - When Subject Software is released as a series of files, a Modification - means (i) any addition to or deletion from the contents of a file - containing Original Software or previous Modifications and (ii) any new - file that contains any part of the Original Code or previous - Modifications. - - c. "Subject Software" means the Original Software or Modifications or the - combination of the Original Software and Modifications, or portions of any - of the foregoing. - - d. "Recipient" means an individual or a legal entity exercising rights - under the terms of this License. For legal entities, "Recipient" includes - any entity that controls, is controlled by, or is under common control - with Recipient. For purposes of this definition, "control" of an entity - means (i) the power, direct or indirect, to direct or manage such entity, - or (ii) ownership of fifty percent (50%) or more of the outstanding shares - or beneficial ownership of such entity. - - e. "Required Notice" means the notice set forth in Exhibit A to this - License. - - f. "Accompanying Technology" means any software or other technology that - is not a Modification and that is distributed or made publicly available - by Recipient with the Subject Software. Separate software files that do - not contain any Original Software or any previous Modification shall not - be deemed a Modification, even if such software files are aggregated as - part of a product, or in any medium of storage, with any file that does - contain Original Software or any previous Modification. - -2. License Terms. All distribution of the Subject Software must be made -subject to the terms of this License. A copy of this License and the Required -Notice must be included in any documentation for Subject Software where -Recipient's rights relating to Subject Software and/or any Accompanying -Technology are described. Distributions of Subject Software in source code -form must also include the Required Notice in every file distributed. In -addition, a ReadMe file entitled "Important Legal Notice" must be distributed -with each distribution of one or more files that incorporate Subject Software. -That file must be included with distributions made in both source code and -executable form. A copy of the License and the Required Notice must be -included in that file. Recipient may distribute Accompanying Technology under -a license of Recipient's choice, which may contain terms different from this -License, provided that (i) Recipient is in compliance with the terms of this -License, (ii) such other license terms do not modify or supersede the terms of -this License as applicable to the Subject Software, (iii) Recipient hereby -indemnifies SGI for any liability incurred by SGI as a result of the -distribution of Accompanying Technology or the use of other license terms. - -3. Termination. This License and the rights granted hereunder will terminate -automatically if Recipient fails to comply with terms herein and fails to cure -such breach within 30 days of the breach. Any sublicense to the Subject -Software that is properly granted shall survive any termination of this -License absent termination by the terms of such sublicense. Provisions which, -by their nature, must remain in effect beyond the termination of this License -shall survive. - -4. Trademark Rights. This License does not grant any rights to use any trade -name, trademark or service mark whatsoever. No trade name, trademark or -service mark of SGI may be used to endorse or promote products derived from or -incorporating any Subject Software without prior written permission of SGI. - -5. No Other Rights. No rights or licenses not expressly granted hereunder -shall arise by implication, estoppel or otherwise. Title to and ownership of -the Original Software at all times remains with SGI. All rights in the -Original Software not expressly granted under this License are reserved. - -6. Compliance with Laws; Non-Infringement. Recipient shall comply with all -applicable laws and regulations in connection with use and distribution of the -Subject Software, including but not limited to, all export and import control -laws and regulations of the U.S. government and other countries. Recipient may -not distribute Subject Software that (i) in any way infringes (directly or -contributorily) the rights (including patent, copyright, trade secret, -trademark or other intellectual property rights of any kind) of any other -person or entity, or (ii) breaches any representation or warranty, express, -implied or statutory, which under any applicable law it might be deemed to -have been distributed. - -7. Claims of Infringement. If Recipient at any time has knowledge of any one -or more third party claims that reproduction, modification, use, distribution, -import or sale of Subject Software (including particular functionality or code -incorporated in Subject Software) infringes the third party's intellectual -property rights, Recipient must place in a well-identified web page bearing -the title "LEGAL" a description of each such claim and a description of the -party making each such claim in sufficient detail that a user of the Subject -Software will know whom to contact regarding the claim. Also, upon gaining -such knowledge of any such claim, Recipient must conspicuously include the URL -for such web page in the Required Notice, and in the text of any related -documentation, license agreement or collateral in which Recipient describes -end user's rights relating to the Subject Software. If Recipient obtains such -knowledge after it makes Subject Software available to any other person or -entity, Recipient shall take other steps (such as notifying appropriate -mailing lists or newsgroups) reasonably calculated to provide such knowledge -to those who received the Subject Software. - -8. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, -WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT -LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS, -MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. SGI ASSUMES NO -RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE -PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY -SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN -ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED -HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, -WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), -CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SUBJECT SOFTWARE OR -THE USE OR OTHER DEALINGS IN THE SUBJECT SOFTWARE. SOME JURISDICTIONS DO NOT -ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO THIS EXCLUSION AND -LIMITATION MAY NOT APPLY TO RECIPIENT TO THE EXTENT SO DISALLOWED. - -10. Indemnity. Recipient shall be solely responsible for damages arising, -directly or indirectly, out of its utilization of rights under this License. -Recipient will defend, indemnify and hold SGI and its successors and assigns -harmless from and against any loss, liability, damages, costs or expenses -(including the payment of reasonable attorneys fees) arising out of -(Recipient's use, modification, reproduction and distribution of the Subject -Software or out of any representation or warranty made by Recipient. - -11. U.S. Government End Users. The Subject Software is a "commercial item" -consisting of "commercial computer software" as such terms are defined in -title 48 of the Code of Federal Regulations and all U.S. Government End Users -acquire only the rights set forth in this License and are subject to the terms -of this License. - -12. Miscellaneous. This License represents the complete agreement concerning -subject matter hereof. If any provision of this License is held to be -unenforceable by any judicial or administrative authority having proper -jurisdiction with respect thereto, such provision shall be reformed so as to -achieve as nearly as possible the same economic effect as the original -provision and the remainder of this License will remain in effect. This -License shall be governed by and construed in accordance with the laws of the -United States and the State of California as applied to agreements entered -into and to be performed entirely within California between California -residents. Any litigation relating to this License shall be subject to the -exclusive jurisdiction of the Federal Courts of the Northern District of -California (or, absent subject matter jurisdiction in such courts, the courts -of the State of California), with venue lying exclusively in Santa Clara -County, California, with the losing party responsible for costs, including -without limitation, court costs and reasonable attorneys fees and expenses. -The application of the United Nations Convention on Contracts for the -International Sale of Goods is expressly excluded. Any law or regulation that -provides that the language of a contract shall be construed against the -drafter shall not apply to this License. - -Exhibit A - -Copyright (c) 1994-1999 Silicon Graphics, Inc. - -The contents of this file are subject to the CID Font Code Public License -Version 1.0 (the "License"). You may not use this file except in compliance -with the License. You may obtain a copy of the License at Silicon Graphics, -Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 -or at http://www.sgi.com/software/opensource/cid/license.html - -Software distributed under the License is distributed on an "AS IS" basis. ALL -WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF -NON-INFRINGEMENT. See the License for the specific language governing rights -and limitations under the License. - -The Original Software (as defined in the License) is CID font code that was -developed by Silicon Graphics, Inc. Those portions of the Subject Software (as -defined in the License) that were created by Silicon Graphics, Inc. are -Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - -[NOTE: When using this text in connection with Subject Software delivered -solely in object code form, Recipient may replace the words "this file" with -"this software" in both the first and second sentences.] 3.6. Bitstream Vera -Fonts Copyright - -The fonts have a generous copyright, allowing derivative works (as long as -"Bitstream" or "Vera" are not in the names), and full redistribution (so long -as they are not *sold* by themselves). They can be be bundled, redistributed -and sold with any software. - -The fonts are distributed under the following copyright: - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a -trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated documentation -files (the "Font Software"), to reproduce and distribute the Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit persons to -whom the Font Software is furnished to do so, subject to the following -conditions: - -The above copyright and trademark notices and this permission notice shall be -included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular the -designs of glyphs or characters in the Fonts may be modified and additional -glyphs or characters may be added to the Fonts, only if the fonts are renamed -to names not containing either the words "Bitstream" or the word "Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream Vera" -names. - -The Font Software may be sold as part of a larger software package but no copy -of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, -SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO -USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome Foundation, -and Bitstream Inc., shall not be used in advertising or otherwise to promote -the sale, use or other dealings in this Font Software without prior written -authorization from the Gnome Foundation or Bitstream Inc., respectively. For -further information, contact: fonts at gnome dot org. 3.7. Bigelow & Holmes -Inc and URW++ GmbH Luxi font license - -Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font instruction -code copyright (c) 2001 by URW++ GmbH. All Rights Reserved. Luxi is a -registered trademark of Bigelow & Holmes Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of these Fonts and associated documentation files (the "Font Software"), to -deal in the Font Software, including without limitation the rights to use, -copy, merge, publish, distribute, sublicense, and/or sell copies of the Font -Software, and to permit persons to whom the Font Software is furnished to do -so, subject to the following conditions: - -The above copyright and trademark notices and this permission notice shall be -included in all copies of one or more of the Font Software. - -The Font Software may not be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may not be modified nor may -additional glyphs or characters be added to the Fonts. This License becomes -null and void when the Fonts or Font Software have been modified. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BIGELOW & HOLMES INC. OR URW++ -GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY -GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR -INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT -SOFTWARE. - -Except as contained in this notice, the names of Bigelow & Holmes Inc. and -URW++ GmbH. shall not be used in advertising or otherwise to promote the sale, -use or other dealings in this Font Software without prior written -authorization from Bigelow & Holmes Inc. and URW++ GmbH. - -For further information, contact: - -info@urwpp.de or design@bigelowandholmes.com - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to zlib v1.2.5, which may be included -with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - version 1.2.5, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to the following which may be -included with JRE 8, JDK 8, and OpenJDK 8, except where noted: - - Apache Commons Math 2.2 - Apache Derby 10.10.1.2 [included with JDK 8] - Apache Jakarta BCEL 5.2 - Apache Jakarta Regexp 1.4 - Apache Santuario XML Security for Java 1.5.4 - Apache Xalan-Java 2.7.1 - Apache Xerces Java 2.10.0 - Apache XML Resolver 1.1 - Dynalink 0.5 - - ---- begin of LICENSE --- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/.hgtags --- a/hotspot/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -552,3 +552,5 @@ 132a72c782071cc11ab25cc7c9ee167c3632fea4 jdk-9+147 5e4e893520ecdbd517c6ed6375f0885664fe62c4 jdk-9+148 30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149 +98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150 +2a2ac7d9f52c8cb2b80077e515b5840b947e640c jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/THIRD_PARTY_README --- a/hotspot/THIRD_PARTY_README Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3605 +0,0 @@ -DO NOT TRANSLATE OR LOCALIZE. ------------------------------ - -%% This notice is provided with respect to ASM Bytecode Manipulation -Framework v5.0, which may be included with JRE 8, and JDK 8, and -OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2000-2011 France Télécom -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - --------------------------------------------------------------------------------- - -%% This notice is provided with respect to BSDiff v4.3, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright 2003-2005 Colin Percival -All rights reserved - -Redistribution and use in source and binary forms, with or without -modification, are permitted providing that the following conditions -are met: -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to CodeViewer 1.0, which may be -included with JDK 8. - ---- begin of LICENSE --- - -Copyright 1999 by CoolServlets.com. - -Any errors or suggested improvements to this class can be reported as -instructed on CoolServlets.com. We hope you enjoy this program... your -comments will encourage further development! This software is distributed -under the terms of the BSD License. Redistribution and use in source and -binary forms, with or without modification, are permitted provided that the -following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -Neither name of CoolServlets.com nor the names of its contributors may be -used to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Cryptix AES 3.2.0, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Cryptix General License - -Copyright (c) 1995-2005 The Cryptix Foundation Limited. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - 1. Redistributions of source code must retain the copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND -CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to CUP Parser Generator for -Java 0.10k, which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, provided -that the above copyright notice appear in all copies and that both the -copyright notice and this permission notice and warranty disclaimer appear in -supporting documentation, and that the names of the authors or their -employers not be used in advertising or publicity pertaining to distribution of -the software without specific, written prior permission. - -The authors and their employers disclaim all warranties with regard to -this software, including all implied warranties of merchantability and fitness. -In no event shall the authors or their employers be liable for any special, -indirect or consequential damages or any damages whatsoever resulting from -loss of use, data or profits, whether in an action of contract, negligence or -other tortious action, arising out of or in connection with the use or -performance of this software. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Document Object Model (DOM) Level 2 -& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -W3C SOFTWARE NOTICE AND LICENSE - -http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - -This work (and included software, documentation such as READMEs, or other -related items) is being provided by the copyright holders under the following -license. By obtaining, using and/or copying this work, you (the licensee) -agree that you have read, understood, and will comply with the following terms -and conditions. - -Permission to copy, modify, and distribute this software and its -documentation, with or without modification, for any purpose and without fee -or royalty is hereby granted, provided that you include the following on ALL -copies of the software and documentation or portions thereof, including -modifications: - - 1.The full text of this NOTICE in a location viewable to users of the - redistributed or derivative work. - - 2.Any pre-existing intellectual property disclaimers, notices, or terms and - conditions. If none exist, the W3C Software Short Notice should be included - (hypertext is preferred, text is permitted) within the body of any - redistributed or derivative code. - - 3.Notice of any changes or modifications to the files, including the date - changes were made. (We recommend you provide URIs to the location from - which the code is derived.) - -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS -MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR -PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY -THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL -OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR -DOCUMENTATION. The name and trademarks of copyright holders may NOT be used -in advertising or publicity pertaining to the software without specific, -written prior permission. Title to copyright in this software and any -associated documentation will at all times remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on December 31 -2002. This version removes the copyright ownership notice such that this -license can be used with materials other than those owned by the W3C, reflects -that ERCIM is now a host of the W3C, includes references to this specific -dated version of the license, and removes the ambiguous grant of "use". -Otherwise, this version is the same as the previous version and is written so -as to preserve the Free Software Foundation's assessment of GPL compatibility -and OSI's certification under the Open Source Definition. Please see our -Copyright FAQ for common questions about using materials from our site, -including specific terms and conditions for packages like libwww, Amaya, and -Jigsaw. Other questions about this notice can be directed to -site-policy@w3.org. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Dynalink v0.5, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2009-2013, Attila Szegedi - -All rights reserved.Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the following conditions are -met:* Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. * Redistributions in -binary form must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. * Neither the name of Attila -Szegedi nor the names of its contributors may be used to endorse or promote -products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Elliptic Curve Cryptography, which -may be included with JRE 8, JDK 8, and OpenJDK 8. - -You are receiving a copy of the Elliptic Curve Cryptography library in source -form with the JDK 8 and OpenJDK 8 source distributions, and as object code in -the JRE 8 & JDK 8 runtimes. - -In the case of the JRE 8 & JDK 8 runtimes, the terms of the Oracle license do -NOT apply to the Elliptic Curve Cryptography library; it is licensed under the -following license, separately from Oracle's JDK & JRE. If you do not wish to -install the Elliptic Curve Cryptography library, you may delete the library -named libsunec.so (on Solaris and Linux systems) or sunec.dll (on Windows -systems) from the JRE bin directory reserved for native libraries. - - ---- begin of LICENSE --- - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to ECMAScript Language -Specification ECMA-262 Edition 5.1 which may be included with -JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright notice -Copyright © 2011 Ecma International -Ecma International -Rue du Rhone 114 -CH-1204 Geneva -Tel: +41 22 849 6000 -Fax: +41 22 849 6001 -Web: http://www.ecma-international.org - -This document and possible translations of it may be copied and furnished to -others, and derivative works that comment on or otherwise explain it or assist -in its implementation may be prepared, copied, published, and distributed, in -whole or in part, without restriction of any kind, provided that the above -copyright notice and this section are included on all such copies and derivative -works. However, this document itself may not be modified in any way, including -by removing the copyright notice or references to Ecma International, except as -needed for the purpose of developing any document or deliverable produced by -Ecma International (in which case the rules applied to copyrights must be -followed) or as required to translate it into languages other than English. The -limited permissions granted above are perpetual and will not be revoked by Ecma -International or its successors or assigns. This document and the information -contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL -DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY -WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP -RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE." Software License - -All Software contained in this document ("Software)" is protected by copyright -and is being made available under the "BSD License", included below. This -Software may be subject to third party rights (rights from parties other than -Ecma International), including patent rights, and no licenses under such third -party rights are granted under this license even if the third party concerned is -a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS -AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR -INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO -IMPLEMENT ECMA INTERNATIONAL STANDARDS*. Redistribution and use in source and -binary forms, with or without modification, are permitted provided that the -following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of the authors nor Ecma International may be used to endorse -or promote products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. ---- end of LICENSE --- - -%% This notice is provided with respect to Dynalink library which is included -with the Nashorn technology. - ---- begin of LICENSE --- -Copyright (c) 2009-2013, Attila Szegedi - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of the copyright holder nor the names of - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---- end of LICENSE --- - -%% This notice is provided with respect to Joni library which is included -with the Nashorn technology. - ---- begin of LICENSE --- -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to FontConfig 2.5, which may be -included with JRE 8, JDK 8, and OpenJDK 8 source distributions on -Linux and Solaris. - ---- begin of LICENSE --- - -Copyright © 2001,2003 Keith Packard - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that the -above copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation, and that -the name of Keith Packard not be used in advertising or publicity pertaining -to distribution of the software without specific, written prior permission. -Keith Packard makes no representations about the suitability of this software -for any purpose. It is provided "as is" without express or implied warranty. - -KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL KEITH -PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to IAIK PKCS#11 Wrapper, -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -IAIK PKCS#11 Wrapper License - -Copyright (c) 2002 Graz University of Technology. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: - - "This product includes software developed by IAIK of Graz University of - Technology." - - Alternately, this acknowledgment may appear in the software itself, if and - wherever such third-party acknowledgments normally appear. - -4. The names "Graz University of Technology" and "IAIK of Graz University of - Technology" must not be used to endorse or promote products derived from this - software without prior written permission. - -5. Products derived from this software may not be called "IAIK PKCS Wrapper", - nor may "IAIK" appear in their name, without prior written permission of - Graz University of Technology. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to ICU4C 4.0.1 and ICU4J 4.4, which -may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 1995-2010 International Business Machines Corporation and others - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, and/or sell copies of the -Software, and to permit persons to whom the Software is furnished to do so, -provided that the above copyright notice(s) and this permission notice appear -in all copies of the Software and that both the above copyright notice(s) and -this permission notice appear in supporting documentation. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN -NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE -LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization of the copyright holder. -All trademarks and registered trademarks mentioned herein are the property of -their respective owners. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to IJG JPEG 6b, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -This software is copyright (C) 1991-1998, Thomas G. Lane. -All Rights Reserved except as specified below. - -Permission is hereby granted to use, copy, modify, and distribute this -software (or portions thereof) for any purpose, without fee, subject to these -conditions: -(1) If any part of the source code for this software is distributed, then this -README file must be included, with this copyright and no-warranty notice -unaltered; and any additions, deletions, or changes to the original files -must be clearly indicated in accompanying documentation. -(2) If only executable code is distributed, then the accompanying -documentation must state that "this software is based in part on the work of -the Independent JPEG Group". -(3) Permission for use of this software is granted only if the user accepts -full responsibility for any undesirable consequences; the authors accept -NO LIABILITY for damages of any kind. - -These conditions apply to any software derived from or based on the IJG code, -not just to the unmodified library. If you use our work, you ought to -acknowledge us. - -Permission is NOT granted for the use of any IJG author's name or company name -in advertising or publicity relating to this software or products derived from -it. This software may be referred to only as "the Independent JPEG Group's -software". - -We specifically permit and encourage the use of this software as the basis of -commercial products, provided that all warranty or liability claims are -assumed by the product vendor. - ---- end of LICENSE --- - --------------------------------------------------------------------------------- - -%% This notice is provided with respect to Joni v1.1.9, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to JOpt-Simple v3.0, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - Copyright (c) 2004-2009 Paul R. Holser, Jr. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---- end of LICENSE --- - --------------------------------------------------------------------------------- - -%% This notice is provided with respect to JSON, which may be included -with JRE 8 & JDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2002 JSON.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Kerberos functionality, which -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - (C) Copyright IBM Corp. 1999 All Rights Reserved. - Copyright 1997 The Open Group Research Institute. All rights reserved. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Kerberos functionality from -FundsXpress, INC., which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - Copyright (C) 1998 by the FundsXpress, INC. - - All rights reserved. - - Export of this software from the United States of America may require - a specific license from the United States Government. It is the - responsibility of any person or organization contemplating export to - obtain such a license before exporting. - - WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - distribute this software and its documentation for any purpose and - without fee is hereby granted, provided that the above copyright - notice appear in all copies and that both that copyright notice and - this permission notice appear in supporting documentation, and that - the name of FundsXpress. not be used in advertising or publicity pertaining - to distribution of the software without specific, written prior - permission. FundsXpress makes no representations about the suitability of - this software for any purpose. It is provided "as is" without express - or implied warranty. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Kronos OpenGL headers, which may be -included with JDK 8 and OpenJDK 8 source distributions. - ---- begin of LICENSE --- - - Copyright (c) 2007 The Khronos Group Inc. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and/or associated documentation files (the "Materials"), to - deal in the Materials without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Materials, and to permit persons to whom the Materials are - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Materials. - - THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE - MATERIALS. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% Portions Copyright Eastman Kodak Company 1992 - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to libpng 1.5.4, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -This copy of the libpng notices is provided for your convenience. In case of -any discrepancy between this copy and the notices in the file png.h that is -included in the libpng distribution, the latter shall prevail. - -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - -If you modify libpng you may insert additional notices immediately following -this sentence. - -This code is released under the libpng license. - -libpng versions 1.2.6, August 15, 2004, through 1.5.4, July 7, 2011, are -Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.2.5 -with the following individual added to the list of Contributing Authors - - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are -Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.0.6 -with the following individuals added to the list of Contributing Authors - - Simon-Pierre Cadieux - Eric S. Raymond - Gilles Vollant - -and with the following additions to the disclaimer: - - There is no warranty against interference with your enjoyment of the - library or against infringement. There is no warranty that our - efforts or the library will fulfill any of your particular purposes - or needs. This library is provided with all faults, and the entire - risk of satisfactory quality, performance, accuracy, and effort is with - the user. - -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are -Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-0.96, -with the following individuals added to the list of Contributing Authors: - - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik - -libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88, -with the following individuals added to the list of Contributing Authors: - - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner - -libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - -For the purposes of this copyright and license, "Contributing Authors" -is defined as the following set of individuals: - - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner - -The PNG Reference Library is supplied "AS IS". The Contributing Authors -and Group 42, Inc. disclaim all warranties, expressed or implied, -including, without limitation, the warranties of merchantability and of -fitness for any purpose. The Contributing Authors and Group 42, Inc. -assume no liability for direct, indirect, incidental, special, exemplary, -or consequential damages, which may result from the use of the PNG -Reference Library, even if advised of the possibility of such damage. - -Permission is hereby granted to use, copy, modify, and distribute this -source code, or portions hereof, for any purpose, without fee, subject -to the following restrictions: - -1. The origin of this source code must not be misrepresented. - -2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. - -3. This Copyright notice may not be removed or altered from any - source or altered source distribution. - -The Contributing Authors and Group 42, Inc. specifically permit, without -fee, and encourage the use of this source code as a component to -supporting the PNG file format in commercial products. If you use this -source code in a product, acknowledgment is not required but would be -appreciated. - - -A "png_get_copyright" function is available, for convenient use in "about" -boxes and the like: - - printf("%s",png_get_copyright(NULL)); - -Also, the PNG logo (in PNG format, of course) is supplied in the -files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a -certification mark of the Open Source Initiative. - -Glenn Randers-Pehrson -glennrp at users.sourceforge.net -July 7, 2011 - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to libungif 4.1.3, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Little CMS 2.4, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Little CMS -Copyright (c) 1998-2010 Marti Maria Saguer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the -U.S. and other countries. - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Mesa 3D Graphics Library v4.1, -which may be included with JRE 8, JDK 8, and OpenJDK 8 source distributions. - ---- begin of LICENSE --- - - Mesa 3-D graphics library - Version: 4.1 - - Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Mozilla Network Security -Services (NSS), which is supplied with the JDK test suite in the OpenJDK -source code repository. It is licensed under Mozilla Public License (MPL), -version 2.0. - -The NSS libraries are supplied in executable form, built from unmodified -NSS source code labeled with the "NSS_3.13.1_RTM" release tag. - -The NSS source code is available in the OpenJDK source code repository at: - jdk/test/sun/security/pkcs11/nss/src - -The NSS libraries are available in the OpenJDK source code repository at: - jdk/test/sun/security/pkcs11/nss/lib - ---- begin of LICENSE --- - -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to PC/SC Lite for Suse Linux v.1.1.1, -which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris. - ---- begin of LICENSE --- - -Copyright (c) 1999-2004 David Corcoran -Copyright (c) 1999-2004 Ludovic Rousseau -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: - This product includes software developed by: - David Corcoran - http://www.linuxnet.com (MUSCLE) -4. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -Changes to this license can be made only by the copyright author with -explicit written consent. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to PorterStemmer v4, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -See: http://tartarus.org/~martin/PorterStemmer - -The software is completely free for any purpose, unless notes at the head of -the program text indicates otherwise (which is rare). In any case, the notes -about licensing are never more restrictive than the BSD License. - -In every case where the software is not written by me (Martin Porter), this -licensing arrangement has been endorsed by the contributor, and it is -therefore unnecessary to ask the contributor again to confirm it. - -I have not asked any contributors (or their employers, if they have them) for -proofs that they have the right to distribute their software in this way. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Relax NG Object/Parser v.20050510, -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) Kohsuke Kawaguchi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: The above copyright -notice and this permission notice shall be included in all copies or -substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to RelaxNGCC v1.12, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: - - "This product includes software developed by Daisuke Okajima - and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)." - -Alternately, this acknowledgment may appear in the software itself, if and -wherever such third-party acknowledgments normally appear. - -4. The names of the copyright holders must not be used to endorse or promote - products derived from this software without prior written permission. For - written permission, please contact the copyright holders. - -5. Products derived from this software may not be called "RELAXNGCC", nor may - "RELAXNGCC" appear in their name, without prior written permission of the - copyright holders. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE -SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to SAX 2.0.1, which may be included -with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - SAX is free! - - In fact, it's not possible to own a license to SAX, since it's been placed in - the public domain. - - No Warranty - - Because SAX is released to the public domain, there is no warranty for the - design or for the software implementation, to the extent permitted by - applicable law. Except when otherwise stated in writing the copyright holders - and/or other parties provide SAX "as is" without warranty of any kind, either - expressed or implied, including, but not limited to, the implied warranties - of merchantability and fitness for a particular purpose. The entire risk as - to the quality and performance of SAX is with you. Should SAX prove - defective, you assume the cost of all necessary servicing, repair or - correction. - - In no event unless required by applicable law or agreed to in writing will - any copyright holder, or any other party who may modify and/or redistribute - SAX, be liable to you for damages, including any general, special, incidental - or consequential damages arising out of the use or inability to use SAX - (including but not limited to loss of data or data being rendered inaccurate - or losses sustained by you or third parties or a failure of the SAX to - operate with any other programs), even if such holder or other party has been - advised of the possibility of such damages. - - Copyright Disclaimers - - This page includes statements to that effect by David Megginson, who would - have been able to claim copyright for the original work. SAX 1.0 - - Version 1.0 of the Simple API for XML (SAX), created collectively by the - membership of the XML-DEV mailing list, is hereby released into the public - domain. - - No one owns SAX: you may use it freely in both commercial and non-commercial - applications, bundle it with your software distribution, include it on a - CD-ROM, list the source code in a book, mirror the documentation at your own - web site, or use it in any other way you see fit. - - David Megginson, sax@megginson.com - 1998-05-11 - - SAX 2.0 - - I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and - release all of the SAX 2.0 source code, compiled code, and documentation - contained in this distribution into the Public Domain. SAX comes with NO - WARRANTY or guarantee of fitness for any purpose. - - David Megginson, david@megginson.com - 2000-05-05 - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to SoftFloat version 2b, which may be -included with JRE 8, JDK 8, and OpenJDK 8 on Linux/ARM. - ---- begin of LICENSE --- - -Use of any of this software is governed by the terms of the license below: - -SoftFloat was written by me, John R. Hauser. This work was made possible in -part by the International Computer Science Institute, located at Suite 600, -1947 Center Street, Berkeley, California 94704. Funding was partially -provided by the National Science Foundation under grant MIP-9311980. The -original version of this code was written as part of a project to build -a fixed-point vector processor in collaboration with the University of -California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek. - -THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort -has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT -TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO -PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL -LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO -FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER -SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, -COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE -SOFTWARE. - -Derivative works are acceptable, even for commercial purposes, provided -that the minimal documentation requirements stated in the source code are -satisfied. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Sparkle 1.5, -which may be included with JRE 8 on Mac OS X. - ---- begin of LICENSE --- - -Copyright (c) 2012 Sparkle.org and Andy Matuschak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% Portions licensed from Taligent, Inc. - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Thai Dictionary, which may be -included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Copyright (C) 1982 The Royal Institute, Thai Royal Government. - -Copyright (C) 1998 National Electronics and Computer Technology Center, -National Science and Technology Development Agency, -Ministry of Science Technology and Environment, -Thai Royal Government. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Unicode 6.2.0 & CLDR 21.0.1 -which may be included with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - -Unicode Terms of Use - -For the general privacy policy governing access to this site, see the Unicode -Privacy Policy. For trademark usage, see the Unicode® Consortium Name and -Trademark Usage Policy. - -A. Unicode Copyright. - 1. Copyright © 1991-2013 Unicode, Inc. All rights reserved. - - 2. Certain documents and files on this website contain a legend indicating - that "Modification is permitted." Any person is hereby authorized, - without fee, to modify such documents and files to create derivative - works conforming to the Unicode® Standard, subject to Terms and - Conditions herein. - - 3. Any person is hereby authorized, without fee, to view, use, reproduce, - and distribute all documents and files solely for informational - purposes in the creation of products supporting the Unicode Standard, - subject to the Terms and Conditions herein. - - 4. Further specifications of rights and restrictions pertaining to the use - of the particular set of data files known as the "Unicode Character - Database" can be found in Exhibit 1. - - 5. Each version of the Unicode Standard has further specifications of - rights and restrictions of use. For the book editions (Unicode 5.0 and - earlier), these are found on the back of the title page. The online - code charts carry specific restrictions. All other files, including - online documentation of the core specification for Unicode 6.0 and - later, are covered under these general Terms of Use. - - 6. No license is granted to "mirror" the Unicode website where a fee is - charged for access to the "mirror" site. - - 7. Modification is not permitted with respect to this document. All copies - of this document must be verbatim. - -B. Restricted Rights Legend. Any technical data or software which is licensed - to the United States of America, its agencies and/or instrumentalities - under this Agreement is commercial technical data or commercial computer - software developed exclusively at private expense as defined in FAR 2.101, - or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use, - duplication, or disclosure by the Government is subject to restrictions as - set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov - 1995) and this Agreement. For Software, in accordance with FAR 12-212 or - DFARS 227-7202, as applicable, use, duplication or disclosure by the - Government is subject to the restrictions set forth in this Agreement. - -C. Warranties and Disclaimers. - 1. This publication and/or website may include technical or typographical - errors or other inaccuracies . Changes are periodically added to the - information herein; these changes will be incorporated in new editions - of the publication and/or website. Unicode may make improvements and/or - changes in the product(s) and/or program(s) described in this - publication and/or website at any time. - - 2. If this file has been purchased on magnetic or optical media from - Unicode, Inc. the sole and exclusive remedy for any claim will be - exchange of the defective media within ninety (90) days of original - purchase. - - 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS - PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED, - OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. - UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR - OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH - ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE. - -D. Waiver of Damages. In no event shall Unicode or its licensors be liable for - any special, incidental, indirect or consequential damages of any kind, or - any damages whatsoever, whether or not Unicode was advised of the - possibility of the damage, including, without limitation, those resulting - from the following: loss of use, data or profits, in connection with the - use, modification or distribution of this information or its derivatives. - -E.Trademarks & Logos. - 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode, - Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of - Unicode, Inc. Use of the information and materials found on this - website indicates your acknowledgement of Unicode, Inc.’s exclusive - worldwide rights in the Unicode Word Mark, the Unicode Logo, and the - Unicode trade names. - - 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark - Policy”) are incorporated herein by reference and you agree to abide by - the provisions of the Trademark Policy, which may be changed from time - to time in the sole discretion of Unicode, Inc. - - 3. All third party trademarks referenced herein are the property of their - respective owners. - -Miscellaneous. - 1. Jurisdiction and Venue. This server is operated from a location in the - State of California, United States of America. Unicode makes no - representation that the materials are appropriate for use in other - locations. If you access this server from other locations, you are - responsible for compliance with local laws. This Agreement, all use of - this site and any claims and damages resulting from use of this site are - governed solely by the laws of the State of California without regard to - any principles which would apply the laws of a different jurisdiction. - The user agrees that any disputes regarding this site shall be resolved - solely in the courts located in Santa Clara County, California. The user - agrees said courts have personal jurisdiction and agree to waive any - right to transfer the dispute to any other forum. - - 2. Modification by Unicode. Unicode shall have the right to modify this - Agreement at any time by posting it to this site. The user may not - assign any part of this Agreement without Unicode’s prior written - consent. - - 3. Taxes. The user agrees to pay any taxes arising from access to this - website or use of the information herein, except for those based on - Unicode’s net income. - - 4. Severability. If any provision of this Agreement is declared invalid or - unenforceable, the remaining provisions of this Agreement shall remain - in effect. - - 5. Entire Agreement. This Agreement constitutes the entire agreement - between the parties. - -EXHIBIT 1 -UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE - -Unicode Data Files include all data files under the directories -http://www.unicode.org/Public/, http://www.unicode.org/reports/, and -http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF -online code charts under the directory http://www.unicode.org/Public/. -Software includes any source code published in the Unicode Standard or under -the directories http://www.unicode.org/Public/, -http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/. - -NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, -INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA -FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO -BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT -AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR -SOFTWARE. - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the -Terms of Use in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the Unicode data files and any associated documentation (the "Data Files") -or Unicode software and any associated documentation (the "Software") to deal -in the Data Files or Software without restriction, including without -limitation the rights to use, copy, modify, merge, publish, distribute, and/or -sell copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that (a) the above -copyright notice(s) and this permission notice appear with all copies of the -Data Files or Software, (b) both the above copyright notice(s) and this -permission notice appear in associated documentation, and (c) there is clear -notice in each modified Data File or in the Software as well as in the -documentation associated with the Data File(s) or Software that the data or -software has been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD -PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN -THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE -DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in these Data Files or Software without prior written authorization of the -copyright holder. - -Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United -States and other countries. All third party trademarks referenced herein are -the property of their respective owners. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to UPX v3.01, which may be included -with JRE 8 on Windows. - ---- begin of LICENSE --- - -Use of any of this software is governed by the terms of the license below: - - - ooooo ooo ooooooooo. ooooooo ooooo - `888' `8' `888 `Y88. `8888 d8' - 888 8 888 .d88' Y888..8P - 888 8 888ooo88P' `8888' - 888 8 888 .8PY888. - `88. .8' 888 d8' `888b - `YbodP' o888o o888o o88888o - - - The Ultimate Packer for eXecutables - Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar - http://wildsau.idv.uni-linz.ac.at/mfx/upx.html - http://www.nexus.hu/upx - http://upx.tsx.org - - -PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN -TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION. - - -ABSTRACT -======== - - UPX and UCL are copyrighted software distributed under the terms - of the GNU General Public License (hereinafter the "GPL"). - - The stub which is imbedded in each UPX compressed program is part - of UPX and UCL, and contains code that is under our copyright. The - terms of the GNU General Public License still apply as compressing - a program is a special form of linking with our stub. - - As a special exception we grant the free usage of UPX for all - executables, including commercial programs. - See below for details and restrictions. - - -COPYRIGHT -========= - - UPX and UCL are copyrighted software. All rights remain with the authors. - - UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer - UPX is Copyright (C) 1996-2000 Laszlo Molnar - - UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer - - -GNU GENERAL PUBLIC LICENSE -========================== - - UPX and the UCL library are free software; you can redistribute them - and/or modify them under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - UPX and UCL are distributed in the hope that they will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. - - -SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES -============================================ - - The stub which is imbedded in each UPX compressed program is part - of UPX and UCL, and contains code that is under our copyright. The - terms of the GNU General Public License still apply as compressing - a program is a special form of linking with our stub. - - Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special - permission to freely use and distribute all UPX compressed programs - (including commercial ones), subject to the following restrictions: - - 1. You must compress your program with a completely unmodified UPX - version; either with our precompiled version, or (at your option) - with a self compiled version of the unmodified UPX sources as - distributed by us. - 2. This also implies that the UPX stub must be completely unmodfied, i.e. - the stub imbedded in your compressed program must be byte-identical - to the stub that is produced by the official unmodified UPX version. - 3. The decompressor and any other code from the stub must exclusively get - used by the unmodified UPX stub for decompressing your program at - program startup. No portion of the stub may get read, copied, - called or otherwise get used or accessed by your program. - - -ANNOTATIONS -=========== - - - You can use a modified UPX version or modified UPX stub only for - programs that are compatible with the GNU General Public License. - - - We grant you special permission to freely use and distribute all UPX - compressed programs. But any modification of the UPX stub (such as, - but not limited to, removing our copyright string or making your - program non-decompressible) will immediately revoke your right to - use and distribute a UPX compressed program. - - - UPX is not a software protection tool; by requiring that you use - the unmodified UPX version for your proprietary programs we - make sure that any user can decompress your program. This protects - both you and your users as nobody can hide malicious code - - any program that cannot be decompressed is highly suspicious - by definition. - - - You can integrate all or part of UPX and UCL into projects that - are compatible with the GNU GPL, but obviously you cannot grant - any special exceptions beyond the GPL for our code in your project. - - - We want to actively support manufacturers of virus scanners and - similar security software. Please contact us if you would like to - incorporate parts of UPX or UCL into such a product. - - - -Markus F.X.J. Oberhumer Laszlo Molnar -markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu - -Linz, Austria, 25 Feb 2000 - -Additional License(s) - -The UPX license file is at http://upx.sourceforge.net/upx-license.html. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to Xfree86-VidMode Extension 1.0, -which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris. - ---- begin of LICENSE --- - -Version 1.1 of XFree86 ProjectLicence. - -Copyright (C) 1994-2004 The XFree86 Project, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicence, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so,subject to the following conditions: - - 1. Redistributions of source code must retain the above copyright - notice,this list of conditions, and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution, and in the same place - and form as other copyright, license and disclaimer information. - - 3. The end-user documentation included with the redistribution, if any,must - include the following acknowledgment: "This product includes - software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and - its contributors", in the same place and form as other third-party - acknowledgments. Alternately, this acknowledgment may appear in the software - itself, in the same form and location as other such third-party - acknowledgments. - - 4. Except as contained in this notice, the name of The XFree86 Project,Inc - shall not be used in advertising or otherwise to promote the sale, use - or other dealings in this Software without prior written authorization from - The XFree86 Project, Inc. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to X Window System 6.8.2, which may be -included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris. - ---- begin of LICENSE --- - - Licenses -The X.Org Foundation March 2004 - -1. Introduction - -The X.org Foundation X Window System distribution is a compilation of code and -documentation from many sources. This document is intended primarily as a -guide to the licenses used in the distribution: you must check each file -and/or package for precise redistribution terms. None-the-less, this summary -may be useful to many users. No software incorporating the XFree86 1.1 license -has been incorporated. - -This document is based on the compilation from XFree86. - -2. XFree86 License - -XFree86 code without an explicit copyright is covered by the following -copyright/license: - -Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the XFree86 Project shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from the XFree86 Project. - -3. Other Licenses - -Portions of code are covered by the following licenses/copyrights. See -individual files for the copyright dates. - -3.1. X/MIT Copyrights - -3.1.1. X Consortium - -Copyright (C) X Consortium - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X -CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the X Consortium shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -this Software without prior written authorization from the X Consortium. - -X Window System is a trademark of X Consortium, Inc. - -3.1.2. The Open Group - -Copyright The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that the -above copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation. - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -this Software without prior written authorization from The Open Group. 3.2. -Berkeley-based copyrights: - -o -3.2.1. General - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.2.2. UCB/LBL - -Copyright (c) 1993 The Regents of the University of California. All rights -reserved. - -This software was developed by the Computer Systems Engineering group at -Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and contributed to -Berkeley. - -All advertising materials mentioning features or use of this software must -display the following acknowledgement: This product includes software -developed by the University of California, Lawrence Berkeley Laboratory. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: This product includes software - developed by the University of California, Berkeley and its contributors. - - 4. Neither the name of the University nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.3. The -NetBSD Foundation, Inc. - -Copyright (c) 2003 The NetBSD Foundation, Inc. All rights reserved. - -This code is derived from software contributed to The NetBSD Foundation by Ben -Collver - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: This product includes software - developed by the NetBSD Foundation, Inc. and its contributors. - - 4. Neither the name of The NetBSD Foundation nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.4. Theodore -Ts'o. - -Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All rights -reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - and the entire permission notice in its entirety, including the disclaimer - of warranties. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. he name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE, ALL OF WHICH ARE HEREBY DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.2.5. Theo de Raadt and Damien Miller - -Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. Copyright (c) -2001-2002 Damien Miller. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.2.6. Todd C. Miller - -Copyright (c) 1998 Todd C. Miller - -Permission to use, copy, modify, and distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright -notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3.2.7. Thomas -Winischhofer - -Copyright (C) 2001-2004 Thomas Winischhofer - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. 3.3. NVIDIA Corp - -Copyright (c) 1996 NVIDIA, Corp. All rights reserved. - -NOTICE TO USER: The source code is copyrighted under U.S. and international -laws. NVIDIA, Corp. of Sunnyvale, California owns the copyright and as design -patents pending on the design and interface of the NV chips. Users and -possessors of this source code are hereby granted a nonexclusive, royalty-free -copyright and design patent license to use this code in individual and -commercial software. - -Any use of this source code must include, in the user documentation and -internal comments to the code, notices to the end user as follows: - -Copyright (c) 1996 NVIDIA, Corp. NVIDIA design patents pending in the U.S. and -foreign countries. - -NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE -CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED -WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE -FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. 3.4. GLX Public -License - -GLX PUBLIC LICENSE (Version 1.0 (2/11/99)) ("License") - -Subject to any third party claims, Silicon Graphics, Inc. ("SGI") hereby -grants permission to Recipient (defined below), under Recipient's copyrights -in the Original Software (defined below), to use, copy, modify, merge, -publish, distribute, sublicense and/or sell copies of Subject Software -(defined below), and to permit persons to whom the Subject Software is -furnished in accordance with this License to do the same, subject to all of -the following terms and conditions, which Recipient accepts by engaging in any -such use, copying, modifying, merging, publishing, distributing, sublicensing -or selling: - -1. Definitions. - - (a) "Original Software" means source code of computer software code which - is described in Exhibit A as Original Software. - - (b) "Modifications" means any addition to or deletion from the substance - or structure of either the Original Software or any previous - Modifications. When Subject Software is released as a series of files, a - Modification means (i) any addition to or deletion from the contents of a - file containing Original Software or previous Modifications and (ii) any - new file that contains any part of the Original Code or previous - Modifications. - - (c) "Subject Software" means the Original Software or Modifications or the - combination of the Original Software and Modifications, or portions of any - of the foregoing. - - (d) "Recipient" means an individual or a legal entity exercising rights - under, and complying with all of the terms of, this License. For legal - entities, "Recipient" includes any entity which controls, is controlled - by, or is under common control with Recipient. For purposes of this - definition, "control" of an entity means (a) the power, direct or - indirect, to direct or manage such entity, or (b) ownership of fifty - percent (50%) or more of the outstanding shares or beneficial ownership of - such entity. - -2. Redistribution of Source Code Subject to These Terms. Redistributions of -Subject Software in source code form must retain the notice set forth in -Exhibit A, below, in every file. A copy of this License must be included in -any documentation for such Subject Software where the recipients' rights -relating to Subject Software are described. Recipient may distribute the -source code version of Subject Software under a license of Recipient's choice, -which may contain terms different from this License, provided that (i) -Recipient is in compliance with the terms of this License, and (ii) the -license terms include this Section 2 and Sections 3, 4, 7, 8, 10, 12 and 13 of -this License, which terms may not be modified or superseded by any other terms -of such license. If Recipient distributes the source code version under a -different license Recipient must make it absolutely clear that any terms which -differ from this License are offered by Recipient alone, not by SGI. Recipient -hereby agrees to indemnify SGI for any liability incurred by SGI as a result -of any such terms Recipient offers. - -3. Redistribution in Executable Form. The notice set forth in Exhibit A must -be conspicuously included in any notice in an executable version of Subject -Software, related documentation or collateral in which Recipient describes the -user's rights relating to the Subject Software. Recipient may distribute the -executable version of Subject Software under a license of Recipient's choice, -which may contain terms different from this License, provided that (i) -Recipient is in compliance with the terms of this License, and (ii) the -license terms include this Section 3 and Sections 4, 7, 8, 10, 12 and 13 of -this License, which terms may not be modified or superseded by any other terms -of such license. If Recipient distributes the executable version under a -different license Recipient must make it absolutely clear that any terms which -differ from this License are offered by Recipient alone, not by SGI. Recipient -hereby agrees to indemnify SGI for any liability incurred by SGI as a result -of any such terms Recipient offers. - -4. Termination. This License and the rights granted hereunder will terminate -automatically if Recipient fails to comply with terms herein and fails to cure -such breach within 30 days of the breach. Any sublicense to the Subject -Software which is properly granted shall survive any termination of this -License absent termination by the terms of such sublicense. Provisions which, -by their nature, must remain in effect beyond the termination of this License -shall survive. - -5. No Trademark Rights. This License does not grant any rights to use any -trade name, trademark or service mark whatsoever. No trade name, trademark or -service mark of SGI may be used to endorse or promote products derived from -the Subject Software without prior written permission of SGI. - -6. No Other Rights. This License does not grant any rights with respect to the -OpenGL API or to any software or hardware implementation thereof or to any -other software whatsoever, nor shall any other rights or licenses not -expressly granted hereunder arise by implication, estoppel or otherwise with -respect to the Subject Software. Title to and ownership of the Original -Software at all times remains with SGI. All rights in the Original Software -not expressly granted under this License are reserved. - -7. Compliance with Laws; Non-Infringement. Recipient shall comply with all -applicable laws and regulations in connection with use and distribution of the -Subject Software, including but not limited to, all export and import control -laws and regulations of the U.S. government and other countries. Recipient may -not distribute Subject Software that (i) in any way infringes (directly or -contributorily) the rights (including patent, copyright, trade secret, -trademark or other intellectual property rights of any kind) of any other -person or entity or (ii) breaches any representation or warranty, express, -implied or statutory, which under any applicable law it might be deemed to -have been distributed. - -8. Claims of Infringement. If Recipient at any time has knowledge of any one -or more third party claims that reproduction, modification, use, distribution, -import or sale of Subject Software (including particular functionality or code -incorporated in Subject Software) infringes the third party's intellectual -property rights, Recipient must place in a well-identified web page bearing -the title "LEGAL" a description of each such claim and a description of the -party making each such claim in sufficient detail that a user of the Subject -Software will know whom to contact regarding the claim. Also, upon gaining -such knowledge of any such claim, Recipient must conspicuously include the URL -for such web page in the Exhibit A notice required under Sections 2 and 3, -above, and in the text of any related documentation, license agreement or -collateral in which Recipient describes end user's rights relating to the -Subject Software. If Recipient obtains such knowledge after it makes Subject -Software available to any other person or entity, Recipient shall take other -steps (such as notifying appropriate mailing lists or newsgroups) reasonably -calculated to inform those who received the Subject Software that new -knowledge has been obtained. - -9. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, -WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT -LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS, -MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- INFRINGING. SGI ASSUMES NO -RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE -PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY -SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN -ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED -HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, -WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), -CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY -CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK -STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER -COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF -THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY -TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO -THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT -ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO -THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT. - -11. Indemnity. Recipient shall be solely responsible for damages arising, -directly or indirectly, out of its utilization of rights under this License. -Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from -and against any loss, liability, damages, costs or expenses (including the -payment of reasonable attorneys fees) arising out of Recipient's use, -modification, reproduction and distribution of the Subject Software or out of -any representation or warranty made by Recipient. - -12. U.S. Government End Users. The Subject Software is a "commercial item" -consisting of "commercial computer software" as such terms are defined in -title 48 of the Code of Federal Regulations and all U.S. Government End Users -acquire only the rights set forth in this License and are subject to the terms -of this License. - -13. Miscellaneous. This License represents the complete agreement concerning -subject matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed so as to achieve as nearly as -possible the same economic effect as the original provision and the remainder -of this License will remain in effect. This License shall be governed by and -construed in accordance with the laws of the United States and the State of -California as applied to agreements entered into and to be performed entirely -within California between California residents. Any litigation relating to -this License shall be subject to the exclusive jurisdiction of the Federal -Courts of the Northern District of California (or, absent subject matter -jurisdiction in such courts, the courts of the State of California), with -venue lying exclusively in Santa Clara County, California, with the losing -party responsible for costs, including without limitation, court costs and -reasonable attorneys fees and expenses. The application of the United Nations -Convention on Contracts for the International Sale of Goods is expressly -excluded. Any law or regulation which provides that the language of a contract -shall be construed against the drafter shall not apply to this License. - -Exhibit A - -The contents of this file are subject to Sections 2, 3, 4, 7, 8, 10, 12 and 13 -of the GLX Public License Version 1.0 (the "License"). You may not use this -file except in compliance with those sections of the License. You may obtain a -copy of the License at Silicon Graphics, Inc., attn: Legal Services, 2011 N. -Shoreline Blvd., Mountain View, CA 94043 or at -http://www.sgi.com/software/opensource/glx/license.html. - -Software distributed under the License is distributed on an "AS IS" basis. ALL -WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF NON- -INFRINGEMENT. See the License for the specific language governing rights and -limitations under the License. - -The Original Software is GLX version 1.2 source code, released February, 1999. -The developer of the Original Software is Silicon Graphics, Inc. Those -portions of the Subject Software created by Silicon Graphics, Inc. are -Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. 3.5. CID -Font Code Public License - -CID FONT CODE PUBLIC LICENSE (Version 1.0 (3/31/99))("License") - -Subject to any applicable third party claims, Silicon Graphics, Inc. ("SGI") -hereby grants permission to Recipient (defined below), under SGI's copyrights -in the Original Software (defined below), to use, copy, modify, merge, -publish, distribute, sublicense and/or sell copies of Subject Software -(defined below) in both source code and executable form, and to permit persons -to whom the Subject Software is furnished in accordance with this License to -do the same, subject to all of the following terms and conditions, which -Recipient accepts by engaging in any such use, copying, modifying, merging, -publication, distributing, sublicensing or selling: - -1. Definitions. - - a. "Original Software" means source code of computer software code that is - described in Exhibit A as Original Software. - - b. "Modifications" means any addition to or deletion from the substance or - structure of either the Original Software or any previous Modifications. - When Subject Software is released as a series of files, a Modification - means (i) any addition to or deletion from the contents of a file - containing Original Software or previous Modifications and (ii) any new - file that contains any part of the Original Code or previous - Modifications. - - c. "Subject Software" means the Original Software or Modifications or the - combination of the Original Software and Modifications, or portions of any - of the foregoing. - - d. "Recipient" means an individual or a legal entity exercising rights - under the terms of this License. For legal entities, "Recipient" includes - any entity that controls, is controlled by, or is under common control - with Recipient. For purposes of this definition, "control" of an entity - means (i) the power, direct or indirect, to direct or manage such entity, - or (ii) ownership of fifty percent (50%) or more of the outstanding shares - or beneficial ownership of such entity. - - e. "Required Notice" means the notice set forth in Exhibit A to this - License. - - f. "Accompanying Technology" means any software or other technology that - is not a Modification and that is distributed or made publicly available - by Recipient with the Subject Software. Separate software files that do - not contain any Original Software or any previous Modification shall not - be deemed a Modification, even if such software files are aggregated as - part of a product, or in any medium of storage, with any file that does - contain Original Software or any previous Modification. - -2. License Terms. All distribution of the Subject Software must be made -subject to the terms of this License. A copy of this License and the Required -Notice must be included in any documentation for Subject Software where -Recipient's rights relating to Subject Software and/or any Accompanying -Technology are described. Distributions of Subject Software in source code -form must also include the Required Notice in every file distributed. In -addition, a ReadMe file entitled "Important Legal Notice" must be distributed -with each distribution of one or more files that incorporate Subject Software. -That file must be included with distributions made in both source code and -executable form. A copy of the License and the Required Notice must be -included in that file. Recipient may distribute Accompanying Technology under -a license of Recipient's choice, which may contain terms different from this -License, provided that (i) Recipient is in compliance with the terms of this -License, (ii) such other license terms do not modify or supersede the terms of -this License as applicable to the Subject Software, (iii) Recipient hereby -indemnifies SGI for any liability incurred by SGI as a result of the -distribution of Accompanying Technology or the use of other license terms. - -3. Termination. This License and the rights granted hereunder will terminate -automatically if Recipient fails to comply with terms herein and fails to cure -such breach within 30 days of the breach. Any sublicense to the Subject -Software that is properly granted shall survive any termination of this -License absent termination by the terms of such sublicense. Provisions which, -by their nature, must remain in effect beyond the termination of this License -shall survive. - -4. Trademark Rights. This License does not grant any rights to use any trade -name, trademark or service mark whatsoever. No trade name, trademark or -service mark of SGI may be used to endorse or promote products derived from or -incorporating any Subject Software without prior written permission of SGI. - -5. No Other Rights. No rights or licenses not expressly granted hereunder -shall arise by implication, estoppel or otherwise. Title to and ownership of -the Original Software at all times remains with SGI. All rights in the -Original Software not expressly granted under this License are reserved. - -6. Compliance with Laws; Non-Infringement. Recipient shall comply with all -applicable laws and regulations in connection with use and distribution of the -Subject Software, including but not limited to, all export and import control -laws and regulations of the U.S. government and other countries. Recipient may -not distribute Subject Software that (i) in any way infringes (directly or -contributorily) the rights (including patent, copyright, trade secret, -trademark or other intellectual property rights of any kind) of any other -person or entity, or (ii) breaches any representation or warranty, express, -implied or statutory, which under any applicable law it might be deemed to -have been distributed. - -7. Claims of Infringement. If Recipient at any time has knowledge of any one -or more third party claims that reproduction, modification, use, distribution, -import or sale of Subject Software (including particular functionality or code -incorporated in Subject Software) infringes the third party's intellectual -property rights, Recipient must place in a well-identified web page bearing -the title "LEGAL" a description of each such claim and a description of the -party making each such claim in sufficient detail that a user of the Subject -Software will know whom to contact regarding the claim. Also, upon gaining -such knowledge of any such claim, Recipient must conspicuously include the URL -for such web page in the Required Notice, and in the text of any related -documentation, license agreement or collateral in which Recipient describes -end user's rights relating to the Subject Software. If Recipient obtains such -knowledge after it makes Subject Software available to any other person or -entity, Recipient shall take other steps (such as notifying appropriate -mailing lists or newsgroups) reasonably calculated to provide such knowledge -to those who received the Subject Software. - -8. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, -WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT -LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS, -MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. SGI ASSUMES NO -RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE -PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY -SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN -ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED -HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, -WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), -CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SUBJECT SOFTWARE OR -THE USE OR OTHER DEALINGS IN THE SUBJECT SOFTWARE. SOME JURISDICTIONS DO NOT -ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO THIS EXCLUSION AND -LIMITATION MAY NOT APPLY TO RECIPIENT TO THE EXTENT SO DISALLOWED. - -10. Indemnity. Recipient shall be solely responsible for damages arising, -directly or indirectly, out of its utilization of rights under this License. -Recipient will defend, indemnify and hold SGI and its successors and assigns -harmless from and against any loss, liability, damages, costs or expenses -(including the payment of reasonable attorneys fees) arising out of -(Recipient's use, modification, reproduction and distribution of the Subject -Software or out of any representation or warranty made by Recipient. - -11. U.S. Government End Users. The Subject Software is a "commercial item" -consisting of "commercial computer software" as such terms are defined in -title 48 of the Code of Federal Regulations and all U.S. Government End Users -acquire only the rights set forth in this License and are subject to the terms -of this License. - -12. Miscellaneous. This License represents the complete agreement concerning -subject matter hereof. If any provision of this License is held to be -unenforceable by any judicial or administrative authority having proper -jurisdiction with respect thereto, such provision shall be reformed so as to -achieve as nearly as possible the same economic effect as the original -provision and the remainder of this License will remain in effect. This -License shall be governed by and construed in accordance with the laws of the -United States and the State of California as applied to agreements entered -into and to be performed entirely within California between California -residents. Any litigation relating to this License shall be subject to the -exclusive jurisdiction of the Federal Courts of the Northern District of -California (or, absent subject matter jurisdiction in such courts, the courts -of the State of California), with venue lying exclusively in Santa Clara -County, California, with the losing party responsible for costs, including -without limitation, court costs and reasonable attorneys fees and expenses. -The application of the United Nations Convention on Contracts for the -International Sale of Goods is expressly excluded. Any law or regulation that -provides that the language of a contract shall be construed against the -drafter shall not apply to this License. - -Exhibit A - -Copyright (c) 1994-1999 Silicon Graphics, Inc. - -The contents of this file are subject to the CID Font Code Public License -Version 1.0 (the "License"). You may not use this file except in compliance -with the License. You may obtain a copy of the License at Silicon Graphics, -Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 -or at http://www.sgi.com/software/opensource/cid/license.html - -Software distributed under the License is distributed on an "AS IS" basis. ALL -WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF -NON-INFRINGEMENT. See the License for the specific language governing rights -and limitations under the License. - -The Original Software (as defined in the License) is CID font code that was -developed by Silicon Graphics, Inc. Those portions of the Subject Software (as -defined in the License) that were created by Silicon Graphics, Inc. are -Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - -[NOTE: When using this text in connection with Subject Software delivered -solely in object code form, Recipient may replace the words "this file" with -"this software" in both the first and second sentences.] 3.6. Bitstream Vera -Fonts Copyright - -The fonts have a generous copyright, allowing derivative works (as long as -"Bitstream" or "Vera" are not in the names), and full redistribution (so long -as they are not *sold* by themselves). They can be be bundled, redistributed -and sold with any software. - -The fonts are distributed under the following copyright: - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a -trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated documentation -files (the "Font Software"), to reproduce and distribute the Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit persons to -whom the Font Software is furnished to do so, subject to the following -conditions: - -The above copyright and trademark notices and this permission notice shall be -included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular the -designs of glyphs or characters in the Fonts may be modified and additional -glyphs or characters may be added to the Fonts, only if the fonts are renamed -to names not containing either the words "Bitstream" or the word "Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream Vera" -names. - -The Font Software may be sold as part of a larger software package but no copy -of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, -SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO -USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome Foundation, -and Bitstream Inc., shall not be used in advertising or otherwise to promote -the sale, use or other dealings in this Font Software without prior written -authorization from the Gnome Foundation or Bitstream Inc., respectively. For -further information, contact: fonts at gnome dot org. 3.7. Bigelow & Holmes -Inc and URW++ GmbH Luxi font license - -Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font instruction -code copyright (c) 2001 by URW++ GmbH. All Rights Reserved. Luxi is a -registered trademark of Bigelow & Holmes Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of these Fonts and associated documentation files (the "Font Software"), to -deal in the Font Software, including without limitation the rights to use, -copy, merge, publish, distribute, sublicense, and/or sell copies of the Font -Software, and to permit persons to whom the Font Software is furnished to do -so, subject to the following conditions: - -The above copyright and trademark notices and this permission notice shall be -included in all copies of one or more of the Font Software. - -The Font Software may not be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may not be modified nor may -additional glyphs or characters be added to the Fonts. This License becomes -null and void when the Fonts or Font Software have been modified. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BIGELOW & HOLMES INC. OR URW++ -GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY -GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR -INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT -SOFTWARE. - -Except as contained in this notice, the names of Bigelow & Holmes Inc. and -URW++ GmbH. shall not be used in advertising or otherwise to promote the sale, -use or other dealings in this Font Software without prior written -authorization from Bigelow & Holmes Inc. and URW++ GmbH. - -For further information, contact: - -info@urwpp.de or design@bigelowandholmes.com - - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to zlib v1.2.5, which may be included -with JRE 8, JDK 8, and OpenJDK 8. - ---- begin of LICENSE --- - - version 1.2.5, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - -%% This notice is provided with respect to the following which may be -included with JRE 8, JDK 8, and OpenJDK 8, except where noted: - - Apache Commons Math 2.2 - Apache Derby 10.10.1.2 [included with JDK 8] - Apache Jakarta BCEL 5.2 - Apache Jakarta Regexp 1.4 - Apache Santuario XML Security for Java 1.5.4 - Apache Xalan-Java 2.7.1 - Apache Xerces Java 2.10.0 - Apache XML Resolver 1.1 - Dynalink 0.5 - - ---- begin of LICENSE --- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - ---- end of LICENSE --- - -------------------------------------------------------------------------------- - diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/make/CopyToExplodedJdk.gmk --- a/hotspot/make/CopyToExplodedJdk.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/make/CopyToExplodedJdk.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -49,6 +49,7 @@ DEST := $(JDK_OUTPUTDIR)/lib, \ FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(LIB_TARGETS)), \ MACRO := link-file-relative, \ + LOG_ACTION := Creating symlink, \ )) TARGETS += $(COPY_LIBS) $(LINK_LIBS) diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/make/lib/CompileDtracePostJvm.gmk --- a/hotspot/make/lib/CompileDtracePostJvm.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/make/lib/CompileDtracePostJvm.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -188,7 +188,6 @@ LIBS := $(LIBDL) -lc -lthread -ldoor, \ MAPFILE := $(HOTSPOT_TOPDIR)/make/mapfiles/libjvm_dtrace/mapfile-vers, \ OBJECT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR)/objs, \ - STRIP_SYMBOLS := true, \ )) LIBJVM_DB_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_db @@ -206,7 +205,6 @@ LIBS := -lc, \ MAPFILE := $(HOTSPOT_TOPDIR)/make/mapfiles/libjvm_db/mapfile-vers, \ OBJECT_DIR := $(LIBJVM_DB_OUTPUTDIR)/objs, \ - STRIP_SYMBOLS := true, \ )) # We need the generated JvmOffsets.h before we can compile the libjvm_db source code. diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/make/lib/CompileGtest.gmk --- a/hotspot/make/lib/CompileGtest.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/make/lib/CompileGtest.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -54,6 +54,13 @@ # Disabling switch warning for clang because of test source. +# Note: On AIX, the gtest test classes linked into the libjvm.so push the TOC +# size beyond 64k, so we need to link with bigtoc. However, this means that +# -qpic=large would be advisable to lessen the performance effect of bigtoc. +# But we want to avoid imposing -qpic=large onto the regular libjvm.so, which +# has no problem with its TOC, so do this only for object files which are +# exclusive to the gtest libjvm.so. + $(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \ TOOLCHAIN := TOOLCHAIN_LINK_CXX, \ LIBRARY := jvm, \ @@ -72,6 +79,7 @@ CFLAGS_windows := -EHsc, \ CFLAGS_solaris := -DGTEST_HAS_EXCEPTIONS=0 -library=stlport4, \ CFLAGS_macosx := -DGTEST_OS_MAC=1, \ + CFLAGS_aix := -qpic=large, \ CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \ CXXFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \ DISABLED_WARNINGS_gcc := undef, \ @@ -80,12 +88,14 @@ DISABLED_WARNINGS_solstudio := identexpected, \ LDFLAGS := $(JVM_LDFLAGS), \ LDFLAGS_solaris := -library=stlport4 $(call SET_SHARED_LIBRARY_ORIGIN), \ + LDFLAGS_aix := -bbigtoc, \ LIBS := $(JVM_LIBS), \ OPTIMIZATION := $(JVM_OPTIMIZATION), \ MAPFILE := $(GTEST_JVM_MAPFILE), \ USE_MAPFILE_FOR_SYMBOLS := true, \ COPY_DEBUG_SYMBOLS := $(GTEST_COPY_DEBUG_SYMBOLS), \ ZIP_EXTERNAL_DEBUG_SYMBOLS := false, \ + STRIP_SYMBOLS := false, \ PRECOMPILED_HEADER := $(JVM_PRECOMPILED_HEADER), \ PRECOMPILED_HEADER_EXCLUDE := gtest-all.cc gtestMain.cpp, \ )) diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/make/lib/Lib-jdk.hotspot.agent.gmk --- a/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -113,7 +113,6 @@ LIBS := $(SA_LIBS), \ MAPFILE := $(SA_MAPFILE), \ OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libsa, \ - STRIP_SYMBOLS := true, \ )) TARGETS += $(BUILD_LIBSA) diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/aarch64.ad --- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Mon Jan 09 11:57:06 2017 -0800 @@ -14086,7 +14086,7 @@ format %{ "mul rscratch1, $op1, $op2\t#overflow check long\n\t" "smulh rscratch2, $op1, $op2\n\t" - "cmp rscratch2, rscratch1, ASR #31\n\t" + "cmp rscratch2, rscratch1, ASR #63\n\t" "movw rscratch1, #0x80000000\n\t" "cselw rscratch1, rscratch1, zr, NE\n\t" "cmpw rscratch1, #1" %} @@ -14094,7 +14094,7 @@ ins_encode %{ __ mul(rscratch1, $op1$$Register, $op2$$Register); // Result bits 0..63 __ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127 - __ cmp(rscratch2, rscratch1, Assembler::ASR, 31); // Top is pure sign ext + __ cmp(rscratch2, rscratch1, Assembler::ASR, 63); // Top is pure sign ext __ movw(rscratch1, 0x80000000); // Develop 0 (EQ), __ cselw(rscratch1, rscratch1, zr, Assembler::NE); // or 0x80000000 (NE) __ cmpw(rscratch1, 1); // 0x80000000 - 1 => VS @@ -14112,7 +14112,7 @@ format %{ "mul rscratch1, $op1, $op2\t#overflow check long\n\t" "smulh rscratch2, $op1, $op2\n\t" - "cmp rscratch2, rscratch1, ASR #31\n\t" + "cmp rscratch2, rscratch1, ASR #63\n\t" "b$cmp $labl" %} ins_cost(4 * INSN_COST); // Branch is rare so treat as INSN_COST ins_encode %{ @@ -14120,7 +14120,7 @@ Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode; __ mul(rscratch1, $op1$$Register, $op2$$Register); // Result bits 0..63 __ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127 - __ cmp(rscratch2, rscratch1, Assembler::ASR, 31); // Top is pure sign ext + __ cmp(rscratch2, rscratch1, Assembler::ASR, 63); // Top is pure sign ext __ br(cond == Assembler::VS ? Assembler::NE : Assembler::EQ, *L); %} diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -3111,7 +3111,7 @@ } void LIR_Assembler::atomic_op(LIR_Code code, LIR_Opr src, LIR_Opr data, LIR_Opr dest, LIR_Opr tmp_op) { - Address addr = as_Address(src->as_address_ptr(), noreg); + Address addr = as_Address(src->as_address_ptr()); BasicType type = src->type(); bool is_oop = type == T_OBJECT || type == T_ARRAY; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -195,95 +195,22 @@ } } -// Zero words; len is in bytes -// Destroys all registers except addr -// len must be a nonzero multiple of wordSize -void C1_MacroAssembler::zero_memory(Register addr, Register len, Register t1) { - assert_different_registers(addr, len, t1, rscratch1, rscratch2); - -#ifdef ASSERT - { Label L; - tst(len, BytesPerWord - 1); - br(Assembler::EQ, L); - stop("len is not a multiple of BytesPerWord"); - bind(L); - } -#endif - -#ifndef PRODUCT - block_comment("zero memory"); -#endif - - Label loop; - Label entry; - -// Algorithm: -// -// scratch1 = cnt & 7; -// cnt -= scratch1; -// p += scratch1; -// switch (scratch1) { -// do { -// cnt -= 8; -// p[-8] = 0; -// case 7: -// p[-7] = 0; -// case 6: -// p[-6] = 0; -// // ... -// case 1: -// p[-1] = 0; -// case 0: -// p += 8; -// } while (cnt); -// } - - const int unroll = 8; // Number of str(zr) instructions we'll unroll - - lsr(len, len, LogBytesPerWord); - andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll - sub(len, len, rscratch1); // cnt -= unroll - // t1 always points to the end of the region we're about to zero - add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord); - adr(rscratch2, entry); - sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2); - br(rscratch2); - bind(loop); - sub(len, len, unroll); - for (int i = -unroll; i < 0; i++) - str(zr, Address(t1, i * wordSize)); - bind(entry); - add(t1, t1, unroll * wordSize); - cbnz(len, loop); -} - // preserves obj, destroys len_in_bytes void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1) { + assert(hdr_size_in_bytes >= 0, "header size must be positive or 0"); Label done; - assert(obj != len_in_bytes && obj != t1 && t1 != len_in_bytes, "registers must be different"); - assert((hdr_size_in_bytes & (BytesPerWord - 1)) == 0, "header size is not a multiple of BytesPerWord"); - Register index = len_in_bytes; - // index is positive and ptr sized - subs(index, index, hdr_size_in_bytes); + + // len_in_bytes is positive and ptr sized + subs(len_in_bytes, len_in_bytes, hdr_size_in_bytes); br(Assembler::EQ, done); - // note: for the remaining code to work, index must be a multiple of BytesPerWord -#ifdef ASSERT - { Label L; - tst(index, BytesPerWord - 1); - br(Assembler::EQ, L); - stop("index is not a multiple of BytesPerWord"); - bind(L); - } -#endif // Preserve obj if (hdr_size_in_bytes) add(obj, obj, hdr_size_in_bytes); - zero_memory(obj, index, t1); + zero_memory(obj, len_in_bytes, t1); if (hdr_size_in_bytes) sub(obj, obj, hdr_size_in_bytes); - // done bind(done); } @@ -294,57 +221,59 @@ try_allocate(obj, noreg, object_size * BytesPerWord, t1, t2, slow_case); - initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2); + initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2, UseTLAB); } -void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2) { +void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, bool is_tlab_allocated) { assert((con_size_in_bytes & MinObjAlignmentInBytesMask) == 0, "con_size_in_bytes is not multiple of alignment"); const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize; initialize_header(obj, klass, noreg, t1, t2); - // clear rest of allocated space - const Register index = t2; - const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below) - if (var_size_in_bytes != noreg) { - mov(index, var_size_in_bytes); - initialize_body(obj, index, hdr_size_in_bytes, t1); - } else if (con_size_in_bytes <= threshold) { - // use explicit null stores - int i = hdr_size_in_bytes; - if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) { - str(zr, Address(obj, i)); - i += BytesPerWord; - } - for (; i < con_size_in_bytes; i += 2 * BytesPerWord) - stp(zr, zr, Address(obj, i)); - } else if (con_size_in_bytes > hdr_size_in_bytes) { - block_comment("zero memory"); - // use loop to null out the fields + if (!(UseTLAB && ZeroTLAB && is_tlab_allocated)) { + // clear rest of allocated space + const Register index = t2; + const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below) + if (var_size_in_bytes != noreg) { + mov(index, var_size_in_bytes); + initialize_body(obj, index, hdr_size_in_bytes, t1); + } else if (con_size_in_bytes <= threshold) { + // use explicit null stores + int i = hdr_size_in_bytes; + if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) { + str(zr, Address(obj, i)); + i += BytesPerWord; + } + for (; i < con_size_in_bytes; i += 2 * BytesPerWord) + stp(zr, zr, Address(obj, i)); + } else if (con_size_in_bytes > hdr_size_in_bytes) { + block_comment("zero memory"); + // use loop to null out the fields - int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord; - mov(index, words / 8); + int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord; + mov(index, words / 8); - const int unroll = 8; // Number of str(zr) instructions we'll unroll - int remainder = words % unroll; - lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord)); + const int unroll = 8; // Number of str(zr) instructions we'll unroll + int remainder = words % unroll; + lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord)); - Label entry_point, loop; - b(entry_point); + Label entry_point, loop; + b(entry_point); - bind(loop); - sub(index, index, 1); - for (int i = -unroll; i < 0; i++) { - if (-i == remainder) - bind(entry_point); - str(zr, Address(rscratch1, i * wordSize)); - } - if (remainder == 0) - bind(entry_point); - add(rscratch1, rscratch1, unroll * wordSize); - cbnz(index, loop); + bind(loop); + sub(index, index, 1); + for (int i = -unroll; i < 0; i++) { + if (-i == remainder) + bind(entry_point); + str(zr, Address(rscratch1, i * wordSize)); + } + if (remainder == 0) + bind(entry_point); + add(rscratch1, rscratch1, unroll * wordSize); + cbnz(index, loop); + } } membar(StoreStore); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp --- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -36,7 +36,6 @@ // initialization void pd_init() { _rsp_offset = 0; } -void zero_memory(Register addr, Register len, Register t1); public: void try_allocate( @@ -75,7 +74,8 @@ Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise int con_size_in_bytes, // object size in bytes if known at compile time Register t1, // temp register - Register t2 // temp register + Register t2, // temp register + bool is_tlab_allocated // the object was allocated in a TLAB; relevant for the implementation of ZeroTLAB ); // allocation of fixed-size objects diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -728,7 +728,7 @@ __ tlab_allocate(obj, obj_size, 0, t1, t2, slow_path); - __ initialize_object(obj, klass, obj_size, 0, t1, t2); + __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ true); __ verify_oop(obj); __ ldp(r5, r19, Address(__ post(sp, 2 * wordSize))); __ ret(lr); @@ -740,7 +740,7 @@ __ eden_allocate(obj, obj_size, 0, t1, slow_path); __ incr_allocated_bytes(rthread, obj_size, 0, rscratch1); - __ initialize_object(obj, klass, obj_size, 0, t1, t2); + __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ false); __ verify_oop(obj); __ ldp(r5, r19, Address(__ post(sp, 2 * wordSize))); __ ret(lr); @@ -853,7 +853,9 @@ __ andr(t1, t1, Klass::_lh_header_size_mask); __ sub(arr_size, arr_size, t1); // body length __ add(t1, t1, obj); // body start - __ initialize_body(t1, arr_size, 0, t2); + if (!ZeroTLAB) { + __ initialize_body(t1, arr_size, 0, t2); + } __ verify_oop(obj); __ ret(lr); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -3944,12 +3944,82 @@ add(top, top, t1); sub(top, top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes()); str(top, Address(rthread, in_bytes(JavaThread::tlab_end_offset()))); + + if (ZeroTLAB) { + // This is a fast TLAB refill, therefore the GC is not notified of it. + // So compiled code must fill the new TLAB with zeroes. + ldr(top, Address(rthread, in_bytes(JavaThread::tlab_start_offset()))); + zero_memory(top,t1,t2); + } + verify_tlab(); b(retry); return rthread; // for use by caller } +// Zero words; len is in bytes +// Destroys all registers except addr +// len must be a nonzero multiple of wordSize +void MacroAssembler::zero_memory(Register addr, Register len, Register t1) { + assert_different_registers(addr, len, t1, rscratch1, rscratch2); + +#ifdef ASSERT + { Label L; + tst(len, BytesPerWord - 1); + br(Assembler::EQ, L); + stop("len is not a multiple of BytesPerWord"); + bind(L); + } +#endif + +#ifndef PRODUCT + block_comment("zero memory"); +#endif + + Label loop; + Label entry; + +// Algorithm: +// +// scratch1 = cnt & 7; +// cnt -= scratch1; +// p += scratch1; +// switch (scratch1) { +// do { +// cnt -= 8; +// p[-8] = 0; +// case 7: +// p[-7] = 0; +// case 6: +// p[-6] = 0; +// // ... +// case 1: +// p[-1] = 0; +// case 0: +// p += 8; +// } while (cnt); +// } + + const int unroll = 8; // Number of str(zr) instructions we'll unroll + + lsr(len, len, LogBytesPerWord); + andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll + sub(len, len, rscratch1); // cnt -= unroll + // t1 always points to the end of the region we're about to zero + add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord); + adr(rscratch2, entry); + sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2); + br(rscratch2); + bind(loop); + sub(len, len, unroll); + for (int i = -unroll; i < 0; i++) + str(zr, Address(t1, i * wordSize)); + bind(entry); + add(t1, t1, unroll * wordSize); + cbnz(len, loop); +} + // Defines obj, preserves var_size_in_bytes void MacroAssembler::eden_allocate(Register obj, Register var_size_in_bytes, diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp --- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -857,6 +857,7 @@ Label& slow_case // continuation point if fast allocation fails ); Register tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); // returns TLS address + void zero_memory(Register addr, Register len, Register t1); void verify_tlab(); void incr_allocated_bytes(Register thread, diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -282,7 +282,7 @@ regs[i].set_bad(); break; case T_LONG: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); // fall through case T_OBJECT: case T_ARRAY: @@ -303,7 +303,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); if (fp_args < Argument::n_float_register_parameters_j) { regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg()); } else { @@ -840,7 +840,7 @@ } break; case T_LONG: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); // fall through case T_OBJECT: case T_ARRAY: @@ -862,7 +862,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); if (fp_args < Argument::n_float_register_parameters_c) { regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg()); } else { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp --- a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -453,7 +453,7 @@ } break; case T_LONG: - assert(sig_bt[i+1] == T_VOID, "missing Half" ); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" ); // fall through case T_ARRAY: case T_OBJECT: @@ -478,7 +478,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "missing Half" ); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" ); if (fp_reg < FPR_PARAMS) { FloatRegister r = as_FloatRegister(fp_reg); regs[i].set2(r->as_VMReg()); @@ -532,7 +532,7 @@ #ifndef __ABI_HARD__ case T_DOUBLE: #endif // !__ABI_HARD__ - assert(sig_bt[i+1] == T_VOID, "missing Half" ); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" ); if (ireg <= 2) { #if (ALIGN_WIDE_ARGUMENTS == 1) if(ireg & 1) ireg++; // Aligned location required diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -51,19 +51,25 @@ return i; } -// Support abs and sqrt like in compiler. -// For others we can use a normal (native) entry. -bool AbstractInterpreter::math_entry_available(AbstractInterpreter::MethodKind kind) { - if (!InlineIntrinsics) return false; - - return ((kind==Interpreter::java_lang_math_sqrt && VM_Version::has_fsqrt()) || - (kind==Interpreter::java_lang_math_abs)); -} - // These should never be compiled since the interpreter will prefer // the compiled version to the intrinsic version. bool AbstractInterpreter::can_be_compiled(methodHandle m) { - return !math_entry_available(method_kind(m)); + switch (method_kind(m)) { + case Interpreter::java_lang_math_sin : // fall thru + case Interpreter::java_lang_math_cos : // fall thru + case Interpreter::java_lang_math_tan : // fall thru + case Interpreter::java_lang_math_abs : // fall thru + case Interpreter::java_lang_math_log : // fall thru + case Interpreter::java_lang_math_log10 : // fall thru + case Interpreter::java_lang_math_sqrt : // fall thru + case Interpreter::java_lang_math_pow : // fall thru + case Interpreter::java_lang_math_exp : // fall thru + case Interpreter::java_lang_math_fmaD : // fall thru + case Interpreter::java_lang_math_fmaF : + return false; + default: + return true; + } } // How much stack a method activation needs in stack slots. diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/assembler_ppc.hpp --- a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -460,16 +460,15 @@ FCTIWZ_OPCODE = (63u << OPCODE_SHIFT | 15u << 1), FRSP_OPCODE = (63u << OPCODE_SHIFT | 12u << 1), - // WARNING: using fmadd results in a non-compliant vm. Some floating - // point tck tests will fail. - FMADD_OPCODE = (59u << OPCODE_SHIFT | 29u << 1), - DMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1), - FMSUB_OPCODE = (59u << OPCODE_SHIFT | 28u << 1), - DMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1), - FNMADD_OPCODE = (59u << OPCODE_SHIFT | 31u << 1), - DNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1), - FNMSUB_OPCODE = (59u << OPCODE_SHIFT | 30u << 1), - DNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1), + // Fused multiply-accumulate instructions. + FMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1), + FMADDS_OPCODE = (59u << OPCODE_SHIFT | 29u << 1), + FMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1), + FMSUBS_OPCODE = (59u << OPCODE_SHIFT | 28u << 1), + FNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1), + FNMADDS_OPCODE = (59u << OPCODE_SHIFT | 31u << 1), + FNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1), + FNMSUBS_OPCODE = (59u << OPCODE_SHIFT | 30u << 1), LFD_OPCODE = (50u << OPCODE_SHIFT | 00u << 1), LFDU_OPCODE = (51u << OPCODE_SHIFT | 00u << 1), @@ -1939,6 +1938,26 @@ inline void fdivs( FloatRegister d, FloatRegister a, FloatRegister b); inline void fdivs_(FloatRegister d, FloatRegister a, FloatRegister b); + // Fused multiply-accumulate instructions. + // WARNING: Use only when rounding between the 2 parts is not desired. + // Some floating point tck tests will fail if used incorrectly. + inline void fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + inline void fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b); + // PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions inline void frsp( FloatRegister d, FloatRegister b); inline void fctid( FloatRegister d, FloatRegister b); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp --- a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -700,6 +700,26 @@ inline void Assembler::fdivs( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } inline void Assembler::fdivs_(FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } +// Fused multiply-accumulate instructions. +// WARNING: Use only when rounding between the 2 parts is not desired. +// Some floating point tck tests will fail if used incorrectly. +inline void Assembler::fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } +inline void Assembler::fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); } +inline void Assembler::fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); } + // PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions inline void Assembler::frsp( FloatRegister d, FloatRegister b) { emit_int32( FRSP_OPCODE | frt(d) | frb(b) | rc(0)); } inline void Assembler::fctid( FloatRegister d, FloatRegister b) { emit_int32( FCTID_OPCODE | frt(d) | frb(b) | rc(0)); } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -292,28 +292,28 @@ } -void LIR_Assembler::emit_op3(LIR_Op3* op) { - const bool is_int = op->result_opr()->is_single_cpu(); - Register Rdividend = is_int ? op->in_opr1()->as_register() : op->in_opr1()->as_register_lo(); +void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr temp, LIR_Opr result, CodeEmitInfo* info) { + const bool is_int = result->is_single_cpu(); + Register Rdividend = is_int ? left->as_register() : left->as_register_lo(); Register Rdivisor = noreg; - Register Rscratch = op->in_opr3()->as_register(); - Register Rresult = is_int ? op->result_opr()->as_register() : op->result_opr()->as_register_lo(); + Register Rscratch = temp->as_register(); + Register Rresult = is_int ? result->as_register() : result->as_register_lo(); long divisor = -1; - if (op->in_opr2()->is_register()) { - Rdivisor = is_int ? op->in_opr2()->as_register() : op->in_opr2()->as_register_lo(); + if (right->is_register()) { + Rdivisor = is_int ? right->as_register() : right->as_register_lo(); } else { - divisor = is_int ? op->in_opr2()->as_constant_ptr()->as_jint() - : op->in_opr2()->as_constant_ptr()->as_jlong(); + divisor = is_int ? right->as_constant_ptr()->as_jint() + : right->as_constant_ptr()->as_jlong(); } assert(Rdividend != Rscratch, ""); assert(Rdivisor != Rscratch, ""); - assert(op->code() == lir_idiv || op->code() == lir_irem, "Must be irem or idiv"); + assert(code == lir_idiv || code == lir_irem, "Must be irem or idiv"); if (Rdivisor == noreg) { if (divisor == 1) { // stupid, but can happen - if (op->code() == lir_idiv) { + if (code == lir_idiv) { __ mr_if_needed(Rresult, Rdividend); } else { __ li(Rresult, 0); @@ -340,7 +340,7 @@ } __ add(Rscratch, Rdividend, Rscratch); - if (op->code() == lir_idiv) { + if (code == lir_idiv) { if (is_int) { __ srawi(Rresult, Rscratch, log2); } else { @@ -352,7 +352,7 @@ } } else if (divisor == -1) { - if (op->code() == lir_idiv) { + if (code == lir_idiv) { __ neg(Rresult, Rdividend); } else { __ li(Rresult, 0); @@ -360,7 +360,7 @@ } else { __ load_const_optimized(Rscratch, divisor); - if (op->code() == lir_idiv) { + if (code == lir_idiv) { if (is_int) { __ divw(Rresult, Rdividend, Rscratch); // Can't divide minint/-1. } else { @@ -389,7 +389,7 @@ __ cmpdi(CCR0, Rdivisor, -1); } __ bne(CCR0, regular); - if (op->code() == lir_idiv) { + if (code == lir_idiv) { __ neg(Rresult, Rdividend); __ b(done); __ bind(regular); @@ -415,6 +415,26 @@ } +void LIR_Assembler::emit_op3(LIR_Op3* op) { + switch (op->code()) { + case lir_idiv: + case lir_irem: + arithmetic_idiv(op->code(), op->in_opr1(), op->in_opr2(), op->in_opr3(), + op->result_opr(), op->info()); + break; + case lir_fmad: + __ fmadd(op->result_opr()->as_double_reg(), op->in_opr1()->as_double_reg(), + op->in_opr2()->as_double_reg(), op->in_opr3()->as_double_reg()); + break; + case lir_fmaf: + __ fmadds(op->result_opr()->as_float_reg(), op->in_opr1()->as_float_reg(), + op->in_opr2()->as_float_reg(), op->in_opr3()->as_float_reg()); + break; + default: ShouldNotReachHere(); break; + } +} + + void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) { #ifdef ASSERT assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label"); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1435,7 +1435,26 @@ } void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) { - fatal("FMA intrinsic is not implemented on this platform"); + assert(x->number_of_arguments() == 3, "wrong type"); + assert(UseFMA, "Needs FMA instructions support."); + LIRItem value(x->argument_at(0), this); + LIRItem value1(x->argument_at(1), this); + LIRItem value2(x->argument_at(2), this); + + value.load_item(); + value1.load_item(); + value2.load_item(); + + LIR_Opr calc_input = value.result(); + LIR_Opr calc_input1 = value1.result(); + LIR_Opr calc_input2 = value2.result(); + LIR_Opr calc_result = rlock_result(x); + + switch (x->id()) { + case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break; + case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break; + default: ShouldNotReachHere(); + } } void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/globals_ppc.hpp --- a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -42,6 +42,9 @@ #define DEFAULT_STACK_YELLOW_PAGES (2) #define DEFAULT_STACK_RED_PAGES (1) +// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the +// stack if compiled for unix and LP64. To pass stack overflow tests we need +// 20 shadow pages. #define DEFAULT_STACK_SHADOW_PAGES (20 DEBUG_ONLY(+2)) #define DEFAULT_STACK_RESERVED_PAGES (1) diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/ppc.ad --- a/hotspot/src/cpu/ppc/vm/ppc.ad Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/ppc.ad Mon Jan 09 11:57:06 2017 -0800 @@ -9569,6 +9569,117 @@ ins_pipe(pipe_class_default); %} + +// Multiply-Accumulate +// src1 * src2 + src3 +instruct maddF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{ + match(Set dst (FmaF src3 (Binary src1 src2))); + + format %{ "FMADDS $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fmadds); + __ fmadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// src1 * src2 + src3 +instruct maddD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{ + match(Set dst (FmaD src3 (Binary src1 src2))); + + format %{ "FMADD $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fmadd); + __ fmadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// -src1 * src2 + src3 = -(src1*src2-src3) +instruct mnsubF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{ + match(Set dst (FmaF src3 (Binary (NegF src1) src2))); + match(Set dst (FmaF src3 (Binary src1 (NegF src2)))); + + format %{ "FNMSUBS $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fnmsubs); + __ fnmsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// -src1 * src2 + src3 = -(src1*src2-src3) +instruct mnsubD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{ + match(Set dst (FmaD src3 (Binary (NegD src1) src2))); + match(Set dst (FmaD src3 (Binary src1 (NegD src2)))); + + format %{ "FNMSUB $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fnmsub); + __ fnmsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// -src1 * src2 - src3 = -(src1*src2+src3) +instruct mnaddF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{ + match(Set dst (FmaF (NegF src3) (Binary (NegF src1) src2))); + match(Set dst (FmaF (NegF src3) (Binary src1 (NegF src2)))); + + format %{ "FNMADDS $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fnmadds); + __ fnmadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// -src1 * src2 - src3 = -(src1*src2+src3) +instruct mnaddD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{ + match(Set dst (FmaD (NegD src3) (Binary (NegD src1) src2))); + match(Set dst (FmaD (NegD src3) (Binary src1 (NegD src2)))); + + format %{ "FNMADD $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fnmadd); + __ fnmadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// src1 * src2 - src3 +instruct msubF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{ + match(Set dst (FmaF (NegF src3) (Binary src1 src2))); + + format %{ "FMSUBS $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fmsubs); + __ fmsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + +// src1 * src2 - src3 +instruct msubD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{ + match(Set dst (FmaD (NegD src3) (Binary src1 src2))); + + format %{ "FMSUB $dst, $src1, $src2, $src3" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_fmsub); + __ fmsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister); + %} + ins_pipe(pipe_class_default); +%} + + //----------Logical Instructions----------------------------------------------- // And Instructions diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -594,7 +594,7 @@ regs[i].set1(reg); break; case T_LONG: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (ireg < num_java_iarg_registers) { // Put long in register. reg = java_iarg_reg[ireg]; @@ -637,7 +637,7 @@ regs[i].set1(reg); break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (freg < num_java_farg_registers) { // Put double in register. reg = java_farg_reg[freg]; @@ -809,7 +809,7 @@ regs[i].set1(reg); break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (freg < Argument::n_float_register_parameters_c) { // Put double in register ... reg = farg_reg[freg]; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1134,14 +1134,57 @@ // End of helpers address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) { - if (!Interpreter::math_entry_available(kind)) { - NOT_PRODUCT(__ should_not_reach_here();) - return NULL; + + // Decide what to do: Use same platform specific instructions and runtime calls as compilers. + bool use_instruction = false; + address runtime_entry = NULL; + int num_args = 1; + bool double_precision = true; + + // PPC64 specific: + switch (kind) { + case Interpreter::java_lang_math_sqrt: use_instruction = VM_Version::has_fsqrt(); break; + case Interpreter::java_lang_math_abs: use_instruction = true; break; + case Interpreter::java_lang_math_fmaF: + case Interpreter::java_lang_math_fmaD: use_instruction = UseFMA; break; + default: break; // Fall back to runtime call. } + switch (kind) { + case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break; + case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break; + case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break; + case Interpreter::java_lang_math_abs : /* run interpreted */ break; + case Interpreter::java_lang_math_sqrt : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt); break; + case Interpreter::java_lang_math_log : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); break; + case Interpreter::java_lang_math_log10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break; + case Interpreter::java_lang_math_pow : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); num_args = 2; break; + case Interpreter::java_lang_math_exp : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); break; + case Interpreter::java_lang_math_fmaF : /* run interpreted */ num_args = 3; double_precision = false; break; + case Interpreter::java_lang_math_fmaD : /* run interpreted */ num_args = 3; break; + default: ShouldNotReachHere(); + } + + // Use normal entry if neither instruction nor runtime call is used. + if (!use_instruction && runtime_entry == NULL) return NULL; + address entry = __ pc(); - __ lfd(F1_RET, Interpreter::stackElementSize, R15_esp); + // Load arguments + assert(num_args <= 13, "passed in registers"); + if (double_precision) { + int offset = (2 * num_args - 1) * Interpreter::stackElementSize; + for (int i = 0; i < num_args; ++i) { + __ lfd(as_FloatRegister(F1_ARG1->encoding() + i), offset, R15_esp); + offset -= 2 * Interpreter::stackElementSize; + } + } else { + int offset = num_args * Interpreter::stackElementSize; + for (int i = 0; i < num_args; ++i) { + __ lfs(as_FloatRegister(F1_ARG1->encoding() + i), offset, R15_esp); + offset -= Interpreter::stackElementSize; + } + } // Pop c2i arguments (if any) off when we return. #ifdef ASSERT @@ -1152,15 +1195,30 @@ #endif // ASSERT __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started. - if (kind == Interpreter::java_lang_math_sqrt) { - __ fsqrt(F1_RET, F1_RET); - } else if (kind == Interpreter::java_lang_math_abs) { - __ fabs(F1_RET, F1_RET); + if (use_instruction) { + switch (kind) { + case Interpreter::java_lang_math_sqrt: __ fsqrt(F1_RET, F1); break; + case Interpreter::java_lang_math_abs: __ fabs(F1_RET, F1); break; + case Interpreter::java_lang_math_fmaF: __ fmadds(F1_RET, F1, F2, F3); break; + case Interpreter::java_lang_math_fmaD: __ fmadd(F1_RET, F1, F2, F3); break; + default: ShouldNotReachHere(); + } } else { - ShouldNotReachHere(); + // Comment: Can use tail call if the unextended frame is always C ABI compliant: + //__ load_const_optimized(R12_scratch2, runtime_entry, R0); + //__ call_c_and_return_to_caller(R12_scratch2); + + // Push a new C frame and save LR. + __ save_LR_CR(R0); + __ push_frame_reg_args(0, R11_scratch1); + + __ call_VM_leaf(runtime_entry); + + // Pop the C frame and restore LR. + __ pop_frame(); + __ restore_LR_CR(R0); } - // And we're done. __ blr(); __ flush(); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -230,9 +230,8 @@ FLAG_SET_DEFAULT(UseGHASHIntrinsics, false); } - if (UseFMA) { - warning("FMA instructions are not available on this CPU"); - FLAG_SET_DEFAULT(UseFMA, false); + if (FLAG_IS_DEFAULT(UseFMA)) { + FLAG_SET_DEFAULT(UseFMA, true); } if (UseSHA) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/assembler_s390.hpp --- a/hotspot/src/cpu/s390/vm/assembler_s390.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/assembler_s390.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -790,6 +790,16 @@ #define MDB_ZOPC (unsigned long)(237L << 40 | 28) #define MXDB_ZOPC (unsigned long)(237L << 40 | 7) +// Multiply-Add +#define MAEBR_ZOPC (unsigned int)(179 << 24 | 14 << 16) +#define MADBR_ZOPC (unsigned int)(179 << 24 | 30 << 16) +#define MSEBR_ZOPC (unsigned int)(179 << 24 | 15 << 16) +#define MSDBR_ZOPC (unsigned int)(179 << 24 | 31 << 16) +#define MAEB_ZOPC (unsigned long)(237L << 40 | 14) +#define MADB_ZOPC (unsigned long)(237L << 40 | 30) +#define MSEB_ZOPC (unsigned long)(237L << 40 | 15) +#define MSDB_ZOPC (unsigned long)(237L << 40 | 31) + // Divide // RR, signed #define DSGFR_ZOPC (unsigned int)(0xb91d << 16) @@ -2205,6 +2215,20 @@ inline void z_meeb( FloatRegister f1, const Address& a); inline void z_mdb( FloatRegister f1, const Address& a); + // MUL-ADD + inline void z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; float + inline void z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; double + inline void z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; float + inline void z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; double + inline void z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; float + inline void z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; double + inline void z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; float + inline void z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; double + inline void z_maeb(FloatRegister f1, FloatRegister f3, const Address& a); + inline void z_madb(FloatRegister f1, FloatRegister f3, const Address& a); + inline void z_mseb(FloatRegister f1, FloatRegister f3, const Address& a); + inline void z_msdb(FloatRegister f1, FloatRegister f3, const Address& a); + // DIV inline void z_debr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; float inline void z_ddbr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; double diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp --- a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -778,6 +778,23 @@ //--------------- +// MUL-ADD +//--------------- +inline void Assembler::z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MAEBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );} +inline void Assembler::z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MADBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );} +inline void Assembler::z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MSEBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );} +inline void Assembler::z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MSDBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );} +inline void Assembler::z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MAEB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );} +inline void Assembler::z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MADB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );} +inline void Assembler::z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MSEB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );} +inline void Assembler::z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MSDB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );} +inline void Assembler::z_maeb(FloatRegister f1, FloatRegister f3, const Address& a) { z_maeb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); } +inline void Assembler::z_madb(FloatRegister f1, FloatRegister f3, const Address& a) { z_madb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); } +inline void Assembler::z_mseb(FloatRegister f1, FloatRegister f3, const Address& a) { z_mseb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); } +inline void Assembler::z_msdb(FloatRegister f1, FloatRegister f3, const Address& a) { z_msdb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); } + + +//--------------- // DIV //--------------- inline void Assembler::z_debr( FloatRegister f1, FloatRegister f2) { emit_32( DEBR_ZOPC | fregt( f1, 24, 32) | freg( f2, 28, 32));} diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp --- a/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -324,6 +324,22 @@ op->result_opr(), op->info()); break; + case lir_fmad: { + const FloatRegister opr1 = op->in_opr1()->as_double_reg(), + opr2 = op->in_opr2()->as_double_reg(), + opr3 = op->in_opr3()->as_double_reg(), + res = op->result_opr()->as_double_reg(); + __ z_madbr(opr3, opr1, opr2); + if (res != opr3) { __ z_ldr(res, opr3); } + } break; + case lir_fmaf: { + const FloatRegister opr1 = op->in_opr1()->as_float_reg(), + opr2 = op->in_opr2()->as_float_reg(), + opr3 = op->in_opr3()->as_float_reg(), + res = op->result_opr()->as_float_reg(); + __ z_maebr(opr3, opr1, opr2); + if (res != opr3) { __ z_ler(res, opr3); } + } break; default: ShouldNotReachHere(); break; } } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp --- a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1237,7 +1237,28 @@ } void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) { - fatal("FMA intrinsic is not implemented on this platform"); + assert(x->number_of_arguments() == 3, "wrong type"); + assert(UseFMA, "Needs FMA instructions support."); + LIRItem value(x->argument_at(0), this); + LIRItem value1(x->argument_at(1), this); + LIRItem value2(x->argument_at(2), this); + + value2.set_destroys_register(); + + value.load_item(); + value1.load_item(); + value2.load_item(); + + LIR_Opr calc_input = value.result(); + LIR_Opr calc_input1 = value1.result(); + LIR_Opr calc_input2 = value2.result(); + LIR_Opr calc_result = rlock_result(x); + + switch (x->id()) { + case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break; + case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break; + default: ShouldNotReachHere(); + } } void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/s390.ad --- a/hotspot/src/cpu/s390/vm/s390.ad Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/s390.ad Mon Jan 09 11:57:06 2017 -0800 @@ -7249,6 +7249,171 @@ ins_pipe(pipe_class_dummy); %} +// Multiply-Accumulate +// src1 * src2 + dst +instruct maddF_reg_reg(regF dst, regF src1, regF src2) %{ + match(Set dst (FmaF dst (Binary src1 src2))); + // CC unchanged by MUL-ADD. + ins_cost(ALU_REG_COST); + size(4); + format %{ "MAEBR $dst, $src1, $src2" %} + ins_encode %{ + __ z_maebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 + dst +instruct maddD_reg_reg(regD dst, regD src1, regD src2) %{ + match(Set dst (FmaD dst (Binary src1 src2))); + // CC unchanged by MUL-ADD. + ins_cost(ALU_REG_COST); + size(4); + format %{ "MADBR $dst, $src1, $src2" %} + ins_encode %{ + __ z_madbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 - dst +instruct msubF_reg_reg(regF dst, regF src1, regF src2) %{ + match(Set dst (FmaF (NegF dst) (Binary src1 src2))); + // CC unchanged by MUL-SUB. + ins_cost(ALU_REG_COST); + size(4); + format %{ "MSEBR $dst, $src1, $src2" %} + ins_encode %{ + __ z_msebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 - dst +instruct msubD_reg_reg(regD dst, regD src1, regD src2) %{ + match(Set dst (FmaD (NegD dst) (Binary src1 src2))); + // CC unchanged by MUL-SUB. + ins_cost(ALU_REG_COST); + size(4); + format %{ "MSDBR $dst, $src1, $src2" %} + ins_encode %{ + __ z_msdbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 + dst +instruct maddF_reg_mem(regF dst, regF src1, memoryRX src2) %{ + match(Set dst (FmaF dst (Binary src1 (LoadF src2)))); + // CC unchanged by MUL-ADD. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MAEB $dst, $src1, $src2" %} + ins_encode %{ + __ z_maeb($dst$$FloatRegister, $src1$$FloatRegister, + Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 + dst +instruct maddD_reg_mem(regD dst, regD src1, memoryRX src2) %{ + match(Set dst (FmaD dst (Binary src1 (LoadD src2)))); + // CC unchanged by MUL-ADD. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MADB $dst, $src1, $src2" %} + ins_encode %{ + __ z_madb($dst$$FloatRegister, $src1$$FloatRegister, + Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 - dst +instruct msubF_reg_mem(regF dst, regF src1, memoryRX src2) %{ + match(Set dst (FmaF (NegF dst) (Binary src1 (LoadF src2)))); + // CC unchanged by MUL-SUB. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MSEB $dst, $src1, $src2" %} + ins_encode %{ + __ z_mseb($dst$$FloatRegister, $src1$$FloatRegister, + Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 - dst +instruct msubD_reg_mem(regD dst, regD src1, memoryRX src2) %{ + match(Set dst (FmaD (NegD dst) (Binary src1 (LoadD src2)))); + // CC unchanged by MUL-SUB. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MSDB $dst, $src1, $src2" %} + ins_encode %{ + __ z_msdb($dst$$FloatRegister, $src1$$FloatRegister, + Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 + dst +instruct maddF_mem_reg(regF dst, memoryRX src1, regF src2) %{ + match(Set dst (FmaF dst (Binary (LoadF src1) src2))); + // CC unchanged by MUL-ADD. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MAEB $dst, $src1, $src2" %} + ins_encode %{ + __ z_maeb($dst$$FloatRegister, $src2$$FloatRegister, + Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 + dst +instruct maddD_mem_reg(regD dst, memoryRX src1, regD src2) %{ + match(Set dst (FmaD dst (Binary (LoadD src1) src2))); + // CC unchanged by MUL-ADD. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MADB $dst, $src1, $src2" %} + ins_encode %{ + __ z_madb($dst$$FloatRegister, $src2$$FloatRegister, + Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 - dst +instruct msubF_mem_reg(regF dst, memoryRX src1, regF src2) %{ + match(Set dst (FmaF (NegF dst) (Binary (LoadF src1) src2))); + // CC unchanged by MUL-SUB. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MSEB $dst, $src1, $src2" %} + ins_encode %{ + __ z_mseb($dst$$FloatRegister, $src2$$FloatRegister, + Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + +// src1 * src2 - dst +instruct msubD_mem_reg(regD dst, memoryRX src1, regD src2) %{ + match(Set dst (FmaD (NegD dst) (Binary (LoadD src1) src2))); + // CC unchanged by MUL-SUB. + ins_cost(ALU_MEMORY_COST); + size(6); + format %{ "MSDB $dst, $src1, $src2" %} + ins_encode %{ + __ z_msdb($dst$$FloatRegister, $src2$$FloatRegister, + Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp)); + %} + ins_pipe(pipe_class_dummy); +%} + // DIV // Div float single precision diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp --- a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -683,7 +683,7 @@ } break; case T_LONG: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (ireg < z_num_iarg_registers) { // Put long in register. regs[i].set2(z_iarg_reg[ireg]); @@ -723,7 +723,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (freg < z_num_farg_registers) { // Put double in register. regs[i].set2(z_farg_reg[freg]); @@ -822,7 +822,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (freg < z_num_farg_registers) { regs[i].set2(z_farg_reg[freg]); ++freg; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp --- a/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -2038,15 +2038,15 @@ generate_push_parmBlk(keylen, fCode, parmBlk, key, cv, true); // Prepare other registers for instruction. - // __ z_lgr(src, from); // Not needed, registers are the same. + // __ z_lgr(src, from); // Not needed, registers are the same. __ z_lgr(dst, to); - __ z_lgr(srclen, msglen); - - __ kmc(dst, src); // Decipher the message. + __ z_llgfr(srclen, msglen); // We pass the offsets as ints, not as longs as required. + + __ kmc(dst, src); // Decipher the message. generate_pop_parmBlk(keylen, parmBlk, key, cv); - __ z_lgr(Z_RET, msglen); + __ z_llgfr(Z_RET, msglen); // We pass the offsets as ints, not as longs as required. __ z_br(Z_R14); return __ addr_at(start_off); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp --- a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1297,36 +1297,96 @@ // Math function, frame manager must set up an interpreter state, etc. address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) { - if (!InlineIntrinsics) { return NULL; } // Generate a vanilla entry. - - // Only support absolute value and square root. - if (kind != Interpreter::java_lang_math_abs && kind != Interpreter::java_lang_math_sqrt) { - return NULL; + // Decide what to do: Use same platform specific instructions and runtime calls as compilers. + bool use_instruction = false; + address runtime_entry = NULL; + int num_args = 1; + bool double_precision = true; + + // s390 specific: + switch (kind) { + case Interpreter::java_lang_math_sqrt: + case Interpreter::java_lang_math_abs: use_instruction = true; break; + case Interpreter::java_lang_math_fmaF: + case Interpreter::java_lang_math_fmaD: use_instruction = UseFMA; break; + default: break; // Fall back to runtime call. + } + + switch (kind) { + case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break; + case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break; + case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break; + case Interpreter::java_lang_math_abs : /* run interpreted */ break; + case Interpreter::java_lang_math_sqrt : /* runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt); not available */ break; + case Interpreter::java_lang_math_log : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); break; + case Interpreter::java_lang_math_log10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break; + case Interpreter::java_lang_math_pow : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); num_args = 2; break; + case Interpreter::java_lang_math_exp : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); break; + case Interpreter::java_lang_math_fmaF : /* run interpreted */ num_args = 3; double_precision = false; break; + case Interpreter::java_lang_math_fmaD : /* run interpreted */ num_args = 3; break; + default: ShouldNotReachHere(); } - BLOCK_COMMENT("math_entry {"); - - address math_entry = __ pc(); - - if (kind == Interpreter::java_lang_math_abs) { - // Load operand from stack. - __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); - __ z_lpdbr(Z_FRET); + // Use normal entry if neither instruction nor runtime call is used. + if (!use_instruction && runtime_entry == NULL) return NULL; + + address entry = __ pc(); + + if (use_instruction) { + switch (kind) { + case Interpreter::java_lang_math_sqrt: + // Can use memory operand directly. + __ z_sqdb(Z_FRET, Interpreter::stackElementSize, Z_esp); + break; + case Interpreter::java_lang_math_abs: + // Load operand from stack. + __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); + __ z_lpdbr(Z_FRET); + break; + case Interpreter::java_lang_math_fmaF: + __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); // result reg = arg3 + __ mem2freg_opt(Z_FARG2, Address(Z_esp, 3 * Interpreter::stackElementSize)); // arg1 + __ z_maeb(Z_FRET, Z_FARG2, Address(Z_esp, 2 * Interpreter::stackElementSize)); + break; + case Interpreter::java_lang_math_fmaD: + __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); // result reg = arg3 + __ mem2freg_opt(Z_FARG2, Address(Z_esp, 5 * Interpreter::stackElementSize)); // arg1 + __ z_madb(Z_FRET, Z_FARG2, Address(Z_esp, 3 * Interpreter::stackElementSize)); + break; + default: ShouldNotReachHere(); + } } else { - // sqrt - // Can use memory operand directly. - __ z_sqdb(Z_FRET, Interpreter::stackElementSize, Z_esp); + // Load arguments + assert(num_args <= 4, "passed in registers"); + if (double_precision) { + int offset = (2 * num_args - 1) * Interpreter::stackElementSize; + for (int i = 0; i < num_args; ++i) { + __ mem2freg_opt(as_FloatRegister(Z_FARG1->encoding() + 2 * i), Address(Z_esp, offset)); + offset -= 2 * Interpreter::stackElementSize; + } + } else { + int offset = num_args * Interpreter::stackElementSize; + for (int i = 0; i < num_args; ++i) { + __ mem2freg_opt(as_FloatRegister(Z_FARG1->encoding() + 2 * i), Address(Z_esp, offset)); + offset -= Interpreter::stackElementSize; + } + } + // Call runtime + __ save_return_pc(); // Save Z_R14. + __ push_frame_abi160(0); // Without new frame the RT call could overwrite the saved Z_R14. + + __ call_VM_leaf(runtime_entry); + + __ pop_frame(); + __ restore_return_pc(); // Restore Z_R14. } - // Restore caller sp for c2i case. + // Pop c2i arguments (if any) off when we return. __ resize_frame_absolute(Z_R10, Z_R0, true); // Cut the stack back to where the caller started. - // We are done, return. __ z_br(Z_R14); - BLOCK_COMMENT("} math_entry"); - - return math_entry; + return entry; } // Interpreter stub for calling a native method. (asm interpreter). diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/s390/vm/vm_version_s390.cpp --- a/hotspot/src/cpu/s390/vm/vm_version_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/s390/vm/vm_version_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -155,9 +155,8 @@ FLAG_SET_DEFAULT(UseGHASHIntrinsics, false); } - if (UseFMA) { - warning("FMA instructions are not available on this CPU"); - FLAG_SET_DEFAULT(UseFMA, false); + if (FLAG_IS_DEFAULT(UseFMA)) { + FLAG_SET_DEFAULT(UseFMA, true); } // On z/Architecture, we take UseSHA as the general switch to enable/disable the SHA intrinsics. diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -425,7 +425,7 @@ #ifdef _LP64 case T_LONG: - assert(sig_bt[i+1] == T_VOID, "expecting VOID in other half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting VOID in other half"); // fall-through case T_OBJECT: case T_ARRAY: @@ -441,7 +441,7 @@ break; #else case T_LONG: - assert(sig_bt[i+1] == T_VOID, "expecting VOID in other half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting VOID in other half"); // On 32-bit SPARC put longs always on the stack to keep the pressure off // integer argument registers. They should be used for oops. slot = round_to(slot, 2); // align @@ -460,7 +460,7 @@ break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); if (round_to(flt_reg, 2) + 1 < flt_reg_max) { flt_reg = round_to(flt_reg, 2); // align FloatRegister r = as_FloatRegister(flt_reg); @@ -1174,7 +1174,7 @@ regs[i].set1(int_stk_helper(j)); break; case T_LONG: - assert(sig_bt[i+1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half"); case T_ADDRESS: // raw pointers, like current thread, for VM calls case T_ARRAY: case T_OBJECT: @@ -1209,7 +1209,7 @@ break; case T_DOUBLE: { - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); // V9ism: doubles go in EVEN/ODD regs and stack slots int double_index = (j << 1); param_array_reg.set2(VMRegImpl::stack2reg(double_index)); @@ -1261,7 +1261,7 @@ break; case T_DOUBLE: case T_LONG: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); regs[i].set_pair(int_stk_helper(i + 1), int_stk_helper(i)); break; case T_VOID: regs[i].set_bad(); break; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/x86/vm/globals_x86.hpp --- a/hotspot/src/cpu/x86/vm/globals_x86.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -63,9 +63,10 @@ #define MIN_STACK_RED_PAGES DEFAULT_STACK_RED_PAGES #define MIN_STACK_RESERVED_PAGES (0) -#ifdef AMD64 -// Very large C++ stack frames using solaris-amd64 optimized builds -// due to lack of optimization caused by C++ compiler bugs +#ifdef _LP64 +// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the +// stack if compiled for unix and LP64. To pass stack overflow tests we need +// 20 shadow pages. #define DEFAULT_STACK_SHADOW_PAGES (NOT_WIN64(20) WIN64_ONLY(7) DEBUG_ONLY(+2)) // For those clients that do not use write socket, we allow // the min range value to be below that of the default @@ -73,7 +74,7 @@ #else #define DEFAULT_STACK_SHADOW_PAGES (4 DEBUG_ONLY(+5)) #define MIN_STACK_SHADOW_PAGES DEFAULT_STACK_SHADOW_PAGES -#endif // AMD64 +#endif // _LP64 define_pd_global(intx, StackYellowPages, DEFAULT_STACK_YELLOW_PAGES); define_pd_global(intx, StackRedPages, DEFAULT_STACK_RED_PAGES); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -478,12 +478,12 @@ } break; case T_LONG: - assert(sig_bt[i+1] == T_VOID, "missing Half" ); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" ); regs[i].set2(VMRegImpl::stack2reg(dstack)); dstack += 2; break; case T_DOUBLE: - assert(sig_bt[i+1] == T_VOID, "missing Half" ); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" ); if( freg_arg0 == (uint)i ) { regs[i].set2(xmm0->as_VMReg()); } else if( freg_arg1 == (uint)i ) { @@ -1001,7 +1001,7 @@ case T_DOUBLE: // The stack numbering is reversed from Java // Since C arguments do not get reversed, the ordering for // doubles on the stack must be opposite the Java convention - assert(sig_bt[i+1] == T_VOID, "missing Half" ); + assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" ); regs[i].set2(VMRegImpl::stack2reg(stack)); stack += 2; break; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -474,7 +474,7 @@ regs[i].set_bad(); break; case T_LONG: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); // fall through case T_OBJECT: case T_ARRAY: @@ -495,7 +495,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); if (fp_args < Argument::n_float_register_parameters_j) { regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg()); } else { @@ -1014,7 +1014,7 @@ } break; case T_LONG: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); // fall through case T_OBJECT: case T_ARRAY: @@ -1045,7 +1045,7 @@ } break; case T_DOUBLE: - assert(sig_bt[i + 1] == T_VOID, "expecting half"); + assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half"); if (fp_args < Argument::n_float_register_parameters_c) { regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg()); #ifdef _WIN64 diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,10 +44,14 @@ Type type = db.lookupType("ClassLoaderData"); classLoaderField = type.getOopField("_class_loader"); nextField = type.getAddressField("_next"); + klassesField = type.getAddressField("_klasses"); + isAnonymousField = new CIntField(type.getCIntegerField("_is_anonymous"), 0); } private static sun.jvm.hotspot.types.OopField classLoaderField; private static AddressField nextField; + private static AddressField klassesField; + private static CIntField isAnonymousField; public ClassLoaderData(Address addr) { super(addr); @@ -63,4 +67,16 @@ public Oop getClassLoader() { return VM.getVM().getObjectHeap().newOop(classLoaderField.getValue(getAddress())); } + + public boolean getIsAnonymous() { + return isAnonymousField.getValue(this) != 0; + } + + public ClassLoaderData next() { + return instantiateWrapperFor(nextField.getValue(getAddress())); + } + + public Klass getKlasses() { + return (InstanceKlass)Metadata.instantiateWrapperFor(klassesField.getValue(getAddress())); + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +package sun.jvm.hotspot.classfile; + +import java.io.PrintStream; +import java.util.*; +import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.oops.*; +import sun.jvm.hotspot.types.*; + +public class ClassLoaderDataGraph { + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { + Type type = db.lookupType("ClassLoaderDataGraph"); + + headField = type.getAddressField("_head"); + } + + private static AddressField headField; + + public ClassLoaderData getClassLoaderGraphHead() { + return ClassLoaderData.instantiateWrapperFor(headField.getValue()); + } + + public static interface KlassVisitor { + public void visit(Klass k); + } + + /** Iterate over all anonymous class loaders and the klasses in those */ + public void allAnonymousKlassesDo(final KlassVisitor v) { + for (ClassLoaderData cl = getClassLoaderGraphHead(); + cl != null; + cl = cl.next()) { + if (cl.getIsAnonymous() == true) { + for (Klass k = cl.getKlasses(); k != null; k = k.getNextLinkKlass()) { + v.visit(k); + } + } + } + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Mon Jan 09 11:57:06 2017 -0800 @@ -61,6 +61,7 @@ } subklass = new MetadataField(type.getAddressField("_subklass"), 0); nextSibling = new MetadataField(type.getAddressField("_next_sibling"), 0); + nextLink = new MetadataField(type.getAddressField("_next_link"), 0); vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0); LH_INSTANCE_SLOW_PATH_BIT = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue(); @@ -92,6 +93,7 @@ private static CIntField accessFlags; private static MetadataField subklass; private static MetadataField nextSibling; + private static MetadataField nextLink; private static sun.jvm.hotspot.types.Field traceIDField; private static CIntField vtableLen; @@ -114,6 +116,7 @@ public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); } public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); } public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); } + public Klass getNextLinkKlass() { return (Klass) nextLink.getValue(this); } public long getVtableLen() { return vtableLen.getValue(this); } public long traceID() { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java Mon Jan 09 11:57:06 2017 -0800 @@ -38,6 +38,7 @@ import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.classfile.*; /**

This class encapsulates the global state of the VM; the universe, object heap, interpreter, etc. It is a Singleton and @@ -80,6 +81,7 @@ private SymbolTable symbols; private StringTable strings; private SystemDictionary dict; + private ClassLoaderDataGraph cldGraph; private Threads threads; private ObjectSynchronizer synchronizer; private JNIHandles handles; @@ -660,6 +662,13 @@ return dict; } + public ClassLoaderDataGraph getClassLoaderDataGraph() { + if (cldGraph == null) { + cldGraph = new ClassLoaderDataGraph(); + } + return cldGraph; + } + public Threads getThreads() { if (threads == null) { threads = new Threads(); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,7 @@ import sun.jvm.hotspot.memory.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.classfile.*; /* * This class writes Java heap in hprof binary format. This format is @@ -379,6 +380,8 @@ private static final int JVM_SIGNATURE_ARRAY = '['; private static final int JVM_SIGNATURE_CLASS = 'L'; + int serialNum = 1; + public synchronized void write(String fileName) throws IOException { // open file stream and create buffered data output stream fos = new FileOutputStream(fileName); @@ -516,6 +519,7 @@ private void writeClassDumpRecords() throws IOException { SystemDictionary sysDict = VM.getVM().getSystemDictionary(); + ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph(); try { sysDict.allClassesDo(new SystemDictionary.ClassVisitor() { public void visit(Klass k) { @@ -528,6 +532,19 @@ } } }); + // Add the anonymous classes also which are not present in the + // System Dictionary + cldGraph.allAnonymousKlassesDo(new ClassLoaderDataGraph.KlassVisitor() { + public void visit(Klass k) { + try { + writeHeapRecordPrologue(); + writeClassDumpRecord(k); + writeHeapRecordEpilogue(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); } catch (RuntimeException re) { handleRuntimeException(re); } @@ -799,17 +816,6 @@ writeObjectID(klass.getJavaMirror()); ClassData cd = (ClassData) classDataCache.get(klass); - if (cd == null) { - // The class is not present in the system dictionary, probably Lambda. - // Add it to cache here - if (klass instanceof InstanceKlass) { - InstanceKlass ik = (InstanceKlass) klass; - List fields = getInstanceFields(ik); - int instSize = getSizeForFields(fields); - cd = new ClassData(instSize, fields); - classDataCache.put(ik, cd); - } - } if (Assert.ASSERTS_ENABLED) { Assert.that(cd != null, "can not get class data for " + klass.getName().asString() + klass.getAddress()); @@ -950,9 +956,24 @@ private void writeClasses() throws IOException { // write class list (id, name) association SystemDictionary sysDict = VM.getVM().getSystemDictionary(); + ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph(); try { sysDict.allClassesDo(new SystemDictionary.ClassVisitor() { - private int serialNum = 1; + public void visit(Klass k) { + try { + Instance clazz = k.getJavaMirror(); + writeHeader(HPROF_LOAD_CLASS, 2 * (OBJ_ID_SIZE + 4)); + out.writeInt(serialNum); + writeObjectID(clazz); + out.writeInt(DUMMY_STACK_TRACE_ID); + writeSymbolID(k.getName()); + serialNum++; + } catch (IOException exp) { + throw new RuntimeException(exp); + } + } + }); + cldGraph.allAnonymousKlassesDo(new ClassLoaderDataGraph.KlassVisitor() { public void visit(Klass k) { try { Instance clazz = k.getJavaMirror(); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java --- a/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java Mon Jan 09 11:57:06 2017 -0800 @@ -53,6 +53,7 @@ import org.graalvm.compiler.hotspot.stubs.Stub; import org.graalvm.compiler.hotspot.stubs.UnwindExceptionToCallerStub; import org.graalvm.compiler.hotspot.word.KlassPointer; +import org.graalvm.compiler.hotspot.word.MethodCountersPointer; import org.graalvm.compiler.lir.LIR; import org.graalvm.compiler.lir.LIRFrameState; import org.graalvm.compiler.lir.LIRInstruction; @@ -316,8 +317,8 @@ /** * Tiered support. */ - public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, Word.class); - public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, Word.class, int.class, int.class); + public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, MethodCountersPointer.class); + public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, MethodCountersPointer.class, int.class, int.class); /** * @see UncommonTrapCallNode diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os/aix/vm/os_aix.cpp --- a/hotspot/src/os/aix/vm/os_aix.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os/aix/vm/os_aix.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -848,13 +848,13 @@ assert(thread->osthread() == NULL, "caller responsible"); - // Allocate the OSThread object + // Allocate the OSThread object. OSThread* osthread = new OSThread(NULL, NULL); if (osthread == NULL) { return false; } - // set the correct thread state + // Set the correct thread state. osthread->set_thread_type(thr_type); // Initial state is ALLOCATED but not INITIALIZED @@ -862,7 +862,7 @@ thread->set_osthread(osthread); - // init thread attributes + // Init thread attributes. pthread_attr_t attr; pthread_attr_init(&attr); guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???"); @@ -871,15 +871,18 @@ if (os::Aix::on_aix()) { guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???"); guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???"); - } // end: aix + } // Start in suspended state, and in os::thread_start, wake the thread up. guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???"); - // calculate stack size if it's not specified by caller + // Calculate stack size if it's not specified by caller. size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size); pthread_attr_setstacksize(&attr, stack_size); + // Configure libc guard page. + pthread_attr_setguardsize(&attr, os::Aix::default_guard_size(thr_type)); + pthread_t tid; int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread); @@ -895,7 +898,7 @@ pthread_attr_destroy(&attr); if (ret != 0) { - // Need to clean up stuff we've allocated so far + // Need to clean up stuff we've allocated so far. thread->set_osthread(NULL); delete osthread; return false; @@ -3032,6 +3035,19 @@ return chained; } +size_t os::Aix::default_guard_size(os::ThreadType thr_type) { + // Creating guard page is very expensive. Java thread has HotSpot + // guard pages, only enable glibc guard page for non-Java threads. + // (Remember: compiler thread is a Java thread, too!) + // + // Aix can have different page sizes for stack (4K) and heap (64K). + // As Hotspot knows only one page size, we assume the stack has + // the same page size as the heap. Returning page_size() here can + // cause 16 guard pages which we want to avoid. Thus we return 4K + // which will be rounded to the real page size by the OS. + return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : 4 * K); +} + struct sigaction* os::Aix::get_preinstalled_handler(int sig) { if (sigismember(&sigs, sig)) { return &sigact[sig]; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os/aix/vm/os_aix.hpp --- a/hotspot/src/os/aix/vm/os_aix.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os/aix/vm/os_aix.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -140,6 +140,9 @@ // libpthread version string static void libpthread_init(); + // Return default libc guard size for the specified thread type. + static size_t default_guard_size(os::ThreadType thr_type); + // Function returns true if we run on OS/400 (pase), false if we run // on AIX. static bool on_pase() { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os/linux/vm/os_linux.cpp --- a/hotspot/src/os/linux/vm/os_linux.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os/linux/vm/os_linux.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -716,11 +716,18 @@ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - // calculate stack size if it's not specified by caller + // Calculate stack size if it's not specified by caller. size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size); + // In the Linux NPTL pthread implementation the guard size mechanism + // is not implemented properly. The posix standard requires adding + // the size of the guard pages to the stack size, instead Linux + // takes the space out of 'stacksize'. Thus we adapt the requested + // stack_size by the size of the guard pages to mimick proper + // behaviour. + stack_size = align_size_up(stack_size + os::Linux::default_guard_size(thr_type), vm_page_size()); pthread_attr_setstacksize(&attr, stack_size); - // glibc guard page + // Configure glibc guard page. pthread_attr_setguardsize(&attr, os::Linux::default_guard_size(thr_type)); ThreadState state; @@ -920,9 +927,21 @@ // Locate initial thread stack. This special handling of initial thread stack // is needed because pthread_getattr_np() on most (all?) Linux distros returns -// bogus value for initial thread. +// bogus value for the primordial process thread. While the launcher has created +// the VM in a new thread since JDK 6, we still have to allow for the use of the +// JNI invocation API from a primordial thread. void os::Linux::capture_initial_stack(size_t max_size) { - // stack size is the easy part, get it from RLIMIT_STACK + + // max_size is either 0 (which means accept OS default for thread stacks) or + // a user-specified value known to be at least the minimum needed. If we + // are actually on the primordial thread we can make it appear that we have a + // smaller max_size stack by inserting the guard pages at that location. But we + // cannot do anything to emulate a larger stack than what has been provided by + // the OS or threading library. In fact if we try to use a stack greater than + // what is set by rlimit then we will crash the hosting process. + + // Maximum stack size is the easy part, get it from RLIMIT_STACK. + // If this is "unlimited" then it will be a huge value. struct rlimit rlim; getrlimit(RLIMIT_STACK, &rlim); size_t stack_size = rlim.rlim_cur; @@ -932,17 +951,6 @@ // so we won't install guard page on ld.so's data section. stack_size -= 2 * page_size(); - // 4441425: avoid crash with "unlimited" stack size on SuSE 7.1 or Redhat - // 7.1, in both cases we will get 2G in return value. - // 4466587: glibc 2.2.x compiled w/o "--enable-kernel=2.4.0" (RH 7.0, - // SuSE 7.2, Debian) can not handle alternate signal stack correctly - // for initial thread if its stack size exceeds 6M. Cap it at 2M, - // in case other parts in glibc still assumes 2M max stack size. - // FIXME: alt signal stack is gone, maybe we can relax this constraint? - // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small - if (stack_size > 2 * K * K IA64_ONLY(*2)) { - stack_size = 2 * K * K IA64_ONLY(*2); - } // Try to figure out where the stack base (top) is. This is harder. // // When an application is started, glibc saves the initial stack pointer in @@ -1102,14 +1110,29 @@ // stack_top could be partially down the page so align it stack_top = align_size_up(stack_top, page_size()); - if (max_size && stack_size > max_size) { - _initial_thread_stack_size = max_size; + // Allowed stack value is minimum of max_size and what we derived from rlimit + if (max_size > 0) { + _initial_thread_stack_size = MIN2(max_size, stack_size); } else { - _initial_thread_stack_size = stack_size; - } - + // Accept the rlimit max, but if stack is unlimited then it will be huge, so + // clamp it at 8MB as we do on Solaris + _initial_thread_stack_size = MIN2(stack_size, 8*M); + } _initial_thread_stack_size = align_size_down(_initial_thread_stack_size, page_size()); _initial_thread_stack_bottom = (address)stack_top - _initial_thread_stack_size; + + assert(_initial_thread_stack_bottom < (address)stack_top, "overflow!"); + + if (log_is_enabled(Info, os, thread)) { + // See if we seem to be on primordial process thread + bool primordial = uintptr_t(&rlim) > uintptr_t(_initial_thread_stack_bottom) && + uintptr_t(&rlim) < stack_top; + + log_info(os, thread)("Capturing initial stack in %s thread: req. size: " SIZE_FORMAT "K, actual size: " + SIZE_FORMAT "K, top=" INTPTR_FORMAT ", bottom=" INTPTR_FORMAT, + primordial ? "primordial" : "user", max_size / K, _initial_thread_stack_size / K, + stack_top, intptr_t(_initial_thread_stack_bottom)); + } } //////////////////////////////////////////////////////////////////////////////// @@ -2833,6 +2856,13 @@ return false; } +size_t os::Linux::default_guard_size(os::ThreadType thr_type) { + // Creating guard page is very expensive. Java thread has HotSpot + // guard pages, only enable glibc guard page for non-Java threads. + // (Remember: compiler thread is a Java thread, too!) + return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : page_size()); +} + // rebuild_cpu_to_node_map() constructs a table mapping cpud id to node id. // The table is later used in get_node_by_cpu(). void os::Linux::rebuild_cpu_to_node_map() { @@ -6065,6 +6095,101 @@ return yes; } + +// Java/Compiler thread: +// +// Low memory addresses +// P0 +------------------------+ +// | |\ Java thread created by VM does not have glibc +// | glibc guard page | - guard page, attached Java thread usually has +// | |/ 1 glibc guard page. +// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() +// | |\ +// | HotSpot Guard Pages | - red, yellow and reserved pages +// | |/ +// +------------------------+ JavaThread::stack_reserved_zone_base() +// | |\ +// | Normal Stack | - +// | |/ +// P2 +------------------------+ Thread::stack_base() +// +// Non-Java thread: +// +// Low memory addresses +// P0 +------------------------+ +// | |\ +// | glibc guard page | - usually 1 page +// | |/ +// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() +// | |\ +// | Normal Stack | - +// | |/ +// P2 +------------------------+ Thread::stack_base() +// +// ** P1 (aka bottom) and size (P2 = P1 - size) are the address and stack size +// returned from pthread_attr_getstack(). +// ** Due to NPTL implementation error, linux takes the glibc guard page out +// of the stack size given in pthread_attr. We work around this for +// threads created by the VM. (We adapt bottom to be P1 and size accordingly.) +// +#ifndef ZERO +static void current_stack_region(address * bottom, size_t * size) { + if (os::Linux::is_initial_thread()) { + // initial thread needs special handling because pthread_getattr_np() + // may return bogus value. + *bottom = os::Linux::initial_thread_stack_bottom(); + *size = os::Linux::initial_thread_stack_size(); + } else { + pthread_attr_t attr; + + int rslt = pthread_getattr_np(pthread_self(), &attr); + + // JVM needs to know exact stack location, abort if it fails + if (rslt != 0) { + if (rslt == ENOMEM) { + vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); + } else { + fatal("pthread_getattr_np failed with error = %d", rslt); + } + } + + if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { + fatal("Cannot locate current stack attributes!"); + } + + // Work around NPTL stack guard error. + size_t guard_size = 0; + rslt = pthread_attr_getguardsize(&attr, &guard_size); + if (rslt != 0) { + fatal("pthread_attr_getguardsize failed with error = %d", rslt); + } + *bottom += guard_size; + *size -= guard_size; + + pthread_attr_destroy(&attr); + + } + assert(os::current_stack_pointer() >= *bottom && + os::current_stack_pointer() < *bottom + *size, "just checking"); +} + +address os::current_stack_base() { + address bottom; + size_t size; + current_stack_region(&bottom, &size); + return (bottom + size); +} + +size_t os::current_stack_size() { + // This stack size includes the usable stack and HotSpot guard pages + // (for the threads that have Hotspot guard pages). + address bottom; + size_t size; + current_stack_region(&bottom, &size); + return size; +} +#endif + static inline struct timespec get_mtime(const char* filename) { struct stat st; int ret = os::stat(filename, &st); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os/posix/vm/os_posix.cpp --- a/hotspot/src/os/posix/vm/os_posix.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os/posix/vm/os_posix.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1096,6 +1096,8 @@ int detachstate = 0; pthread_attr_getstacksize(attr, &stack_size); pthread_attr_getguardsize(attr, &guard_size); + // Work around linux NPTL implementation error, see also os::create_thread() in os_linux.cpp. + LINUX_ONLY(stack_size -= guard_size); pthread_attr_getdetachstate(attr, &detachstate); jio_snprintf(buf, buflen, "stacksize: " SIZE_FORMAT "k, guardsize: " SIZE_FORMAT "k, %s", stack_size / 1024, guard_size / 1024, @@ -1105,14 +1107,18 @@ // Check minimum allowable stack sizes for thread creation and to initialize // the java system classes, including StackOverflowError - depends on page -// size. Add two 4K pages for compiler2 recursion in main thread. -// Add in 4*BytesPerWord 4K pages to account for VM stack during -// class initialization depending on 32 or 64 bit VM. +// size. +// The space needed for frames during startup is platform dependent. It +// depends on word size, platform calling conventions, C frame layout and +// interpreter/C1/C2 design decisions. Therefore this is given in a +// platform (os/cpu) dependent constant. +// To this, space for guard mechanisms is added, which depends on the +// page size which again depends on the concrete system the VM is running +// on. Space for libc guard pages is not included in this size. jint os::Posix::set_minimum_stack_sizes() { - _java_thread_min_stack_allowed = MAX2(_java_thread_min_stack_allowed, - JavaThread::stack_guard_zone_size() + - JavaThread::stack_shadow_zone_size() + - (4 * BytesPerWord COMPILER2_PRESENT(+ 2)) * 4 * K); + _java_thread_min_stack_allowed = _java_thread_min_stack_allowed + + JavaThread::stack_guard_zone_size() + + JavaThread::stack_shadow_zone_size(); _java_thread_min_stack_allowed = align_size_up(_java_thread_min_stack_allowed, vm_page_size()); @@ -1128,28 +1134,14 @@ return JNI_ERR; } -#ifdef SOLARIS - // For 64kbps there will be a 64kb page size, which makes - // the usable default stack size quite a bit less. Increase the - // stack for 64kb (or any > than 8kb) pages, this increases - // virtual memory fragmentation (since we're not creating the - // stack on a power of 2 boundary. The real fix for this - // should be to fix the guard page mechanism. - - if (vm_page_size() > 8*K) { - stack_size_in_bytes = (stack_size_in_bytes != 0) - ? stack_size_in_bytes + - JavaThread::stack_red_zone_size() + - JavaThread::stack_yellow_zone_size() - : 0; - ThreadStackSize = stack_size_in_bytes/K; - } -#endif // SOLARIS - // Make the stack size a multiple of the page size so that // the yellow/red zones can be guarded. - JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes, - vm_page_size())); + JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes, vm_page_size())); + + // Reminder: a compiler thread is a Java thread. + _compiler_thread_min_stack_allowed = _compiler_thread_min_stack_allowed + + JavaThread::stack_guard_zone_size() + + JavaThread::stack_shadow_zone_size(); _compiler_thread_min_stack_allowed = align_size_up(_compiler_thread_min_stack_allowed, vm_page_size()); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os/posix/vm/os_posix.hpp --- a/hotspot/src/os/posix/vm/os_posix.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os/posix/vm/os_posix.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -43,7 +43,11 @@ static void print_load_average(outputStream* st); // Minimum stack size a thread can be created with (allowing - // the VM to completely create the thread and enter user code) + // the VM to completely create the thread and enter user code). + // The initial values exclude any guard pages (by HotSpot or libc). + // set_minimum_stack_sizes() will add the size required for + // HotSpot guard pages depending on page size and flag settings. + // Libc guard pages are never considered by these values. static size_t _compiler_thread_min_stack_allowed; static size_t _java_thread_min_stack_allowed; static size_t _vm_internal_thread_min_stack_allowed; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp --- a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -535,13 +535,15 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 192 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; -// return default stack size for thr_type +// Return default stack size for thr_type. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { - // default stack size (compiler thread needs larger stack) + // Default stack size (compiler thread needs larger stack). size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M); return s; } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp --- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -839,19 +839,20 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -#ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 48 * K; +#ifdef _LP64 size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; #else -size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; +#endif // _LP64 +#ifndef AMD64 #ifdef __GNUC__ #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;}) #endif - #endif // AMD64 // return default stack size for thr_type @@ -870,14 +871,14 @@ // // Low memory addresses // +------------------------+ -// | |\ JavaThread created by VM does not have glibc +// | |\ Java thread created by VM does not have glibc // | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. +// | |/ 1 glibc guard page. // P1 +------------------------+ Thread::stack_base() - Thread::stack_size() // | |\ -// | HotSpot Guard Pages | - red and yellow pages +// | HotSpot Guard Pages | - red, yellow and reserved pages // | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() +// +------------------------+ JavaThread::stack_reserved_zone_base() // | |\ // | Normal Stack | - // | |/ @@ -925,7 +926,7 @@ int rslt = pthread_stackseg_np(pthread_self(), &ss); if (rslt != 0) - fatal("pthread_stackseg_np failed with err = %d", rslt); + fatal("pthread_stackseg_np failed with error = %d", rslt); *bottom = (address)((char *)ss.ss_sp - ss.ss_size); *size = ss.ss_size; @@ -936,12 +937,12 @@ // JVM needs to know exact stack location, abort if it fails if (rslt != 0) - fatal("pthread_attr_init failed with err = %d", rslt); + fatal("pthread_attr_init failed with error = %d", rslt); rslt = pthread_attr_get_np(pthread_self(), &attr); if (rslt != 0) - fatal("pthread_attr_get_np failed with err = %d", rslt); + fatal("pthread_attr_get_np failed with error = %d", rslt); if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 || pthread_attr_getstacksize(&attr, size) != 0) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp --- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -310,7 +310,7 @@ int rslt = pthread_stackseg_np(pthread_self(), &ss); if (rslt != 0) - fatal("pthread_stackseg_np failed with err = " INT32_FORMAT, rslt); + fatal("pthread_stackseg_np failed with error = " INT32_FORMAT, rslt); stack_top = (address) ss.ss_sp; stack_bytes = ss.ss_size; @@ -322,12 +322,12 @@ // JVM needs to know exact stack location, abort if it fails if (rslt != 0) - fatal("pthread_attr_init failed with err = " INT32_FORMAT, rslt); + fatal("pthread_attr_init failed with error = " INT32_FORMAT, rslt); rslt = pthread_attr_get_np(pthread_self(), &attr); if (rslt != 0) - fatal("pthread_attr_get_np failed with err = " INT32_FORMAT, rslt); + fatal("pthread_attr_get_np failed with error = " INT32_FORMAT, rslt); if (pthread_attr_getstackaddr(&attr, (void **) &stack_bottom) != 0 || pthread_attr_getstacksize(&attr, &stack_bytes) != 0) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp --- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -473,8 +473,10 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 32 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; // return default stack size for thr_type @@ -484,91 +486,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler @@ -606,8 +523,10 @@ st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]); st->cr(); #else - for (int r = 0; r < 31; r++) - st->print_cr( "R%d=" INTPTR_FORMAT, r, (size_t)uc->uc_mcontext.regs[r]); + for (int r = 0; r < 31; r++) { + st->print("R%-2d=", r); + print_location(st, uc->uc_mcontext.regs[r]); + } #endif st->cr(); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp --- a/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -526,8 +526,10 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K; +size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; // return default stack size for thr_type @@ -537,91 +539,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed"); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp --- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -535,100 +535,19 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; -// return default stack size for thr_type +// Return default stack size for thr_type. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { - // default stack size (compiler thread needs larger stack) + // Default stack size (compiler thread needs larger stack). size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K); return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - return 2 * page_size(); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp --- a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -473,103 +473,19 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = (52 DEBUG_ONLY(+ 32)) * K; +size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 8)) * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 32 * K; -// return default stack size for thr_type +// Return default stack size for thr_type. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { - // default stack size (compiler thread needs larger stack) + // Default stack size (compiler thread needs larger stack). size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K); return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // z/Architecture: put 2 guard pages right in the middle of thread stack. This value - // should be consistent with the value used by register stack handling code. - return 2 * page_size(); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - Right in the middle of stack, 2 pages -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - Right in the middle of stack, 2 pages -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P2 is the address returned from pthread_attr_getstackaddr(), P2 - P1 -// is the stack size returned by pthread_attr_getstacksize(). - - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // Initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -156,51 +156,6 @@ return (address)sp; } -static void current_stack_region(address* bottom, size_t* size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void**)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return bottom + size; -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - char* os::non_memory_address_word() { // Must never look like an address returned by reserve_memory, // even in its subfields (as defined by the CPU immediate fields, @@ -726,8 +681,10 @@ /////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; // return default stack size for thr_type @@ -737,12 +694,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - #ifndef PRODUCT void os::verify_stack_alignment() { } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp --- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -677,15 +677,15 @@ //////////////////////////////////////////////////////////////////////////////// // thread stack -#ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 40 * K; +#ifdef _LP64 size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; #else -size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -#endif // AMD64 +#endif // _LP64 // return default stack size for thr_type size_t os::Posix::default_stack_size(os::ThreadType thr_type) { @@ -698,91 +698,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); -} - -// Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ JavaThread created by VM does not have glibc -// | glibc guard page | - guard, attached Java thread usually has -// | |/ 1 page glibc guard. -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | HotSpot Guard Pages | - red and yellow pages -// | |/ -// +------------------------+ JavaThread::stack_yellow_zone_base() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// Non-Java thread: -// -// Low memory addresses -// +------------------------+ -// | |\ -// | glibc guard page | - usually 1 page -// | |/ -// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() -// | |\ -// | Normal Stack | - -// | |/ -// P2 +------------------------+ Thread::stack_base() -// -// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from -// pthread_attr_getstack() - -static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); -} - -address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); -} - -size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; -} - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp --- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -320,12 +320,6 @@ return s; } -size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Only enable glibc guard pages for non-Java threads - // (Java threads have HotSpot guard pages) - return (thr_type == java_thread ? 0 : page_size()); -} - static void current_stack_region(address *bottom, size_t *size) { pthread_attr_t attr; int res = pthread_getattr_np(pthread_self(), &attr); @@ -334,7 +328,7 @@ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); } else { - fatal("pthread_getattr_np failed with errno = %d", res); + fatal("pthread_getattr_np failed with error = %d", res); } } @@ -342,7 +336,7 @@ size_t stack_bytes; res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes); if (res != 0) { - fatal("pthread_attr_getstack failed with errno = %d", res); + fatal("pthread_attr_getstack failed with error = %d", res); } address stack_top = stack_bottom + stack_bytes; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp --- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -81,15 +81,13 @@ #define MAX_PATH (2 * K) -// Minimum stack size for the VM. It's easier to document a constant -// but it's different for x86 and sparc because the page sizes are different. +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +size_t os::Posix::_compiler_thread_min_stack_allowed = 104 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 86 * K; #ifdef _LP64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; #else -size_t os::Posix::_compiler_thread_min_stack_allowed = 96 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 96 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 96 * K; #endif diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -86,19 +86,23 @@ #define MAX_PATH (2 * K) -// Minimum stack sizes for the VM. It's easier to document a constant value -// but it's different for x86 and sparc because the page sizes are different. +// Minimum usable stack sizes required to get to user code. Space for +// HotSpot guard pages is added later. +#ifdef _LP64 +size_t os::Posix::_compiler_thread_min_stack_allowed = 202 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 48 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K; +#else +size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 32 * K; +size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; +#endif // _LP64 + #ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 394 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 224 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K; #define REG_SP REG_RSP #define REG_PC REG_RIP #define REG_FP REG_RBP #else -size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 64 * K; -size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K; #define REG_SP UESP #define REG_PC EIP #define REG_FP EBP diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/c1/c1_LIR.cpp --- a/hotspot/src/share/vm/c1/c1_LIR.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/c1/c1_LIR.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -677,9 +677,7 @@ // LIR_Op3 case lir_idiv: - case lir_irem: - case lir_fmad: - case lir_fmaf: { + case lir_irem: { assert(op->as_Op3() != NULL, "must be"); LIR_Op3* op3= (LIR_Op3*)op; @@ -697,6 +695,17 @@ break; } + case lir_fmad: + case lir_fmaf: { + assert(op->as_Op3() != NULL, "must be"); + LIR_Op3* op3= (LIR_Op3*)op; + assert(op3->_info == NULL, "no info"); + do_input(op3->_opr1); + do_input(op3->_opr2); + do_input(op3->_opr3); + do_output(op3->_result); + break; + } // LIR_OpJavaCall case lir_static_call: diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/classfile/classLoader.cpp --- a/hotspot/src/share/vm/classfile/classLoader.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/classfile/classLoader.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -84,7 +84,6 @@ typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n); typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg); typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len); -typedef void (JNICALL *FreeEntry_t)(jzfile *zip, jzentry *entry); static ZipOpen_t ZipOpen = NULL; static ZipClose_t ZipClose = NULL; @@ -94,7 +93,6 @@ static canonicalize_fn_t CanonicalizeEntry = NULL; static ZipInflateFully_t ZipInflateFully = NULL; static Crc32_t Crc32 = NULL; -static FreeEntry_t FreeEntry = NULL; // Entry points for jimage.dll for loading jimage file entries @@ -150,7 +148,6 @@ GrowableArray* ClassLoader::_boot_modules_array = NULL; GrowableArray* ClassLoader::_platform_modules_array = NULL; SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL; -int ClassLoader::_num_patch_mod_prefixes = 0; #endif // helper routines @@ -320,20 +317,6 @@ FREE_C_HEAP_ARRAY(char, _zip_name); } -bool ClassPathZipEntry::stream_exists(const char* name) { - // enable call to C land - JavaThread* thread = JavaThread::current(); - ThreadToNativeFromVM ttn(thread); - // check whether zip archive contains name - jint name_len, filesize; - jzentry* entry = (*FindEntry)(_zip, name, &filesize, &name_len); - if (entry != NULL) { - (*FreeEntry)(_zip, entry); - return true; - } - return false; -} - u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) { // enable call to C land JavaThread* thread = JavaThread::current(); @@ -1090,7 +1073,6 @@ GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry")); ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully")); Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32")); - FreeEntry = CAST_TO_FN_PTR(FreeEntry_t, os::dll_lookup(handle, "ZIP_FreeEntry")); // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || @@ -1418,57 +1400,6 @@ return NULL; } -#if INCLUDE_CDS -// The following function is only used during CDS dump time. -// It checks if a class can be found in the jar entries of the _patch_mod_entries. -// It does not support non-jar entries. -bool ClassLoader::is_in_patch_module(const char* const file_name) { - assert(DumpSharedSpaces, "dump time only"); - if (_patch_mod_entries == NULL) { - return false; - } - - int num_of_entries = _patch_mod_entries->length(); - char* class_module_name = NULL; - ResourceMark rm; - const char *pkg_name = package_from_name(file_name); - // Using the jimage to obtain the class' module name. - // The ModuleEntryTable cannot be used at this point during dump time - // because the module system hasn't been initialized yet. - if (pkg_name != NULL) { - JImageFile *jimage = _jrt_entry->jimage(); - class_module_name = (char*)(*JImagePackageToModule)(jimage, pkg_name); - } - - if (class_module_name == NULL) { - return false; - } - - // Loop through all the patch module entries looking for module - for (int i = 0; i < num_of_entries; i++) { - ModuleClassPathList* module_cpl = _patch_mod_entries->at(i); - Symbol* module_cpl_name = module_cpl->module_name(); - - if (strcmp(module_cpl_name->as_C_string(), class_module_name) == 0) { - // Class' module has been located, attempt to locate - // the class from the module's ClassPathEntry list. - ClassPathEntry* e = module_cpl->module_first_entry(); - while (e != NULL) { - if (e->is_jar_file()) { - if (e->stream_exists(file_name)) { - return true; - } else { - e = e->next(); - } - } - } - } - } - - return false; -} -#endif // INCLUDE_CDS - instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) { assert(name != NULL, "invariant"); assert(THREAD->is_Java_thread(), "must be a JavaThread"); @@ -1494,8 +1425,6 @@ // If DumpSharedSpaces is true boot loader visibility boundaries are set to: // - [jimage] + [_first_append_entry to _last_append_entry] (all path entries). - // If a class is found in the --patch-module entries, the class will not be included in the - // CDS archive. Also, CDS is not supported if exploded module builds are used. // // If search_append_only is true, boot loader visibility boundaries are // set to be _first_append_entry to the end. This includes: @@ -1519,15 +1448,13 @@ // Note: The --patch-module entries are never searched if the boot loader's // visibility boundary is limited to only searching the append entries. if (_patch_mod_entries != NULL && !search_append_only) { + // At CDS dump time, the --patch-module entries are ignored. That means a + // class is still loaded from the runtime image even if it might + // appear in the _patch_mod_entries. The runtime shared class visibility + // check will determine if a shared class is visible based on the runtime + // environemnt, including the runtime --patch-module setting. if (!DumpSharedSpaces) { stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL); - } else { -#if INCLUDE_CDS - if (is_in_patch_module(file_name)) { - tty->print_cr("Preload Warning: Skip archiving class %s found in --patch-module entry", class_name); - return NULL; - } -#endif } } @@ -1679,57 +1606,8 @@ } #if INCLUDE_CDS -// Capture all the --patch-module entries specified during CDS dump time. -// It also captures the non-existing path(s) and the required file(s) during inspecting -// the entries. -void ClassLoader::setup_patch_mod_path() { - assert(DumpSharedSpaces, "only used with -Xshare:dump"); - ResourceMark rm; - GrowableArray* patch_mod_args = Arguments::get_patch_mod_prefix(); - if (patch_mod_args != NULL) { - int num_of_entries = patch_mod_args->length(); - for (int i = 0; i < num_of_entries; i++) { - const char* module_name = (patch_mod_args->at(i))->module_name(); - const char* module_path = (patch_mod_args->at(i))->path_string(); - int path_len = (int)strlen(module_path); - int name_len = (int)strlen(module_name); - int buf_len = name_len + path_len + 2; // add 2 for the '=' and NULL terminator - int end = 0; - char* buf = NEW_C_HEAP_ARRAY(char, buf_len, mtInternal); - // Iterate over the module's class path entries - for (int start = 0; start < path_len; start = end) { - while (module_path[end] && module_path[end] != os::path_separator()[0]) { - end++; - } - strncpy(buf, &module_path[start], end - start); - buf[end - start] = '\0'; - struct stat st; - if (os::stat(buf, &st) != 0) { - // File not found - _shared_paths_misc_info->add_nonexist_path(buf); - } else { - if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file - vm_exit_during_initialization( - "--patch-module requires a regular file during dumping", buf); - } else { - _shared_paths_misc_info->add_required_file(buf); - } - } - while (module_path[end] == os::path_separator()[0]) { - end++; - } - }; - jio_snprintf(buf, buf_len, "%s=%s", module_name, module_path); - _shared_paths_misc_info->add_patch_mod_classpath((const char*)buf); - _num_patch_mod_prefixes++; - FREE_C_HEAP_ARRAY(char, buf); - } - } -} - void ClassLoader::initialize_shared_path() { if (DumpSharedSpaces) { - setup_patch_mod_path(); ClassLoaderExt::setup_search_paths(); _shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check() } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/classfile/classLoader.hpp --- a/hotspot/src/share/vm/classfile/classLoader.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/classfile/classLoader.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -69,7 +69,6 @@ // Attempt to locate file_name through this class path entry. // Returns a class file parsing stream if successfull. virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0; - virtual bool stream_exists(const char* name) = 0; // Debugging NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;) }; @@ -84,7 +83,6 @@ JImageFile* jimage() const { return NULL; } ClassPathDirEntry(const char* dir); ClassFileStream* open_stream(const char* name, TRAPS); - bool stream_exists(const char* name) { return false; } // Debugging NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);) }; @@ -128,7 +126,6 @@ ClassFileStream* open_stream(const char* name, TRAPS); void contents_do(void f(const char* name, void* context), void* context); bool is_multiple_versioned(TRAPS) NOT_CDS_RETURN_(false); - bool stream_exists(const char* name); // Debugging NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);) }; @@ -148,7 +145,6 @@ ClassPathImageEntry(JImageFile* jimage, const char* name); ~ClassPathImageEntry(); ClassFileStream* open_stream(const char* name, TRAPS); - bool stream_exists(const char* name) { return false; } // Debugging NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);) @@ -259,7 +255,6 @@ // Info used by CDS CDS_ONLY(static SharedPathsMiscInfo * _shared_paths_misc_info;) - CDS_ONLY(static int _num_patch_mod_prefixes;) // Initialization: // - setup the boot loader's system class path @@ -434,9 +429,6 @@ static void initialize_module_loader_map(JImageFile* jimage); static s2 classloader_type(Symbol* class_name, ClassPathEntry* e, int classpath_index, TRAPS); - static bool is_in_patch_module(const char* const file_name); - static void setup_patch_mod_path(); // Only when -Xshare:dump - static int num_patch_mod_prefixes() { return _num_patch_mod_prefixes; } #endif static void trace_class_path(const char* msg, const char* name = NULL); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/classfile/moduleEntry.cpp --- a/hotspot/src/share/vm/classfile/moduleEntry.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/classfile/moduleEntry.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -108,6 +108,18 @@ } MutexLocker m1(Module_lock); + // This is a guard against possible race between agent threads that redefine + // or retransform classes in this module. Only one of them is adding the + // default read edges to the unnamed modules of the boot and app class loaders + // with an upcall to jdk.internal.module.Modules.transformedByAgent. + // At the same time, another thread can instrument the module classes by + // injecting dependencies that require the default read edges for resolution. + if (this->has_default_read_edges() && !m->is_named()) { + ClassLoaderData* cld = m->loader_data(); + if (cld->is_the_null_class_loader_data() || cld->is_system_class_loader_data()) { + return true; // default read edge + } + } if (!has_reads()) { return false; } else { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp --- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -86,9 +86,6 @@ case REQUIRED: out->print("Expecting that file %s must exist and is not altered", path); break; - case PATCH_MOD: - out->print("Expecting --patch-module=%s", path); - break; default: ShouldNotReachHere(); } @@ -167,26 +164,6 @@ } } break; - case PATCH_MOD: - { - GrowableArray* patch_mod_args = Arguments::get_patch_mod_prefix(); - if (patch_mod_args != NULL) { - int num_of_entries = patch_mod_args->length(); - for (int i = 0; i < num_of_entries; i++) { - const char* module_name = (patch_mod_args->at(i))->module_name(); - const char* path_string = (patch_mod_args->at(i))->path_string(); - size_t n = strlen(module_name); - // path contains the module name, followed by '=', and one or more entries. - // E.g.: "java.base=foo" or "java.naming=dir1:dir2:dir3" - if ((strncmp(module_name, path, n) != 0) || - (path[n] != '=') || - (strcmp(path + n + 1, path_string) != 0)) { - return fail("--patch-module mismatch, path not found in run time: ", path); - } - } - } - } - break; default: return fail("Corrupted archive file header"); } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp --- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -104,28 +104,10 @@ add_path(path, NON_EXIST); } - // The path must exist and have required size and modification time - void add_required_file(const char* path) { - add_path(path, REQUIRED); - - struct stat st; - if (os::stat(path, &st) != 0) { - assert(0, "sanity"); -#if INCLUDE_CDS - ClassLoader::exit_with_path_failure("failed to os::stat(%s)", path); // should not happen -#endif - } - write_time(st.st_mtime); - write_long(st.st_size); - } - // The path must exist, and must contain exactly files/dirs void add_boot_classpath(const char* path) { add_path(path, BOOT); } - void add_patch_mod_classpath(const char* path) { - add_path(path, PATCH_MOD); - } int write_jint(jint num) { write(&num, sizeof(num)); return 0; @@ -147,8 +129,7 @@ enum { BOOT = 1, NON_EXIST = 2, - REQUIRED = 3, - PATCH_MOD = 4 + REQUIRED = 3 }; virtual const char* type_name(int type) { @@ -156,7 +137,6 @@ case BOOT: return "BOOT"; case NON_EXIST: return "NON_EXIST"; case REQUIRED: return "REQUIRED"; - case PATCH_MOD: return "PATCH_MOD"; default: ShouldNotReachHere(); return "?"; } } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/classfile/systemDictionary.cpp --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1231,6 +1231,8 @@ bool SystemDictionary::is_shared_class_visible(Symbol* class_name, instanceKlassHandle ik, Handle class_loader, TRAPS) { + assert(!ModuleEntryTable::javabase_moduleEntry()->is_patched(), + "Cannot use sharing if java.base is patched"); ResourceMark rm; int path_index = ik->shared_classpath_index(); SharedClassPathEntry* ent = @@ -1258,6 +1260,12 @@ } } + // If the archived class is from a module that has been patched at runtime, + // the class cannot be loaded from the archive. + if (mod_entry != NULL && mod_entry->is_patched()) { + return false; + } + if (class_loader.is_null()) { assert(ent != NULL, "Shared class for NULL classloader must have valid SharedClassPathEntry"); // The NULL classloader can load archived class originated from the diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/interpreter/abstractInterpreter.hpp --- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -299,10 +299,6 @@ } static void initialize_method_handle_entries(); - - // PPC-only: Support abs and sqrt like in compiler. - // For others we can use a normal (native) entry. - static bool math_entry_available(MethodKind kind); }; //------------------------------------------------------------------------------------------------------------------------ diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp --- a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -57,6 +57,8 @@ method_entry(java_lang_math_log10 ); method_entry(java_lang_math_pow ); method_entry(java_lang_math_exp ); + method_entry(java_lang_math_fmaD ); + method_entry(java_lang_math_fmaF ); method_entry(java_lang_ref_reference_get); AbstractInterpreter::initialize_method_handle_entries(); @@ -95,7 +97,9 @@ case Interpreter::java_lang_math_log10 : // fall thru case Interpreter::java_lang_math_sqrt : // fall thru case Interpreter::java_lang_math_pow : // fall thru - case Interpreter::java_lang_math_exp : entry_point = generate_math_entry(kind); break; + case Interpreter::java_lang_math_exp : // fall thru + case Interpreter::java_lang_math_fmaD : // fall thru + case Interpreter::java_lang_math_fmaF : entry_point = generate_math_entry(kind); break; case Interpreter::java_lang_ref_reference_get : entry_point = generate_Reference_get_entry(); break; default: diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/interpreter/rewriter.cpp --- a/hotspot/src/share/vm/interpreter/rewriter.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/interpreter/rewriter.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -426,15 +426,16 @@ Symbol* field_sig = cp->signature_ref_at(bc_index); fieldDescriptor fd; - klass->find_field(field_name, field_sig, &fd); - if (fd.access_flags().is_final()) { - if (fd.access_flags().is_static()) { - if (!method->is_static_initializer()) { - fd.set_has_initialized_final_update(true); - } - } else { - if (!method->is_object_initializer()) { - fd.set_has_initialized_final_update(true); + if (klass->find_field(field_name, field_sig, &fd) != NULL) { + if (fd.access_flags().is_final()) { + if (fd.access_flags().is_static()) { + if (!method->is_static_initializer()) { + fd.set_has_initialized_final_update(true); + } + } else { + if (!method->is_object_initializer()) { + fd.set_has_initialized_final_update(true); + } } } } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp --- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -967,7 +967,7 @@ return objects; } -void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS) { +void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, bool return_oop, TRAPS) { Handle position = DebugInfo::bytecodePosition(debug_info); if (position.is_null()) { // Stubs do not record scope info, just oop maps @@ -980,10 +980,10 @@ } else { objectMapping = NULL; } - record_scope(pc_offset, position, scope_mode, objectMapping, CHECK); + record_scope(pc_offset, position, scope_mode, objectMapping, return_oop, CHECK); } -void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray* objects, TRAPS) { +void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray* objects, bool return_oop, TRAPS) { Handle frame; if (scope_mode == CodeInstaller::FullFrame) { if (!position->is_a(BytecodeFrame::klass())) { @@ -993,7 +993,7 @@ } Handle caller_frame = BytecodePosition::caller(position); if (caller_frame.not_null()) { - record_scope(pc_offset, caller_frame, scope_mode, objects, CHECK); + record_scope(pc_offset, caller_frame, scope_mode, objects, return_oop, CHECK); } Handle hotspot_method = BytecodePosition::method(position); @@ -1083,7 +1083,7 @@ throw_exception = BytecodeFrame::rethrowException(frame) == JNI_TRUE; } - _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, false, + _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, return_oop, locals_token, expressions_token, monitors_token); } @@ -1139,7 +1139,10 @@ if (debug_info.not_null()) { OopMap *map = create_oop_map(debug_info, CHECK); _debug_recorder->add_safepoint(next_pc_offset, map); - record_scope(next_pc_offset, debug_info, CodeInstaller::FullFrame, CHECK); + + bool return_oop = hotspot_method.not_null() && getMethodFromHotSpotMethod(hotspot_method())->is_returning_oop(); + + record_scope(next_pc_offset, debug_info, CodeInstaller::FullFrame, return_oop, CHECK); } if (foreign_call.not_null()) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp --- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -254,8 +254,11 @@ FullFrame }; - void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS); - void record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray* objects, TRAPS); + void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, bool return_oop, TRAPS); + void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS) { + record_scope(pc_offset, debug_info, scope_mode, false /* return_oop */, THREAD); + } + void record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray* objects, bool return_oop, TRAPS); void record_object_value(ObjectValue* sv, Handle value, GrowableArray* objects, TRAPS); GrowableArray* record_virtual_objects(Handle debug_info, TRAPS); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/logging/logFileStreamOutput.cpp --- a/hotspot/src/share/vm/logging/logFileStreamOutput.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/logging/logFileStreamOutput.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -29,11 +29,17 @@ #include "memory/allocation.inline.hpp" static bool initialized; -static char stdoutmem[sizeof(LogStdoutOutput)]; -static char stderrmem[sizeof(LogStderrOutput)]; +static union { + char stdoutmem[sizeof(LogStdoutOutput)]; + jlong dummy; +} aligned_stdoutmem; +static union { + char stderrmem[sizeof(LogStderrOutput)]; + jlong dummy; +} aligned_stderrmem; -LogStdoutOutput &StdoutLog = reinterpret_cast(stdoutmem); -LogStderrOutput &StderrLog = reinterpret_cast(stderrmem); +LogStdoutOutput &StdoutLog = reinterpret_cast(aligned_stdoutmem.stdoutmem); +LogStderrOutput &StderrLog = reinterpret_cast(aligned_stderrmem.stderrmem); LogFileStreamInitializer::LogFileStreamInitializer() { if (!initialized) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/memory/filemap.cpp --- a/hotspot/src/share/vm/memory/filemap.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/memory/filemap.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -179,7 +179,6 @@ _classpath_entry_table_size = mapinfo->_classpath_entry_table_size; _classpath_entry_table = mapinfo->_classpath_entry_table; _classpath_entry_size = mapinfo->_classpath_entry_size; - _num_patch_mod_prefixes = ClassLoader::num_patch_mod_prefixes(); // The following fields are for sanity checks for whether this archive // will function correctly with this JVM and the bootclasspath it's @@ -948,23 +947,6 @@ return false; } - // Check if there is a mismatch in --patch-module entry counts between dump time and run time. - // More checks will be performed on individual --patch-module entry in the - // SharedPathsMiscInfo::check() function. - GrowableArray* patch_mod_args = Arguments::get_patch_mod_prefix(); - if (patch_mod_args != NULL) { - if (_num_patch_mod_prefixes == 0) { - FileMapInfo::fail_stop("--patch-module found in run time but none was specified in dump time"); - } - if (patch_mod_args->length() != _num_patch_mod_prefixes) { - FileMapInfo::fail_stop("mismatched --patch-module entry counts between dump time and run time"); - } - } else { - if (_num_patch_mod_prefixes > 0) { - FileMapInfo::fail_stop("--patch-module specified in dump time but none was specified in run time"); - } - } - return true; } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/memory/filemap.hpp --- a/hotspot/src/share/vm/memory/filemap.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/memory/filemap.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -155,7 +155,6 @@ // loading failures during runtime. int _classpath_entry_table_size; size_t _classpath_entry_size; - int _num_patch_mod_prefixes; // number of --patch-module entries SharedClassPathEntry* _classpath_entry_table; char* region_addr(int idx); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/opto/runtime.cpp --- a/hotspot/src/share/vm/opto/runtime.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/opto/runtime.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -59,7 +59,6 @@ #include "opto/mulnode.hpp" #include "opto/runtime.hpp" #include "opto/subnode.hpp" -#include "prims/jvmtiThreadState.hpp" #include "runtime/atomic.hpp" #include "runtime/fprofiler.hpp" #include "runtime/handles.inline.hpp" @@ -1458,11 +1457,6 @@ } #endif - JvmtiThreadState *state = thread->jvmti_thread_state(); - if (state != NULL) { - state->set_exception_detected(); - } - thread->set_vm_result(exception); // Frame not compiled (handles deoptimization blob) return SharedRuntime::raw_exception_handler_for_return_address(thread, ret_pc); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/prims/jvmtiExport.cpp --- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -130,15 +130,15 @@ private: JavaThread *_thread; JNIEnv* _jni_env; - bool _exception_detected; - bool _exception_caught; + JvmtiThreadState::ExceptionState _saved_exception_state; #if 0 JNIHandleBlock* _hblock; #endif public: JvmtiEventMark(JavaThread *thread) : _thread(thread), - _jni_env(thread->jni_environment()) { + _jni_env(thread->jni_environment()), + _saved_exception_state(JvmtiThreadState::ES_CLEARED) { #if 0 _hblock = thread->active_handles(); _hblock->clear_thoroughly(); // so we can be safe @@ -149,11 +149,7 @@ // we are before an event. // Save current jvmti thread exception state. if (state != NULL) { - _exception_detected = state->is_exception_detected(); - _exception_caught = state->is_exception_caught(); - } else { - _exception_detected = false; - _exception_caught = false; + _saved_exception_state = state->get_exception_state(); } JNIHandleBlock* old_handles = thread->active_handles(); @@ -186,12 +182,7 @@ // we are continuing after an event. if (state != NULL) { // Restore the jvmti thread exception state. - if (_exception_detected) { - state->set_exception_detected(); - } - if (_exception_caught) { - state->set_exception_caught(); - } + state->restore_exception_state(_saved_exception_state); } } @@ -1552,7 +1543,6 @@ } } - void JvmtiExport::post_exception_throw(JavaThread *thread, Method* method, address location, oop exception) { HandleMark hm(thread); methodHandle mh(thread, method); @@ -2454,7 +2444,7 @@ JvmtiThreadState* state = thread->jvmti_thread_state(); if (state != NULL) { - state->clear_exception_detected(); + state->clear_exception_state(); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/prims/jvmtiThreadState.cpp --- a/hotspot/src/share/vm/prims/jvmtiThreadState.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -50,8 +50,7 @@ : _thread_event_enable() { assert(JvmtiThreadState_lock->is_locked(), "sanity check"); _thread = thread; - _exception_detected = false; - _exception_caught = false; + _exception_state = ES_CLEARED; _debuggable = true; _hide_single_stepping = false; _hide_level = 0; @@ -310,7 +309,7 @@ // an exception. // if (is_exception_detected()) { - clear_exception_detected(); + clear_exception_state(); } // If step is pending for popframe then it may not be // a repeat step. The new_bci and method_id is same as current_bci @@ -385,7 +384,7 @@ // an exception. // if (is_exception_detected()) { - clear_exception_detected(); + clear_exception_state(); } // If step is pending for earlyret then it may not be a repeat step. // The new_bci and method_id is same as current_bci and current diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/prims/jvmtiThreadState.hpp --- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -76,13 +76,21 @@ private: friend class JvmtiEnv; JavaThread *_thread; - bool _exception_detected; - bool _exception_caught; bool _hide_single_stepping; bool _pending_step_for_popframe; bool _pending_step_for_earlyret; int _hide_level; + public: + enum ExceptionState { + ES_CLEARED, + ES_DETECTED, + ES_CAUGHT + }; + + private: + ExceptionState _exception_state; + // Used to send class being redefined/retransformed and kind of transform // info to the class file load hook event handler. KlassHandle *_class_being_redefined; @@ -161,16 +169,18 @@ int count_frames(); inline JavaThread *get_thread() { return _thread; } - inline bool is_exception_detected() { return _exception_detected; } - inline bool is_exception_caught() { return _exception_caught; } - inline void set_exception_detected() { _exception_detected = true; - _exception_caught = false; } - inline void clear_exception_detected() { - _exception_detected = false; - assert(_exception_caught == false, "_exception_caught is out of phase"); - } - inline void set_exception_caught() { _exception_caught = true; - _exception_detected = false; } + + inline bool is_exception_detected() { return _exception_state == ES_DETECTED; } + inline bool is_exception_caught() { return _exception_state == ES_CAUGHT; } + + inline void set_exception_detected() { _exception_state = ES_DETECTED; } + inline void set_exception_caught() { _exception_state = ES_CAUGHT; } + + inline void clear_exception_state() { _exception_state = ES_CLEARED; } + + // We need to save and restore exception state inside JvmtiEventMark + inline ExceptionState get_exception_state() { return _exception_state; } + inline void restore_exception_state(ExceptionState state) { _exception_state = state; } inline void clear_hide_single_stepping() { if (_hide_level > 0) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/runtime/arguments.cpp --- a/hotspot/src/share/vm/runtime/arguments.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -1323,26 +1323,32 @@ "jdk.module.limitmods", "jdk.module.path", "jdk.module.upgrade.path", - "jdk.module.addmods.0" }; - const char* unsupported_options[] = { "-m", - "--limit-modules", - "--module-path", - "--upgrade-module-path", - "--add-modules" }; + "jdk.module.addmods.0", + "jdk.module.patch.0" }; + const char* unsupported_options[] = { "-m", // cannot use at dump time + "--limit-modules", // ignored at dump time + "--module-path", // ignored at dump time + "--upgrade-module-path", // ignored at dump time + "--add-modules", // ignored at dump time + "--patch-module" // ignored at dump time + }; assert(ARRAY_SIZE(unsupported_properties) == ARRAY_SIZE(unsupported_options), "must be"); - // If a vm option is found in the unsupported_options array with index less than the warning_idx, - // vm will exit with an error message. Otherwise, it will result in a warning message. - uint warning_idx = 2; + // If a vm option is found in the unsupported_options array with index less than the info_idx, + // vm will exit with an error message. Otherwise, it will print an informational message if + // PrintSharedSpaces is enabled. + uint info_idx = 1; SystemProperty* sp = system_properties(); while (sp != NULL) { for (uint i = 0; i < ARRAY_SIZE(unsupported_properties); i++) { if (strcmp(sp->key(), unsupported_properties[i]) == 0) { - if (i < warning_idx) { + if (i < info_idx) { vm_exit_during_initialization( "Cannot use the following option when dumping the shared archive", unsupported_options[i]); } else { - warning( - "the %s option is ignored when dumping the shared archive", unsupported_options[i]); + if (PrintSharedSpaces) { + tty->print_cr( + "Info: the %s option is ignored when dumping the shared archive", unsupported_options[i]); + } } } } @@ -1419,10 +1425,8 @@ } } -#if defined(COMPILER2) || INCLUDE_JVMCI || defined(_LP64) || !INCLUDE_CDS // Conflict: required to use shared spaces (-Xshare:on), but // incompatible command line options were chosen. - static void no_shared_spaces(const char* message) { if (RequireSharedSpaces) { jio_fprintf(defaultStream::error_stream(), @@ -1432,7 +1436,6 @@ FLAG_SET_DEFAULT(UseSharedSpaces, false); } } -#endif // Returns threshold scaled with the value of scale. // If scale < 0.0, threshold is returned without scaling. @@ -2680,6 +2683,12 @@ return result; } +#if INCLUDE_CDS + if (UseSharedSpaces && patch_mod_javabase) { + no_shared_spaces("CDS is disabled when " JAVA_BASE_NAME " module is patched."); + } +#endif + return JNI_OK; } @@ -4408,7 +4417,6 @@ } jint Arguments::apply_ergo() { - // Set flags based on ergonomics. set_ergonomics_flags(); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/runtime/os.hpp --- a/hotspot/src/share/vm/runtime/os.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/runtime/os.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -436,7 +436,7 @@ vm_thread, cgc_thread, // Concurrent GC thread pgc_thread, // Parallel GC thread - java_thread, + java_thread, // Java, CodeCacheSweeper, JVMTIAgent and Service threads. compiler_thread, watcher_thread, os_thread diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/src/share/vm/runtime/vmStructs.cpp --- a/hotspot/src/share/vm/runtime/vmStructs.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -288,7 +288,8 @@ nonstatic_field(Klass, _access_flags, AccessFlags) \ nonstatic_field(Klass, _prototype_header, markOop) \ nonstatic_field(Klass, _next_sibling, Klass*) \ - nonstatic_field(Klass, _vtable_len, int) \ + nonstatic_field(Klass, _next_link, Klass*) \ + nonstatic_field(Klass, _vtable_len, int) \ nonstatic_field(vtableEntry, _method, Method*) \ nonstatic_field(MethodData, _size, int) \ nonstatic_field(MethodData, _method, Method*) \ @@ -712,6 +713,8 @@ \ nonstatic_field(ClassLoaderData, _class_loader, oop) \ nonstatic_field(ClassLoaderData, _next, ClassLoaderData*) \ + volatile_nonstatic_field(ClassLoaderData, _klasses, Klass*) \ + nonstatic_field(ClassLoaderData, _is_anonymous, bool) \ \ static_field(ClassLoaderDataGraph, _head, ClassLoaderData*) \ \ diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/ProblemList.txt --- a/hotspot/test/ProblemList.txt Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/ProblemList.txt Mon Jan 09 11:57:06 2017 -0800 @@ -71,7 +71,6 @@ # :hotspot_serviceability -serviceability/dcmd/jvmti/LoadAgentDcmdTest.java 8150318 generic-all serviceability/jdwp/AllModulesCommandTest.java 8168478 generic-all serviceability/sa/sadebugd/SADebugDTest.java 8163805 generic-all diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/compiler/c2/Test7005594.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/c2/Test7005594.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 7005594 + * @summary Array overflow not handled correctly with loop optimzations + * + * @run main/othervm -Xcomp + -XX:CompileOnly=compiler.c2.Test7005594::test + compiler.c2.Test7005594 + */ + +package compiler.c2; + +public class Test7005594 { + static int test(byte a[]){ + int result = 0; + for (int i = 1; i < a.length; i += Integer.MAX_VALUE) { + result += a[i]; + } + return result; + } + + public static void main(String [] args){ + try { + int result = test(new byte[2]); + throw new AssertionError("Expected ArrayIndexOutOfBoundsException was not thrown"); + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println("Expected " + e + " was thrown"); + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/compiler/c2/cr7005594/Test7005594.java --- a/hotspot/test/compiler/c2/cr7005594/Test7005594.java Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 7005594 - * @summary Array overflow not handled correctly with loop optimzations - * - * @run shell Test7005594.sh - */ - -package compiler.c2.cr7005594; - -public class Test7005594 { - - static int test(byte a[]){ - int result=0; - for( int i=0; i>1)+1) ){ - result += a[i]; - } - return result; - } - - public static void main(String [] args){ - byte a[]=new byte[(0x7fffffff>>1)+2]; - int result = 0; - try { - result = test(a); - } catch (ArrayIndexOutOfBoundsException e) { - e.printStackTrace(System.out); - System.out.println("Passed"); - System.exit(95); - } - System.out.println(result); - System.out.println("FAILED"); - System.exit(97); - } - -} - diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/compiler/c2/cr7005594/Test7005594.sh --- a/hotspot/test/compiler/c2/cr7005594/Test7005594.sh Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# -## some tests require path to find test source dir -if [ "${TESTSRC}" = "" ] -then - TESTSRC=${PWD} - echo "TESTSRC not set. Using "${TESTSRC}" as default" -fi -echo "TESTSRC=${TESTSRC}" -## Adding common setup Variables for running shell tests. -. ${TESTSRC}/../../../test_env.sh - -# Amount of physical memory in megabytes -MEM=0 -if [ -f "/proc/meminfo" ]; then - # Linux, Windows/Cygwin - MEM=`cat /proc/meminfo |grep ^MemTotal: | awk '{print $2}'` - MEM="$(($MEM / 1024))" -elif [ -x "/usr/sbin/prtconf" ]; then - # Solaris - MEM=`/usr/sbin/prtconf | grep "^Memory size" | awk '{print $3}'` -elif [ -x "/usr/sbin/system_profiler" ]; then - # MacOS - MEMo=`/usr/sbin/system_profiler SPHardwareDataType | grep Memory:` - MEM=`echo "$MEMo" | awk '{print $2}'` - MEMu=`echo "$MEMo" | awk '{print $3}'` - case $MEMu in - GB) - MEM="$(($MEM * 1024))" - ;; - MB) - ;; - *) - echo "Unknown memory unit in system_profile output: $MEMu" - ;; - esac -elif [ -n "$ROOTDIR" -a -x "$ROOTDIR/mksnt/sysinf" ]; then - # Windows/MKS - MEM=`"$ROOTDIR/mksnt/sysinf" memory -v | grep "Total Physical Memory: " | sed 's/Total Physical Memory: *//g'` - MEM="$(($machine_memory / 1024))" -else - echo "Unable to determine amount of physical memory on the machine" -fi - -if [ $MEM -lt 2000 ]; then - echo "Test skipped due to low (or unknown) memory on the system: $MEM Mb" - exit 0 -fi - -echo "MEMORY=$MEM Mb" - -set -x - -cp ${TESTSRC}/Test7005594.java . -cp ${TESTSRC}/Test7005594.sh . - -${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} -d . Test7005594.java - -${TESTJAVA}/bin/java ${TESTOPTS} -Xmx1600m -Xms1600m -XX:+IgnoreUnrecognizedVMOptions \ - -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileCommand=quiet \ - -XX:CompileOnly=compiler.c2.cr7005594.Test7005594::test \ - compiler.c2.cr7005594.Test7005594 > test.out 2>&1 - -result=$? - -cat test.out - -if [ $result -eq 95 ] -then - echo "Passed" - exit 0 -fi - -if [ $result -eq 97 ] -then - echo "Failed" - exit 1 -fi - -# The test should pass when no enough space for object heap -grep "Could not reserve enough space for .*object heap" test.out -if [ $? = 0 ] -then - echo "Passed" - exit 0 -else - echo "Failed" - exit 1 -fi diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/compiler/ciReplay/CiReplayBase.java --- a/hotspot/test/compiler/ciReplay/CiReplayBase.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/compiler/ciReplay/CiReplayBase.java Mon Jan 09 11:57:06 2017 -0800 @@ -215,7 +215,7 @@ try(BufferedReader br = new BufferedReader(new FileReader(REPLAY_FILE_NAME))) { return br.lines() .filter(s -> s.startsWith("compile ")) - .map(s -> s.substring(s.lastIndexOf(' ') + 1)) + .map(s -> s.split("\\s+")[5]) .map(Integer::parseInt) .findAny() .get(); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2016, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8171092 + * @summary C1's Math.fma() intrinsic doesn't correctly marks its inputs + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestFMABrokenC1RegAlloc + * + */ + +public class TestFMABrokenC1RegAlloc { + + double dummy0; + double dummy1; + double dummy2; + double dummy3; + double dummy4; + double dummy5; + double dummy6; + double dummy7; + double dummy8; + double dummy9; + double dummy10; + double dummy11; + double dummy12; + double dummy13; + double dummy14; + double dummy15; + double dummy16; + double dummy17; + double dummy18; + double dummy19; + double dummy20; + double dummy21; + double dummy22; + double dummy23; + double dummy24; + double dummy25; + double dummy26; + double dummy27; + double dummy28; + double dummy29; + double dummy30; + double dummy31; + double dummy32; + double dummy33; + double dummy34; + double dummy35; + double dummy36; + double dummy37; + double dummy38; + double dummy39; + + double test(double a, double b, double c) { + double dummy0 = this.dummy0; + double dummy1 = this.dummy1; + double dummy2 = this.dummy2; + double dummy3 = this.dummy3; + double dummy4 = this.dummy4; + double dummy5 = this.dummy5; + double dummy6 = this.dummy6; + double dummy7 = this.dummy7; + double dummy8 = this.dummy8; + double dummy9 = this.dummy9; + double dummy10 = this.dummy10; + double dummy11 = this.dummy11; + double dummy12 = this.dummy12; + double dummy13 = this.dummy13; + double dummy14 = this.dummy14; + double dummy15 = this.dummy15; + double dummy16 = this.dummy16; + double dummy17 = this.dummy17; + double dummy18 = this.dummy18; + double dummy19 = this.dummy19; + double dummy20 = this.dummy20; + double dummy21 = this.dummy21; + double dummy22 = this.dummy22; + double dummy23 = this.dummy23; + double dummy24 = this.dummy24; + double dummy25 = this.dummy25; + double dummy26 = this.dummy26; + double dummy27 = this.dummy27; + double dummy28 = this.dummy28; + double dummy29 = this.dummy29; + double dummy30 = this.dummy30; + double dummy31 = this.dummy31; + double dummy32 = this.dummy32; + double dummy33 = this.dummy33; + double dummy34 = this.dummy34; + double dummy35 = this.dummy35; + double dummy36 = this.dummy36; + double dummy37 = this.dummy37; + double dummy38 = this.dummy38; + double dummy39 = this.dummy39; + return Math.fma(a, b, c) + + dummy0 + + dummy1 + + dummy2 + + dummy3 + + dummy4 + + dummy5 + + dummy6 + + dummy7 + + dummy8 + + dummy9 + + dummy10 + + dummy11 + + dummy12 + + dummy13 + + dummy14 + + dummy15 + + dummy16 + + dummy17 + + dummy18 + + dummy19 + + dummy20 + + dummy21 + + dummy22 + + dummy23 + + dummy24 + + dummy25 + + dummy26 + + dummy27 + + dummy28 + + dummy29 + + dummy30 + + dummy31 + + dummy32 + + dummy33 + + dummy34 + + dummy35 + + dummy36 + + dummy37 + + dummy38 + + dummy39; + } + + static public void main(String[] args) { + TestFMABrokenC1RegAlloc t = new TestFMABrokenC1RegAlloc(); + for (int i = 0; i < 5000; i++) { + if (t.test(5.0, 10.0, 7.0) != 57.0) { + throw new RuntimeException("Failed"); + } + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java --- a/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java Mon Jan 09 11:57:06 2017 -0800 @@ -241,7 +241,7 @@ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, "-Xbootclasspath/a:.", "-XX:+WhiteBoxAPI", - "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED"); + "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED"); if (test != null) { for (String method : test.getMethodsToCompileNames()) { diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/native/logging/logTestUtils.inline.hpp --- a/hotspot/test/native/logging/logTestUtils.inline.hpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/native/logging/logTestUtils.inline.hpp Mon Jan 09 11:57:06 2017 -0800 @@ -59,6 +59,20 @@ assert(!failed, "failed to create directory %s", name); } +static inline void delete_empty_directory(const char* name) { +#ifdef _WINDOWS + if (!file_exists(name)) { + return; + } + bool failed; + failed = !RemoveDirectory(name); + EXPECT_FALSE(failed) << "failed to remove directory '" << name + << "': LastError = " << GetLastError(); +#else + delete_file(name); +#endif +} + static inline void init_log_file(const char* filename, const char* options = "") { LogStreamHandle(Error, logging) stream; bool success = LogConfiguration::parse_log_arguments(filename, "logging=trace", "", options, &stream); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/native/logging/test_logFileOutput.cpp --- a/hotspot/test/native/logging/test_logFileOutput.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/native/logging/test_logFileOutput.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -103,7 +103,7 @@ EXPECT_FALSE(fo.initialize(buf, &ss)) << "Accepted filesize that overflows"; } -TEST(LogFileOutput, startup_rotation) { +TEST_VM(LogFileOutput, startup_rotation) { const size_t rotations = 5; const char* filename = "start-rotate-test"; char* rotated_file[rotations]; @@ -140,7 +140,7 @@ } } -TEST(LogFileOutput, startup_truncation) { +TEST_VM(LogFileOutput, startup_truncation) { const char* filename = "start-truncate-test"; const char* archived_filename = "start-truncate-test.0"; @@ -168,7 +168,7 @@ delete_file(archived_filename); } -TEST(LogFileOutput, invalid_file) { +TEST_VM(LogFileOutput, invalid_file) { ResourceMark rm; stringStream ss; @@ -179,5 +179,5 @@ << "file was initialized when there was an existing directory with the same name"; EXPECT_TRUE(string_contains_substring(ss.as_string(), "tmplogdir is not a regular file")) << "missing expected error message, received msg: %s" << ss.as_string(); - remove("tmplogdir"); + delete_empty_directory("tmplogdir"); } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/native/logging/test_logMessageTest.cpp --- a/hotspot/test/native/logging/test_logMessageTest.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/native/logging/test_logMessageTest.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -10,7 +10,7 @@ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that - * ac_heapanied this code). + * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, @@ -19,8 +19,8 @@ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. - * */ + #include "precompiled.hpp" #include "logTestFixture.hpp" #include "logTestUtils.inline.hpp" diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/native/logging/test_logStream.cpp --- a/hotspot/test/native/logging/test_logStream.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/native/logging/test_logStream.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -41,41 +41,41 @@ EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers\n")); } -TEST_F(LogStreamTest, from_log) { +TEST_VM_F(LogStreamTest, from_log) { Log(gc) log; LogStream stream(log.debug()); verify_stream(&stream); } -TEST_F(LogStreamTest, from_logtarget) { +TEST_VM_F(LogStreamTest, from_logtarget) { LogTarget(Debug, gc) log; LogStream stream(log); verify_stream(&stream); } -TEST_F(LogStreamTest, handle) { +TEST_VM_F(LogStreamTest, handle) { LogStreamHandle(Debug, gc) stream; verify_stream(&stream); } -TEST_F(LogStreamTest, no_rm) { +TEST_VM_F(LogStreamTest, no_rm) { ResourceMark rm; outputStream* stream = LogTarget(Debug, gc)::stream(); verify_stream(stream); } -TEST_F(LogStreamTest, c_heap_stream) { +TEST_VM_F(LogStreamTest, c_heap_stream) { Log(gc) log; LogStreamCHeap stream(log.debug()); verify_stream(&stream); } -TEST_F(LogStreamTest, c_heap_stream_target) { +TEST_VM_F(LogStreamTest, c_heap_stream_target) { LogTarget(Debug, gc) log; LogStreamCHeap stream(log); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/native/utilities/test_linkedlist.cpp --- a/hotspot/test/native/utilities/test_linkedlist.cpp Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/native/utilities/test_linkedlist.cpp Mon Jan 09 11:57:06 2017 -0800 @@ -74,7 +74,7 @@ ASSERT_EQ(six.value(), i->value()) << "Should be 6"; i = ll.find(three); - ASSERT_EQ(NULL, i) << "Not in the list"; + ASSERT_TRUE(i == NULL) << "Not in the list"; LinkedListNode* node = ll.find_node(six); ASSERT_TRUE(node != NULL) << "6 is in the list"; diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java --- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -72,6 +72,6 @@ testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "WARNING: Unknown module: xyzz"); testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0", "WARNING: package xyzz not in java.base"); - testOption("--patch-module", "=d", "jdk.module.patch.0", "Missing module name"); + testOption("--patch-module", "=d", "jdk.module.patch.0", "Unable to parse --patch-module"); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java --- a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Mon Jan 09 11:57:06 2017 -0800 @@ -52,7 +52,7 @@ new OutputAnalyzer(pb.start()) .shouldContain("ro space:"); // Make sure archive got created. - // Case 2: Test that only jar file in --patch-module is supported for CDS dumping + // Case 2: Test that directory in --patch-module is supported for CDS dumping // Create a class file in the module java.base. String source = "package javax.naming.spi; " + "public class NamingManager { " + @@ -73,7 +73,7 @@ "-Xlog:class+path=info", "-version"); new OutputAnalyzer(pb.start()) - .shouldContain("--patch-module requires a regular file during dumping"); + .shouldContain("ro space:"); // Make sure archive got created. // Case 3a: Test CDS dumping with jar file in --patch-module BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager"); diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java --- a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -136,11 +136,7 @@ if (Platform.isWindows()) { return "bin"; } - if (Platform.isOSX()) { - return "lib"; - } - - return "lib/" + Platform.getOsArch(); + return "lib"; } /** diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c --- a/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Mon Jan 09 11:57:06 2017 -0800 @@ -82,14 +82,18 @@ } static -jint throw_exc(JNIEnv *env, char *msg) { +void throw_exc(JNIEnv *env, char *msg) { jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + jint rt = JNI_OK; if (exc_class == NULL) { printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); - return -1; + return; } - return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + if (rt == JNI_ERR) { + printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg); + } } static diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c --- a/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Mon Jan 09 11:57:06 2017 -0800 @@ -81,14 +81,18 @@ } static -jint throw_exc(JNIEnv *env, char *msg) { +void throw_exc(JNIEnv *env, char *msg) { jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + jint rt = JNI_OK; if (exc_class == NULL) { printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); - return -1; + return; } - return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + if (rt == JNI_ERR) { + printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg); + } } static diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c --- a/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Fri Jan 06 16:50:50 2017 +0530 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Mon Jan 09 11:57:06 2017 -0800 @@ -82,14 +82,18 @@ } static -jint throw_exc(JNIEnv *env, char *msg) { +void throw_exc(JNIEnv *env, char *msg) { jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + jint rt = JNI_OK; if (exc_class == NULL) { printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); - return -1; + return; } - return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + if (rt == JNI_ERR) { + printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg); + } } static diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java --- a/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.security.AccessController; -import java.security.PrivilegedAction; - -/* - * @test - * @bug 8134434 - * @summary JVM_DoPrivileged() fires assert(_exception_caught == false) failed: _exception_caught is out of phase - * @run main/othervm -agentlib:jdwp=transport=dt_socket,address=9000,server=y,suspend=n -Xbatch ExceptionCaughtOutOfPhaseTest - */ - -public class ExceptionCaughtOutOfPhaseTest { - public static void main(String[] args) { - PrivilegedAction action = new HotThrowingAction(); - System.out.println("### Warm-up"); - for(int i=0; i<11000; i++) { - try { - action.run(); // call run() to get it compiled - } catch(Throwable t) { - // ignored - } - } - - System.out.println("### Warm-up done"); - System.out.println("### Executing privileged action"); - - try { - AccessController.doPrivileged(action); - } catch (Error e) { - // ignored - } - } - - public static class HotThrowingAction implements PrivilegedAction { - public Object run() { - throw new Error(); - } - } -} diff -r 05e2611ebff6 -r 65e2b10e8e80 hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.ArrayList; +import java.util.List; +import java.io.File; +import java.nio.file.Files; +import java.io.IOException; +import java.io.BufferedInputStream; +import java.util.stream.Collectors; +import java.io.FileInputStream; + +import sun.jvm.hotspot.HotSpotAgent; +import sun.jvm.hotspot.debugger.*; + +import jdk.test.lib.apps.LingeredApp; +import jdk.test.lib.JDKToolLauncher; +import jdk.test.lib.JDKToolFinder; +import jdk.test.lib.Platform; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.Utils; +import jdk.test.lib.Asserts; +import jdk.test.lib.hprof.HprofParser; +import jdk.test.lib.hprof.parser.HprofReader; +import jdk.test.lib.hprof.parser.PositionDataInputStream; +import jdk.test.lib.hprof.model.Snapshot; + +/* + * @test + * @library /test/lib + * @requires os.family != "mac" + * @modules java.base/jdk.internal.misc + * jdk.hotspot.agent/sun.jvm.hotspot + * jdk.hotspot.agent/sun.jvm.hotspot.utilities + * jdk.hotspot.agent/sun.jvm.hotspot.oops + * jdk.hotspot.agent/sun.jvm.hotspot.debugger + * @run main/othervm TestHeapDumpForInvokeDynamic + */ + +public class TestHeapDumpForInvokeDynamic { + + private static LingeredAppWithInvokeDynamic theApp = null; + + private static void verifyHeapDump(String heapFile) { + + File heapDumpFile = new File(heapFile); + Asserts.assertTrue(heapDumpFile.exists() && heapDumpFile.isFile(), + "Could not create dump file " + heapDumpFile.getAbsolutePath()); + try (PositionDataInputStream in = new PositionDataInputStream( + new BufferedInputStream(new FileInputStream(heapFile)))) { + int i = in.readInt(); + if (HprofReader.verifyMagicNumber(i)) { + Snapshot sshot; + HprofReader r = new HprofReader(heapFile, in, 0, + false, 0); + sshot = r.read(); + } else { + throw new IOException("Unrecognized magic number: " + i); + } + } catch (Exception e) { + e.printStackTrace(); + Asserts.fail("Could not read dump file " + heapFile); + } finally { + heapDumpFile.delete(); + } + } + + private static void attachDumpAndVerify(String heapDumpFileName, + long lingeredAppPid) throws Exception { + + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb"); + launcher.addToolArg("jmap"); + launcher.addToolArg("--binaryheap"); + launcher.addToolArg("--dumpfile"); + launcher.addToolArg(heapDumpFileName); + launcher.addToolArg("--pid"); + launcher.addToolArg(Long.toString(lingeredAppPid)); + + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.command(launcher.getCommand()); + System.out.println( + processBuilder.command().stream().collect(Collectors.joining(" "))); + + OutputAnalyzer SAOutput = ProcessTools.executeProcess(processBuilder); + SAOutput.shouldHaveExitValue(0); + SAOutput.shouldContain("heap written to"); + SAOutput.shouldContain(heapDumpFileName); + System.out.println(SAOutput.getOutput()); + + verifyHeapDump(heapDumpFileName); + } + + public static void main (String... args) throws Exception { + + String heapDumpFileName = "lambdaHeapDump.bin"; + + if (!Platform.shouldSAAttach()) { + System.out.println( + "SA attach not expected to work - test skipped."); + return; + } + + File heapDumpFile = new File(heapDumpFileName); + if (heapDumpFile.exists()) { + heapDumpFile.delete(); + } + + try { + List vmArgs = new ArrayList(); + vmArgs.add("-XX:+UsePerfData"); + vmArgs.addAll(Utils.getVmOptions()); + + theApp = new LingeredAppWithInvokeDynamic(); + LingeredApp.startApp(vmArgs, theApp); + attachDumpAndVerify(heapDumpFileName, theApp.getPid()); + } finally { + LingeredApp.stopApp(theApp); + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jaxp/.hgtags --- a/jaxp/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/jaxp/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -392,3 +392,5 @@ 149559dd882ddca2c78355641a46db9138b12763 jdk-9+147 c45db75bfe8bc20bb80b4a009ae3f69c9cd2d885 jdk-9+148 5978df8bfa3894f2b3d07b7256f25f78dffb1f9c jdk-9+149 +f85154af719f99a3b4d81b67a8b4c18a650d10f9 jdk-9+150 +13c6906bfc861d99dc35a19c80b7a99f0b0ac58d jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 jaxws/.hgtags --- a/jaxws/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/jaxws/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -395,3 +395,5 @@ be37411855de5b76035bef6f1b0d90d8607f2205 jdk-9+147 c8c9c334743caf8155c9809b6b4ac315d3a66476 jdk-9+148 72554d319b474b3636c7d02fe3c110254d111b1a jdk-9+149 +77e4e30d9d111272cd4a45a2203e8f570d40b12e jdk-9+150 +c48b4d4768b1c2b8fe5d1a844ca13732e5dfbe2a jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/.hgtags --- a/jdk/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -393,3 +393,4 @@ 9098b2b9d997d65af0026fc2f39cf75234e26bc5 jdk-9+148 5a846396a24c7aff01d6a8feaa7afc0a6369f04d jdk-9+149 71e198ef3839045e829a879af1d709be16ab0f88 jdk-9+150 +d27bab22ff62823902d93d1d35ca397cfd50d059 jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/make/lib/Awt2dLibraries.gmk --- a/jdk/make/lib/Awt2dLibraries.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/make/lib/Awt2dLibraries.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -364,7 +364,6 @@ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libawt_xawt/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN) \ - $(call SET_SHARED_LIBRARY_ORIGIN,/..) \ -L$(INSTALL_LIBRARIES_HERE), \ LIBS := $(X_LIBS) $(LIBAWT_XAWT_LIBS), \ VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \ @@ -566,8 +565,6 @@ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ - LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \ - LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \ REORDER := $(LIBAWT_HEADLESS_REORDER), \ LIBS_unix := -lawt -ljvm -ljava, \ LIBS_linux := $(LIBM) $(LIBDL), \ diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/io/FilePermission.java --- a/jdk/src/java.base/share/classes/java/io/FilePermission.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java Mon Jan 09 11:57:06 2017 -0800 @@ -532,11 +532,13 @@ * simple {@code npath} is inside a wildcard {@code npath} if and only if * {@code simple_npath.relativize(wildcard_npath)} is exactly "..", * a simple {@code npath} is recursively inside a wildcard {@code npath} - * if and only if {@code simple_npath.relativize(wildcard_npath)} - * is a series of one or more "..". An invalid {@code FilePermission} does - * not imply any object except for itself. An invalid {@code FilePermission} - * is not implied by any object except for itself or a {@code FilePermission} - * on {@literal "<>"} whose actions is a superset of this + * if and only if {@code simple_npath.relativize(wildcard_npath)} is a + * series of one or more "..". This means "/-" implies "/foo" but not "foo". + *

+ * An invalid {@code FilePermission} does not imply any object except for + * itself. An invalid {@code FilePermission} is not implied by any object + * except for itself or a {@code FilePermission} on + * {@literal "<>"} whose actions is a superset of this * invalid {@code FilePermission}. Even if two {@code FilePermission} * are created with the same invalid path, one does not imply the other. * diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/Class.java --- a/jdk/src/java.base/share/classes/java/lang/Class.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/Class.java Mon Jan 09 11:57:06 2017 -0800 @@ -26,8 +26,6 @@ package java.lang; import java.lang.annotation.Annotation; -import java.lang.module.ModuleDescriptor.Version; -import java.lang.module.ModuleFinder; import java.lang.module.ModuleReader; import java.lang.ref.SoftReference; import java.io.IOException; @@ -42,7 +40,6 @@ import java.lang.reflect.GenericArrayType; import java.lang.reflect.GenericDeclaration; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Layer; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -54,7 +51,6 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -62,19 +58,15 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.StringJoiner; -import java.util.stream.Collectors; import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.loader.BootLoader; import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.ResourceHelper; -import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; -import jdk.internal.module.ModuleHashes; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.ConstantPool; import jdk.internal.reflect.Reflection; @@ -532,7 +524,8 @@ } try { Class[] empty = {}; - final Constructor c = getConstructor0(empty, Member.DECLARED); + final Constructor c = getReflectionFactory().copyConstructor( + getConstructor0(empty, Member.DECLARED)); // Disable accessibility checks on the constructor // since we have to do the security check here anyway // (the stack depth is wrong for the Constructor's @@ -1024,6 +1017,11 @@ * @return an array of interfaces directly implemented by this class */ public Class[] getInterfaces() { + // defensively copy before handing over to user code + return getInterfaces(true); + } + + private Class[] getInterfaces(boolean cloneArray) { ReflectionData rd = reflectionData(); if (rd == null) { // no cloning required @@ -1034,8 +1032,8 @@ interfaces = getInterfaces0(); rd.interfaces = interfaces; } - // defensively copy before handing over to user code - return interfaces.clone(); + // defensively copy if requested + return cloneArray ? interfaces.clone() : interfaces; } } @@ -1767,15 +1765,6 @@ * Class} object, including those declared by the class or interface and * those inherited from superclasses and superinterfaces. * - *

If this {@code Class} object represents a type that has multiple - * public methods with the same name and parameter types, but different - * return types, then the returned array has a {@code Method} object for - * each such method. - * - *

If this {@code Class} object represents a type with a class - * initialization method {@code }, then the returned array does - * not have a corresponding {@code Method} object. - * *

If this {@code Class} object represents an array type, then the * returned array has a {@code Method} object for each of the public * methods inherited by the array type from {@code Object}. It does not @@ -1788,16 +1777,54 @@ * has length 0. (Note that a {@code Class} object which represents a class * always has public methods, inherited from {@code Object}.) * - *

If this {@code Class} object represents a primitive type or void, - * then the returned array has length 0. - * - *

Static methods declared in superinterfaces of the class or interface - * represented by this {@code Class} object are not considered members of - * the class or interface. + *

The returned array never contains methods with names "{@code }" + * or "{@code }". * *

The elements in the returned array are not sorted and are not in any * particular order. * + *

Generally, the result is computed as with the following 4 step algorithm. + * Let C be the class or interface represented by this {@code Class} object: + *

    + *
  1. A union of methods is composed of: + *
      + *
    1. C's declared public instance and static methods as returned by + * {@link #getDeclaredMethods()} and filtered to include only public + * methods.
    2. + *
    3. If C is a class other than {@code Object}, then include the result + * of invoking this algorithm recursively on the superclass of C.
    4. + *
    5. Include the results of invoking this algorithm recursively on all + * direct superinterfaces of C, but include only instance methods.
    6. + *
  2. + *
  3. Union from step 1 is partitioned into subsets of methods with same + * signature (name, parameter types) and return type.
  4. + *
  5. Within each such subset only the most specific methods are selected. + * Let method M be a method from a set of methods with same signature + * and return type. M is most specific if there is no such method + * N != M from the same set, such that N is more specific than M. + * N is more specific than M if: + *
      + *
    1. N is declared by a class and M is declared by an interface; or
    2. + *
    3. N and M are both declared by classes or both by interfaces and + * N's declaring type is the same as or a subtype of M's declaring type + * (clearly, if M's and N's declaring types are the same type, then + * M and N are the same method).
    4. + *
  6. + *
  7. The result of this algorithm is the union of all selected methods from + * step 3.
  8. + *
+ * + * @apiNote There may be more than one method with a particular name + * and parameter types in a class because while the Java language forbids a + * class to declare multiple methods with the same signature but different + * return types, the Java virtual machine does not. This + * increased flexibility in the virtual machine can be used to + * implement various language features. For example, covariant + * returns can be implemented with {@linkplain + * java.lang.reflect.Method#isBridge bridge methods}; the bridge + * method and the overriding method would have the same + * signature but different return types. + * * @return the array of {@code Method} objects representing the * public methods of this class * @throws SecurityException @@ -1900,12 +1927,13 @@ @CallerSensitive public Field getField(String name) throws NoSuchFieldException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); Field field = getField0(name); if (field == null) { throw new NoSuchFieldException(name); } - return field; + return getReflectionFactory().copyField(field); } @@ -1919,47 +1947,69 @@ * order. If {@code parameterTypes} is {@code null}, it is * treated as if it were an empty array. * - *

If the {@code name} is "{@code }" or "{@code }" a - * {@code NoSuchMethodException} is raised. Otherwise, the method to - * be reflected is determined by the algorithm that follows. Let C be the - * class or interface represented by this object: - *

    - *
  1. C is searched for a matching method, as defined below. If a - * matching method is found, it is reflected.
  2. - *
  3. If no matching method is found by step 1 then: - *
      - *
    1. If C is a class other than {@code Object}, then this algorithm is - * invoked recursively on the superclass of C.
    2. - *
    3. If C is the class {@code Object}, or if C is an interface, then - * the superinterfaces of C (if any) are searched for a matching - * method. If any such method is found, it is reflected.
    4. - *
  4. - *
+ *

If this {@code Class} object represents an array type, then this + * method finds any public method inherited by the array type from + * {@code Object} except method {@code clone()}. + * + *

If this {@code Class} object represents an interface then this + * method does not find any implicitly declared method from + * {@code Object}. Therefore, if no methods are explicitly declared in + * this interface or any of its superinterfaces, then this method does not + * find any method. + * + *

This method does not find any method with name "{@code }" or + * "{@code }". * - *

To find a matching method in a class or interface C:  If C - * declares exactly one public method with the specified name and exactly - * the same formal parameter types, that is the method reflected. If more - * than one such method is found in C, and one of these methods has a - * return type that is more specific than any of the others, that method is - * reflected; otherwise one of the methods is chosen arbitrarily. + *

Generally, the method to be reflected is determined by the 4 step + * algorithm that follows. + * Let C be the class or interface represented by this {@code Class} object: + *

    + *
  1. A union of methods is composed of: + *
      + *
    1. C's declared public instance and static methods as returned by + * {@link #getDeclaredMethods()} and filtered to include only public + * methods that match given {@code name} and {@code parameterTypes}
    2. + *
    3. If C is a class other than {@code Object}, then include the result + * of invoking this algorithm recursively on the superclass of C.
    4. + *
    5. Include the results of invoking this algorithm recursively on all + * direct superinterfaces of C, but include only instance methods.
    6. + *
  2. + *
  3. This union is partitioned into subsets of methods with same + * return type (the selection of methods from step 1 also guarantees that + * they have the same method name and parameter types).
  4. + *
  5. Within each such subset only the most specific methods are selected. + * Let method M be a method from a set of methods with same VM + * signature (return type, name, parameter types). + * M is most specific if there is no such method N != M from the same + * set, such that N is more specific than M. N is more specific than M + * if: + *
      + *
    1. N is declared by a class and M is declared by an interface; or
    2. + *
    3. N and M are both declared by classes or both by interfaces and + * N's declaring type is the same as or a subtype of M's declaring type + * (clearly, if M's and N's declaring types are the same type, then + * M and N are the same method).
    4. + *
  6. + *
  7. The result of this algorithm is chosen arbitrarily from the methods + * with most specific return type among all selected methods from step 3. + * Let R be a return type of a method M from the set of all selected methods + * from step 3. M is a method with most specific return type if there is + * no such method N != M from the same set, having return type S != R, + * such that S is a subtype of R as determined by + * R.class.{@link #isAssignableFrom}(S.class). + *
* - *

Note that there may be more than one matching method in a - * class because while the Java language forbids a class to - * declare multiple methods with the same signature but different + * @apiNote There may be more than one method with matching name and + * parameter types in a class because while the Java language forbids a + * class to declare multiple methods with the same signature but different * return types, the Java virtual machine does not. This * increased flexibility in the virtual machine can be used to * implement various language features. For example, covariant * returns can be implemented with {@linkplain * java.lang.reflect.Method#isBridge bridge methods}; the bridge - * method and the method being overridden would have the same - * signature but different return types. - * - *

If this {@code Class} object represents an array type, then this - * method does not find the {@code clone()} method. - * - *

Static methods declared in superinterfaces of the class or interface - * represented by this {@code Class} object are not considered members of - * the class or interface. + * method and the overriding method would have the same + * signature but different return types. This method would return the + * overriding method as it would have a more specific return type. * * @param name the name of the method * @param parameterTypes the list of parameters @@ -1983,12 +2033,13 @@ @CallerSensitive public Method getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); - Method method = getMethod0(name, parameterTypes, true); + Method method = getMethod0(name, parameterTypes); if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return method; + return getReflectionFactory().copyMethod(method); } /** @@ -2004,7 +2055,9 @@ * "<init>"or "<clinit>". */ Method getMethodOrNull(String name, Class... parameterTypes) { - return getMethod0(name, parameterTypes, true); + Objects.requireNonNull(name); + Method method = getMethod0(name, parameterTypes); + return method == null ? null : getReflectionFactory().copyMethod(method); } @@ -2041,7 +2094,8 @@ public Constructor getConstructor(Class... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); - return getConstructor0(parameterTypes, Member.PUBLIC); + return getReflectionFactory().copyConstructor( + getConstructor0(parameterTypes, Member.PUBLIC)); } @@ -2283,12 +2337,13 @@ @CallerSensitive public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); Field field = searchFields(privateGetDeclaredFields(false), name); if (field == null) { throw new NoSuchFieldException(name); } - return field; + return getReflectionFactory().copyField(field); } @@ -2343,12 +2398,13 @@ @CallerSensitive public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException { + Objects.requireNonNull(name); checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes); if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return method; + return getReflectionFactory().copyMethod(method); } @@ -2394,7 +2450,8 @@ public Constructor getDeclaredConstructor(Class... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); - return getConstructor0(parameterTypes, Member.DECLARED); + return getReflectionFactory().copyConstructor( + getConstructor0(parameterTypes, Member.DECLARED)); } /** @@ -3004,180 +3061,6 @@ return res; } - static class MethodArray { - // Don't add or remove methods except by add() or remove() calls. - private Method[] methods; - private int length; - private int defaults; - - MethodArray() { - this(20); - } - - MethodArray(int initialSize) { - if (initialSize < 2) - throw new IllegalArgumentException("Size should be 2 or more"); - - methods = new Method[initialSize]; - length = 0; - defaults = 0; - } - - boolean hasDefaults() { - return defaults != 0; - } - - void add(Method m) { - if (length == methods.length) { - methods = Arrays.copyOf(methods, 2 * methods.length); - } - methods[length++] = m; - - if (m != null && m.isDefault()) - defaults++; - } - - void addAll(Method[] ma) { - for (Method m : ma) { - add(m); - } - } - - void addAll(MethodArray ma) { - for (int i = 0; i < ma.length(); i++) { - add(ma.get(i)); - } - } - - void addIfNotPresent(Method newMethod) { - for (int i = 0; i < length; i++) { - Method m = methods[i]; - if (m == newMethod || (m != null && m.equals(newMethod))) { - return; - } - } - add(newMethod); - } - - void addAllIfNotPresent(MethodArray newMethods) { - for (int i = 0; i < newMethods.length(); i++) { - Method m = newMethods.get(i); - if (m != null) { - addIfNotPresent(m); - } - } - } - - /* Add Methods declared in an interface to this MethodArray. - * Static methods declared in interfaces are not inherited. - */ - void addInterfaceMethods(Method[] methods) { - for (Method candidate : methods) { - if (!Modifier.isStatic(candidate.getModifiers())) { - add(candidate); - } - } - } - - int length() { - return length; - } - - Method get(int i) { - return methods[i]; - } - - Method getFirst() { - for (Method m : methods) - if (m != null) - return m; - return null; - } - - void removeByNameAndDescriptor(Method toRemove) { - for (int i = 0; i < length; i++) { - Method m = methods[i]; - if (m != null && matchesNameAndDescriptor(m, toRemove)) { - remove(i); - } - } - } - - private void remove(int i) { - if (methods[i] != null && methods[i].isDefault()) - defaults--; - methods[i] = null; - } - - private boolean matchesNameAndDescriptor(Method m1, Method m2) { - return m1.getReturnType() == m2.getReturnType() && - m1.getName() == m2.getName() && // name is guaranteed to be interned - arrayContentsEq(m1.getParameterTypes(), - m2.getParameterTypes()); - } - - void compactAndTrim() { - int newPos = 0; - // Get rid of null slots - for (int pos = 0; pos < length; pos++) { - Method m = methods[pos]; - if (m != null) { - if (pos != newPos) { - methods[newPos] = m; - } - newPos++; - } - } - if (newPos != methods.length) { - methods = Arrays.copyOf(methods, newPos); - } - } - - /* Removes all Methods from this MethodArray that have a more specific - * default Method in this MethodArray. - * - * Users of MethodArray are responsible for pruning Methods that have - * a more specific concrete Method. - */ - void removeLessSpecifics() { - if (!hasDefaults()) - return; - - for (int i = 0; i < length; i++) { - Method m = get(i); - if (m == null || !m.isDefault()) - continue; - - for (int j = 0; j < length; j++) { - if (i == j) - continue; - - Method candidate = get(j); - if (candidate == null) - continue; - - if (!matchesNameAndDescriptor(m, candidate)) - continue; - - if (hasMoreSpecificClass(m, candidate)) - remove(j); - } - } - } - - Method[] getArray() { - return methods; - } - - // Returns true if m1 is more specific than m2 - static boolean hasMoreSpecificClass(Method m1, Method m2) { - Class m1Class = m1.getDeclaringClass(); - Class m2Class = m2.getDeclaringClass(); - return m1Class != m2Class && m2Class.isAssignableFrom(m1Class); - } - } - - // Returns an array of "root" methods. These Method objects must NOT // be propagated to the outside world, but must instead be copied // via ReflectionFactory.copyMethod. @@ -3190,51 +3073,29 @@ } // No cached value available; compute value recursively. - // Start by fetching public declared methods - MethodArray methods = new MethodArray(); - { - Method[] tmp = privateGetDeclaredMethods(true); - methods.addAll(tmp); - } - // Now recur over superclass and direct superinterfaces. - // Go over superinterfaces first so we can more easily filter - // out concrete implementations inherited from superclasses at - // the end. - MethodArray inheritedMethods = new MethodArray(); - for (Class i : getInterfaces()) { - inheritedMethods.addInterfaceMethods(i.privateGetPublicMethods()); + // Start by fetching public declared methods... + PublicMethods pms = new PublicMethods(); + for (Method m : privateGetDeclaredMethods(/* publicOnly */ true)) { + pms.merge(m); } - if (!isInterface()) { - Class c = getSuperclass(); - if (c != null) { - MethodArray supers = new MethodArray(); - supers.addAll(c.privateGetPublicMethods()); - // Filter out concrete implementations of any - // interface methods - for (int i = 0; i < supers.length(); i++) { - Method m = supers.get(i); - if (m != null && - !Modifier.isAbstract(m.getModifiers()) && - !m.isDefault()) { - inheritedMethods.removeByNameAndDescriptor(m); - } - } - // Insert superclass's inherited methods before - // superinterfaces' to satisfy getMethod's search - // order - supers.addAll(inheritedMethods); - inheritedMethods = supers; + // ...then recur over superclass methods... + Class sc = getSuperclass(); + if (sc != null) { + for (Method m : sc.privateGetPublicMethods()) { + pms.merge(m); } } - // Filter out all local methods from inherited ones - for (int i = 0; i < methods.length(); i++) { - Method m = methods.get(i); - inheritedMethods.removeByNameAndDescriptor(m); + // ...and finally over direct superinterfaces. + for (Class intf : getInterfaces(/* cloneArray */ false)) { + for (Method m : intf.privateGetPublicMethods()) { + // static interface methods are not inherited + if (!Modifier.isStatic(m.getModifiers())) { + pms.merge(m); + } + } } - methods.addAllIfNotPresent(inheritedMethods); - methods.removeLessSpecifics(); - methods.compactAndTrim(); - res = methods.getArray(); + + res = pms.toArray(); if (rd != null) { rd.publicMethods = res; } @@ -3246,17 +3107,20 @@ // Helpers for fetchers of one field, method, or constructor // + // This method does not copy the returned Field object! private static Field searchFields(Field[] fields, String name) { - String internedName = name.intern(); for (Field field : fields) { - if (field.getName() == internedName) { - return getReflectionFactory().copyField(field); + if (field.getName().equals(name)) { + return field; } } return null; } - private Field getField0(String name) throws NoSuchFieldException { + // Returns a "root" Field object. This Field object must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyField. + private Field getField0(String name) { // Note: the intent is that the search algorithm this routine // uses be equivalent to the ordering imposed by // privateGetPublicFields(). It fetches only the declared @@ -3270,7 +3134,7 @@ return res; } // Direct superinterfaces, recursively - Class[] interfaces = getInterfaces(); + Class[] interfaces = getInterfaces(/* cloneArray */ false); for (Class c : interfaces) { if ((res = c.getField0(name)) != null) { return res; @@ -3288,87 +3152,85 @@ return null; } + // This method does not copy the returned Method object! private static Method searchMethods(Method[] methods, String name, Class[] parameterTypes) { + ReflectionFactory fact = getReflectionFactory(); Method res = null; - String internedName = name.intern(); for (Method m : methods) { - if (m.getName() == internedName - && arrayContentsEq(parameterTypes, m.getParameterTypes()) + if (m.getName().equals(name) + && arrayContentsEq(parameterTypes, + fact.getExecutableSharedParameterTypes(m)) && (res == null - || res.getReturnType().isAssignableFrom(m.getReturnType()))) + || (res.getReturnType() != m.getReturnType() + && res.getReturnType().isAssignableFrom(m.getReturnType())))) res = m; } - - return (res == null ? res : getReflectionFactory().copyMethod(res)); + return res; } - private Method getMethod0(String name, Class[] parameterTypes, boolean includeStaticMethods) { - MethodArray interfaceCandidates = new MethodArray(2); - Method res = privateGetMethodRecursive(name, parameterTypes, includeStaticMethods, interfaceCandidates); - if (res != null) - return res; - - // Not found on class or superclass directly - interfaceCandidates.removeLessSpecifics(); - return interfaceCandidates.getFirst(); // may be null + private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; + + // Returns a "root" Method object. This Method object must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyMethod. + private Method getMethod0(String name, Class[] parameterTypes) { + PublicMethods.MethodList res = getMethodsRecursive( + name, + parameterTypes == null ? EMPTY_CLASS_ARRAY : parameterTypes, + /* includeStatic */ true); + return res == null ? null : res.getMostSpecific(); } - private Method privateGetMethodRecursive(String name, - Class[] parameterTypes, - boolean includeStaticMethods, - MethodArray allInterfaceCandidates) { - // Note: the intent is that the search algorithm this routine - // uses be equivalent to the ordering imposed by - // privateGetPublicMethods(). It fetches only the declared - // public methods for each class, however, to reduce the - // number of Method objects which have to be created for the - // common case where the method being requested is declared in - // the class which is being queried. - // - // Due to default methods, unless a method is found on a superclass, - // methods declared in any superinterface needs to be considered. - // Collect all candidates declared in superinterfaces in {@code - // allInterfaceCandidates} and select the most specific if no match on - // a superclass is found. - - // Must _not_ return root methods - Method res; - // Search declared public methods - if ((res = searchMethods(privateGetDeclaredMethods(true), - name, - parameterTypes)) != null) { - if (includeStaticMethods || !Modifier.isStatic(res.getModifiers())) - return res; + // Returns a list of "root" Method objects. These Method objects must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyMethod. + private PublicMethods.MethodList getMethodsRecursive(String name, + Class[] parameterTypes, + boolean includeStatic) { + // 1st check declared public methods + Method[] methods = privateGetDeclaredMethods(/* publicOnly */ true); + PublicMethods.MethodList res = PublicMethods.MethodList + .filter(methods, name, parameterTypes, includeStatic); + // if there is at least one match among declared methods, we need not + // search any further as such match surely overrides matching methods + // declared in superclass(es) or interface(s). + if (res != null) { + return res; } - // Search superclass's methods - if (!isInterface()) { - Class c = getSuperclass(); - if (c != null) { - if ((res = c.getMethod0(name, parameterTypes, true)) != null) { - return res; - } - } + + // if there was no match among declared methods, + // we must consult the superclass (if any) recursively... + Class sc = getSuperclass(); + if (sc != null) { + res = sc.getMethodsRecursive(name, parameterTypes, includeStatic); } - // Search superinterfaces' methods - Class[] interfaces = getInterfaces(); - for (Class c : interfaces) - if ((res = c.getMethod0(name, parameterTypes, false)) != null) - allInterfaceCandidates.add(res); - // Not found - return null; + + // ...and coalesce the superclass methods with methods obtained + // from directly implemented interfaces excluding static methods... + for (Class intf : getInterfaces(/* cloneArray */ false)) { + res = PublicMethods.MethodList.merge( + res, intf.getMethodsRecursive(name, parameterTypes, + /* includeStatic */ false)); + } + + return res; } + // Returns a "root" Constructor object. This Constructor object must NOT + // be propagated to the outside world, but must instead be copied + // via ReflectionFactory.copyConstructor. private Constructor getConstructor0(Class[] parameterTypes, int which) throws NoSuchMethodException { + ReflectionFactory fact = getReflectionFactory(); Constructor[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC)); for (Constructor constructor : constructors) { if (arrayContentsEq(parameterTypes, - constructor.getParameterTypes())) { - return getReflectionFactory().copyConstructor(constructor); + fact.getExecutableSharedParameterTypes(constructor))) { + return constructor; } } throw new NoSuchMethodException(getName() + "." + argumentTypesToString(parameterTypes)); diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/PublicMethods.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang; + +import jdk.internal.reflect.ReflectionFactory; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.security.AccessController; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * A collection of most specific public methods. Methods are added to it using + * {@link #merge(Method)} method. Only the most specific methods for a + * particular signature are kept. + */ +final class PublicMethods { + + /** + * a map of (method name, parameter types) -> linked list of Method(s) + */ + private final Map map = new LinkedHashMap<>(); + + /** + * keeps track of the number of collected methods + */ + private int methodCount; + + /** + * Merges new method with existing methods. New method is either + * ignored (if a more specific method with same signature exists) or added + * to the collection. When it is added to the collection, it may replace one + * or more existing methods with same signature if they are less specific + * than added method. + * See comments in code... + */ + void merge(Method method) { + Key key = new Key(method); + MethodList existing = map.get(key); + int xLen = existing == null ? 0 : existing.length(); + MethodList merged = MethodList.merge(existing, method); + methodCount += merged.length() - xLen; + // replace if head of list changed + if (merged != existing) { + map.put(key, merged); + } + } + + /** + * Dumps methods to array. + */ + Method[] toArray() { + Method[] array = new Method[methodCount]; + int i = 0; + for (MethodList ml : map.values()) { + for (; ml != null; ml = ml.next) { + array[i++] = ml.method; + } + } + return array; + } + + /** + * Method (name, parameter types) tuple. + */ + private static final class Key { + private static final ReflectionFactory reflectionFactory = + AccessController.doPrivileged( + new ReflectionFactory.GetReflectionFactoryAction()); + + private final String name; // must be interned (as from Method.getName()) + private final Class[] ptypes; + + Key(Method method) { + name = method.getName(); + ptypes = reflectionFactory.getExecutableSharedParameterTypes(method); + } + + static boolean matches(Method method, + String name, // may not be interned + Class[] ptypes) { + return method.getName().equals(name) && + Arrays.equals( + reflectionFactory.getExecutableSharedParameterTypes(method), + ptypes + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Key)) return false; + Key that = (Key) o; + //noinspection StringEquality (guaranteed interned String(s)) + return name == that.name && + Arrays.equals(ptypes, that.ptypes); + } + + @Override + public int hashCode() { + return System.identityHashCode(name) + // guaranteed interned String + 31 * Arrays.hashCode(ptypes); + } + } + + /** + * Node of a inked list containing Method(s) sharing the same + * (name, parameter types) tuple. + */ + static final class MethodList { + Method method; + MethodList next; + + private MethodList(Method method) { + this.method = method; + } + + /** + * @return the head of a linked list containing given {@code methods} + * filtered by given method {@code name}, parameter types + * {@code ptypes} and including or excluding static methods as + * requested by {@code includeStatic} flag. + */ + static MethodList filter(Method[] methods, String name, + Class[] ptypes, boolean includeStatic) { + MethodList head = null, tail = null; + for (Method method : methods) { + if ((includeStatic || !Modifier.isStatic(method.getModifiers())) && + Key.matches(method, name, ptypes)) { + if (tail == null) { + head = tail = new MethodList(method); + } else { + tail = tail.next = new MethodList(method); + } + } + } + return head; + } + + /** + * This method should only be called with the {@code head} (possibly null) + * of a list of Method(s) that share the same (method name, parameter types) + * and another {@code methodList} that also contains Method(s) with the + * same and equal (method name, parameter types) as the 1st list. + * It modifies the 1st list and returns the head of merged list + * containing only the most specific methods for each signature + * (i.e. return type). The returned head of the merged list may or + * may not be the same as the {@code head} of the given list. + * The given {@code methodList} is not modified. + */ + static MethodList merge(MethodList head, MethodList methodList) { + for (MethodList ml = methodList; ml != null; ml = ml.next) { + head = merge(head, ml.method); + } + return head; + } + + private static MethodList merge(MethodList head, Method method) { + Class dclass = method.getDeclaringClass(); + Class rtype = method.getReturnType(); + MethodList prev = null; + for (MethodList l = head; l != null; l = l.next) { + // eXisting method + Method xmethod = l.method; + // only merge methods with same signature: + // (return type, name, parameter types) tuple + // as we only keep methods with same (name, parameter types) + // tuple together in one list, we only need to check return type + if (rtype == xmethod.getReturnType()) { + Class xdclass = xmethod.getDeclaringClass(); + if (dclass.isInterface() == xdclass.isInterface()) { + // both methods are declared by interfaces + // or both by classes + if (dclass.isAssignableFrom(xdclass)) { + // existing method is the same or overrides + // new method - ignore new method + return head; + } + if (xdclass.isAssignableFrom(dclass)) { + // new method overrides existing + // method - knock out existing method + if (prev != null) { + prev.next = l.next; + } else { + head = l.next; + } + // keep iterating + } else { + // unrelated (should only happen for interfaces) + prev = l; + // keep iterating + } + } else if (dclass.isInterface()) { + // new method is declared by interface while + // existing method is declared by class - + // ignore new method + return head; + } else /* xdclass.isInterface() */ { + // new method is declared by class while + // existing method is declared by interface - + // knock out existing method + if (prev != null) { + prev.next = l.next; + } else { + head = l.next; + } + // keep iterating + } + } else { + // distinct signatures + prev = l; + // keep iterating + } + } + // append new method to the list + if (prev == null) { + head = new MethodList(method); + } else { + prev.next = new MethodList(method); + } + return head; + } + + private int length() { + int len = 1; + for (MethodList ml = next; ml != null; ml = ml.next) { + len++; + } + return len; + } + + /** + * @return 1st method in list with most specific return type + */ + Method getMostSpecific() { + Method m = method; + Class rt = m.getReturnType(); + for (MethodList ml = next; ml != null; ml = ml.next) { + Method m2 = ml.method; + Class rt2 = m2.getReturnType(); + if (rt2 != rt && rt.isAssignableFrom(rt2)) { + // found more specific return type + m = m2; + rt = rt2; + } + } + return m; + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1786,10 +1786,6 @@ AccessMode(final String methodName, AccessType at) { this.methodName = methodName; this.at = at; - - // Assert that return type is correct - // Otherwise, when disabled avoid using reflection - assert at.returnType == getReturnType(methodName); } /** @@ -1821,16 +1817,6 @@ throw new IllegalArgumentException("No AccessMode value for method name " + methodName); } - private static Class getReturnType(String name) { - try { - Method m = VarHandle.class.getMethod(name, Object[].class); - return m.getReturnType(); - } - catch (Exception e) { - throw newInternalError(e); - } - } - @ForceInline static MemberName getMemberName(int ordinal, VarForm vform) { return vform.memberName_table[ordinal]; diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java Mon Jan 09 11:57:06 2017 -0800 @@ -240,6 +240,11 @@ } + @Override + Class[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */ diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/reflect/Executable.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java Mon Jan 09 11:57:06 2017 -0800 @@ -222,6 +222,10 @@ */ public abstract TypeVariable[] getTypeParameters(); + // returns shared array of parameter types - must never give it out + // to the untrusted code... + abstract Class[] getSharedParameterTypes(); + /** * Returns an array of {@code Class} objects that represent the formal * parameter types, in declaration order, of the executable diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/reflect/Method.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java Mon Jan 09 11:57:06 2017 -0800 @@ -290,6 +290,11 @@ } else { return getReturnType();} } + @Override + Class[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */ diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java Mon Jan 09 11:57:06 2017 -0800 @@ -132,6 +132,10 @@ return ex.getTypeAnnotationBytes(); } + public Class[] getExecutableSharedParameterTypes(Executable ex) { + return ex.getSharedParameterTypes(); + } + // // Copying routines, needed to quickly fabricate new Field, // Method, and Constructor objects from templates diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/security/Policy.java --- a/jdk/src/java.base/share/classes/java/security/Policy.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/security/Policy.java Mon Jan 09 11:57:06 2017 -0800 @@ -28,7 +28,6 @@ import java.util.Enumeration; import java.util.WeakHashMap; -import java.util.concurrent.atomic.AtomicReference; import java.util.Objects; import sun.security.jca.GetInstance; import sun.security.util.Debug; @@ -107,9 +106,10 @@ } } - // PolicyInfo is stored in an AtomicReference - private static AtomicReference policy = - new AtomicReference<>(new PolicyInfo(null, false)); + // PolicyInfo is volatile since we apply DCL during initialization. + // For correctness, care must be taken to read the field only once and only + // write to it after any other initialization action has taken place. + private static volatile PolicyInfo policyInfo = new PolicyInfo(null, false); private static final Debug debug = Debug.getInstance("policy"); @@ -121,9 +121,8 @@ private WeakHashMap pdMapping; /** package private for AccessControlContext and ProtectionDomain */ - static boolean isSet() - { - PolicyInfo pi = policy.get(); + static boolean isSet() { + PolicyInfo pi = policyInfo; return pi.policy != null && pi.initialized == true; } @@ -168,16 +167,15 @@ */ static Policy getPolicyNoCheck() { - PolicyInfo pi = policy.get(); + PolicyInfo pi = policyInfo; // Use double-check idiom to avoid locking if system-wide policy is // already initialized if (pi.initialized == false || pi.policy == null) { synchronized (Policy.class) { - PolicyInfo pinfo = policy.get(); - if (pinfo.policy == null) { + pi = policyInfo; + if (pi.policy == null) { return loadPolicyProvider(); } - return pinfo.policy; } } return pi.policy; @@ -206,7 +204,7 @@ policyProvider.equals(DEFAULT_POLICY)) { Policy polFile = new sun.security.provider.PolicyFile(); - policy.set(new PolicyInfo(polFile, true)); + policyInfo = new PolicyInfo(polFile, true); return polFile; } @@ -216,7 +214,7 @@ * provider to avoid potential recursion. */ Policy polFile = new sun.security.provider.PolicyFile(); - policy.set(new PolicyInfo(polFile, false)); + policyInfo = new PolicyInfo(polFile, false); Policy pol = AccessController.doPrivileged(new PrivilegedAction<>() { @Override @@ -244,7 +242,7 @@ } pol = polFile; } - policy.set(new PolicyInfo(pol, true)); + policyInfo = new PolicyInfo(pol, true); return pol; } @@ -274,7 +272,7 @@ initPolicy(p); } synchronized (Policy.class) { - policy.set(new PolicyInfo(p, p != null)); + policyInfo = new PolicyInfo(p, p != null); } } @@ -326,7 +324,7 @@ } if (policyDomain.getCodeSource() != null) { - Policy pol = policy.get().policy; + Policy pol = policyInfo.policy; if (pol != null) { policyPerms = pol.getPermissions(policyDomain); } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/text/ChoiceFormat.java --- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -172,6 +172,8 @@ /** * Sets the pattern. * @param newPattern See the class description. + * @exception NullPointerException if {@code newPattern} + * is {@code null} */ public void applyPattern(String newPattern) { StringBuffer[] segments = new StringBuffer[2]; @@ -309,6 +311,8 @@ * Constructs with limits and corresponding formats based on the pattern. * * @param newPattern the new pattern string + * @exception NullPointerExcpetion if {@code newPattern} is + * {@code null} * @see #applyPattern */ public ChoiceFormat(String newPattern) { @@ -320,6 +324,8 @@ * * @param limits limits in ascending order * @param formats corresponding format strings + * @exception NullPointerException if {@code limits} or {@code formats} + * is {@code null} * @see #setChoices */ public ChoiceFormat(double[] limits, String[] formats) { @@ -339,6 +345,8 @@ * When formatting with object Y, * if the object is a NumberFormat, then ((NumberFormat) Y).format(X) * is called. Otherwise Y.toString() is called. + * @exception NullPointerException if {@code limits} or + * {@code formats} is {@code null} */ public void setChoices(double[] limits, String formats[]) { if (limits.length != formats.length) { @@ -386,6 +394,8 @@ * @param number number to be formatted and substituted. * @param toAppendTo where text is appended. * @param status ignore no useful status is returned. + * @exception NullPointerException if {@code toAppendTo} + * is {@code null} */ public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition status) { @@ -414,6 +424,9 @@ * status.index is unchanged and status.errorIndex is set to the * first index of the character that caused the parse to fail. * @return A Number representing the value of the number parsed. + * @exception NullPointerException if {@code status} is {@code null} + * or if {@code text} is {@code null} and the list of + * choice strings is not empty. */ public Number parse(String text, ParsePosition status) { // find the best number (defined as the one with the longest parse) diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/text/DateFormat.java --- a/jdk/src/java.base/share/classes/java/text/DateFormat.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/text/DateFormat.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -141,6 +141,25 @@ * If multiple threads access a format concurrently, it must be synchronized * externally. * + * @implSpec + *

  • The {@link #format(Date, StringBuffer, FieldPosition)} and + * {@link #parse(String, ParsePosition)} methods may throw + * {@code NullPointerException}, if any of their parameter is {@code null}. + * The subclass may provide its own implementation and specification about + * {@code NullPointerException}.
  • + *
  • The {@link #setCalendar(Calendar)}, {@link + * #setNumberFormat(NumberFormat)} and {@link #setTimeZone(TimeZone)} methods + * do not throw {@code NullPointerException} when their parameter is + * {@code null}, but any subsequent operations on the same instance may throw + * {@code NullPointerException}.
  • + *
  • The {@link #getCalendar()}, {@link #getNumberFormat()} and + * {@link getTimeZone()} methods may return {@code null}, if the respective + * values of this instance is set to {@code null} through the corresponding + * setter methods. For Example: {@link #getTimeZone()} may return {@code null}, + * if the {@code TimeZone} value of this instance is set as + * {@link #setTimeZone(java.util.TimeZone) setTimeZone(null)}.
  • + *
+ * * @see Format * @see NumberFormat * @see SimpleDateFormat @@ -296,6 +315,8 @@ * the begin index and end index of fieldPosition will be set to * 5 and 8, respectively, for the first occurrence of the timezone * pattern character 'z'. + * @exception IllegalArgumentException if the {@code Format} cannot format + * the given {@code obj}. * @see java.text.Format */ public final StringBuffer format(Object obj, StringBuffer toAppendTo, diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/text/DecimalFormat.java --- a/jdk/src/java.base/share/classes/java/text/DecimalFormat.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/text/DecimalFormat.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -514,6 +514,8 @@ * @param result where the text is to be appended * @param fieldPosition On input: an alignment field, if desired. * On output: the offsets of the alignment field. + * @exception NullPointerException if {@code result} or + * {@code fieldPosition} is {@code null} * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @return The formatted number string @@ -632,6 +634,8 @@ * @param result where the text is to be appended * @param fieldPosition On input: an alignment field, if desired. * On output: the offsets of the alignment field. + * @exception NullPointerException if {@code result} or + * {@code fieldPosition} is {@code null} * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @return The formatted number string diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/text/MessageFormat.java --- a/jdk/src/java.base/share/classes/java/text/MessageFormat.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/text/MessageFormat.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -356,6 +356,8 @@ * * @param pattern the pattern for this message format * @exception IllegalArgumentException if the pattern is invalid + * @exception NullPointerException if {@code pattern} is + * {@code null} */ public MessageFormat(String pattern) { this.locale = Locale.getDefault(Locale.Category.FORMAT); @@ -373,6 +375,8 @@ * @param pattern the pattern for this message format * @param locale the locale for this message format * @exception IllegalArgumentException if the pattern is invalid + * @exception NullPointerException if {@code pattern} is + * {@code null} * @since 1.4 */ public MessageFormat(String pattern, Locale locale) { @@ -420,6 +424,8 @@ * * @param pattern the pattern for this message format * @exception IllegalArgumentException if the pattern is invalid + * @exception NullPointerException if {@code pattern} is + * {@code null} */ @SuppressWarnings("fallthrough") // fallthrough in switch is expected, suppress it public void applyPattern(String pattern) { @@ -814,6 +820,7 @@ * @exception IllegalArgumentException if an argument in the * arguments array is not of the type * expected by the format element(s) that use it. + * @exception NullPointerException if {@code result} is {@code null} */ public final StringBuffer format(Object[] arguments, StringBuffer result, FieldPosition pos) @@ -835,6 +842,7 @@ * or if an argument in the arguments array * is not of the type expected by the format element(s) * that use it. + * @exception NullPointerException if {@code pattern} is {@code null} */ public static String format(String pattern, Object ... arguments) { MessageFormat temp = new MessageFormat(pattern); @@ -858,6 +866,7 @@ * @exception IllegalArgumentException if an argument in the * arguments array is not of the type * expected by the format element(s) that use it. + * @exception NullPointerException if {@code result} is {@code null} */ public final StringBuffer format(Object arguments, StringBuffer result, FieldPosition pos) @@ -947,6 +956,8 @@ * @param source the string to parse * @param pos the parse position * @return an array of parsed objects + * @exception NullPointerException if {@code pos} is {@code null} + * for a non-null {@code source} string. */ public Object[] parse(String source, ParsePosition pos) { if (source == null) { diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/text/NumberFormat.java --- a/jdk/src/java.base/share/classes/java/text/NumberFormat.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/text/NumberFormat.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -174,6 +174,13 @@ * If multiple threads access a format concurrently, it must be synchronized * externally. * + * @implSpec The {@link #format(double, StringBuffer, FieldPosition)}, + * {@link #format(long, StringBuffer, FieldPosition)} and + * {@link #parse(String, ParsePosition)} methods may throw + * {@code NullPointerException}, if any of their parameter is {@code null}. + * The subclass may provide its own implementation and specification about + * {@code NullPointerException}. + * * @see DecimalFormat * @see ChoiceFormat * @author Mark Davis diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java --- a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -905,6 +905,7 @@ * @param startDate During parsing, two digit years will be placed in the range * startDate to startDate + 100 years. * @see #get2DigitYearStart + * @throws NullPointerException if {@code startDate} is {@code null}. * @since 1.2 */ public void set2DigitYearStart(Date startDate) { @@ -933,7 +934,7 @@ * @param pos the formatting position. On input: an alignment field, * if desired. On output: the offsets of the alignment field. * @return the formatted date-time string. - * @exception NullPointerException if the given {@code date} is {@code null}. + * @exception NullPointerException if any of the parameters is {@code null}. */ @Override public StringBuffer format(Date date, StringBuffer toAppendTo, diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/time/Period.java --- a/jdk/src/java.base/share/classes/java/time/Period.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/time/Period.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -818,7 +818,7 @@ * Returns a copy of this period with the years and months normalized. *

* This normalizes the years and months units, leaving the days unit unchanged. - * The months unit is adjusted to have an absolute value less than 11, + * The months unit is adjusted to have an absolute value less than 12, * with the years unit being adjusted to compensate. For example, a period of * "1 Year and 15 months" will be normalized to "2 years and 3 months". *

diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java --- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java Mon Jan 09 11:57:06 2017 -0800 @@ -292,12 +292,12 @@ * W week-of-month number 4 * E day-of-week text Tue; Tuesday; T * e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T - * F week-of-month number 3 + * F day-of-week-in-month number 3 * * a am-pm-of-day text PM * h clock-hour-of-am-pm (1-12) number 12 * K hour-of-am-pm (0-11) number 0 - * k clock-hour-of-am-pm (1-24) number 0 + * k clock-hour-of-day (1-24) number 24 * * H hour-of-day (0-23) number 0 * m minute-of-hour number 30 diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java --- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Mon Jan 09 11:57:06 2017 -0800 @@ -1486,12 +1486,12 @@ * W week-of-month number 4 * E day-of-week text Tue; Tuesday; T * e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T - * F week-of-month number 3 + * F day-of-week-in-month number 3 * * a am-pm-of-day text PM * h clock-hour-of-am-pm (1-12) number 12 * K hour-of-am-pm (0-11) number 0 - * k clock-hour-of-am-pm (1-24) number 0 + * k clock-hour-of-day (1-24) number 24 * * H hour-of-day (0-23) number 0 * m minute-of-hour number 30 diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java --- a/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java Mon Jan 09 11:57:06 2017 -0800 @@ -871,13 +871,13 @@ /** * Gets the previous transition before the specified instant. *

- * This returns details of the previous transition after the specified instant. + * This returns details of the previous transition before the specified instant. * For example, if the instant represents a point where "summer" daylight saving time * applies, then the method will return the transition from the previous "winter" time. * * @param instant the instant to get the previous transition after, not null, but null * may be ignored if the rules have a single offset for all instants - * @return the previous transition after the specified instant, null if this is before the first transition + * @return the previous transition before the specified instant, null if this is before the first transition */ public ZoneOffsetTransition previousTransition(Instant instant) { if (savingsInstantTransitions.length == 0) { diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/util/Random.java --- a/jdk/src/java.base/share/classes/java/util/Random.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/util/Random.java Mon Jan 09 11:57:06 2017 -0800 @@ -187,7 +187,7 @@ * * This is a linear congruential pseudorandom number generator, as * defined by D. H. Lehmer and described by Donald E. Knuth in - * The Art of Computer Programming, Volume 3: + * The Art of Computer Programming, Volume 2: * Seminumerical Algorithms, section 3.2.1. * * @param bits random bits @@ -570,7 +570,7 @@ * }} * This uses the polar method of G. E. P. Box, M. E. Muller, and * G. Marsaglia, as described by Donald E. Knuth in The Art of - * Computer Programming, Volume 3: Seminumerical Algorithms, + * Computer Programming, Volume 2: Seminumerical Algorithms, * section 3.4.1, subsection C, algorithm P. Note that it generates two * independent values at the cost of only one call to {@code StrictMath.log} * and one call to {@code StrictMath.sqrt}. diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/java/util/function/package-info.java --- a/jdk/src/java.base/share/classes/java/util/function/package-info.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/java/util/function/package-info.java Mon Jan 09 11:57:06 2017 -0800 @@ -74,7 +74,7 @@ * {@link java.util.function.Function} (unary function from {@code T} to {@code R}), * {@link java.util.function.Consumer} (unary function from {@code T} to {@code void}), * {@link java.util.function.Predicate} (unary function from {@code T} to {@code boolean}), - * and {@link java.util.function.Supplier} (nilary function to {@code R}). + * and {@link java.util.function.Supplier} (nullary function to {@code R}). * * *

  • Function shapes have a natural arity based on how they are most diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java Mon Jan 09 11:57:06 2017 -0800 @@ -96,6 +96,9 @@ /** Gets the "parameterAnnotations" field from a Constructor (used for serialization) */ public byte[] getConstructorParameterAnnotations(Constructor c); + /** Gets the shared array of parameter types of an Executable. */ + public Class[] getExecutableSharedParameterTypes(Executable ex); + // // Copying routines, needed to quickly fabricate new Field, // Method, and Constructor objects from templates diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Mon Jan 09 11:57:06 2017 -0800 @@ -345,6 +345,10 @@ return langReflectAccess().getExecutableTypeAnnotationBytes(ex); } + public Class[] getExecutableSharedParameterTypes(Executable ex) { + return langReflectAccess().getExecutableSharedParameterTypes(ex); + } + //-------------------------------------------------------------------------- // // Routines used by serialization diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java --- a/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java Mon Jan 09 11:57:06 2017 -0800 @@ -26,7 +26,6 @@ package sun.net.www; import java.util.BitSet; -import java.io.UnsupportedEncodingException; import java.io.File; import java.net.URL; import java.net.MalformedURLException; @@ -49,7 +48,7 @@ static BitSet encodedInPath; static { - encodedInPath = new BitSet(256); + encodedInPath = new BitSet(128); // Set the bits corresponding to characters that are encoded in the // path component of a URI. @@ -102,14 +101,45 @@ * dependent File.separatorChar. */ public static String encodePath(String path, boolean flag) { - char[] retCC = new char[path.length() * 2 + 16]; - int retLen = 0; - char[] pathCC = path.toCharArray(); + if (flag && File.separatorChar != '/') { + return encodePath(path, 0, File.separatorChar); + } else { + int index = firstEncodeIndex(path); + if (index > -1) { + return encodePath(path, index, '/'); + } else { + return path; + } + } + } - int n = path.length(); - for (int i=0; i= 'a' && c <= 'z' || + c >= 'A' && c <= 'Z' || + c >= '0' && c <= '9') { + continue; + } else if (c > 0x007F || encodedInPath.get(c)) { + return i; + } + } + return -1; + } + + private static String encodePath(String path, int index, char sep) { + char[] pathCC = path.toCharArray(); + char[] retCC = new char[pathCC.length * 2 + 16 - index]; + if (index > 0) { + System.arraycopy(pathCC, 0, retCC, 0, index); + } + int retLen = index; + + for (int i = index; i < pathCC.length; i++) { char c = pathCC[i]; - if ((!flag && c == '/') || (flag && c == File.separatorChar)) + if (c == sep) retCC[retLen++] = '/'; else { if (c <= 0x007F) { @@ -117,11 +147,11 @@ c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') { retCC[retLen++] = c; - } else - if (encodedInPath.get(c)) + } else if (encodedInPath.get(c)) { retLen = escape(retCC, c, retLen); - else + } else { retCC[retLen++] = c; + } } else if (c > 0x07FF) { retLen = escape(retCC, (char)(0xE0 | ((c >> 12) & 0x0F)), retLen); retLen = escape(retCC, (char)(0x80 | ((c >> 6) & 0x3F)), retLen); diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java --- a/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java Mon Jan 09 11:57:06 2017 -0800 @@ -242,8 +242,9 @@ // 2: ClientHello.client_version // 32: ClientHello.random // 1: length byte of ClientHello.session_id + // 2: length bytes of ClientHello.cipher_suites // 2: empty ClientHello.compression_methods - int requiredSize = 46 + sessionIdLen + ((cipherSpecLen * 2 ) / 3 ); + int requiredSize = 48 + sessionIdLen + ((cipherSpecLen * 2 ) / 3 ); byte[] converted = new byte[requiredSize]; /* diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java --- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Mon Jan 09 11:57:06 2017 -0800 @@ -935,12 +935,20 @@ } private static TrustManager[] getTrustManagers() throws Exception { - KeyStore ks = - TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx"); + TrustManagerFactory tmf = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + if ("SunJSSE".equals(tmf.getProvider().getName())) { + // The implementation will load the default KeyStore + // automatically. Cached trust materials may be used + // for performance improvement. + tmf.init((KeyStore)null); + } else { + // Use the explicitly specified KeyStore for third party's + // TrustManagerFactory implementation. + KeyStore ks = TrustStoreManager.getTrustedKeyStore(); + tmf.init(ks); + } - TrustManagerFactory tmf = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm()); - tmf.init(ks); return tmf.getTrustManagers(); } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java --- a/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java Mon Jan 09 11:57:06 2017 -0800 @@ -32,6 +32,7 @@ import javax.net.ssl.*; import sun.security.validator.Validator; +import sun.security.validator.TrustStoreUtil; abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { @@ -47,7 +48,7 @@ protected void engineInit(KeyStore ks) throws KeyStoreException { if (ks == null) { try { - ks = getCacertsKeyStore("trustmanager"); + trustManager = getInstance(TrustStoreManager.getTrustedCerts()); } catch (SecurityException se) { // eat security exceptions but report other throwables if (debug != null && Debug.isOn("trustmanager")) { @@ -72,14 +73,17 @@ "SunX509: skip default keystore: " + e); } throw new KeyStoreException( - "problem accessing trust store" + e); + "problem accessing trust store", e); } + } else { + trustManager = getInstance(TrustStoreUtil.getTrustedCerts(ks)); } - trustManager = getInstance(ks); + isInitialized = true; } - abstract X509TrustManager getInstance(KeyStore ks) throws KeyStoreException; + abstract X509TrustManager getInstance( + Collection trustedCerts); abstract X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException; @@ -126,126 +130,14 @@ }); } - /** - * Returns the keystore with the configured CA certificates. - */ - static KeyStore getCacertsKeyStore(String dbgname) throws Exception - { - String storeFileName = null; - File storeFile = null; - FileInputStream fis = null; - String defaultTrustStoreType; - String defaultTrustStoreProvider; - final HashMap props = new HashMap<>(); - final String sep = File.separator; - KeyStore ks = null; - - AccessController.doPrivileged(new PrivilegedExceptionAction() { - @Override - public Void run() throws Exception { - props.put("trustStore", System.getProperty( - "javax.net.ssl.trustStore")); - props.put("javaHome", System.getProperty( - "java.home")); - props.put("trustStoreType", System.getProperty( - "javax.net.ssl.trustStoreType", - KeyStore.getDefaultType())); - props.put("trustStoreProvider", System.getProperty( - "javax.net.ssl.trustStoreProvider", "")); - props.put("trustStorePasswd", System.getProperty( - "javax.net.ssl.trustStorePassword", "")); - return null; - } - }); - - /* - * Try: - * javax.net.ssl.trustStore (if this variable exists, stop) - * jssecacerts - * cacerts - * - * If none exists, we use an empty keystore. - */ - - try { - storeFileName = props.get("trustStore"); - if (!"NONE".equals(storeFileName)) { - if (storeFileName != null) { - storeFile = new File(storeFileName); - fis = getFileInputStream(storeFile); - } else { - String javaHome = props.get("javaHome"); - storeFile = new File(javaHome + sep + "lib" + sep - + "security" + sep + - "jssecacerts"); - if ((fis = getFileInputStream(storeFile)) == null) { - storeFile = new File(javaHome + sep + "lib" + sep - + "security" + sep + - "cacerts"); - fis = getFileInputStream(storeFile); - } - } - - if (fis != null) { - storeFileName = storeFile.getPath(); - } else { - storeFileName = "No File Available, using empty keystore."; - } - } - - defaultTrustStoreType = props.get("trustStoreType"); - defaultTrustStoreProvider = props.get("trustStoreProvider"); - if (debug != null && Debug.isOn(dbgname)) { - System.out.println("trustStore is: " + storeFileName); - System.out.println("trustStore type is : " + - defaultTrustStoreType); - System.out.println("trustStore provider is : " + - defaultTrustStoreProvider); - } - - /* - * Try to initialize trust store. - */ - if (defaultTrustStoreType.length() != 0) { - if (debug != null && Debug.isOn(dbgname)) { - System.out.println("init truststore"); - } - if (defaultTrustStoreProvider.length() == 0) { - ks = KeyStore.getInstance(defaultTrustStoreType); - } else { - ks = KeyStore.getInstance(defaultTrustStoreType, - defaultTrustStoreProvider); - } - char[] passwd = null; - String defaultTrustStorePassword = - props.get("trustStorePasswd"); - if (defaultTrustStorePassword.length() != 0) - passwd = defaultTrustStorePassword.toCharArray(); - - // if trustStore is NONE, fis will be null - ks.load(fis, passwd); - - // Zero out the temporary password storage - if (passwd != null) { - for (int i = 0; i < passwd.length; i++) { - passwd[i] = (char)0; - } - } - } - } finally { - if (fis != null) { - fis.close(); - } + public static final class SimpleFactory extends TrustManagerFactoryImpl { + @Override + X509TrustManager getInstance( + Collection trustedCerts) { + return new X509TrustManagerImpl( + Validator.TYPE_SIMPLE, trustedCerts); } - return ks; - } - - public static final class SimpleFactory extends TrustManagerFactoryImpl { - @Override - X509TrustManager getInstance(KeyStore ks) throws KeyStoreException { - return new X509TrustManagerImpl(Validator.TYPE_SIMPLE, ks); - } @Override X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException { @@ -253,13 +145,15 @@ ("SunX509 TrustManagerFactory does not use " + "ManagerFactoryParameters"); } - } + } public static final class PKIXFactory extends TrustManagerFactoryImpl { @Override - X509TrustManager getInstance(KeyStore ks) throws KeyStoreException { - return new X509TrustManagerImpl(Validator.TYPE_PKIX, ks); + X509TrustManager getInstance( + Collection trustedCerts) { + return new X509TrustManagerImpl(Validator.TYPE_PKIX, trustedCerts); } + @Override X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException { diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.lang.ref.WeakReference; +import java.io.*; +import java.util.*; + +import java.security.*; +import java.security.cert.*; +import java.security.cert.Certificate; + +import sun.security.action.*; +import sun.security.validator.TrustStoreUtil; + +/** + * Collection of static utility methods to manage the default trusted KeyStores + * effectively. + */ +final class TrustStoreManager { + private static final Debug debug = Debug.getInstance("ssl"); + + // A singleton service to manage the default trusted KeyStores effectively. + private static final TrustAnchorManager tam = new TrustAnchorManager(); + + // Restrict instantiation of this class. + private TrustStoreManager() { + // empty + } + + /** + * Return an unmodifiable set of all trusted X509Certificates contained + * in the default trusted KeyStore. + */ + public static Set getTrustedCerts() throws Exception { + return tam.getTrustedCerts(TrustStoreDescriptor.createInstance()); + } + + /** + * Return an instance of the default trusted KeyStore. + */ + public static KeyStore getTrustedKeyStore() throws Exception { + return tam.getKeyStore(TrustStoreDescriptor.createInstance()); + } + + /** + * A descriptor of the default trusted KeyStore. + * + * The preference of the default trusted KeyStore is: + * javax.net.ssl.trustStore + * jssecacerts + * cacerts + */ + private static final class TrustStoreDescriptor { + private static final String fileSep = File.separator; + private static final String defaultStorePath = + GetPropertyAction.privilegedGetProperty("java.home") + + fileSep + "lib" + fileSep + "security"; + private static final String defaultStore = + defaultStorePath + fileSep + "cacerts"; + private static final String jsseDefaultStore = + defaultStorePath + fileSep + "jssecacerts"; + + // the trust store name + private final String storeName; + + // the trust store type, JKS/PKCS12 + private final String storeType; + + // the provider of the trust store + private final String storeProvider; + + // the password used for the trust store + private final String storePassword; + + // the File object of the trust store + private final File storeFile; + + // the last modified time of the store + private final long lastModified; + + private TrustStoreDescriptor(String storeName, String storeType, + String storeProvider, String storePassword, + File storeFile, long lastModified) { + this.storeName = storeName; + this.storeType = storeType; + this.storeProvider = storeProvider; + this.storePassword = storePassword; + this.storeFile = storeFile; + this.lastModified = lastModified; + + if (debug != null && Debug.isOn("trustmanager")) { + System.out.println( + "trustStore is: " + storeName + "\n" + + "trustStore type is: " + storeType + "\n" + + "trustStore provider is: " + storeProvider + "\n" + + "the last modified time is: " + (new Date(lastModified))); + } + } + + /** + * Create an instance of TrustStoreDescriptor for the default + * trusted KeyStore. + */ + static TrustStoreDescriptor createInstance() { + return AccessController.doPrivileged(new PrivilegedAction<>() { + + @Override + public TrustStoreDescriptor run() { + // Get the system properties for trust store. + String storePropName = System.getProperty( + "javax.net.ssl.trustStore", jsseDefaultStore); + String storePropType = System.getProperty( + "javax.net.ssl.trustStoreType", + KeyStore.getDefaultType()); + String storePropProvider = System.getProperty( + "javax.net.ssl.trustStoreProvider", ""); + String storePropPassword = System.getProperty( + "javax.net.ssl.trustStorePassword", ""); + + String temporaryName = ""; + File temporaryFile = null; + long temporaryTime = 0L; + if (!"NONE".equals(storePropName)) { + String[] fileNames = + new String[] {storePropName, defaultStore}; + for (String fileName : fileNames) { + File f = new File(fileName); + if (f.isFile() && f.canRead()) { + temporaryName = fileName;; + temporaryFile = f; + temporaryTime = f.lastModified(); + + break; + } + + // Not break, the file is inaccessible. + if (debug != null && + Debug.isOn("trustmanager")) { + System.out.println( + "Inaccessible trust store: " + + storePropName); + } + } + } else { + temporaryName = storePropName; + } + + return new TrustStoreDescriptor( + temporaryName, storePropType, storePropProvider, + storePropPassword, temporaryFile, temporaryTime); + } + }); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + if (obj instanceof TrustStoreDescriptor) { + TrustStoreDescriptor that = (TrustStoreDescriptor)obj; + return ((this.lastModified == that.lastModified) && + Objects.equals(this.storeName, that.storeName) && + Objects.equals(this.storeType, that.storeType) && + Objects.equals(this.storeProvider, that.storeProvider)); + } + + return false; + } + + + // Please be careful if computing security-sensitive attributes' + // hash code. For example the storePassword should not be computed. + @Override + public int hashCode() { + int result = 17; + + if (storeName != null && !storeName.isEmpty()) { + result = 31 * result + storeName.hashCode(); + } + + if (storeType != null && !storeType.isEmpty()) { + result = 31 * result + storeType.hashCode(); + } + + if (storeProvider != null && !storeProvider.isEmpty()) { + result = 31 * result + storeProvider.hashCode(); + } + + if (storeFile != null) { + result = 31 * result + storeFile.hashCode(); + } + + if (lastModified != 0L) { + result = (int)(31 * result + lastModified); + } + + return result; + } + } + + /** + * The trust anchors manager used to expedite the performance. + * + * This class can be used to provide singleton services to access default + * trust KeyStore more effectively. + */ + private static final class TrustAnchorManager { + // Last trust store descriptor. + private TrustStoreDescriptor descriptor; + + // The key store used for the trust anchors. + // + // Use weak reference so that the heavy loaded KeyStore object can + // be atomically cleared, and reloaded if needed. + private WeakReference ksRef; + + // The trusted X.509 certificates in the key store. + // + // Use weak reference so that the heavy loaded certificates collection + // objects can be atomically cleared, and reloaded if needed. + private WeakReference> csRef; + + private TrustAnchorManager() { + this.descriptor = null; + this.ksRef = new WeakReference<>(null); + this.csRef = new WeakReference<>(null); + } + + /** + * Get the default trusted KeyStore with the specified descriptor. + * + * @return null if the underlying KeyStore is not available. + */ + synchronized KeyStore getKeyStore( + TrustStoreDescriptor descriptor) throws Exception { + + TrustStoreDescriptor temporaryDesc = this.descriptor; + KeyStore ks = ksRef.get(); + if ((ks != null) && descriptor.equals(temporaryDesc)) { + return ks; + } + + // Reload a new key store. + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reload the trust store"); + } + + ks = loadKeyStore(descriptor); + this.descriptor = descriptor; + this.ksRef = new WeakReference<>(ks); + + return ks; + } + + /** + * Get trusted certificates in the default trusted KeyStore with + * the specified descriptor. + * + * @return empty collection if the underlying KeyStore is not available. + */ + synchronized Set getTrustedCerts( + TrustStoreDescriptor descriptor) throws Exception { + + KeyStore ks = null; + TrustStoreDescriptor temporaryDesc = this.descriptor; + Set certs = csRef.get(); + if (certs != null) { + if (descriptor.equals(temporaryDesc)) { + return certs; + } else { + // Use the new descriptor. + this.descriptor = descriptor; + } + } else { + // Try to use the cached store at first. + if (descriptor.equals(temporaryDesc)) { + ks = ksRef.get(); + } else { + // Use the new descriptor. + this.descriptor = descriptor; + } + } + + // Reload the trust store if needed. + if (ks == null) { + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reload the trust store"); + } + ks = loadKeyStore(descriptor); + } + + // Reload trust certs from the key store. + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reload trust certs"); + } + + certs = loadTrustedCerts(ks); + if ((debug != null) && Debug.isOn("trustmanager")) { + System.out.println("Reloaded " + certs.size() + " trust certs"); + } + + // Note that as ks is a local variable, it is not + // necessary to add it to the ksRef weak reference. + this.csRef = new WeakReference<>(certs); + + return certs; + } + + /** + * Load the the KeyStore as described in the specified descriptor. + */ + private static KeyStore loadKeyStore( + TrustStoreDescriptor descriptor) throws Exception { + if (!"NONE".equals(descriptor.storeName) && + descriptor.storeFile == null) { + + // No file available, no KeyStore available. + if (debug != null && Debug.isOn("trustmanager")) { + System.out.println("No available key store"); + } + + return null; + } + + KeyStore ks; + if (descriptor.storeProvider.isEmpty()) { + ks = KeyStore.getInstance(descriptor.storeType); + } else { + ks = KeyStore.getInstance( + descriptor.storeType, descriptor.storeProvider); + } + + char[] password = null; + if (!descriptor.storePassword.isEmpty()) { + password = descriptor.storePassword.toCharArray(); + } + + if (!"NONE".equals(descriptor.storeName)) { + try (FileInputStream fis = AccessController.doPrivileged( + new OpenFileInputStreamAction(descriptor.storeFile))) { + ks.load(fis, password); + } catch (FileNotFoundException fnfe) { + // No file available, no KeyStore available. + if (debug != null && Debug.isOn("trustmanager")) { + System.out.println( + "Not available key store: " + descriptor.storeName); + } + + return null; + } + } else { + ks.load(null, password); + } + + return ks; + } + + /** + * Load trusted certificates from the specified KeyStore. + */ + private static Set loadTrustedCerts(KeyStore ks) { + if (ks == null) { + return Collections.emptySet(); + } + + return TrustStoreUtil.getTrustedCerts(ks); + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java --- a/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,16 +68,21 @@ private static final Debug debug = Debug.getInstance("ssl"); - X509TrustManagerImpl(String validatorType, KeyStore ks) - throws KeyStoreException { + X509TrustManagerImpl(String validatorType, + Collection trustedCerts) { + this.validatorType = validatorType; this.pkixParams = null; - if (ks == null) { + + if (trustedCerts == null) { trustedCerts = Collections.emptySet(); - } else { - trustedCerts = KeyStores.getTrustedCerts(ks); } - showTrustedCerts(); + + this.trustedCerts = trustedCerts; + + if (debug != null && Debug.isOn("trustmanager")) { + showTrustedCerts(); + } } X509TrustManagerImpl(String validatorType, PKIXBuilderParameters params) { @@ -90,7 +95,10 @@ Validator v = getValidator(Validator.VAR_TLS_SERVER); trustedCerts = v.getTrustedCertificates(); serverValidator = v; - showTrustedCerts(); + + if (debug != null && Debug.isOn("trustmanager")) { + showTrustedCerts(); + } } @Override @@ -305,22 +313,20 @@ } private void showTrustedCerts() { - if (debug != null && Debug.isOn("trustmanager")) { - for (X509Certificate cert : trustedCerts) { - System.out.println("adding as trusted cert:"); - System.out.println(" Subject: " - + cert.getSubjectX500Principal()); - System.out.println(" Issuer: " - + cert.getIssuerX500Principal()); - System.out.println(" Algorithm: " - + cert.getPublicKey().getAlgorithm() - + "; Serial number: 0x" - + cert.getSerialNumber().toString(16)); - System.out.println(" Valid from " - + cert.getNotBefore() + " until " - + cert.getNotAfter()); - System.out.println(); - } + for (X509Certificate cert : trustedCerts) { + System.out.println("adding as trusted cert:"); + System.out.println(" Subject: " + + cert.getSubjectX500Principal()); + System.out.println(" Issuer: " + + cert.getIssuerX500Principal()); + System.out.println(" Algorithm: " + + cert.getPublicKey().getAlgorithm() + + "; Serial number: 0x" + + cert.getSerialNumber().toString(16)); + System.out.println(" Valid from " + + cert.getNotBefore() + " until " + + cert.getNotAfter()); + System.out.println(); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java --- a/jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.security.validator; - -import java.io.*; -import java.util.*; - -import java.security.*; -import java.security.cert.*; -import java.security.cert.Certificate; - -import sun.security.action.*; - -/** - * Collection of static utility methods related to KeyStores. - * - * @author Andreas Sterbenz - */ -public class KeyStores { - - private KeyStores() { - // empty - } - - // in the future, all accesses to the system cacerts keystore should - // go through this class. but not right now. -/* - private static final String javaHome = - (String)AccessController.doPrivileged(new GetPropertyAction("java.home")); - - private static final char SEP = File.separatorChar; - - private static KeyStore caCerts; - - private static KeyStore getKeyStore(String type, String name, - char[] password) throws IOException { - if (type == null) { - type = "JKS"; - } - try { - KeyStore ks = KeyStore.getInstance(type); - FileInputStream in = (FileInputStream)AccessController.doPrivileged - (new OpenFileInputStreamAction(name)); - ks.load(in, password); - return ks; - } catch (GeneralSecurityException e) { - // XXX - throw new IOException(); - } catch (PrivilegedActionException e) { - throw (IOException)e.getCause(); - } - } - - /** - * Return a KeyStore with the contents of the lib/security/cacerts file. - * The file is only opened once per JVM invocation and the contents - * cached subsequently. - * - public static synchronized KeyStore getCaCerts() throws IOException { - if (caCerts != null) { - return caCerts; - } - String name = javaHome + SEP + "lib" + SEP + "security" + SEP + "cacerts"; - caCerts = getKeyStore(null, name, null); - return caCerts; - } -*/ - - /** - * Return a Set with all trusted X509Certificates contained in - * this KeyStore. - */ - public static Set getTrustedCerts(KeyStore ks) { - Set set = new HashSet(); - try { - for (Enumeration e = ks.aliases(); e.hasMoreElements(); ) { - String alias = e.nextElement(); - if (ks.isCertificateEntry(alias)) { - Certificate cert = ks.getCertificate(alias); - if (cert instanceof X509Certificate) { - set.add((X509Certificate)cert); - } - } else if (ks.isKeyEntry(alias)) { - Certificate[] certs = ks.getCertificateChain(alias); - if ((certs != null) && (certs.length > 0) && - (certs[0] instanceof X509Certificate)) { - set.add((X509Certificate)certs[0]); - } - } - } - } catch (KeyStoreException e) { - // ignore - } - return set; - } - -} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/validator/TrustStoreUtil.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/validator/TrustStoreUtil.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.validator; + +import java.util.Set; +import java.util.HashSet; +import java.util.Collections; +import java.util.Enumeration; + +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.cert.X509Certificate; +import java.security.cert.Certificate; + +/** + * Collection of static utility methods related to trust anchor KeyStores. + * + * @author Andreas Sterbenz + */ +public final class TrustStoreUtil { + + private TrustStoreUtil() { + // empty + } + + /** + * Return an unmodifiable Set with all trusted X509Certificates contained + * in the specified KeyStore. + */ + public static Set getTrustedCerts(KeyStore ks) { + Set set = new HashSet<>(); + try { + for (Enumeration e = ks.aliases(); e.hasMoreElements(); ) { + String alias = e.nextElement(); + if (ks.isCertificateEntry(alias)) { + Certificate cert = ks.getCertificate(alias); + if (cert instanceof X509Certificate) { + set.add((X509Certificate)cert); + } + } else if (ks.isKeyEntry(alias)) { + Certificate[] certs = ks.getCertificateChain(alias); + if ((certs != null) && (certs.length > 0) && + (certs[0] instanceof X509Certificate)) { + set.add((X509Certificate)certs[0]); + } + } + } + } catch (KeyStoreException e) { + // ignore + // + // This should be rare, but better to log this in the future. + } + + return Collections.unmodifiableSet(set); + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/classes/sun/security/validator/Validator.java --- a/jdk/src/java.base/share/classes/sun/security/validator/Validator.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/classes/sun/security/validator/Validator.java Mon Jan 09 11:57:06 2017 -0800 @@ -166,7 +166,7 @@ */ public static Validator getInstance(String type, String variant, KeyStore ks) { - return getInstance(type, variant, KeyStores.getTrustedCerts(ks)); + return getInstance(type, variant, TrustStoreUtil.getTrustedCerts(ks)); } /** diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/share/native/libjli/java.c --- a/jdk/src/java.base/share/native/libjli/java.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/share/native/libjli/java.c Mon Jan 09 11:57:06 2017 -0800 @@ -1248,6 +1248,7 @@ char *value = NULL; int kind = GetOpt(&argc, &argv, &option, &value); jboolean has_arg = value != NULL && JLI_StrLen(value) > 0; + jboolean has_arg_any_len = value != NULL; /* * Option to set main entry point @@ -1269,7 +1270,7 @@ JLI_StrCCmp(arg, "--class-path=") == 0 || JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) { - REPORT_ERROR (has_arg, ARG_ERROR1, arg); + REPORT_ERROR (has_arg_any_len, ARG_ERROR1, arg); SetClassPath(value); mode = LM_CLASS; } else if (JLI_StrCmp(arg, "--list-modules") == 0 || diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c --- a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c Mon Jan 09 11:57:06 2017 -0800 @@ -39,10 +39,6 @@ #include #include -#if defined(__solaris__) && !defined(NAME_MAX) -#define NAME_MAX MAXNAMLEN -#endif - #include "jni.h" #include "jni_util.h" #include "jlong.h" @@ -52,13 +48,26 @@ #include "java_io_FileSystem.h" #include "java_io_UnixFileSystem.h" +#if defined(_AIX) + #if !defined(NAME_MAX) + #define NAME_MAX MAXNAMLEN + #endif + #define DIR DIR64 + #define opendir opendir64 + #define closedir closedir64 +#endif + +#if defined(__solaris__) && !defined(NAME_MAX) + #define NAME_MAX MAXNAMLEN +#endif + #if defined(_ALLBSD_SOURCE) -#define dirent64 dirent -#define readdir64_r readdir_r -#define stat64 stat -#ifndef MACOSX -#define statvfs64 statvfs -#endif + #define dirent64 dirent + #define readdir64_r readdir_r + #define stat64 stat + #ifndef MACOSX + #define statvfs64 statvfs + #endif #endif /* -- Field IDs -- */ diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/unix/native/libjava/childproc.c --- a/jdk/src/java.base/unix/native/libjava/childproc.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/unix/native/libjava/childproc.c Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,15 +62,18 @@ return c >= '0' && c <= '9'; } -#ifdef _ALLBSD_SOURCE -#define FD_DIR "/dev/fd" -#define dirent64 dirent -#define readdir64 readdir -#elif defined(_AIX) -/* AIX does not understand '/proc/self' - it requires the real process ID */ -#define FD_DIR aix_fd_dir +#if defined(_AIX) + /* AIX does not understand '/proc/self' - it requires the real process ID */ + #define FD_DIR aix_fd_dir + #define DIR DIR64 + #define opendir opendir64 + #define closedir closedir64 +#elif defined(_ALLBSD_SOURCE) + #define FD_DIR "/dev/fd" + #define dirent64 dirent + #define readdir64 readdir #else -#define FD_DIR "/proc/self/fd" + #define FD_DIR "/proc/self/fd" #endif int diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/unix/native/libjava/io_util_md.c --- a/jdk/src/java.base/unix/native/libjava/io_util_md.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/unix/native/libjava/io_util_md.c Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -226,7 +226,12 @@ if (fstat64(fd, &sb) == 0 && length > sb.st_blocks*512) { RESTARTABLE(fallocate64(fd, 0, 0, length), result); - return result; + // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS + if (result == 0) { + return 0; + } else if (errno != EOPNOTSUPP && errno != ENOSYS) { + return result; + } } #endif RESTARTABLE(ftruncate64(fd, length), result); diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/unix/native/libnet/NetworkInterface.c --- a/jdk/src/java.base/unix/native/libnet/NetworkInterface.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/unix/native/libnet/NetworkInterface.c Mon Jan 09 11:57:06 2017 -0800 @@ -219,6 +219,8 @@ netif *ifs, *curr; jboolean isCopy; const char* name_utf; + char *colonP; + char searchName[IFNAMESIZE]; jobject obj = NULL; if (name != NULL) { @@ -239,15 +241,33 @@ return NULL; } - // search the list of interfaces based on name + // search the list of interfaces based on name, + // if it is virtual sub interface search with parent first. + strncpy(searchName, name_utf, IFNAMESIZE); + searchName[IFNAMESIZE - 1] = '\0'; + colonP = strchr(searchName, ':'); + if (colonP != NULL) { + *colonP = '\0'; + } curr = ifs; while (curr != NULL) { - if (strcmp(name_utf, curr->name) == 0) { + if (strcmp(searchName, curr->name) == 0) { break; } curr = curr->next; } + // search the child list + if (colonP != NULL && curr != NULL) { + curr = curr->childs; + while (curr != NULL) { + if (strcmp(name_utf, curr->name) == 0) { + break; + } + curr = curr->next; + } + } + // if found create a NetworkInterface if (curr != NULL) { obj = createNetworkInterface(env, curr); diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c --- a/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -197,14 +197,17 @@ * any blocks which can cause a SIGBUS error if the file is subsequently * memory-mapped. */ - return handle(env, - fallocate64(fdval(env, fdo), 0, 0, size), - "Allocation failed"); -#else + // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS + int result = fallocate64(fdval(env, fdo), 0, 0, size); + if (result == 0) { + return 0; + } else if (errno != EOPNOTSUPP && errno != ENOSYS) { + return handle(env, result, "Allocation failed"); + } +#endif return handle(env, ftruncate64(fdval(env, fdo), size), "Truncation failed"); -#endif } JNIEXPORT jlong JNICALL diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c --- a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c Mon Jan 09 11:57:06 2017 -0800 @@ -81,6 +81,12 @@ #include "sun_nio_fs_UnixNativeDispatcher.h" +#if defined(_AIX) + #define DIR DIR64 + #define opendir opendir64 + #define closedir closedir64 +#endif + /** * Size of password or group entry when not available via sysconf */ @@ -264,7 +270,11 @@ my_unlinkat_func = (unlinkat_func*) dlsym(RTLD_DEFAULT, "unlinkat"); my_renameat_func = (renameat_func*) dlsym(RTLD_DEFAULT, "renameat"); my_futimesat_func = (futimesat_func*) dlsym(RTLD_DEFAULT, "futimesat"); +#if defined(_AIX) + my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir64"); +#else my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir"); +#endif #if defined(FSTATAT64_SYSCALL_AVAILABLE) /* fstatat64 missing from glibc */ diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.sql/share/classes/java/sql/DriverManager.java --- a/jdk/src/java.sql/share/classes/java/sql/DriverManager.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.sql/share/classes/java/sql/DriverManager.java Mon Jan 09 11:57:06 2017 -0800 @@ -64,7 +64,7 @@ * * *

    - * @ImplNote + * @implNote * {@code DriverManager} initialization is done lazily and looks up service * providers using the thread context class loader. The drivers loaded and * available to an application will depend on the thread context class loader of diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -275,6 +275,10 @@ dom = true; } Provider p = Security.getProvider(provider); + if (p == null) { + throw new NoSuchProviderException("No such provider: " + + provider); + } Service s = p.getService("TransformService", algorithm); if (s != null) { String value = s.getAttribute("MechanismType"); diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -305,6 +305,10 @@ } Provider p = Security.getProvider(provider); + if (p == null) { + throw new NoSuchProviderException("No such provider: " + + provider); + } Service s = p.getService("XMLSignatureFactory", mechanismType); if (s != null) { Object obj = null; diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -258,6 +258,10 @@ throw new NoSuchProviderException(); } Provider p = Security.getProvider(provider); + if (p == null) { + throw new NoSuchProviderException("No such provider: " + + provider); + } Service s = p.getService("KeyInfoFactory", mechanismType); if (s != null) { Object obj = null; diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java --- a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java Mon Jan 09 11:57:06 2017 -0800 @@ -298,7 +298,11 @@ Boolean.valueOf(integrity)}); } - intToNetworkByteOrder(recvMaxBufSize, gssInToken, 1, 3); + if (privacy || integrity) { + // Last paragraph of RFC 4752 3.1: size ... MUST be 0 if the + // client does not support any security layer + intToNetworkByteOrder(recvMaxBufSize, gssInToken, 1, 3); + } if (authzID != null) { // copy authorization id System.arraycopy(authzID, 0, gssInToken, 4, authzID.length); diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/lang/Class/getMethods/StarInheritance.java --- a/jdk/test/java/lang/Class/getMethods/StarInheritance.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/java/lang/Class/getMethods/StarInheritance.java Mon Jan 09 11:57:06 2017 -0800 @@ -49,7 +49,7 @@ interface C3 extends D3 { void m(); } interface D3 { void m() ; } -// B.m, D.m +// B.m interface A4 extends B4, C4 {} interface B4 extends D4 { void m(); } interface C4 extends D4 {} @@ -92,7 +92,7 @@ Class [] l3 = {B3.class, C3.class}; test(A3.class.getMethods(), new ArrayList(Arrays.asList(l3))); - Class [] l4 = {B4.class, D4.class}; + Class [] l4 = {B4.class}; test(A4.class.getMethods(), new ArrayList(Arrays.asList(l4))); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,15 @@ /* * @test * @run testng VarHandleTestAccessModeMethodNames + * @modules java.base/java.lang.invoke:open */ import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.lang.invoke.VarHandle; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.stream.Stream; import static org.testng.Assert.assertEquals; @@ -43,7 +46,6 @@ toArray(Object[][]::new); } - @Test(dataProvider = "accessModesProvider") public void testMethodName(VarHandle.AccessMode am) { assertEquals(am.methodName(), toMethodName(am.name())); @@ -58,4 +60,22 @@ } return s.toString(); } + + + @Test(dataProvider = "accessModesProvider") + public void testReturnType(VarHandle.AccessMode am) throws Exception { + assertEquals(getReturnType(am.methodName()), getAccessModeReturnType(am)); + } + + private static Class getReturnType(String name) throws Exception { + return VarHandle.class.getMethod(name, Object[].class).getReturnType(); + } + + private static Class getAccessModeReturnType(VarHandle.AccessMode am) throws Exception { + Field field_am_at = VarHandle.AccessMode.class.getDeclaredField("at"); + field_am_at.setAccessible(true); + Field field_at_returnType = field_am_at.getType().getDeclaredField("returnType"); + field_at_returnType.setAccessible(true); + return (Class) field_at_returnType.get(field_am_at.get(am)); + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java --- a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java Mon Jan 09 11:57:06 2017 -0800 @@ -36,9 +36,8 @@ import java.util.List; import java.util.Map; import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -55,7 +54,7 @@ for (MethodDesc expected : expectedMethods) { if (expected.isGetMethodReturn()) { try { - Method m = iface.getMethod(expected.name()); + Method m = iface.getMethod(expected.name(), expected.parameterTypes()); if (!assertMatch(expected, m)) fail(failMsg(expected, m, iface)); else @@ -72,26 +71,18 @@ public void testGetMethods(Class iface) { List foundMethods = filterObjectMethods(iface.getMethods()); MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); - Set used = new HashSet<>(); for (MethodDesc expected : expectedMethods) { boolean found = false; - for (Method m : foundMethods) { - if (used.contains(m)) - continue; - - if(expected.name().equals(m.getName()) && - expected.declaringClass() ==m.getDeclaringClass()) { - + if (assertMatch(expected, m)) { found = true; - assertMatch(expected, m); - used.add(m); break; } } - if (! found) - fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + " among " + foundMethods); + if (!found) + fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + + " among " + foundMethods); } assertEquals(foundMethods.size(), expectedMethods.length, "\non: " + iface + @@ -104,6 +95,11 @@ return false; if (expected.declaringClass() != m.getDeclaringClass()) return false; + if (!Arrays.equals(expected.parameterTypes(), m.getParameterTypes())) + return false; + if (expected.returnType() != NotSpecified.class && + expected.returnType() != m.getReturnType()) + return false; if (expected.kind() == MethodKind.ABSTRACT) assertTrue(Modifier.isAbstract(m.getModifiers()), m + " should be ABSTRACT"); @@ -128,8 +124,13 @@ } private String toMethodString(MethodDesc m) { - return m.declaringClass().getSimpleName().toString() + "." + - m.name() + "()"; + return (m.returnType() != NotSpecified.class + ? m.returnType().getSimpleName() + " " + : "") + + m.declaringClass().getSimpleName().toString() + "." + + m.name() + Stream.of(m.parameterTypes()) + .map(cl -> cl.getSimpleName()) + .collect(Collectors.joining(", ", "(", ")")); } private List toMethodStrings(MethodDesc[] m) { @@ -142,11 +143,16 @@ @Repeatable(MethodDescs.class) public @interface MethodDesc { String name(); + Class returnType() default NotSpecified.class; + Class[] parameterTypes() default {}; Class declaringClass(); MethodKind kind() default MethodKind.ABSTRACT; boolean isGetMethodReturn() default false; } + // special type marking a not-specified return type in @MethodDesc + interface NotSpecified {} + @Retention(RetentionPolicy.RUNTIME) public @interface MethodDescs { MethodDesc[] value(); @@ -172,22 +178,18 @@ @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P2 extends Jbis, Jprim {} @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P3 extends Jbis, Jprim, I {} - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) interface P4 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P5 extends J, I {} @MethodDesc(name="nonDefault", declaringClass=J.class, @@ -198,14 +200,12 @@ isGetMethodReturn=true) interface K1M extends J { void nonDefault(); } - @MethodDesc(name="nonDefault", declaringClass=I.class, - isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - interface K2 extends I, J {} + @MethodDesc(name="nonDefault", declaringClass=J.class, + isGetMethodReturn=true) + interface K2 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface K2O extends J, I {} @MethodDesc(name="nonDefault", declaringClass=K2M.class, @@ -244,21 +244,18 @@ @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2 extends M, L {} @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) interface N22 extends L, M {} @MethodDesc(name="isDefault", declaringClass=N2D.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2D extends M, L { default void isDefault() {}} @@ -277,48 +274,36 @@ @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface O1 extends L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface O2 extends M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface O3 extends N2DN, L, M {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) abstract class C1 implements L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) abstract class C2 implements M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) abstract class C3 implements N2DN, L, M {} @@ -345,88 +330,54 @@ @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R1 extends L, M, N2DN { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R2 extends M, N2DN, L { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R3 extends N2DN, L, M { void isDefault(); } - // this one is strange but logical, getMethod finds N2DN first, which is - // default but not the most specific - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=R1.class) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + isGetMethodReturn=true) interface R4 extends L, M, N2DN, R1 {} - // this one is strange but logical, getMethod finds N2DN first, which is - // default but not the most specific - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=R2.class) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + isGetMethodReturn=true) interface R5 extends M, N2DN, R2, L {} - // this one is strange but logical, getMethod finds N2DN first, which is - // default but not the most specific - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=R3.class) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) + @MethodDesc(name="isDefault", declaringClass=R3.class, + isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R6 extends N2DN, R3, L, M {} - // the following three finds the "right" one @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R7 extends L, M, R1, N2DN {} @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class, + @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R8 extends M, R2, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R9 extends R3, N2DN, L, M {} @@ -445,51 +396,40 @@ interface Z3 extends Z2, Z1 { void z(); } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) interface Z41 extends Z1, Z2, Z3 { } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) interface Z42 extends Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT) + isGetMethodReturn = true) interface Z43 extends Z3, Z1, Z2 { } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) abstract class ZC41 implements Z1, Z2, Z3 { } - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z3.class) + @MethodDesc(name="z", declaringClass=Z3.class, + isGetMethodReturn = true) abstract class ZC42 implements Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn=true) - @MethodDesc(name="z", declaringClass=Z2.class, - kind=MethodKind.DEFAULT) + isGetMethodReturn = true) abstract class ZC43 implements Z3, Z1, Z2 { } // More reabstraction + concretization interface X1 { default void x() {} } interface X2 extends X1 { void x(); } - @MethodDesc(name="x", declaringClass=X1.class, - kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="x", declaringClass=X2.class) + @MethodDesc(name="x", declaringClass=X2.class, + isGetMethodReturn=true) interface X31 extends X1, X2 {} @MethodDesc(name="x", declaringClass=X2.class, isGetMethodReturn=true) - @MethodDesc(name="x", declaringClass=X1.class, - kind=MethodKind.DEFAULT) interface X32 extends X2, X1 {} @MethodDesc(name="x", declaringClass=X3.class, @@ -524,85 +464,107 @@ interface K extends I, J { void nonDefault(); } - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ1 implements I, J, K {} - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ2 extends ZZ1 implements K, I, J {} - @MethodDesc(name="nonDefault", declaringClass=I.class, + @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ3 extends ZZ2 implements J, K, I {} - // bridges - interface B1A { Object m(); } - interface B1B extends B1A { Map m(); } + // bridges... + + interface B1 { Object m(); } + interface B2A extends B1 { Map m(); } + interface B2B extends B1 { HashMap m(); } - @MethodDesc(name="m", declaringClass=B1C.class, + @MethodDesc(name="m", returnType=Object.class, declaringClass=B3A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B3A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B3A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B1C.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B1C.class, - kind=MethodKind.DEFAULT) - interface B1C extends B1B { HashMap m(); } + interface B3A extends B2A { HashMap m(); } - @MethodDesc(name="m", declaringClass=B2.class, + @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, + isGetMethodReturn=true) + interface B4A extends B3A { HashMap m(); } + + @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B2.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, - kind=MethodKind.DEFAULT) - interface B2 extends B1C { HashMap m(); } + interface B5A2 extends B4A, B1 {} - @MethodDesc(name="m", declaringClass=B2.class, //HahsMap + @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B2.class, //Map - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, //Object - kind=MethodKind.DEFAULT) - interface B3A extends B2, B1A {} + interface B5A4A extends B4A, B3A {} + + // ... + most specific return type for getMethod from two unrelated interfaces - // this one is funny since HashMap isn't a bridge thus not a default - @MethodDesc(name="m", declaringClass=B2.class, //HashMap + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2B.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B2A.class) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B2B.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=B2.class, //Map - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, //Object - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B1C.class) //HashMap - interface B3B extends B2, B1C {} + interface B3AB extends B2A, B2B {} + + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2A.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Object.class, declaringClass=B2B.class, + kind = MethodKind.DEFAULT) + @MethodDesc(name="m", returnType=Map.class, declaringClass=B2A.class) + @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B2B.class, + isGetMethodReturn=true) + interface B3BA extends B2B, B2A {} // same name different params type interface A1 { void m(); void m(int i); void m(int i, int j); } interface A2A extends A1 { void m(); void m(int i); void m(int i, int j); } interface A2B extends A1 { void m(); void m(int i); default void m(int i, int j) {} } - @MethodDesc(name="m", declaringClass=A1.class, + @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2A.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A2A.class) - @MethodDesc(name="m", declaringClass=A2A.class) - @MethodDesc(name="m", declaringClass=A2A.class) + @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2A.class, + isGetMethodReturn=true) + @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2A.class, + isGetMethodReturn=true) interface A3A extends A1, A2A {} - @MethodDesc(name="m", declaringClass=A1.class, + @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2B.class, + isGetMethodReturn=true) + @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2B.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A2B.class) - @MethodDesc(name="m", declaringClass=A2B.class) - @MethodDesc(name="m", declaringClass=A2B.class, - kind=MethodKind.DEFAULT) + @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2B.class, + kind = MethodKind.DEFAULT, isGetMethodReturn=true) interface A3B extends A1, A2B {} + // method in directly implemented interface overrides interface method + // inherited by superclass + + interface E { void m(); } + interface F extends E { void m(); } + abstract class G implements E {} + + @MethodDesc(name="m", declaringClass=F.class, isGetMethodReturn=true) + abstract class H extends G implements F {} + @DataProvider public Object[][] getCases() { return CASES; } public static final Class[][] CASES = { @@ -680,12 +642,16 @@ { XC42.class }, { XC43.class }, - { B1C.class }, - { B2.class }, { B3A.class }, - { B3B.class }, + { B4A.class }, + { B5A2.class }, + { B5A4A.class }, + { B3AB.class }, + { B3BA.class }, { A3A.class }, { A3B.class }, + + { H.class }, }; } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/lang/reflect/PublicMethods/Case1.results --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/PublicMethods/Case1.results Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,1379 @@ +0,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,0,0#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,0,0#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,1,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m, J.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m, J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,1,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,2,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[J.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=J.m +1,0,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,2,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=J.m|K.gMs=[J.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,3,0#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[I.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=I.m +1,0,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=I.m|K.gMs=[I.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,3,0#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=-|K.gMs=[]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,1#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,1#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,1,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,1,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,2,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,2,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,1#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,1#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,2#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,2#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,1,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,1,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,2,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,2,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,2#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,1,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=K.m +1,0,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[I.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=I.m|E.gM=E.m +1,0,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,2,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[K.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=K.m +1,0,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,2#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,0,3#J.gMs=[]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,0,3#J.gMs=[]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=-|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,0,3,3#J.gMs=[J.m]|I.gMs=[]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=-|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=- +1,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +2,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +3,0,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[C.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=C.m +0,1,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,1,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,1,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,2,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +1,2,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +2,2,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,3,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=D.m +3,3,0,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[D.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=D.m +0,0,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,1,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +1,0,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +2,0,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,1,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,1,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,1,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,2,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +1,2,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +2,2,2,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m +0,0,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=-|E.gM=E.m +3,0,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[C.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=C.m|E.gM=E.m +0,3,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=-|D.gM=D.m|E.gM=E.m +3,3,3,3,3,3#J.gMs=[J.m]|I.gMs=[I.m]|C.gMs=[C.m]|E.gMs=[E.m]|D.gMs=[D.m]|J.gM=J.m|I.gM=I.m|K.gM=K.m|K.gMs=[K.m]|C.gM=C.m|D.gM=D.m|E.gM=E.m diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.FileObject; +import javax.tools.ForwardingJavaFileManager; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UncheckedIOException; +import java.lang.reflect.Method; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toMap; + +/* + * @test + * @bug 8062389 + * @summary Nearly exhaustive test of Class.getMethod() and Class.getMethods() + * @run main PublicMethodsTest + */ +public class PublicMethodsTest { + + public static void main(String[] args) { + Case c = new Case1(); + + int[] diffs = new int[1]; + try (Stream>> + expected = expectedResults(c)) { + diffResults(c, expected) + .forEach(diff -> { + System.out.println(diff); + diffs[0]++; + }); + } + + if (diffs[0] > 0) { + throw new RuntimeException( + "There were " + diffs[0] + " differences."); + } + } + + // use this to generate .results file for particular case + public static class Generate { + public static void main(String[] args) { + Case c = new Case1(); + dumpResults(generateResults(c)) + .forEach(System.out::println); + } + } + + interface Case { + Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\$\\{(.+?)}"); + + // possible variants of interface method + List INTERFACE_METHODS = List.of( + "", "void m();", "default void m() {}", "static void m() {}" + ); + + // possible variants of class method + List CLASS_METHODS = List.of( + "", "public abstract void m();", + "public void m() {}", "public static void m() {}" + ); + + // template with placeholders parsed with PLACEHOLDER_PATTERN + String template(); + + // map of replacementKey (== PLACEHOLDER_PATTERN captured group #1) -> + // list of possible replacements + Map> replacements(); + + // ordered list of replacement keys + List replacementKeys(); + + // names of types occurring in the template + List classNames(); + } + + static class Case1 implements Case { + + private static final String TEMPLATE = Stream.of( + "interface I { ${I} }", + "interface J { ${J} }", + "interface K extends I, J { ${K} }", + "abstract class C { ${C} }", + "abstract class D extends C implements I { ${D} }", + "abstract class E extends D implements J, K { ${E} }" + ).collect(joining("\n")); + + private static final Map> REPLACEMENTS = Map.of( + "I", INTERFACE_METHODS, + "J", INTERFACE_METHODS, + "K", INTERFACE_METHODS, + "C", CLASS_METHODS, + "D", CLASS_METHODS, + "E", CLASS_METHODS + ); + + private static final List REPLACEMENT_KEYS = REPLACEMENTS + .keySet().stream().sorted().collect(Collectors.toList()); + + @Override + public String template() { + return TEMPLATE; + } + + @Override + public Map> replacements() { + return REPLACEMENTS; + } + + @Override + public List replacementKeys() { + return REPLACEMENT_KEYS; + } + + @Override + public List classNames() { + // just by accident, names of classes are equal to replacement keys + // (this need not be the case in general) + return REPLACEMENT_KEYS; + } + } + + // generate all combinations as a tuple of indexes into lists of + // replacements. The index of the element in int[] tuple represents the index + // of the key in replacementKeys() list. The value of the element in int[] tuple + // represents the index of the replacement string in list of strings in the + // value of the entry of replacements() map with the corresponding key. + static Stream combinations(Case c) { + int[] sizes = c.replacementKeys().stream() + .mapToInt(key -> c.replacements().get(key).size()) + .toArray(); + + return Stream.iterate( + new int[sizes.length], + state -> state != null, + state -> { + int[] newState = state.clone(); + for (int i = 0; i < state.length; i++) { + if (++newState[i] < sizes[i]) { + return newState; + } + newState[i] = 0; + } + // wrapped-around + return null; + } + ); + } + + // given the combination of indexes, return the expanded template + static String expandTemplate(Case c, int[] combination) { + + // 1st create a map: key -> replacement string + Map map = new HashMap<>(combination.length * 4 / 3 + 1); + for (int i = 0; i < combination.length; i++) { + String key = c.replacementKeys().get(i); + String repl = c.replacements().get(key).get(combination[i]); + map.put(key, repl); + } + + return Case.PLACEHOLDER_PATTERN + .matcher(c.template()) + .replaceAll(match -> map.get(match.group(1))); + } + + /** + * compile expanded template into a ClassLoader that sees compiled classes + */ + static ClassLoader compile(String source) throws CompileException { + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + if (javac == null) { + throw new AssertionError("No Java compiler tool found."); + } + + ErrorsCollector errorsCollector = new ErrorsCollector(); + StandardJavaFileManager standardJavaFileManager = + javac.getStandardFileManager(errorsCollector, Locale.ROOT, + Charset.forName("UTF-8")); + TestFileManager testFileManager = new TestFileManager( + standardJavaFileManager, source); + + JavaCompiler.CompilationTask javacTask; + try { + javacTask = javac.getTask( + null, // use System.err + testFileManager, + errorsCollector, + null, + null, + List.of(testFileManager.getJavaFileForInput( + StandardLocation.SOURCE_PATH, + TestFileManager.TEST_CLASS_NAME, + JavaFileObject.Kind.SOURCE)) + ); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + + javacTask.call(); + + if (errorsCollector.hasError()) { + throw new CompileException(errorsCollector.getErrors()); + } + + return new TestClassLoader(ClassLoader.getSystemClassLoader(), + testFileManager); + } + + static class CompileException extends Exception { + CompileException(List> diagnostics) { + super(diagnostics.stream() + .map(diag -> diag.toString()) + .collect(Collectors.joining("\n"))); + } + } + + static class TestFileManager + extends ForwardingJavaFileManager { + static final String TEST_CLASS_NAME = "Test"; + + private final String testSource; + private final Map classes = new HashMap<>(); + + TestFileManager(StandardJavaFileManager fileManager, String source) { + super(fileManager); + testSource = "public class " + TEST_CLASS_NAME + " {}\n" + + source; // the rest of classes are package-private + } + + @Override + public JavaFileObject getJavaFileForInput(Location location, + String className, + JavaFileObject.Kind kind) + throws IOException { + if (location == StandardLocation.SOURCE_PATH && + kind == JavaFileObject.Kind.SOURCE && + TEST_CLASS_NAME.equals(className)) { + return new SourceFileObject(className, testSource); + } + return super.getJavaFileForInput(location, className, kind); + } + + private static class SourceFileObject extends SimpleJavaFileObject { + private final String source; + + SourceFileObject(String className, String source) { + super( + URI.create("memory:/src/" + + className.replace('.', '/') + ".java"), + Kind.SOURCE + ); + this.source = source; + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, + String className, + JavaFileObject.Kind kind, + FileObject sibling) + throws IOException { + if (kind == JavaFileObject.Kind.CLASS) { + ClassFileObject cfo = new ClassFileObject(className); + classes.put(className, cfo); + return cfo; + } + return super.getJavaFileForOutput(location, className, kind, sibling); + } + + private static class ClassFileObject extends SimpleJavaFileObject { + final String className; + ByteArrayOutputStream byteArrayOutputStream; + + ClassFileObject(String className) { + super( + URI.create("memory:/out/" + + className.replace('.', '/') + ".class"), + Kind.CLASS + ); + this.className = className; + } + + @Override + public OutputStream openOutputStream() throws IOException { + return byteArrayOutputStream = new ByteArrayOutputStream(); + } + + byte[] getBytes() { + if (byteArrayOutputStream == null) { + throw new IllegalStateException( + "No class file written for class: " + className); + } + return byteArrayOutputStream.toByteArray(); + } + } + + byte[] getClassBytes(String className) { + ClassFileObject cfo = classes.get(className); + return (cfo == null) ? null : cfo.getBytes(); + } + } + + static class ErrorsCollector implements DiagnosticListener { + private final List> errors = new ArrayList<>(); + + @Override + public void report(Diagnostic diagnostic) { + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { + errors.add(diagnostic); + } + } + + boolean hasError() { + return !errors.isEmpty(); + } + + List> getErrors() { + return errors; + } + } + + static class TestClassLoader extends ClassLoader { + private final TestFileManager fileManager; + + public TestClassLoader(ClassLoader parent, TestFileManager fileManager) { + super(parent); + this.fileManager = fileManager; + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + byte[] classBytes = fileManager.getClassBytes(name); + if (classBytes == null) { + throw new ClassNotFoundException(name); + } + return defineClass(name, classBytes, 0, classBytes.length); + } + } + + static Map generateResult(Case c, ClassLoader cl) { + return + c.classNames() + .stream() + .map(cn -> { + try { + return Class.forName(cn, false, cl); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Class not found: " + cn, e); + } + }) + .flatMap(clazz -> Stream.of( + Map.entry(clazz.getName() + ".gM", generateGetMethodResult(clazz)), + Map.entry(clazz.getName() + ".gMs", generateGetMethodsResult(clazz)) + )) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + static String generateGetMethodResult(Class clazz) { + try { + Method m = clazz.getMethod("m"); + return m.getDeclaringClass().getName() + "." + m.getName(); + } catch (NoSuchMethodException e) { + return "-"; + } + } + + static String generateGetMethodsResult(Class clazz) { + return Stream.of(clazz.getMethods()) + .filter(m -> m.getDeclaringClass() != Object.class) + .map(m -> m.getDeclaringClass().getName() + + "." + m.getName()) + .collect(Collectors.joining(", ", "[", "]")); + } + + static Stream>> generateResults(Case c) { + return combinations(c) + .flatMap(comb -> { + String src = expandTemplate(c, comb); + ClassLoader cl; + try { + cl = compile(src); + } catch (CompileException e) { + // ignore uncompilable combinations + return Stream.empty(); + } + // compilation was successful -> generate result + return Stream.of(Map.entry( + comb, + generateResult(c, cl) + )); + }); + } + + static Stream>> expectedResults(Case c) { + try { + BufferedReader r = new BufferedReader(new InputStreamReader( + c.getClass().getResourceAsStream( + c.getClass().getSimpleName() + ".results"), + "UTF-8" + )); + + return parseResults(r.lines()) + .onClose(() -> { + try { + r.close(); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + }); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + static Stream>> parseResults( + Stream lines + ) { + return lines + .map(l -> l.split(Pattern.quote("#"))) + .map(lkv -> Map.entry( + Stream.of(lkv[0].split(Pattern.quote(","))) + .mapToInt(Integer::parseInt) + .toArray(), + Stream.of(lkv[1].split(Pattern.quote("|"))) + .map(e -> e.split(Pattern.quote("="))) + .collect(toMap(ekv -> ekv[0], ekv -> ekv[1])) + )); + } + + static Stream dumpResults( + Stream>> results + ) { + return results + .map(le -> + IntStream.of(le.getKey()) + .mapToObj(String::valueOf) + .collect(joining(",")) + + "#" + + le.getValue().entrySet().stream() + .map(e -> e.getKey() + "=" + e.getValue()) + .collect(joining("|")) + ); + } + + static Stream diffResults( + Case c, + Stream>> expectedResults + ) { + return expectedResults + .flatMap(exp -> { + int[] comb = exp.getKey(); + Map expected = exp.getValue(); + + String src = expandTemplate(c, comb); + ClassLoader cl; + try { + cl = compile(src); + } catch (CompileException ce) { + return Stream.of(src + "\n" + + "got compilation error: " + ce); + } + + Map actual = generateResult(c, cl); + if (actual.equals(expected)) { + return Stream.empty(); + } else { + Map diff = new HashMap<>(expected); + diff.entrySet().removeAll(actual.entrySet()); + return Stream.of( + diff.entrySet() + .stream() + .map(e -> "expected: " + e.getKey() + ": " + + e.getValue() + "\n" + + " actual: " + e.getKey() + ": " + + actual.get(e.getKey()) + "\n") + .collect(joining("\n", src + "\n\n", "\n")) + ); + } + }); + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8168840 + * @summary InetAddress.getByName() throws java.net.UnknownHostException no such + * interface when used with virtual interfaces on Solaris + */ +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.Enumeration; + +public class SubNetworkInterfaceTest { + + public static void main(String args[]) throws SocketException, UnknownHostException { + Enumeration nets = NetworkInterface.getNetworkInterfaces(); + for (NetworkInterface netIf : Collections.list(nets)) { + doReverseLookup(netIf); + } + } + + static void doReverseLookup(NetworkInterface netIf) throws SocketException, UnknownHostException { + for (NetworkInterface subIf : Collections.list(netIf.getSubInterfaces())) { + Enumeration subInetAddresses = subIf.getInetAddresses(); + while (subInetAddresses != null && subInetAddresses.hasMoreElements()) { + InetAddress inetAddress = subInetAddresses.nextElement(); + String reversalString = inetAddress.getHostAddress(); + //should not throw UHE in case of virtual sub interface + InetAddress.getByName(reversalString); + } + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java --- a/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java Mon Jan 09 11:57:06 2017 -0800 @@ -26,7 +26,7 @@ * @summary Stress test connections through the loopback interface * @run main StressLoopback * @run main/othervm -Djdk.net.useFastTcpLoopback StressLoopback - * @key randomness + * @key randomness intermittent */ import java.nio.ByteBuffer; diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java --- a/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,8 @@ static final String ACTIVATION = "sun.rmi.server.Activation"; // children should exit in at least this time. - static long TIME_OUT = 15000; + private static final long TIME_OUT = + (long)(15000 * TestLibrary.getTimeoutFactor()); public AltSecurityManager(int port) { if (port <= 0) { diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java --- a/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java Mon Jan 09 11:57:06 2017 -0800 @@ -22,7 +22,7 @@ /* * @test - * @bug 8049429 + * @bug 8049429 8172273 * @modules java.management * jdk.crypto.ec/sun.security.ec * @summary Test that all cipher suites work in all versions and all client @@ -30,6 +30,21 @@ * and all checking is done on the client side. * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java * @run main/othervm + * -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCLIENT_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 + * TestJSSE + * @run main/othervm + * -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCLIENT_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCIPHER=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + * TestJSSE + * @run main/othervm + * -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCLIENT_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2 + * -DCIPHER=TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * TestJSSE + * @run main/othervm * -DSERVER_PROTOCOL=SSLv3 * -DCLIENT_PROTOCOL=SSLv3 * -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java --- a/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java Mon Jan 09 11:57:06 2017 -0800 @@ -31,7 +31,7 @@ * @bug 7109274 * @summary Consider disabling support for X.509 certificates with RSA keys * less than 1024 bits - * + * @library /javax/net/ssl/templates * @run main/othervm DisabledShortRSAKeys PKIX TLSv1.2 * @run main/othervm DisabledShortRSAKeys SunX509 TLSv1.2 * @run main/othervm DisabledShortRSAKeys PKIX TLSv1.1 @@ -56,20 +56,7 @@ import java.util.Base64; -public class DisabledShortRSAKeys { - - /* - * ============================================================= - * Set the various variables needed for the tests, then - * specify what tests to run on each side. - */ - - /* - * Should we run the client or server in a separate thread? - * Both sides can throw exceptions, but do you have a preference - * as to which side should be the main thread. - */ - static boolean separateServerThread = true; +public class DisabledShortRSAKeys extends SSLSocketTemplate { /* * Where do we find the keystores? @@ -123,81 +110,50 @@ static char passphrase[] = "passphrase".toCharArray(); /* - * Is the server ready to serve? - */ - volatile static boolean serverReady = false; - - /* * Turn on SSL debugging? */ static boolean debug = false; - /* - * Define the server side of the test. - * - * If the server prematurely exits, serverReady will be set to true - * to avoid infinite hangs. - */ - void doServerSide() throws Exception { - SSLContext context = generateSSLContext(null, targetCertStr, - targetPrivateKey); - SSLServerSocketFactory sslssf = context.getServerSocketFactory(); - SSLServerSocket sslServerSocket = - (SSLServerSocket)sslssf.createServerSocket(serverPort); - serverPort = sslServerSocket.getLocalPort(); + @Override + protected SSLContext createClientSSLContext() throws Exception { + return generateSSLContext(trustedCertStr, null, null); + } - /* - * Signal Client, we're ready for his connect. - */ - serverReady = true; + @Override + protected SSLContext createServerSSLContext() throws Exception { + return generateSSLContext(null, targetCertStr, targetPrivateKey); + } - try (SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept()) { - try (InputStream sslIS = sslSocket.getInputStream()) { + @Override + protected void runServerApplication(SSLSocket socket) throws Exception { + try { + try (InputStream sslIS = socket.getInputStream()) { sslIS.read(); } - - throw new Exception( - "RSA keys shorter than 1024 bits should be disabled"); + throw new Exception("RSA keys shorter than 1024 bits should be disabled"); } catch (SSLHandshakeException sslhe) { // the expected exception, ignore } + } - /* - * Define the client side of the test. - * - * If the server prematurely exits, serverReady will be set to true - * to avoid infinite hangs. - */ - void doClientSide() throws Exception { + @Override + protected void runClientApplication(SSLSocket socket) throws Exception { - /* - * Wait for server to get started. - */ - while (!serverReady) { - Thread.sleep(50); - } - - SSLContext context = generateSSLContext(trustedCertStr, null, null); - SSLSocketFactory sslsf = context.getSocketFactory(); - - try (SSLSocket sslSocket = - (SSLSocket)sslsf.createSocket("localhost", serverPort)) { + try { // only enable the target protocol - sslSocket.setEnabledProtocols(new String[] {enabledProtocol}); - + socket.setEnabledProtocols(new String[] { enabledProtocol }); // enable a block cipher - sslSocket.setEnabledCipherSuites( - new String[] {"TLS_DHE_RSA_WITH_AES_128_CBC_SHA"}); + socket.setEnabledCipherSuites( + new String[] { "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" }); - try (OutputStream sslOS = sslSocket.getOutputStream()) { + try (OutputStream sslOS = socket.getOutputStream()) { sslOS.write('B'); sslOS.flush(); } - throw new Exception( - "RSA keys shorter than 1024 bits should be disabled"); + "RSA keys shorter than 1024 bits should be disabled"); } catch (SSLHandshakeException sslhe) { // the expected exception, ignore } @@ -207,16 +163,16 @@ * ============================================================= * The remainder is just support stuff */ - private static String tmAlgorithm; // trust manager - private static String enabledProtocol; // the target protocol + private static String tmAlgorithm; // trust manager + private static String enabledProtocol; // the target protocol private static void parseArguments(String[] args) { - tmAlgorithm = args[0]; - enabledProtocol = args[1]; + tmAlgorithm = args[0]; + enabledProtocol = args[1]; } private static SSLContext generateSSLContext(String trustedCertStr, - String keyCertStr, String keySpecStr) throws Exception { + String keyCertStr, String keySpecStr) throws Exception { // generate certificate from cert string CertificateFactory cf = CertificateFactory.getInstance("X.509"); @@ -239,10 +195,10 @@ if (keyCertStr != null) { // generate the private key. PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(keySpecStr)); + Base64.getMimeDecoder().decode(keySpecStr)); KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPrivateKey priKey = - (RSAPrivateKey)kf.generatePrivate(priKeySpec); + (RSAPrivateKey)kf.generatePrivate(priKeySpec); // generate certificate chain is = new ByteArrayInputStream(keyCertStr.getBytes()); @@ -281,13 +237,6 @@ return ctx; } - - // use any free port by default - volatile int serverPort = 0; - - volatile Exception serverException = null; - volatile Exception clientException = null; - public static void main(String[] args) throws Exception { if (debug) System.setProperty("javax.net.debug", "all"); @@ -300,142 +249,7 @@ /* * Start the tests. */ - new DisabledShortRSAKeys(); + new DisabledShortRSAKeys().run(); } - Thread clientThread = null; - Thread serverThread = null; - - /* - * Primary constructor, used to drive remainder of the test. - * - * Fork off the other side, then do your work. - */ - DisabledShortRSAKeys() throws Exception { - Exception startException = null; - try { - if (separateServerThread) { - startServer(true); - startClient(false); - } else { - startClient(true); - startServer(false); - } - } catch (Exception e) { - startException = e; - } - - /* - * Wait for other side to close down. - */ - if (separateServerThread) { - if (serverThread != null) { - serverThread.join(); - } - } else { - if (clientThread != null) { - clientThread.join(); - } - } - - /* - * When we get here, the test is pretty much over. - * Which side threw the error? - */ - Exception local; - Exception remote; - - if (separateServerThread) { - remote = serverException; - local = clientException; - } else { - remote = clientException; - local = serverException; - } - - Exception exception = null; - - /* - * Check various exception conditions. - */ - if ((local != null) && (remote != null)) { - // If both failed, return the curthread's exception. - local.initCause(remote); - exception = local; - } else if (local != null) { - exception = local; - } else if (remote != null) { - exception = remote; - } else if (startException != null) { - exception = startException; - } - - /* - * If there was an exception *AND* a startException, - * output it. - */ - if (exception != null) { - if (exception != startException && startException != null) { - exception.addSuppressed(startException); - } - throw exception; - } - - // Fall-through: no exception to throw! - } - - void startServer(boolean newThread) throws Exception { - if (newThread) { - serverThread = new Thread() { - public void run() { - try { - doServerSide(); - } catch (Exception e) { - /* - * Our server thread just died. - * - * Release the client, if not active already... - */ - System.err.println("Server died..."); - serverReady = true; - serverException = e; - } - } - }; - serverThread.start(); - } else { - try { - doServerSide(); - } catch (Exception e) { - serverException = e; - } finally { - serverReady = true; - } - } - } - - void startClient(boolean newThread) throws Exception { - if (newThread) { - clientThread = new Thread() { - public void run() { - try { - doClientSide(); - } catch (Exception e) { - /* - * Our client thread just died. - */ - System.err.println("Client died..."); - clientException = e; - } - } - }; - clientThread.start(); - } else { - try { - doClientSide(); - } catch (Exception e) { - clientException = e; - } - } - } } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172003 + * @summary Test that TransformService.getInstance() throws a + * NoSuchProviderException when provider is unknown + * @run main UnknownProvider + */ + +import javax.xml.crypto.dsig.TransformService; +import javax.xml.crypto.dsig.Transform; +import java.security.NoSuchProviderException; +import java.security.NoSuchAlgorithmException; + +public class UnknownProvider { + + public static void main(String[] args) throws NoSuchAlgorithmException { + try { + TransformService ts = TransformService.getInstance( + Transform.BASE64, "DOM", "SomeProviderThatDoesNotExist"); + } + catch(NoSuchProviderException e) { + // this is expected + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172003 + * @summary Test that XMLSignatureFactory.getInstance() throws a + * NoSuchProviderException when provider is unknown + * @run main UnknownProvider + */ + +import javax.xml.crypto.dsig.XMLSignatureFactory; +import java.security.NoSuchProviderException; + +public class UnknownProvider { + + public static void main(String[] args) { + try { + XMLSignatureFactory sf = XMLSignatureFactory.getInstance( + "DOM", "SomeProviderThatDoesNotExist"); + } + catch(NoSuchProviderException e) { + // this is expected + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8172003 + * @summary Test that KeyInfoFactory.getInstance() throws a + * NoSuchProviderException when provider is unknown + * @run main UnknownProvider + */ + +import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory; +import java.security.NoSuchProviderException; + +public class UnknownProvider { + + public static void main(String[] args) { + try { + KeyInfoFactory fac = KeyInfoFactory.getInstance( + "DOM", "SomeProviderThatDoesNotExist"); + } + catch(NoSuchProviderException e) { + // this is expected + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh --- a/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Mon Jan 09 11:57:06 2017 -0800 @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,12 @@ # -if [ "x$TESTJAVA" = x ]; then - TESTJAVA=$1; shift +if [ "x$COMPILEJAVA" = x ]; then + COMPILEJAVA=$1; shift TESTCLASSES=. fi echo "compiling [test-service.wsdl] wsdl ..." -$TESTJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl +$COMPILEJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl echo "WSDL compiled. Main test class Test.java can be compiled now." diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/lib/testlibrary/ModuleInfoMaker.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/testlibrary/ModuleInfoMaker.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.testng.Assert.assertTrue; + +/** + * Utility class for creating test modules. + */ +public class ModuleInfoMaker { + private static String MODULE_INFO_JAVA = "module-info.java"; + private static Pattern MODULE_PATTERN = + Pattern.compile("module\\s+((?:\\w+\\.)*)"); + private static Pattern PACKAGE_PATTERN = + Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))"); + private static Pattern CLASS_PATTERN = + Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); + + private final Path dir; + public ModuleInfoMaker(Path dir) { + this.dir = dir; + } + + /** + * Create java source files of the given module + */ + public void writeJavaFiles(String module, String moduleInfoJava, String... contents) + throws IOException + { + Path msrc = dir.resolve(module); + new JavaSource(moduleInfoJava).write(msrc); + for (String c : contents) { + new JavaSource(c).write(msrc); + } + } + + /** + * Compile the module to the given destination. + */ + public void compile(String module, Path dest, String... options) + throws IOException + { + Path msrc = dir.resolve(module); + Stream args = + Stream.concat(Arrays.stream(options), + Stream.of("--module-source-path", + dir.toString())); + assertTrue(CompilerUtils.compile(msrc, dest, args.toArray(String[]::new)), + "Fail to compile " + module); + } + + static class JavaSource { + final String source; + JavaSource(String source) { + this.source = source; + } + + /** + * Writes the source code to a file in a specified directory. + * @param dir the directory + * @throws IOException if there is a problem writing the file + */ + public void write(Path dir) throws IOException { + Path file = dir.resolve(getJavaFileNameFromSource(source)); + Files.createDirectories(file.getParent()); + try (BufferedWriter out = Files.newBufferedWriter(file)) { + out.write(source.replace("\n", System.lineSeparator())); + } + } + + /** + * Extracts the Java file name from the class declaration. + * This method is intended for simple files and uses regular expressions, + * so comments matching the pattern can make the method fail. + */ + static String getJavaFileNameFromSource(String source) { + String packageName = null; + + Matcher matcher = MODULE_PATTERN.matcher(source); + if (matcher.find()) + return MODULE_INFO_JAVA; + + matcher = PACKAGE_PATTERN.matcher(source); + if (matcher.find()) + packageName = matcher.group(1).replace(".", "/"); + + matcher = CLASS_PATTERN.matcher(source); + if (matcher.find()) { + String className = matcher.group(1) + ".java"; + return (packageName == null) ? className : packageName + "/" + className; + } else if (packageName != null) { + return packageName + "/package-info.java"; + } else { + throw new Error("Could not extract the java class " + + "name from the provided source"); + } + } + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/lib/testlibrary/ModuleSourceBuilder.java --- a/jdk/test/lib/testlibrary/ModuleSourceBuilder.java Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.io.BufferedWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Stream; - -import static org.testng.Assert.assertTrue; - -/** - * Utility class for creating test modules. - */ -public class ModuleSourceBuilder { - private static String MODULE_INFO_JAVA = "module-info.java"; - private static Pattern MODULE_PATTERN = - Pattern.compile("module\\s+((?:\\w+\\.)*)"); - private static Pattern PACKAGE_PATTERN = - Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))"); - private static Pattern CLASS_PATTERN = - Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); - - private final Path dir; - public ModuleSourceBuilder(Path dir) { - this.dir = dir; - } - - /** - * Create java source files of the given module - */ - public void writeJavaFiles(String module, String moduleInfoJava, String... contents) - throws IOException - { - Path msrc = dir.resolve(module); - new JavaSource(moduleInfoJava).write(msrc); - for (String c : contents) { - new JavaSource(c).write(msrc); - } - } - - /** - * Compile the module to the given destination. - */ - public void compile(String module, Path dest, String... options) - throws IOException - { - Path msrc = dir.resolve(module); - Stream args = - Stream.concat(Arrays.stream(options), - Stream.of("--module-source-path", - dir.toString())); - assertTrue(CompilerUtils.compile(msrc, dest, args.toArray(String[]::new)), - "Fail to compile " + module); - } - - static class JavaSource { - final String source; - JavaSource(String source) { - this.source = source; - } - - /** - * Writes the source code to a file in a specified directory. - * @param dir the directory - * @throws IOException if there is a problem writing the file - */ - public void write(Path dir) throws IOException { - Path file = dir.resolve(getJavaFileNameFromSource(source)); - Files.createDirectories(file.getParent()); - try (BufferedWriter out = Files.newBufferedWriter(file)) { - out.write(source.replace("\n", System.lineSeparator())); - } - } - - /** - * Extracts the Java file name from the class declaration. - * This method is intended for simple files and uses regular expressions, - * so comments matching the pattern can make the method fail. - */ - static String getJavaFileNameFromSource(String source) { - String packageName = null; - - Matcher matcher = MODULE_PATTERN.matcher(source); - if (matcher.find()) - return MODULE_INFO_JAVA; - - matcher = PACKAGE_PATTERN.matcher(source); - if (matcher.find()) - packageName = matcher.group(1).replace(".", "/"); - - matcher = CLASS_PATTERN.matcher(source); - if (matcher.find()) { - String className = matcher.group(1) + ".java"; - return (packageName == null) ? className : packageName + "/" + className; - } else if (packageName != null) { - return packageName + "/package-info.java"; - } else { - throw new Error("Could not extract the java class " + - "name from the provided source"); - } - } - } -} diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,27 +21,32 @@ * questions. */ -/* - * This test is run using PostThruProxy.sh - */ - import java.io.*; import java.net.*; import java.security.KeyStore; import javax.net.*; import javax.net.ssl.*; -import java.security.cert.*; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; /* - * This test case is written to test the https POST through a proxy. - * There is no proxy authentication done. - * - * PostThruProxy.java -- includes a simple server that serves - * http POST method requests in secure channel, and a client - * that makes https POST request through a proxy. + * @test + * @bug 4423074 + * @modules java.base/sun.net.www + * @summary This test case is written to test the https POST through a proxy. + * There is no proxy authentication done. It includes a simple server + * that serves http POST method requests in secure channel, and a client + * that makes https POST request through a proxy. + * @library /test/lib + * @compile OriginServer.java ProxyTunnelServer.java + * @run main/othervm PostThruProxy */ +public class PostThruProxy { -public class PostThruProxy { + private static final String TEST_SRC = System.getProperty("test.src", "."); + private static final int TIMEOUT = 30000; + /* * Where do we find the keystores? */ @@ -76,14 +81,10 @@ /* * Main method to create the server and client */ - public static void main(String args[]) throws Exception - { - String keyFilename = - args[1] + "/" + pathToStores + - "/" + keyStoreFile; - String trustFilename = - args[1] + "/" + pathToStores + - "/" + trustStoreFile; + public static void main(String args[]) throws Exception { + String keyFilename = TEST_SRC + "/" + pathToStores + "/" + keyStoreFile; + String trustFilename = TEST_SRC + "/" + pathToStores + "/" + + trustStoreFile; System.setProperty("javax.net.ssl.keyStore", keyFilename); System.setProperty("javax.net.ssl.keyStorePassword", passwd); @@ -95,10 +96,9 @@ * setup the server */ try { - ServerSocketFactory ssf = - PostThruProxy.getServerSocketFactory(useSSL); + ServerSocketFactory ssf = getServerSocketFactory(useSSL); ServerSocket ss = ssf.createServerSocket(serverPort); - ss.setSoTimeout(30000); // 30 seconds + ss.setSoTimeout(TIMEOUT); // 30 seconds serverPort = ss.getLocalPort(); new TestServer(ss); } catch (Exception e) { @@ -108,35 +108,29 @@ } // trigger the client try { - doClientSide(args[0]); + doClientSide(); } catch (Exception e) { System.out.println("Client side failed: " + e.getMessage()); throw e; - } + } } private static ServerSocketFactory getServerSocketFactory (boolean useSSL) throws Exception { if (useSSL) { - SSLServerSocketFactory ssf = null; // set up key manager to do server authentication - SSLContext ctx; - KeyManagerFactory kmf; - KeyStore ks; + SSLContext ctx = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + KeyStore ks = KeyStore.getInstance("JKS"); char[] passphrase = passwd.toCharArray(); - ctx = SSLContext.getInstance("TLS"); - kmf = KeyManagerFactory.getInstance("SunX509"); - ks = KeyStore.getInstance("JKS"); - ks.load(new FileInputStream(System.getProperty( "javax.net.ssl.keyStore")), passphrase); kmf.init(ks, passphrase); ctx.init(kmf.getKeyManagers(), null, null); - ssf = ctx.getServerSocketFactory(); - return ssf; + return ctx.getServerSocketFactory(); } else { return ServerSocketFactory.getDefault(); } @@ -147,7 +141,7 @@ */ static String postMsg = "Testing HTTP post on a https server"; - static void doClientSide(String hostname) throws Exception { + static void doClientSide() throws Exception { HostnameVerifier reservedHV = HttpsURLConnection.getDefaultHostnameVerifier(); try { @@ -162,10 +156,12 @@ */ HttpsURLConnection.setDefaultHostnameVerifier( new NameVerifier()); - URL url = new URL("https://" + hostname+ ":" + serverPort); + URL url = new URL("https://" + getHostname() +":" + serverPort); Proxy p = new Proxy(Proxy.Type.HTTP, pAddr); HttpsURLConnection https = (HttpsURLConnection)url.openConnection(p); + https.setConnectTimeout(TIMEOUT); + https.setReadTimeout(TIMEOUT); https.setDoOutput(true); https.setRequestMethod("POST"); PrintStream ps = null; @@ -190,6 +186,9 @@ if (ps != null) ps.close(); throw e; + } catch (SocketTimeoutException e) { + System.out.println("Client can not get response in time: " + + e.getMessage()); } } finally { HttpsURLConnection.setDefaultHostnameVerifier(reservedHV); @@ -210,4 +209,13 @@ pserver.start(); return new InetSocketAddress("localhost", pserver.getPort()); } + + private static String getHostname() { + try { + OutputAnalyzer oa = ProcessTools.executeCommand("hostname"); + return oa.getOutput().trim(); + } catch (Throwable e) { + throw new RuntimeException("Get hostname failed.", e); + } + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - - -# -# @test -# @bug 4423074 -# @summary Need to rebase all the duplicated classes from Merlin -# @modules java.base/sun.net.www - -HOSTNAME=`uname -n` -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin | AIX ) - PS=":" - FS="/" - ;; - CYGWIN* ) - PS=";" - FS="/" - ;; - Windows* ) - PS=";" - FS="\\" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED" - -${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . \ - ${TESTSRC}${FS}OriginServer.java \ - ${TESTSRC}${FS}ProxyTunnelServer.java \ - ${TESTSRC}${FS}PostThruProxy.java -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} ${EXTRAOPTS} \ - PostThruProxy ${HOSTNAME} ${TESTSRC} -exit diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,27 +21,31 @@ * questions. */ -/* - * This test is run through PostThruProxyWithAuth.sh - */ - import java.io.*; import java.net.*; import java.security.KeyStore; import javax.net.*; import javax.net.ssl.*; -import java.security.cert.*; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; /* - * This test case is written to test the https POST through a proxy - * with proxy authentication. - * - * PostThruProxyWithAuth.java -- includes a simple server that serves - * http POST method requests in secure channel, and a client - * that makes https POST request through a proxy. + * @test + * @bug 4423074 + * @modules java.base/sun.net.www + * @summary This test case is written to test the https POST through a proxy + * with proxy authentication. It includes a simple server that serves + * http POST method requests in secure channel, and a client that + * makes https POST request through a proxy. + * @library /test/lib + * @compile OriginServer.java ProxyTunnelServer.java + * @run main/othervm -Djdk.http.auth.tunneling.disabledSchemes= PostThruProxyWithAuth */ +public class PostThruProxyWithAuth { -public class PostThruProxyWithAuth { + private static final String TEST_SRC = System.getProperty("test.src", "."); + private static final int TIMEOUT = 30000; /* * Where do we find the keystores? @@ -78,14 +82,10 @@ /* * Main method to create the server and client */ - public static void main(String args[]) throws Exception - { - String keyFilename = - args[1] + "/" + pathToStores + - "/" + keyStoreFile; - String trustFilename = - args[1] + "/" + pathToStores + - "/" + trustStoreFile; + public static void main(String args[]) throws Exception { + String keyFilename = TEST_SRC + "/" + pathToStores + "/" + keyStoreFile; + String trustFilename = TEST_SRC + "/" + pathToStores + "/" + + trustStoreFile; System.setProperty("javax.net.ssl.keyStore", keyFilename); System.setProperty("javax.net.ssl.keyStorePassword", passwd); @@ -97,10 +97,9 @@ * setup the server */ try { - ServerSocketFactory ssf = - PostThruProxyWithAuth.getServerSocketFactory(useSSL); + ServerSocketFactory ssf = getServerSocketFactory(useSSL); ServerSocket ss = ssf.createServerSocket(serverPort); - ss.setSoTimeout(30000); // 30 seconds + ss.setSoTimeout(TIMEOUT); // 30 seconds serverPort = ss.getLocalPort(); new TestServer(ss); } catch (Exception e) { @@ -110,7 +109,7 @@ } // trigger the client try { - doClientSide(args[0]); + doClientSide(); } catch (Exception e) { System.out.println("Client side failed: " + e.getMessage()); @@ -121,24 +120,18 @@ private static ServerSocketFactory getServerSocketFactory (boolean useSSL) throws Exception { if (useSSL) { - SSLServerSocketFactory ssf = null; // set up key manager to do server authentication - SSLContext ctx; - KeyManagerFactory kmf; - KeyStore ks; + SSLContext ctx = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + KeyStore ks = KeyStore.getInstance("JKS"); char[] passphrase = passwd.toCharArray(); - ctx = SSLContext.getInstance("TLS"); - kmf = KeyManagerFactory.getInstance("SunX509"); - ks = KeyStore.getInstance("JKS"); - ks.load(new FileInputStream(System.getProperty( "javax.net.ssl.keyStore")), passphrase); kmf.init(ks, passphrase); ctx.init(kmf.getKeyManagers(), null, null); - ssf = ctx.getServerSocketFactory(); - return ssf; + return ctx.getServerSocketFactory(); } else { return ServerSocketFactory.getDefault(); } @@ -149,7 +142,7 @@ */ static String postMsg = "Testing HTTP post on a https server"; - static void doClientSide(String hostname) throws Exception { + static void doClientSide() throws Exception { /* * setup up a proxy */ @@ -161,10 +154,12 @@ */ HttpsURLConnection.setDefaultHostnameVerifier( new NameVerifier()); - URL url = new URL("https://" + hostname + ":" + serverPort); + URL url = new URL("https://" + getHostname() + ":" + serverPort); Proxy p = new Proxy(Proxy.Type.HTTP, pAddr); HttpsURLConnection https = (HttpsURLConnection)url.openConnection(p); + https.setConnectTimeout(TIMEOUT); + https.setReadTimeout(TIMEOUT); https.setDoOutput(true); https.setRequestMethod("POST"); PrintStream ps = null; @@ -188,6 +183,9 @@ if (ps != null) ps.close(); throw e; + } catch (SocketTimeoutException e) { + System.out.println("Client can not get response in time: " + + e.getMessage()); } } @@ -221,4 +219,13 @@ "test123".toCharArray()); } } + + private static String getHostname() { + try { + OutputAnalyzer oa = ProcessTools.executeCommand("hostname"); + return oa.getOutput().trim(); + } catch (Throwable e) { + throw new RuntimeException("Get hostname failed.", e); + } + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - - -# -# @test -# @bug 4423074 -# @summary Need to rebase all the duplicated classes from Merlin -# @modules java.base/sun.net.www - -HOSTNAME=`uname -n` -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin | AIX ) - PS=":" - FS="/" - ;; - CYGWIN* ) - PS=";" - FS="/" - ;; - Windows* ) - PS=";" - FS="\\" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED" -${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} \ - -d . ${TESTSRC}${FS}OriginServer.java \ - ${TESTSRC}${FS}ProxyTunnelServer.java \ - ${TESTSRC}${FS}PostThruProxyWithAuth.java -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} ${EXTRAOPTS} \ - -Djdk.http.auth.tunneling.disabledSchemes= \ - PostThruProxyWithAuth ${HOSTNAME} ${TESTSRC} -exit diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,13 +32,14 @@ import java.io.*; import java.net.*; -import javax.net.ssl.*; import javax.net.ServerSocketFactory; import sun.net.www.*; import java.util.Base64; public class ProxyTunnelServer extends Thread { + private static final int TIMEOUT = 30000; + private static ServerSocket ss = null; /* * holds the registered user's username and password @@ -64,8 +65,9 @@ public ProxyTunnelServer() throws IOException { if (ss == null) { - ss = (ServerSocket) ServerSocketFactory.getDefault(). - createServerSocket(0); + ss = (ServerSocket) ServerSocketFactory.getDefault() + .createServerSocket(0); + ss.setSoTimeout(TIMEOUT); } } @@ -86,6 +88,9 @@ try { clientSocket = ss.accept(); processRequests(); + } catch (SocketTimeoutException e) { + System.out.println( + "Proxy can not get response in time: " + e.getMessage()); } catch (Exception e) { System.out.println("Proxy Failed: " + e); e.printStackTrace(); @@ -188,8 +193,8 @@ serverToClient.start(); System.out.println("Proxy: Started tunneling......."); - clientToServer.join(); - serverToClient.join(); + clientToServer.join(TIMEOUT); + serverToClient.join(TIMEOUT); System.out.println("Proxy: Finished tunneling........"); clientToServer.close(); @@ -219,13 +224,11 @@ int BUFFER_SIZE = 400; byte[] buf = new byte[BUFFER_SIZE]; int bytesRead = 0; - int count = 0; // keep track of the amount of data transfer try { while ((bytesRead = input.read(buf)) >= 0) { output.write(buf, 0, bytesRead); output.flush(); - count += bytesRead; } } catch (IOException e) { /* @@ -236,7 +239,7 @@ } } - public void close() { + private void close() { try { if (!sockIn.isClosed()) sockIn.close(); @@ -275,7 +278,7 @@ serverPort = Integer.parseInt(connectInfo.substring(endi+1)); } catch (Exception e) { throw new IOException("Proxy recieved a request: " - + connectStr); + + connectStr, e); } serverInetAddr = InetAddress.getByName(serverName); } diff -r 05e2611ebff6 -r 65e2b10e8e80 jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java --- a/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java Fri Jan 06 16:50:50 2017 +0530 +++ b/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 7152176 8168518 + * @bug 7152176 8168518 8172017 * @summary More krb5 tests * @library ../../../../java/security/testlibrary/ /test/lib * @run main/othervm/timeout=300 ReplayCacheTestProc @@ -75,19 +75,28 @@ private static String HOST = "localhost"; private static final String SERVICE; + private static long uid; + private static String cwd; static { String tmp = System.getProperty("test.service"); SERVICE = (tmp == null) ? "service" : tmp; + uid = jdk.internal.misc.VM.geteuid(); + // Where should the rcache be saved. KRB5RCACHEDIR is not + // recognized on Solaris (might be supported on Solaris 12), + // and directory name is different when launched by root. + // See manpage krb5envvar(5) on KRB5RCNAME. + if (System.getProperty("os.name").startsWith("SunOS")) { + if (uid == 0) { + cwd = "/var/krb5/rcache/root/"; + } else { + cwd = "/var/krb5/rcache/"; + } + } else { + cwd = System.getProperty("user.dir"); + } } - // Where should the rcache be saved. It seems KRB5RCACHEDIR is not - // recognized on Solaris. Maybe version too low? I see 1.6. - private static String cwd = - System.getProperty("os.name").startsWith("SunOS") ? - "/var/krb5/rcache/" : - System.getProperty("user.dir"); - private static MessageDigest md5, sha256; static { @@ -99,7 +108,6 @@ } } - private static long uid; public static void main0(String[] args) throws Exception { System.setProperty("java.security.krb5.conf", OneKDC.KRB5_CONF); @@ -114,8 +122,6 @@ Ex[] result; int numPerType = 2; // number of acceptors per type - uid = jdk.internal.misc.VM.geteuid(); - KDC kdc = KDC.create(OneKDC.REALM, HOST, 0, true); for (int i=0; i args = new ArrayList<>(); - if (!option.isEmpty()) { - args.add(option); - } + public void testUnnamedModule(List options, String expected) + throws Throwable + { + List args = new ArrayList<>(options); args.add(TEST_MAIN); args.add(Boolean.toString(true)); args.add(expected); @@ -195,8 +196,12 @@ } private OutputAnalyzer execute(List options) throws Throwable { - ProcessBuilder pb = - createJavaProcessBuilder(options.toArray(new String[0])); + ProcessBuilder pb = createJavaProcessBuilder( + options.stream() + .map(this::autoQuote) + .toArray(String[]::new) + ); + Map env = pb.environment(); // remove CLASSPATH environment variable String value = env.remove("CLASSPATH"); @@ -205,4 +210,16 @@ .errorTo(System.out); } + private static final boolean IS_WINDOWS + = System.getProperty("os.name").startsWith("Windows"); + + /* + * Autoquote empty string argument on Windows + */ + private String autoQuote(String arg) { + if (IS_WINDOWS && arg.isEmpty()) { + return "\"\""; + } + return arg; + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/.hgtags --- a/langtools/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -392,3 +392,5 @@ 76389430a13e82a9321cdc085216f6bff526e316 jdk-9+147 586c93260d3b2f91a055b96118b141c05841694f jdk-9+148 4d4cd7cd731c1952d7330ea5bcfda8bd26820fa5 jdk-9+149 +e5a42ddaf633fde14b983f740ae0e7e490741fd1 jdk-9+150 +4f348bd05341581df84ff1510d5b3a9b5b488367 jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java --- a/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java Mon Jan 09 11:57:06 2017 -0800 @@ -84,6 +84,8 @@ JAVAC_WARNING(StringBinaryPredicate.CONTAINS, MSG_WARN, "warning:", "compiler.warn"), /** a javac note */ JAVAC_NOTE(StringBinaryPredicate.CONTAINS, MSG_INFO, "note:", "compiler.note"), + /** a javac raw error (these typically come from a build misconfiguration - such as a bad javac flag) */ + JAVAC_RAW_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "javac: "), /** continuation of some javac error message */ JAVAC_NESTED_DIAG(StringBinaryPredicate.STARTS_WITH, MSG_INFO, " "), /** a javac crash */ @@ -126,7 +128,7 @@ enum Task { /** exec task - invoked during compilation */ JAVAC("exec", MessageKind.JAVAC_ERROR, MessageKind.JAVAC_WARNING, MessageKind.JAVAC_NOTE, - MessageKind.JAVAC_NESTED_DIAG, MessageKind.JAVAC_CRASH), + MessageKind.JAVAC_RAW_ERROR, MessageKind.JAVAC_NESTED_DIAG, MessageKind.JAVAC_CRASH), /** jtreg task - invoked during test execution */ JTREG("jtreg", MessageKind.JTREG_TEST_PASSED, MessageKind.JTREG_TEST_FAILED, MessageKind.JTREG_TEST_ERROR, MessageKind.JTREG_TEST_REPORT), /** initial synthetic task when the logger is created */ diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java Mon Jan 09 11:57:06 2017 -0800 @@ -241,4 +241,21 @@ } } + /** Returns true if the given value is within the allowed range for this type. */ + public boolean checkRange(int value) { + switch (this) { + case BOOLEAN: + return 0 <= value && value <= 1; + case BYTE: + return Byte.MIN_VALUE <= value && value <= Byte.MAX_VALUE; + case CHAR: + return Character.MIN_VALUE <= value && value <= Character.MAX_VALUE; + case SHORT: + return Short.MIN_VALUE <= value && value <= Short.MAX_VALUE; + case INT: + return true; + default: + throw new AssertionError(); + } + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Mon Jan 09 11:57:06 2017 -0800 @@ -2050,19 +2050,12 @@ int value = ((Number)t.constValue()).intValue(); switch (s.getTag()) { case BYTE: - if (Byte.MIN_VALUE <= value && value <= Byte.MAX_VALUE) - return true; - break; case CHAR: - if (Character.MIN_VALUE <= value && value <= Character.MAX_VALUE) + case SHORT: + case INT: + if (s.getTag().checkRange(value)) return true; break; - case SHORT: - if (Short.MIN_VALUE <= value && value <= Short.MAX_VALUE) - return true; - break; - case INT: - return true; case CLASS: switch (unboxedType(s).getTag()) { case BYTE: @@ -3852,20 +3845,26 @@ return bounds.head; } else { // length > 1 int classCount = 0; + List cvars = List.nil(); List lowers = List.nil(); for (Type bound : bounds) { if (!bound.isInterface()) { classCount++; Type lower = cvarLowerBound(bound); - if (bound != lower && !lower.hasTag(BOT)) - lowers = insert(lowers, lower); + if (bound != lower && !lower.hasTag(BOT)) { + cvars = cvars.append(bound); + lowers = lowers.append(lower); + } } } if (classCount > 1) { - if (lowers.isEmpty()) + if (lowers.isEmpty()) { return createErrorType(errT); - else - return glbFlattened(union(bounds, lowers), errT); + } else { + // try again with lower bounds included instead of capture variables + List newBounds = bounds.diff(cvars).appendList(lowers); + return glb(newBounds); + } } } return makeIntersectionType(bounds); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Jan 09 11:57:06 2017 -0800 @@ -3190,7 +3190,7 @@ if (TreeInfo.isStaticSelector(referenceTree.expr, names)) { if (argtypes.nonEmpty() && (argtypes.head.hasTag(NONE) || - types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), site))) { + types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), originalSite))) { return new UnboundMethodReferenceLookupHelper(referenceTree, name, originalSite, argtypes, typeargtypes, maxPhase); } else { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon Jan 09 11:57:06 2017 -0800 @@ -1028,8 +1028,45 @@ protected void read(Symbol sym, int attrLen) { Object v = readPool(nextChar()); // Ignore ConstantValue attribute if field not final. - if ((sym.flags() & FINAL) != 0) - ((VarSymbol) sym).setData(v); + if ((sym.flags() & FINAL) == 0) { + return; + } + VarSymbol var = (VarSymbol) sym; + switch (var.type.getTag()) { + case BOOLEAN: + case BYTE: + case CHAR: + case SHORT: + case INT: + checkType(var, Integer.class, v); + break; + case LONG: + checkType(var, Long.class, v); + break; + case FLOAT: + checkType(var, Float.class, v); + break; + case DOUBLE: + checkType(var, Double.class, v); + break; + case CLASS: + Assert.check(var.type.tsym == syms.stringType.tsym); + checkType(var, String.class, v); + break; + default: + // ignore ConstantValue attribute if type is not primitive or String + return; + } + if (v instanceof Integer && !var.type.getTag().checkRange((Integer) v)) { + throw badClassFile("bad.constant.range", v, var, var.type); + } + var.setData(v); + } + + void checkType(Symbol var, Class clazz, Object value) { + if (!clazz.isInstance(value)) { + throw badClassFile("bad.constant.value", value, var, clazz.getSimpleName()); + } } }, diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1740,7 +1740,7 @@ accept(ARROW); return token.kind == LBRACE ? - lambdaStatement(args, pos, pos) : + lambdaStatement(args, pos, token.pos) : lambdaExpression(args, pos); } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Mon Jan 09 11:57:06 2017 -0800 @@ -114,6 +114,7 @@ private final boolean fatalErrors; private final boolean werror; private final boolean showResolveErrors; + private final boolean allowModules; private final JavacFiler filer; private final JavacMessager messager; @@ -178,7 +179,6 @@ private final Enter enter; private final Completer initialCompleter; private final Check chk; - private final ModuleSymbol defaultModule; private final Context context; @@ -230,8 +230,7 @@ chk = Check.instance(context); initProcessorLoader(); - defaultModule = source.allowModules() && options.isUnset("noModules") - ? symtab.unnamedModule : symtab.noModule; + allowModules = source.allowModules() && options.isUnset("noModules"); } public void setProcessors(Iterable processors) { @@ -665,7 +664,7 @@ private ArrayList supportedAnnotationPatterns; private ArrayList supportedOptionNames; - ProcessorState(Processor p, Log log, Source source, ProcessingEnvironment env) { + ProcessorState(Processor p, Log log, Source source, boolean allowModules, ProcessingEnvironment env) { processor = p; contributed = false; @@ -676,7 +675,8 @@ supportedAnnotationPatterns = new ArrayList<>(); for (String importString : processor.getSupportedAnnotationTypes()) { - supportedAnnotationPatterns.add(importStringToPattern(importString, + supportedAnnotationPatterns.add(importStringToPattern(allowModules, + importString, processor, log)); } @@ -768,7 +768,8 @@ if (psi.processorIterator.hasNext()) { ProcessorState ps = new ProcessorState(psi.processorIterator.next(), - log, source, JavacProcessingEnvironment.this); + log, source, allowModules, + JavacProcessingEnvironment.this); psi.procStateList.add(ps); return ps; } else @@ -834,7 +835,8 @@ for(TypeElement a : annotationsPresent) { ModuleElement mod = elementUtils.getModuleOf(a); - unmatchedAnnotations.put((mod != null ? mod.getSimpleName() + "/" : "") + a.getQualifiedName().toString(), + String moduleSpec = allowModules && mod != null ? mod.getSimpleName() + "/" : ""; + unmatchedAnnotations.put(moduleSpec + a.getQualifiedName().toString(), a); } @@ -1657,7 +1659,7 @@ * regex matching that string. If the string is not a valid * import-style string, return a regex that won't match anything. */ - private static Pattern importStringToPattern(String s, Processor p, Log log) { + private static Pattern importStringToPattern(boolean allowModules, String s, Processor p, Log log) { String module; String pkg; int slash = s.indexOf('/'); @@ -1672,7 +1674,7 @@ pkg = s.substring(slash + 1); } if (MatchingUtils.isValidImportString(pkg)) { - return Pattern.compile(module + MatchingUtils.validImportStringToPatternString(pkg)); + return Pattern.compile((allowModules ? module : "") + MatchingUtils.validImportStringToPatternString(pkg)); } else { log.warning("proc.malformed.supported.string", s, p.getClass().getName()); return noMatches; // won't match any valid identifier diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Mon Jan 09 11:57:06 2017 -0800 @@ -1913,6 +1913,14 @@ compiler.misc.class.file.not.found=\ class file for {0} not found +# 0: string (constant value), 1: symbol (constant field), 2: type (field type) +compiler.misc.bad.constant.range=\ + constant value ''{0}'' for {1} is outside the expected range for {2} + +# 0: string (constant value), 1: symbol (constant field), 2: string (expected class) +compiler.misc.bad.constant.value=\ + bad constant value ''{0}'' for {1}, expected {2} + # 0: string (classfile major version), 1: string (classfile minor version) compiler.misc.invalid.default.interface=\ default method found in version {0}.{1} classfile @@ -2550,7 +2558,7 @@ # 0: string compiler.err.intersection.types.in.cast.not.supported.in.source=\ intersection types in cast are not supported in -source {0}\n\ - (use -source 8 or higher to enable default methods) + (use -source 8 or higher to enable intersection types in cast) # 0: string compiler.err.static.intf.methods.not.supported.in.source=\ diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java Mon Jan 09 11:57:06 2017 -0800 @@ -105,18 +105,18 @@ // build root set for resolution Set mods = new HashSet<>(roots); - // add default modules to the root set - // unnamed module - if (!initialArchives.isEmpty() || !classpaths.isEmpty() || - roots.isEmpty() || allDefaultModules) { - mods.addAll(systemModulePath.defaultSystemRoots()); - } - if (allSystemModules) { + // add all system modules to the root set for unnamed module or set explicitly + boolean unnamed = !initialArchives.isEmpty() || !classpaths.isEmpty(); + if (allSystemModules || (unnamed && !allDefaultModules)) { systemModulePath.findAll().stream() .map(mref -> mref.descriptor().name()) .forEach(mods::add); } + if (allDefaultModules) { + mods.addAll(systemModulePath.defaultSystemRoots()); + } + this.configuration = Configuration.empty() .resolveRequires(finder, ModuleFinder.of(), mods); @@ -502,6 +502,7 @@ boolean addAllApplicationModules; boolean addAllDefaultModules; boolean addAllSystemModules; + boolean allModules; Runtime.Version version; public Builder() { @@ -550,8 +551,7 @@ * Include all system modules and modules found on modulepath */ public Builder allModules() { - this.addAllSystemModules = true; - this.addAllApplicationModules = true; + this.allModules = true; return this; } @@ -592,19 +592,30 @@ .map(mref -> mref.descriptor().name()) .forEach(rootModules::add); } - if (addAllApplicationModules && appModulePath != null) { + + if ((addAllApplicationModules || allModules) && appModulePath != null) { appModulePath.findAll().stream() .map(mref -> mref.descriptor().name()) .forEach(rootModules::add); } + // no archive is specified for analysis + // add all system modules as root if --add-modules ALL-SYSTEM is specified + if (addAllSystemModules && rootModules.isEmpty() && + initialArchives.isEmpty() && classPaths.isEmpty()) { + systemModulePath.findAll() + .stream() + .map(mref -> mref.descriptor().name()) + .forEach(rootModules::add); + } + return new JdepsConfiguration(systemModulePath, finder, rootModules, classPaths, initialArchives, addAllDefaultModules, - addAllSystemModules, + allModules, version); } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Mon Jan 09 11:57:06 2017 -0800 @@ -38,10 +38,10 @@ import java.nio.file.Paths; import java.text.MessageFormat; import java.util.*; +import java.util.function.Function; +import java.util.function.ToIntFunction; import java.util.jar.JarFile; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Implementation for the jdeps tool for static class dependency analysis. @@ -314,7 +314,10 @@ }, new Option(true, "-m", "--module") { void process(JdepsTask task, String opt, String arg) throws BadArgs { - task.options.rootModule = arg; + if (!task.options.rootModules.isEmpty()) { + throw new BadArgs("err.option.already.specified", opt); + } + task.options.rootModules.add(arg); task.options.addmods.add(arg); } }, @@ -350,6 +353,7 @@ new Option(true, "--require") { void process(JdepsTask task, String opt, String arg) { task.options.requires.add(arg); + task.options.addmods.add(arg); } }, new Option(true, "-f", "-filter") { @@ -491,11 +495,6 @@ if (options.help || options.version || options.fullVersion) { return EXIT_OK; } - - if (!inputArgs.isEmpty() && options.rootModule != null) { - reportError("err.invalid.arg.for.option", "-m"); - } - if (options.numFilters() > 1) { reportError("err.invalid.filters"); return EXIT_CMDERR; @@ -543,8 +542,8 @@ e.getKey(), e.getValue().toString()))); - // check if any module specified in --require is missing - Stream.concat(options.addmods.stream(), options.requires.stream()) + // check if any module specified in --add-modules, --require, and -m is missing + options.addmods.stream() .filter(mn -> !config.isValidToken(mn)) .forEach(mn -> config.findModule(mn).orElseThrow(() -> new UncheckedBadArgs(new BadArgs("err.module.not.found", mn)))); @@ -620,6 +619,7 @@ protected Command(CommandOption option) { this.option = option; } + /** * Returns true if the command-line options are all valid; * otherwise, returns false. @@ -633,6 +633,10 @@ /** * Includes all modules on system module path and application module path + * + * When a named module is analyzed, it will analyze the dependences + * only. The method should be overridden when this command should + * analyze all modules instead. */ boolean allModules() { return false; @@ -680,6 +684,10 @@ return false; } } + + if (!inputArgs.isEmpty() && !options.rootModules.isEmpty()) { + reportError("err.invalid.arg.for.option", "-m"); + } if (inputArgs.isEmpty() && !options.hasSourcePath()) { showHelp(); return false; @@ -808,23 +816,46 @@ log.println(); if (!options.requires.isEmpty()) log.println(getMessage("inverse.transitive.dependencies.on", - options.requires)); + options.requires)); else log.println(getMessage("inverse.transitive.dependencies.matching", - options.regex != null - ? options.regex.toString() - : "packages " + options.packageNames)); + options.regex != null + ? options.regex.toString() + : "packages " + options.packageNames)); - analyzer.inverseDependences().stream() - .sorted(Comparator.comparing(this::sortPath)) - .forEach(path -> log.println(path.stream() - .map(Archive::getName) - .collect(joining(" <- ")))); + analyzer.inverseDependences() + .stream() + .sorted(comparator()) + .map(this::toInversePath) + .forEach(log::println); return ok; } - private String sortPath(Deque path) { - return path.peekFirst().getName(); + private String toInversePath(Deque path) { + return path.stream() + .map(Archive::getName) + .collect(joining(" <- ")); + } + + /* + * Returns a comparator for sorting the inversed path, grouped by + * the first module name, then the shortest path and then sort by + * the module names of each path + */ + private Comparator> comparator() { + return Comparator., String> + comparing(deque -> deque.peekFirst().getName()) + .thenComparingInt(Deque::size) + .thenComparing(this::toInversePath); + } + + /* + * Returns true if --require is specified so that all modules are + * analyzed to find all modules that depend on the modules specified in the + * --require option directly and indirectly + */ + public boolean allModules() { + return options.requires.size() > 0; } } @@ -924,6 +955,9 @@ return new ModuleAnalyzer(config, log, modules).run(); } + /* + * Returns true to analyze all modules + */ public boolean allModules() { return true; } @@ -957,6 +991,10 @@ option); return false; } + + if (!inputArgs.isEmpty() && !options.rootModules.isEmpty()) { + reportError("err.invalid.arg.for.option", "-m"); + } if (inputArgs.isEmpty() && !options.hasSourcePath()) { showHelp(); return false; @@ -971,11 +1009,6 @@ reduced, log).run(); } - - @Override - boolean allModules() { - return true; - } } @@ -1155,7 +1188,7 @@ String systemModulePath = System.getProperty("java.home"); String upgradeModulePath; String modulePath; - String rootModule; + Set rootModules = new HashSet<>(); Set addmods = new HashSet<>(); Runtime.Version multiRelease; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java Mon Jan 09 11:57:06 2017 -0800 @@ -34,6 +34,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.sun.tools.jdeps.Analyzer.NOT_FOUND; @@ -109,9 +110,7 @@ private void printDependences() { // find use of JDK internals Map> jdkinternals = new HashMap<>(); - deps.keySet().stream() - .filter(source -> !source.getModule().isNamed()) - .map(deps::get) + dependenceStream() .flatMap(map -> map.entrySet().stream()) .filter(e -> e.getValue().size() > 0) .forEach(e -> jdkinternals.computeIfAbsent(e.getKey().getModule(), @@ -124,11 +123,10 @@ Module root = new RootModule("root"); builder.addModule(root); // find named module dependences - deps.keySet().stream() - .filter(source -> !source.getModule().isNamed()) - .map(deps::get) + dependenceStream() .flatMap(map -> map.keySet().stream()) - .filter(m -> m.getModule().isNamed()) + .filter(m -> m.getModule().isNamed() + && !configuration.rootModules().contains(m)) .map(Archive::getModule) .forEach(m -> builder.addEdge(root, m)); @@ -167,6 +165,16 @@ }); } + /* + * Returns a stream of dependence map from an Archive to the set of JDK + * internal APIs being used. + */ + private Stream>> dependenceStream() { + return deps.keySet().stream() + .filter(source -> !source.getModule().isNamed() + || configuration.rootModules().contains(source)) + .map(deps::get); + } private class RootModule extends Module { final ModuleDescriptor descriptor; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Mon Jan 09 11:57:06 2017 -0800 @@ -194,6 +194,7 @@ err.invalid.options={0} cannot be used with {1} option err.module.not.found=module not found: {0} err.root.module.not.set=root module set empty +err.option.already.specified={0} option specified more than once. err.filter.not.specified=--package (-p), --regex (-e), --require option must be specified err.multirelease.option.exists={0} is not a multi-release jar file, but the --multi-release option is set err.multirelease.option.notfound={0} is a multi-release jar file, but the --multi-release option is not set diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Mon Jan 09 11:57:06 2017 -0800 @@ -25,15 +25,18 @@ package jdk.internal.jshell.tool; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.PrintStream; import java.io.Reader; import java.io.StringReader; +import java.net.URL; import java.nio.charset.Charset; import java.nio.file.AccessDeniedException; import java.nio.file.FileSystems; @@ -44,7 +47,9 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; @@ -182,10 +187,7 @@ private IOContext input = null; private boolean regenerateOnDeath = true; private boolean live = false; - private boolean feedbackInitialized = false; - private String commandLineFeedbackMode = null; - private List remoteVMOptions = new ArrayList<>(); - private List compilerOptions = new ArrayList<>(); + private Options options; SourceCodeAnalysis analysis; JShell state = null; @@ -195,8 +197,9 @@ private boolean debug = false; public boolean testPrompt = false; - private String cmdlineClasspath = null; + private String defaultStartup = null; private String startup = null; + private String executionControlSpec = null; private EditorSetting editor = BUILT_IN_EDITOR; private static final String[] EDITOR_ENV_VARS = new String[] { @@ -212,16 +215,19 @@ static final String MODE_KEY = "MODE"; static final String REPLAY_RESTORE_KEY = "REPLAY_RESTORE"; - static final String DEFAULT_STARTUP = - "\n" + - "import java.util.*;\n" + - "import java.io.*;\n" + - "import java.math.*;\n" + - "import java.net.*;\n" + - "import java.util.concurrent.*;\n" + - "import java.util.prefs.*;\n" + - "import java.util.regex.*;\n" + - "void printf(String format, Object... args) { System.out.printf(format, args); }\n"; + static final String DEFAULT_STARTUP_NAME = "DEFAULT"; + static final Pattern BUILTIN_FILE_PATTERN = Pattern.compile("\\w+"); + static final String BUILTIN_FILE_PATH_FORMAT = "jrt:/jdk.jshell/jdk/jshell/tool/resources/%s.jsh"; + + // match anything followed by whitespace + private static final Pattern OPTION_PRE_PATTERN = + Pattern.compile("\\s*(\\S+\\s+)*?"); + // match a (possibly incomplete) option flag with optional double-dash and/or internal dashes + private static final Pattern OPTION_PATTERN = + Pattern.compile(OPTION_PRE_PATTERN.pattern() + "(?

    -??)(?-([a-z][a-z\\-]*)?)"); + // match an option flag and a (possibly missing or incomplete) value + private static final Pattern OPTION_VALUE_PATTERN = + Pattern.compile(OPTION_PATTERN.pattern() + "\\s+(?\\S*)"); // Tool id (tid) mapping: the three name spaces NameSpace mainNamespace; @@ -231,7 +237,278 @@ // Tool id (tid) mapping: the current name spaces NameSpace currentNameSpace; - Map mapSnippet; + Map mapSnippet; + + // Kinds of compiler/runtime init options + private enum OptionKind { + CLASS_PATH("--class-path", true), + MODULE_PATH("--module-path", true), + ADD_MODULES("--add-modules", false), + ADD_EXPORTS("--add-exports", false), + TO_COMPILER("-C", false, false, true, false), + TO_REMOTE_VM("-R", false, false, false, true),; + final String optionFlag; + final boolean onlyOne; + final boolean passFlag; + final boolean toCompiler; + final boolean toRemoteVm; + + private OptionKind(String optionFlag, boolean onlyOne) { + this(optionFlag, onlyOne, true, true, true); + } + + private OptionKind(String optionFlag, boolean onlyOne, boolean passFlag, + boolean toCompiler, boolean toRemoteVm) { + this.optionFlag = optionFlag; + this.onlyOne = onlyOne; + this.passFlag = passFlag; + this.toCompiler = toCompiler; + this.toRemoteVm = toRemoteVm; + } + + } + + // compiler/runtime init option values + private static class Options { + + private Map> optMap = new HashMap<>(); + + private String[] selectOptions(Predicate>> pred) { + return optMap.entrySet().stream() + .filter(pred) + .flatMap(e -> e.getValue().stream()) + .toArray(String[]::new); + } + + String[] remoteVmOptions() { + return selectOptions(e -> e.getKey().toRemoteVm); + } + + String[] compilerOptions() { + return selectOptions(e -> e.getKey().toCompiler); + } + + String[] commonOptions() { + return selectOptions(e -> e.getKey().passFlag); + } + + void addAll(OptionKind kind, Collection vals) { + optMap.computeIfAbsent(kind, k -> new ArrayList<>()) + .addAll(vals); + } + + void override(Options newer) { + newer.optMap.entrySet().stream() + .forEach(e -> { + if (e.getKey().onlyOne) { + // Only one allowed, override last + optMap.put(e.getKey(), e.getValue()); + } else { + // Additive + addAll(e.getKey(), e.getValue()); + } + }); + } + } + + // base option parsing of /env, /reload, and /reset and command-line options + private class OptionParserBase { + + final OptionParser parser = new OptionParser(); + private final OptionSpec argClassPath = parser.accepts("class-path").withRequiredArg(); + private final OptionSpec argModulePath = parser.accepts("module-path").withRequiredArg(); + private final OptionSpec argAddModules = parser.accepts("add-modules").withRequiredArg(); + private final OptionSpec argAddExports = parser.accepts("add-exports").withRequiredArg(); + private final NonOptionArgumentSpec argNonOptions = parser.nonOptions(); + + private Options opts = new Options(); + private List nonOptions; + private boolean failed = false; + + List nonOptions() { + return nonOptions; + } + + void msg(String key, Object... args) { + errormsg(key, args); + } + + Options parse(String[] args) throws OptionException { + try { + OptionSet oset = parser.parse(args); + nonOptions = oset.valuesOf(argNonOptions); + return parse(oset); + } catch (OptionException ex) { + if (ex.options().isEmpty()) { + msg("jshell.err.opt.invalid", stream(args).collect(joining(", "))); + } else { + boolean isKnown = parser.recognizedOptions().containsKey(ex.options().iterator().next()); + msg(isKnown + ? "jshell.err.opt.arg" + : "jshell.err.opt.unknown", + ex.options() + .stream() + .collect(joining(", "))); + } + return null; + } + } + + Options parse(OptionSet options) { + addOptions(OptionKind.CLASS_PATH, options.valuesOf(argClassPath)); + addOptions(OptionKind.MODULE_PATH, options.valuesOf(argModulePath)); + addOptions(OptionKind.ADD_MODULES, options.valuesOf(argAddModules)); + addOptions(OptionKind.ADD_EXPORTS, options.valuesOf(argAddExports).stream() + .map(mp -> mp.contains("=") ? mp : mp + "=ALL-UNNAMED") + .collect(toList()) + ); + + return failed ? null : opts; + } + + void addOptions(OptionKind kind, Collection vals) { + if (!vals.isEmpty()) { + if (kind.onlyOne && vals.size() > 1) { + msg("jshell.err.opt.one", kind.optionFlag); + failed = true; + return; + } + if (kind.passFlag) { + vals = vals.stream() + .flatMap(mp -> Stream.of(kind.optionFlag, mp)) + .collect(toList()); + } + opts.addAll(kind, vals); + } + } + } + + // option parsing for /reload (adds -restore -quiet) + private class OptionParserReload extends OptionParserBase { + + private final OptionSpecBuilder argRestore = parser.accepts("restore"); + private final OptionSpecBuilder argQuiet = parser.accepts("quiet"); + + private boolean restore = false; + private boolean quiet = false; + + boolean restore() { + return restore; + } + + boolean quiet() { + return quiet; + } + + @Override + Options parse(OptionSet options) { + if (options.has(argRestore)) { + restore = true; + } + if (options.has(argQuiet)) { + quiet = true; + } + return super.parse(options); + } + } + + // option parsing for command-line + private class OptionParserCommandLine extends OptionParserBase { + + private final OptionSpec argStart = parser.accepts("startup").withRequiredArg(); + private final OptionSpecBuilder argNoStart = parser.acceptsAll(asList("n", "no-startup")); + private final OptionSpec argFeedback = parser.accepts("feedback").withRequiredArg(); + private final OptionSpec argExecution = parser.accepts("execution").withRequiredArg(); + private final OptionSpecBuilder argQ = parser.accepts("q"); + private final OptionSpecBuilder argS = parser.accepts("s"); + private final OptionSpecBuilder argV = parser.accepts("v"); + private final OptionSpec argR = parser.accepts("R").withRequiredArg(); + private final OptionSpec argC = parser.accepts("C").withRequiredArg(); + private final OptionSpecBuilder argHelp = parser.acceptsAll(asList("h", "help")); + private final OptionSpecBuilder argVersion = parser.accepts("version"); + private final OptionSpecBuilder argFullVersion = parser.accepts("full-version"); + private final OptionSpecBuilder argX = parser.accepts("X"); + + private String feedbackMode = null; + private String initialStartup = null; + + String feedbackMode() { + return feedbackMode; + } + + String startup() { + return initialStartup; + } + + @Override + void msg(String key, Object... args) { + startmsg(key, args); + } + + @Override + Options parse(OptionSet options) { + if (options.has(argHelp)) { + printUsage(); + return null; + } + if (options.has(argX)) { + printUsageX(); + return null; + } + if (options.has(argVersion)) { + cmdout.printf("jshell %s\n", version()); + return null; + } + if (options.has(argFullVersion)) { + cmdout.printf("jshell %s\n", fullVersion()); + return null; + } + if ((options.valuesOf(argFeedback).size() + + (options.has(argQ) ? 1 : 0) + + (options.has(argS) ? 1 : 0) + + (options.has(argV) ? 1 : 0)) > 1) { + msg("jshell.err.opt.feedback.one"); + return null; + } else if (options.has(argFeedback)) { + feedbackMode = options.valueOf(argFeedback); + } else if (options.has("q")) { + feedbackMode = "concise"; + } else if (options.has("s")) { + feedbackMode = "silent"; + } else if (options.has("v")) { + feedbackMode = "verbose"; + } + if (options.has(argStart)) { + List sts = options.valuesOf(argStart); + if (options.has("no-startup")) { + startmsg("jshell.err.opt.startup.conflict"); + return null; + } + StringBuilder sb = new StringBuilder(); + for (String fn : sts) { + String s = readFile(fn, "--startup"); + if (s == null) { + return null; + } + sb.append(s); + } + initialStartup = sb.toString(); + } else if (options.has(argNoStart)) { + initialStartup = ""; + } else { + initialStartup = prefs.get(STARTUP_KEY); + if (initialStartup == null) { + initialStartup = defaultStartup(); + } + } + if (options.has(argExecution)) { + executionControlSpec = options.valueOf(argExecution); + } + addOptions(OptionKind.TO_REMOTE_VM, options.valuesOf(argR)); + addOptions(OptionKind.TO_COMPILER, options.valuesOf(argC)); + return super.parse(options); + } + } /** * Is the input/output currently interactive @@ -466,43 +743,45 @@ } public void start(String[] args) throws Exception { - List loadList = processCommandArgs(args); - if (loadList == null) { + OptionParserCommandLine commandLineArgs = new OptionParserCommandLine(); + options = commandLineArgs.parse(args); + if (options == null) { // Abort return; } - try (IOContext in = new ConsoleIOContext(this, cmdin, console)) { - start(in, loadList); - } - } - - private void start(IOContext in, List loadList) { - // If startup hasn't been set by command line, set from retained/default - if (startup == null) { - startup = prefs.get(STARTUP_KEY); - if (startup == null) { - startup = DEFAULT_STARTUP; - } - } - + startup = commandLineArgs.startup(); + // initialize editor settings configEditor(); - - resetState(); // Initialize - + // initialize JShell instance + resetState(); // Read replay history from last jshell session into previous history String prevReplay = prefs.get(REPLAY_RESTORE_KEY); if (prevReplay != null) { replayableHistoryPrevious = Arrays.asList(prevReplay.split(RECORD_SEPARATOR)); } - - for (String loadFile : loadList) { + // load snippet/command files given on command-line + for (String loadFile : commandLineArgs.nonOptions()) { runFile(loadFile, "jshell"); } + // if we survived that... + if (regenerateOnDeath) { + // initialize the predefined feedback modes + initFeedback(commandLineArgs.feedbackMode()); + } + // check again, as feedback setting could have failed + if (regenerateOnDeath) { + // if we haven't died, and the feedback mode wants fluff, print welcome + if (feedback.shouldDisplayCommandFluff()) { + hardmsg("jshell.msg.welcome", version()); + } + // execute from user input + try (IOContext in = new ConsoleIOContext(this, cmdin, console)) { + start(in); + } + } + } - if (regenerateOnDeath && feedback.shouldDisplayCommandFluff()) { - hardmsg("jshell.msg.welcome", version()); - } - + private void start(IOContext in) { try { while (regenerateOnDeath) { if (!live) { @@ -532,135 +811,6 @@ return editor = BUILT_IN_EDITOR; } - /** - * Process the command line arguments. - * Set options. - * @param args the command line arguments - * @return the list of files to be loaded - */ - private List processCommandArgs(String[] args) { - OptionParser parser = new OptionParser(); - OptionSpec cp = parser.accepts("class-path").withRequiredArg(); - OptionSpec mpath = parser.accepts("module-path").withRequiredArg(); - OptionSpec amods = parser.accepts("add-modules").withRequiredArg(); - OptionSpec st = parser.accepts("startup").withRequiredArg(); - parser.acceptsAll(asList("n", "no-startup")); - OptionSpec fb = parser.accepts("feedback").withRequiredArg(); - parser.accepts("q"); - parser.accepts("s"); - parser.accepts("v"); - OptionSpec r = parser.accepts("R").withRequiredArg(); - OptionSpec c = parser.accepts("C").withRequiredArg(); - parser.acceptsAll(asList("h", "help")); - parser.accepts("version"); - parser.accepts("full-version"); - - parser.accepts("X"); - OptionSpec addExports = parser.accepts("add-exports").withRequiredArg(); - - NonOptionArgumentSpec loadFileSpec = parser.nonOptions(); - - OptionSet options; - try { - options = parser.parse(args); - } catch (OptionException ex) { - if (ex.options().isEmpty()) { - startmsg("jshell.err.opt.invalid", stream(args).collect(joining(", "))); - } else { - boolean isKnown = parser.recognizedOptions().containsKey(ex.options().iterator().next()); - startmsg(isKnown - ? "jshell.err.opt.arg" - : "jshell.err.opt.unknown", - ex.options() - .stream() - .collect(joining(", "))); - } - return null; - } - - if (options.has("help")) { - printUsage(); - return null; - } - if (options.has("X")) { - printUsageX(); - return null; - } - if (options.has("version")) { - cmdout.printf("jshell %s\n", version()); - return null; - } - if (options.has("full-version")) { - cmdout.printf("jshell %s\n", fullVersion()); - return null; - } - if (options.has(cp)) { - List cps = options.valuesOf(cp); - if (cps.size() > 1) { - startmsg("jshell.err.opt.one", "--class-path"); - return null; - } - cmdlineClasspath = cps.get(0); - } - if (options.has(st)) { - List sts = options.valuesOf(st); - if (sts.size() != 1 || options.has("no-startup")) { - startmsg("jshell.err.opt.startup.one"); - return null; - } - startup = readFile(sts.get(0), "--startup"); - if (startup == null) { - return null; - } - } else if (options.has("no-startup")) { - startup = ""; - } - if ((options.valuesOf(fb).size() + - (options.has("q") ? 1 : 0) + - (options.has("s") ? 1 : 0) + - (options.has("v") ? 1 : 0)) > 1) { - startmsg("jshell.err.opt.feedback.one"); - return null; - } else if (options.has(fb)) { - commandLineFeedbackMode = options.valueOf(fb); - } else if (options.has("q")) { - commandLineFeedbackMode = "concise"; - } else if (options.has("s")) { - commandLineFeedbackMode = "silent"; - } else if (options.has("v")) { - commandLineFeedbackMode = "verbose"; - } - if (options.has(r)) { - remoteVMOptions.addAll(options.valuesOf(r)); - } - if (options.has(c)) { - compilerOptions.addAll(options.valuesOf(c)); - } - if (options.has(mpath)) { - compilerOptions.add("--module-path"); - compilerOptions.addAll(options.valuesOf(mpath)); - remoteVMOptions.add("--module-path"); - remoteVMOptions.addAll(options.valuesOf(mpath)); - } - if (options.has(amods)) { - compilerOptions.add("--add-modules"); - compilerOptions.addAll(options.valuesOf(amods)); - remoteVMOptions.add("--add-modules"); - remoteVMOptions.addAll(options.valuesOf(amods)); - } - - if (options.has(addExports)) { - List exports = options.valuesOf(addExports).stream() - .map(mp -> mp + "=ALL-UNNAMED") - .flatMap(mp -> Stream.of("--add-exports", mp)) - .collect(toList()); - remoteVMOptions.addAll(exports); - compilerOptions.addAll(exports); - } - - return options.valuesOf(loadFileSpec); - } - private void printUsage() { cmdout.print(getResourceString("help.usage")); } @@ -718,18 +868,21 @@ // Reset the replayable history, saving the old for restore replayableHistoryPrevious = replayableHistory; replayableHistory = new ArrayList<>(); - - state = JShell.builder() + JShell.Builder builder = + JShell.builder() .in(userin) .out(userout) .err(usererr) - .tempVariableNameGenerator(()-> "$" + currentNameSpace.tidNext()) + .tempVariableNameGenerator(() -> "$" + currentNameSpace.tidNext()) .idGenerator((sn, i) -> (currentNameSpace == startNamespace || state.status(sn).isActive()) ? currentNameSpace.tid(sn) : errorNamespace.tid(sn)) - .remoteVMOptions(remoteVMOptions.stream().toArray(String[]::new)) - .compilerOptions(compilerOptions.stream().toArray(String[]::new)) - .build(); + .remoteVMOptions(options.remoteVmOptions()) + .compilerOptions(options.compilerOptions()); + if (executionControlSpec != null) { + builder.executionEngine(executionControlSpec); + } + state = builder.build(); shutdownSubscription = state.onShutdown((JShell deadState) -> { if (deadState == state) { hardmsg("jshell.msg.terminated"); @@ -738,15 +891,6 @@ }); analysis = state.sourceCodeAnalysis(); live = true; - if (!feedbackInitialized) { - // One time per run feedback initialization - feedbackInitialized = true; - initFeedback(); - } - - if (cmdlineClasspath != null) { - state.addToClasspath(cmdlineClasspath); - } startUpRun(startup); currentNameSpace = mainNamespace; @@ -757,7 +901,7 @@ } //where -- one-time per run initialization of feedback modes - private void initFeedback() { + private void initFeedback(String initMode) { // No fluff, no prefix, for init failures MessageHandler initmh = new InitMessageHandler(); // Execute the feedback initialization code in the resource file @@ -772,12 +916,11 @@ prefs.remove(MODE_KEY); } } - if (commandLineFeedbackMode != null) { + if (initMode != null) { // The feedback mode to use was specified on the command line, use it - if (!setFeedback(initmh, new ArgTokenizer("--feedback", commandLineFeedbackMode))) { + if (!setFeedback(initmh, new ArgTokenizer("--feedback", initMode))) { regenerateOnDeath = false; } - commandLineFeedbackMode = null; } else { String fb = prefs.get(FEEDBACK_KEY); if (fb != null) { @@ -790,7 +933,7 @@ //where private void startUpRun(String start) { - try (IOContext suin = new FileScannerIOContext(new StringReader(start))) { + try (IOContext suin = new ScannerIOContext(new StringReader(start))) { run(suin); } catch (Exception ex) { hardmsg("jshell.err.startup.unexpected.exception", ex); @@ -1006,6 +1149,13 @@ this.alternatives = alternatives; } + // Add more options to an existing provider + public FixedCompletionProvider(FixedCompletionProvider base, String... alternatives) { + List l = new ArrayList<>(Arrays.asList(base.alternatives)); + l.addAll(Arrays.asList(alternatives)); + this.alternatives = l.toArray(new String[l.size()]); + } + @Override public List completionSuggestions(String input, int cursor, int[] anchor) { List result = new ArrayList<>(); @@ -1027,11 +1177,20 @@ private static final CompletionProvider SNIPPET_HISTORY_OPTION_COMPLETION_PROVIDER = new FixedCompletionProvider("-all", "-start ", "-history"); private static final CompletionProvider SAVE_OPTION_COMPLETION_PROVIDER = new FixedCompletionProvider("-all ", "-start ", "-history "); private static final CompletionProvider SNIPPET_OPTION_COMPLETION_PROVIDER = new FixedCompletionProvider("-all", "-start " ); - private static final CompletionProvider RELOAD_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider("-restore ", "-quiet "); - private static final CompletionProvider RESTORE_COMPLETION_PROVIDER = new FixedCompletionProvider("-restore"); - private static final CompletionProvider QUIET_COMPLETION_PROVIDER = new FixedCompletionProvider("-quiet"); + private static final FixedCompletionProvider COMMAND_LINE_LIKE_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider( + "-class-path ", "-module-path ", "-add-modules ", "-add-exports "); + private static final CompletionProvider RELOAD_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider( + COMMAND_LINE_LIKE_OPTIONS_COMPLETION_PROVIDER, + "-restore ", "-quiet "); private static final CompletionProvider SET_MODE_OPTIONS_COMPLETION_PROVIDER = new FixedCompletionProvider("-command", "-quiet", "-delete"); private static final CompletionProvider FILE_COMPLETION_PROVIDER = fileCompletions(p -> true); + private static final Map ARG_OPTIONS = new HashMap<>(); + static { + ARG_OPTIONS.put("-class-path", classPathCompletion()); + ARG_OPTIONS.put("-module-path", fileCompletions(Files::isDirectory)); + ARG_OPTIONS.put("-add-modules", EMPTY_COMPLETION_PROVIDER); + ARG_OPTIONS.put("-add-exports", EMPTY_COMPLETION_PROVIDER); + } private final Map commands = new LinkedHashMap<>(); private void registerCommand(Command cmd) { commands.put(cmd.command, cmd); @@ -1157,32 +1316,70 @@ }; } - private static CompletionProvider reloadCompletion() { + // command-line-like option completion -- options with values + private static CompletionProvider optionCompletion(CompletionProvider provider) { return (code, cursor, anchor) -> { - CompletionProvider provider; - int pastSpace = code.indexOf(' ') + 1; // zero if no space - if (pastSpace == 0) { - provider = RELOAD_OPTIONS_COMPLETION_PROVIDER; - } else { - switch (code.substring(0, pastSpace - 1)) { - case "-quiet": - provider = RESTORE_COMPLETION_PROVIDER; - break; - case "-restore": - provider = QUIET_COMPLETION_PROVIDER; - break; - default: - provider = EMPTY_COMPLETION_PROVIDER; - break; + Matcher ovm = OPTION_VALUE_PATTERN.matcher(code); + if (ovm.matches()) { + String flag = ovm.group("flag"); + List ps = ARG_OPTIONS.entrySet().stream() + .filter(es -> es.getKey().startsWith(flag)) + .map(es -> es.getValue()) + .collect(toList()); + if (ps.size() == 1) { + int pastSpace = ovm.start("val"); + List result = ps.get(0).completionSuggestions( + ovm.group("val"), cursor - pastSpace, anchor); + anchor[0] += pastSpace; + return result; } } - List result = provider.completionSuggestions( - code.substring(pastSpace), cursor - pastSpace, anchor); - anchor[0] += pastSpace; - return result; + Matcher om = OPTION_PATTERN.matcher(code); + if (om.matches()) { + int pastSpace = om.start("flag"); + List result = provider.completionSuggestions( + om.group("flag"), cursor - pastSpace, anchor); + if (!om.group("dd").isEmpty()) { + result = result.stream() + .map(sug -> new Suggestion() { + @Override + public String continuation() { + return "-" + sug.continuation(); + } + + @Override + public boolean matchesType() { + return false; + } + }) + .collect(toList()); + --pastSpace; + } + anchor[0] += pastSpace; + return result; + } + Matcher opp = OPTION_PRE_PATTERN.matcher(code); + if (opp.matches()) { + int pastSpace = opp.end(); + List result = provider.completionSuggestions( + "", cursor - pastSpace, anchor); + anchor[0] += pastSpace; + return result; + } + return Collections.emptyList(); }; } + // /reload command completion + private static CompletionProvider reloadCompletion() { + return optionCompletion(RELOAD_OPTIONS_COMPLETION_PROVIDER); + } + + // /env command completion + private static CompletionProvider envCompletion() { + return optionCompletion(COMMAND_LINE_LIKE_OPTIONS_COMPLETION_PROVIDER); + } + private static CompletionProvider orMostSpecificCompletion( CompletionProvider left, CompletionProvider right) { return (code, cursor, anchor) -> { @@ -1276,16 +1473,15 @@ registerCommand(new Command("/exit", arg -> cmdExit(), EMPTY_COMPLETION_PROVIDER)); + registerCommand(new Command("/env", + arg -> cmdEnv(arg), + envCompletion())); registerCommand(new Command("/reset", - arg -> cmdReset(), - EMPTY_COMPLETION_PROVIDER)); + arg -> cmdReset(arg), + envCompletion())); registerCommand(new Command("/reload", this::cmdReload, reloadCompletion())); - registerCommand(new Command("/classpath", - this::cmdClasspath, - classPathCompletion(), - CommandKind.REPLAY)); registerCommand(new Command("/history", arg -> cmdHistory(), EMPTY_COMPLETION_PROVIDER)); @@ -1334,6 +1530,9 @@ registerCommand(new Command("shortcuts", "help.shortcuts", CommandKind.HELP_SUBJECT)); + registerCommand(new Command("context", + "help.context", + CommandKind.HELP_SUBJECT)); commandCompletions = new ContinuousCompletionProvider( commands.values().stream() @@ -1615,14 +1814,17 @@ // The sub-command: /set start boolean setStart(ArgTokenizer at) { at.allowedOptions("-default", "-none", "-retain"); - String fn = at.next(); + List fns = new ArrayList<>(); + while (at.next() != null) { + fns.add(at.val()); + } if (!checkOptionsAndRemainingInput(at)) { return false; } boolean defaultOption = at.hasOption("-default"); boolean noneOption = at.hasOption("-none"); boolean retainOption = at.hasOption("-retain"); - boolean hasFile = fn != null; + boolean hasFile = !fns.isEmpty(); int argCount = (defaultOption ? 1 : 0) + (noneOption ? 1 : 0) + (hasFile ? 1 : 0); if (argCount > 1) { @@ -1635,13 +1837,17 @@ return true; } if (hasFile) { - String init = readFile(fn, "/set start"); - if (init == null) { - return false; + StringBuilder sb = new StringBuilder(); + for (String fn : fns) { + String s = readFile(fn, "/set start"); + if (s == null) { + return false; + } + sb.append(s); } - startup = init; + startup = sb.toString(); } else if (defaultOption) { - startup = DEFAULT_STARTUP; + startup = defaultStartup(); } else if (noneOption) { startup = ""; } @@ -1665,7 +1871,7 @@ void showSetStart(boolean isRetained, String start) { String cmd = "/set start" + (isRetained ? " -retain " : " "); String stset; - if (start.equals(DEFAULT_STARTUP)) { + if (start.equals(defaultStartup())) { stset = cmd + "-default"; } else if (start.isEmpty()) { stset = cmd + "-none"; @@ -1675,17 +1881,6 @@ hard(stset); } - boolean cmdClasspath(String arg) { - if (arg.isEmpty()) { - errormsg("jshell.err.classpath.arg"); - return false; - } else { - state.addToClasspath(toPathResolvingUserHome(arg).toString()); - fluffmsg("jshell.msg.classpath", arg); - return true; - } - } - boolean cmdDebug(String arg) { if (arg.isEmpty()) { debug = !debug; @@ -2158,7 +2353,16 @@ private boolean runFile(String filename, String context) { if (!filename.isEmpty()) { try { - run(new FileScannerIOContext(toPathResolvingUserHome(filename).toString())); + Path path = toPathResolvingUserHome(filename); + Reader reader; + String resource; + if (!Files.exists(path) && (resource = getResource(filename)) != null) { + // Not found as file, but found as resource + reader = new StringReader(resource); + } else { + reader = new FileReader(path.toString()); + } + run(new ScannerIOContext(reader)); return true; } catch (FileNotFoundException e) { errormsg("jshell.err.file.not.found", context, filename, e.getMessage()); @@ -2181,11 +2385,16 @@ String readFile(String filename, String context) { if (filename != null) { try { - byte[] encoded = Files.readAllBytes(Paths.get(filename)); + byte[] encoded = Files.readAllBytes(toPathResolvingUserHome(filename)); return new String(encoded); } catch (AccessDeniedException e) { errormsg("jshell.err.file.not.accessible", context, filename, e.getMessage()); } catch (NoSuchFileException e) { + String resource = getResource(filename); + if (resource != null) { + // Not found as file, but found as resource + return resource; + } errormsg("jshell.err.file.not.found", context, filename); } catch (Exception e) { errormsg("jshell.err.file.exception", context, filename, e); @@ -2197,20 +2406,59 @@ } - private boolean cmdReset() { + String getResource(String name) { + if (BUILTIN_FILE_PATTERN.matcher(name).matches()) { + try { + return readResource(name); + } catch (Throwable t) { + // Fall-through to null + } + } + return null; + } + + // Read a built-in file from resources + String readResource(String name) throws IOException { + // Attempt to find the file as a resource + String spec = String.format(BUILTIN_FILE_PATH_FORMAT, name); + URL url = new URL(spec); + BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); + return reader.lines().collect(Collectors.joining("\n")); + } + + // retrieve the default startup string + String defaultStartup() { + if (defaultStartup == null) { + defaultStartup = ""; // failure case + try { + defaultStartup = readResource(DEFAULT_STARTUP_NAME); + } catch (AccessDeniedException e) { + errormsg("jshell.err.file.not.accessible", "jshell", DEFAULT_STARTUP_NAME, e.getMessage()); + } catch (NoSuchFileException e) { + errormsg("jshell.err.file.not.found", "jshell", DEFAULT_STARTUP_NAME); + } catch (Exception e) { + errormsg("jshell.err.file.exception", "jshell", DEFAULT_STARTUP_NAME, e); + } + } + return defaultStartup; + } + + private boolean cmdReset(String rawargs) { + if (!parseCommandLineLikeFlags(rawargs, new OptionParserBase())) { + return false; + } live = false; fluffmsg("jshell.msg.resetting.state"); return true; } private boolean cmdReload(String rawargs) { - ArgTokenizer at = new ArgTokenizer("/reload", rawargs.trim()); - at.allowedOptions("-restore", "-quiet"); - if (!checkOptionsAndRemainingInput(at)) { + OptionParserReload ap = new OptionParserReload(); + if (!parseCommandLineLikeFlags(rawargs, ap)) { return false; } Iterable history; - if (at.hasOption("-restore")) { + if (ap.restore()) { if (replayableHistoryPrevious == null) { errormsg("jshell.err.reload.no.previous"); return false; @@ -2221,13 +2469,57 @@ history = replayableHistory; fluffmsg("jshell.err.reload.restarting.state"); } - boolean echo = !at.hasOption("-quiet"); + return doReload(history, !ap.quiet()); + } + + private boolean cmdEnv(String rawargs) { + if (rawargs.trim().isEmpty()) { + // No arguments, display current settings (as option flags) + StringBuilder sb = new StringBuilder(); + for (String a : options.commonOptions()) { + sb.append( + a.startsWith("-") + ? sb.length() > 0 + ? "\n " + : " " + : " "); + sb.append(a); + } + if (sb.length() > 0) { + rawout(prefix(sb.toString())); + } + return false; + } + if (!parseCommandLineLikeFlags(rawargs, new OptionParserBase())) { + return false; + } + fluffmsg("jshell.msg.set.restore"); + return doReload(replayableHistory, false); + } + + private boolean doReload(Iterable history, boolean echo) { resetState(); run(new ReloadIOContext(history, echo ? cmdout : null)); return true; } + private boolean parseCommandLineLikeFlags(String rawargs, OptionParserBase ap) { + String[] args = Arrays.stream(rawargs.split("\\s+")) + .filter(s -> !s.isEmpty()) + .toArray(String[]::new); + Options opts = ap.parse(args); + if (opts == null) { + return false; + } + if (!ap.nonOptions().isEmpty()) { + errormsg("jshell.err.unexpected.at.end", ap.nonOptions(), rawargs); + return false; + } + options.override(opts); + return true; + } + private boolean cmdSave(String rawargs) { ArgTokenizer at = new ArgTokenizer("/save", rawargs.trim()); at.allowedOptions("-all", "-start", "-history"); @@ -2902,6 +3194,10 @@ this.scannerIn = scannerIn; } + ScannerIOContext(Reader rdr) throws FileNotFoundException { + this(new Scanner(rdr)); + } + @Override public String readLine(String prompt, String prefix) { if (scannerIn.hasNextLine()) { @@ -2922,17 +3218,6 @@ } } -class FileScannerIOContext extends ScannerIOContext { - - FileScannerIOContext(String fn) throws FileNotFoundException { - this(new FileReader(fn)); - } - - FileScannerIOContext(Reader rdr) throws FileNotFoundException { - super(new Scanner(rdr)); - } -} - class ReloadIOContext extends NonInteractiveIOContext { private final Iterator it; private final PrintStream echoStream; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Mon Jan 09 11:57:06 2017 -0800 @@ -29,7 +29,7 @@ jshell.err.opt.arg = Argument to {0} missing. jshell.err.opt.invalid = Invalid options: {0}. jshell.err.opt.one = Only one {0} option may be used. -jshell.err.opt.startup.one = Only one --startup or --no-startup option may be used. +jshell.err.opt.startup.conflict = Conflicting options: both --startup and --no-startup were used. jshell.err.opt.feedback.one = Only one feedback option (--feedback, -q, -s, or -v) may be used. jshell.err.opt.unknown = Unknown option: {0} @@ -52,6 +52,7 @@ jshell.err.no.such.command.or.snippet.id = No such command or snippet id: {0} jshell.err.command.ambiguous = Command: ''{0}'' is ambiguous: {1} +jshell.msg.set.restore = Setting new options and restoring state. jshell.msg.set.editor.set = Editor set to: {0} jshell.msg.set.editor.retain = Editor setting retained: {0} jshell.err.no.builtin.editor = Built-in editor not available. @@ -150,8 +151,8 @@ jshell.console.see.more = jshell.console.see.javadoc = jshell.console.see.help = -jshell.console.see.next.page = -- Press space for next page, Q to quit. -- -jshell.console.see.next.javadoc = -- Press space for next javadoc, Q to quit. -- +jshell.console.see.next.page = +jshell.console.see.next.javadoc = jshell.console.no.javadoc = jshell.console.do.nothing = Do nothing jshell.console.choice = Choice: \ @@ -169,12 +170,12 @@ \ --module-path Specify where to find application modules\n\ \ --add-modules (,)*\n\ \ Specify modules to resolve, or all modules on the\n\ -\ module path if is ALL-MODULE-PATHs\n\ +\ module path if is ALL-MODULE-PATHs\n\ \ --startup One run replacement for the start-up definitions\n\ \ --no-startup Do not run the start-up definitions\n\ \ --feedback Specify the initial feedback mode. The mode may be\n\ -\ predefined (silent, concise, normal, or verbose) or\n\ -\ previously user-defined\n\ +\ predefined (silent, concise, normal, or verbose) or\n\ +\ previously user-defined\n\ \ -q Quiet feedback. Same as: --feedback concise\n\ \ -s Really quiet feedback. Same as: --feedback silent\n\ \ -v Verbose feedback. Same as: --feedback verbose\n\ @@ -189,6 +190,10 @@ \ -X Print help on non-standard options\n help.usage.x = \ \ --add-exports / Export specified module-private package to snippets\n\ +\ --execution Specify an alternate execution engine.\n\ +\ Where is an ExecutionControl spec.\n\ +\ See the documentation of the package\n\ +\ jdk.jshell.spi for the syntax of the spec\n\ \ \n\ \These options are non-standard and subject to change without notice.\n @@ -315,21 +320,25 @@ Save any work before using this command help.reset.summary = reset jshell -help.reset.args = +help.reset.args = \ +[-class-path ] [-module-path ] [-add-modules ]... help.reset =\ Reset the jshell tool code and execution state:\n\t\ * All entered code is lost.\n\t\ * Start-up code is re-executed.\n\t\ * The execution state is restarted.\n\t\ - * The classpath is cleared.\n\ Tool settings are maintained, as set with: /set ...\n\ -Save any work before using this command +Save any work before using this command.\n\ +The /reset command accepts context options, see:\n\n\t\ + /help context\n\ + help.reload.summary = reset and replay relevant history -- current or previous (-restore) -help.reload.args = [-restore] [-quiet] +help.reload.args = \ +[-restore] [-quiet] [-class-path ] [-module-path ]... help.reload =\ Reset the jshell tool code and execution state then replay each valid snippet\n\ -and any /drop or /classpath commands in the order they were entered.\n\ +and any /drop commands in the order they were entered.\n\ \n\ /reload\n\t\ Reset and replay the valid history since jshell was entered, or\n\t\ @@ -341,12 +350,31 @@ command was executed. This can thus be used to restore a previous\n\t\ jshell tool session.\n\n\ /reload [-restore] -quiet\n\t\ - With the '-quiet' argument the replay is not shown. Errors will display. + With the '-quiet' argument the replay is not shown. Errors will display.\n\ +\n\ +Each of the above accepts context options, see:\n\n\t\ + /help context\n\ +\n\ +For example:\n\n\t\ + /reload -add-modules com.greetings -restore -help.classpath.summary = add a path to the classpath -help.classpath.args = -help.classpath =\ -Append a additional path to the classpath. +help.env.summary = view or change the evaluation context +help.env.args = \ +[-class-path ] [-module-path ] [-add-modules ] ... +help.env =\ +View or change the evaluation context. The evaluation context is the class path,\n\ +module path, etc.\n\ +/env\n\t\ + Show the evaluation context displayed as context options.\n\n\ +/env [-class-path ] [-module-path ] [-add-modules ] ...\n\t\ + With at least one option set, sets the evaluation context. If snippets\n\t\ + have been defined, the execution state is reset with the new\n\t\ + evaluation context and the snippets will be replayed -- the replay is not\n\t\ + shown, however, errors will display. This is equivalent to: /reload -quiet\n\t\ + For details of context options, see:\n\n\t\t\ + /help context\n\n\t\ + For example:\n\n\t\t\ + /env -add-modules com.greetings help.history.summary = history of what you have typed help.history.args = @@ -469,6 +497,37 @@ possible fully qualified names based on the content of the specified classpath.\n\t\t\ The "" is either Alt-F1 or Alt-Enter, depending on the platform. +help.context.summary = the evaluation context options for /env /reload and /reset +help.context =\ +These options configure the evaluation context, they can be specified when\n\ +jshell is started: on the command-line, or restarted with the commands /env,\n\ +/reload, or /reset.\n\ +\n\ +They are:\n\t\ + --class-path \n\t\t\ + A list of directories, JAR archives,\n\t\t\ + and ZIP archives to search for class files.\n\t\t\ + The list is separated with the path separator\n\t\t\ + (a : on unix/linux/mac, and ; on windows).\n\t\ + --module-path ...\n\t\t\ + A list of directories, each directory\n\t\t\ + is a directory of modules.\n\t\t\ + The list is separated with the path separator\n\t\t\ + (a : on unix/linux/mac, and ; on windows).\n\t\ + --add-modules [,...]\n\t\t\ + root modules to resolve in addition to the initial module.\n\t\t\ + can also be ALL-DEFAULT, ALL-SYSTEM,\n\t\t\ + ALL-MODULE-PATH.\n\t\ + --add-exports /=(,)*\n\t\t\ + updates to export to ,\n\t\t\ + regardless of module declaration.\n\t\t\ + can be ALL-UNNAMED to export to all\n\t\t\ + unnamed modules. In jshell, if the is not\n\t\t\ + specified (no =) then ALL-UNNAMED is used.\n\ +\n\ +On the command-line these options must have two dashes, e.g.: --module-path\n\ +On jshell commands they can have one or two dashes, e.g.: -module-path\n\ + help.set._retain = \ The '-retain' option saves a setting so that it is used in future sessions.\n\ The -retain option can be used on the following forms of /set:\n\n\t\ diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java Mon Jan 09 11:57:06 2017 -0800 @@ -48,11 +48,10 @@ import java.util.stream.Stream; import jdk.internal.jshell.debug.InternalDebugControl; import jdk.jshell.Snippet.Status; -import jdk.jshell.execution.JdiDefaultExecutionControl; import jdk.jshell.spi.ExecutionControl.EngineTerminationException; import jdk.jshell.spi.ExecutionControl.ExecutionControlException; +import jdk.jshell.spi.ExecutionControlProvider; import jdk.jshell.spi.ExecutionEnv; -import static jdk.jshell.execution.Util.failOverExecutionControlGenerator; import static jdk.jshell.Util.expunge; /** @@ -116,15 +115,20 @@ this.idGenerator = b.idGenerator; this.extraRemoteVMOptions = b.extraRemoteVMOptions; this.extraCompilerOptions = b.extraCompilerOptions; - ExecutionControl.Generator executionControlGenerator = b.executionControlGenerator==null - ? failOverExecutionControlGenerator( - JdiDefaultExecutionControl.listen(InetAddress.getLoopbackAddress().getHostAddress()), - JdiDefaultExecutionControl.launch(), - JdiDefaultExecutionControl.listen(null) - ) - : b.executionControlGenerator; try { - executionControl = executionControlGenerator.generate(new ExecutionEnvImpl()); + if (b.executionControlProvider != null) { + executionControl = b.executionControlProvider.generate(new ExecutionEnvImpl(), + b.executionControlParameters == null + ? b.executionControlProvider.defaultParameters() + : b.executionControlParameters); + } else { + String loopback = InetAddress.getLoopbackAddress().getHostAddress(); + String spec = b.executionControlSpec == null + ? "failover:0(jdi:hostname(" + loopback + "))," + + "1(jdi:launch(true)), 2(jdi)" + : b.executionControlSpec; + executionControl = ExecutionControl.generate(new ExecutionEnvImpl(), spec); + } } catch (Throwable ex) { throw new IllegalStateException("Launching JShell execution engine threw: " + ex.getMessage(), ex); } @@ -164,7 +168,9 @@ BiFunction idGenerator = null; List extraRemoteVMOptions = new ArrayList<>(); List extraCompilerOptions = new ArrayList<>(); - ExecutionControl.Generator executionControlGenerator; + ExecutionControlProvider executionControlProvider; + Map executionControlParameters; + String executionControlSpec; Builder() { } @@ -322,14 +328,39 @@ /** * Sets the custom engine for execution. Snippet execution will be - * provided by the specified {@link ExecutionControl} instance. + * provided by the {@link ExecutionControl} instance selected by the + * specified execution control spec. + * Use, at most, one of these overloaded {@code executionEngine} builder + * methods. * - * @param executionControlGenerator the execution engine generator + * @param executionControlSpec the execution control spec, + * which is documented in the {@link jdk.jshell.spi} + * package documentation. * @return the {@code Builder} instance (for use in chained * initialization) */ - public Builder executionEngine(ExecutionControl.Generator executionControlGenerator) { - this.executionControlGenerator = executionControlGenerator; + public Builder executionEngine(String executionControlSpec) { + this.executionControlSpec = executionControlSpec; + return this; + } + + /** + * Sets the custom engine for execution. Snippet execution will be + * provided by the specified {@link ExecutionControl} instance. + * Use, at most, one of these overloaded {@code executionEngine} builder + * methods. + * + * @param executionControlProvider the provider to supply the execution + * engine + * @param executionControlParameters the parameters to the provider, or + * {@code null} for default parameters + * @return the {@code Builder} instance (for use in chained + * initialization) + */ + public Builder executionEngine(ExecutionControlProvider executionControlProvider, + Map executionControlParameters) { + this.executionControlProvider = executionControlProvider; + this.executionControlParameters = executionControlParameters; return this; } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java Mon Jan 09 11:57:06 2017 -0800 @@ -161,6 +161,10 @@ @Override public Diag diag(Diagnostic d) { SourceMemoryJavaFileObject smjfo = (SourceMemoryJavaFileObject) d.getSource(); + if (smjfo == null) { + // Handle failure that doesn't preserve mapping + return new StringSourceHandler().diag(d); + } OuterWrap w = (OuterWrap) smjfo.getOrigin(); return w.wrapDiag(d); } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java Mon Jan 09 11:57:06 2017 -0800 @@ -202,12 +202,27 @@ } else if (value instanceof Character) { return "'" + value + "'"; } else if (value.getClass().isArray()) { - String tn = value.getClass().getTypeName(); + int dims = 0; + Class t = value.getClass(); + while (true) { + Class ct = t.getComponentType(); + if (ct == null) { + break; + } + ++dims; + t = ct; + } + String tn = t.getTypeName(); int len = Array.getLength(value); StringBuilder sb = new StringBuilder(); - sb.append(tn.substring(tn.lastIndexOf('.') + 1, tn.length() - 1)); + sb.append(tn.substring(tn.lastIndexOf('.') + 1, tn.length())); + sb.append("["); sb.append(len); - sb.append("] { "); + sb.append("]"); + for (int i = 1; i < dims; ++i) { + sb.append("[]"); + } + sb.append(" { "); for (int i = 0; i < len; ++i) { sb.append(valueString(Array.get(value, i))); if (i < len - 1) { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jshell.execution; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControlProvider; +import jdk.jshell.spi.ExecutionEnv; + +/** + * Tries other providers in sequence until one works. + */ +public class FailOverExecutionControlProvider implements ExecutionControlProvider{ + + private Logger logger = null; + + /** + * Create an instance. The instance can be used to start and return an + * {@link ExecutionControl} instance by attempting to start a series of + * {@code ExecutionControl} specs, until one is successful. + * + * @see #generate(jdk.jshell.spi.ExecutionEnv, java.util.Map) + */ + public FailOverExecutionControlProvider() { + } + + /** + * The unique name of this {@code ExecutionControlProvider}. + * + * @return "failover" + */ + @Override + public String name() { + return "failover"; + } + + /** + * Create and return the default parameter map for this + * {@code ExecutionControlProvider}. There are ten parameters, "0" through + * "9", their values are {@code ExecutionControlProvider} specification + * strings, or empty string. + * + * @return a default parameter map + */ + @Override + public Map defaultParameters() { + Map dp = new HashMap<>(); + dp.put("0", "jdi"); + for (int i = 1; i <= 9; ++i) { + dp.put("" + i, ""); + } + return dp; + } + + /** + * Create and return a locally executing {@code ExecutionControl} instance. + * At least one parameter should have a spec. + * + * @param env the execution environment, provided by JShell + * @param parameters the modified parameter map. + * @return the execution engine + * @throws Throwable if all the given providers fail, the exception that + * occurred on the first attempt to create the execution engine. + */ + @Override + public ExecutionControl generate(ExecutionEnv env, Map parameters) + throws Throwable { + Throwable thrown = null; + for (int i = 0; i <= 9; ++i) { + String param = parameters.get("" + i); + if (param != null && !param.isEmpty()) { + try { + ExecutionControl ec = ExecutionControl.generate(env, param); + logger().finest( + String.format("FailOverExecutionControlProvider: Success %s -- %d = %s\n", + name(), i, param)); + return ec; + } catch (Throwable ex) { + logger().warning( + String.format("FailOverExecutionControlProvider: Failure %s -- %d = %s -- %s\n", + name(), i, param, ex.toString())); + StringWriter writer = new StringWriter(); + PrintWriter log = new PrintWriter(writer); + log.println("FailOverExecutionControlProvider:"); + ex.printStackTrace(log); + logger().fine(log.toString()); + // only care about the first, and only if they all fail + if (thrown == null) { + thrown = ex; + } + } + } + + } + logger().severe("FailOverExecutionControlProvider: Terminating, failovers exhausted"); + if (thrown == null) { + throw new IllegalArgumentException("All least one parameter must be set to a provider."); + } + throw thrown; + } + + private Logger logger() { + if (logger == null) { + logger = Logger.getLogger("jdk.jshell.execution"); + logger.setLevel(Level.ALL); + } + return logger; + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java Mon Jan 09 11:57:06 2017 -0800 @@ -63,77 +63,15 @@ */ public class JdiDefaultExecutionControl extends JdiExecutionControl { - /** - * Default time-out expressed in milliseconds. - */ - private static final int DEFAULT_TIMEOUT = 5000; - private VirtualMachine vm; private Process process; + private final String remoteAgent; private final Object STOP_LOCK = new Object(); private boolean userCodeRunning = false; /** * Creates an ExecutionControl instance based on a JDI - * {@code LaunchingConnector}. Same as - * {@code JdiDefaultExecutionControl.create(defaultRemoteAgent(), true, null, defaultTimeout())}. - * - * @return the generator - */ - public static ExecutionControl.Generator launch() { - return create(defaultRemoteAgent(), true, null, defaultTimeout()); - } - - /** - * Creates an ExecutionControl instance based on a JDI - * {@code ListeningConnector}. Same as - * {@code JdiDefaultExecutionControl.create(defaultRemoteAgent(), false, host, defaultTimeout())}. - * - * @param host explicit hostname to use, if null use discovered - * hostname, applies to listening only (!isLaunch) - * @return the generator - */ - public static ExecutionControl.Generator listen(String host) { - return create(defaultRemoteAgent(), false, host, defaultTimeout()); - } - - /** - * Creates a JDI based ExecutionControl instance. - * - * @param remoteAgent the remote agent to launch - * @param isLaunch does JDI do the launch? That is, LaunchingConnector, - * otherwise we start explicitly and use ListeningConnector - * @param host explicit hostname to use, if null use discovered - * hostname, applies to listening only (!isLaunch) - * @param timeout the start-up time-out in milliseconds - * @return the generator - */ - public static ExecutionControl.Generator create(String remoteAgent, - boolean isLaunch, String host, int timeout) { - return env -> create(env, remoteAgent, isLaunch, host, timeout); - } - - /** - * Default remote agent. - * - * @return the name of the standard remote agent - */ - public static String defaultRemoteAgent() { - return RemoteExecutionControl.class.getName(); - } - - /** - * Default remote connection time-out - * - * @return time to wait for connection before failing, expressed in milliseconds. - */ - public static int defaultTimeout() { - return DEFAULT_TIMEOUT; - } - - /** - * Creates an ExecutionControl instance based on a JDI * {@code ListeningConnector} or {@code LaunchingConnector}. * * Initialize JDI and use it to launch the remote JVM. Set-up a socket for @@ -150,7 +88,7 @@ * @return the channel * @throws IOException if there are errors in set-up */ - private static ExecutionControl create(ExecutionEnv env, String remoteAgent, + static ExecutionControl create(ExecutionEnv env, String remoteAgent, boolean isLaunch, String host, int timeout) throws IOException { try (final ServerSocket listener = new ServerSocket(0, 1, InetAddress.getLoopbackAddress())) { // timeout on I/O-socket @@ -181,7 +119,8 @@ outputs.put("err", env.userErr()); Map input = new HashMap<>(); input.put("in", env.userIn()); - return remoteInputOutput(socket.getInputStream(), out, outputs, input, (objIn, objOut) -> new JdiDefaultExecutionControl(objOut, objIn, vm, process, deathListeners)); + return remoteInputOutput(socket.getInputStream(), out, outputs, input, + (objIn, objOut) -> new JdiDefaultExecutionControl(objOut, objIn, vm, process, remoteAgent, deathListeners)); } } @@ -192,10 +131,12 @@ * @param cmdin the input for responses */ private JdiDefaultExecutionControl(ObjectOutput cmdout, ObjectInput cmdin, - VirtualMachine vm, Process process, List> deathListeners) { + VirtualMachine vm, Process process, String remoteAgent, + List> deathListeners) { super(cmdout, cmdin); this.vm = vm; this.process = process; + this.remoteAgent = remoteAgent; deathListeners.add(s -> disposeVM()); } @@ -237,7 +178,7 @@ for (ThreadReference thread : vm().allThreads()) { // could also tag the thread (e.g. using name), to find it easier for (StackFrame frame : thread.frames()) { - if (defaultRemoteAgent().equals(frame.location().declaringType().name()) && + if (remoteAgent.equals(frame.location().declaringType().name()) && ( "invoke".equals(frame.location().method().name()) || "varValue".equals(frame.location().method().name()))) { ObjectReference thiz = frame.thisObject(); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControlProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControlProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jshell.execution; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControlProvider; +import jdk.jshell.spi.ExecutionEnv; + +/** + * A provider of remote JDI-controlled execution engines. + * @author Robert Field + */ +public class JdiExecutionControlProvider implements ExecutionControlProvider { + + /** + * The remote agent to launch. + */ + public static final String PARAM_REMOTE_AGENT = "remoteAgent"; + + /** + * Milliseconds before connect timeout. + */ + public static final String PARAM_TIMEOUT = "timeout"; + + /** + * The local hostname to connect to. + */ + public static final String PARAM_HOST_NAME = "hostname"; + + /** + * Should JDI-controlled launching be used? + */ + public static final String PARAM_LAUNCH = "launch"; + + /** + * Default time-out expressed in milliseconds. + */ + private static final int DEFAULT_TIMEOUT = 5000; + + /** + * Create an instance. An instance can be used to + * {@linkplain #generate generate} an {@link ExecutionControl} instance + * that uses the Java Debug Interface as part of the control of a remote + * process. + */ + public JdiExecutionControlProvider() { + } + + /** + * The unique name of this {@code ExecutionControlProvider}. + * + * @return "jdi" + */ + @Override + public String name() { + return "jdi"; + } + + /** + * Create and return the default parameter map for this + * {@code ExecutionControlProvider}. The map can optionally be modified; + * Modified or unmodified it can be passed to + * {@link #generate(jdk.jshell.spi.ExecutionEnv, java.util.Map) }. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    ParameterDescriptionConstant Field
    remoteAgentthe remote agent to launch{@link #PARAM_REMOTE_AGENT}
    timeoutmilliseconds before connect timeout{@link #PARAM_TIMEOUT}
    launch"true" for JDI controlled launch{@link #PARAM_LAUNCH}
    hostnameconnect to the named of the local host ("" for discovered){@link #PARAM_HOST_NAME}
    + * + * @return the default parameter map + */ + @Override + public Map defaultParameters() { + Map dp = new HashMap<>(); + dp.put(PARAM_REMOTE_AGENT, RemoteExecutionControl.class.getName()); + dp.put(PARAM_TIMEOUT, "" + DEFAULT_TIMEOUT); + dp.put(PARAM_HOST_NAME, ""); + dp.put(PARAM_LAUNCH, "false"); + return dp; + } + + @Override + public ExecutionControl generate(ExecutionEnv env, Map parameters) + throws IOException { + Map dp = defaultParameters(); + if (parameters == null) { + parameters = dp; + } + String remoteAgent = parameters.getOrDefault(PARAM_REMOTE_AGENT, dp.get(PARAM_REMOTE_AGENT)); + int timeout = Integer.parseUnsignedInt( + parameters.getOrDefault(PARAM_TIMEOUT, dp.get(PARAM_TIMEOUT))); + String host = parameters.getOrDefault(PARAM_HOST_NAME, dp.get(PARAM_HOST_NAME)); + String sIsLaunch = parameters.getOrDefault(PARAM_LAUNCH, dp.get(PARAM_LAUNCH)).toLowerCase(Locale.ROOT); + boolean isLaunch = sIsLaunch.length() > 0 + && ("true".startsWith(sIsLaunch) || "yes".startsWith(sIsLaunch)); + return JdiDefaultExecutionControl.create(env, remoteAgent, isLaunch, host, timeout); + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java Mon Jan 09 11:57:06 2017 -0800 @@ -27,7 +27,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicReference; -import jdk.jshell.spi.ExecutionControl; /** * An implementation of {@link jdk.jshell.spi.ExecutionControl} which executes @@ -42,15 +41,6 @@ private ThreadGroup execThreadGroup; /** - * Creates a local ExecutionControl instance. - * - * @return the generator - */ - public static ExecutionControl.Generator create() { - return env -> new LocalExecutionControl(); - } - - /** * Creates an instance, delegating loader operations to the specified * delegate. * diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControlProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControlProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jshell.execution; + +import java.util.Map; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControlProvider; +import jdk.jshell.spi.ExecutionEnv; + +/** + * A provider of execution engines which run in the same process as JShell. + * @author Robert Field + */ +public class LocalExecutionControlProvider implements ExecutionControlProvider{ + + /** + * Create an instance. An instance can be used to + * {@linkplain #generate generate} an {@link ExecutionControl} instance + * that executes code in the same process. + */ + public LocalExecutionControlProvider() { + } + + /** + * The unique name of this {@code ExecutionControlProvider}. + * + * @return "local" + */ + @Override + public String name() { + return "local"; + } + + /** + * Create and return the default parameter map for + * {@code LocalExecutionControlProvider}. + * {@code LocalExecutionControlProvider} has no parameters. + * + * @return an empty parameter map + */ + @Override + public Map defaultParameters() { + return ExecutionControlProvider.super.defaultParameters(); + } + + /** + * Create and return a locally executing {@code ExecutionControl} instance. + * + * @param env the execution environment, provided by JShell + * @param parameters the {@linkplain #defaultParameters() default} or + * modified parameter map. + * @return the execution engine + */ + @Override + public ExecutionControl generate(ExecutionEnv env, Map parameters) { + return new LocalExecutionControl(); + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java Mon Jan 09 11:57:06 2017 -0800 @@ -64,36 +64,6 @@ private Util() {} /** - * Create a composite {@link ExecutionControl.Generator} instance that, when - * generating, will try each specified generator until successfully creating - * an {@link ExecutionControl} instance, or, if all fail, will re-throw the - * first exception. - * - * @param gec0 the first instance to try - * @param gecs the second through Nth instance to try - * @return the fail-over generator - */ - public static ExecutionControl.Generator failOverExecutionControlGenerator( - ExecutionControl.Generator gec0, ExecutionControl.Generator... gecs) { - return (ExecutionEnv env) -> { - Throwable thrown; - try { - return gec0.generate(env); - } catch (Throwable ex) { - thrown = ex; - } - for (ExecutionControl.Generator gec : gecs) { - try { - return gec.generate(env); - } catch (Throwable ignore) { - // only care about the first, and only if they all fail - } - } - throw thrown; - }; - } - - /** * Forward commands from the input to the specified {@link ExecutionControl} * instance, then responses back on the output. * @param ec the direct instance of {@link ExecutionControl} to process commands diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java Mon Jan 09 11:57:06 2017 -0800 @@ -25,6 +25,11 @@ package jdk.jshell.spi; import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.Set; /** * This interface specifies the functionality that must provided to implement a @@ -40,31 +45,10 @@ *

    * Methods defined in this interface should only be called by the core JShell * implementation. - *

    - * To install an {@code ExecutionControl}, its {@code Generator} is passed to - * {@link jdk.jshell.JShell.Builder#executionEngine(ExecutionControl.Generator) }. */ public interface ExecutionControl extends AutoCloseable { /** - * Defines a functional interface for creating {@link ExecutionControl} - * instances. - */ - @FunctionalInterface - public interface Generator { - - /** - * Generates an execution engine, given an execution environment. - * - * @param env the context in which the {@link ExecutionControl} is to - * be created - * @return the created instance - * @throws Throwable if problems occurred - */ - ExecutionControl generate(ExecutionEnv env) throws Throwable; - } - - /** * Attempts to load new classes. * * @param cbcs the class name and bytecodes to load @@ -176,9 +160,151 @@ *

    * No calls to methods on this interface should be made after close. */ + @Override void close(); /** + * Search for a provider, then create and return the + * {@code ExecutionControl} instance. + * + * @param env the execution environment (provided by JShell) + * @param name the name of provider + * @param parameters the parameter map. + * @return the execution engine + * @throws Throwable an exception that occurred attempting to find or create + * the execution engine. + * @throws IllegalArgumentException if no ExecutionControlProvider has the + * specified {@code name} and {@code parameters}. + */ + static ExecutionControl generate(ExecutionEnv env, String name, Map parameters) + throws Throwable { + Set keys = parameters == null + ? Collections.emptySet() + : parameters.keySet(); + for (ExecutionControlProvider p : ServiceLoader.load(ExecutionControlProvider.class)) { + if (p.name().equals(name) + && p.defaultParameters().keySet().containsAll(keys)) { + return p.generate(env, parameters); + } + } + throw new IllegalArgumentException("No ExecutionControlProvider with name '" + + name + "' and parameter keys: " + keys.toString()); + } + + /** + * Search for a provider, then create and return the + * {@code ExecutionControl} instance. + * + * @param env the execution environment (provided by JShell) + * @param spec the {@code ExecutionControl} spec, which is described in + * the documentation of this + * {@linkplain jdk.jshell.spi package documentation}. + * @return the execution engine + * @throws Throwable an exception that occurred attempting to find or create + * the execution engine. + * @throws IllegalArgumentException if no ExecutionControlProvider has the + * specified {@code name} and {@code parameters}. + * @throws IllegalArgumentException if {@code spec} is malformed + */ + static ExecutionControl generate(ExecutionEnv env, String spec) + throws Throwable { + class SpecReader { + + int len = spec.length(); + int i = -1; + + char ch; + + SpecReader() { + next(); + } + + boolean more() { + return i < len; + } + + char current() { + return ch; + } + + final boolean next() { + ++i; + if (i < len) { + ch = spec.charAt(i); + return true; + } + i = len; + return false; + } + + void skipWhite() { + while (more() && Character.isWhitespace(ch)) { + next(); + } + } + + String readId() { + skipWhite(); + StringBuilder sb = new StringBuilder(); + while (more() && Character.isJavaIdentifierPart(ch)) { + sb.append(ch); + next(); + } + skipWhite(); + String id = sb.toString(); + if (id.isEmpty()) { + throw new IllegalArgumentException("Expected identifier in " + spec); + } + return id; + } + + void expect(char exp) { + skipWhite(); + if (!more() || ch != exp) { + throw new IllegalArgumentException("Expected '" + exp + "' in " + spec); + } + next(); + skipWhite(); + } + + String readValue() { + expect('('); + int parenDepth = 1; + StringBuilder sb = new StringBuilder(); + while (more()) { + if (ch == ')') { + --parenDepth; + if (parenDepth == 0) { + break; + } + } else if (ch == '(') { + ++parenDepth; + } + sb.append(ch); + next(); + } + expect(')'); + return sb.toString(); + } + } + Map parameters = new HashMap<>(); + SpecReader sr = new SpecReader(); + String name = sr.readId(); + if (sr.more()) { + sr.expect(':'); + while (sr.more()) { + String key = sr.readId(); + String value = sr.readValue(); + parameters.put(key, value); + if (sr.more()) { + sr.expect(','); + } + } + } + return generate(env, name, parameters); + } + + /** * Bundles class name with class bytecodes. */ public static final class ClassBytecodes implements Serializable { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControlProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControlProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jshell.spi; + +import java.util.Collections; +import java.util.Map; + +/** + * The provider used by JShell to generate the execution engine needed to + * evaluate Snippets. Alternate execution engines can be created by + * implementing this interface, then configuring JShell with the provider or + * the providers name and parameter specifier. + * @author Robert Field + */ +public interface ExecutionControlProvider { + + /** + * The unique name of this {@code ExecutionControlProvider}. The name must + * be a sequence of characters from the Basic Multilingual Plane which are + * {@link Character#isJavaIdentifierPart(char) }. + * + * @return the ExecutionControlProvider's name + */ + String name(); + + /** + * Create and return the default parameter map for this + * {@code ExecutionControlProvider}. The map can optionally be modified; + * Modified or unmodified it can be passed to + * {@link #generate(jdk.jshell.spi.ExecutionEnv, java.util.Map) }. + * + * @return the default parameter map + */ + default Map defaultParameters() { + return Collections.emptyMap(); + } + + /** + * Create and return the {@code ExecutionControl} instance. + * + * @param env the execution environment, provided by JShell + * @param parameters the {@linkplain #defaultParameters() default} or + * modified parameter map. + * @return the execution engine + * @throws Throwable an exception that occurred attempting to create the + * execution engine. + */ + ExecutionControl generate(ExecutionEnv env, Map parameters) + throws Throwable; +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java Mon Jan 09 11:57:06 2017 -0800 @@ -28,7 +28,6 @@ import java.io.InputStream; import java.io.PrintStream; import java.util.List; -import jdk.jshell.JShell; /** * Functionality made available to a pluggable JShell execution engine. It is diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java Mon Jan 09 11:57:06 2017 -0800 @@ -30,9 +30,41 @@ * and in the case of executable Snippets, execution. The JShell * implementation includes a default execution engine (currently a remote * process which is JDI controlled). By implementing the - * {@link jdk.jshell.spi.ExecutionControl} interface and installing it with - * {@link jdk.jshell.JShell.Builder#executionEngine(jdk.jshell.spi.ExecutionControl.Generator) } - * other execution engines can be used. + * {@link jdk.jshell.spi.ExecutionControl} interface and its generating class, + * an implementation of the {@link jdk.jshell.spi.ExecutionControlProvider} + * interface, and installing it with + * {@link jdk.jshell.JShell.Builder#executionEngine(String)} + * other execution engines can be used. Where the passed String is an + * {@code ExecutionControl} spec. + *

    + * The {@code ExecutionControl} spec is the {@code ExecutionControlProvider} + * name optionally followed by a parameter specification. + * The syntax of the spec is: + *

    + * spec   := name : params
    + *        | name
    + * name   := identifier
    + * params := param , params
    + *        | param
    + *        |
    + * param  := identifier ( value )
    + * 
    + * Where 'name' is the {@code ExecutionControlProvider} + * {@linkplain ExecutionControlProvider#name() name}. + * Where 'param' is a Map key from + * {@link ExecutionControlProvider#defaultParameters()} and the parenthesized + * value; See, for example, + * {@link jdk.jshell.execution.JdiExecutionControlProvider}. + * Where 'identifier' is a sequence of + * {@linkplain java.lang.Character#isJavaIdentifierPart(char) + * Java identifier part characters} from the Basic Multilingual Plane. + *

    + * For example: + *

      + *
    • local
    • + *
    • jdi:hostname(localhost)
    • + *
    • failover:1(jdi),2(jdi:launch(true),timeout(3000)),3(local)
    • + *
    * * @see jdk.jshell.execution for execution implementation support */ diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/DEFAULT.jsh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/DEFAULT.jsh Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,11 @@ +import java.io.*; +import java.math.*; +import java.net.*; +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.function.*; +import java.util.prefs.*; +import java.util.regex.*; +import java.util.stream.*; + diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/JAVASE.jsh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/JAVASE.jsh Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,173 @@ +import java.applet.*; +import java.awt.*; +import java.awt.color.*; +import java.awt.datatransfer.*; +import java.awt.desktop.*; +import java.awt.dnd.*; +import java.awt.event.*; +import java.awt.font.*; +import java.awt.geom.*; +import java.awt.im.*; +import java.awt.im.spi.*; +import java.awt.image.*; +import java.awt.image.renderable.*; +import java.awt.print.*; +import java.beans.*; +import java.beans.beancontext.*; +import java.io.*; +import java.lang.*; +import java.lang.annotation.*; +import java.lang.instrument.*; +import java.lang.invoke.*; +import java.lang.management.*; +import java.lang.module.*; +import java.lang.ref.*; +import java.lang.reflect.*; +import java.math.*; +import java.net.*; +import java.net.spi.*; +import java.nio.*; +import java.nio.channels.*; +import java.nio.channels.spi.*; +import java.nio.charset.*; +import java.nio.charset.spi.*; +import java.nio.file.*; +import java.nio.file.attribute.*; +import java.nio.file.spi.*; +import java.rmi.*; +import java.rmi.activation.*; +import java.rmi.dgc.*; +import java.rmi.registry.*; +import java.rmi.server.*; +import java.security.*; +import java.security.acl.*; +import java.security.cert.*; +import java.security.interfaces.*; +import java.security.spec.*; +import java.sql.*; +import java.text.*; +import java.text.spi.*; +import java.time.*; +import java.time.chrono.*; +import java.time.format.*; +import java.time.temporal.*; +import java.time.zone.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.*; +import java.util.concurrent.locks.*; +import java.util.function.*; +import java.util.jar.*; +import java.util.logging.*; +import java.util.prefs.*; +import java.util.regex.*; +import java.util.spi.*; +import java.util.stream.*; +import java.util.zip.*; +import javax.accessibility.*; +import javax.annotation.processing.*; +import javax.crypto.*; +import javax.crypto.interfaces.*; +import javax.crypto.spec.*; +import javax.imageio.*; +import javax.imageio.event.*; +import javax.imageio.metadata.*; +import javax.imageio.plugins.bmp.*; +import javax.imageio.plugins.jpeg.*; +import javax.imageio.plugins.tiff.*; +import javax.imageio.spi.*; +import javax.imageio.stream.*; +import javax.lang.model.*; +import javax.lang.model.element.*; +import javax.lang.model.type.*; +import javax.lang.model.util.*; +import javax.management.*; +import javax.management.loading.*; +import javax.management.modelmbean.*; +import javax.management.monitor.*; +import javax.management.openmbean.*; +import javax.management.relation.*; +import javax.management.remote.*; +import javax.management.remote.rmi.*; +import javax.management.timer.*; +import javax.naming.*; +import javax.naming.directory.*; +import javax.naming.event.*; +import javax.naming.ldap.*; +import javax.naming.spi.*; +import javax.net.*; +import javax.net.ssl.*; +import javax.print.*; +import javax.print.attribute.*; +import javax.print.attribute.standard.*; +import javax.print.event.*; +import javax.rmi.ssl.*; +import javax.script.*; +import javax.security.auth.*; +import javax.security.auth.callback.*; +import javax.security.auth.kerberos.*; +import javax.security.auth.login.*; +import javax.security.auth.spi.*; +import javax.security.auth.x500.*; +import javax.security.cert.*; +import javax.security.sasl.*; +import javax.sound.midi.*; +import javax.sound.midi.spi.*; +import javax.sound.sampled.*; +import javax.sound.sampled.spi.*; +import javax.sql.*; +import javax.sql.rowset.*; +import javax.sql.rowset.serial.*; +import javax.sql.rowset.spi.*; +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.colorchooser.*; +import javax.swing.event.*; +import javax.swing.filechooser.*; +import javax.swing.plaf.*; +import javax.swing.plaf.basic.*; +import javax.swing.plaf.metal.*; +import javax.swing.plaf.multi.*; +import javax.swing.plaf.nimbus.*; +import javax.swing.plaf.synth.*; +import javax.swing.table.*; +import javax.swing.text.*; +import javax.swing.text.html.*; +import javax.swing.text.html.parser.*; +import javax.swing.text.rtf.*; +import javax.swing.tree.*; +import javax.swing.undo.*; +import javax.tools.*; +import javax.transaction.xa.*; +import javax.xml.*; +import javax.xml.catalog.*; +import javax.xml.crypto.*; +import javax.xml.crypto.dom.*; +import javax.xml.crypto.dsig.*; +import javax.xml.crypto.dsig.dom.*; +import javax.xml.crypto.dsig.keyinfo.*; +import javax.xml.crypto.dsig.spec.*; +import javax.xml.datatype.*; +import javax.xml.namespace.*; +import javax.xml.parsers.*; +import javax.xml.stream.*; +import javax.xml.stream.events.*; +import javax.xml.stream.util.*; +import javax.xml.transform.*; +import javax.xml.transform.dom.*; +import javax.xml.transform.sax.*; +import javax.xml.transform.stax.*; +import javax.xml.transform.stream.*; +import javax.xml.validation.*; +import javax.xml.xpath.*; +import org.ietf.jgss.*; +import org.w3c.dom.*; +import org.w3c.dom.bootstrap.*; +import org.w3c.dom.events.*; +import org.w3c.dom.ls.*; +import org.w3c.dom.ranges.*; +import org.w3c.dom.traversal.*; +import org.w3c.dom.views.*; +import org.xml.sax.*; +import org.xml.sax.ext.*; +import org.xml.sax.helpers.*; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/PRINTING.jsh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/PRINTING.jsh Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,21 @@ +void print(boolean b) { System.out.print(b); } +void print(char c) { System.out.print(c); } +void print(int i) { System.out.print(i); } +void print(long l) { System.out.print(l); } +void print(float f) { System.out.print(f); } +void print(double d) { System.out.print(d); } +void print(char s[]) { System.out.print(s); } +void print(String s) { System.out.print(s); } +void print(Object obj) { System.out.print(obj); } +void println() { System.out.println(); } +void println(boolean b) { System.out.println(b); } +void println(char c) { System.out.println(c); } +void println(int i) { System.out.println(i); } +void println(long l) { System.out.println(l); } +void println(float f) { System.out.println(f); } +void println(double d) { System.out.println(d); } +void println(char s[]) { System.out.println(s); } +void println(String s) { System.out.println(s); } +void println(Object obj) { System.out.println(obj); } +void printf(Locale l, String format, Object... args) { System.out.printf(l, format, args); } +void printf(String format, Object... args) { System.out.printf(format, args); } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/src/jdk.jshell/share/classes/module-info.java --- a/langtools/src/jdk.jshell/share/classes/module-info.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/src/jdk.jshell/share/classes/module-info.java Mon Jan 09 11:57:06 2017 -0800 @@ -56,6 +56,7 @@ requires transitive java.compiler; requires transitive jdk.jdi; requires transitive java.prefs; + requires java.logging; requires jdk.compiler; requires jdk.internal.le; requires jdk.internal.ed; @@ -66,7 +67,14 @@ exports jdk.jshell.execution; exports jdk.jshell.tool; + uses jdk.jshell.spi.ExecutionControlProvider; uses jdk.internal.editor.spi.BuildInEditorProvider; provides javax.tools.Tool with jdk.internal.jshell.tool.JShellToolProvider; + provides jdk.jshell.spi.ExecutionControlProvider + with jdk.jshell.execution.JdiExecutionControlProvider; + provides jdk.jshell.spi.ExecutionControlProvider + with jdk.jshell.execution.LocalExecutionControlProvider; + provides jdk.jshell.spi.ExecutionControlProvider + with jdk.jshell.execution.FailOverExecutionControlProvider; } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/Makefile --- a/langtools/test/Makefile Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/Makefile Mon Jan 09 11:57:06 2017 -0800 @@ -244,7 +244,7 @@ EXIT_IF_FATAL = status=$$?; if [ $$status -ge $(1) ]; then exit $$status ; fi # Root of all test results -TEST_OUTPUT_DIR = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH)/test/langtools +TEST_OUTPUT_DIR ?= $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH)/test/langtools ABS_TEST_OUTPUT_DIR := \ $(shell mkdir -p $(TEST_OUTPUT_DIR); \ cd $(TEST_OUTPUT_DIR); \ diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/ProblemList.txt --- a/langtools/test/ProblemList.txt Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/ProblemList.txt Mon Jan 09 11:57:06 2017 -0800 @@ -1,6 +1,6 @@ ########################################################################### # -# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -36,17 +36,14 @@ # # jshell -jdk/jshell/EditorPadTest.java 8161276 windows-all Test set-up cannot press buttons -jdk/jshell/ToolBasicTest.java 8139873 generic-all JShell tests failing -jdk/jshell/ExternalEditorTest.java 8170108 generic-all jdk/jshell/ToolFormatTest.java 8170216 solaris-sparcv9 jdk/jshell/ReplaceTest.java 8170216 solaris-sparcv9 +jdk/jshell/UserInputTest.java 8169536 generic-all ########################################################################### # # javac -tools/javac/Paths/AbsolutePathTest.java 8055768 generic-all ToolBox does not close opened files tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java 8057679 generic-all clarify error messages trying to annotate scoping tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.java 8057679 generic-all clarify error messages trying to annotate scoping tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass2.java 8057679 generic-all clarify error messages trying to annotate scoping diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/BadExecutionControlSpecTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/BadExecutionControlSpecTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8168615 + * @summary Test bad input to ExecutionControl.generate + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.javap + * jdk.jshell/jdk.internal.jshell.tool + * @run testng BadExecutionControlSpecTest + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Collections; +import java.util.List; +import org.testng.annotations.Test; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionEnv; +import static org.testng.Assert.fail; + +@Test +public class BadExecutionControlSpecTest { + private static void assertIllegal(String spec) throws Throwable { + try { + ExecutionEnv env = new ExecutionEnv() { + @Override + public InputStream userIn() { + return new ByteArrayInputStream(new byte[0]); + } + + @Override + public PrintStream userOut() { + return new PrintStream(new ByteArrayOutputStream()); + } + + @Override + public PrintStream userErr() { + return new PrintStream(new ByteArrayOutputStream()); + } + + @Override + public List extraRemoteVMOptions() { + return Collections.emptyList(); + } + + @Override + public void closeDown() { + } + + }; + ExecutionControl.generate(env, spec); + fail("Expected exception -- " + spec); + } catch (IllegalArgumentException ex) { + // The expected happened + } + } + + public void syntaxTest() throws Throwable { + assertIllegal(":launch(true)"); + assertIllegal("jdi:launch(true"); + assertIllegal("jdi:launch(true)$"); + assertIllegal("jdi:,"); + } + + public void notFoundTest() throws Throwable { + assertIllegal("fruitbats"); + assertIllegal("jdi:baz(true)"); + assertIllegal("random:launch(true)"); + assertIllegal("jdi:,"); + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/CommandCompletionTest.java --- a/langtools/test/jdk/jshell/CommandCompletionTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/CommandCompletionTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8144095 8164825 8169818 8153402 + * @bug 8144095 8164825 8169818 8153402 8165405 * @summary Test Command Completion * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -138,7 +138,7 @@ @Test public void testEdit() { test(false, new String[]{"--no-startup"}, - a -> assertCompletion(a, "/e|", false, "/edit ", "/exit "), + a -> assertCompletion(a, "/e|", false, "/edit ", "/env ", "/exit "), a -> assertCompletion(a, "/ed|", false, "/edit "), a -> assertClass(a, "class cTest {}", "class", "cTest"), a -> assertMethod(a, "int mTest() { return 0; }", "()I", "mTest"), @@ -158,15 +158,17 @@ public void testHelp() { testNoStartUp( a -> assertCompletion(a, "/help |", false, - "/! ", "/- ", "/ ", "/? ", "/classpath ", "/drop ", - "/edit ", "/exit ", "/help ", "/history ", "/imports ", + "/! ", "/- ", "/ ", "/? ", "/drop ", + "/edit ", "/env ", "/exit ", + "/help ", "/history ", "/imports ", "/list ", "/methods ", "/open ", "/reload ", "/reset ", - "/save ", "/set ", "/types ", "/vars ", "intro ", "shortcuts "), + "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "shortcuts "), a -> assertCompletion(a, "/? |", false, - "/! ", "/- ", "/ ", "/? ", "/classpath ", "/drop ", - "/edit ", "/exit ", "/help ", "/history ", "/imports ", + "/! ", "/- ", "/ ", "/? ", "/drop ", + "/edit ", "/env ", "/exit ", + "/help ", "/history ", "/imports ", "/list ", "/methods ", "/open ", "/reload ", "/reset ", - "/save ", "/set ", "/types ", "/vars ", "intro ", "shortcuts "), + "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "shortcuts "), a -> assertCompletion(a, "/help /s|", false, "/save ", "/set "), a -> assertCompletion(a, "/help /set |", false, @@ -177,17 +179,63 @@ @Test public void testReload() { + String[] ropts = new String[] { "-add-exports ", "-add-modules ", + "-class-path ", "-module-path ", "-quiet ", "-restore " }; + String[] dropts = new String[] { "--add-exports ", "--add-modules ", + "--class-path ", "--module-path ", "--quiet ", "--restore " }; testNoStartUp( - a -> assertCompletion(a, "/reload |", false, "-quiet ", "-restore "), - a -> assertCompletion(a, "/reload -restore |", false, "-quiet"), - a -> assertCompletion(a, "/reload -quiet |", false, "-restore"), - a -> assertCompletion(a, "/reload -restore -quiet |", false) + a -> assertCompletion(a, "/reloa |", false, ropts), + a -> assertCompletion(a, "/relo |", false, ropts), + a -> assertCompletion(a, "/reload -|", false, ropts), + a -> assertCompletion(a, "/reload --|", false, dropts), + a -> assertCompletion(a, "/reload -restore |", false, ropts), + a -> assertCompletion(a, "/reload -restore --|", false, dropts), + a -> assertCompletion(a, "/reload -rest|", false, "-restore "), + a -> assertCompletion(a, "/reload --r|", false, "--restore "), + a -> assertCompletion(a, "/reload -q|", false, "-quiet "), + a -> assertCompletion(a, "/reload -add|", false, "-add-exports ", "-add-modules "), + a -> assertCompletion(a, "/reload -class-path . -quiet |", false, ropts) + ); + } + + @Test + public void testEnv() { + String[] ropts = new String[] { "-add-exports ", "-add-modules ", + "-class-path ", "-module-path " }; + String[] dropts = new String[] { "--add-exports ", "--add-modules ", + "--class-path ", "--module-path " }; + testNoStartUp( + a -> assertCompletion(a, "/env |", false, ropts), + a -> assertCompletion(a, "/env -|", false, ropts), + a -> assertCompletion(a, "/env --|", false, dropts), + a -> assertCompletion(a, "/env --a|", false, "--add-exports ", "--add-modules "), + a -> assertCompletion(a, "/env -add-|", false, "-add-exports ", "-add-modules "), + a -> assertCompletion(a, "/env -class-path . |", false, ropts), + a -> assertCompletion(a, "/env -class-path . --|", false, dropts) + ); + } + + @Test + public void testReset() { + String[] ropts = new String[] { "-add-exports ", "-add-modules ", + "-class-path ", "-module-path " }; + String[] dropts = new String[] { "--add-exports ", "--add-modules ", + "--class-path ", "--module-path " }; + testNoStartUp( + a -> assertCompletion(a, "/reset |", false, ropts), + a -> assertCompletion(a, "/res -m|", false, "-module-path "), + a -> assertCompletion(a, "/res -module-|", false, "-module-path "), + a -> assertCompletion(a, "/res --m|", false, "--module-path "), + a -> assertCompletion(a, "/res --module-|", false, "--module-path "), + a -> assertCompletion(a, "/reset -add|", false, "-add-exports ", "-add-modules "), + a -> assertCompletion(a, "/rese -class-path . |", false, ropts), + a -> assertCompletion(a, "/rese -class-path . --|", false, dropts) ); } @Test public void testVarsMethodsTypes() { - test(false, new String[]{"--no-startup"}, + testNoStartUp( a -> assertCompletion(a, "/v|", false, "/vars "), a -> assertCompletion(a, "/m|", false, "/methods "), a -> assertCompletion(a, "/t|", false, "/types "), @@ -245,9 +293,6 @@ @Test public void testClassPath() throws IOException { - testNoStartUp( - a -> assertCompletion(a, "/classp|", false, "/classpath ") - ); Compiler compiler = new Compiler(); Path outDir = compiler.getPath("testClasspathCompletion"); Files.createDirectories(outDir); @@ -259,8 +304,13 @@ compiler.jar(outDir, jarName, "pkg/A.class"); compiler.getPath(outDir).resolve(jarName); List paths = listFiles(outDir, CLASSPATH_FILTER); + String[] pathArray = paths.toArray(new String[paths.size()]); testNoStartUp( - a -> assertCompletion(a, "/classpath " + outDir + "/|", false, paths.toArray(new String[paths.size()])) + a -> assertCompletion(a, "/env -class-path " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env --class-path " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env -clas " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env --class-p " + outDir + "/|", false, pathArray), + a -> assertCompletion(a, "/env --module-path . --class-p " + outDir + "/|", false, pathArray) ); } @@ -275,7 +325,7 @@ .collect(Collectors.toList()); } testNoStartUp( - a -> assertCompletion(a, "/classpath ~/|", false, completions.toArray(new String[completions.size()])) + a -> assertCompletion(a, "/env --class-path ~/|", false, completions.toArray(new String[completions.size()])) ); } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/DyingRemoteAgent.java --- a/langtools/test/jdk/jshell/DyingRemoteAgent.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/DyingRemoteAgent.java Mon Jan 09 11:57:06 2017 -0800 @@ -21,10 +21,11 @@ * questions. */ +import java.util.Map; import jdk.jshell.JShell; -import jdk.jshell.execution.JdiDefaultExecutionControl; +import jdk.jshell.execution.JdiExecutionControlProvider; import jdk.jshell.execution.RemoteExecutionControl; -import static jdk.jshell.execution.JdiDefaultExecutionControl.defaultTimeout; +import jdk.jshell.spi.ExecutionControlProvider; class DyingRemoteAgent extends RemoteExecutionControl { @@ -39,11 +40,13 @@ } static JShell state(boolean isLaunch, String host) { - return JShell.builder().executionEngine( - JdiDefaultExecutionControl.create( - DyingRemoteAgent.class.getName(), - isLaunch, - host, - defaultTimeout())).build(); + ExecutionControlProvider ecp = new JdiExecutionControlProvider(); + Map pm = ecp.defaultParameters(); + pm.put(JdiExecutionControlProvider.PARAM_REMOTE_AGENT, DyingRemoteAgent.class.getName()); + pm.put(JdiExecutionControlProvider.PARAM_HOST_NAME, host==null? "" : host); + pm.put(JdiExecutionControlProvider.PARAM_LAUNCH, ""+isLaunch); + return JShell.builder() + .executionEngine(ecp, pm) + .build(); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/EditorTestBase.java --- a/langtools/test/jdk/jshell/EditorTestBase.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/EditorTestBase.java Mon Jan 09 11:57:06 2017 -0800 @@ -219,7 +219,7 @@ public void testStartup() { testEditor(true, new String[0], a -> assertEditInput(a, "/ed", s -> assertTrue(s.isEmpty(), "Checking of startup: " + s), this::cancel), - a -> assertEditInput(a, "/ed printf", assertStartsWith("void printf"), this::cancel)); + a -> assertEditInput(a, "/ed s1", assertStartsWith("import"), this::cancel)); } @Test diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ExecutionControlSpecTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/ExecutionControlSpecTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8168615 + * @summary Test ExecutionControlProvider specs can load user ExecutionControlProviders + * with direct maps. + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.javap + * jdk.jshell/jdk.jshell.execution + * jdk.jshell/jdk.jshell.spi + * @library /tools/lib + * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask + * @build KullaTesting Compiler + * @run testng ExecutionControlSpecTest + */ + +import java.nio.file.Path; +import java.nio.file.Paths; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.Test; +import org.testng.annotations.BeforeMethod; + +public class ExecutionControlSpecTest extends KullaTesting { + + ClassLoader ccl; + + @BeforeMethod + @Override + public void setUp() { + String mod = "my.ec"; + String pkg = "package my.ec;\n"; + Compiler compiler = new Compiler(); + Path modDir = Paths.get("mod"); + compiler.compile(modDir, + pkg + + "public class PrefixingExecutionControl extends jdk.jshell.execution.LocalExecutionControl {\n" + + " @Override\n" + + " public String invoke(String className, String methodName)\n" + + " throws RunException, InternalException, EngineTerminationException {\n" + + " return \"Blah:\" + super.invoke(className, methodName);\n" + + " }\n" + + "}\n", + pkg + + "public class PrefixingExecutionControlProvider implements jdk.jshell.spi.ExecutionControlProvider {\n" + + " @Override\n" + + " public String name() {\n" + + " return \"prefixing\";\n" + + " }\n" + + " @Override\n" + + " public jdk.jshell.spi.ExecutionControl generate(jdk.jshell.spi.ExecutionEnv env,\n" + + " java.util.Map parameters) {\n" + + " return new PrefixingExecutionControl();\n" + + " }\n" + + "}\n", + "module my.ec {\n" + + " requires transitive jdk.jshell;\n" + + " provides jdk.jshell.spi.ExecutionControlProvider\n" + + " with my.ec.PrefixingExecutionControlProvider;\n" + + " }"); + Path modPath = compiler.getPath(modDir); + ccl = createAndRunFromModule(mod, modPath); + + setUp(builder -> builder.executionEngine("prefixing")); + } + + @AfterMethod + @Override + public void tearDown() { + super.tearDown(); + Thread.currentThread().setContextClassLoader(ccl); + } + + @Test + public void testPrefix() { + assertEval("43;", "Blah:43"); + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/FailOverDirectExecutionControlTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/FailOverDirectExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8168615 + * @summary Test that fail-over works for fail-over ExecutionControlProvider + * with direct maps. + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.javap + * jdk.jshell/jdk.jshell.execution + * jdk.jshell/jdk.jshell.spi + * @library /tools/lib + * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask + * @build KullaTesting ExecutionControlTestBase Compiler + * @run testng FailOverDirectExecutionControlTest + */ + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.Test; +import org.testng.annotations.BeforeMethod; +import jdk.jshell.execution.FailOverExecutionControlProvider; +import jdk.jshell.spi.ExecutionControlProvider; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +@Test +public class FailOverDirectExecutionControlTest extends ExecutionControlTestBase { + + ClassLoader ccl; + ExecutionControlProvider provider; + Map> logged = new HashMap<>(); + + private class LogTestHandler extends Handler { + + LogTestHandler() { + setLevel(Level.ALL); + setFilter(lr -> lr.getLoggerName().equals("jdk.jshell.execution")); + } + + @Override + public void publish(LogRecord lr) { + List l = logged.get(lr.getLevel()); + if (l == null) { + l = new ArrayList<>(); + logged.put(lr.getLevel(), l); + } + l.add(lr.getMessage()); + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + + } + + @BeforeMethod + @Override + public void setUp() { + Logger logger = Logger.getLogger("jdk.jshell.execution"); + logger.setLevel(Level.ALL); + logger.addHandler(new LogTestHandler()); + Compiler compiler = new Compiler(); + Path modDir = Paths.get("mod"); + compiler.compile(modDir, + "package my.provide; import java.util.Map;\n" + + "import jdk.jshell.spi.ExecutionControl;\n" + + "import jdk.jshell.spi.ExecutionControlProvider;\n" + + "import jdk.jshell.spi.ExecutionEnv;\n" + + "public class AlwaysFailingProvider implements ExecutionControlProvider {\n" + + " @Override\n" + + " public String name() {\n" + + " return \"alwaysFailing\";\n" + + " }\n" + + " @Override\n" + + " public ExecutionControl generate(ExecutionEnv env, Map parameters) throws Throwable {\n" + + " throw new UnsupportedOperationException(\"This operation intentionally broken.\");\n" + + " }\n" + + "}\n", + "module my.provide {\n" + + " requires transitive jdk.jshell;\n" + + " provides jdk.jshell.spi.ExecutionControlProvider\n" + + " with my.provide.AlwaysFailingProvider;\n" + + " }"); + Path modPath = compiler.getPath(modDir); + ccl = createAndRunFromModule("my.provide", modPath); + + provider = new FailOverExecutionControlProvider(); + Map pm = provider.defaultParameters(); + pm.put("0", "alwaysFailing"); + pm.put("1", "alwaysFailing"); + pm.put("2", "jdi"); + setUp(builder -> builder.executionEngine(provider, pm)); + } + + @AfterMethod + @Override + public void tearDown() { + super.tearDown(); + Thread.currentThread().setContextClassLoader(ccl); + } + + @Override + public void variables() { + super.variables(); + assertEquals(logged.get(Level.FINEST).size(), 1); + assertEquals(logged.get(Level.FINE).size(), 2); + assertEquals(logged.get(Level.WARNING).size(), 2); + assertNull(logged.get(Level.SEVERE)); + String log = logged.get(Level.WARNING).get(0); + assertTrue(log.contains("Failure failover -- 0 = alwaysFailing"), log); + assertTrue(log.contains("This operation intentionally broken"), log); + log = logged.get(Level.WARNING).get(1); + assertTrue(log.contains("Failure failover -- 1 = alwaysFailing"), log); + assertTrue(log.contains("This operation intentionally broken"), log); + log = logged.get(Level.FINEST).get(0); + assertTrue(log.contains("Success failover -- 2 = jdi"), log); + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java --- a/langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8131029 8160127 8159935 8169519 + * @bug 8131029 8160127 8159935 8169519 8168615 * @summary Test that fail-over works for fail-over ExecutionControl generators. * @modules jdk.jshell/jdk.jshell.execution * jdk.jshell/jdk.jshell.spi @@ -33,9 +33,6 @@ import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; -import static jdk.jshell.execution.JdiDefaultExecutionControl.defaultTimeout; -import static jdk.jshell.execution.Util.failOverExecutionControlGenerator; @Test public class FailOverExecutionControlDyingLaunchTest extends ExecutionControlTestBase { @@ -43,12 +40,7 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(failOverExecutionControlGenerator( - JdiDefaultExecutionControl.create( - DyingRemoteAgent.class.getName(), - true, - null, - defaultTimeout()), - JdiDefaultExecutionControl.launch()))); + setUp(builder -> builder.executionEngine( + "failover:0(jdi:remoteAgent(DyingRemoteAgent),launch(true)), 4(jdi:launch(true))")); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java --- a/langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -33,9 +33,6 @@ import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; -import static jdk.jshell.execution.JdiDefaultExecutionControl.defaultTimeout; -import static jdk.jshell.execution.Util.failOverExecutionControlGenerator; @Test public class FailOverExecutionControlHangingLaunchTest extends ExecutionControlTestBase { @@ -43,12 +40,7 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(failOverExecutionControlGenerator( - JdiDefaultExecutionControl.create( - HangingRemoteAgent.class.getName(), - true, - null, - defaultTimeout()), - JdiDefaultExecutionControl.launch()))); + setUp(builder -> builder.executionEngine( + "failover:0(jdi:remoteAgent(HangingRemoteAgent),launch(true)), 1(jdi:launch(true))")); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java --- a/langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -34,9 +34,6 @@ import java.net.InetAddress; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; -import static jdk.jshell.execution.JdiDefaultExecutionControl.defaultTimeout; -import static jdk.jshell.execution.Util.failOverExecutionControlGenerator; @Test public class FailOverExecutionControlHangingListenTest extends ExecutionControlTestBase { @@ -45,12 +42,8 @@ @Override public void setUp() { String loopback = InetAddress.getLoopbackAddress().getHostAddress(); - setUp(builder -> builder.executionEngine(failOverExecutionControlGenerator( - JdiDefaultExecutionControl.create( - HangingRemoteAgent.class.getName(), - false, - loopback, - defaultTimeout()), - JdiDefaultExecutionControl.listen(loopback)))); + setUp(builder -> builder.executionEngine( + "failover:0(jdi:remoteAgent(HangingRemoteAgent),hostname(" + loopback + "))," + + "1(jdi:hostname(" + loopback + "))")); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/FailOverExecutionControlTest.java --- a/langtools/test/jdk/jshell/FailOverExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/FailOverExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8131029 8160127 8159935 + * @bug 8131029 8160127 8159935 8168615 * @summary Test that fail-over works for fail-over ExecutionControl generators. * @modules jdk.jshell/jdk.jshell.execution * jdk.jshell/jdk.jshell.spi @@ -33,10 +33,6 @@ import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; -import jdk.jshell.spi.ExecutionControl; -import jdk.jshell.spi.ExecutionEnv; -import static jdk.jshell.execution.Util.failOverExecutionControlGenerator; @Test public class FailOverExecutionControlTest extends ExecutionControlTestBase { @@ -44,18 +40,7 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(failOverExecutionControlGenerator( - new AlwaysFailingGenerator(), - new AlwaysFailingGenerator(), - JdiDefaultExecutionControl.launch()))); + setUp(builder -> builder.executionEngine("failover:0(nonExistent), 1(nonExistent), 2(jdi:launch(true))")); } - class AlwaysFailingGenerator implements ExecutionControl.Generator { - - @Override - public ExecutionControl generate(ExecutionEnv env) throws UnsupportedOperationException { - throw new UnsupportedOperationException("This operation intentionally broken."); - } - - } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/HangingRemoteAgent.java --- a/langtools/test/jdk/jshell/HangingRemoteAgent.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/HangingRemoteAgent.java Mon Jan 09 11:57:06 2017 -0800 @@ -21,9 +21,11 @@ * questions. */ +import java.util.Map; import jdk.jshell.JShell; -import jdk.jshell.execution.JdiDefaultExecutionControl; +import jdk.jshell.execution.JdiExecutionControlProvider; import jdk.jshell.execution.RemoteExecutionControl; +import jdk.jshell.spi.ExecutionControlProvider; /** * Hang for three minutes (long enough to cause a timeout). @@ -51,12 +53,15 @@ } static JShell state(boolean isLaunch, String host) { - return JShell.builder().executionEngine( - JdiDefaultExecutionControl.create( - HangingRemoteAgent.class.getName(), - isLaunch, - host, - TIMEOUT)).build(); + ExecutionControlProvider ecp = new JdiExecutionControlProvider(); + Map pm = ecp.defaultParameters(); + pm.put(JdiExecutionControlProvider.PARAM_REMOTE_AGENT, HangingRemoteAgent.class.getName()); + pm.put(JdiExecutionControlProvider.PARAM_HOST_NAME, host==null? "" : host); + pm.put(JdiExecutionControlProvider.PARAM_LAUNCH, ""+isLaunch); + pm.put(JdiExecutionControlProvider.PARAM_TIMEOUT, ""+TIMEOUT); + return JShell.builder() + .executionEngine(ecp, pm) + .build(); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java --- a/langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -31,7 +31,6 @@ import org.testng.annotations.Test; import jdk.jshell.JShell; -import jdk.jshell.execution.JdiDefaultExecutionControl; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; @@ -44,7 +43,7 @@ public void badOptionLaunchTest() { try { JShell.builder() - .executionEngine(JdiDefaultExecutionControl.launch()) + .executionEngine("jdi:launch(true)") .remoteVMOptions("-BadBadOption") .build(); } catch (IllegalStateException ex) { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java --- a/langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -31,7 +31,6 @@ import org.testng.annotations.Test; import jdk.jshell.JShell; -import jdk.jshell.execution.JdiDefaultExecutionControl; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; @@ -44,7 +43,7 @@ public void badOptionListenTest() { try { JShell.builder() - .executionEngine(JdiDefaultExecutionControl.listen(null)) + .executionEngine("jdi") .remoteVMOptions("-BadBadOption") .build(); } catch (IllegalStateException ex) { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java --- a/langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8169519 + * @bug 8169519 8168615 * @summary Tests for JDI connector failure * @modules jdk.jshell/jdk.jshell jdk.jshell/jdk.jshell.spi jdk.jshell/jdk.jshell.execution * @run testng JdiBogusHostListenExecutionControlTest @@ -31,7 +31,6 @@ import org.testng.annotations.Test; import jdk.jshell.JShell; -import jdk.jshell.execution.JdiDefaultExecutionControl; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; @@ -44,7 +43,7 @@ public void badOptionListenTest() { try { JShell.builder() - .executionEngine(JdiDefaultExecutionControl.listen("BattyRumbleBuckets-Snurfle-99-Blip")) + .executionEngine("jdi:hostname(BattyRumbleBuckets-Snurfle-99-Blip)") .build(); } catch (IllegalStateException ex) { assertTrue(ex.getMessage().startsWith(EXPECTED_ERROR), ex.getMessage()); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java --- a/langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8164518 + * @bug 8164518 8168615 * @summary Tests for standard JDI connector (without failover) -- launching * @modules jdk.jshell/jdk.jshell.execution * @build KullaTesting ExecutionControlTestBase @@ -33,7 +33,6 @@ import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; @Test public class JdiLaunchingExecutionControlTest extends ExecutionControlTestBase { @@ -41,6 +40,6 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(JdiDefaultExecutionControl.launch())); + setUp(builder -> builder.executionEngine("jdi:launch(true)")); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java --- a/langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -33,7 +33,6 @@ import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; @Test public class JdiListeningExecutionControlTest extends ExecutionControlTestBase { @@ -41,6 +40,6 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(JdiDefaultExecutionControl.listen(null))); + setUp(builder -> builder.executionEngine("jdi")); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java --- a/langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -33,7 +33,6 @@ import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; -import jdk.jshell.execution.JdiDefaultExecutionControl; @Test public class JdiListeningLocalhostExecutionControlTest extends ExecutionControlTestBase { @@ -41,6 +40,6 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(JdiDefaultExecutionControl.listen("localhost"))); + setUp(builder -> builder.executionEngine("jdi:hostname(localhost)")); } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/KullaTesting.java --- a/langtools/test/jdk/jshell/KullaTesting.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/KullaTesting.java Mon Jan 09 11:57:06 2017 -0800 @@ -28,6 +28,10 @@ import java.io.PrintStream; import java.io.StringWriter; import java.lang.reflect.Method; +import java.lang.module.Configuration; +import java.lang.module.ModuleFinder; +import java.lang.reflect.Layer; +import java.nio.file.Paths; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -209,6 +213,19 @@ classpath = null; } + public ClassLoader createAndRunFromModule(String moduleName, Path modPath) { + ModuleFinder finder = ModuleFinder.of(modPath); + Layer parent = Layer.boot(); + Configuration cf = parent.configuration() + .resolveRequires(finder, ModuleFinder.of(), Set.of(moduleName)); + ClassLoader scl = ClassLoader.getSystemClassLoader(); + Layer layer = parent.defineModulesWithOneLoader(cf, scl); + ClassLoader loader = layer.findLoader(moduleName); + ClassLoader ccl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(loader); + return ccl; + } + public List assertUnresolvedDependencies(DeclarationSnippet key, int unresolvedSize) { List unresolved = getState().unresolvedDependencies(key).collect(toList()); assertEquals(unresolved.size(), unresolvedSize, "Input: " + key.source() + ", checking unresolved: "); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/MyExecutionControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/MyExecutionControl.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import com.sun.jdi.VMDisconnectedException; +import com.sun.jdi.VirtualMachine; +import jdk.jshell.execution.JdiExecutionControl; +import jdk.jshell.execution.JdiInitiator; +import jdk.jshell.execution.Util; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControl.EngineTerminationException; +import jdk.jshell.spi.ExecutionEnv; +import static org.testng.Assert.fail; +import static jdk.jshell.execution.Util.remoteInputOutput; + +class MyExecutionControl extends JdiExecutionControl { + + private static final String REMOTE_AGENT = MyRemoteExecutionControl.class.getName(); + private static final int TIMEOUT = 2000; + + private VirtualMachine vm; + private Process process; + + /** + * Creates an ExecutionControl instance based on a JDI + * {@code ListeningConnector} or {@code LaunchingConnector}. + * + * Initialize JDI and use it to launch the remote JVM. Set-up a socket for + * commands and results. This socket also transports the user + * input/output/error. + * + * @param env the context passed by + * {@link jdk.jshell.spi.ExecutionControl#start(jdk.jshell.spi.ExecutionEnv) } + * @return the channel + * @throws IOException if there are errors in set-up + */ + static ExecutionControl make(ExecutionEnv env, UserJdiUserRemoteTest test) throws IOException { + try (final ServerSocket listener = new ServerSocket(0)) { + // timeout for socket + listener.setSoTimeout(TIMEOUT); + int port = listener.getLocalPort(); + + // Set-up the JDI connection + List opts = new ArrayList<>(env.extraRemoteVMOptions()); + opts.add("-classpath"); + opts.add(System.getProperty("java.class.path") + + System.getProperty("path.separator") + + System.getProperty("user.dir")); + JdiInitiator jdii = new JdiInitiator(port, + opts, REMOTE_AGENT, true, null, TIMEOUT); + VirtualMachine vm = jdii.vm(); + Process process = jdii.process(); + + List> deathListeners = new ArrayList<>(); + deathListeners.add(s -> env.closeDown()); + Util.detectJdiExitEvent(vm, s -> { + for (Consumer h : deathListeners) { + h.accept(s); + } + }); + + // Set-up the commands/reslts on the socket. Piggy-back snippet + // output. + Socket socket = listener.accept(); + // out before in -- match remote creation so we don't hang + OutputStream out = socket.getOutputStream(); + Map outputs = new HashMap<>(); + outputs.put("out", env.userOut()); + outputs.put("err", env.userErr()); + outputs.put("aux", test.auxStream); + Map input = new HashMap<>(); + input.put("in", env.userIn()); + ExecutionControl myec = remoteInputOutput(socket.getInputStream(), + out, outputs, input, + (objIn, objOut) -> new MyExecutionControl(objOut, objIn, vm, process, deathListeners)); + test.currentEC = myec; + return myec; + } + } + + /** + * Create an instance. + * + * @param out the output for commands + * @param in the input for responses + */ + private MyExecutionControl(ObjectOutput out, ObjectInput in, + VirtualMachine vm, Process process, + List> deathListeners) { + super(out, in); + this.vm = vm; + this.process = process; + deathListeners.add(s -> disposeVM()); + } + + @Override + public void close() { + super.close(); + disposeVM(); + } + + private synchronized void disposeVM() { + try { + if (vm != null) { + vm.dispose(); // This could NPE, so it is caught below + vm = null; + } + } catch (VMDisconnectedException ex) { + // Ignore if already closed + } catch (Throwable e) { + fail("disposeVM threw: " + e); + } finally { + if (process != null) { + process.destroy(); + process = null; + } + } + } + + @Override + protected synchronized VirtualMachine vm() throws EngineTerminationException { + if (vm == null) { + throw new EngineTerminationException("VM closed"); + } else { + return vm; + } + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/MyExecutionControlProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/MyExecutionControlProvider.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Map; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControlProvider; +import jdk.jshell.spi.ExecutionEnv; + +public class MyExecutionControlProvider implements ExecutionControlProvider { + + private final UserJdiUserRemoteTest test; + + MyExecutionControlProvider(UserJdiUserRemoteTest test) { + this.test = test; + } + + @Override + public String name() { + return "my"; + } + + @Override + public ExecutionControl generate(ExecutionEnv env, Map parameters) throws Throwable { + return MyExecutionControl.make(env, test); + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/MyRemoteExecutionControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/MyRemoteExecutionControl.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.net.Socket; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; +import jdk.jshell.execution.DirectExecutionControl; +import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControl.EngineTerminationException; +import jdk.jshell.spi.ExecutionControl.InternalException; +import jdk.jshell.spi.ExecutionControl.RunException; +import static jdk.jshell.execution.Util.forwardExecutionControlAndIO; + +/** + * A custom remote agent to verify aux channel and custom ExecutionControl. + */ +public class MyRemoteExecutionControl extends DirectExecutionControl implements ExecutionControl { + + static PrintStream auxPrint; + + /** + * Launch the agent, connecting to the JShell-core over the socket specified + * in the command-line argument. + * + * @param args standard command-line arguments, expectation is the socket + * number is the only argument + * @throws Exception any unexpected exception + */ + public static void main(String[] args) throws Exception { + try { + String loopBack = null; + Socket socket = new Socket(loopBack, Integer.parseInt(args[0])); + InputStream inStream = socket.getInputStream(); + OutputStream outStream = socket.getOutputStream(); + Map> outputs = new HashMap<>(); + outputs.put("out", st -> System.setOut(new PrintStream(st, true))); + outputs.put("err", st -> System.setErr(new PrintStream(st, true))); + outputs.put("aux", st -> { auxPrint = new PrintStream(st, true); }); + Map> input = new HashMap<>(); + input.put("in", st -> System.setIn(st)); + forwardExecutionControlAndIO(new MyRemoteExecutionControl(), inStream, outStream, outputs, input); + } catch (Throwable ex) { + throw ex; + } + } + + @Override + public String varValue(String className, String varName) + throws RunException, EngineTerminationException, InternalException { + auxPrint.print(varName); + return super.varValue(className, varName); + } + + @Override + public Object extensionCommand(String className, Object arg) + throws RunException, EngineTerminationException, InternalException { + if (!arg.equals("test")) { + throw new InternalException("expected extensionCommand arg to be 'test' got: " + arg); + } + return "ribbit"; + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ReplToolTesting.java --- a/langtools/test/jdk/jshell/ReplToolTesting.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/ReplToolTesting.java Mon Jan 09 11:57:06 2017 -0800 @@ -25,6 +25,7 @@ import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -54,22 +55,45 @@ private final static String DEFAULT_STARTUP_MESSAGE = "| Welcome to"; final static List START_UP_IMPORTS = Stream.of( - "java.util.*", "java.io.*", "java.math.*", "java.net.*", + "java.nio.file.*", + "java.util.*", "java.util.concurrent.*", + "java.util.function.*", "java.util.prefs.*", - "java.util.regex.*") + "java.util.regex.*", + "java.util.stream.*") .map(s -> new ImportInfo("import " + s + ";", "", s)) .collect(toList()); - final static List START_UP_METHODS = Stream.of( - new MethodInfo("void printf(String format, Object... args) { System.out.printf(format, args); }", - "(String,Object...)void", "printf")) + final static List START_UP_METHODS = Stream.of() + .collect(toList()); + final static List START_UP_CMD_METHOD = Stream.of() .collect(toList()); - final static List START_UP_CMD_METHOD = Stream.of( - "| printf (String,Object...)void") - .collect(toList()); + final static List PRINTING_CMD_METHOD = Stream.of( + "| print (boolean)void", + "| print (char)void", + "| print (int)void", + "| print (long)void", + "| print (float)void", + "| print (double)void", + "| print (char s[])void", + "| print (String)void", + "| print (Object)void", + "| println ()void", + "| println (boolean)void", + "| println (char)void", + "| println (int)void", + "| println (long)void", + "| println (float)void", + "| println (double)void", + "| println (char s[])void", + "| println (String)void", + "| println (Object)void", + "| printf (Locale,String,Object...)void", + "| printf (String,Object...)void") + .collect(toList()); final static List START_UP = Collections.unmodifiableList( Stream.concat(START_UP_IMPORTS.stream(), START_UP_METHODS.stream()) .map(s -> s.getSource()) @@ -432,9 +456,14 @@ assertCommand(after, cmd, out, "", null, "", ""); } - public void assertCommandOutputContains(boolean after, String cmd, String has) { - assertCommandCheckOutput(after, cmd, (s) -> - assertTrue(s.contains(has), "Output: \'" + s + "' does not contain: " + has)); + public void assertCommandOutputContains(boolean after, String cmd, String... hasThese) { + assertCommandCheckOutput(after, cmd, (s) + -> assertTrue(Arrays.stream(hasThese) + .allMatch(has -> s.contains(has)), + "Output: \'" + s + "' does not contain: " + + Arrays.stream(hasThese) + .filter(has -> !s.contains(has)) + .collect(Collectors.joining(", ")))); } public void assertCommandOutputStartsWith(boolean after, String cmd, String starts) { @@ -467,7 +496,7 @@ } public Consumer assertStartsWith(String prefix) { - return (output) -> assertTrue(output.startsWith(prefix), "Output: \'" + output + "' does not start with: " + prefix); + return (output) -> assertTrue(output.trim().startsWith(prefix), "Output: \'" + output + "' does not start with: " + prefix); } public void assertOutput(String got, String expected, String display) { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/SimpleRegressionTest.java --- a/langtools/test/jdk/jshell/SimpleRegressionTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/SimpleRegressionTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -22,7 +22,7 @@ */ /* - * @test 8130450 8158906 8154374 8166400 + * @test 8130450 8158906 8154374 8166400 8171892 * @summary simple regression test * @build KullaTesting TestingInputStream * @run testng SimpleRegressionTest @@ -150,7 +150,7 @@ assertEval("C.class.getClassLoader() == Thread.currentThread().getContextClassLoader()", "true"); } - public void testArayRepresentation() { + public void testArrayRepresentation() { assertEval("new int[4]", "int[4] { 0, 0, 0, 0 }"); assertEval("new int[0]", "int[0] { }"); assertEval("new byte[2]", "byte[2] { 0, 0 }"); @@ -162,8 +162,24 @@ assertEval("new char[] { 'a', 34, 77 }", "char[3] { 'a', '\"', 'M' }"); assertEval("new boolean[] { false, true }", "boolean[2] { false, true }"); assertEval("new int[][] { new int[] {44, 55}, new int[] {88,99}}", - "int[][2] { int[2] { 44, 55 }, int[2] { 88, 99 } }"); + "int[2][] { int[2] { 44, 55 }, int[2] { 88, 99 } }"); assertEval("new Object[] { \"howdy\", new int[] { 33, 44, 55 }, new String[] { \"up\", \"down\" }}", "Object[3] { \"howdy\", int[3] { 33, 44, 55 }, String[2] { \"up\", \"down\" } }"); } + + public void testMultiDimArrayRepresentation() { + assertEval("new int[3][1]", + "int[3][] { int[1] { 0 }, int[1] { 0 }, int[1] { 0 } }"); + assertEval("new int[3][]", + "int[3][] { null, null, null }"); + assertEval("new int[][] { new int[] {44}, new int[] {77, 88,99}}", + "int[2][] { int[1] { 44 }, int[3] { 77, 88, 99 } }"); + assertEval("new String[3][1]", + "String[3][] { String[1] { null }, String[1] { null }, String[1] { null } }"); + assertEval("class C { }"); + assertEval("new C[3][2]", + "C[3][] { C[2] { null, null }, C[2] { null, null }, C[2] { null, null } }"); + assertEval("new boolean[2][1][3]", + "boolean[2][][] { boolean[1][] { boolean[3] { false, false, false } }, boolean[1][] { boolean[3] { false, false, false } } }"); + } } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/StartOptionTest.java --- a/langtools/test/jdk/jshell/StartOptionTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/StartOptionTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -22,7 +22,7 @@ */ /* - * @test 8151754 8080883 8160089 8170162 8166581 + * @test 8151754 8080883 8160089 8170162 8166581 8172102 * @summary Testing start-up options. * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -33,17 +33,14 @@ * @run testng StartOptionTest */ -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.HashMap; import java.util.Locale; -import java.util.ServiceLoader; import java.util.function.Consumer; -import javax.tools.Tool; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -157,9 +154,8 @@ Path p = compiler.getPath("file.txt"); compiler.writeToFile(p); start("", "Argument to startup missing.", "--startup"); - start("", "Only one --startup or --no-startup option may be used.", "--startup", p.toString(), "--startup", p.toString()); - start("", "Only one --startup or --no-startup option may be used.", "--no-startup", "--startup", p.toString()); - start("", "Only one --startup or --no-startup option may be used.", "--startup", p.toString(), "--no-startup"); + start("", "Conflicting options: both --startup and --no-startup were used.", "--no-startup", "--startup", p.toString()); + start("", "Conflicting options: both --startup and --no-startup were used.", "--startup", p.toString(), "--no-startup"); start("", "Argument to startup missing.", "--no-startup", "--startup"); } @@ -176,6 +172,7 @@ public void testStartupUnknown() throws Exception { start("", "File 'UNKNOWN' for '--startup' is not found.", "--startup", "UNKNOWN"); + start("", "File 'UNKNOWN' for '--startup' is not found.", "--startup", "DEFAULT", "--startup", "UNKNOWN"); } public void testClasspath() throws Exception { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ToolBasicTest.java --- a/langtools/test/jdk/jshell/ToolBasicTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/ToolBasicTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 + * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 8165405 * @summary Tests for Basic tests for REPL tool * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -263,7 +263,8 @@ compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }"); Path classpath = compiler.getPath(outDir); test( - (a) -> assertCommand(a, "/classpath " + classpath, String.format("| Path '%s' added to classpath", classpath)), + (a) -> assertCommand(a, "/env --class-path " + classpath, + "| Setting new options and restoring state."), (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); test(new String[] { "--class-path", classpath.toString() }, @@ -279,7 +280,8 @@ compiler.jar(outDir, jarName, "pkg/A.class"); Path jarPath = compiler.getPath(outDir).resolve(jarName); test( - (a) -> assertCommand(a, "/classpath " + jarPath, String.format("| Path '%s' added to classpath", jarPath)), + (a) -> assertCommand(a, "/env --class-path " + jarPath, + "| Setting new options and restoring state."), (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A") ); test(new String[] { "--class-path", jarPath.toString() }, @@ -310,10 +312,10 @@ (a) -> evaluateExpression(a, "A", "new A()", "A") ); test(new String[]{"--no-startup"}, - (a) -> assertCommandCheckOutput(a, "printf(\"\")", assertStartsWith("| Error:\n| cannot find symbol")) + (a) -> assertCommandCheckOutput(a, "Pattern.compile(\"x+\")", assertStartsWith("| Error:\n| cannot find symbol")) ); test( - (a) -> assertCommand(a, "printf(\"A\")", "", "", null, "A", "") + (a) -> assertCommand(a, "Pattern.compile(\"x+\")", "$1 ==> x+", "", null, "", "") ); } @@ -385,6 +387,16 @@ } } + public void testOpenResource() { + test( + (a) -> assertCommand(a, "/open PRINTING", ""), + (a) -> assertCommandOutputContains(a, "/list", + "void println", "System.out.printf"), + (a) -> assertCommand(a, "printf(\"%4.2f\", Math.PI)", + "", "", null, "3.14", "") + ); + } + public void testSave() throws IOException { Compiler compiler = new Compiler(); Path path = compiler.getPath("testSave.repl"); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ToolCommandOptionTest.java --- a/langtools/test/jdk/jshell/ToolCommandOptionTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/ToolCommandOptionTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8157395 8157393 8157517 8158738 8167128 8163840 8167637 8170368 + * @bug 8157395 8157393 8157517 8158738 8167128 8163840 8167637 8170368 8172102 * @summary Tests of jshell comand options, and undoing operations * @modules jdk.jshell/jdk.internal.jshell.tool * jdk.compiler/com.sun.tools.javac.api @@ -46,9 +46,9 @@ (a) -> assertCommand(a, "/li", "1 : int x;"), (a) -> assertCommandOutputStartsWith(a, "/lis -st", - "\n s1 : import"), + "s1 : import"), (a) -> assertCommandOutputStartsWith(a, "/list -all", - "\n s1 : import"), + "s1 : import"), (a) -> assertCommandOutputContains(a, "/list -all", "1 : int x;"), (a) -> assertCommandOutputContains(a, "/list -history", @@ -260,10 +260,20 @@ "| Specify no more than one of -default, -none, or a startup file name -- /set start foo -default"), (a) -> assertCommand(a, "/set start frfg", "| File 'frfg' for '/set start' is not found."), + (a) -> assertCommand(a, "/set start DEFAULT frfg", + "| File 'frfg' for '/set start' is not found."), (a) -> assertCommand(a, "/set start -default", ""), (a) -> assertCommand(a, "/set start", "| /set start -default"), + (a) -> assertCommand(a, "/set start DEFAULT", + ""), + (a) -> assertCommand(a, "/set start", + "| /set start -default"), + (a) -> assertCommand(a, "/set start DEFAULT PRINTING", + ""), + (a) -> assertCommandOutputContains(a, "/set start", + "void println", "import java.util.*"), (a) -> assertCommand(a, "/set start " + startup.toString(), ""), (a) -> assertCommand(a, "/set start", diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ToolLocalSimpleTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/jshell/ToolLocalSimpleTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8168615 8172102 + * @summary Test all the ToolSimpleTest tests, but in local execution. Verify --execution flag + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * jdk.jdeps/com.sun.tools.javap + * jdk.jshell/jdk.internal.jshell.tool + * @build KullaTesting TestingInputStream ToolSimpleTest + * @run testng ToolLocalSimpleTest + */ + +import java.util.Locale; +import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; + +public class ToolLocalSimpleTest extends ToolSimpleTest { + + @Override + public void test(Locale locale, boolean isDefaultStartUp, String[] args, String startUpMessage, ReplTest... tests) { + String[] wargs = new String[args.length + 2]; + wargs[0] = "--execution"; + wargs[1] = "local"; + System.arraycopy(args, 0, wargs, 2, args.length); + super.test(locale, isDefaultStartUp, wargs, startUpMessage, tests); + } + + @Test + public void verifyLocal() { + System.setProperty("LOCAL_CHECK", "Here"); + assertEquals(System.getProperty("LOCAL_CHECK"), "Here"); + test(new String[]{"--no-startup"}, + a -> assertCommand(a, "System.getProperty(\"LOCAL_CHECK\")", "$1 ==> \"Here\""), + a -> assertCommand(a, "System.setProperty(\"LOCAL_CHECK\", \"After\")", "$2 ==> \"Here\"") + ); + assertEquals(System.getProperty("LOCAL_CHECK"), "After"); + } + + @Override + @Test + public void testOptionR() { + test(new String[]{"-R-Dthe.sound=blorp", "--no-startup"}, + (a) -> assertCommand(a, "System.getProperty(\"the.sound\")", + "$1 ==> null") + ); + } + + @Override + @Test + public void testCompoundStart() { + test(new String[]{"--startup", "DEFAULT", "--startup", "PRINTING"}, + (a) -> assertCommandOutputContains(a, "/list -start", + "System.out.println", "import java.util.concurrent") + ); + } + + @Test + public void testOptionBadR() { + test(new String[]{"-R-RottenLiver"}, + (a) -> assertCommand(a, "43", + "$1 ==> 43") + ); + } + +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ToolReloadTest.java --- a/langtools/test/jdk/jshell/ToolReloadTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/ToolReloadTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -24,7 +24,7 @@ /* * @test * @key intermittent - * @bug 8081845 8147898 8143955 + * @bug 8081845 8147898 8143955 8165405 * @summary Tests for /reload in JShell tool * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -70,8 +70,8 @@ compiler.compile(outDir, prog.apply("A")); Path classpath = compiler.getPath(outDir); test( - (a) -> assertCommand(a, "/classpath " + classpath, - String.format("| Path '%s' added to classpath", classpath)), + (a) -> assertCommand(a, "/env --class-path " + classpath, + "| Setting new options and restoring state."), (a) -> assertMethod(a, "String foo() { return (new pkg.A()).toString(); }", "()String", "foo"), (a) -> assertVariable(a, "String", "v", "foo()", "\"A\""), @@ -79,7 +79,6 @@ if (!a) compiler.compile(outDir, prog.apply("Aprime")); assertCommand(a, "/reload", "| Restarting and restoring state.\n" + - "-: /classpath " + classpath + "\n" + "-: String foo() { return (new pkg.A()).toString(); }\n" + "-: String v = foo();\n"); }, diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/ToolSimpleTest.java --- a/langtools/test/jdk/jshell/ToolSimpleTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/ToolSimpleTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 + * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 8172102 8172103 8165405 * @summary Simple jshell tool tests * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -45,9 +45,9 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; -@Test public class ToolSimpleTest extends ReplToolTesting { + @Test public void testRemaining() { test( (a) -> assertCommand(a, "int z; z =", "z ==> 0"), @@ -62,6 +62,7 @@ ); } + @Test public void testOpenComment() { test( (a) -> assertCommand(a, "int z = /* blah", ""), @@ -72,6 +73,7 @@ ); } + @Test public void oneLineOfError() { test( (a) -> assertCommand(a, "12+", null), @@ -80,6 +82,7 @@ ); } + @Test public void defineVariables() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -96,6 +99,7 @@ ); } + @Test public void defineMethods() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -112,6 +116,7 @@ ); } + @Test public void defineTypes() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -131,6 +136,7 @@ ); } + @Test public void defineImports() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -150,6 +156,7 @@ ); } + @Test public void defineVar() { test( (a) -> assertCommand(a, "int x = 72", "x ==> 72"), @@ -158,6 +165,7 @@ ); } + @Test public void defineUnresolvedVar() { test( (a) -> assertCommand(a, "undefined x", @@ -166,6 +174,7 @@ ); } + @Test public void testUnresolved() { test( (a) -> assertCommand(a, "int f() { return g() + x + new A().a; }", @@ -178,16 +187,19 @@ ); } + @Test public void testUnknownCommand() { test((a) -> assertCommand(a, "/unknown", "| No such command or snippet id: /unknown\n" + "| Type /help for help.")); } + @Test public void testEmptyClassPath() { - test(after -> assertCommand(after, "/classpath", "| The /classpath command requires a path argument.")); + test(after -> assertCommand(after, "/env --class-path", "| Argument to class-path missing.")); } + @Test public void testNoArgument() { test( (a) -> assertCommand(a, "/save", @@ -199,6 +211,7 @@ ); } + @Test public void testDebug() { test( (a) -> assertCommand(a, "/deb", "| Debugging on"), @@ -208,6 +221,7 @@ ); } + @Test public void testDrop() { test(false, new String[]{"--no-startup"}, a -> assertVariable(a, "int", "a"), @@ -240,6 +254,7 @@ ); } + @Test public void testDropNegative() { test(false, new String[]{"--no-startup"}, a -> assertCommandOutputStartsWith(a, "/drop 0", "| No such snippet: 0"), @@ -255,6 +270,7 @@ ); } + @Test public void testAmbiguousDrop() { Consumer check = s -> { assertTrue(s.startsWith("| The argument references more than one import, variable, method, or class"), s); @@ -280,6 +296,7 @@ ); } + @Test public void testApplicationOfPost() { test( (a) -> assertCommand(a, "/set mode t normal -command", "| Created new feedback mode: t"), @@ -290,6 +307,7 @@ ); } + @Test public void testHelpLength() { Consumer testOutput = (s) -> { List ss = Stream.of(s.split("\n")) @@ -304,6 +322,7 @@ ); } + @Test public void testHelp() { test( (a) -> assertHelp(a, "/?", "/list", "/help", "/exit", "intro"), @@ -315,6 +334,7 @@ ); } + @Test public void testHelpFormat() { test( (a) -> assertCommandCheckOutput(a, "/help", s -> { @@ -355,6 +375,7 @@ } } + @Test public void testListArgs() { String arg = "qqqq"; List startVarList = new ArrayList<>(START_UP); @@ -370,13 +391,14 @@ s -> checkLineToList(s, START_UP)), a -> assertCommandCheckOutput(a, "/list -all", s -> checkLineToList(s, startVarList)), - a -> assertCommandCheckOutput(a, "/list printf", - s -> assertTrue(s.contains("void printf"))), + a -> assertCommandOutputStartsWith(a, "/list s3", + "s3 : import"), a -> assertCommandOutputStartsWith(a, "/list " + arg, "| No such snippet: " + arg) ); } + @Test public void testVarsArgs() { String arg = "qqqq"; List startVarList = new ArrayList<>(); @@ -395,25 +417,28 @@ s -> checkLineToList(s, startVarList)), a -> assertCommandOutputStartsWith(a, "/vars -all", "| int aardvark = 0\n| int a = "), - a -> assertCommandOutputStartsWith(a, "/vars printf", - "| This command does not accept the snippet 'printf'"), + a -> assertCommandOutputStartsWith(a, "/vars f", + "| This command does not accept the snippet 'f'"), a -> assertCommand(a, "/var " + arg, "| No such snippet: " + arg) ); } + @Test public void testMethodsArgs() { String arg = "qqqq"; - List startMethodList = new ArrayList<>(START_UP_CMD_METHOD); - test( + List printingMethodList = new ArrayList<>(PRINTING_CMD_METHOD); + test(new String[]{"--startup", "PRINTING"}, a -> assertCommandCheckOutput(a, "/methods -all", - s -> checkLineToList(s, startMethodList)), + s -> checkLineToList(s, printingMethodList)), a -> assertCommandCheckOutput(a, "/methods -start", - s -> checkLineToList(s, startMethodList)), - a -> assertCommandCheckOutput(a, "/methods printf", - s -> checkLineToList(s, startMethodList)), + s -> checkLineToList(s, printingMethodList)), + a -> assertCommandCheckOutput(a, "/methods print println printf", + s -> checkLineToList(s, printingMethodList)), + a -> assertCommandCheckOutput(a, "/methods println", + s -> assertEquals(s.trim().split("\n").length, 10)), a -> assertCommandCheckOutput(a, "/methods", - s -> checkLineToList(s, startMethodList)), + s -> checkLineToList(s, printingMethodList)), a -> assertCommandOutputStartsWith(a, "/methods " + arg, "| No such snippet: " + arg), a -> assertMethod(a, "int f() { return 0; }", "()int", "f"), @@ -425,9 +450,9 @@ a -> assertCommandOutputStartsWith(a, "/methods aardvark", "| This command does not accept the snippet 'aardvark' : int aardvark"), a -> assertCommandCheckOutput(a, "/methods -start", - s -> checkLineToList(s, startMethodList)), - a -> assertCommandCheckOutput(a, "/methods printf", - s -> checkLineToList(s, startMethodList)), + s -> checkLineToList(s, printingMethodList)), + a -> assertCommandCheckOutput(a, "/methods print println printf", + s -> checkLineToList(s, printingMethodList)), a -> assertCommandOutputStartsWith(a, "/methods g", "| g ()void"), a -> assertCommandOutputStartsWith(a, "/methods f", @@ -436,6 +461,7 @@ ); } + @Test public void testTypesArgs() { String arg = "qqqq"; List startTypeList = new ArrayList<>(); @@ -468,6 +494,24 @@ s -> checkLineToList(s, startTypeList)) ); } + + @Test + public void testCompoundStart() { + test(new String[]{"--startup", "DEFAULT", "--startup", "PRINTING"}, + (a) -> assertCommand(a, "printf(\"%4.2f\", Math.PI)", + "", "", null, "3.14", "") + ); + } + + @Test + public void testJavaSeStart() { + test(new String[]{"--startup", "JAVASE"}, + (a) -> assertCommand(a, "ZoneOffsetTransitionRule.TimeDefinition.WALL", + "$1 ==> WALL") + ); + } + + @Test public void defineClasses() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -486,6 +530,8 @@ (a) -> assertCommandCheckOutput(a, "/types", assertClasses()) ); } + + @Test public void testCommandPrefix() { test(a -> assertCommandCheckOutput(a, "/s", assertStartsWith("| Command: '/s' is ambiguous: /save, /set")), @@ -496,6 +542,7 @@ assertStartsWith("| '/save' requires a filename argument."))); } + @Test public void testOptionQ() { test(Locale.ROOT, false, new String[]{"-q", "--no-startup"}, "", (a) -> assertCommand(a, "1+1", "$1 ==> 2"), @@ -503,12 +550,14 @@ ); } + @Test public void testOptionS() { test(Locale.ROOT, false, new String[]{"-s", "--no-startup"}, "", (a) -> assertCommand(a, "1+1", "") ); } + @Test public void testOptionV() { test(new String[]{"-v", "--no-startup"}, (a) -> assertCommand(a, "1+1", @@ -517,6 +566,7 @@ ); } + @Test public void testOptionFeedback() { test(Locale.ROOT, false, new String[]{"--feedback", "concise", "--no-startup"}, "", (a) -> assertCommand(a, "1+1", "$1 ==> 2"), @@ -524,6 +574,7 @@ ); } + @Test public void testCompoundOptions() { Consumer confirmNoStartup = s -> { assertEquals(0, Stream.of(s.split("\n")) @@ -546,6 +597,7 @@ ); } + @Test public void testOptionR() { test(new String[]{"-R-Dthe.sound=blorp", "--no-startup"}, (a) -> assertCommand(a, "System.getProperty(\"the.sound\")", @@ -553,6 +605,14 @@ ); } + @Test + public void testWrapSourceHandlerDiagCrash() { + test(new String[]{"--add-exports", "jdk.javadoc/ALL-UNNAMED"}, + (a) -> assertCommand(a, "1+1", "$1 ==> 2") + ); + } + + @Test public void test8156910() { test( (a) -> assertCommandOutputContains(a, "System.out.println(\"%5d\", 10);", "%5d"), diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/UserExecutionControlTest.java --- a/langtools/test/jdk/jshell/UserExecutionControlTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/UserExecutionControlTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,14 +23,13 @@ /* * @test - * @bug 8156101 8159935 8159122 + * @bug 8156101 8159935 8159122 8168615 * @summary Tests for ExecutionControl SPI * @build KullaTesting ExecutionControlTestBase * @run testng UserExecutionControlTest */ -import jdk.jshell.execution.LocalExecutionControl; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import org.testng.annotations.BeforeMethod; @@ -41,12 +40,13 @@ @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(LocalExecutionControl.create())); + setUp(builder -> builder.executionEngine("local")); } public void verifyLocal() throws ClassNotFoundException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { System.setProperty("LOCAL_CHECK", "TBD"); assertEquals(System.getProperty("LOCAL_CHECK"), "TBD"); + assertEval("System.getProperty(\"LOCAL_CHECK\")", "\"TBD\""); assertEval("System.setProperty(\"LOCAL_CHECK\", \"local\")"); assertEquals(System.getProperty("LOCAL_CHECK"), "local"); } diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/UserInputTest.java --- a/langtools/test/jdk/jshell/UserInputTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/UserInputTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ * @summary Verify that the user's code can read System.in * @build KullaTesting TestingInputStream * @run testng UserInputTest + * @key intermittent */ import java.io.IOException; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/jdk/jshell/UserJdiUserRemoteTest.java --- a/langtools/test/jdk/jshell/UserJdiUserRemoteTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/jdk/jshell/UserJdiUserRemoteTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,9 +23,9 @@ /* * @test - * @bug 8160128 8159935 + * @bug 8160128 8159935 8168615 * @summary Tests for Aux channel, custom remote agents, custom JDI implementations. - * @build KullaTesting ExecutionControlTestBase + * @build KullaTesting ExecutionControlTestBase MyExecutionControl MyRemoteExecutionControl MyExecutionControlProvider * @run testng UserJdiUserRemoteTest */ import java.io.ByteArrayOutputStream; @@ -34,34 +34,10 @@ import jdk.jshell.Snippet; import static jdk.jshell.Snippet.Status.OVERWRITTEN; import static jdk.jshell.Snippet.Status.VALID; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.net.ServerSocket; -import java.util.ArrayList; -import java.util.List; -import com.sun.jdi.VMDisconnectedException; -import com.sun.jdi.VirtualMachine; import jdk.jshell.VarSnippet; -import jdk.jshell.execution.DirectExecutionControl; -import jdk.jshell.execution.JdiExecutionControl; -import jdk.jshell.execution.JdiInitiator; -import jdk.jshell.execution.Util; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.Socket; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; import jdk.jshell.spi.ExecutionControl; import jdk.jshell.spi.ExecutionControl.ExecutionControlException; -import jdk.jshell.spi.ExecutionEnv; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; -import static jdk.jshell.execution.Util.forwardExecutionControlAndIO; -import static jdk.jshell.execution.Util.remoteInputOutput; @Test public class UserJdiUserRemoteTest extends ExecutionControlTestBase { @@ -73,7 +49,7 @@ @Override public void setUp() { auxStream = new ByteArrayOutputStream(); - setUp(builder -> builder.executionEngine(MyExecutionControl.create(this))); + setUp(builder -> builder.executionEngine(new MyExecutionControlProvider(this), null)); } public void testVarValue() { @@ -114,174 +90,3 @@ assertActiveKeys(); } } - -class MyExecutionControl extends JdiExecutionControl { - - private static final String REMOTE_AGENT = MyRemoteExecutionControl.class.getName(); - private static final int TIMEOUT = 2000; - - private VirtualMachine vm; - private Process process; - - /** - * Creates an ExecutionControl instance based on a JDI - * {@code LaunchingConnector}. - * - * @return the generator - */ - public static ExecutionControl.Generator create(UserJdiUserRemoteTest test) { - return env -> make(env, test); - } - - /** - * Creates an ExecutionControl instance based on a JDI - * {@code ListeningConnector} or {@code LaunchingConnector}. - * - * Initialize JDI and use it to launch the remote JVM. Set-up a socket for - * commands and results. This socket also transports the user - * input/output/error. - * - * @param env the context passed by - * {@link jdk.jshell.spi.ExecutionControl#start(jdk.jshell.spi.ExecutionEnv) } - * @return the channel - * @throws IOException if there are errors in set-up - */ - static ExecutionControl make(ExecutionEnv env, UserJdiUserRemoteTest test) throws IOException { - try (final ServerSocket listener = new ServerSocket(0)) { - // timeout for socket - listener.setSoTimeout(TIMEOUT); - int port = listener.getLocalPort(); - - // Set-up the JDI connection - List opts = new ArrayList<>(env.extraRemoteVMOptions()); - opts.add("-classpath"); - opts.add(System.getProperty("java.class.path") - + System.getProperty("path.separator") - + System.getProperty("user.dir")); - JdiInitiator jdii = new JdiInitiator(port, - opts, REMOTE_AGENT, true, null, TIMEOUT); - VirtualMachine vm = jdii.vm(); - Process process = jdii.process(); - - List> deathListeners = new ArrayList<>(); - deathListeners.add(s -> env.closeDown()); - Util.detectJdiExitEvent(vm, s -> { - for (Consumer h : deathListeners) { - h.accept(s); - } - }); - - // Set-up the commands/reslts on the socket. Piggy-back snippet - // output. - Socket socket = listener.accept(); - // out before in -- match remote creation so we don't hang - OutputStream out = socket.getOutputStream(); - Map outputs = new HashMap<>(); - outputs.put("out", env.userOut()); - outputs.put("err", env.userErr()); - outputs.put("aux", test.auxStream); - Map input = new HashMap<>(); - input.put("in", env.userIn()); - ExecutionControl myec = remoteInputOutput(socket.getInputStream(), out, outputs, input, (objIn, objOut) -> new MyExecutionControl(objOut, objIn, vm, process, deathListeners)); - test.currentEC = myec; - return myec; - } - } - - /** - * Create an instance. - * - * @param out the output for commands - * @param in the input for responses - */ - private MyExecutionControl(ObjectOutput out, ObjectInput in, - VirtualMachine vm, Process process, - List> deathListeners) { - super(out, in); - this.vm = vm; - this.process = process; - deathListeners.add(s -> disposeVM()); - } - - @Override - public void close() { - super.close(); - disposeVM(); - } - - private synchronized void disposeVM() { - try { - if (vm != null) { - vm.dispose(); // This could NPE, so it is caught below - vm = null; - } - } catch (VMDisconnectedException ex) { - // Ignore if already closed - } catch (Throwable e) { - fail("disposeVM threw: " + e); - } finally { - if (process != null) { - process.destroy(); - process = null; - } - } - } - - @Override - protected synchronized VirtualMachine vm() throws EngineTerminationException { - if (vm == null) { - throw new EngineTerminationException("VM closed"); - } else { - return vm; - } - } - -} - -class MyRemoteExecutionControl extends DirectExecutionControl implements ExecutionControl { - - static PrintStream auxPrint; - - /** - * Launch the agent, connecting to the JShell-core over the socket specified - * in the command-line argument. - * - * @param args standard command-line arguments, expectation is the socket - * number is the only argument - * @throws Exception any unexpected exception - */ - public static void main(String[] args) throws Exception { - try { - String loopBack = null; - Socket socket = new Socket(loopBack, Integer.parseInt(args[0])); - InputStream inStream = socket.getInputStream(); - OutputStream outStream = socket.getOutputStream(); - Map> outputs = new HashMap<>(); - outputs.put("out", st -> System.setOut(new PrintStream(st, true))); - outputs.put("err", st -> System.setErr(new PrintStream(st, true))); - outputs.put("aux", st -> { auxPrint = new PrintStream(st, true); }); - Map> input = new HashMap<>(); - input.put("in", st -> System.setIn(st)); - forwardExecutionControlAndIO(new MyRemoteExecutionControl(), inStream, outStream, outputs, input); - } catch (Throwable ex) { - throw ex; - } - } - - @Override - public String varValue(String className, String varName) - throws RunException, EngineTerminationException, InternalException { - auxPrint.print(varName); - return super.varValue(className, varName); - } - - @Override - public Object extensionCommand(String className, Object arg) - throws RunException, EngineTerminationException, InternalException { - if (!arg.equals("test")) { - throw new InternalException("expected extensionCommand arg to be 'test' got: " + arg); - } - return "ribbit"; - } - -} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/doclint/tidy/util/Main.java --- a/langtools/test/tools/doclint/tidy/util/Main.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/doclint/tidy/util/Main.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -154,6 +154,11 @@ errs += Integer.valueOf(m.group(2)); if (m.group(3) != null) overflow++; + } else if ((m = countPattern2.matcher(line)).matches()) { + warns += Integer.valueOf(m.group(1)); + errs += Integer.valueOf(m.group(2)); + if (m.group(3) != null) + overflow++; } else if ((m = guardPattern.matcher(line)).matches()) { boolean found = false; for (Pattern p: patterns) { @@ -183,6 +188,7 @@ Pattern okPattern = Pattern.compile("No warnings or errors were found."); Pattern countPattern = Pattern.compile("([0-9]+) warnings, ([0-9]+) errors were found!.*?(Not all warnings/errors were shown.)?"); + Pattern countPattern2 = Pattern.compile("Tidy found ([0-9]+) warning[s]? and ([0-9]+) error[s]?!.*?(Not all warnings/errors were shown.)?"); Pattern cssPattern = Pattern.compile("You are recommended to use CSS.*"); Pattern guardPattern = Pattern.compile("line [0-9]+ column [0-9]+ - (Error|Warning):.*"); @@ -221,7 +227,11 @@ Pattern.compile(".*Warning: trimming empty <.*>"), Pattern.compile(".*Warning: unescaped & or unknown entity \".*\""), Pattern.compile(".*Warning: unescaped & which should be written as &"), - Pattern.compile(".*Warning: using
    in place of

    ") + Pattern.compile(".*Warning: using
    in place of

    "), + Pattern.compile(".*Warning: <.*> element removed from HTML5"), + Pattern.compile(".*Warning: <.*> attribute \".*\" not allowed for HTML5"), + Pattern.compile(".*Warning: The summary attribute on the element is obsolete in HTML5"), + Pattern.compile(".*Warning: replacing invalid UTF-8 bytes \\(char. code U\\+.*\\)") }; int files; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/classreader/8171132/BadConstantValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/classreader/8171132/BadConstantValue.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,226 @@ +/* + * Copyright 2016 Google, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + * @test + * @bug 8171132 + * @summary Improve class reading of invalid or out-of-range ConstantValue attributes + * @modules jdk.jdeps/com.sun.tools.classfile + * jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.code + * jdk.compiler/com.sun.tools.javac.jvm + * jdk.compiler/com.sun.tools.javac.main + * jdk.compiler/com.sun.tools.javac.util + * @build BadConstantValue + * @run main BadConstantValue + */ + +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ClassWriter; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Integer_info; +import com.sun.tools.classfile.ConstantValue_attribute; +import com.sun.tools.classfile.Field; +import com.sun.tools.javac.api.JavacTaskImpl; +import com.sun.tools.javac.code.ClassFinder.BadClassFile; +import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.jvm.Target; +import com.sun.tools.javac.util.Assert; +import com.sun.tools.javac.util.JCDiagnostic; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.Objects; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; + +public class BadConstantValue { + + static final File classesdir = new File("badconstants"); + + public static void main(String[] args) throws Exception { + // report errors for ConstantValues of the wrong type + testInvalidConstantType("int"); + testInvalidConstantType("short"); + testInvalidConstantType("byte"); + testInvalidConstantType("char"); + testInvalidConstantType("boolean"); + + // report errors for ConstantValues outside the expected range + testValidConstRange("int", Integer.MAX_VALUE); + testValidConstRange("int", Integer.MIN_VALUE); + + testValidConstRange("short", Short.MAX_VALUE); + testValidConstRange("short", Short.MIN_VALUE); + testInvalidConstRange("short", Short.MAX_VALUE + 1); + testInvalidConstRange("short", Short.MIN_VALUE - 1); + + testValidConstRange("byte", Byte.MAX_VALUE); + testValidConstRange("byte", Byte.MIN_VALUE); + testInvalidConstRange("byte", Byte.MAX_VALUE + 1); + testInvalidConstRange("byte", Byte.MIN_VALUE - 1); + + testValidConstRange("char", Character.MAX_VALUE); + testValidConstRange("char", Character.MIN_VALUE); + testInvalidConstRange("char", Character.MAX_VALUE + 1); + testInvalidConstRange("char", Character.MIN_VALUE - 1); + + testValidConstRange("boolean", 0); + testValidConstRange("boolean", 1); + testInvalidConstRange("boolean", 2); + testInvalidConstRange("boolean", Integer.MIN_VALUE); + testInvalidConstRange("boolean", Integer.MAX_VALUE); + } + + /** + * Tests that a constant value of the given {@code type} and initialized with an out-of-range + * {@code value} is rejected. + */ + private static void testInvalidConstRange(String type, int value) throws Exception { + createConstantWithValue(type, value); + BadClassFile badClassFile = loadBadClass("Lib"); + if (badClassFile == null) { + throw new AssertionError("did not see expected error"); + } + JCDiagnostic diagnostic = (JCDiagnostic) badClassFile.getDiagnostic().getArgs()[1]; + assertEquals("compiler.misc.bad.constant.range", diagnostic.getCode()); + assertEquals(3, diagnostic.getArgs().length); + assertEquals(value, diagnostic.getArgs()[0]); + assertEquals("B", diagnostic.getArgs()[1].toString()); + assertEquals(type, String.valueOf(diagnostic.getArgs()[2])); + } + + /** + * Tests that a constant value of the given {@code type} and initialized with {@code value} is + * accepted. + */ + private static void testValidConstRange(String type, int value) throws Exception { + createConstantWithValue(type, value); + BadClassFile badClassFile = loadBadClass("Lib"); + if (badClassFile != null) { + throw new AssertionError("saw unexpected error", badClassFile); + } + } + + /** + * Creates a class file containing a constant field with the given type and value, which may be + * outside the expected range. + */ + private static void createConstantWithValue(String type, int value) throws Exception { + // Create a class with two constants, A and B. A is of type int and has value "actual"; + // B is of type "type" and is initialized to that type's default value. + File lib = writeFile(classesdir, "Lib.java", String.format( + "class Lib { static final int A = %s; static final %s B = %s; }", + value, type, (type.equals("boolean") ? "false" : "0"))); + compile("-d", classesdir.getPath(), lib.getPath()); + File libClass = new File(classesdir, "Lib.class"); + // Rewrite the class to only have field B of type "type" and with "value" (potentially + // out of range). + swapConstantValues(libClass); + } + + /** Tests that a field of the given integral type with a constant string value is rejected. */ + private static void testInvalidConstantType(String type) throws Exception { + // create a class file with field that has an invalid CONSTANT_String ConstantValue + File lib = writeFile(classesdir, "Lib.java", String.format( + "class Lib { static final String A = \"hello\"; static final %s CONST = %s; }", + type, type.equals("boolean") ? "false" : "0")); + compile("-d", classesdir.getPath(), lib.getPath()); + File libClass = new File(classesdir, "Lib.class"); + swapConstantValues(libClass); + + BadClassFile badClassFile = loadBadClass("Lib"); + + JCDiagnostic diagnostic = (JCDiagnostic) badClassFile.getDiagnostic().getArgs()[1]; + assertEquals("compiler.misc.bad.constant.value", diagnostic.getCode()); + assertEquals(3, diagnostic.getArgs().length); + assertEquals("hello", diagnostic.getArgs()[0]); + assertEquals("CONST", diagnostic.getArgs()[1].toString()); + assertEquals("Integer", diagnostic.getArgs()[2]); + } + + private static BadClassFile loadBadClass(String className) { + // load the class, and save the thrown BadClassFile exception + JavaCompiler c = ToolProvider.getSystemJavaCompiler(); + JavacTaskImpl task = (JavacTaskImpl) c.getTask(null, null, null, + Arrays.asList("-classpath", classesdir.getPath()), null, null); + Symtab syms = Symtab.instance(task.getContext()); + task.ensureEntered(); + BadClassFile badClassFile; + try { + com.sun.tools.javac.main.JavaCompiler.instance(task.getContext()) + .resolveIdent(syms.unnamedModule, className).complete(); + } catch (BadClassFile e) { + return e; + } + return null; + } + + /** + * Given a class file with two constant fields A and B, replaces both with a single field with + * B's type and A's ConstantValue attribute. + */ + private static void swapConstantValues(File file) throws Exception { + ClassFile cf = ClassFile.read(file); + Field a = cf.fields[0]; + Field b = cf.fields[1]; + Field[] fields = { + new Field(b.access_flags, b.name_index, b.descriptor, a.attributes), + }; + cf = new ClassFile(cf.magic, Target.JDK1_7.minorVersion, Target.JDK1_7.majorVersion, + cf.constant_pool, cf.access_flags, cf.this_class, cf.super_class, cf.interfaces, + fields, cf.methods, cf.attributes); + new ClassWriter().write(cf, file); + } + + static String compile(String... args) throws Exception { + System.err.println("compile: " + Arrays.asList(args)); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javac.Main.compile(args, pw); + pw.close(); + String out = sw.toString(); + if (out.length() > 0) { + System.err.println(out); + } + if (rc != 0) { + throw new AssertionError("compilation failed, rc=" + rc); + } + return out; + } + + static File writeFile(File dir, String path, String body) throws IOException { + File f = new File(dir, path); + f.getParentFile().mkdirs(); + FileWriter out = new FileWriter(f); + out.write(body); + out.close(); + return f; + } + + static void assertEquals(Object expected, Object actual) { + Assert.check(Objects.equals(expected, actual), + String.format("expected: %s, but was: %s", expected, actual)); + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/diags/examples.not-yet.txt --- a/langtools/test/tools/javac/diags/examples.not-yet.txt Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/diags/examples.not-yet.txt Mon Jan 09 11:57:06 2017 -0800 @@ -43,6 +43,8 @@ compiler.misc.bad.class.signature # bad class file compiler.misc.bad.const.pool.tag # bad class file compiler.misc.bad.const.pool.tag.at # bad class file +compiler.misc.bad.constant.range # bad class file +compiler.misc.bad.constant.value # bad class file compiler.misc.bad.enclosing.class # bad class file compiler.misc.bad.enclosing.method # bad class file compiler.misc.bad.runtime.invisible.param.annotations # bad class file diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/generics/inference/CaptureGLB1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/CaptureGLB1.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8144066 + * @summary GLB of two lower-bounded capture variables, bounded by related array types + * @compile CaptureGLB1.java + */ + +public class CaptureGLB1 { + + interface A { } + + Exception[] bar(A x, A y){ + return foo(x, y); + } + + T foo(A x, A y){ + return null; + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/generics/inference/CaptureGLB2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/inference/CaptureGLB2.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8144066 + * @summary GLB of two lower-bounded capture variables, bounded by related wildcard-parameterized types + * @compile CaptureGLB2.java + */ + +public class CaptureGLB2 { + + interface A { } + + Class bar(A> x, A> y){ + return foo(x, y); + } + + T foo(A x, A y){ + return null; + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/8169091/T8169091.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/8169091/T8169091.java Mon Jan 09 11:57:06 2017 -0800 @@ -0,0 +1,15 @@ +/* + * @test + * @bug 8169091 + * @summary Method reference T::methodName for generic type T does not compile any more + * @compile T8169091.java + */ + +import java.io.Serializable; +import java.util.Comparator; + +interface T8169091 { + static > Comparator comparator() { + return (Comparator & Serializable)T::compareTo; + } +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific09.java --- a/langtools/test/tools/javac/lambda/MostSpecific09.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific09.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8029718 + * @bug 8029718 8065800 * @summary Should always use lambda body structure to disambiguate overload resolution * @compile/fail/ref=MostSpecific09.out -XDrawDiagnostics --should-stop:at=ATTR --debug:verboseResolution=applicable,success MostSpecific09.java */ diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific09.out --- a/langtools/test/tools/javac/lambda/MostSpecific09.out Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific09.out Mon Jan 09 11:57:06 2017 -0800 @@ -2,16 +2,16 @@ MostSpecific09.java:26:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} MostSpecific09.java:27:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.J), null)} MostSpecific09.java:27:32: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} -MostSpecific09.java:28:13: compiler.err.lambda.body.neither.value.nor.void.compatible -MostSpecific09.java:28:9: compiler.err.cant.apply.symbols: kindname.method, foo, @682,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} +MostSpecific09.java:28:20: compiler.err.lambda.body.neither.value.nor.void.compatible +MostSpecific09.java:28:9: compiler.err.cant.apply.symbols: kindname.method, foo, @690,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} MostSpecific09.java:28:43: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} MostSpecific09.java:29:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 MostSpecific09.java:29:28: compiler.note.verbose.resolve.multi: , java.lang.RuntimeException, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, java.lang.RuntimeException(), null)} MostSpecific09.java:30:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 MostSpecific09.java:32:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 MostSpecific09.java:33:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} -MostSpecific09.java:42:13: compiler.err.lambda.body.neither.value.nor.void.compatible -MostSpecific09.java:42:9: compiler.err.cant.apply.symbols: kindname.method, foo, @1131,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} +MostSpecific09.java:42:20: compiler.err.lambda.body.neither.value.nor.void.compatible +MostSpecific09.java:42:9: compiler.err.cant.apply.symbols: kindname.method, foo, @1139,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} MostSpecific09.java:46:23: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} MostSpecific09.java:49:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.J), null)} MostSpecific09.java:56:25: compiler.note.verbose.resolve.multi: , Bar, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, Bar(), null)} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific10.java --- a/langtools/test/tools/javac/lambda/MostSpecific10.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific10.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,13 @@ * @test * @bug 8034223 * @summary Structural most-specific logic for lambdas, method refs, parens, and conditionals - * @compile MostSpecific10.java */ -class MostSpecific10 { + +public class MostSpecific10 { + + public static void main(String[] args) { + new MostSpecific10().test(true); + } interface GetInt { int get(); @@ -38,7 +42,9 @@ } void m(GetInt getter) {} - void m(GetInteger getter) {} + void m(GetInteger getter) { + throw new AssertionError("Less-specific method invocation: " + getter.getClass()); + } void test(boolean cond) { m(() -> 23); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific11.java --- a/langtools/test/tools/javac/lambda/MostSpecific11.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific11.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,19 @@ * @test * @bug 8034223 * @summary Return type Object is not more specific than return type String - * @compile MostSpecific11.java */ -class MostSpecific11 { +public class MostSpecific11 { + + public static void main(String[] args) { + new MostSpecific11().test(); + } interface I { Object run(); } interface J { String run(); } - void m(I arg) {} + void m(I arg) { + throw new RuntimeException("Less-specific method invocation."); + } void m(J arg) {} void test() { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific15.java --- a/langtools/test/tools/javac/lambda/MostSpecific15.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific15.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Rename functional interface method type parameters during most specific test - * @compile MostSpecific15.java */ -class MostSpecific15 { +public class MostSpecific15 { + public static void main(String[] args) { + new MostSpecific15().test(); + } + interface F1 { Object apply(X arg); } interface F2 { String apply(Y arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static String foo(Object in) { return "a"; } @@ -39,5 +44,4 @@ void test() { m1(MostSpecific15::foo); } - -} \ No newline at end of file +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific17.java --- a/langtools/test/tools/javac/lambda/MostSpecific17.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific17.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,12 @@ * @test * @bug 8143852 * @summary Rename functional interface method type parameters during most specific test - * @compile MostSpecific17.java */ -class MostSpecific17 { +public class MostSpecific17 { + + public static void main(String[] args) { + new MostSpecific17().test(); + } interface A {} interface B extends A {} @@ -35,7 +38,9 @@ interface F1 { A apply(Object arg); } interface F2 { B apply(Object arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static B foo(Object in) { return null; } @@ -43,5 +48,4 @@ void test() { m1(MostSpecific17::foo); } - -} \ No newline at end of file +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific18.java --- a/langtools/test/tools/javac/lambda/MostSpecific18.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific18.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Test that generic function interface method bounds are the same - * @compile MostSpecific18.java */ -class MostSpecific18 { +public class MostSpecific18 { + public static void main(String[] args) { + new MostSpecific18().test(); + } + interface F1 { Object apply(X arg); } interface F2 { String apply(Y arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static String foo(Object in) { return "a"; } @@ -39,5 +44,4 @@ void test() { m1(MostSpecific18::foo); } - -} \ No newline at end of file +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific20.java --- a/langtools/test/tools/javac/lambda/MostSpecific20.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific20.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Test that generic function interface method bounds are the same - * @compile MostSpecific20.java */ -class MostSpecific20 { +public class MostSpecific20 { + public static void main(String[] args) { + new MostSpecific20().test(); + } + interface F1 { > Object apply(X arg); } interface F2 { > String apply(Y arg); } - static void m1(F1 f) {} + static void m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static void m1(F2 f) {} static String foo(Object in) { return "a"; } @@ -39,5 +44,4 @@ void test() { m1(MostSpecific20::foo); } - -} \ No newline at end of file +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific22.java --- a/langtools/test/tools/javac/lambda/MostSpecific22.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific22.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,19 @@ * @test * @bug 8143852 * @summary Most specific inference constraints derived from both functional interface method parameters and tparam bounds - * @compile MostSpecific22.java */ -class MostSpecific22 { + +public class MostSpecific22 { + public static void main(String[] args) { + new MostSpecific22().test(); + } + interface F1 { Object apply(T arg); } interface F2 { String apply(Number arg); } - static T m1(F1 f) { return null; } + static T m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static Object m1(F2 f) { return null; } static String foo(Object in) { return "a"; } @@ -40,4 +46,4 @@ m1(MostSpecific22::foo); } -} \ No newline at end of file +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific27.java --- a/langtools/test/tools/javac/lambda/MostSpecific27.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific27.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ * @test * @bug 8143852 * @summary Most specific inference constraints derived from intersection bound - * @compile MostSpecific27.java */ -class MostSpecific27 { +public class MostSpecific27 { + public static void main(String[] args) { + new MostSpecific27().test(); + } + interface F1 { & Runnable> Object apply(T arg); } interface F2 { & Runnable> String apply(Number arg); } - static T m1(F1 f) { return null; } + static T m1(F1 f) { + throw new AssertionError("Less-specific method invocation."); + } static Object m1(F2 f) { return null; } static String foo(Object in) { return "a"; } @@ -40,4 +45,4 @@ m1(MostSpecific27::foo); } -} \ No newline at end of file +} diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/MostSpecific29.java --- a/langtools/test/tools/javac/lambda/MostSpecific29.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/MostSpecific29.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,20 @@ * @test * @bug 8144767 * @summary Correct most-specific test when wildcards appear in functional interface type - * @compile MostSpecific29.java */ -class MostSpecific29 { +public class MostSpecific29 { + + public static void main(String[] args) { + new MostSpecific29().test(); + } interface Pred { boolean test(T arg); } interface Fun { R apply(T arg); } static void m1(Pred f) {} - static void m1(Fun f) {} + static void m1(Fun f) { + throw new AssertionError("Less-specific method invocation."); + } void test() { m1((Integer n) -> true); diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java --- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -1,33 +1,9 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test + * @test /nodynamiccopyright/ * @bug 8024947 * @summary javac should issue the potentially ambiguous overload warning only * where the problem appears * @compile/fail/ref=PotentiallyAmbiguousWarningTest.out -XDrawDiagnostics -Werror -Xlint:overloads PotentiallyAmbiguousWarningTest.java - * @compile PotentiallyAmbiguousWarningTest.java */ import java.util.function.*; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out --- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out Mon Jan 09 11:57:06 2017 -0800 @@ -1,9 +1,9 @@ -PotentiallyAmbiguousWarningTest.java:39:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.I1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.I1 -PotentiallyAmbiguousWarningTest.java:45:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.C1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C1 -PotentiallyAmbiguousWarningTest.java:55:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.J1, foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.I2 -PotentiallyAmbiguousWarningTest.java:72:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.D1, foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.C2 -PotentiallyAmbiguousWarningTest.java:78:21: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C3, foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.C3 -PotentiallyAmbiguousWarningTest.java:95:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.J2, foo(T), PotentiallyAmbiguousWarningTest.I5 +PotentiallyAmbiguousWarningTest.java:15:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.I1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.I1 +PotentiallyAmbiguousWarningTest.java:21:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.C1, foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C1 +PotentiallyAmbiguousWarningTest.java:31:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.J1, foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.I2 +PotentiallyAmbiguousWarningTest.java:48:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.D1, foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.C2 +PotentiallyAmbiguousWarningTest.java:54:21: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.IntConsumer), PotentiallyAmbiguousWarningTest.C3, foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.C3 +PotentiallyAmbiguousWarningTest.java:71:14: compiler.warn.potentially.ambiguous.overload: foo(java.util.function.Consumer), PotentiallyAmbiguousWarningTest.J2, foo(T), PotentiallyAmbiguousWarningTest.I5 - compiler.err.warnings.and.werror 1 error 6 warnings diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/javac/modules/AnnotationProcessing.java --- a/langtools/test/tools/javac/modules/AnnotationProcessing.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/javac/modules/AnnotationProcessing.java Mon Jan 09 11:57:06 2017 -0800 @@ -23,7 +23,7 @@ /** * @test - * @bug 8133884 8162711 8133896 + * @bug 8133884 8162711 8133896 8172158 * @summary Verify that annotation processing works. * @library /tools/lib * @modules @@ -979,6 +979,38 @@ } } + @Test + public void testDisambiguateAnnotationsNoModules(Path base) throws Exception { + Path classes = base.resolve("classes"); + + Files.createDirectories(classes); + + Path src = base.resolve("src"); + + tb.writeJavaFiles(src, + "package api; public @interface A {}", + "package api; public @interface B {}", + "package impl; import api.*; @A @B public class T {}"); + + List log = new JavacTask(tb) + .options("-processor", SelectAnnotationATestAP.class.getName() + "," + SelectAnnotationBTestAP.class.getName(), + "-source", "8", "-target", "8") + .outdir(classes) + .files(findJavaFiles(src)) + .run() + .writeAll() + .getOutputLines(OutputKind.STDERR); + + List expected = Arrays.asList("SelectAnnotationATestAP", + "SelectAnnotationBTestAP", + "SelectAnnotationATestAP", + "SelectAnnotationBTestAP"); + + if (!expected.equals(log)) { + throw new AssertionError("Output does not match; output: " + log); + } + } + @SupportedAnnotationTypes("m2x/api.A") public static final class SelectAnnotationATestAP extends AbstractProcessor { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/jdeps/listdeps/ListModuleDeps.java --- a/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java Mon Jan 09 11:57:06 2017 -0800 @@ -83,6 +83,28 @@ )); } + @DataProvider(name = "jdkModules") + public Object[][] jdkModules() { + return new Object[][]{ + {"jdk.compiler", new String[]{ + "java.base/sun.reflect.annotation", + "java.compiler", + } + }, + }; + } + + @Test(dataProvider = "jdkModules") + public void testJDKModule(String moduleName, String[] expected) { + JdepsRunner jdeps = JdepsRunner.run( + "--list-deps", "-m", moduleName + ); + String[] output = Arrays.stream(jdeps.output()) + .map(s -> s.trim()) + .toArray(String[]::new); + assertEquals(output, expected); + } + @Test(dataProvider = "listdeps") public void testListDeps(Path classes, String[] expected) { JdepsRunner jdeps = JdepsRunner.run( diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/jdeps/modules/CheckModuleTest.java --- a/langtools/test/tools/jdeps/modules/CheckModuleTest.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/jdeps/modules/CheckModuleTest.java Mon Jan 09 11:57:06 2017 -0800 @@ -57,6 +57,7 @@ private static final Set modules = Set.of("unsafe", "mIV", "mV", "mVI", "mVII", "mVIII"); private static final String JAVA_BASE = "java.base"; + private static final String JAVA_COMPILER = "java.compiler"; /** * Compiles classes used by the test @@ -73,6 +74,8 @@ return new Object[][] { { JAVA_BASE, new ModuleMetaData(JAVA_BASE) }, + { JAVA_COMPILER, new ModuleMetaData(JAVA_BASE) + }, }; }; diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/jdeps/modules/InverseDeps.java --- a/langtools/test/tools/jdeps/modules/InverseDeps.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/jdeps/modules/InverseDeps.java Mon Jan 09 11:57:06 2017 -0800 @@ -26,7 +26,9 @@ * @summary Tests split packages * @library ../lib * @build CompilerUtils JdepsUtil - * @modules jdk.jdeps/com.sun.tools.jdeps + * @modules java.logging + * jdk.jdeps/com.sun.tools.jdeps + * jdk.unsupported * @run testng InverseDeps */ @@ -87,6 +89,44 @@ } } } + @DataProvider(name = "jdkModules") + public Object[][] jdkModules() { + return new Object[][]{ + // --require and a subset of dependences + { "jdk.compiler", new String[][] { + new String[] {"jdk.compiler", "jdk.jshell"}, + new String[] {"jdk.compiler", "jdk.rmic"}, + new String[] {"jdk.compiler", "jdk.javadoc", "jdk.rmic"}, + } + }, + { "java.compiler", new String[][] { + new String[] {"java.compiler", "jdk.jshell"}, + new String[] {"java.compiler", "jdk.compiler", "jdk.jshell"}, + new String[] {"java.compiler", "jdk.compiler", "jdk.rmic"}, + new String[] {"java.compiler", "jdk.compiler", "jdk.javadoc", "jdk.rmic"}, + new String[] {"java.compiler", "java.se", "java.se.ee"}, + } + }, + }; + } + + @Test(dataProvider = "jdkModules") + public void testJDKModule(String moduleName, String[][] expected) throws Exception { + // this invokes the jdeps launcher so that all system modules are observable + JdepsRunner jdeps = JdepsRunner.run( + "--inverse", "--require", moduleName + ); + List output = Arrays.stream(jdeps.output()) + .map(s -> s.trim()) + .collect(Collectors.toList()); + + // verify the dependences + assertTrue(Arrays.stream(expected) + .map(path -> Arrays.stream(path) + .collect(Collectors.joining(" <- "))) + .anyMatch(output::contains)); + } + @DataProvider(name = "testrequires") public Object[][] expected1() { diff -r 05e2611ebff6 -r 65e2b10e8e80 langtools/test/tools/jdeps/modules/SplitPackage.java --- a/langtools/test/tools/jdeps/modules/SplitPackage.java Fri Jan 06 16:50:50 2017 +0530 +++ b/langtools/test/tools/jdeps/modules/SplitPackage.java Mon Jan 09 11:57:06 2017 -0800 @@ -63,10 +63,15 @@ @Test public void runTest() throws Exception { + // split package detected if java.annotation.common is in the root set + runTest(JAVA_ANNOTATIONS_COMMON, SPLIT_PKG_NAME); + runTest("ALL-SYSTEM", SPLIT_PKG_NAME); + // default + runTest(null, SPLIT_PKG_NAME); + // Test jdeps classes - runTest(null); - // Test jdeps --add-modules - runTest(JAVA_ANNOTATIONS_COMMON, SPLIT_PKG_NAME); + runTest("ALL-DEFAULT"); + } private void runTest(String root, String... splitPackages) throws Exception { diff -r 05e2611ebff6 -r 65e2b10e8e80 make/Bundles.gmk --- a/make/Bundles.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/Bundles.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -103,7 +103,7 @@ $(CD) $$($1_BASE_DIRS) \ && ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) \ -$(TAR_INCLUDE_PARAM) $$($1_$$($1_BASE_DIRS)_LIST_FILE) \ - $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|') \ + $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|S') \ $(TAR_IGNORE_EXIT_VALUE) ) \ | $(GZIP) > $$@ else diff -r 05e2611ebff6 -r 65e2b10e8e80 make/CompileJavaModules.gmk --- a/make/CompileJavaModules.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/CompileJavaModules.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -363,6 +363,10 @@ ################################################################################ +jdk.jshell_COPY := .jsh .properties + +################################################################################ + jdk.internal.le_COPY := .properties ################################################################################ diff -r 05e2611ebff6 -r 65e2b10e8e80 make/CopyImportModules.gmk --- a/make/CopyImportModules.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/CopyImportModules.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -67,14 +67,17 @@ # or risk invalidating the build output from external changes. ifeq ($(filter $(OUTPUT_ROOT)/%, $(LIBS_DIR)), ) LINK_MACRO := install-file + LOG_ACTION := Copying else LINK_MACRO := link-file-relative + LOG_ACTION := Creating symlink endif $(eval $(call SetupCopyFiles, LINK_LIBS, \ SRC := $(LIBS_DIR), \ DEST := $(JDK_OUTPUTDIR)/lib, \ FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(call CacheFind, $(LIBS_DIR))), \ MACRO := $(LINK_MACRO), \ + LOG_ACTION := $(LOG_ACTION), \ )) TARGETS += $(COPY_LIBS) $(LINK_LIBS) endif diff -r 05e2611ebff6 -r 65e2b10e8e80 make/Javadoc.gmk --- a/make/Javadoc.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/Javadoc.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -148,10 +148,10 @@ # arg 2: copyright url (optional) # arg 3: free-form text snippet (optional) define GenerateBottom - $(if $(strip $3), $(strip $3))
    $(if \ + $(if $(strip $3), $(strip $3))
    $(if \ $(strip $2),Copyright,Copyright) \ © $(strip $1), $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \ - $(COMPANY_ADDRESS). All rights reserved.
    + $(COMPANY_ADDRESS). All rights reserved. endef # Speed up finding by filling cache diff -r 05e2611ebff6 -r 65e2b10e8e80 make/Main.gmk --- a/make/Main.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/Main.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -630,13 +630,12 @@ # in javadoc. java.desktop-gensrc-jdk: java.base-gensrc - # The annotation processing for jdk.vm.ci needs java.base classes from the - # current JDK. - jdk.vm.ci-gensrc-hotspot: java.base-java - - # The annotation processing for jdk.vm.compiler needs classes from the current JDK. - jdk.vm.compiler-gensrc-hotspot: java.base-java java.management-java \ - jdk.management-java jdk.vm.ci-java jdk.unsupported-java + # The annotation processing for jdk.vm.ci and jdk.vm.compiler needs classes + # from the current JDK. + jdk.vm.ci-gensrc-hotspot: $(addsuffix -java, \ + $(call FindTransitiveDepsForModule, jdk.vm.ci)) + jdk.vm.compiler-gensrc-hotspot: $(addsuffix -java, \ + $(call FindTransitiveDepsForModule, jdk.vm.compiler)) # For jdk.vm.compiler, the gensrc step is generating a module-info.java.extra # file to be processed by the gensrc-moduleinfo target. diff -r 05e2611ebff6 -r 65e2b10e8e80 make/ModuleWrapper.gmk --- a/make/ModuleWrapper.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/ModuleWrapper.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -76,6 +76,7 @@ $(filter $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE)/%, \ $(TARGETS))), \ MACRO := link-file-relative, \ + LOG_ACTION := Creating symlink, \ )) endif diff -r 05e2611ebff6 -r 65e2b10e8e80 make/SourceRevision.gmk --- a/make/SourceRevision.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/SourceRevision.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -105,7 +105,7 @@ # We have a stored source revision (.src-rev) store-source-revision: - $(call LogWarn, Warning: No mercurial configuration present, not updating .src-rev) + $(call LogInfo, No mercurial configuration present$(COMMA) not updating .src-rev) $(SOURCE_REVISION_TRACKER): $(STORED_SOURCE_REVISION) $(install-file) @@ -115,7 +115,7 @@ # We don't have a stored source revision. Can't do anything, really. store-source-revision: - $(call LogWarn, Error: No mercurial configuration present, cannot create .src-rev) + $(call LogWarn, Error: No mercurial configuration present$(COMMA) cannot create .src-rev) exit 2 create-source-revision-tracker: diff -r 05e2611ebff6 -r 65e2b10e8e80 make/common/MakeBase.gmk --- a/make/common/MakeBase.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/common/MakeBase.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -694,8 +694,9 @@ # 2 : Dest file # 3 : Variable to add targets to # 4 : Macro to call for copy operation + # 5 : Action text to log $2: $1 - $$(call LogInfo, Copying $$(patsubst $(OUTPUT_ROOT)/%,%,$$@)) + $$(call LogInfo, $(strip $5) $$(patsubst $(OUTPUT_ROOT)/%,%,$$@)) $$($$(strip $4)) $3 += $2 @@ -721,6 +722,7 @@ # Default is 'install-file' # NAME_MACRO : Optionally supply a macro that rewrites the target file name # based on the source file name +# LOG_ACTION : Optionally specify a different action text for log messages SetupCopyFiles = $(NamedParamsMacroTemplate) define SetupCopyFilesBody @@ -737,6 +739,10 @@ $1_NAME_MACRO := identity endif + ifeq ($$($1_LOG_ACTION), ) + $1_LOG_ACTION := Copying + endif + # Remove any trailing slash from SRC and DEST $1_SRC := $$(patsubst %/,%,$$($1_SRC)) $1_DEST := $$(patsubst %/,%,$$($1_DEST)) @@ -744,7 +750,7 @@ $$(foreach f, $$(patsubst $$($1_SRC)/%,%,$$($1_FILES)), \ $$(eval $$(call AddFileToCopy, $$($1_SRC)/$$f, \ $$($1_DEST)/$$(call $$(strip $$($1_NAME_MACRO)),$$(if $$($1_FLATTEN),$$(notdir $$f),$$f)), \ - $1, $$($1_MACRO)))) + $1, $$($1_MACRO), $$($1_LOG_ACTION)))) endef diff -r 05e2611ebff6 -r 65e2b10e8e80 make/common/NativeCompilation.gmk --- a/make/common/NativeCompilation.gmk Fri Jan 06 16:50:50 2017 +0530 +++ b/make/common/NativeCompilation.gmk Mon Jan 09 11:57:06 2017 -0800 @@ -371,7 +371,8 @@ # when compiling C code # DISABLED_WARNINGS_CXX_ Disable the given warnings for the specified # toolchain when compiling C++ code -# STRIP_SYMBOLS Set to true to strip the final binary if the toolchain allows for it +# STRIP_SYMBOLS Set to false to override global strip policy and always leave +# symbols in the binary, if the toolchain allows for it # DEBUG_SYMBOLS Set to false to disable generation of debug symbols # COPY_DEBUG_SYMBOLS Set to false to override global setting of debug symbol copying # ZIP_EXTERNAL_DEBUG_SYMBOLS Set to false to override global setting of debug symbol @@ -886,6 +887,10 @@ endif # $1_DEBUG_SYMBOLS != false endif # COPY_DEBUG_SYMBOLS + # Unless specifically set, stripping should only happen if symbols are also + # being copied. + $$(call SetIfEmpty, $1_STRIP_SYMBOLS, $$($1_COPY_DEBUG_SYMBOLS)) + ifneq ($$($1_STRIP_SYMBOLS), false) ifneq ($$($1_STRIP), ) # Default to using the global STRIPFLAGS. Allow for overriding with an empty value diff -r 05e2611ebff6 -r 65e2b10e8e80 make/jprt.properties --- a/make/jprt.properties Fri Jan 06 16:50:50 2017 +0530 +++ b/make/jprt.properties Mon Jan 09 11:57:06 2017 -0800 @@ -45,6 +45,7 @@ jprt.build.use.jib=true jprt.test.use.jib=true jprt.jib.launcher=common/bin/jib.sh +jprt.build.use.jib.publish=true # Clear out all the build needs as JIB handles this jprt.jdk9.build.needs= @@ -124,7 +125,7 @@ jprt.linux_i586.fastdebugZero.build.jib.profile=linux-x86-zero-debug jprt.linux_x64.fastdebugZero.build.jib.profile=linux-x64-zero-debug -jprt.test.jib.profile=run-test +jprt.test.jib.profile=run-test-jprt # Set make target to use for different build flavors jprt.build.flavor.fastdebugOpen.target=jprt_bundle @@ -189,7 +190,7 @@ jprt.build.configure.args= \ --with-output-sync=recurse \ --with-jobs=$ALT_PARALLEL_COMPILE_JOBS \ - --with-version-opt=$JPRT_JOB_ID \ + --with-version-opt=$JPRT_JOB_ID \ ${my.additional.build.configure.args.${jprt.test.set}} \ ${my.custom.build.configure.args} diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/.hgtags --- a/nashorn/.hgtags Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/.hgtags Mon Jan 09 11:57:06 2017 -0800 @@ -383,3 +383,5 @@ 9e86d6383456a1eb0298c72bb9ca363939ad90cf jdk-9+147 0a4bc2f049132ddc20985565bb41b2be8a458dda jdk-9+148 c281306d33d83c92e0d870ace385d5f99678d7e7 jdk-9+149 +ace1d994bca775d6545a4c874ae73d1dfc9ec18b jdk-9+150 +2a0437036a64853334e538044eb68d2df70075fa jdk-9+151 diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/README --- a/nashorn/README Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/README Mon Jan 09 11:57:06 2017 -0800 @@ -24,33 +24,33 @@ You can clone Nashorn Mercurial forest using this command: - hg fclone http://hg.openjdk.java.net/nashorn/jdk8 nashorn~jdk8 + hg fclone http://hg.openjdk.java.net/nashorn/jdk9 nashorn~jdk9 To update your copy of the forest (fwith the latest code: - (cd nashorn~jdk8 ; hg fpull) + (cd nashorn~jdk9 ; hg fpull) Or just the nashorn subdirectory with - (cd nashorn~jdk8/nashorn ; hg pull -u) + (cd nashorn~jdk9/nashorn ; hg pull -u) To learn about Mercurial in detail, please visit http://hgbook.red-bean.com. - How to build? -To build Nashorn, you need to install JDK 8. You may use the Nashorn +To build Nashorn, you need to install JDK 9. You may use the Nashorn forest build (recommended) or down load from java.net. You will need to set JAVA_HOME environmental variable to point to your JDK installation directory. - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant clean; ant - How to run? Use the jjs script (see RELESE_README): - cd nashorn~jdk8/nashorn + cd nashorn~jdk9/nashorn sh bin/jjs Nashorn supports javax.script API. It is possible to drop nashorn.jar in @@ -64,7 +64,7 @@ Comprehensive development documentation is found in the Nashorn JavaDoc. You can build it using: - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant javadoc after which you can view the generated documentation at dist/javadoc/index.html. @@ -90,7 +90,7 @@ test/script/external/test262 a symbolic link to that directory. After you've done this, you can run the ECMA-262 tests using: - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant test262 Ant target to get/update external test suites: @@ -101,7 +101,7 @@ These tests take time, so we have a parallelized runner for them that takes advantage of all processor cores on the computer: - cd nashorn~jdk8/nashorn/make + cd nashorn~jdk9/nashorn/make ant test262parallel - How to write your own test? diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/RELEASE_README --- a/nashorn/RELEASE_README Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -The Nashorn repo is in the process of being migrated to OpenJDK and as such is -incomplete in several areas. - -- The build system is not fully integrated. When complete, Nashorn will be -installed in its proper location in the JRE. - -- Once integrated, the correct version of the JDK will be wrapped around -Nashorn. In the meantime, ensure you use JDK8 b68 or later. - -- The jjs tool has not been implemented in binary form yet. Use "sh bin/jjs" -(or bin/jjs.bat on windows) in the interm. - -- The Dynalink component is not fully integrated into Nashorn as yet, but will -be when details are finalized. - -- And, finally Nashorn is still in development. To stay up to date, subscribe -to nashorn-dev@openjdk.java.net at - - http://mail.openjdk.java.net/mailman/listinfo/nashorn-dev. - diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/make/build.xml --- a/nashorn/make/build.xml Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/make/build.xml Mon Jan 09 11:57:06 2017 -0800 @@ -267,7 +267,7 @@ - @@ -285,7 +285,7 @@ - diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java --- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java Mon Jan 09 11:57:06 2017 -0800 @@ -82,197 +82,6 @@ */ /** - *

    - * Dynalink is a library for dynamic linking of high-level operations on objects. - * These operations include "read a property", - * "write a property", "invoke a function" and so on. Dynalink is primarily - * useful for implementing programming languages where at least some expressions - * have dynamic types (that is, types that can not be decided statically), and - * the operations on dynamic types are expressed as - * {@link java.lang.invoke.CallSite call sites}. These call sites will be - * linked to appropriate target {@link java.lang.invoke.MethodHandle method handles} - * at run time based on actual types of the values the expressions evaluated to. - * These can change between invocations, necessitating relinking the call site - * multiple times to accommodate new types; Dynalink handles all that and more. - *

    - * Dynalink supports implementation of programming languages with object models - * that differ (even radically) from the JVM's class-based model and have their - * custom type conversions. - *

    - * Dynalink is closely related to, and relies on, the {@link java.lang.invoke} - * package. - *

    - * - * While {@link java.lang.invoke} provides a low level API for dynamic linking - * of {@code invokedynamic} call sites, it does not provide a way to express - * higher level operations on objects, nor methods that implement them. These - * operations are the usual ones in object-oriented environments: property - * access, access of elements of collections, invocation of methods and - * constructors (potentially with multiple dispatch, e.g. link- and run-time - * equivalents of Java overloaded method resolution). These are all functions - * that are normally desired in a language on the JVM. If a language is - * statically typed and its type system matches that of the JVM, it can - * accomplish this with use of the usual invocation, field access, etc. - * instructions (e.g. {@code invokevirtual}, {@code getfield}). However, if the - * language is dynamic (hence, types of some expressions are not known until - * evaluated at run time), or its object model or type system don't match - * closely that of the JVM, then it should use {@code invokedynamic} call sites - * instead and let Dynalink manage them. - *

    Example

    - * Dynalink is probably best explained by an example showing its use. Let's - * suppose you have a program in a language where you don't have to declare the - * type of an object and you want to access a property on it: - *
    - * var color = obj.color;
    - * 
    - * If you generated a Java class to represent the above one-line program, its - * bytecode would look something like this: - *
    - * aload 2 // load "obj" on stack
    - * invokedynamic "GET:PROPERTY:color"(Object)Object // invoke property getter on object of unknown type
    - * astore 3 // store the return value into local variable "color"
    - * 
    - * In order to link the {@code invokedynamic} instruction, we need a bootstrap - * method. A minimalist bootstrap method with Dynalink could look like this: - *
    - * import java.lang.invoke.*;
    - * import jdk.dynalink.*;
    - * import jdk.dynalink.support.*;
    - *
    - * class MyLanguageRuntime {
    - *     private static final DynamicLinker dynamicLinker = new DynamicLinkerFactory().createLinker();
    - *
    - *     public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
    - *         return dynamicLinker.link(
    - *             new SimpleRelinkableCallSite(
    - *                 new CallSiteDescriptor(lookup, parseOperation(name), type)));
    - *     }
    - *
    - *     private static Operation parseOperation(String name) {
    - *         ...
    - *     }
    - * }
    - * 
    - * There are several objects of significance in the above code snippet: - *
      - *
    • {@link jdk.dynalink.DynamicLinker} is the main object in Dynalink, it - * coordinates the linking of call sites to method handles that implement the - * operations named in them. It is configured and created using a - * {@link jdk.dynalink.DynamicLinkerFactory}.
    • - *
    • When the bootstrap method is invoked, it needs to create a - * {@link java.lang.invoke.CallSite} object. In Dynalink, these call sites need - * to additionally implement the {@link jdk.dynalink.RelinkableCallSite} - * interface. "Relinkable" here alludes to the fact that if the call site - * encounters objects of different types at run time, its target will be changed - * to a method handle that can perform the operation on the newly encountered - * type. {@link jdk.dynalink.support.SimpleRelinkableCallSite} and - * {@link jdk.dynalink.support.ChainedCallSite} (not used in the above example) - * are two implementations already provided by the library.
    • - *
    • Dynalink uses {@link jdk.dynalink.CallSiteDescriptor} objects to - * preserve the parameters to the bootstrap method: the lookup and the method type, - * as it will need them whenever it needs to relink a call site.
    • - *
    • Dynalink uses {@link jdk.dynalink.Operation} objects to express - * dynamic operations. It does not prescribe how would you encode the operations - * in your call site, though. That is why in the above example the - * {@code parseOperation} function is left empty, and you would be expected to - * provide the code to parse the string {@code "GET:PROPERTY:color"} - * in the call site's name into a named property getter operation object as - * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")}. - *
    - *

    What can you already do with the above setup? {@code DynamicLinkerFactory} - * by default creates a {@code DynamicLinker} that can link Java objects with the - * usual Java semantics. If you have these three simple classes: - *

    - * public class A {
    - *     public String color;
    - *     public A(String color) { this.color = color; }
    - * }
    - *
    - * public class B {
    - *     private String color;
    - *     public B(String color) { this.color = color; }
    - *     public String getColor() { return color; }
    - * }
    - *
    - * public class C {
    - *     private int color;
    - *     public C(int color) { this.color = color; }
    - *     public int getColor() { return color; }
    - * }
    - * 
    - * and you somehow create their instances and pass them to your call site in your - * programming language: - *
    - * for each(var obj in [new A("red"), new B("green"), new C(0x0000ff)]) {
    - *     print(obj.color);
    - * }
    - * 
    - * then on first invocation, Dynalink will link the {@code .color} getter - * operation to a field getter for {@code A.color}, on second invocation it will - * relink it to {@code B.getColor()} returning a {@code String}, and finally on - * third invocation it will relink it to {@code C.getColor()} returning an {@code int}. - * The {@code SimpleRelinkableCallSite} we used above only remembers the linkage - * for the last encountered type (it implements what is known as a monomorphic - * inline cache). Another already provided implementation, - * {@link jdk.dynalink.support.ChainedCallSite} will remember linkages for - * several different types (it is a polymorphic inline cache) and is - * probably a better choice in serious applications. - *

    Dynalink and bytecode creation

    - * {@code CallSite} objects are usually created as part of bootstrapping - * {@code invokedynamic} instructions in bytecode. Hence, Dynalink is typically - * used as part of language runtimes that compile programs into Java - * {@code .class} bytecode format. Dynalink does not address the aspects of - * either creating bytecode classes or loading them into the JVM. That said, - * Dynalink can also be used without bytecode compilation (e.g. in language - * interpreters) by creating {@code CallSite} objects explicitly and associating - * them with representations of dynamic operations in the interpreted program - * (e.g. a typical representation would be some node objects in a syntax tree). - *

    Available operations

    - * Dynalink defines several standard operations in its - * {@link jdk.dynalink.StandardOperation} class. The linker for Java - * objects can link all of these operations, and you are encouraged to at - * minimum support and use these operations in your language too. The - * standard operations {@code GET} and {@code SET} need to be combined with - * at least one {@link jdk.dynalink.Namespace} to be useful, e.g. to express a - * property getter, you'd use {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY)}. - * Dynalink defines three standard namespaces in the {@link jdk.dynalink.StandardNamespace} class. - * To associate a fixed name with an operation, you can use - * {@link jdk.dynalink.NamedOperation} as in the previous example: - * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")} - * expresses a getter for the property named "color". - *

    Operations on multiple namespaces

    - * Some languages might not have separate namespaces on objects for - * properties, elements, and methods, and a source language construct might - * address several of them at once. Dynalink supports specifying multiple - * {@link jdk.dynalink.Namespace} objects with {@link jdk.dynalink.NamespaceOperation}. - *

    Language-specific linkers

    - * Languages that define their own object model different than the JVM - * class-based model and/or use their own type conversions will need to create - * their own language-specific linkers. See the {@link jdk.dynalink.linker} - * package and specifically the {@link jdk.dynalink.linker.GuardingDynamicLinker} - * interface to get started. - *

    Dynalink and Java objects

    - * The {@code DynamicLinker} objects created by {@code DynamicLinkerFactory} by - * default contain an internal instance of - * {@code BeansLinker}, which is a language-specific linker - * that implements the usual Java semantics for all of the above operations and - * can link any Java object that no other language-specific linker has managed - * to link. This way, all language runtimes have built-in interoperability with - * ordinary Java objects. See {@link jdk.dynalink.beans.BeansLinker} for details - * on how it links the various operations. - *

    Cross-language interoperability

    - * A {@code DynamicLinkerFactory} can be configured with a - * {@link jdk.dynalink.DynamicLinkerFactory#setClassLoader(ClassLoader) class - * loader}. It will try to instantiate all - * {@link jdk.dynalink.linker.GuardingDynamicLinkerExporter} classes visible to - * that class loader and compose the linkers they provide into the - * {@code DynamicLinker} it creates. This allows for interoperability between - * languages: if you have two language runtimes A and B deployed in your JVM and - * they export their linkers through the above mechanism, language runtime A - * will have a language-specific linker instance from B and vice versa inside - * their {@code DynamicLinker} objects. This means that if an object from - * language runtime B gets passed to code from language runtime A, the linker - * from B will get a chance to link the call site in A when it encounters the - * object from B. + * Contains interfaces and classes that are used to link an {@code invokedynamic} call site. */ package jdk.dynalink; diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/src/jdk.dynalink/share/classes/module-info.java --- a/nashorn/src/jdk.dynalink/share/classes/module-info.java Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/src/jdk.dynalink/share/classes/module-info.java Mon Jan 09 11:57:06 2017 -0800 @@ -24,7 +24,198 @@ */ /** - * Dynalink + *

    + * Dynalink is a library for dynamic linking of high-level operations on objects. + * These operations include "read a property", + * "write a property", "invoke a function" and so on. Dynalink is primarily + * useful for implementing programming languages where at least some expressions + * have dynamic types (that is, types that can not be decided statically), and + * the operations on dynamic types are expressed as + * {@link java.lang.invoke.CallSite call sites}. These call sites will be + * linked to appropriate target {@link java.lang.invoke.MethodHandle method handles} + * at run time based on actual types of the values the expressions evaluated to. + * These can change between invocations, necessitating relinking the call site + * multiple times to accommodate new types; Dynalink handles all that and more. + *

    + * Dynalink supports implementation of programming languages with object models + * that differ (even radically) from the JVM's class-based model and have their + * custom type conversions. + *

    + * Dynalink is closely related to, and relies on, the {@link java.lang.invoke} + * package. + *

    + * + * While {@link java.lang.invoke} provides a low level API for dynamic linking + * of {@code invokedynamic} call sites, it does not provide a way to express + * higher level operations on objects, nor methods that implement them. These + * operations are the usual ones in object-oriented environments: property + * access, access of elements of collections, invocation of methods and + * constructors (potentially with multiple dispatch, e.g. link- and run-time + * equivalents of Java overloaded method resolution). These are all functions + * that are normally desired in a language on the JVM. If a language is + * statically typed and its type system matches that of the JVM, it can + * accomplish this with use of the usual invocation, field access, etc. + * instructions (e.g. {@code invokevirtual}, {@code getfield}). However, if the + * language is dynamic (hence, types of some expressions are not known until + * evaluated at run time), or its object model or type system don't match + * closely that of the JVM, then it should use {@code invokedynamic} call sites + * instead and let Dynalink manage them. + *

    Example

    + * Dynalink is probably best explained by an example showing its use. Let's + * suppose you have a program in a language where you don't have to declare the + * type of an object and you want to access a property on it: + *
    + * var color = obj.color;
    + * 
    + * If you generated a Java class to represent the above one-line program, its + * bytecode would look something like this: + *
    + * aload 2 // load "obj" on stack
    + * invokedynamic "GET:PROPERTY:color"(Object)Object // invoke property getter on object of unknown type
    + * astore 3 // store the return value into local variable "color"
    + * 
    + * In order to link the {@code invokedynamic} instruction, we need a bootstrap + * method. A minimalist bootstrap method with Dynalink could look like this: + *
    + * import java.lang.invoke.*;
    + * import jdk.dynalink.*;
    + * import jdk.dynalink.support.*;
    + *
    + * class MyLanguageRuntime {
    + *     private static final DynamicLinker dynamicLinker = new DynamicLinkerFactory().createLinker();
    + *
    + *     public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
    + *         return dynamicLinker.link(
    + *             new SimpleRelinkableCallSite(
    + *                 new CallSiteDescriptor(lookup, parseOperation(name), type)));
    + *     }
    + *
    + *     private static Operation parseOperation(String name) {
    + *         ...
    + *     }
    + * }
    + * 
    + * There are several objects of significance in the above code snippet: + *
      + *
    • {@link jdk.dynalink.DynamicLinker} is the main object in Dynalink, it + * coordinates the linking of call sites to method handles that implement the + * operations named in them. It is configured and created using a + * {@link jdk.dynalink.DynamicLinkerFactory}.
    • + *
    • When the bootstrap method is invoked, it needs to create a + * {@link java.lang.invoke.CallSite} object. In Dynalink, these call sites need + * to additionally implement the {@link jdk.dynalink.RelinkableCallSite} + * interface. "Relinkable" here alludes to the fact that if the call site + * encounters objects of different types at run time, its target will be changed + * to a method handle that can perform the operation on the newly encountered + * type. {@link jdk.dynalink.support.SimpleRelinkableCallSite} and + * {@link jdk.dynalink.support.ChainedCallSite} (not used in the above example) + * are two implementations already provided by the library.
    • + *
    • Dynalink uses {@link jdk.dynalink.CallSiteDescriptor} objects to + * preserve the parameters to the bootstrap method: the lookup and the method type, + * as it will need them whenever it needs to relink a call site.
    • + *
    • Dynalink uses {@link jdk.dynalink.Operation} objects to express + * dynamic operations. It does not prescribe how would you encode the operations + * in your call site, though. That is why in the above example the + * {@code parseOperation} function is left empty, and you would be expected to + * provide the code to parse the string {@code "GET:PROPERTY:color"} + * in the call site's name into a named property getter operation object as + * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")}. + *
    + *

    What can you already do with the above setup? {@code DynamicLinkerFactory} + * by default creates a {@code DynamicLinker} that can link Java objects with the + * usual Java semantics. If you have these three simple classes: + *

    + * public class A {
    + *     public String color;
    + *     public A(String color) { this.color = color; }
    + * }
    + *
    + * public class B {
    + *     private String color;
    + *     public B(String color) { this.color = color; }
    + *     public String getColor() { return color; }
    + * }
    + *
    + * public class C {
    + *     private int color;
    + *     public C(int color) { this.color = color; }
    + *     public int getColor() { return color; }
    + * }
    + * 
    + * and you somehow create their instances and pass them to your call site in your + * programming language: + *
    + * for each(var obj in [new A("red"), new B("green"), new C(0x0000ff)]) {
    + *     print(obj.color);
    + * }
    + * 
    + * then on first invocation, Dynalink will link the {@code .color} getter + * operation to a field getter for {@code A.color}, on second invocation it will + * relink it to {@code B.getColor()} returning a {@code String}, and finally on + * third invocation it will relink it to {@code C.getColor()} returning an {@code int}. + * The {@code SimpleRelinkableCallSite} we used above only remembers the linkage + * for the last encountered type (it implements what is known as a monomorphic + * inline cache). Another already provided implementation, + * {@link jdk.dynalink.support.ChainedCallSite} will remember linkages for + * several different types (it is a polymorphic inline cache) and is + * probably a better choice in serious applications. + *

    Dynalink and bytecode creation

    + * {@code CallSite} objects are usually created as part of bootstrapping + * {@code invokedynamic} instructions in bytecode. Hence, Dynalink is typically + * used as part of language runtimes that compile programs into Java + * {@code .class} bytecode format. Dynalink does not address the aspects of + * either creating bytecode classes or loading them into the JVM. That said, + * Dynalink can also be used without bytecode compilation (e.g. in language + * interpreters) by creating {@code CallSite} objects explicitly and associating + * them with representations of dynamic operations in the interpreted program + * (e.g. a typical representation would be some node objects in a syntax tree). + *

    Available operations

    + * Dynalink defines several standard operations in its + * {@link jdk.dynalink.StandardOperation} class. The linker for Java + * objects can link all of these operations, and you are encouraged to at + * minimum support and use these operations in your language too. The + * standard operations {@code GET} and {@code SET} need to be combined with + * at least one {@link jdk.dynalink.Namespace} to be useful, e.g. to express a + * property getter, you'd use {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY)}. + * Dynalink defines three standard namespaces in the {@link jdk.dynalink.StandardNamespace} class. + * To associate a fixed name with an operation, you can use + * {@link jdk.dynalink.NamedOperation} as in the previous example: + * {@code StandardOperation.GET.withNamespace(StandardNamespace.PROPERTY).named("color")} + * expresses a getter for the property named "color". + *

    Operations on multiple namespaces

    + * Some languages might not have separate namespaces on objects for + * properties, elements, and methods, and a source language construct might + * address several of them at once. Dynalink supports specifying multiple + * {@link jdk.dynalink.Namespace} objects with {@link jdk.dynalink.NamespaceOperation}. + *

    Language-specific linkers

    + * Languages that define their own object model different than the JVM + * class-based model and/or use their own type conversions will need to create + * their own language-specific linkers. See the {@link jdk.dynalink.linker} + * package and specifically the {@link jdk.dynalink.linker.GuardingDynamicLinker} + * interface to get started. + *

    Dynalink and Java objects

    + * The {@code DynamicLinker} objects created by {@code DynamicLinkerFactory} by + * default contain an internal instance of + * {@code BeansLinker}, which is a language-specific linker + * that implements the usual Java semantics for all of the above operations and + * can link any Java object that no other language-specific linker has managed + * to link. This way, all language runtimes have built-in interoperability with + * ordinary Java objects. See {@link jdk.dynalink.beans.BeansLinker} for details + * on how it links the various operations. + *

    Cross-language interoperability

    + * A {@code DynamicLinkerFactory} can be configured with a + * {@link jdk.dynalink.DynamicLinkerFactory#setClassLoader(ClassLoader) class + * loader}. It will try to instantiate all + * {@link jdk.dynalink.linker.GuardingDynamicLinkerExporter} classes visible to + * that class loader and compose the linkers they provide into the + * {@code DynamicLinker} it creates. This allows for interoperability between + * languages: if you have two language runtimes A and B deployed in your JVM and + * they export their linkers through the above mechanism, language runtime A + * will have a language-specific linker instance from B and vice versa inside + * their {@code DynamicLinker} objects. This means that if an object from + * language runtime B gets passed to code from language runtime A, the linker + * from B will get a chance to link the call site in A when it encounters the + * object from B. */ module jdk.dynalink { requires java.logging; diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Mon Jan 09 11:57:06 2017 -0800 @@ -37,7 +37,7 @@ */ class SparseArrayData extends ArrayData { /** Maximum size for dense arrays */ - static final int MAX_DENSE_LENGTH = 1024 * 1024; + static final int MAX_DENSE_LENGTH = 128 * 1024; /** Underlying array. */ private ArrayData underlying; @@ -56,7 +56,7 @@ super(length); assert underlying.length() <= length; this.underlying = underlying; - this.maxDenseLength = Math.max(MAX_DENSE_LENGTH, underlying.length()); + this.maxDenseLength = underlying.length(); this.sparseMap = sparseMap; } diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java Mon Jan 09 11:57:06 2017 -0800 @@ -285,15 +285,15 @@ @Override public Comparison compareConversion(final Class sourceType, final Class targetType1, final Class targetType2) { if(sourceType == NativeArray.class) { - // Prefer lists, as they're less costly to create than arrays. - if(isList(targetType1)) { - if(!isList(targetType2)) { + // Prefer those types we can convert to with just a wrapper (cheaper than Java array creation). + if(isArrayPreferredTarget(targetType1)) { + if(!isArrayPreferredTarget(targetType2)) { return Comparison.TYPE_1_BETTER; } - } else if(isList(targetType2)) { + } else if(isArrayPreferredTarget(targetType2)) { return Comparison.TYPE_2_BETTER; } - // Then prefer arrays + // Then prefer Java arrays if(targetType1.isArray()) { if(!targetType2.isArray()) { return Comparison.TYPE_1_BETTER; @@ -315,8 +315,8 @@ return Comparison.INDETERMINATE; } - private static boolean isList(final Class clazz) { - return clazz == List.class || clazz == Deque.class; + private static boolean isArrayPreferredTarget(final Class clazz) { + return clazz == List.class || clazz == Collection.class || clazz == Queue.class || clazz == Deque.class; } private static final MethodHandle IS_SCRIPT_OBJECT = Guards.isInstance(ScriptObject.class, MH.type(Boolean.TYPE, Object.class)); diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java Fri Jan 06 16:50:50 2017 +0530 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java Mon Jan 09 11:57:06 2017 -0800 @@ -24,7 +24,71 @@ */ /** - * Nashorn +

    +Nashorn is a runtime environment for programs written in ECMAScript 5.1. +

    +

    Usage

    +The recommended way to use Nashorn is through the JSR-223 +"Scripting for the Java Platform" APIs found in the {@link javax.script} package. Usually, you'll obtain a +{@link javax.script.ScriptEngine} instance for Nashorn using: +
    +import javax.script.*;
    +...
    +ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("nashorn");
    +
    +and then use it just as you would any other JSR-223 script engine. See +{@code jdk.nashorn.api.scripting} package +for details. +

    Compatibility

    +Nashorn is 100% compliant with the ECMA-262 Standard, Edition 5.1. It requires a Java Virtual Machine that implements the +JSR-292 "Supporting Dynamically Typed Languages on the Java +Platform" specification (often referred to as "invokedynamic"), as well as the already mentioned JSR-223. +

    Interoperability with the Java platform

    +In addition to being a 100% ECMAScript 5.1 runtime, Nashorn provides features for interoperability of the ECMAScript +programs with the Java platform. In general, any Java object put into the script engine's context will be visible from +the script. In terms of the standard, such Java objects are not considered "native objects", but rather "host objects", +as defined in section 4.3.8. This distinction allows certain semantical differences in handling them compared to native +objects. For most purposes, Java objects behave just as native objects do: you can invoke their methods, get and set +their properties. In most cases, though, you can't add arbitrary properties to them, nor can you remove existing +properties. +

    Java collection handling

    +Native Java arrays and {@link java.util.List}s support indexed access to their elements through the property accessors, +and {@link java.util.Map}s support both property and element access through both dot and square-bracket property +accessors, with the difference being that dot operator gives precedence to object properties (its fields and properties +defined as {@code getXxx} and {@code setXxx} methods) while the square bracket operator gives precedence to map +elements. Native Java arrays expose the {@code length} property. +

    ECMAScript primitive types

    +ECMAScript primitive types for number, string, and boolean are represented with {@link java.lang.Number}, +{@link java.lang.CharSequence}, and {@link java.lang.Boolean} objects. While the most often used number type is +{@link java.lang.Double} and the most often used string type is {@link java.lang.String}, don't rely on it as various +internal optimizations cause other subclasses of {@code Number} and internal implementations of {@code CharSequence} to +be used. +

    Type conversions

    +When a method on a Java object is invoked, the arguments are converted to the formal parameter types of the Java method +using all allowed ECMAScript conversions. This can be surprising, as in general, conversions from string to number will +succeed according to Standard's section 9.3 "ToNumber" and so on; string to boolean, number to boolean, Object to +number, Object to string all work. Note that if the Java method's declared parameter type is {@code java.lang.Object}, +Nashorn objects are passed without any conversion whatsoever; specifically if the JavaScript value being passed is of +primitive string type, you can only rely on it being a {@code java.lang.CharSequence}, and if the value is a number, you +can only rely on it being a {@code java.lang.Number}. If the Java method declared parameter type is more specific (e.g. +{@code java.lang.String} or {@code java.lang.Double}), then Nashorn will of course ensure the required type is passed. +

    SAM types

    +As a special extension when invoking Java methods, ECMAScript function objects can be passed in place of an argument +whose Java type is so-called "single abstract method" or "SAM" type. While this name usually covers single-method +interfaces, Nashorn is a bit more versatile, and it recognizes a type as a SAM type if all its abstract methods are +overloads of the same name, and it is either an interface, or it is an abstract class with +a no-arg constructor. The type itself must be public, while the constructor and the methods can be either public or +protected. If there are multiple abstract overloads of the same name, the single function will serve as the shared +implementation for all of them, and additionally it will also override any non-abstract methods of the same name. +This is done to be consistent with the fact that ECMAScript does not have the concept of overloaded methods. +

    The {@code Java} object

    +Nashorn exposes a non-standard global object named {@code Java} that is the primary API entry point into Java +platform-specific functionality. You can use it to create instances of Java classes, convert from Java arrays to native +arrays and back, and so on. +

    Other non-standard built-in objects

    +In addition to {@code Java}, Nashorn also exposes some other non-standard built-in objects: +{@code JSAdapter}, {@code JavaImporter}, {@code Packages} */ module jdk.scripting.nashorn { requires java.logging; @@ -47,4 +111,3 @@ provides jdk.dynalink.linker.GuardingDynamicLinkerExporter with jdk.nashorn.api.linker.NashornLinkerExporter; } - diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/src/jdk.scripting.nashorn/share/classes/overview.html --- a/nashorn/src/jdk.scripting.nashorn/share/classes/overview.html Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ - - -

    -Nashorn is a runtime environment for programs written in ECMAScript 5.1. -

    -

    Usage

    -

    -The recommended way to use Nashorn is through the JSR-223 -"Scripting for the Java Platform" APIs found in the {@link javax.script} package. Usually, you'll obtain a -{@link javax.script.ScriptEngine} instance for Nashorn using: -

    -import javax.script.*;
    -...
    -ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("nashorn");
    -
    -and then use it just as you would any other JSR-223 script engine. See -{@code jdk.nashorn.api.scripting} package -for details. -

    -

    Compatibility

    -Nashorn is 100% compliant with the ECMA-262 Standard, Edition 5.1. It requires a Java Virtual Machine that implements the -JSR-292 "Supporting Dynamically Typed Languages on the Java -Platform" specification (often referred to as "invokedynamic"), as well as the already mentioned JSR-223. -

    Interoperability with the Java platform

    -

    -In addition to being a 100% ECMAScript 5.1 runtime, Nashorn provides features for interoperability of the ECMAScript -programs with the Java platform. In general, any Java object put into the script engine's context will be visible from -the script. In terms of the standard, such Java objects are not considered "native objects", but rather "host objects", -as defined in section 4.3.8. This distinction allows certain semantical differences in handling them compared to native -objects. For most purposes, Java objects behave just as native objects do: you can invoke their methods, get and set -their properties. In most cases, though, you can't add arbitrary properties to them, nor can you remove existing -properties. -

    -

    Java collection handling

    -

    -Native Java arrays and {@link java.util.List}s support indexed access to their elements through the property accessors, -and {@link java.util.Map}s support both property and element access through both dot and square-bracket property -accessors, with the difference being that dot operator gives precedence to object properties (its fields and properties -defined as {@code getXxx} and {@code setXxx} methods) while the square bracket operator gives precedence to map -elements. Native Java arrays expose the {@code length} property. -

    -

    ECMAScript primitive types

    -

    -ECMAScript primitive types for number, string, and boolean are represented with {@link java.lang.Number}, -{@link java.lang.CharSequence}, and {@link java.lang.Boolean} objects. While the most often used number type is -{@link java.lang.Double} and the most often used string type is {@link java.lang.String}, don't rely on it as various -internal optimizations cause other subclasses of {@code Number} and internal implementations of {@code CharSequence} to -be used. -

    -

    Type conversions

    -

    -When a method on a Java object is invoked, the arguments are converted to the formal parameter types of the Java method -using all allowed ECMAScript conversions. This can be surprising, as in general, conversions from string to number will -succeed according to Standard's section 9.3 "ToNumber" and so on; string to boolean, number to boolean, Object to -number, Object to string all work. Note that if the Java method's declared parameter type is {@code java.lang.Object}, -Nashorn objects are passed without any conversion whatsoever; specifically if the JavaScript value being passed is of -primitive string type, you can only rely on it being a {@code java.lang.CharSequence}, and if the value is a number, you -can only rely on it being a {@code java.lang.Number}. If the Java method declared parameter type is more specific (e.g. -{@code java.lang.String} or {@code java.lang.Double}), then Nashorn will of course ensure the required type is passed. -

    -

    SAM types

    -

    -As a special extension when invoking Java methods, ECMAScript function objects can be passed in place of an argument -whose Java type is so-called "single abstract method" or "SAM" type. While this name usually covers single-method -interfaces, Nashorn is a bit more versatile, and it recognizes a type as a SAM type if all its abstract methods are -overloads of the same name, and it is either an interface, or it is an abstract class with -a no-arg constructor. The type itself must be public, while the constructor and the methods can be either public or -protected. If there are multiple abstract overloads of the same name, the single function will serve as the shared -implementation for all of them, and additionally it will also override any non-abstract methods of the same name. -This is done to be consistent with the fact that ECMAScript does not have the concept of overloaded methods. -

    -

    The {@code Java} object

    -Nashorn exposes a non-standard global object named {@code Java} that is the primary API entry point into Java -platform-specific functionality. You can use it to create instances of Java classes, convert from Java arrays to native -arrays and back, and so on. The methods on the objects are directly implemented by public static methods on the class -{@code NativeJava}, see that class for details on what -functionality is available. -

    Representations of Java types

    -The method -{@code Java.type(typeName)} takes a name of a type, and returns an object representing a Java type. You can -use that object to both create new instances of Java classes, as well as to access static fields and methods on them. -The type object is distinct from the {@code java.lang.Class} object, which represents the reflective run-time type -identity and doesn't carry i.e. static members. Again, see the link for {@code NativeJava} above for details. -

    Other non-standard built-in objects

    -In addition to {@code Java}, Nashorn also exposes some other non-standard built-in objects: -{@code JSAdapter}, -{@code JavaImporter}, -{@code Packages}. - diff -r 05e2611ebff6 -r 65e2b10e8e80 nashorn/test/script/basic/JDK-8141209.js --- a/nashorn/test/script/basic/JDK-8141209.js Fri Jan 06 16:50:50 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * JDK-8141209 : $EXEC should allow streaming - * - * @test - * @option -scripting - * @runif os.not.windows - * @run - */ - - -var System = Java.type("java.lang.System"); -var File = Java.type("java.io.File"); -var ByteArrayInputStream = Java.type("java.io.ByteArrayInputStream"); -var ByteArrayOutputStream = Java.type("java.io.ByteArrayOutputStream"); - -var input = << ${tempFile()} -e '/^d/ d'` - -$EXEC(["ls", "-l", "|", "sed", "-e", "/^d/ d", ">", tempFile()]) - -var t1 = tempFile(); - -$EXEC(<<${t1} -sed <${t1} >${tempFile()} -e '/^d/ d' -EOD - -$EXEC(<<${tempFile()} -e '/^d/ d' -EOD - -var instream = new ByteArrayInputStream(input.getBytes()); -var outstream = new ByteArrayOutputStream(); -var errstream = new ByteArrayOutputStream(); -$EXEC("sed -e '/beard/ d'", instream, outstream, errstream); -var out = outstream.toString(); -var err = errstream.toString(); - -instream = new ByteArrayInputStream(input.getBytes()); -$EXEC("sed -e '/beard/ d'", instream, System.out, System.err); - - -$EXEC(<< ${tempFile()} -e '/^d/ d'` + +$EXEC(["ls", "-l", "|", "sed", "-e", "/^d/ d", ">", tempFile()]) + +var t1 = tempFile(); + +$EXEC(<<${t1} +sed <${t1} >${tempFile()} -e '/^d/ d' +EOD + +$EXEC(<<${tempFile()} -e '/^d/ d' +EOD + +var instream = new ByteArrayInputStream(input.getBytes()); +var outstream = new ByteArrayOutputStream(); +var errstream = new ByteArrayOutputStream(); +$EXEC("sed -e '/beard/ d'", instream, outstream, errstream); +var out = outstream.toString(); +var err = errstream.toString(); + +instream = new ByteArrayInputStream(input.getBytes()); +$EXEC("sed -e '/beard/ d'", instream, System.out, System.err); + + +$EXEC(<<