From c5a2c4af0ebd15283dd12ecc37c4f6447387728f Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Tue, 8 Nov 2016 16:30:36 +0100 Subject: [PATCH 001/121] 8169373: Work around linux NPTL stack guard error Also skip libc guard page for compiler thread, merge similar code on linux platforms, and streamline libc guard page handling on linuxs390, linuxppc, aixppc. Reviewed-by: dholmes, dcubed, kvn --- hotspot/src/os/aix/vm/os_aix.cpp | 28 ++++- hotspot/src/os/aix/vm/os_aix.hpp | 3 + hotspot/src/os/linux/vm/os_linux.cpp | 113 +++++++++++++++++- hotspot/src/os/posix/vm/os_posix.cpp | 2 + hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp | 10 +- hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp | 14 +-- .../src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp | 6 +- .../linux_aarch64/vm/os_linux_aarch64.cpp | 85 ------------- .../src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp | 89 +------------- .../os_cpu/linux_s390/vm/os_linux_s390.cpp | 94 +-------------- .../os_cpu/linux_sparc/vm/os_linux_sparc.cpp | 51 -------- .../src/os_cpu/linux_x86/vm/os_linux_x86.cpp | 85 ------------- .../os_cpu/linux_zero/vm/os_linux_zero.cpp | 10 +- 13 files changed, 165 insertions(+), 425 deletions(-) diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp index f2a3b69c79a..e900ce0af77 100644 --- a/hotspot/src/os/aix/vm/os_aix.cpp +++ b/hotspot/src/os/aix/vm/os_aix.cpp @@ -848,13 +848,13 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, 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 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, 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 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, 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 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, 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 @@ bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) { 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 --git a/hotspot/src/os/aix/vm/os_aix.hpp b/hotspot/src/os/aix/vm/os_aix.hpp index 83858048cbb..a226fa40cb9 100644 --- a/hotspot/src/os/aix/vm/os_aix.hpp +++ b/hotspot/src/os/aix/vm/os_aix.hpp @@ -140,6 +140,9 @@ class Aix { // 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 --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 3b6122ffc0d..0b363db39e9 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -716,11 +716,18 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, 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; @@ -2833,6 +2840,13 @@ bool os::Linux::libnuma_init() { 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 +6079,101 @@ bool os::start_debugging(char *buf, int buflen) { 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 --git a/hotspot/src/os/posix/vm/os_posix.cpp b/hotspot/src/os/posix/vm/os_posix.cpp index bf95c2af497..0667a4c8275 100644 --- a/hotspot/src/os/posix/vm/os_posix.cpp +++ b/hotspot/src/os/posix/vm/os_posix.cpp @@ -1096,6 +1096,8 @@ char* os::Posix::describe_pthread_attr(char* buf, size_t buflen, const pthread_a 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, diff --git a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp index 1e440ca8579..1f0d84a1a0d 100644 --- a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp +++ b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp @@ -535,13 +535,15 @@ void os::Aix::init_thread_fpu_state(void) { //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; +// These sizes exclude libc stack guard pages, but include +// the HotSpot guard pages. +size_t os::Posix::_compiler_thread_min_stack_allowed = 512 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 512 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * 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 --git a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp index d9d8da7395a..7087d4d0cf1 100644 --- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp +++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp @@ -870,14 +870,14 @@ size_t os::Posix::default_stack_size(os::ThreadType thr_type) { // // 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 +925,7 @@ static void current_stack_region(address * bottom, size_t * size) { 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 +936,12 @@ static void current_stack_region(address * bottom, size_t * size) { // 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 --git a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp index 9a6b38bc0fc..15a5b7d046b 100644 --- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp +++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp @@ -310,7 +310,7 @@ static void current_stack_region(address *bottom, size_t *size) { 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 @@ static void current_stack_region(address *bottom, size_t *size) { // 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 --git a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp index 21d185d5d70..df5e6511a99 100644 --- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp +++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp @@ -484,91 +484,6 @@ size_t os::Posix::default_stack_size(os::ThreadType thr_type) { 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 --git a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp index c0aeb994f41..f5ba9b6dced 100644 --- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp +++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp @@ -535,8 +535,10 @@ void os::Linux::set_fpu_control_word(int fpu_control) { //////////////////////////////////////////////////////////////////////////////// // thread stack -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 128 * K; +// These sizes exclude libc stack guard pages, but include +// the HotSpot guard pages. +size_t os::Posix::_compiler_thread_min_stack_allowed = 384 * K; +size_t os::Posix::_java_thread_min_stack_allowed = 384 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K; // return default stack size for thr_type @@ -546,89 +548,6 @@ size_t os::Posix::default_stack_size(os::ThreadType thr_type) { 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 --git a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp index 1ca241df9cd..792ba1584cf 100644 --- a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp +++ b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp @@ -473,103 +473,19 @@ void os::Linux::set_fpu_control_word(int fpu_control) { //////////////////////////////////////////////////////////////////////////////// // thread stack +// These sizes exclude libc stack guard pages, but include +// the HotSpot guard pages. 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::_java_thread_min_stack_allowed = 236 * K; size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * 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 --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp index a5d435cae75..309b4488089 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp @@ -156,51 +156,6 @@ address os::current_stack_pointer() { 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, @@ -737,12 +692,6 @@ size_t os::Posix::default_stack_size(os::ThreadType thr_type) { 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 --git a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp index 0bf4b8db7fc..de7a740db61 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp +++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp @@ -698,91 +698,6 @@ size_t os::Posix::default_stack_size(os::ThreadType thr_type) { 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 --git a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp index b5d7401282c..87c89690463 100644 --- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp +++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp @@ -320,12 +320,6 @@ size_t os::Posix::default_stack_size(os::ThreadType thr_type) { 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 @@ static void current_stack_region(address *bottom, size_t *size) { 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 @@ static void current_stack_region(address *bottom, size_t *size) { 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; From 7092ff6b91f3e825ad7744219f260df3ec75503b Mon Sep 17 00:00:00 2001 From: Volker Simonis Date: Thu, 1 Dec 2016 11:30:22 +0100 Subject: [PATCH 002/121] 8170548: VM may crash at startup because StdoutLog/StderrLog logging stream can be badly aligned Reviewed-by: stuefe, mlarsson, clanger, dholmes --- .../src/share/vm/logging/logFileStreamOutput.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/hotspot/src/share/vm/logging/logFileStreamOutput.cpp b/hotspot/src/share/vm/logging/logFileStreamOutput.cpp index 01ac7d10c29..70772e8fcdb 100644 --- a/hotspot/src/share/vm/logging/logFileStreamOutput.cpp +++ b/hotspot/src/share/vm/logging/logFileStreamOutput.cpp @@ -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) { From f6acd61df631054b01f9aba450bd3008193b3ef2 Mon Sep 17 00:00:00 2001 From: Severin Gehwolf Date: Wed, 7 Dec 2016 13:37:37 +0100 Subject: [PATCH 003/121] 8170767: Zero fastdebug build triggers assertion Add missing interpreter entries for java_lang_math_fmaD/F. Reviewed-by: coleenp --- .../src/share/vm/interpreter/cppInterpreterGenerator.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp index db808a9d477..4c8df9d8cdd 100644 --- a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp +++ b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp @@ -57,6 +57,8 @@ void CppInterpreterGenerator::generate_all() { 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 @@ address CppInterpreterGenerator::generate_method_entry( 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: From bfcbde3e50c381a1d8d9753bbe1fc1da52f747f5 Mon Sep 17 00:00:00 2001 From: Kirill Zhaldybin Date: Thu, 8 Dec 2016 15:56:57 +0300 Subject: [PATCH 004/121] 8170919: LogStreamTest tests crash if they are run first Reviewed-by: jwilhelm, mlarsson --- hotspot/test/native/logging/test_logStream.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot/test/native/logging/test_logStream.cpp b/hotspot/test/native/logging/test_logStream.cpp index b02839c7ff9..22b52efb5f1 100644 --- a/hotspot/test/native/logging/test_logStream.cpp +++ b/hotspot/test/native/logging/test_logStream.cpp @@ -41,41 +41,41 @@ void LogStreamTest::verify_stream(outputStream* stream) { 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); From 89e7c22fc4f61faf7163925e498211ef9b34af45 Mon Sep 17 00:00:00 2001 From: Derek White Date: Wed, 14 Dec 2016 16:46:50 -0500 Subject: [PATCH 005/121] 8171129: [aarch64] hs_err logs do not print register mappings Call print_location for contents of all registers. Reviewed-by: aph, dholmes --- hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp index 21d185d5d70..5d10f02423e 100644 --- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp +++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp @@ -606,8 +606,10 @@ void os::print_context(outputStream *st, const void *context) { 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(); From ca6eb09ef7eb73a5dda9895a7a26beba18914f23 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Sun, 18 Dec 2016 22:07:31 -0500 Subject: [PATCH 006/121] 8170307: Stack size option -Xss is ignored Reviewed-by: dcubed, sspitsyn --- hotspot/src/os/linux/vm/os_linux.cpp | 50 ++++++++++++++++++---------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 3b6122ffc0d..8d25f77c4f1 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -920,9 +920,21 @@ static bool find_vma(address addr, address* vma_low, address* vma_high) { // 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 +944,6 @@ void os::Linux::capture_initial_stack(size_t max_size) { // 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 +1103,29 @@ void os::Linux::capture_initial_stack(size_t max_size) { // 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)); + } } //////////////////////////////////////////////////////////////////////////////// From a70c1840757fd5652b5d7ff0c408052b6995b677 Mon Sep 17 00:00:00 2001 From: Serguei Spitsyn Date: Sun, 18 Dec 2016 19:21:18 -0800 Subject: [PATCH 007/121] 8139566: need proper sync for adding default read edges Use has_default_read_edges() in the ModuleEntry::can_read to fix race issue Reviewed-by: hseigel, lfoltan --- hotspot/src/share/vm/classfile/moduleEntry.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/hotspot/src/share/vm/classfile/moduleEntry.cpp b/hotspot/src/share/vm/classfile/moduleEntry.cpp index 2b8279fab64..9402f5d91e1 100644 --- a/hotspot/src/share/vm/classfile/moduleEntry.cpp +++ b/hotspot/src/share/vm/classfile/moduleEntry.cpp @@ -108,6 +108,18 @@ bool ModuleEntry::can_read(ModuleEntry* m) const { } 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 { From 4590c71999a02aeabb49d158f6db7ebeac577c47 Mon Sep 17 00:00:00 2001 From: Serguei Spitsyn Date: Sun, 18 Dec 2016 20:54:26 -0800 Subject: [PATCH 008/121] 8171417: post jigsaw review cleanup in the jtreg jvmti tests Fix the function throw_exc() in several jvmti tests to return void Reviewed-by: dsamersoff, hseigel --- .../libAddModuleExportsAndOpensTest.c | 10 +++++++--- .../jvmti/AddModuleReads/libAddModuleReadsTest.c | 10 +++++++--- .../libAddModuleUsesAndProvidesTest.c | 10 +++++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c index 351dfc4505c..e028ee50c9c 100644 --- a/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c +++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c @@ -82,14 +82,18 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { } 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; + } + 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); } - return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); } static diff --git a/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c index 8d339144847..4863a4aa5c9 100644 --- a/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c +++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c @@ -81,14 +81,18 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { } 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; + } + 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); } - return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); } static diff --git a/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c index 0d993f6d909..5ce1bf46d4f 100644 --- a/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c @@ -82,14 +82,18 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { } 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; + } + 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); } - return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); } static From 269508dcf5602bffc4d33cc6a31801fef514cbc2 Mon Sep 17 00:00:00 2001 From: Zoltan Majo Date: Mon, 19 Dec 2016 08:31:01 +0100 Subject: [PATCH 009/121] 8171155: Scanning method file for initialized final field updates can fail for non-existent fields Check if field exists before possibly marking it as having initialized final updates. Reviewed-by: stsmirno, vlivanov, coleenp --- hotspot/src/share/vm/interpreter/rewriter.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/hotspot/src/share/vm/interpreter/rewriter.cpp b/hotspot/src/share/vm/interpreter/rewriter.cpp index dfc110b8222..8158776e2c9 100644 --- a/hotspot/src/share/vm/interpreter/rewriter.cpp +++ b/hotspot/src/share/vm/interpreter/rewriter.cpp @@ -426,15 +426,16 @@ void Rewriter::scan_method(Method* method, bool reverse, bool* invokespecial_err 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); + } } } } From 0b61a28b2639e292f6270b2f9917b7931f56ba4f Mon Sep 17 00:00:00 2001 From: Kavitha Natarajan Date: Mon, 19 Dec 2016 02:33:30 -0800 Subject: [PATCH 010/121] 8169177: AArch64: SIGSEGV when "-XX:+ZeroTLAB" is specified along with GC options Reviewed-by: aph --- .../aarch64/vm/c1_MacroAssembler_aarch64.cpp | 161 +++++------------- .../aarch64/vm/c1_MacroAssembler_aarch64.hpp | 4 +- .../cpu/aarch64/vm/c1_Runtime1_aarch64.cpp | 8 +- .../cpu/aarch64/vm/macroAssembler_aarch64.cpp | 70 ++++++++ .../cpu/aarch64/vm/macroAssembler_aarch64.hpp | 1 + 5 files changed, 123 insertions(+), 121 deletions(-) diff --git a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp index 046be55e4e5..47fda46dd23 100644 --- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp @@ -195,95 +195,22 @@ void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register } } -// 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 @@ void C1_MacroAssembler::allocate_object(Register obj, Register t1, Register t2, 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 --git a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp index 24389643ca0..490e22507b6 100644 --- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp +++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp @@ -36,7 +36,6 @@ using MacroAssembler::null_check; // initialization void pd_init() { _rsp_offset = 0; } -void zero_memory(Register addr, Register len, Register t1); public: void try_allocate( @@ -75,7 +74,8 @@ void zero_memory(Register addr, Register len, Register t1); 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 --git a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp index f6339d7976c..58ba9c0b613 100644 --- a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp @@ -728,7 +728,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { __ 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 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { __ 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 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { __ 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 --git a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp index 76ffc9d701a..dc90886ab68 100644 --- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp @@ -3944,12 +3944,82 @@ Register MacroAssembler::tlab_refill(Label& retry, 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 --git a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp index 207292afa53..3418189f1b4 100644 --- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp +++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp @@ -857,6 +857,7 @@ public: 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, From af7e1eac20d0304b9e70ce2e75acaf4b8e6b42b0 Mon Sep 17 00:00:00 2001 From: Jamsheed Mohammed C M Date: Mon, 19 Dec 2016 06:25:12 -0800 Subject: [PATCH 011/121] 8170761: Buffer overrun in sharedRuntime_x86_64.cpp:477 Fixed missing half assert! Reviewed-by: kvn --- hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp | 8 ++++---- hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp | 6 +++--- hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp | 6 +++--- hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp | 12 ++++++------ hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp | 6 +++--- hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp | 8 ++++---- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp index c8bb3543642..01e0eeb1fc1 100644 --- a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp @@ -282,7 +282,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 --git a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp index 5044e80a0a9..784595f11be 100644 --- a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp @@ -594,7 +594,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, 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 --git a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp index e28d2ef7289..ea498e3399c 100644 --- a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp +++ b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp @@ -683,7 +683,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 --git a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp index 06ca12698c4..7b4dcf193d3 100644 --- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp @@ -425,7 +425,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, #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 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, 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 --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp index c69ef9a26e6..ed317550e08 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp @@ -478,12 +478,12 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, 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 --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 195c6814238..4587b8caba6 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -474,7 +474,7 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, 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 @@ int SharedRuntime::java_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 From bae7bbd3825d5b879d6a5cdd1859bfe8d953a542 Mon Sep 17 00:00:00 2001 From: Jiangli Zhou Date: Mon, 19 Dec 2016 13:54:33 -0500 Subject: [PATCH 012/121] 8168797: do not load any archived classes from a patched module Add new runtime shared class visibility check to ensure shared classes from patched module are not loaded at runtime. Reviewed-by: acorn, ccheung, hseigel, iklam, lfoltan --- .../src/share/vm/classfile/classLoader.cpp | 132 +----------------- .../src/share/vm/classfile/classLoader.hpp | 8 -- .../vm/classfile/sharedPathsMiscInfo.cpp | 23 --- .../vm/classfile/sharedPathsMiscInfo.hpp | 22 +-- .../share/vm/classfile/systemDictionary.cpp | 8 ++ hotspot/src/share/vm/memory/filemap.cpp | 18 --- hotspot/src/share/vm/memory/filemap.hpp | 1 - hotspot/src/share/vm/runtime/arguments.cpp | 25 ++-- .../modules/PatchModule/PatchModuleCDS.java | 4 +- 9 files changed, 31 insertions(+), 210 deletions(-) diff --git a/hotspot/src/share/vm/classfile/classLoader.cpp b/hotspot/src/share/vm/classfile/classLoader.cpp index 62ede6ef135..e0b7c84e45b 100644 --- a/hotspot/src/share/vm/classfile/classLoader.cpp +++ b/hotspot/src/share/vm/classfile/classLoader.cpp @@ -84,7 +84,6 @@ typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned ch 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 GetNextEntry_t GetNextEntry = NULL; 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 @@ int ClassLoader::_num_entries = 0; 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 @@ ClassPathZipEntry::~ClassPathZipEntry() { 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 @@ void ClassLoader::load_zip_library() { 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 @@ ClassFileStream* ClassLoader::search_module_entries(const GrowableArraylength(); - 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 @@ instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_onl // 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 @@ instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_onl // 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 @@ void ClassLoader::initialize() { } #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 --git a/hotspot/src/share/vm/classfile/classLoader.hpp b/hotspot/src/share/vm/classfile/classLoader.hpp index b7f494ce178..473e2eeb398 100644 --- a/hotspot/src/share/vm/classfile/classLoader.hpp +++ b/hotspot/src/share/vm/classfile/classLoader.hpp @@ -69,7 +69,6 @@ public: // 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 @@ class ClassPathDirEntry: public ClassPathEntry { 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 @@ class ClassPathZipEntry: public ClassPathEntry { 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 @@ public: 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 @@ class ClassLoader: AllStatic { // 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 @@ class ClassLoader: AllStatic { 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 --git a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp index 178444988b0..c9d2c644139 100644 --- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp +++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp @@ -86,9 +86,6 @@ void SharedPathsMiscInfo::print_path(int type, const char* path) { 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 @@ bool SharedPathsMiscInfo::check(jint type, const char* path) { } } 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 --git a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp index c680d3f7643..77de03b0a33 100644 --- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp +++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp @@ -104,28 +104,10 @@ public: 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 @@ public: enum { BOOT = 1, NON_EXIST = 2, - REQUIRED = 3, - PATCH_MOD = 4 + REQUIRED = 3 }; virtual const char* type_name(int type) { @@ -156,7 +137,6 @@ public: case BOOT: return "BOOT"; case NON_EXIST: return "NON_EXIST"; case REQUIRED: return "REQUIRED"; - case PATCH_MOD: return "PATCH_MOD"; default: ShouldNotReachHere(); return "?"; } } diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index 25d67831e36..e29fd131432 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -1231,6 +1231,8 @@ instanceKlassHandle SystemDictionary::load_shared_class( 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 @@ bool SystemDictionary::is_shared_class_visible(Symbol* class_name, } } + // 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 --git a/hotspot/src/share/vm/memory/filemap.cpp b/hotspot/src/share/vm/memory/filemap.cpp index 70f9f983210..fbc9f0dc245 100644 --- a/hotspot/src/share/vm/memory/filemap.cpp +++ b/hotspot/src/share/vm/memory/filemap.cpp @@ -179,7 +179,6 @@ void FileMapInfo::FileMapHeader::populate(FileMapInfo* mapinfo, size_t alignment _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 @@ bool FileMapInfo::FileMapHeader::validate() { 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 --git a/hotspot/src/share/vm/memory/filemap.hpp b/hotspot/src/share/vm/memory/filemap.hpp index 086533e3b8f..7424b813f86 100644 --- a/hotspot/src/share/vm/memory/filemap.hpp +++ b/hotspot/src/share/vm/memory/filemap.hpp @@ -155,7 +155,6 @@ public: // 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 --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index dd30ebce8e7..da3b2503f8c 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -1324,12 +1324,15 @@ void Arguments::check_unsupported_dumping_properties() { "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", // cannot use 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. @@ -1420,10 +1423,8 @@ void Arguments::set_mode_flags(Mode mode) { } } -#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(), @@ -1433,7 +1434,6 @@ static void no_shared_spaces(const char* message) { FLAG_SET_DEFAULT(UseSharedSpaces, false); } } -#endif // Returns threshold scaled with the value of scale. // If scale < 0.0, threshold is returned without scaling. @@ -2682,6 +2682,12 @@ jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args, 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; } @@ -4410,7 +4416,6 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) { } jint Arguments::apply_ergo() { - // Set flags based on ergonomics. set_ergonomics_flags(); diff --git a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java index 82d5c385846..cd9a66e49ab 100644 --- a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java +++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java @@ -52,7 +52,7 @@ public class PatchModuleCDS { 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 @@ public class PatchModuleCDS { "-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"); From 6869835c722ff6cbdb06bbf62bdfdc7c46081026 Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Mon, 19 Dec 2016 13:09:25 -0800 Subject: [PATCH 013/121] 8171092: C1's Math.fma() intrinsic doesn't correctly process its inputs Fixed 3rd input of FMA intrinsic processing in C1. Reviewed-by: kvn --- hotspot/src/share/vm/c1/c1_LIR.cpp | 15 +- .../TestFMABrokenC1RegAlloc.java | 167 ++++++++++++++++++ 2 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java diff --git a/hotspot/src/share/vm/c1/c1_LIR.cpp b/hotspot/src/share/vm/c1/c1_LIR.cpp index a8bbf933102..05f39476849 100644 --- a/hotspot/src/share/vm/c1/c1_LIR.cpp +++ b/hotspot/src/share/vm/c1/c1_LIR.cpp @@ -677,9 +677,7 @@ void LIR_OpVisitState::visit(LIR_Op* op) { // 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 @@ void LIR_OpVisitState::visit(LIR_Op* op) { 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 --git a/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java b/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java new file mode 100644 index 00000000000..4bb62bc0681 --- /dev/null +++ b/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java @@ -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"); + } + } + } +} From 7d3c1a63831a95e082610278d175d6b4f4e4980c Mon Sep 17 00:00:00 2001 From: Igor Veresov Date: Mon, 19 Dec 2016 13:34:21 -0800 Subject: [PATCH 014/121] 8171394: [AOT] failed AOT compilation in compiler/aot/RecompilationTest.java Fix argument types of tiered callbacks Reviewed-by: never, kvn --- .../src/org/graalvm/compiler/hotspot/HotSpotBackend.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java b/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java index cd217848f02..1e72687e1b3 100644 --- a/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java +++ b/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java @@ -53,6 +53,7 @@ import org.graalvm.compiler.hotspot.stubs.ExceptionHandlerStub; 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 @@ public abstract class HotSpotBackend extends Backend implements FrameMap.Referen /** * 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 From 927d6255d35518891347f7e95a9b571e4a2e5c9a Mon Sep 17 00:00:00 2001 From: Gustavo Romero Date: Mon, 19 Dec 2016 18:21:59 -0800 Subject: [PATCH 015/121] 8171236: RTM/HTM jtreg tests regression after transition to the new GNU-style options Reviewed-by: kvn --- hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java b/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java index 494f12126a4..40369000036 100644 --- a/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java +++ b/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java @@ -241,7 +241,7 @@ public class RTMTestBase { 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()) { From d652c70de6425a67907e00e75521588ec4a2e940 Mon Sep 17 00:00:00 2001 From: Boris Molodenkov Date: Tue, 13 Dec 2016 17:45:13 +0300 Subject: [PATCH 016/121] 8170464: Remove shell script from compiler/c2/cr7005594/Test7005594.java Reviewed-by: kvn --- .../c2/{cr7005594 => }/Test7005594.java | 47 ++++---- .../test/compiler/c2/cr7005594/Test7005594.sh | 111 ------------------ 2 files changed, 20 insertions(+), 138 deletions(-) rename hotspot/test/compiler/c2/{cr7005594 => }/Test7005594.java (58%) delete mode 100644 hotspot/test/compiler/c2/cr7005594/Test7005594.sh diff --git a/hotspot/test/compiler/c2/cr7005594/Test7005594.java b/hotspot/test/compiler/c2/Test7005594.java similarity index 58% rename from hotspot/test/compiler/c2/cr7005594/Test7005594.java rename to hotspot/test/compiler/c2/Test7005594.java index d7e6a892d50..1b2d6d73caf 100644 --- a/hotspot/test/compiler/c2/cr7005594/Test7005594.java +++ b/hotspot/test/compiler/c2/Test7005594.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -26,35 +26,28 @@ * @bug 7005594 * @summary Array overflow not handled correctly with loop optimzations * - * @run shell Test7005594.sh + * @run main/othervm -Xcomp + -XX:CompileOnly=compiler.c2.Test7005594::test + compiler.c2.Test7005594 */ -package compiler.c2.cr7005594; +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; + } - 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); - } - + 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 --git a/hotspot/test/compiler/c2/cr7005594/Test7005594.sh b/hotspot/test/compiler/c2/cr7005594/Test7005594.sh deleted file mode 100644 index 503d0aa40b0..00000000000 --- a/hotspot/test/compiler/c2/cr7005594/Test7005594.sh +++ /dev/null @@ -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 From 053cdb4fa5a5f4a7155d05fed4465d01ff56572d Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Wed, 14 Dec 2016 16:32:07 +0100 Subject: [PATCH 017/121] 8170741: Enable uploading of built artifacts through Jib Reviewed-by: ihse --- langtools/test/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langtools/test/Makefile b/langtools/test/Makefile index 5a0a70074d5..0c7549629c3 100644 --- a/langtools/test/Makefile +++ b/langtools/test/Makefile @@ -244,7 +244,7 @@ EXIT = exit 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); \ From c44e8605764650c68e7c0fdfe565a85d5aad58c3 Mon Sep 17 00:00:00 2001 From: Martin Doerr Date: Thu, 15 Dec 2016 14:24:04 +0100 Subject: [PATCH 018/121] 8171244: PPC64: Make interpreter's math entries consistent with C1 and C2 and support FMA Reviewed-by: kvn, goetz --- .../cpu/ppc/vm/abstractInterpreter_ppc.cpp | 26 ++-- hotspot/src/cpu/ppc/vm/assembler_ppc.hpp | 39 ++++-- .../src/cpu/ppc/vm/assembler_ppc.inline.hpp | 20 ++++ .../src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp | 50 +++++--- .../src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp | 21 +++- hotspot/src/cpu/ppc/vm/ppc.ad | 111 ++++++++++++++++++ .../vm/templateInterpreterGenerator_ppc.cpp | 78 ++++++++++-- hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp | 5 +- .../vm/interpreter/abstractInterpreter.hpp | 4 - 9 files changed, 301 insertions(+), 53 deletions(-) diff --git a/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp b/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp index 933a2f44db3..9aa1370a362 100644 --- a/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp @@ -51,19 +51,25 @@ int AbstractInterpreter::BasicType_as_index(BasicType type) { 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 --git a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp index a0530449a71..09217a42bb5 100644 --- a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp +++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp @@ -460,16 +460,15 @@ class Assembler : public AbstractAssembler { 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 @@ class Assembler : public AbstractAssembler { 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 --git a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp index 45f4ec57e3e..7f42d6b6050 100644 --- a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp +++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp @@ -700,6 +700,26 @@ inline void Assembler::fdiv_( FloatRegister d, FloatRegister a, FloatRegister b) 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 --git a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp index bba0c6d5254..127403fde2f 100644 --- a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp @@ -292,28 +292,28 @@ void LIR_Assembler::klass2reg_with_patching(Register reg, CodeEmitInfo *info) { } -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 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) { } __ 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 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) { } } else if (divisor == -1) { - if (op->code() == lir_idiv) { + if (code == lir_idiv) { __ neg(Rresult, Rdividend); } else { __ li(Rresult, 0); @@ -360,7 +360,7 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) { } 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 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) { __ 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) { } +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 --git a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp index 2cb7fe73e79..86eacda77f1 100644 --- a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp @@ -1435,7 +1435,26 @@ void LIRGenerator::do_update_CRC32(Intrinsic* x) { } 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 --git a/hotspot/src/cpu/ppc/vm/ppc.ad b/hotspot/src/cpu/ppc/vm/ppc.ad index a8c42b7ac21..6c3d9cf1fda 100644 --- a/hotspot/src/cpu/ppc/vm/ppc.ad +++ b/hotspot/src/cpu/ppc/vm/ppc.ad @@ -9569,6 +9569,117 @@ instruct roundFloat_nop(regF dst) %{ 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 --git a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp index cadde26b5be..56810938a53 100644 --- a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp @@ -1134,14 +1134,57 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call, Regist // 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 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M #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 --git a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp index 190d83d09ff..6c6b83d257f 100644 --- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp @@ -230,9 +230,8 @@ void VM_Version::initialize() { 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 --git a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp index fc763d750d2..9b815a70594 100644 --- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp @@ -299,10 +299,6 @@ class AbstractInterpreter: AllStatic { } 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); }; //------------------------------------------------------------------------------------------------------------------------ From eeb6e2f01fdfade771d2b0141c0a8098081ce947 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Sun, 18 Dec 2016 10:57:49 +0100 Subject: [PATCH 019/121] 8171225: [aix] Fix gtests compile error on AIX 7.1 with xlC 12 Help xlC understand gtest asserts Reviewed-by: erikj, dholmes, simonis --- hotspot/test/native/utilities/test_linkedlist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/native/utilities/test_linkedlist.cpp b/hotspot/test/native/utilities/test_linkedlist.cpp index 34aa774ebdc..471c4421f93 100644 --- a/hotspot/test/native/utilities/test_linkedlist.cpp +++ b/hotspot/test/native/utilities/test_linkedlist.cpp @@ -74,7 +74,7 @@ TEST(LinkedList, simple) { 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"; From 99ba5922e431bb7ba23e1a59464514cb358a8935 Mon Sep 17 00:00:00 2001 From: Ed Nevill Date: Sun, 18 Dec 2016 17:26:44 -0500 Subject: [PATCH 020/121] 8171410: aarch64: long multiplyExact shifts by 31 instead of 63 Reviewed-by: aph --- hotspot/src/cpu/aarch64/vm/aarch64.ad | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hotspot/src/cpu/aarch64/vm/aarch64.ad b/hotspot/src/cpu/aarch64/vm/aarch64.ad index 24bce03d1a4..2294bab8db8 100644 --- a/hotspot/src/cpu/aarch64/vm/aarch64.ad +++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad @@ -14086,7 +14086,7 @@ instruct overflowMulL_reg(rFlagsReg cr, iRegL op1, iRegL op2) 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 @@ instruct overflowMulL_reg(rFlagsReg cr, iRegL op1, iRegL op2) 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 @@ instruct overflowMulL_reg_branch(cmpOp cmp, iRegL op1, iRegL op2, label labl, rF 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 @@ instruct overflowMulL_reg_branch(cmpOp cmp, iRegL op1, iRegL op2, label labl, rF 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); %} From 9a80c66078911935e7ef3f32ca617d20219cbd32 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 19 Dec 2016 16:26:22 +0100 Subject: [PATCH 021/121] 8171310: Gtest libjvm.so is always stripped Reviewed-by: tbell, dholmes, stuefe --- hotspot/make/lib/CompileDtracePostJvm.gmk | 2 -- hotspot/make/lib/CompileGtest.gmk | 1 + hotspot/make/lib/Lib-jdk.hotspot.agent.gmk | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/hotspot/make/lib/CompileDtracePostJvm.gmk b/hotspot/make/lib/CompileDtracePostJvm.gmk index 6b98014e18c..77a4e30f4d9 100644 --- a/hotspot/make/lib/CompileDtracePostJvm.gmk +++ b/hotspot/make/lib/CompileDtracePostJvm.gmk @@ -188,7 +188,6 @@ ifeq ($(call check-jvm-feature, dtrace), true) 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 @@ ifeq ($(call check-jvm-feature, dtrace), true) 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 --git a/hotspot/make/lib/CompileGtest.gmk b/hotspot/make/lib/CompileGtest.gmk index a4c2c0cb34f..e98d6541b98 100644 --- a/hotspot/make/lib/CompileGtest.gmk +++ b/hotspot/make/lib/CompileGtest.gmk @@ -86,6 +86,7 @@ $(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \ 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 --git a/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk b/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk index 8942652cce7..f6b4a22d44a 100644 --- a/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk +++ b/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk @@ -113,7 +113,6 @@ $(eval $(call SetupNativeCompilation, BUILD_LIBSA, \ LIBS := $(SA_LIBS), \ MAPFILE := $(SA_MAPFILE), \ OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libsa, \ - STRIP_SYMBOLS := true, \ )) TARGETS += $(BUILD_LIBSA) From ab77975179b1ac220f992cb16f9c382e23c06d18 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 19 Dec 2016 16:26:36 +0100 Subject: [PATCH 022/121] 8171310: Gtest libjvm.so is always stripped Reviewed-by: tbell, dholmes, stuefe --- make/common/NativeCompilation.gmk | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/make/common/NativeCompilation.gmk b/make/common/NativeCompilation.gmk index 3a9cf477e23..2d5a39a4589 100644 --- a/make/common/NativeCompilation.gmk +++ b/make/common/NativeCompilation.gmk @@ -371,7 +371,8 @@ endef # 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 @@ define SetupNativeCompilationBody 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 From 12aa0a8788a7351cbce172f878aaad4214f94dd3 Mon Sep 17 00:00:00 2001 From: Goetz Lindenmaier Date: Mon, 19 Dec 2016 15:48:57 -0800 Subject: [PATCH 023/121] 8170655: [posix] Fix minimum stack size computations Reviewed-by: dcubed, coleenp --- hotspot/src/cpu/ppc/vm/globals_ppc.hpp | 3 ++ hotspot/src/cpu/x86/vm/globals_x86.hpp | 9 ++-- hotspot/src/os/posix/vm/os_posix.cpp | 44 +++++++------------ hotspot/src/os/posix/vm/os_posix.hpp | 6 ++- hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp | 10 ++--- hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp | 13 +++--- .../linux_aarch64/vm/os_linux_aarch64.cpp | 6 ++- .../src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp | 14 +++--- .../os_cpu/linux_s390/vm/os_linux_s390.cpp | 10 ++--- .../os_cpu/linux_sparc/vm/os_linux_sparc.cpp | 6 ++- .../src/os_cpu/linux_x86/vm/os_linux_x86.cpp | 12 ++--- .../solaris_sparc/vm/os_solaris_sparc.cpp | 10 ++--- .../os_cpu/solaris_x86/vm/os_solaris_x86.cpp | 20 +++++---- hotspot/src/share/vm/runtime/os.hpp | 2 +- 14 files changed, 85 insertions(+), 80 deletions(-) diff --git a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp index 953a4d2134f..3dcf77aab76 100644 --- a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp +++ b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp @@ -42,6 +42,9 @@ define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs pas #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 --git a/hotspot/src/cpu/x86/vm/globals_x86.hpp b/hotspot/src/cpu/x86/vm/globals_x86.hpp index 9081d0ce6b5..5673abb4448 100644 --- a/hotspot/src/cpu/x86/vm/globals_x86.hpp +++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp @@ -63,9 +63,10 @@ define_pd_global(intx, InlineSmallCode, 1000); #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 @@ define_pd_global(intx, InlineSmallCode, 1000); #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 --git a/hotspot/src/os/posix/vm/os_posix.cpp b/hotspot/src/os/posix/vm/os_posix.cpp index 0667a4c8275..5885906f670 100644 --- a/hotspot/src/os/posix/vm/os_posix.cpp +++ b/hotspot/src/os/posix/vm/os_posix.cpp @@ -1107,14 +1107,18 @@ char* os::Posix::describe_pthread_attr(char* buf, size_t buflen, const pthread_a // 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()); @@ -1130,28 +1134,14 @@ jint os::Posix::set_minimum_stack_sizes() { 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 --git a/hotspot/src/os/posix/vm/os_posix.hpp b/hotspot/src/os/posix/vm/os_posix.hpp index 8120bde9e02..ccd42fd94ac 100644 --- a/hotspot/src/os/posix/vm/os_posix.hpp +++ b/hotspot/src/os/posix/vm/os_posix.hpp @@ -43,7 +43,11 @@ protected: 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 --git a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp index 1f0d84a1a0d..9bbb9387c54 100644 --- a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp +++ b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp @@ -535,11 +535,11 @@ void os::Aix::init_thread_fpu_state(void) { //////////////////////////////////////////////////////////////////////////////// // thread stack -// These sizes exclude libc stack guard pages, but include -// the HotSpot guard pages. -size_t os::Posix::_compiler_thread_min_stack_allowed = 512 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 512 * 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. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { diff --git a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp index 7087d4d0cf1..b4b27f51802 100644 --- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp +++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp @@ -839,19 +839,20 @@ bool os::is_allocatable(size_t bytes) { //////////////////////////////////////////////////////////////////////////////// // 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 diff --git a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp index df5e6511a99..6dc21b4da74 100644 --- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp +++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp @@ -473,8 +473,10 @@ bool os::is_allocatable(size_t bytes) { //////////////////////////////////////////////////////////////////////////////// // 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 diff --git a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp index f5ba9b6dced..6be73f78e08 100644 --- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp +++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp @@ -535,15 +535,15 @@ void os::Linux::set_fpu_control_word(int fpu_control) { //////////////////////////////////////////////////////////////////////////////// // thread stack -// These sizes exclude libc stack guard pages, but include -// the HotSpot guard pages. -size_t os::Posix::_compiler_thread_min_stack_allowed = 384 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 384 * 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; } diff --git a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp index 792ba1584cf..684853cfd34 100644 --- a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp +++ b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp @@ -473,11 +473,11 @@ void os::Linux::set_fpu_control_word(int fpu_control) { //////////////////////////////////////////////////////////////////////////////// // thread stack -// These sizes exclude libc stack guard pages, but include -// the HotSpot guard pages. -size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 236 * 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. size_t os::Posix::default_stack_size(os::ThreadType thr_type) { diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp index 309b4488089..f9a20d58ce2 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp @@ -681,8 +681,10 @@ bool os::is_allocatable(size_t bytes) { /////////////////////////////////////////////////////////////////////////////// // 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 diff --git a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp index de7a740db61..a76f8d659f6 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp +++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp @@ -677,15 +677,15 @@ bool os::is_allocatable(size_t bytes) { //////////////////////////////////////////////////////////////////////////////// // 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) { diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp index 864080d2073..c8c938edffe 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp @@ -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 --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp index 530f7033df9..f5c0ff370a0 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp @@ -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. -#ifdef AMD64 -size_t os::Posix::_compiler_thread_min_stack_allowed = 394 * K; -size_t os::Posix::_java_thread_min_stack_allowed = 224 * K; +// 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 #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 --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp index 12c2891d3db..ac5919a255d 100644 --- a/hotspot/src/share/vm/runtime/os.hpp +++ b/hotspot/src/share/vm/runtime/os.hpp @@ -436,7 +436,7 @@ class os: AllStatic { 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 From a9b90b0b4b69a4386b78e6017a811b6f1f00448d Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Tue, 20 Dec 2016 09:25:03 +0100 Subject: [PATCH 024/121] 8171408: [aix] TOC overflow when linking the gtest libjvm.so Reviewed-by: dholmes, simonis, erikj --- hotspot/make/lib/CompileGtest.gmk | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hotspot/make/lib/CompileGtest.gmk b/hotspot/make/lib/CompileGtest.gmk index e98d6541b98..29209432f41 100644 --- a/hotspot/make/lib/CompileGtest.gmk +++ b/hotspot/make/lib/CompileGtest.gmk @@ -54,6 +54,13 @@ endif # 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 @@ $(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \ 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,6 +88,7 @@ $(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \ 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), \ From 6feb27b225a8c60bf13268bf6df563ed29ec6e28 Mon Sep 17 00:00:00 2001 From: Jini George Date: Tue, 20 Dec 2016 13:33:57 +0300 Subject: [PATCH 025/121] 8159127: hprof heap dumps broken for lambda classdata Added class dump records for lambda related anonymous classes in the heap dump Reviewed-by: dsamersoff, sspitsyn --- test/lib/jdk/test/lib/hprof/parser/HprofReader.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/lib/jdk/test/lib/hprof/parser/HprofReader.java b/test/lib/jdk/test/lib/hprof/parser/HprofReader.java index 693bec6b9b7..cdc505d00b2 100644 --- a/test/lib/jdk/test/lib/hprof/parser/HprofReader.java +++ b/test/lib/jdk/test/lib/hprof/parser/HprofReader.java @@ -151,6 +151,10 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes private Snapshot snapshot; + public static boolean verifyMagicNumber(int numberRead) { + return (numberRead == MAGIC_NUMBER); + } + public HprofReader(String fileName, PositionDataInputStream in, int dumpNumber, boolean callStack, int debugLevel) throws IOException { @@ -737,6 +741,12 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes long id = readID(); StackTrace stackTrace = getStackTraceFromSerial(in.readInt()); long classID = readID(); + JavaClass searchedClass = snapshot.findClass( + "0x" + Long.toHexString(classID)); + if (searchedClass == null) { + throw new IOException( + "Class Record for 0x" + Long.toHexString(classID) + " not found"); + } int bytesFollowing = in.readInt(); int bytesRead = (2 * identifierSize) + 8 + bytesFollowing; JavaObject jobj = new JavaObject(classID, start); From 5f477c032d097d268ef7e8cb0b80d360298dab4a Mon Sep 17 00:00:00 2001 From: Jini George Date: Tue, 20 Dec 2016 13:35:40 +0300 Subject: [PATCH 026/121] 8159127: hprof heap dumps broken for lambda classdata Added class dump records for lambda related anonymous classes in the heap dump Reviewed-by: dsamersoff, sspitsyn --- .../hotspot/classfile/ClassLoaderData.java | 18 ++- .../classfile/ClassLoaderDataGraph.java | 72 +++++++++ .../classes/sun/jvm/hotspot/oops/Klass.java | 3 + .../classes/sun/jvm/hotspot/runtime/VM.java | 9 ++ .../hotspot/utilities/HeapHprofBinWriter.java | 47 ++++-- hotspot/src/share/vm/runtime/vmStructs.cpp | 5 +- .../sa/TestHeapDumpForInvokeDynamic.java | 141 ++++++++++++++++++ 7 files changed, 280 insertions(+), 15 deletions(-) create mode 100644 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java create mode 100644 hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java index 4d34f9912df..947701c9c3b 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java @@ -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 @@ public class ClassLoaderData extends VMObject { 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 class ClassLoaderData extends VMObject { 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 --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java new file mode 100644 index 00000000000..fbc9a76401d --- /dev/null +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java @@ -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 --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java index b5d93a852a7..afa00274f1d 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java @@ -61,6 +61,7 @@ public class Klass extends Metadata implements ClassConstants { } 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 @@ public class Klass extends Metadata implements ClassConstants { 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 class Klass extends Metadata implements ClassConstants { 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 --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java index 22bdcf99638..bd4934560a6 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java @@ -38,6 +38,7 @@ import sun.jvm.hotspot.oops.*; 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 @@ public class VM { 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 @@ public class VM { return dict; } + public ClassLoaderDataGraph getClassLoaderDataGraph() { + if (cldGraph == null) { + cldGraph = new ClassLoaderDataGraph(); + } + return cldGraph; + } + public Threads getThreads() { if (threads == null) { threads = new Threads(); diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java index 319aecdaa31..9da43745388 100644 --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java @@ -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.debugger.*; 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 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter { 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 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter { 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 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter { } } }); + // 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 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter { 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 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter { 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 --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index c9ac7e9755f..46824eb7553 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -288,7 +288,8 @@ typedef CompactHashtable SymbolCompactHashTable; 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 @@ typedef CompactHashtable SymbolCompactHashTable; \ 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 --git a/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java b/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java new file mode 100644 index 00000000000..a2d83a10099 --- /dev/null +++ b/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java @@ -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); + } + } +} From c5e65622d880b5fdb9f4dbfe3a9e6b81b524fd84 Mon Sep 17 00:00:00 2001 From: Dmitry Samersoff Date: Tue, 20 Dec 2016 14:15:02 +0300 Subject: [PATCH 027/121] 8150563: LoadAgentDcmdTest.java can't find libinstrument.so Test changed to reflect changes for 8066474 Remove the lib/$ARCH directory from Linux and Solaris images Reviewed-by: sspitsyn --- hotspot/test/ProblemList.txt | 1 - .../test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/hotspot/test/ProblemList.txt b/hotspot/test/ProblemList.txt index 6088cb3c648..907597bd228 100644 --- a/hotspot/test/ProblemList.txt +++ b/hotspot/test/ProblemList.txt @@ -71,7 +71,6 @@ runtime/SharedArchiveFile/DefaultUseWithClient.java 8154204 generic-all # :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 --git a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java index 089e8df4b11..373edf07857 100644 --- a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java +++ b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java @@ -136,11 +136,7 @@ public class LoadAgentDcmdTest { if (Platform.isWindows()) { return "bin"; } - if (Platform.isOSX()) { - return "lib"; - } - - return "lib/" + Platform.getOsArch(); + return "lib"; } /** From c105d10fb02cf1fa6e230feda70721944ba6f26d Mon Sep 17 00:00:00 2001 From: Dmitry Samersoff Date: Tue, 20 Dec 2016 15:40:01 +0300 Subject: [PATCH 028/121] 8165496: assert(_exception_caught == false) failed: _exception_caught is out of phase Two separate flags, exception_detected and exception_caught, replaced with one. Reviewed-by: sspitsyn, coleenp, dholmes --- hotspot/src/share/vm/opto/runtime.cpp | 6 -- hotspot/src/share/vm/prims/jvmtiExport.cpp | 22 ++----- .../src/share/vm/prims/jvmtiThreadState.cpp | 7 +-- .../src/share/vm/prims/jvmtiThreadState.hpp | 34 +++++++---- .../ExceptionCaughtOutOfPhaseTest.java | 61 ------------------- 5 files changed, 31 insertions(+), 99 deletions(-) delete mode 100644 hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index 51f07849740..47e98217460 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -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 @@ address OptoRuntime::rethrow_C(oopDesc* exception, JavaThread* thread, address r } #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 --git a/hotspot/src/share/vm/prims/jvmtiExport.cpp b/hotspot/src/share/vm/prims/jvmtiExport.cpp index 1f56b2298af..52350da0cde 100644 --- a/hotspot/src/share/vm/prims/jvmtiExport.cpp +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp @@ -130,15 +130,15 @@ class JvmtiEventMark : public StackObj { 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 @@ public: // 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 @@ public: // 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_single_step(JavaThread *thread, Method* method, address l } } - void JvmtiExport::post_exception_throw(JavaThread *thread, Method* method, address location, oop exception) { HandleMark hm(thread); methodHandle mh(thread, method); @@ -2454,7 +2444,7 @@ void JvmtiExport::clear_detected_exception(JavaThread* thread) { JvmtiThreadState* state = thread->jvmti_thread_state(); if (state != NULL) { - state->clear_exception_detected(); + state->clear_exception_state(); } } diff --git a/hotspot/src/share/vm/prims/jvmtiThreadState.cpp b/hotspot/src/share/vm/prims/jvmtiThreadState.cpp index 1e3a6e8c03e..099f705bde1 100644 --- a/hotspot/src/share/vm/prims/jvmtiThreadState.cpp +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.cpp @@ -50,8 +50,7 @@ JvmtiThreadState::JvmtiThreadState(JavaThread* thread) : _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 @@ void JvmtiThreadState::process_pending_step_for_popframe() { // 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 @@ void JvmtiThreadState::process_pending_step_for_earlyret() { // 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 --git a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp index b72d4952afc..06a091bce9e 100644 --- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp @@ -76,13 +76,21 @@ class JvmtiThreadState : public CHeapObj { 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 @@ class JvmtiThreadState : public CHeapObj { 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 --git a/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java b/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java deleted file mode 100644 index 2c823d3819b..00000000000 --- a/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java +++ /dev/null @@ -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(); - } - } -} From 27139d7529a06ce43dfdaec6acac2f1b9f3b196d Mon Sep 17 00:00:00 2001 From: Martin Doerr Date: Tue, 20 Dec 2016 14:55:18 +0100 Subject: [PATCH 029/121] 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA Reviewed-by: lucy, goetz --- hotspot/src/cpu/s390/vm/assembler_s390.hpp | 24 +++ .../src/cpu/s390/vm/assembler_s390.inline.hpp | 17 ++ .../src/cpu/s390/vm/c1_LIRAssembler_s390.cpp | 16 ++ .../src/cpu/s390/vm/c1_LIRGenerator_s390.cpp | 23 ++- hotspot/src/cpu/s390/vm/s390.ad | 165 ++++++++++++++++++ .../src/cpu/s390/vm/stubGenerator_s390.cpp | 8 +- .../vm/templateInterpreterGenerator_s390.cpp | 96 ++++++++-- hotspot/src/cpu/s390/vm/vm_version_s390.cpp | 5 +- 8 files changed, 328 insertions(+), 26 deletions(-) diff --git a/hotspot/src/cpu/s390/vm/assembler_s390.hpp b/hotspot/src/cpu/s390/vm/assembler_s390.hpp index dee38875e50..0873d71b00e 100644 --- a/hotspot/src/cpu/s390/vm/assembler_s390.hpp +++ b/hotspot/src/cpu/s390/vm/assembler_s390.hpp @@ -790,6 +790,16 @@ class Assembler : public AbstractAssembler { #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 @@ class Assembler : public AbstractAssembler { 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 --git a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp index 42038c8f95e..18e1ad73cee 100644 --- a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp +++ b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp @@ -777,6 +777,23 @@ inline void Assembler::z_meeb( FloatRegister r1, const Address& a) inline void Assembler::z_mdb( FloatRegister r1, const Address& a) { z_mdb( r1, a.disp(), a.indexOrR0(), a.baseOrR0()); } +//--------------- +// 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 //--------------- diff --git a/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp b/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp index 4299728eacc..524a91fe07f 100644 --- a/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp +++ b/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp @@ -324,6 +324,22 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) { 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 --git a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp index d0d01107e58..98489aa7371 100644 --- a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp +++ b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp @@ -1237,7 +1237,28 @@ void LIRGenerator::do_update_CRC32C(Intrinsic* x) { } 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 --git a/hotspot/src/cpu/s390/vm/s390.ad b/hotspot/src/cpu/s390/vm/s390.ad index f242833ca46..8ab6a5026d3 100644 --- a/hotspot/src/cpu/s390/vm/s390.ad +++ b/hotspot/src/cpu/s390/vm/s390.ad @@ -7249,6 +7249,171 @@ instruct mulD_reg_mem(regD dst, memoryRX src)%{ 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 --git a/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp b/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp index c2584c5cf98..8b872c5c922 100644 --- a/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp +++ b/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp @@ -2038,15 +2038,15 @@ class StubGenerator: public StubCodeGenerator { 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); + __ z_llgfr(srclen, msglen); // We pass the offsets as ints, not as longs as required. - __ kmc(dst, src); // Decipher the message. + __ 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 --git a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp index 74dd0915edc..de266db04fc 100644 --- a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp +++ b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp @@ -1297,36 +1297,96 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { // 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. + // 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; - // Only support absolute value and square root. - if (kind != Interpreter::java_lang_math_abs && kind != Interpreter::java_lang_math_sqrt) { - return NULL; + // 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. } - BLOCK_COMMENT("math_entry {"); + 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(); + } - address math_entry = __ pc(); + // Use normal entry if neither instruction nor runtime call is used. + if (!use_instruction && runtime_entry == NULL) return NULL; - if (kind == Interpreter::java_lang_math_abs) { - // Load operand from stack. - __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); - __ z_lpdbr(Z_FRET); + 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 --git a/hotspot/src/cpu/s390/vm/vm_version_s390.cpp b/hotspot/src/cpu/s390/vm/vm_version_s390.cpp index 7c40162534a..55dbd30aec8 100644 --- a/hotspot/src/cpu/s390/vm/vm_version_s390.cpp +++ b/hotspot/src/cpu/s390/vm/vm_version_s390.cpp @@ -155,9 +155,8 @@ void VM_Version::initialize() { 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. From 973b6f24d075a6171344809b7f2c3615bf2401e0 Mon Sep 17 00:00:00 2001 From: Dmitrij Pochepko Date: Tue, 20 Dec 2016 17:35:20 +0300 Subject: [PATCH 030/121] 8170886: compiler/ciReplay/TestSAServer.java intermittently throws NumberFormatException Reviewed-by: thartmann --- hotspot/test/compiler/ciReplay/CiReplayBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/compiler/ciReplay/CiReplayBase.java b/hotspot/test/compiler/ciReplay/CiReplayBase.java index 15972eb60e6..6b39a974d0a 100644 --- a/hotspot/test/compiler/ciReplay/CiReplayBase.java +++ b/hotspot/test/compiler/ciReplay/CiReplayBase.java @@ -215,7 +215,7 @@ public abstract class CiReplayBase { 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(); From cf3815fc2ac62c0b9df32bd1d01e1da7536ad7f1 Mon Sep 17 00:00:00 2001 From: Xue-Lei Andrew Fan Date: Wed, 4 Jan 2017 00:08:40 +0000 Subject: [PATCH 031/121] 8172217: Need debug log for the intermittent failure of AnonCipherWithWantClientAuth Reviewed-by: weijun --- .../ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/sun/security/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java b/jdk/test/sun/security/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java index f6708902acc..3ee3660d22e 100644 --- a/jdk/test/sun/security/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java +++ b/jdk/test/sun/security/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java @@ -31,7 +31,7 @@ * @bug 4392475 * @library /javax/net/ssl/templates * @summary Calling setWantClientAuth(true) disables anonymous suites - * @run main/othervm AnonCipherWithWantClientAuth + * @run main/othervm -Djavax.net.debug=all AnonCipherWithWantClientAuth */ import java.io.InputStream; From b2c73193abc7551538e441d59b829bb495274f22 Mon Sep 17 00:00:00 2001 From: John Jiang Date: Tue, 3 Jan 2017 21:05:46 -0800 Subject: [PATCH 032/121] 8170641: sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh fails with timeout The fix sets timeout for the server and the client, and ignore SocketTimeoutException. Reviewed-by: chegar --- .../HttpsURLConnection/PostThruProxy.java | 84 ++++++++++--------- .../https/HttpsURLConnection/PostThruProxy.sh | 62 -------------- .../PostThruProxyWithAuth.java | 81 ++++++++++-------- .../PostThruProxyWithAuth.sh | 62 -------------- .../HttpsURLConnection/ProxyTunnelServer.java | 23 ++--- 5 files changed, 103 insertions(+), 209 deletions(-) delete mode 100644 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh delete mode 100644 jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh diff --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java index 2ad4ba58623..8393a4ef4a2 100644 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.java @@ -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 { + + 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 @@ public class PostThruProxy { /* * 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 @@ public class PostThruProxy { * 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 @@ public class PostThruProxy { } // 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 @@ public class PostThruProxy { */ 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 @@ public class PostThruProxy { */ 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 @@ public class PostThruProxy { 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 @@ public class PostThruProxy { 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 --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh deleted file mode 100644 index f079dac88ea..00000000000 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh +++ /dev/null @@ -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 --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java index 4572d0852f0..daf75bc65dc 100644 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.java @@ -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,28 +21,32 @@ * 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 { + 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 @@ public class PostThruProxyWithAuth { /* * 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 @@ public class PostThruProxyWithAuth { * 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 @@ public class PostThruProxyWithAuth { } // trigger the client try { - doClientSide(args[0]); + doClientSide(); } catch (Exception e) { System.out.println("Client side failed: " + e.getMessage()); @@ -121,24 +120,18 @@ public class PostThruProxyWithAuth { 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 @@ public class PostThruProxyWithAuth { */ 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 @@ public class PostThruProxyWithAuth { */ 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 @@ public class PostThruProxyWithAuth { 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 @@ public class PostThruProxyWithAuth { "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 --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh deleted file mode 100644 index 8015e7b944b..00000000000 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh +++ /dev/null @@ -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 --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java index f4987685faa..02a7af75317 100644 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/ProxyTunnelServer.java @@ -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 class ProxyTunnelServer extends Thread { 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 @@ public class ProxyTunnelServer extends Thread { 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 @@ public class ProxyTunnelServer extends Thread { 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 @@ public class ProxyTunnelServer extends Thread { 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 class ProxyTunnelServer extends Thread { } } - public void close() { + private void close() { try { if (!sockIn.isClosed()) sockIn.close(); @@ -275,7 +278,7 @@ public class ProxyTunnelServer extends Thread { serverPort = Integer.parseInt(connectInfo.substring(endi+1)); } catch (Exception e) { throw new IOException("Proxy recieved a request: " - + connectStr); + + connectStr, e); } serverInetAddr = InetAddress.getByName(serverName); } From f1eff88c3b92f57c510294f9ba2b739626360d5b Mon Sep 17 00:00:00 2001 From: Tim Du Date: Tue, 3 Jan 2017 22:26:51 -0800 Subject: [PATCH 033/121] 8168769: javax/net/ssl/TLSv12/DisabledShortRSAKeys.java timed out Reviewed-by: coffeys, xuelei --- .../net/ssl/TLSv12/DisabledShortRSAKeys.java | 250 +++--------------- 1 file changed, 32 insertions(+), 218 deletions(-) diff --git a/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java b/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java index c1c1d9ffc30..76961dc53ab 100644 --- a/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java +++ b/jdk/test/javax/net/ssl/TLSv12/DisabledShortRSAKeys.java @@ -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.security.interfaces.*; 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? @@ -122,82 +109,51 @@ public class DisabledShortRSAKeys { 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 @@ public class DisabledShortRSAKeys { * ============================================================= * 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 @@ public class DisabledShortRSAKeys { 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 @@ public class DisabledShortRSAKeys { 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 @@ public class DisabledShortRSAKeys { /* * 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; - } - } - } } From a6067413b81022b5998b5c52def14ffc66b52e16 Mon Sep 17 00:00:00 2001 From: Adam Petcher Date: Wed, 4 Jan 2017 08:06:15 -0500 Subject: [PATCH 034/121] 8172003: getInstance() with unknown provider throws NPE Reviewed-by: mullan --- .../xml/crypto/dsig/TransformService.java | 6 ++- .../xml/crypto/dsig/XMLSignatureFactory.java | 6 ++- .../crypto/dsig/keyinfo/KeyInfoFactory.java | 6 ++- .../TransformService/UnknownProvider.java | 48 +++++++++++++++++++ .../XMLSignatureFactory/UnknownProvider.java | 46 ++++++++++++++++++ .../KeyInfoFactory/UnknownProvider.java | 46 ++++++++++++++++++ 6 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java create mode 100644 jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java create mode 100644 jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java diff --git a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java index 84eba8c34a6..6dfecd88c9d 100644 --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/TransformService.java @@ -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 @@ public abstract class TransformService implements Transform { 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 --git a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java index 55d2c87a566..d0cec5e215a 100644 --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignatureFactory.java @@ -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 @@ public abstract class XMLSignatureFactory { } 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 --git a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java index 248e35aa5af..ccf855f792c 100644 --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory.java @@ -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 @@ public abstract class KeyInfoFactory { 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 --git a/jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java b/jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java new file mode 100644 index 00000000000..3976948a366 --- /dev/null +++ b/jdk/test/javax/xml/crypto/dsig/TransformService/UnknownProvider.java @@ -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 --git a/jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java b/jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java new file mode 100644 index 00000000000..8124c12e064 --- /dev/null +++ b/jdk/test/javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java @@ -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 --git a/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java new file mode 100644 index 00000000000..9b1da230d8c --- /dev/null +++ b/jdk/test/javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java @@ -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 + } + } +} From 083c7c4176b8f5272a9f451ee6d5d9234f515163 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Wed, 4 Jan 2017 18:32:19 +0100 Subject: [PATCH 035/121] 8170785: Excessive allocation in ParseUtil.encodePath Reviewed-by: rriggs --- .../share/classes/sun/net/www/ParseUtil.java | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java b/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java index f94600e59cc..59b08aef7c7 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java +++ b/jdk/src/java.base/share/classes/sun/net/www/ParseUtil.java @@ -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 @@ public class ParseUtil { 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 @@ public class ParseUtil { * 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 @@ public class ParseUtil { 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); From 5a7ecc5b784bb34fac9a4c0f64da0aacd953333b Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Wed, 4 Jan 2017 09:50:21 -0800 Subject: [PATCH 036/121] 8172215: java launcher no longer accepts -cp "" empty string Reviewed-by: alanb, dholmes, psandoz --- jdk/src/java.base/share/native/libjli/java.c | 3 +- ...ourceBuilder.java => ModuleInfoMaker.java} | 4 +- .../AddExportsTestWarningError.java | 4 +- .../addreads/AddReadsTestWarningError.java | 4 +- .../modules/classpath/JavaClassPathTest.java | 39 +++++++++++++------ 5 files changed, 36 insertions(+), 18 deletions(-) rename jdk/test/lib/testlibrary/{ModuleSourceBuilder.java => ModuleInfoMaker.java} (98%) diff --git a/jdk/src/java.base/share/native/libjli/java.c b/jdk/src/java.base/share/native/libjli/java.c index 645d7321093..ff533f70edc 100644 --- a/jdk/src/java.base/share/native/libjli/java.c +++ b/jdk/src/java.base/share/native/libjli/java.c @@ -1248,6 +1248,7 @@ ParseArguments(int *pargc, char ***pargv, 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 @@ ParseArguments(int *pargc, char ***pargv, 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 --git a/jdk/test/lib/testlibrary/ModuleSourceBuilder.java b/jdk/test/lib/testlibrary/ModuleInfoMaker.java similarity index 98% rename from jdk/test/lib/testlibrary/ModuleSourceBuilder.java rename to jdk/test/lib/testlibrary/ModuleInfoMaker.java index 3d116495c6e..5e4f15a6774 100644 --- a/jdk/test/lib/testlibrary/ModuleSourceBuilder.java +++ b/jdk/test/lib/testlibrary/ModuleInfoMaker.java @@ -35,7 +35,7 @@ import static org.testng.Assert.assertTrue; /** * Utility class for creating test modules. */ -public class ModuleSourceBuilder { +public class ModuleInfoMaker { private static String MODULE_INFO_JAVA = "module-info.java"; private static Pattern MODULE_PATTERN = Pattern.compile("module\\s+((?:\\w+\\.)*)"); @@ -45,7 +45,7 @@ public class ModuleSourceBuilder { Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); private final Path dir; - public ModuleSourceBuilder(Path dir) { + public ModuleInfoMaker(Path dir) { this.dir = dir; } diff --git a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java index 5df7f0d50aa..ed2f7c0d7a8 100644 --- a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java +++ b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java @@ -27,7 +27,7 @@ * @summary Basic argument validation for --add-exports * @library /lib/testlibrary * @modules jdk.compiler - * @build AddExportsTestWarningError CompilerUtils ModuleSourceBuilder + * @build AddExportsTestWarningError CompilerUtils ModuleInfoMaker * @build jdk.testlibrary.* * @run testng AddExportsTestWarningError */ @@ -59,7 +59,7 @@ public class AddExportsTestWarningError { @BeforeTest public void setup() throws Exception { - ModuleSourceBuilder builder = new ModuleSourceBuilder(SRC_DIR); + ModuleInfoMaker builder = new ModuleInfoMaker(SRC_DIR); builder.writeJavaFiles("m1", "module m1 { }", "package p1; public class C1 { " + diff --git a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java index 325ca322522..5b8558350ef 100644 --- a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java +++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java @@ -27,7 +27,7 @@ * @summary Basic argument validation for --add-reads * @library /lib/testlibrary * @modules jdk.compiler - * @build AddReadsTestWarningError CompilerUtils ModuleSourceBuilder + * @build AddReadsTestWarningError CompilerUtils ModuleInfoMaker * @build jdk.testlibrary.* * @run testng AddReadsTestWarningError */ @@ -59,7 +59,7 @@ public class AddReadsTestWarningError { @BeforeTest public void setup() throws Exception { - ModuleSourceBuilder builder = new ModuleSourceBuilder(SRC_DIR); + ModuleInfoMaker builder = new ModuleInfoMaker(SRC_DIR); builder.writeJavaFiles("m1", "module m1 { requires m4; }", "package p1; public class C1 { " + diff --git a/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java b/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java index 634a27fa95c..afac4220b13 100644 --- a/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java +++ b/jdk/test/tools/launcher/modules/classpath/JavaClassPathTest.java @@ -95,19 +95,20 @@ public class JavaClassPathTest { public Object[][] classpath() { return new Object[][]{ // true indicates that class path default to current working directory - { "", "." }, - { "-Djava.class.path", "." }, - { "-Djava.class.path=", "" }, - { "-Djava.class.path=.", "." }, + { List.of(), "." }, + { List.of("-cp", ""), "" }, + { List.of("-cp", "."), "." }, + { List.of("-Djava.class.path"), "." }, + { List.of("-Djava.class.path="), "" }, + { List.of("-Djava.class.path=."), "." }, }; } @Test(dataProvider = "classpath") - public void testUnnamedModule(String option, String expected) throws Throwable { - List 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 @@ public class JavaClassPathTest { } 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 @@ public class JavaClassPathTest { .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; + } } From ea8bb5ad4130c817ba1c190db31bbc764eeddafe Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Wed, 4 Jan 2017 10:20:12 -0800 Subject: [PATCH 037/121] 8172200: Mark StressLoopback.java as intermittently failing Reviewed-by: lancea, bpb, rriggs --- .../nio/channels/AsynchronousSocketChannel/StressLoopback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java b/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java index 8f8f816cad6..b885a0fc52a 100644 --- a/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java +++ b/jdk/test/java/nio/channels/AsynchronousSocketChannel/StressLoopback.java @@ -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; From 33703528b449db563067350e45e258b3e06fdce4 Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Wed, 4 Jan 2017 14:59:18 -0500 Subject: [PATCH 038/121] 8172254: Typo in DriverManager implNote Reviewed-by: mchung, alanb --- jdk/src/java.sql/share/classes/java/sql/DriverManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/java.sql/share/classes/java/sql/DriverManager.java b/jdk/src/java.sql/share/classes/java/sql/DriverManager.java index 7fe59001940..84456bd57eb 100644 --- a/jdk/src/java.sql/share/classes/java/sql/DriverManager.java +++ b/jdk/src/java.sql/share/classes/java/sql/DriverManager.java @@ -64,7 +64,7 @@ import jdk.internal.reflect.Reflection; * * *

- * @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 From 94d019e9ba3ee3aa1a5e82ba5155d61cef0b0bad Mon Sep 17 00:00:00 2001 From: Paul Sandoz Date: Wed, 4 Jan 2017 17:20:41 -0800 Subject: [PATCH 039/121] 8172201: Replace assert of return type in VarHandle.AccessMode with test Reviewed-by: mchung --- .../classes/java/lang/invoke/VarHandle.java | 16 +------------ .../VarHandleTestAccessModeMethodNames.java | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java index 167de41e98b..57e3a3f4a3c 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -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 @@ public abstract class VarHandle { 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 @@ public abstract class VarHandle { 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 --git a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java index dc86cc643bc..3365bd923bc 100644 --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessModeMethodNames.java @@ -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 @@ public class VarHandleTestAccessModeMethodNames { toArray(Object[][]::new); } - @Test(dataProvider = "accessModesProvider") public void testMethodName(VarHandle.AccessMode am) { assertEquals(am.methodName(), toMethodName(am.name())); @@ -58,4 +60,22 @@ public class VarHandleTestAccessModeMethodNames { } 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)); + } } From 5ada754c718c1cdf89ead253011d20e3b96f4966 Mon Sep 17 00:00:00 2001 From: Peter Levart Date: Thu, 5 Jan 2017 08:51:03 +0100 Subject: [PATCH 040/121] 8172190: Re-apply the fix for bugs 8062389, 8029459, 8061950 Final fix for 8062389: Class.getMethod() is inconsistent with Class.getMethods() results, 8029459: getMethods returns methods that are not members of the class, 8061950: Class.getMethods() exhibits quadratic time complexity Reviewed-by: alanb, mchung, psandoz, dfuchs, darcy, redestad --- .../share/classes/java/lang/Class.java | 558 +++---- .../classes/java/lang/PublicMethods.java | 272 ++++ .../java/lang/reflect/Constructor.java | 5 + .../classes/java/lang/reflect/Executable.java | 4 + .../classes/java/lang/reflect/Method.java | 5 + .../java/lang/reflect/ReflectAccess.java | 4 + .../internal/reflect/LangReflectAccess.java | 3 + .../internal/reflect/ReflectionFactory.java | 4 + .../Class/getMethods/StarInheritance.java | 4 +- .../FilterNotMostSpecific.java | 306 ++-- .../lang/reflect/PublicMethods/Case1.results | 1379 +++++++++++++++++ .../PublicMethods/PublicMethodsTest.java | 529 +++++++ 12 files changed, 2553 insertions(+), 520 deletions(-) create mode 100644 jdk/src/java.base/share/classes/java/lang/PublicMethods.java create mode 100644 jdk/test/java/lang/reflect/PublicMethods/Case1.results create mode 100644 jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java diff --git a/jdk/src/java.base/share/classes/java/lang/Class.java b/jdk/src/java.base/share/classes/java/lang/Class.java index 4953e053b44..1afa833c7a9 100644 --- a/jdk/src/java.base/share/classes/java/lang/Class.java +++ b/jdk/src/java.base/share/classes/java/lang/Class.java @@ -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.Field; 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.net.URL; 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.LinkedHashMap; 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 @@ public final class Class implements java.io.Serializable, } 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 @@ public final class Class implements java.io.Serializable, * @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 @@ public final class Class implements java.io.Serializable, 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 @@ public final class Class implements java.io.Serializable, * 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 @@ public final class Class implements java.io.Serializable, * 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 @@ public final class Class implements java.io.Serializable, @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 @@ public final class Class implements java.io.Serializable, * 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()}. * - *

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. + *

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. * - *

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 + *

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

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). + *
+ * + * @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 @@ public final class Class implements java.io.Serializable, @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 @@ public final class Class implements java.io.Serializable, * "<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 final class Class implements java.io.Serializable, 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 @@ public final class Class implements java.io.Serializable, @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 @@ public final class Class implements java.io.Serializable, @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 final class Class implements java.io.Serializable, 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 @@ public final class Class implements java.io.Serializable, 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 @@ public final class Class implements java.io.Serializable, } // No cached value available; compute value recursively. - // Start by fetching public declared methods - MethodArray methods = new MethodArray(); - { - Method[] tmp = privateGetDeclaredMethods(true); - methods.addAll(tmp); + // Start by fetching public declared methods... + PublicMethods pms = new PublicMethods(); + for (Method m : privateGetDeclaredMethods(/* publicOnly */ true)) { + pms.merge(m); } - // 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()); - } - 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 @@ public final class Class implements java.io.Serializable, // 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 @@ public final class Class implements java.io.Serializable, 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 @@ public final class Class implements java.io.Serializable, 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) + 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(); + } + + // 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; + } - // Not found on class or superclass directly - interfaceCandidates.removeLessSpecifics(); - return interfaceCandidates.getFirst(); // may be null - } - - 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; - } - // Search superclass's methods - if (!isInterface()) { - Class c = getSuperclass(); - if (c != null) { - if ((res = c.getMethod0(name, parameterTypes, true)) != null) { - return res; - } - } - } - // 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; + // 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); + } + + // ...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 --git a/jdk/src/java.base/share/classes/java/lang/PublicMethods.java b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java new file mode 100644 index 00000000000..02e0d051b7d --- /dev/null +++ b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java @@ -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 --git a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java index d086879a101..f64e84f7f37 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java @@ -240,6 +240,11 @@ public final class Constructor extends Executable { } + @Override + Class[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */ diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java index dce00fdba2f..ae94a58f06c 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java @@ -222,6 +222,10 @@ public abstract class Executable extends AccessibleObject */ 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 --git a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java index 54ef08ebe8a..027a711d3e1 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java @@ -290,6 +290,11 @@ public final class Method extends Executable { } else { return getReturnType();} } + @Override + Class[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */ diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java index 2a6abd3d682..e34b019b67f 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java @@ -132,6 +132,10 @@ class ReflectAccess implements jdk.internal.reflect.LangReflectAccess { 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 --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java index 0fed09ff0c4..7637b4b6a45 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java @@ -96,6 +96,9 @@ public interface LangReflectAccess { /** 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 --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java index c6777c37827..990de713fc6 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java @@ -345,6 +345,10 @@ public class ReflectionFactory { return langReflectAccess().getExecutableTypeAnnotationBytes(ex); } + public Class[] getExecutableSharedParameterTypes(Executable ex) { + return langReflectAccess().getExecutableSharedParameterTypes(ex); + } + //-------------------------------------------------------------------------- // // Routines used by serialization diff --git a/jdk/test/java/lang/Class/getMethods/StarInheritance.java b/jdk/test/java/lang/Class/getMethods/StarInheritance.java index 7e9f712c8d2..33adf9201cd 100644 --- a/jdk/test/java/lang/Class/getMethods/StarInheritance.java +++ b/jdk/test/java/lang/Class/getMethods/StarInheritance.java @@ -49,7 +49,7 @@ interface B3 extends D3 { void m(); } 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 @@ public class StarInheritance { 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 --git a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java index 4a3d89836db..1992f31d5de 100644 --- a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java +++ b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java @@ -36,9 +36,8 @@ import java.util.Arrays; 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 @@ public class FilterNotMostSpecific { 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 class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { } 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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { @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=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) 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, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) 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 @@ public class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { 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... - @MethodDesc(name="m", declaringClass=B1C.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 B1 { Object m(); } + interface B2A extends B1 { Map m(); } + interface B2B extends B1 { HashMap m(); } - @MethodDesc(name="m", declaringClass=B2.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=B2.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, - kind=MethodKind.DEFAULT) - interface B2 extends B1C { HashMap m(); } + interface B3A extends B2A { HashMap m(); } - @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 B4A extends B3A { HashMap m(); } - // 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=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) - @MethodDesc(name="m", declaringClass=B1C.class) //HashMap - interface B3B extends B2, B1C {} + interface B5A2 extends B4A, B1 {} + + @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 B5A4A extends B4A, B3A {} + + // ... + most specific return type for getMethod from two unrelated interfaces + + @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 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", parameterTypes = {int.class}, declaringClass=A2A.class, + isGetMethodReturn=true) + @MethodDesc(name="m", parameterTypes = {int.class, int.class}, 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) interface A3A extends A1, A2A {} - @MethodDesc(name="m", declaringClass=A1.class, + @MethodDesc(name="m", parameterTypes = {}, 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}, declaringClass=A2B.class, + isGetMethodReturn=true) + @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 @@ public class FilterNotMostSpecific { { 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 --git a/jdk/test/java/lang/reflect/PublicMethods/Case1.results b/jdk/test/java/lang/reflect/PublicMethods/Case1.results new file mode 100644 index 00000000000..a50d8623a55 --- /dev/null +++ b/jdk/test/java/lang/reflect/PublicMethods/Case1.results @@ -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 --git a/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java new file mode 100644 index 00000000000..381cb60c6a9 --- /dev/null +++ b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java @@ -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")) + ); + } + }); + } +} From c104608e372d3a86374a44ec96a3cacb1c20c40f Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Thu, 5 Jan 2017 22:37:52 +0800 Subject: [PATCH 041/121] 8172017: Two tests sun/security/krb5/auto/ReplayCacheTestProc.java and rcache_usemd5.sh fail on Solaris Reviewed-by: mullan --- .../krb5/auto/ReplayCacheTestProc.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java b/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java index 3171d874258..d138d928289 100644 --- a/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java +++ b/jdk/test/sun/security/krb5/auto/ReplayCacheTestProc.java @@ -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 @@ public class ReplayCacheTestProc { 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 @@ public class ReplayCacheTestProc { } } - 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 @@ public class ReplayCacheTestProc { 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 Date: Thu, 5 Jan 2017 22:58:54 +0800 Subject: [PATCH 042/121] 8170900: Issue with FilePermission::implies for wildcard flag(-) Reviewed-by: rriggs, xuelei --- .../share/classes/java/io/FilePermission.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/io/FilePermission.java b/jdk/src/java.base/share/classes/java/io/FilePermission.java index 5bd29603edb..2d56f438cb3 100644 --- a/jdk/src/java.base/share/classes/java/io/FilePermission.java +++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java @@ -532,11 +532,13 @@ public final class FilePermission extends Permission implements Serializable { * 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. * From cfb01751b124e8a425b7f6f6b4755f1ccb8a7514 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Thu, 5 Jan 2017 23:19:26 +0800 Subject: [PATCH 043/121] 8170732: GssKrb5Client sends non-zero buffer size when qop is "auth" Reviewed-by: xuelei --- .../security/sasl/gsskerb/GssKrb5Client.java | 6 +++- .../sun/security/krb5/auto/SaslBasic.java | 32 ++++++++++++------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java index a79b3ffb496..d71397e65ac 100644 --- a/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java +++ b/jdk/src/jdk.security.jgss/share/classes/com/sun/security/sasl/gsskerb/GssKrb5Client.java @@ -298,7 +298,11 @@ final class GssKrb5Client extends GssKrb5Base implements SaslClient { 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 --git a/jdk/test/sun/security/krb5/auto/SaslBasic.java b/jdk/test/sun/security/krb5/auto/SaslBasic.java index fccaf2b930a..05c40b06293 100644 --- a/jdk/test/sun/security/krb5/auto/SaslBasic.java +++ b/jdk/test/sun/security/krb5/auto/SaslBasic.java @@ -23,14 +23,13 @@ /* * @test - * @bug 7110803 + * @bug 7110803 8170732 * @summary SASL service for multiple hostnames * @compile -XDignore.symbol.file SaslBasic.java - * @run main/othervm SaslBasic bound - * @run main/othervm SaslBasic unbound + * @run main/othervm SaslBasic bound auth-int + * @run main/othervm SaslBasic unbound auth-conf + * @run main/othervm SaslBasic bound auth */ -import com.sun.security.jgss.InquireType; - import java.io.IOException; import java.util.Arrays; import java.util.HashMap; @@ -51,7 +50,7 @@ public class SaslBasic { System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); HashMap clntprops = new HashMap(); - clntprops.put(Sasl.QOP, "auth-conf"); + clntprops.put(Sasl.QOP, args[1]); SaslClient sc = Sasl.createSaslClient( new String[]{"GSSAPI"}, null, "server", name, clntprops, null); @@ -74,9 +73,11 @@ public class SaslBasic { }); byte[] token = new byte[0]; + byte[] lastClientToken = null; while (!sc.isComplete() || !ss.isComplete()) { if (!sc.isComplete()) { token = sc.evaluateChallenge(token); + lastClientToken = token; } if (!ss.isComplete()) { token = ss.evaluateResponse(token); @@ -94,11 +95,20 @@ public class SaslBasic { if (key == null) { throw new Exception("Extended negotiated property not read"); } - byte[] hello = "hello".getBytes(); - token = sc.wrap(hello, 0, hello.length); - token = ss.unwrap(token, 0, token.length); - if (!Arrays.equals(hello, token)) { - throw new Exception("Message altered"); + + if (args[1].equals("auth")) { + // 8170732. These are the maximum size bytes after jgss/krb5 wrap. + if (lastClientToken[17] != 0 || lastClientToken[18] != 0 + || lastClientToken[19] != 0) { + throw new Exception("maximum size for auth must be 0"); + } + } else { + byte[] hello = "hello".getBytes(); + token = sc.wrap(hello, 0, hello.length); + token = ss.unwrap(token, 0, token.length); + if (!Arrays.equals(hello, token)) { + throw new Exception("Message altered"); + } } } } From 622df395701b04bc45ae754ee8dcd1fd4718660b Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Tue, 20 Dec 2016 10:11:05 -0800 Subject: [PATCH 044/121] 8171452: (ch) linux io_util_md: Operation not supported exception after 8168628 On Linux, fall back to ftruncate64() if fallocate64() fails Reviewed-by: mdoerr, alanb --- .../java.base/unix/native/libjava/io_util_md.c | 9 +++++++-- .../unix/native/libnio/ch/FileDispatcherImpl.c | 15 +++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/jdk/src/java.base/unix/native/libjava/io_util_md.c b/jdk/src/java.base/unix/native/libjava/io_util_md.c index 29773fbcfbc..f1e34bbbf72 100644 --- a/jdk/src/java.base/unix/native/libjava/io_util_md.c +++ b/jdk/src/java.base/unix/native/libjava/io_util_md.c @@ -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 @@ handleSetLength(FD fd, jlong length) 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 --git a/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c b/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c index e63c3bd1df9..2dd6596091b 100644 --- a/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c +++ b/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c @@ -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 @@ Java_sun_nio_ch_FileDispatcherImpl_allocate0(JNIEnv *env, jobject this, * 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 From 026a05429caa5885fcc1e8e9c3a050b41d339a20 Mon Sep 17 00:00:00 2001 From: Calvin Cheung Date: Tue, 20 Dec 2016 11:50:40 -0800 Subject: [PATCH 045/121] 8171011: convert some CDS dump time warning and error messages to informational messages which will be printed with -XX:+PrintSharedSpaces Print informational message if a module related options is used during dumping except for the -m option Reviewed-by: iklam, jiangli, mseledtsov --- hotspot/src/share/vm/runtime/arguments.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index da3b2503f8c..de45c5cfbde 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -1327,26 +1327,29 @@ void Arguments::check_unsupported_dumping_properties() { "jdk.module.addmods.0", "jdk.module.patch.0" }; const char* unsupported_options[] = { "-m", // cannot use at dump time - "--limit-modules", // 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]); + } } } } From 2bde3c7c3eb21c862076bd11787065fc77fe9570 Mon Sep 17 00:00:00 2001 From: Ed Nevill Date: Tue, 20 Dec 2016 15:49:30 -0500 Subject: [PATCH 046/121] 8171537: aarch64: compiler/c1/Test6849574.java generates guarantee failure in C1 Reviewed-by: aph --- hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp index 66686fd0d60..70c8f909337 100644 --- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp @@ -3111,7 +3111,7 @@ void LIR_Assembler::peephole(LIR_List *lir) { } 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; From ed148370b20a8de8c1a18fd87e7d6a0eefe79de1 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Tue, 20 Dec 2016 15:49:44 -0500 Subject: [PATCH 047/121] 8171433: [aix] switch on gtest AIX build Reviewed-by: dholmes, simonis --- common/autoconf/generated-configure.sh | 4 ++-- common/autoconf/hotspot.m4 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index ce3b9ba203d..a2bf95741f2 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -5142,7 +5142,7 @@ VS_SDK_PLATFORM_NAME_2013= #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1481496095 +DATE_WHEN_GENERATED=1482266922 ############################################################################### # @@ -52829,7 +52829,7 @@ $as_echo "yes, forced" >&6; } $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 --git a/common/autoconf/hotspot.m4 b/common/autoconf/hotspot.m4 index eeb69786045..ac78e4d1bcc 100644 --- a/common/autoconf/hotspot.m4 +++ b/common/autoconf/hotspot.m4 @@ -433,7 +433,7 @@ AC_DEFUN_ONCE([HOTSPOT_ENABLE_DISABLE_GTEST], 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 From b72bbb7b307a78b9f5ea93bbcaddcb4f0a585601 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Tue, 20 Dec 2016 20:42:15 -0500 Subject: [PATCH 048/121] 8171815: [TESTBUG] Update expected failure message in runtime/modules/IgnoreModulePropertiesTest.java Reviewed-by: mr --- hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java index 352a04fb625..e3748530fa7 100644 --- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java +++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java @@ -72,6 +72,6 @@ public class IgnoreModulePropertiesTest { 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"); } } From 6142b330f08ccde005473633a87a61fd9ab6129b Mon Sep 17 00:00:00 2001 From: Dean Long Date: Tue, 20 Dec 2016 20:38:14 -0800 Subject: [PATCH 049/121] 8169938: [AOT] SIGSEGV at ~BufferBlob::vtable chunks Set "return_oop" on AOT scopes Reviewed-by: kvn, never --- hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp | 15 +++++++++------ hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp | 7 +++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp index f5e7e7adfe1..745fb5199ec 100644 --- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp +++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp @@ -967,7 +967,7 @@ GrowableArray* CodeInstaller::record_virtual_objects(Handle debug_i 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 @@ void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode sc } 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 @@ void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scop } 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 @@ void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scop 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 @@ void CodeInstaller::site_Call(CodeBuffer& buffer, jint pc_offset, Handle site, T 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 --git a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp index d5e2d32726b..775a8c19f40 100644 --- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp +++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp @@ -254,8 +254,11 @@ protected: 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); From c2a96c7fca8bac2ec830c8329a5c84fbf6c1b182 Mon Sep 17 00:00:00 2001 From: Kirill Zhaldybin Date: Wed, 21 Dec 2016 11:51:57 +0300 Subject: [PATCH 050/121] 8171517: test_logMessageTest.cpp has "ac_heapanied" instead of "accompanied" inside copyright notice Reviewed-by: sspitsyn, jprovino --- hotspot/test/native/logging/test_logMessageTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hotspot/test/native/logging/test_logMessageTest.cpp b/hotspot/test/native/logging/test_logMessageTest.cpp index cf7c4ce51bd..f23ba944426 100644 --- a/hotspot/test/native/logging/test_logMessageTest.cpp +++ b/hotspot/test/native/logging/test_logMessageTest.cpp @@ -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" From 4e860e58a3fd480a62911df84abbccfe991ec4ef Mon Sep 17 00:00:00 2001 From: Kirill Zhaldybin Date: Wed, 21 Dec 2016 11:51:57 +0300 Subject: [PATCH 051/121] 8170936: Logging: LogFileOutput.invalid_file_test crashes when executed twice Reviewed-by: iignatyev, stuefe --- .../test/native/logging/logTestUtils.inline.hpp | 14 ++++++++++++++ hotspot/test/native/logging/test_logFileOutput.cpp | 8 ++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/hotspot/test/native/logging/logTestUtils.inline.hpp b/hotspot/test/native/logging/logTestUtils.inline.hpp index 03209aea484..b5e26b880fb 100644 --- a/hotspot/test/native/logging/logTestUtils.inline.hpp +++ b/hotspot/test/native/logging/logTestUtils.inline.hpp @@ -59,6 +59,20 @@ static inline void create_directory(const char* name) { 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 --git a/hotspot/test/native/logging/test_logFileOutput.cpp b/hotspot/test/native/logging/test_logFileOutput.cpp index f3e8937157b..95fd8838fa3 100644 --- a/hotspot/test/native/logging/test_logFileOutput.cpp +++ b/hotspot/test/native/logging/test_logFileOutput.cpp @@ -103,7 +103,7 @@ TEST_VM(LogFileOutput, filesize_overflow) { 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_rotation) { } } -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 @@ TEST(LogFileOutput, startup_truncation) { delete_file(archived_filename); } -TEST(LogFileOutput, invalid_file) { +TEST_VM(LogFileOutput, invalid_file) { ResourceMark rm; stringStream ss; @@ -179,5 +179,5 @@ TEST(LogFileOutput, invalid_file) { << "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"); } From d8f522b27298a1186c2b53aa028fc661f05a237a Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Wed, 21 Dec 2016 13:30:35 +0100 Subject: [PATCH 052/121] 8170741: Enable uploading of built artifacts through Jib Reviewed-by: ihse --- common/autoconf/generated-configure.sh | 8 +- common/autoconf/jdk-version.m4 | 6 +- common/autoconf/version-numbers | 3 + common/bin/print-config.js | 45 ++ common/conf/jib-profiles.js | 708 +++++++++++++++++++------ make/SourceRevision.gmk | 4 +- make/jprt.properties | 5 +- 7 files changed, 610 insertions(+), 169 deletions(-) create mode 100644 common/bin/print-config.js diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 5cad333a8ef..644f25ab435 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -5170,7 +5170,7 @@ VS_SDK_PLATFORM_NAME_2013= #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1482168759 +DATE_WHEN_GENERATED=1482309967 ############################################################################### # @@ -24677,7 +24677,7 @@ $as_echo "$as_me: WARNING: Value for VERSION_MINOR has been sanitized from '$wit 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 +24724,7 @@ $as_echo "$as_me: WARNING: Value for VERSION_SECURITY has been sanitized from '$ 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 +24771,7 @@ $as_echo "$as_me: WARNING: Value for VERSION_PATCH has been sanitized from '$wit 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 --git a/common/autoconf/jdk-version.m4 b/common/autoconf/jdk-version.m4 index 949f4276fd4..5321e561267 100644 --- a/common/autoconf/jdk-version.m4 +++ b/common/autoconf/jdk-version.m4 @@ -226,7 +226,7 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS], 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 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS], 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 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS], 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 --git a/common/autoconf/version-numbers b/common/autoconf/version-numbers index ac2c9f24655..4cb54671183 100644 --- a/common/autoconf/version-numbers +++ b/common/autoconf/version-numbers @@ -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 --git a/common/bin/print-config.js b/common/bin/print-config.js new file mode 100644 index 00000000000..1abb2069b1f --- /dev/null +++ b/common/bin/print-config.js @@ -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 --git a/common/conf/jib-profiles.js b/common/conf/jib-profiles.js index 8c0f3a7d23b..761bf010368 100644 --- a/common/conf/jib-profiles.js +++ b/common/conf/jib-profiles.js @@ -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 getJibProfiles = function (input) { 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 @@ var getJibProfiles = function (input) { // 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,168 @@ var getJibProfiles = function (input) { * @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_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 +411,105 @@ var getJibProfilesCommon = function (input) { * @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: ["--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"), + dependencies: ["devkit"], configure_args: concat(common.configure_args, "--with-zlib=system"), - default_make_targets: common.default_make_targets }, "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: ["--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: ["--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"], }, "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 +517,46 @@ var getJibProfilesProfiles = function (input, common) { "linux-x64-zero": { target_os: "linux", target_cpu: "x64", - dependencies: concat(common.dependencies, "devkit"), - configure_args: concat(common.configure_args, + dependencies: ["devkit"], + configure_args: [ "--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)); - // Profiles used to run tests. Used in JPRT. + // 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 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 +570,230 @@ var getJibProfilesProfiles = function (input, common) { }; 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); @@ -513,78 +917,6 @@ var generatePlatformAttributes = function (profiles) { return ret; }; -/** - * 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. @@ -602,10 +934,12 @@ var generateDefaultMakeTargetsConfigureArg = function (common, profiles) { // 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 +952,16 @@ var generateDefaultMakeTargetsConfigureArg = function (common, profiles) { 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 +982,25 @@ var concat = function () { }; /** - * 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); - } else { - newA.push(a[i]); + newA.push(a[i].replace(pattern, replacement)); } + return newA; + } else { + return a.replace(pattern, replacement); } - return newA; }; /** @@ -669,20 +1013,26 @@ var replace = function (original, replacement, a) { * @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 +1040,45 @@ var concatObjects = function (o1, o2) { } 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 --git a/make/SourceRevision.gmk b/make/SourceRevision.gmk index cdd77d74692..a14b3ef0e29 100644 --- a/make/SourceRevision.gmk +++ b/make/SourceRevision.gmk @@ -105,7 +105,7 @@ else # 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 @@ else # 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 --git a/make/jprt.properties b/make/jprt.properties index 3c21c981a46..173a445205e 100644 --- a/make/jprt.properties +++ b/make/jprt.properties @@ -45,6 +45,7 @@ jprt.build.use.configure=true 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_x64.productZero.build.jib.profile=linux-x64-zero 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.jbb.options=-Djava.awt.headless=true 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} From b773c48a606baf02f56ad6d991451f637730aab2 Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Wed, 21 Dec 2016 08:15:10 -0800 Subject: [PATCH 053/121] 8171807: 8170761 fix should be applied to ARM code after 8168503 Reviewed-by: roland --- hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp index 7096d9b2874..9b37b4fe6dc 100644 --- a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp +++ b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp @@ -453,7 +453,7 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, } 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 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt, #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 From e524cf8e7a6fbf0d8fa76c2618eec8fbbc1bab52 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Wed, 21 Dec 2016 17:53:11 +0100 Subject: [PATCH 054/121] 8171548: JDK bundles changes sym links incorrectly in the legal directory Reviewed-by: mchung --- make/Bundles.gmk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/Bundles.gmk b/make/Bundles.gmk index 04e68575fc8..8b1a704ea6d 100644 --- a/make/Bundles.gmk +++ b/make/Bundles.gmk @@ -103,7 +103,7 @@ define SetupBundleFileBody $(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 From f7067671f69e4644569f8d05240cabc3414ed3bf Mon Sep 17 00:00:00 2001 From: Robert Field Date: Wed, 21 Dec 2016 20:14:39 -0800 Subject: [PATCH 055/121] 8168615: JShell API: jdk.jshell.spi should be a pluggable ServiceLoader SPI Reviewed-by: jlahoda --- .../jdk/internal/jshell/tool/JShellTool.java | 18 +- .../jshell/tool/resources/l10n.properties | 10 +- .../share/classes/jdk/jshell/JShell.java | 61 ++++-- .../FailOverExecutionControlProvider.java | 138 ++++++++++++ .../execution/JdiDefaultExecutionControl.java | 75 +------ .../JdiExecutionControlProvider.java | 148 +++++++++++++ .../execution/LocalExecutionControl.java | 10 - .../LocalExecutionControlProvider.java | 82 +++++++ .../classes/jdk/jshell/execution/Util.java | 30 --- .../jdk/jshell/spi/ExecutionControl.java | 168 +++++++++++++-- .../jshell/spi/ExecutionControlProvider.java | 73 +++++++ .../classes/jdk/jshell/spi/ExecutionEnv.java | 1 - .../classes/jdk/jshell/spi/package-info.java | 38 +++- .../jdk.jshell/share/classes/module-info.java | 8 + .../jshell/BadExecutionControlSpecTest.java | 96 +++++++++ .../test/jdk/jshell/DyingRemoteAgent.java | 19 +- .../jdk/jshell/ExecutionControlSpecTest.java | 101 +++++++++ .../FailOverDirectExecutionControlTest.java | 155 ++++++++++++++ ...ilOverExecutionControlDyingLaunchTest.java | 14 +- ...OverExecutionControlHangingLaunchTest.java | 12 +- ...OverExecutionControlHangingListenTest.java | 13 +- .../jshell/FailOverExecutionControlTest.java | 19 +- .../test/jdk/jshell/HangingRemoteAgent.java | 19 +- ...diBadOptionLaunchExecutionControlTest.java | 3 +- ...diBadOptionListenExecutionControlTest.java | 3 +- ...diBogusHostListenExecutionControlTest.java | 5 +- .../JdiLaunchingExecutionControlTest.java | 5 +- .../JdiListeningExecutionControlTest.java | 3 +- ...isteningLocalhostExecutionControlTest.java | 3 +- langtools/test/jdk/jshell/KullaTesting.java | 17 ++ .../test/jdk/jshell/MyExecutionControl.java | 160 ++++++++++++++ .../jshell/MyExecutionControlProvider.java | 47 ++++ .../jdk/jshell/MyRemoteExecutionControl.java | 87 ++++++++ .../test/jdk/jshell/ToolLocalSimpleTest.java | 79 +++++++ langtools/test/jdk/jshell/ToolSimpleTest.java | 37 +++- .../jdk/jshell/UserExecutionControlTest.java | 6 +- .../jdk/jshell/UserJdiUserRemoteTest.java | 201 +----------------- 37 files changed, 1530 insertions(+), 434 deletions(-) create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControlProvider.java create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControlProvider.java create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControlProvider.java create mode 100644 langtools/test/jdk/jshell/BadExecutionControlSpecTest.java create mode 100644 langtools/test/jdk/jshell/ExecutionControlSpecTest.java create mode 100644 langtools/test/jdk/jshell/FailOverDirectExecutionControlTest.java create mode 100644 langtools/test/jdk/jshell/MyExecutionControl.java create mode 100644 langtools/test/jdk/jshell/MyExecutionControlProvider.java create mode 100644 langtools/test/jdk/jshell/MyRemoteExecutionControl.java create mode 100644 langtools/test/jdk/jshell/ToolLocalSimpleTest.java diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java index 2ae1971ac02..d9dd7383fc1 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java @@ -197,6 +197,7 @@ public class JShellTool implements MessageHandler { public boolean testPrompt = false; private String cmdlineClasspath = null; private String startup = null; + private String executionControlSpec = null; private EditorSetting editor = BUILT_IN_EDITOR; private static final String[] EDITOR_ENV_VARS = new String[] { @@ -546,6 +547,7 @@ public class JShellTool implements MessageHandler { OptionSpec st = parser.accepts("startup").withRequiredArg(); parser.acceptsAll(asList("n", "no-startup")); OptionSpec fb = parser.accepts("feedback").withRequiredArg(); + OptionSpec ec = parser.accepts("execution").withRequiredArg(); parser.accepts("q"); parser.accepts("s"); parser.accepts("v"); @@ -648,6 +650,9 @@ public class JShellTool implements MessageHandler { remoteVMOptions.add("--add-modules"); remoteVMOptions.addAll(options.valuesOf(amods)); } + if (options.has(ec)) { + executionControlSpec = options.valueOf(ec); + } if (options.has(addExports)) { List exports = options.valuesOf(addExports).stream() @@ -718,18 +723,21 @@ public class JShellTool implements MessageHandler { // 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(); + .compilerOptions(compilerOptions.stream().toArray(String[]::new)); + if (executionControlSpec != null) { + builder.executionEngine(executionControlSpec); + } + state = builder.build(); shutdownSubscription = state.onShutdown((JShell deadState) -> { if (deadState == state) { hardmsg("jshell.msg.terminated"); diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties index 2ed00cccb35..4e19967ec60 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties @@ -169,12 +169,12 @@ where possible options include:\n\ \ --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 +189,10 @@ where possible options include:\n\ \ -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 diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java index 73134e3e3af..f3348b11b5d 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java @@ -48,11 +48,10 @@ import java.util.function.Supplier; 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 @@ public class JShell implements AutoCloseable { 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 @@ public class JShell implements AutoCloseable { 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 @@ public class JShell implements AutoCloseable { /** * 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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java new file mode 100644 index 00000000000..ba339640284 --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java @@ -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java index 5dfc1b12d7d..b989c42b7d1 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java @@ -63,75 +63,13 @@ import static jdk.jshell.execution.Util.remoteInputOutput; */ 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}. @@ -150,7 +88,7 @@ public class JdiDefaultExecutionControl extends JdiExecutionControl { * @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 @@ public class JdiDefaultExecutionControl extends JdiExecutionControl { 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 @@ public class JdiDefaultExecutionControl extends JdiExecutionControl { * @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 @@ public class JdiDefaultExecutionControl extends JdiExecutionControl { 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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControlProvider.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControlProvider.java new file mode 100644 index 00000000000..21531ed9bcc --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControlProvider.java @@ -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java index 307b8efc709..97c7cc3b6a7 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java @@ -27,7 +27,6 @@ package jdk.jshell.execution; 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 @@ -41,15 +40,6 @@ public class LocalExecutionControl extends DirectExecutionControl { private boolean userCodeRunning = false; 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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControlProvider.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControlProvider.java new file mode 100644 index 00000000000..bda448bbf31 --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControlProvider.java @@ -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java index 1e17319c80d..e5e7ea80a56 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java @@ -63,36 +63,6 @@ public class Util { // never instanciated 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. diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java index b3f0f7da03c..7760cbc398c 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControl.java @@ -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,30 +45,9 @@ import java.io.Serializable; *

* 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. * @@ -176,8 +160,150 @@ public interface ExecutionControl extends AutoCloseable { *

* 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. */ diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControlProvider.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControlProvider.java new file mode 100644 index 00000000000..393fb98a059 --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionControlProvider.java @@ -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java index 5c173bd6776..f98f989961b 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/ExecutionEnv.java @@ -28,7 +28,6 @@ package jdk.jshell.spi; 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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java index 90a556cf675..c5abd85a27c 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/spi/package-info.java @@ -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 --git a/langtools/src/jdk.jshell/share/classes/module-info.java b/langtools/src/jdk.jshell/share/classes/module-info.java index 8ee91ff25b3..ed0ecd49b52 100644 --- a/langtools/src/jdk.jshell/share/classes/module-info.java +++ b/langtools/src/jdk.jshell/share/classes/module-info.java @@ -56,6 +56,7 @@ module jdk.jshell { 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 @@ module jdk.jshell { 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 --git a/langtools/test/jdk/jshell/BadExecutionControlSpecTest.java b/langtools/test/jdk/jshell/BadExecutionControlSpecTest.java new file mode 100644 index 00000000000..a4f4158a5c7 --- /dev/null +++ b/langtools/test/jdk/jshell/BadExecutionControlSpecTest.java @@ -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 --git a/langtools/test/jdk/jshell/DyingRemoteAgent.java b/langtools/test/jdk/jshell/DyingRemoteAgent.java index 9e75104b873..1bf50e6f7e7 100644 --- a/langtools/test/jdk/jshell/DyingRemoteAgent.java +++ b/langtools/test/jdk/jshell/DyingRemoteAgent.java @@ -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 @@ class DyingRemoteAgent extends RemoteExecutionControl { } 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 --git a/langtools/test/jdk/jshell/ExecutionControlSpecTest.java b/langtools/test/jdk/jshell/ExecutionControlSpecTest.java new file mode 100644 index 00000000000..920310bb1e5 --- /dev/null +++ b/langtools/test/jdk/jshell/ExecutionControlSpecTest.java @@ -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 --git a/langtools/test/jdk/jshell/FailOverDirectExecutionControlTest.java b/langtools/test/jdk/jshell/FailOverDirectExecutionControlTest.java new file mode 100644 index 00000000000..5e07d6bcd3a --- /dev/null +++ b/langtools/test/jdk/jshell/FailOverDirectExecutionControlTest.java @@ -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 --git a/langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java b/langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java index 5db8fe5fac2..a08343c6fc7 100644 --- a/langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java +++ b/langtools/test/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java @@ -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 @@ public class FailOverExecutionControlDyingLaunchTest extends ExecutionControlTes @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 --git a/langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java b/langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java index 1f15370776e..852f891f8c1 100644 --- a/langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java +++ b/langtools/test/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java @@ -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 @@ public class FailOverExecutionControlHangingLaunchTest extends ExecutionControlT @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 --git a/langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java b/langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java index 6da67e4855b..fc40f886c1e 100644 --- a/langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java +++ b/langtools/test/jdk/jshell/FailOverExecutionControlHangingListenTest.java @@ -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 @@ public class FailOverExecutionControlHangingListenTest extends ExecutionControlT @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 --git a/langtools/test/jdk/jshell/FailOverExecutionControlTest.java b/langtools/test/jdk/jshell/FailOverExecutionControlTest.java index 97cffd82579..b3f140adc9d 100644 --- a/langtools/test/jdk/jshell/FailOverExecutionControlTest.java +++ b/langtools/test/jdk/jshell/FailOverExecutionControlTest.java @@ -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 @@ public class FailOverExecutionControlTest extends ExecutionControlTestBase { @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 --git a/langtools/test/jdk/jshell/HangingRemoteAgent.java b/langtools/test/jdk/jshell/HangingRemoteAgent.java index bfd08487bb4..1f83b7c45c7 100644 --- a/langtools/test/jdk/jshell/HangingRemoteAgent.java +++ b/langtools/test/jdk/jshell/HangingRemoteAgent.java @@ -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 @@ class HangingRemoteAgent extends RemoteExecutionControl { } 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 --git a/langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java b/langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java index 0674f2ba61a..8c7019119d6 100644 --- a/langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java +++ b/langtools/test/jdk/jshell/JdiBadOptionLaunchExecutionControlTest.java @@ -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 class JdiBadOptionLaunchExecutionControlTest { public void badOptionLaunchTest() { try { JShell.builder() - .executionEngine(JdiDefaultExecutionControl.launch()) + .executionEngine("jdi:launch(true)") .remoteVMOptions("-BadBadOption") .build(); } catch (IllegalStateException ex) { diff --git a/langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java b/langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java index a419bdefe13..79213e0dbe5 100644 --- a/langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java +++ b/langtools/test/jdk/jshell/JdiBadOptionListenExecutionControlTest.java @@ -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 class JdiBadOptionListenExecutionControlTest { public void badOptionListenTest() { try { JShell.builder() - .executionEngine(JdiDefaultExecutionControl.listen(null)) + .executionEngine("jdi") .remoteVMOptions("-BadBadOption") .build(); } catch (IllegalStateException ex) { diff --git a/langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java b/langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java index 4e4b6f8ea5b..6ef1a9ce879 100644 --- a/langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java +++ b/langtools/test/jdk/jshell/JdiBogusHostListenExecutionControlTest.java @@ -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 class JdiBogusHostListenExecutionControlTest { 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 --git a/langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java b/langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java index 3956712a1b8..41cfe6c019c 100644 --- a/langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java +++ b/langtools/test/jdk/jshell/JdiLaunchingExecutionControlTest.java @@ -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 @@ public class JdiLaunchingExecutionControlTest extends ExecutionControlTestBase { @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(JdiDefaultExecutionControl.launch())); + setUp(builder -> builder.executionEngine("jdi:launch(true)")); } } diff --git a/langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java b/langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java index 3d80c70b6fe..7003eb7a006 100644 --- a/langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java +++ b/langtools/test/jdk/jshell/JdiListeningExecutionControlTest.java @@ -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 @@ public class JdiListeningExecutionControlTest extends ExecutionControlTestBase { @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(JdiDefaultExecutionControl.listen(null))); + setUp(builder -> builder.executionEngine("jdi")); } } diff --git a/langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java b/langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java index 7796e57cdbb..14daf2bcd82 100644 --- a/langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java +++ b/langtools/test/jdk/jshell/JdiListeningLocalhostExecutionControlTest.java @@ -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 @@ public class JdiListeningLocalhostExecutionControlTest extends ExecutionControlT @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine(JdiDefaultExecutionControl.listen("localhost"))); + setUp(builder -> builder.executionEngine("jdi:hostname(localhost)")); } } diff --git a/langtools/test/jdk/jshell/KullaTesting.java b/langtools/test/jdk/jshell/KullaTesting.java index 80de7b4e7be..9edc256f510 100644 --- a/langtools/test/jdk/jshell/KullaTesting.java +++ b/langtools/test/jdk/jshell/KullaTesting.java @@ -28,6 +28,10 @@ import java.io.InputStream; 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 @@ public class KullaTesting { 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 --git a/langtools/test/jdk/jshell/MyExecutionControl.java b/langtools/test/jdk/jshell/MyExecutionControl.java new file mode 100644 index 00000000000..15b0e94f5e2 --- /dev/null +++ b/langtools/test/jdk/jshell/MyExecutionControl.java @@ -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 --git a/langtools/test/jdk/jshell/MyExecutionControlProvider.java b/langtools/test/jdk/jshell/MyExecutionControlProvider.java new file mode 100644 index 00000000000..67e8a19d034 --- /dev/null +++ b/langtools/test/jdk/jshell/MyExecutionControlProvider.java @@ -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 --git a/langtools/test/jdk/jshell/MyRemoteExecutionControl.java b/langtools/test/jdk/jshell/MyRemoteExecutionControl.java new file mode 100644 index 00000000000..88e6de3de0f --- /dev/null +++ b/langtools/test/jdk/jshell/MyRemoteExecutionControl.java @@ -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 --git a/langtools/test/jdk/jshell/ToolLocalSimpleTest.java b/langtools/test/jdk/jshell/ToolLocalSimpleTest.java new file mode 100644 index 00000000000..45fb6e9bc9d --- /dev/null +++ b/langtools/test/jdk/jshell/ToolLocalSimpleTest.java @@ -0,0 +1,79 @@ +/* + * 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 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") + ); + } + + @Test + public void testOptionBadR() { + test(new String[]{"-R-RottenLiver"}, + (a) -> assertCommand(a, "43", + "$1 ==> 43") + ); + } + +} diff --git a/langtools/test/jdk/jshell/ToolSimpleTest.java b/langtools/test/jdk/jshell/ToolSimpleTest.java index 6862d8f534e..7db7a8c49f5 100644 --- a/langtools/test/jdk/jshell/ToolSimpleTest.java +++ b/langtools/test/jdk/jshell/ToolSimpleTest.java @@ -45,9 +45,9 @@ import org.testng.annotations.Test; 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 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testOpenComment() { test( (a) -> assertCommand(a, "int z = /* blah", ""), @@ -72,6 +73,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void oneLineOfError() { test( (a) -> assertCommand(a, "12+", null), @@ -80,6 +82,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void defineVariables() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -96,6 +99,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void defineMethods() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -112,6 +116,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void defineTypes() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -131,6 +136,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void defineImports() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -150,6 +156,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void defineVar() { test( (a) -> assertCommand(a, "int x = 72", "x ==> 72"), @@ -158,6 +165,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void defineUnresolvedVar() { test( (a) -> assertCommand(a, "undefined x", @@ -166,6 +174,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testUnresolved() { test( (a) -> assertCommand(a, "int f() { return g() + x + new A().a; }", @@ -178,16 +187,19 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @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 public void testNoArgument() { test( (a) -> assertCommand(a, "/save", @@ -199,6 +211,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testDebug() { test( (a) -> assertCommand(a, "/deb", "| Debugging on"), @@ -208,6 +221,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testDrop() { test(false, new String[]{"--no-startup"}, a -> assertVariable(a, "int", "a"), @@ -240,6 +254,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testDropNegative() { test(false, new String[]{"--no-startup"}, a -> assertCommandOutputStartsWith(a, "/drop 0", "| No such snippet: 0"), @@ -255,6 +270,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @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 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testApplicationOfPost() { test( (a) -> assertCommand(a, "/set mode t normal -command", "| Created new feedback mode: t"), @@ -290,6 +307,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testHelpLength() { Consumer testOutput = (s) -> { List ss = Stream.of(s.split("\n")) @@ -304,6 +322,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testHelp() { test( (a) -> assertHelp(a, "/?", "/list", "/help", "/exit", "intro"), @@ -315,6 +334,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testHelpFormat() { test( (a) -> assertCommandCheckOutput(a, "/help", s -> { @@ -355,6 +375,7 @@ public class ToolSimpleTest extends ReplToolTesting { } } + @Test public void testListArgs() { String arg = "qqqq"; List startVarList = new ArrayList<>(START_UP); @@ -377,6 +398,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testVarsArgs() { String arg = "qqqq"; List startVarList = new ArrayList<>(); @@ -402,6 +424,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testMethodsArgs() { String arg = "qqqq"; List startMethodList = new ArrayList<>(START_UP_CMD_METHOD); @@ -436,6 +459,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testTypesArgs() { String arg = "qqqq"; List startTypeList = new ArrayList<>(); @@ -468,6 +492,8 @@ public class ToolSimpleTest extends ReplToolTesting { s -> checkLineToList(s, startTypeList)) ); } + + @Test public void defineClasses() { test( (a) -> assertCommandCheckOutput(a, "/list", assertList()), @@ -486,6 +512,8 @@ public class ToolSimpleTest extends ReplToolTesting { (a) -> assertCommandCheckOutput(a, "/types", assertClasses()) ); } + + @Test public void testCommandPrefix() { test(a -> assertCommandCheckOutput(a, "/s", assertStartsWith("| Command: '/s' is ambiguous: /save, /set")), @@ -496,6 +524,7 @@ public class ToolSimpleTest extends ReplToolTesting { 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 +532,14 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @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 +548,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testOptionFeedback() { test(Locale.ROOT, false, new String[]{"--feedback", "concise", "--no-startup"}, "", (a) -> assertCommand(a, "1+1", "$1 ==> 2"), @@ -524,6 +556,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testCompoundOptions() { Consumer confirmNoStartup = s -> { assertEquals(0, Stream.of(s.split("\n")) @@ -546,6 +579,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void testOptionR() { test(new String[]{"-R-Dthe.sound=blorp", "--no-startup"}, (a) -> assertCommand(a, "System.getProperty(\"the.sound\")", @@ -553,6 +587,7 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @Test public void test8156910() { test( (a) -> assertCommandOutputContains(a, "System.out.println(\"%5d\", 10);", "%5d"), diff --git a/langtools/test/jdk/jshell/UserExecutionControlTest.java b/langtools/test/jdk/jshell/UserExecutionControlTest.java index 0b69c34f9ec..90c99db4a8f 100644 --- a/langtools/test/jdk/jshell/UserExecutionControlTest.java +++ b/langtools/test/jdk/jshell/UserExecutionControlTest.java @@ -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 @@ public class UserExecutionControlTest extends ExecutionControlTestBase { @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 --git a/langtools/test/jdk/jshell/UserJdiUserRemoteTest.java b/langtools/test/jdk/jshell/UserJdiUserRemoteTest.java index 1b074a046c8..56cce3f02ca 100644 --- a/langtools/test/jdk/jshell/UserJdiUserRemoteTest.java +++ b/langtools/test/jdk/jshell/UserJdiUserRemoteTest.java @@ -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 org.testng.annotations.BeforeMethod; 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 @@ public class UserJdiUserRemoteTest extends ExecutionControlTestBase { @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 @@ public class UserJdiUserRemoteTest extends ExecutionControlTestBase { 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"; - } - -} From 3fe3fea9c164ae228b3130153d750d61d16b91ea Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:03 +0000 Subject: [PATCH 056/121] Added tag jdk-9+150 for changeset a8d83044a192 --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index fe50e8a4d7e..13cf5f1e4ba 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -392,3 +392,4 @@ cb9e896265ef45295fdd09986dee76624e4d41e4 jdk-9+145 76389430a13e82a9321cdc085216f6bff526e316 jdk-9+147 586c93260d3b2f91a055b96118b141c05841694f jdk-9+148 4d4cd7cd731c1952d7330ea5bcfda8bd26820fa5 jdk-9+149 +e5a42ddaf633fde14b983f740ae0e7e490741fd1 jdk-9+150 From 72b502fa4f545f60ba536db3cbc7e1195a1544b7 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Fri, 23 Dec 2016 11:17:50 -0800 Subject: [PATCH 057/121] 8171892: JShell: incorrect printing of multidemensional arrays 8171387: jshell tool: message inconsistencies Reviewed-by: sundar, dlsmith --- .../jshell/tool/resources/l10n.properties | 4 ++-- .../execution/DirectExecutionControl.java | 21 +++++++++++++++--- .../test/jdk/jshell/SimpleRegressionTest.java | 22 ++++++++++++++++--- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties index 4e19967ec60..fa8d930ec09 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties @@ -150,8 +150,8 @@ jshell.err.retained.mode.failure = Failure in retained modes (modes cleared) -- 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: \ diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java index 56e987ea6c8..0a708954694 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java @@ -202,12 +202,27 @@ public class DirectExecutionControl implements ExecutionControl { } 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 --git a/langtools/test/jdk/jshell/SimpleRegressionTest.java b/langtools/test/jdk/jshell/SimpleRegressionTest.java index 063a2335f4b..a3efe9c6750 100644 --- a/langtools/test/jdk/jshell/SimpleRegressionTest.java +++ b/langtools/test/jdk/jshell/SimpleRegressionTest.java @@ -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 @@ public class SimpleRegressionTest extends KullaTesting { 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 @@ public class SimpleRegressionTest extends KullaTesting { 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 } } }"); + } } From 6c52320cccfe34a0d197dde8b64f2d7c34301e19 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Mon, 2 Jan 2017 18:31:30 -0800 Subject: [PATCH 058/121] 8172102: jshell tool: remove print method forwarding to System.out from default startup Reviewed-by: briangoetz --- .../jdk/internal/jshell/tool/JShellTool.java | 130 +++++++++---- .../jshell/tool/resources/l10n.properties | 2 +- .../jdk/jshell/tool/resources/DEFAULT.jsh | 11 ++ .../jdk/jshell/tool/resources/JAVASE.jsh | 173 ++++++++++++++++++ .../jdk/jshell/tool/resources/PRINTING.jsh | 21 +++ langtools/test/jdk/jshell/EditorTestBase.java | 2 +- .../test/jdk/jshell/ReplToolTesting.java | 51 ++++-- .../test/jdk/jshell/StartOptionTest.java | 11 +- langtools/test/jdk/jshell/ToolBasicTest.java | 16 +- .../jdk/jshell/ToolCommandOptionTest.java | 16 +- .../test/jdk/jshell/ToolLocalSimpleTest.java | 11 +- langtools/test/jdk/jshell/ToolSimpleTest.java | 48 +++-- 12 files changed, 412 insertions(+), 80 deletions(-) create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/DEFAULT.jsh create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/JAVASE.jsh create mode 100644 langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/PRINTING.jsh diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java index d9dd7383fc1..c01cd91727b 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java @@ -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; @@ -196,6 +199,7 @@ public class JShellTool implements MessageHandler { 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; @@ -213,16 +217,9 @@ public class JShellTool implements MessageHandler { 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"; // Tool id (tid) mapping: the three name spaces NameSpace mainNamespace; @@ -482,7 +479,7 @@ public class JShellTool implements MessageHandler { if (startup == null) { startup = prefs.get(STARTUP_KEY); if (startup == null) { - startup = DEFAULT_STARTUP; + startup = defaultStartup(); } } @@ -606,14 +603,19 @@ public class JShellTool implements MessageHandler { } if (options.has(st)) { List sts = options.valuesOf(st); - if (sts.size() != 1 || options.has("no-startup")) { - startmsg("jshell.err.opt.startup.one"); + if (options.has("no-startup")) { + startmsg("jshell.err.opt.startup.conflict"); return null; } - startup = readFile(sts.get(0), "--startup"); - if (startup == null) { - return null; + StringBuilder sb = new StringBuilder(); + for (String fn : sts) { + String s = readFile(fn, "--startup"); + if (s == null) { + return null; + } + sb.append(s); } + startup = sb.toString(); } else if (options.has("no-startup")) { startup = ""; } @@ -798,7 +800,7 @@ public class JShellTool implements MessageHandler { //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); @@ -1623,14 +1625,17 @@ public class JShellTool implements MessageHandler { // 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) { @@ -1643,13 +1648,17 @@ public class JShellTool implements MessageHandler { 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 = ""; } @@ -1673,7 +1682,7 @@ public class JShellTool implements MessageHandler { 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"; @@ -2166,7 +2175,16 @@ public class JShellTool implements MessageHandler { 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()); @@ -2189,11 +2207,16 @@ public class JShellTool implements MessageHandler { 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); @@ -2205,6 +2228,44 @@ public class JShellTool implements MessageHandler { } + // Read a built-in file from resources or null + 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() { live = false; fluffmsg("jshell.msg.resetting.state"); @@ -2910,6 +2971,10 @@ class ScannerIOContext extends NonInteractiveIOContext { this.scannerIn = scannerIn; } + ScannerIOContext(Reader rdr) throws FileNotFoundException { + this(new Scanner(rdr)); + } + @Override public String readLine(String prompt, String prefix) { if (scannerIn.hasNextLine()) { @@ -2930,17 +2995,6 @@ class ScannerIOContext extends NonInteractiveIOContext { } } -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties index fa8d930ec09..a92c639548f 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties @@ -29,7 +29,7 @@ For an introduction type: /help intro 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} diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/DEFAULT.jsh b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/DEFAULT.jsh new file mode 100644 index 00000000000..52e8ae36377 --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/DEFAULT.jsh @@ -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/JAVASE.jsh b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/JAVASE.jsh new file mode 100644 index 00000000000..a1ed3e03c74 --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/JAVASE.jsh @@ -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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/PRINTING.jsh b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/PRINTING.jsh new file mode 100644 index 00000000000..52aaea48645 --- /dev/null +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/PRINTING.jsh @@ -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 --git a/langtools/test/jdk/jshell/EditorTestBase.java b/langtools/test/jdk/jshell/EditorTestBase.java index f611d646581..074b4a5bd14 100644 --- a/langtools/test/jdk/jshell/EditorTestBase.java +++ b/langtools/test/jdk/jshell/EditorTestBase.java @@ -219,7 +219,7 @@ public abstract class EditorTestBase extends ReplToolTesting { 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 --git a/langtools/test/jdk/jshell/ReplToolTesting.java b/langtools/test/jdk/jshell/ReplToolTesting.java index 1880a6720d5..3f776eebb21 100644 --- a/langtools/test/jdk/jshell/ReplToolTesting.java +++ b/langtools/test/jdk/jshell/ReplToolTesting.java @@ -25,6 +25,7 @@ import java.io.ByteArrayOutputStream; 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 @@ public class ReplToolTesting { 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( - "| printf (String,Object...)void") + final static List START_UP_CMD_METHOD = Stream.of() .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 @@ public class ReplToolTesting { 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 class ReplToolTesting { } 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 --git a/langtools/test/jdk/jshell/StartOptionTest.java b/langtools/test/jdk/jshell/StartOptionTest.java index e4e95b059eb..31ae46d194c 100644 --- a/langtools/test/jdk/jshell/StartOptionTest.java +++ b/langtools/test/jdk/jshell/StartOptionTest.java @@ -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 @@ public class StartOptionTest { 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 class StartOptionTest { 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 --git a/langtools/test/jdk/jshell/ToolBasicTest.java b/langtools/test/jdk/jshell/ToolBasicTest.java index 565ee3d5cee..74d074d444f 100644 --- a/langtools/test/jdk/jshell/ToolBasicTest.java +++ b/langtools/test/jdk/jshell/ToolBasicTest.java @@ -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 * @summary Tests for Basic tests for REPL tool * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -310,10 +310,10 @@ public class ToolBasicTest extends ReplToolTesting { (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 +385,16 @@ public class ToolBasicTest extends ReplToolTesting { } } + 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 --git a/langtools/test/jdk/jshell/ToolCommandOptionTest.java b/langtools/test/jdk/jshell/ToolCommandOptionTest.java index 2f1182a79a4..05a355d07f4 100644 --- a/langtools/test/jdk/jshell/ToolCommandOptionTest.java +++ b/langtools/test/jdk/jshell/ToolCommandOptionTest.java @@ -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 @@ public class ToolCommandOptionTest extends ReplToolTesting { (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 @@ public class ToolCommandOptionTest extends ReplToolTesting { "| 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 --git a/langtools/test/jdk/jshell/ToolLocalSimpleTest.java b/langtools/test/jdk/jshell/ToolLocalSimpleTest.java index 45fb6e9bc9d..73ac634be21 100644 --- a/langtools/test/jdk/jshell/ToolLocalSimpleTest.java +++ b/langtools/test/jdk/jshell/ToolLocalSimpleTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8168615 + * @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 @@ -68,6 +68,15 @@ public class ToolLocalSimpleTest extends ToolSimpleTest { ); } + @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"}, diff --git a/langtools/test/jdk/jshell/ToolSimpleTest.java b/langtools/test/jdk/jshell/ToolSimpleTest.java index 7db7a8c49f5..30955abc149 100644 --- a/langtools/test/jdk/jshell/ToolSimpleTest.java +++ b/langtools/test/jdk/jshell/ToolSimpleTest.java @@ -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 * @summary Simple jshell tool tests * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -391,8 +391,8 @@ public class ToolSimpleTest extends ReplToolTesting { 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) ); @@ -417,8 +417,8 @@ public class ToolSimpleTest extends ReplToolTesting { 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) ); @@ -427,16 +427,18 @@ public class ToolSimpleTest extends ReplToolTesting { @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"), @@ -448,9 +450,9 @@ public class ToolSimpleTest extends ReplToolTesting { 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", @@ -493,6 +495,22 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @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( From a84bef19f0a38123cf0783753eb24f458de5f531 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Wed, 21 Dec 2016 15:40:08 -0800 Subject: [PATCH 059/121] 8171132: Improve class reading of invalid or out-of-range ConstantValue attributes Reviewed-by: mcimadamore --- .../com/sun/tools/javac/code/TypeTag.java | 17 ++ .../com/sun/tools/javac/code/Types.java | 11 +- .../com/sun/tools/javac/jvm/ClassReader.java | 41 +++- .../tools/javac/resources/compiler.properties | 8 + .../classreader/8171132/BadConstantValue.java | 226 ++++++++++++++++++ .../tools/javac/diags/examples.not-yet.txt | 2 + 6 files changed, 294 insertions(+), 11 deletions(-) create mode 100644 langtools/test/tools/javac/classreader/8171132/BadConstantValue.java diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java index e9ea3687cb8..6dd1ea4b6b8 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeTag.java @@ -241,4 +241,21 @@ public enum TypeTag { } } + /** 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 --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java index f9e1174fb43..117532b356a 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java @@ -2050,19 +2050,12 @@ public class Types { 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) - return true; - break; case SHORT: - if (Short.MIN_VALUE <= value && value <= Short.MAX_VALUE) + case INT: + if (s.getTag().checkRange(value)) return true; break; - case INT: - return true; case CLASS: switch (unboxedType(s).getTag()) { case BYTE: diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java index 105ed20c485..ca04575328c 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -1028,8 +1028,45 @@ public class ClassReader { 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 --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 7daeb354da9..8e82787250b 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1913,6 +1913,14 @@ compiler.misc.module.info.invalid.super.class=\ 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 diff --git a/langtools/test/tools/javac/classreader/8171132/BadConstantValue.java b/langtools/test/tools/javac/classreader/8171132/BadConstantValue.java new file mode 100644 index 00000000000..aa2cdac6501 --- /dev/null +++ b/langtools/test/tools/javac/classreader/8171132/BadConstantValue.java @@ -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 --git a/langtools/test/tools/javac/diags/examples.not-yet.txt b/langtools/test/tools/javac/diags/examples.not-yet.txt index be5c0aee59f..1e8000c2d15 100644 --- a/langtools/test/tools/javac/diags/examples.not-yet.txt +++ b/langtools/test/tools/javac/diags/examples.not-yet.txt @@ -43,6 +43,8 @@ compiler.err.unsupported.cross.fp.lit # Scanner: host system d 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 From 7ea0f598497bbb17e4f8019f730854511fe9ca4f Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Wed, 21 Dec 2016 22:40:50 -0800 Subject: [PATCH 060/121] 8171897: Remove third party readme files left from JDK-8169925 Reviewed-by: erikj --- corba/THIRD_PARTY_README | 3605 -------------------------------------- 1 file changed, 3605 deletions(-) delete mode 100644 corba/THIRD_PARTY_README diff --git a/corba/THIRD_PARTY_README b/corba/THIRD_PARTY_README deleted file mode 100644 index a93b35b994c..00000000000 --- a/corba/THIRD_PARTY_README +++ /dev/null @@ -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 --- - -------------------------------------------------------------------------------- - From 0f8a6409a68303812375620b54c64fa8a874bdbb Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Wed, 21 Dec 2016 22:41:18 -0800 Subject: [PATCH 061/121] 8171897: Remove third party readme files left from JDK-8169925 Reviewed-by: erikj --- hotspot/THIRD_PARTY_README | 3605 ------------------------------------ 1 file changed, 3605 deletions(-) delete mode 100644 hotspot/THIRD_PARTY_README diff --git a/hotspot/THIRD_PARTY_README b/hotspot/THIRD_PARTY_README deleted file mode 100644 index a93b35b994c..00000000000 --- a/hotspot/THIRD_PARTY_README +++ /dev/null @@ -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 --- - -------------------------------------------------------------------------------- - From 52e4b08b246313cec378d77b1d75ea898f406dca Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:00 +0000 Subject: [PATCH 062/121] Added tag jdk-9+150 for changeset d706d00a2719 --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 5f49404eb68..f3f827b60b8 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -392,3 +392,4 @@ a22e2671d88f6b22a4aa82e3966986542ed2a381 jdk-9+146 5f6920274c48eb00d31afee6c034826a754c13d9 jdk-9+147 3ffc3e886c74736e387f3685e86b557cdea706c8 jdk-9+148 b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149 +6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150 From 4722c7943a8b2f88c19085af11a14d3e5061c0e8 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:00 +0000 Subject: [PATCH 063/121] Added tag jdk-9+150 for changeset 34c1d69e6fc6 --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index a1d96e43021..bfc73616f2e 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -392,3 +392,4 @@ ecd74b41ab65bf228837b5bdf99690638d55425c jdk-9+146 dc49e0922a8e4387cbf8670bbe1dc51c9874b74b jdk-9+147 f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148 00b19338e505690abe93d5995ed74a473d969c2c jdk-9+149 +9205e980062a5c4530b51021c6e274025f4ccbdf jdk-9+150 From 30e198532c1689d67d875dd9076ba2a17d6baf17 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:01 +0000 Subject: [PATCH 064/121] Added tag jdk-9+150 for changeset 29142a56c193 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 7b65fd37ac5..524390321fc 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -552,3 +552,4 @@ a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146 132a72c782071cc11ab25cc7c9ee167c3632fea4 jdk-9+147 5e4e893520ecdbd517c6ed6375f0885664fe62c4 jdk-9+148 30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149 +98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150 From 832b88666cc0581afa3aa505de789def962ba7f0 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:02 +0000 Subject: [PATCH 065/121] Added tag jdk-9+150 for changeset 35843e3d5ef1 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index f45d26bef7c..8e32dd70b68 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -392,3 +392,4 @@ ce81d03ad7320dca3d673374c1a33bc0efd9136a jdk-9+143 149559dd882ddca2c78355641a46db9138b12763 jdk-9+147 c45db75bfe8bc20bb80b4a009ae3f69c9cd2d885 jdk-9+148 5978df8bfa3894f2b3d07b7256f25f78dffb1f9c jdk-9+149 +f85154af719f99a3b4d81b67a8b4c18a650d10f9 jdk-9+150 From d18304a13e937f9e9d693cff55267d8fcc54063b Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:02 +0000 Subject: [PATCH 066/121] Added tag jdk-9+150 for changeset 2287cac87b3d --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 83940464072..b433013fe05 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -395,3 +395,4 @@ b2c18f755228d1d19a86cd7d5fa1abb6b1495dfb jdk-9+141 be37411855de5b76035bef6f1b0d90d8607f2205 jdk-9+147 c8c9c334743caf8155c9809b6b4ac315d3a66476 jdk-9+148 72554d319b474b3636c7d02fe3c110254d111b1a jdk-9+149 +77e4e30d9d111272cd4a45a2203e8f570d40b12e jdk-9+150 From aea31df03a4bcab45974137356baeed7efa8f40b Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 22 Dec 2016 08:26:04 +0000 Subject: [PATCH 067/121] Added tag jdk-9+150 for changeset 0ec334969fce --- nashorn/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/nashorn/.hgtags b/nashorn/.hgtags index 66da00edcbd..58b0ff4ec14 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -383,3 +383,4 @@ a7f21ee6ed30695a6de14e74035d2857a754f62b jdk-9+144 9e86d6383456a1eb0298c72bb9ca363939ad90cf jdk-9+147 0a4bc2f049132ddc20985565bb41b2be8a458dda jdk-9+148 c281306d33d83c92e0d870ace385d5f99678d7e7 jdk-9+149 +ace1d994bca775d6545a4c874ae73d1dfc9ec18b jdk-9+150 From cc7b5951458b48dde8594e76d8f54d07a3673acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Thu, 22 Dec 2016 16:51:07 +0100 Subject: [PATCH 068/121] 8170977: SparseArrayData should not grow its underlying dense array data Reviewed-by: jlaskey, attila --- .../jdk/nashorn/internal/runtime/arrays/SparseArrayData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java index 5be96e8ca55..5ea891058eb 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java @@ -37,7 +37,7 @@ import jdk.nashorn.internal.runtime.ScriptRuntime; */ 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 @@ class SparseArrayData extends ArrayData { 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; } From 332a546742317bb74aa73a773a02be82998f685a Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 22 Dec 2016 18:13:41 +0100 Subject: [PATCH 069/121] 8171849: Collection and Queue conversions not prioritized for Arrays Reviewed-by: hannesw, jlaskey --- .../runtime/linker/NashornLinker.java | 14 ++-- nashorn/test/script/basic/JDK-8171849.js | 47 ++++++++++++ .../models/ArrayConversionPreferences.java | 74 +++++++++++++++++++ 3 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 nashorn/test/script/basic/JDK-8171849.js create mode 100644 nashorn/test/src/jdk/nashorn/test/models/ArrayConversionPreferences.java diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java index af23b6d1fe0..5f6f72c61df 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornLinker.java @@ -285,15 +285,15 @@ final class NashornLinker implements TypeBasedGuardingDynamicLinker, GuardingTyp @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 @@ final class NashornLinker implements TypeBasedGuardingDynamicLinker, GuardingTyp 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 --git a/nashorn/test/script/basic/JDK-8171849.js b/nashorn/test/script/basic/JDK-8171849.js new file mode 100644 index 00000000000..febc97cee11 --- /dev/null +++ b/nashorn/test/script/basic/JDK-8171849.js @@ -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. + */ + +/** + * JDK-8171849: Collection and Queue conversions not prioritized for Arrays + * + * @test + * @run + */ + +var acp = new (Java.type("jdk.nashorn.test.models.ArrayConversionPreferences")) + +var a = [1, "", {}] + +Assert.assertTrue(acp.testCollectionOverMap(a)) +Assert.assertTrue(acp.testCollectionOverArray(a)) +Assert.assertTrue(acp.testListOverMap(a)) +Assert.assertTrue(acp.testListOverArray(a)) +Assert.assertTrue(acp.testListOverCollection(a)) +Assert.assertTrue(acp.testQueueOverMap(a)) +Assert.assertTrue(acp.testQueueOverArray(a)) +Assert.assertTrue(acp.testQueueOverCollection(a)) +Assert.assertTrue(acp.testDequeOverMap(a)) +Assert.assertTrue(acp.testDequeOverArray(a)) +Assert.assertTrue(acp.testDequeOverCollection(a)) +Assert.assertTrue(acp.testDequeOverQueue(a)) +Assert.assertTrue(acp.testArrayOverMap(a)) diff --git a/nashorn/test/src/jdk/nashorn/test/models/ArrayConversionPreferences.java b/nashorn/test/src/jdk/nashorn/test/models/ArrayConversionPreferences.java new file mode 100644 index 00000000000..a88f3c37b2f --- /dev/null +++ b/nashorn/test/src/jdk/nashorn/test/models/ArrayConversionPreferences.java @@ -0,0 +1,74 @@ +/* + * 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.nashorn.test.models; + +import java.util.Collection; +import java.util.Deque; +import java.util.List; +import java.util.Map; +import java.util.Queue; + +public class ArrayConversionPreferences { + public boolean testCollectionOverMap(final Collection x) { return true; } + public boolean testCollectionOverMap(final Map x) { return false; } + + public boolean testCollectionOverArray(final Collection x) { return true; } + public boolean testCollectionOverArray(final Object[] x) { return false; } + + public boolean testListOverMap(final List x) { return true; } + public boolean testListOverMap(final Map x) { return false; } + + public boolean testListOverArray(final List x) { return true; } + public boolean testListOverArray(final Object[] x) { return false; } + + public boolean testListOverCollection(final List x) { return true; } + public boolean testListOverCollection(final Collection x) { return false; } + + public boolean testQueueOverMap(final Queue x) { return true; } + public boolean testQueueOverMap(final Map x) { return false; } + + public boolean testQueueOverArray(final Queue x) { return true; } + public boolean testQueueOverArray(final Object[] x) { return false; } + + public boolean testQueueOverCollection(final Queue x) { return true; } + public boolean testQueueOverCollection(final Collection x) { return false; } + + public boolean testDequeOverMap(final Deque x) { return true; } + public boolean testDequeOverMap(final Map x) { return false; } + + public boolean testDequeOverArray(final Deque x) { return true; } + public boolean testDequeOverArray(final Object[] x) { return false; } + + public boolean testDequeOverCollection(final Deque x) { return true; } + public boolean testDequeOverCollection(final Collection x) { return false; } + + public boolean testDequeOverQueue(final Deque x) { return true; } + public boolean testDequeOverQueue(final Queue x) { return false; } + + public boolean testArrayOverMap(final Object[] x) { return true; } + public boolean testArrayOverMap(final Map x) { return false; } +} + From 6a15784860258904f289df406a672c7b38df9005 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:11 +0000 Subject: [PATCH 070/121] Added tag jdk-9+151 for changeset fb59ca170643 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index 223232e63bc..0b80fe4f688 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -393,3 +393,4 @@ c41140100bf1e5c10c7b8f3bde91c16eff7485f5 jdk-9+147 9098b2b9d997d65af0026fc2f39cf75234e26bc5 jdk-9+148 5a846396a24c7aff01d6a8feaa7afc0a6369f04d jdk-9+149 71e198ef3839045e829a879af1d709be16ab0f88 jdk-9+150 +d27bab22ff62823902d93d1d35ca397cfd50d059 jdk-9+151 From c9b965110fd4fd15031b29a89f930ea0a7d6ac7b Mon Sep 17 00:00:00 2001 From: Abjihit Roy Date: Thu, 22 Dec 2016 23:35:52 +0530 Subject: [PATCH 071/121] 8164923: Error in the documentation for java.lang.Random Reviewed-by: rriggs --- jdk/src/java.base/share/classes/java/util/Random.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/util/Random.java b/jdk/src/java.base/share/classes/java/util/Random.java index 78e4953bfe8..8db097788ae 100644 --- a/jdk/src/java.base/share/classes/java/util/Random.java +++ b/jdk/src/java.base/share/classes/java/util/Random.java @@ -187,7 +187,7 @@ class Random implements java.io.Serializable { * * 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 @@ class Random implements java.io.Serializable { * }} * 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}. From f83c435f2f2c1e359fd690b0f8d6fad341bfe7b2 Mon Sep 17 00:00:00 2001 From: Srinivas Dama Date: Thu, 22 Dec 2016 10:36:34 -0800 Subject: [PATCH 072/121] 8151994: test/script/basic/JDK-8141209.js fails Added @fork tag and moved test case to trusted directory Reviewed-by: jlaskey, hannesw --- nashorn/test/script/{basic => trusted}/JDK-8141209.js | 2 +- nashorn/test/script/{basic => trusted}/JDK-8141209.js.EXPECTED | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename nashorn/test/script/{basic => trusted}/JDK-8141209.js (99%) rename nashorn/test/script/{basic => trusted}/JDK-8141209.js.EXPECTED (100%) diff --git a/nashorn/test/script/basic/JDK-8141209.js b/nashorn/test/script/trusted/JDK-8141209.js similarity index 99% rename from nashorn/test/script/basic/JDK-8141209.js rename to nashorn/test/script/trusted/JDK-8141209.js index 6d316e3425e..192b073f6d3 100644 --- a/nashorn/test/script/basic/JDK-8141209.js +++ b/nashorn/test/script/trusted/JDK-8141209.js @@ -25,8 +25,8 @@ * JDK-8141209 : $EXEC should allow streaming * * @test + * @fork * @option -scripting - * @runif os.not.windows * @run */ diff --git a/nashorn/test/script/basic/JDK-8141209.js.EXPECTED b/nashorn/test/script/trusted/JDK-8141209.js.EXPECTED similarity index 100% rename from nashorn/test/script/basic/JDK-8141209.js.EXPECTED rename to nashorn/test/script/trusted/JDK-8141209.js.EXPECTED From 88f43b3b3ca4b9d3208ffb154070ec45ed202fe8 Mon Sep 17 00:00:00 2001 From: Christoph Langer Date: Fri, 23 Dec 2016 07:54:05 +0100 Subject: [PATCH 073/121] 8171906: Changes for 8148023 break AIX build Reviewed-by: goetz, bpb --- .../unix/native/libjava/UnixFileSystem_md.c | 29 ++++++++++++------- .../java.base/unix/native/libjava/childproc.c | 21 ++++++++------ .../native/libnio/fs/UnixNativeDispatcher.c | 10 +++++++ 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c index d204c1b3c78..77fe35dcee0 100644 --- a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c +++ b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c @@ -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(_ALLBSD_SOURCE) -#define dirent64 dirent -#define readdir64_r readdir_r -#define stat64 stat -#ifndef MACOSX -#define statvfs64 statvfs +#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 #endif /* -- Field IDs -- */ diff --git a/jdk/src/java.base/unix/native/libjava/childproc.c b/jdk/src/java.base/unix/native/libjava/childproc.c index 3f2932f1d50..7af19e4f369 100644 --- a/jdk/src/java.base/unix/native/libjava/childproc.c +++ b/jdk/src/java.base/unix/native/libjava/childproc.c @@ -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 @@ isAsciiDigit(char c) 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 --git a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c index 16166a5f83b..0e7e2563994 100644 --- a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c +++ b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c @@ -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 @@ Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this) 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 */ From 7516f0284ca0b6a175588c10df16de453bef9f18 Mon Sep 17 00:00:00 2001 From: Vyom Tewari Date: Fri, 23 Dec 2016 13:53:22 +0530 Subject: [PATCH 074/121] 8168840: InetAddress.getByName() throws java.net.UnknownHostException no such interface when used with virtual interfaces on Solaris Reviewed-by: chegar, clanger --- .../unix/native/libnet/NetworkInterface.c | 24 +++++++- .../SubNetworkInterfaceTest.java | 57 +++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java diff --git a/jdk/src/java.base/unix/native/libnet/NetworkInterface.c b/jdk/src/java.base/unix/native/libnet/NetworkInterface.c index d03e150a4f8..80571100666 100644 --- a/jdk/src/java.base/unix/native/libnet/NetworkInterface.c +++ b/jdk/src/java.base/unix/native/libnet/NetworkInterface.c @@ -219,6 +219,8 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0 netif *ifs, *curr; jboolean isCopy; const char* name_utf; + char *colonP; + char searchName[IFNAMESIZE]; jobject obj = NULL; if (name != NULL) { @@ -239,15 +241,33 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0 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 --git a/jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java b/jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java new file mode 100644 index 00000000000..00193ffca48 --- /dev/null +++ b/jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java @@ -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); + } + } + } +} From b0e59adb6e40f1921ccdc4a608d03f1deada7626 Mon Sep 17 00:00:00 2001 From: Roger Riggs Date: Fri, 23 Dec 2016 13:42:21 -0500 Subject: [PATCH 075/121] 8171940: Incorrect statement about an absolute value of months unit after period's normalization Reviewed-by: bpb --- jdk/src/java.base/share/classes/java/time/Period.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/time/Period.java b/jdk/src/java.base/share/classes/java/time/Period.java index e93d8a35d99..667a7bf04f8 100644 --- a/jdk/src/java.base/share/classes/java/time/Period.java +++ b/jdk/src/java.base/share/classes/java/time/Period.java @@ -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 @@ public final class Period * 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". *

From 9fd7d77410ec885c741aefc3ef0541f5e482cb13 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 23 Dec 2016 13:43:21 -0800 Subject: [PATCH 076/121] 8171978: docs should use CSS-friendly instead of Reviewed-by: tbell --- make/Javadoc.gmk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make/Javadoc.gmk b/make/Javadoc.gmk index c8e0a4484c9..362352d5b03 100644 --- a/make/Javadoc.gmk +++ b/make/Javadoc.gmk @@ -148,10 +148,10 @@ $(CORE_PACKAGES_LIST_FILE): $(CORE_PACKAGES_VARDEPS_FILE) # 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 From 0081872919f53882bdee8f89d3ad3a7e67410749 Mon Sep 17 00:00:00 2001 From: Peter Levart Date: Sun, 25 Dec 2016 19:29:06 +0100 Subject: [PATCH 077/121] 8062389: Class.getMethod() is inconsistent with Class.getMethods() results 8029459: (reflect) getMethods returns methods that are not members of the class 8061950: Class.getMethods() exhibits quadratic time complexity Reviewed-by: alanb, mchung, psandoz, dfuchs, darcy --- .../share/classes/java/lang/Class.java | 553 +++---- .../classes/java/lang/PublicMethods.java | 272 ++++ .../java/lang/reflect/Constructor.java | 5 + .../classes/java/lang/reflect/Executable.java | 4 + .../classes/java/lang/reflect/Method.java | 5 + .../java/lang/reflect/ReflectAccess.java | 4 + .../internal/reflect/LangReflectAccess.java | 3 + .../internal/reflect/ReflectionFactory.java | 6 + .../FilterNotMostSpecific.java | 306 ++-- .../lang/reflect/PublicMethods/Case1.results | 1379 +++++++++++++++++ .../PublicMethods/PublicMethodsTest.java | 529 +++++++ 11 files changed, 2548 insertions(+), 518 deletions(-) create mode 100644 jdk/src/java.base/share/classes/java/lang/PublicMethods.java create mode 100644 jdk/test/java/lang/reflect/PublicMethods/Case1.results create mode 100644 jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java diff --git a/jdk/src/java.base/share/classes/java/lang/Class.java b/jdk/src/java.base/share/classes/java/lang/Class.java index 4953e053b44..9973194fed2 100644 --- a/jdk/src/java.base/share/classes/java/lang/Class.java +++ b/jdk/src/java.base/share/classes/java/lang/Class.java @@ -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.Field; 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.net.URL; 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.LinkedHashMap; 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 @@ public final class Class implements java.io.Serializable, } 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 @@ public final class Class implements java.io.Serializable, * @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 @@ public final class Class implements java.io.Serializable, 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 @@ public final class Class implements java.io.Serializable, * 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 @@ public final class Class implements java.io.Serializable, * 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 @@ -1905,7 +1932,7 @@ public final class Class implements java.io.Serializable, if (field == null) { throw new NoSuchFieldException(name); } - return field; + return getReflectionFactory().copyField(field); } @@ -1919,47 +1946,69 @@ public final class Class implements java.io.Serializable, * 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()}. * - *

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. + *

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. * - *

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 + *

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

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). + *
+ * + * @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 @@ -1984,11 +2033,11 @@ public final class Class implements java.io.Serializable, public Method getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException { 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 +2053,8 @@ public final class Class implements java.io.Serializable, * "<init>"or "<clinit>". */ Method getMethodOrNull(String name, Class... parameterTypes) { - return getMethod0(name, parameterTypes, true); + Method method = getMethod0(name, parameterTypes); + return method == null ? null : getReflectionFactory().copyMethod(method); } @@ -2041,7 +2091,8 @@ public final class Class implements java.io.Serializable, 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)); } @@ -2288,7 +2339,7 @@ public final class Class implements java.io.Serializable, if (field == null) { throw new NoSuchFieldException(name); } - return field; + return getReflectionFactory().copyField(field); } @@ -2348,7 +2399,7 @@ public final class Class implements java.io.Serializable, if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return method; + return getReflectionFactory().copyMethod(method); } @@ -2394,7 +2445,8 @@ public final class Class implements java.io.Serializable, 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 +3056,6 @@ public final class Class implements java.io.Serializable, 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 +3068,29 @@ public final class Class implements java.io.Serializable, } // No cached value available; compute value recursively. - // Start by fetching public declared methods - MethodArray methods = new MethodArray(); - { - Method[] tmp = privateGetDeclaredMethods(true); - methods.addAll(tmp); + // Start by fetching public declared methods... + PublicMethods pms = new PublicMethods(); + for (Method m : privateGetDeclaredMethods(/* publicOnly */ true)) { + pms.merge(m); } - // 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()); - } - 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 +3102,20 @@ public final class Class implements java.io.Serializable, // 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 +3129,7 @@ public final class Class implements java.io.Serializable, 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 +3147,85 @@ public final class Class implements java.io.Serializable, 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) + 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(); + } + + // 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; + } - // Not found on class or superclass directly - interfaceCandidates.removeLessSpecifics(); - return interfaceCandidates.getFirst(); // may be null - } - - 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; - } - // Search superclass's methods - if (!isInterface()) { - Class c = getSuperclass(); - if (c != null) { - if ((res = c.getMethod0(name, parameterTypes, true)) != null) { - return res; - } - } - } - // 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; + // 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); + } + + // ...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 --git a/jdk/src/java.base/share/classes/java/lang/PublicMethods.java b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java new file mode 100644 index 00000000000..02e0d051b7d --- /dev/null +++ b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java @@ -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 --git a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java index d086879a101..f64e84f7f37 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java @@ -240,6 +240,11 @@ public final class Constructor extends Executable { } + @Override + Class[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */ diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java index dce00fdba2f..ae94a58f06c 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java @@ -222,6 +222,10 @@ public abstract class Executable extends AccessibleObject */ 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 --git a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java index 54ef08ebe8a..027a711d3e1 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java @@ -290,6 +290,11 @@ public final class Method extends Executable { } else { return getReturnType();} } + @Override + Class[] getSharedParameterTypes() { + return parameterTypes; + } + /** * {@inheritDoc} */ diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java index 2a6abd3d682..e34b019b67f 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java @@ -132,6 +132,10 @@ class ReflectAccess implements jdk.internal.reflect.LangReflectAccess { 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 --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java index 0fed09ff0c4..7637b4b6a45 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java @@ -96,6 +96,9 @@ public interface LangReflectAccess { /** 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 --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java index c6777c37827..e85022939e7 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java @@ -345,6 +345,12 @@ public class ReflectionFactory { return langReflectAccess().getExecutableTypeAnnotationBytes(ex); } + /** Gets the shared array of parameter types of an Executable. + */ + public Class[] getExecutableSharedParameterTypes(Executable ex) { + return langReflectAccess().getExecutableSharedParameterTypes(ex); + } + //-------------------------------------------------------------------------- // // Routines used by serialization diff --git a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java index 4a3d89836db..1992f31d5de 100644 --- a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java +++ b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java @@ -36,9 +36,8 @@ import java.util.Arrays; 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 @@ public class FilterNotMostSpecific { 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 class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { } 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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { @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 @@ public class FilterNotMostSpecific { @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=N2DN.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) 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, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) 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 @@ public class FilterNotMostSpecific { 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 @@ public class FilterNotMostSpecific { 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... - @MethodDesc(name="m", declaringClass=B1C.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 B1 { Object m(); } + interface B2A extends B1 { Map m(); } + interface B2B extends B1 { HashMap m(); } - @MethodDesc(name="m", declaringClass=B2.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=B2.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="m", declaringClass=B2.class, - kind=MethodKind.DEFAULT) - interface B2 extends B1C { HashMap m(); } + interface B3A extends B2A { HashMap m(); } - @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 B4A extends B3A { HashMap m(); } - // 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=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) - @MethodDesc(name="m", declaringClass=B1C.class) //HashMap - interface B3B extends B2, B1C {} + interface B5A2 extends B4A, B1 {} + + @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 B5A4A extends B4A, B3A {} + + // ... + most specific return type for getMethod from two unrelated interfaces + + @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 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", parameterTypes = {int.class}, declaringClass=A2A.class, + isGetMethodReturn=true) + @MethodDesc(name="m", parameterTypes = {int.class, int.class}, 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) interface A3A extends A1, A2A {} - @MethodDesc(name="m", declaringClass=A1.class, + @MethodDesc(name="m", parameterTypes = {}, 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}, declaringClass=A2B.class, + isGetMethodReturn=true) + @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 @@ public class FilterNotMostSpecific { { 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 --git a/jdk/test/java/lang/reflect/PublicMethods/Case1.results b/jdk/test/java/lang/reflect/PublicMethods/Case1.results new file mode 100644 index 00000000000..a50d8623a55 --- /dev/null +++ b/jdk/test/java/lang/reflect/PublicMethods/Case1.results @@ -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 --git a/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java new file mode 100644 index 00000000000..381cb60c6a9 --- /dev/null +++ b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java @@ -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")) + ); + } + }); + } +} From 07c66ef57239d73ff09c26f5a5b440e38666e36b Mon Sep 17 00:00:00 2001 From: Abjihit Roy Date: Mon, 26 Dec 2016 22:57:26 +0530 Subject: [PATCH 078/121] 8169482: java.time.DateTimeFormatter javadoc: F is not week-of-month Reviewed-by: rriggs --- .../share/classes/java/time/format/DateTimeFormatter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java index a3f903a7d9a..0588db590ff 100644 --- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java @@ -292,7 +292,7 @@ import java.util.Set; * 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 From f661cea33c81d23a184c069fef08cb0c6ab394e7 Mon Sep 17 00:00:00 2001 From: Abjihit Roy Date: Mon, 26 Dec 2016 23:09:54 +0530 Subject: [PATCH 079/121] 8170566: Incorrect phrase usage in javadocs documentation Reviewed-by: rriggs --- .../share/classes/java/util/function/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/java.base/share/classes/java/util/function/package-info.java b/jdk/src/java.base/share/classes/java/util/function/package-info.java index 31a1c46f7f8..905fa7d9b38 100644 --- a/jdk/src/java.base/share/classes/java/util/function/package-info.java +++ b/jdk/src/java.base/share/classes/java/util/function/package-info.java @@ -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 From 8249bf752450d450b8e04ca06ddccd0d5495d23f Mon Sep 17 00:00:00 2001 From: Abjihit Roy Date: Mon, 26 Dec 2016 23:15:06 +0530 Subject: [PATCH 080/121] 8170653: The javadoc of ZoneRules.previousTransition() is wrong Reviewed-by: rriggs --- jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java b/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java index ed2330f38ef..f2dee70fee6 100644 --- a/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java +++ b/jdk/src/java.base/share/classes/java/time/zone/ZoneRules.java @@ -871,13 +871,13 @@ public final class ZoneRules implements Serializable { /** * 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) { From 03b01bf748dd006372984a8d63e4e101696c937f Mon Sep 17 00:00:00 2001 From: Abjihit Roy Date: Mon, 26 Dec 2016 23:20:57 +0530 Subject: [PATCH 081/121] 8171348: Incorrect documentation for DateTimeFormatter letter 'k' Reviewed-by: rriggs --- .../share/classes/java/time/format/DateTimeFormatter.java | 2 +- .../classes/java/time/format/DateTimeFormatterBuilder.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java index 0588db590ff..c705fcafe88 100644 --- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatter.java @@ -297,7 +297,7 @@ import java.util.Set; * 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 --git a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java index 0feafd41d09..8fe990a4f05 100644 --- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java @@ -1486,12 +1486,12 @@ public final class DateTimeFormatterBuilder { * 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 From 9de0bf15ef90ec6673aa3e3852f8ae37a9e71ad1 Mon Sep 17 00:00:00 2001 From: Peter Levart Date: Mon, 26 Dec 2016 19:38:27 +0100 Subject: [PATCH 082/121] 8171988: Backout of fix for 8062389, 8029459, 8061950 Reviewed-by: chegar --- .../share/classes/java/lang/Class.java | 551 ++++--- .../classes/java/lang/PublicMethods.java | 272 ---- .../java/lang/reflect/Constructor.java | 5 - .../classes/java/lang/reflect/Executable.java | 4 - .../classes/java/lang/reflect/Method.java | 5 - .../java/lang/reflect/ReflectAccess.java | 4 - .../internal/reflect/LangReflectAccess.java | 3 - .../internal/reflect/ReflectionFactory.java | 6 - .../FilterNotMostSpecific.java | 304 ++-- .../lang/reflect/PublicMethods/Case1.results | 1379 ----------------- .../PublicMethods/PublicMethodsTest.java | 529 ------- 11 files changed, 516 insertions(+), 2546 deletions(-) delete mode 100644 jdk/src/java.base/share/classes/java/lang/PublicMethods.java delete mode 100644 jdk/test/java/lang/reflect/PublicMethods/Case1.results delete mode 100644 jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java diff --git a/jdk/src/java.base/share/classes/java/lang/Class.java b/jdk/src/java.base/share/classes/java/lang/Class.java index 9973194fed2..4953e053b44 100644 --- a/jdk/src/java.base/share/classes/java/lang/Class.java +++ b/jdk/src/java.base/share/classes/java/lang/Class.java @@ -26,6 +26,8 @@ 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; @@ -40,6 +42,7 @@ import java.lang.reflect.Field; 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; @@ -51,6 +54,7 @@ import java.net.URL; 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; @@ -58,15 +62,19 @@ import java.util.LinkedHashMap; 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; @@ -524,8 +532,7 @@ public final class Class implements java.io.Serializable, } try { Class[] empty = {}; - final Constructor c = getReflectionFactory().copyConstructor( - getConstructor0(empty, Member.DECLARED)); + final Constructor c = 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 @@ -1017,11 +1024,6 @@ public final class Class implements java.io.Serializable, * @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 @@ -1032,8 +1034,8 @@ public final class Class implements java.io.Serializable, interfaces = getInterfaces0(); rd.interfaces = interfaces; } - // defensively copy if requested - return cloneArray ? interfaces.clone() : interfaces; + // defensively copy before handing over to user code + return interfaces.clone(); } } @@ -1765,6 +1767,15 @@ public final class Class implements java.io.Serializable, * 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 @@ -1777,54 +1788,16 @@ public final class Class implements java.io.Serializable, * has length 0. (Note that a {@code Class} object which represents a class * always has public methods, inherited from {@code Object}.) * - *

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

    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 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 @@ -1932,7 +1905,7 @@ public final class Class implements java.io.Serializable, if (field == null) { throw new NoSuchFieldException(name); } - return getReflectionFactory().copyField(field); + return field; } @@ -1946,69 +1919,47 @@ public final class Class implements java.io.Serializable, * order. If {@code parameterTypes} is {@code null}, it is * treated as if it were an empty array. * - *

    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 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 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. + *

    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. * - *

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

    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). - *
    - * - * @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 + *

    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 * 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. This method would return the - * overriding method as it would have a more specific return type. + * 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. * * @param name the name of the method * @param parameterTypes the list of parameters @@ -2033,11 +1984,11 @@ public final class Class implements java.io.Serializable, public Method getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); - Method method = getMethod0(name, parameterTypes); + Method method = getMethod0(name, parameterTypes, true); if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return getReflectionFactory().copyMethod(method); + return method; } /** @@ -2053,8 +2004,7 @@ public final class Class implements java.io.Serializable, * "<init>"or "<clinit>". */ Method getMethodOrNull(String name, Class... parameterTypes) { - Method method = getMethod0(name, parameterTypes); - return method == null ? null : getReflectionFactory().copyMethod(method); + return getMethod0(name, parameterTypes, true); } @@ -2091,8 +2041,7 @@ public final class Class implements java.io.Serializable, public Constructor getConstructor(Class... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); - return getReflectionFactory().copyConstructor( - getConstructor0(parameterTypes, Member.PUBLIC)); + return getConstructor0(parameterTypes, Member.PUBLIC); } @@ -2339,7 +2288,7 @@ public final class Class implements java.io.Serializable, if (field == null) { throw new NoSuchFieldException(name); } - return getReflectionFactory().copyField(field); + return field; } @@ -2399,7 +2348,7 @@ public final class Class implements java.io.Serializable, if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } - return getReflectionFactory().copyMethod(method); + return method; } @@ -2445,8 +2394,7 @@ public final class Class implements java.io.Serializable, public Constructor getDeclaredConstructor(Class... parameterTypes) throws NoSuchMethodException, SecurityException { checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true); - return getReflectionFactory().copyConstructor( - getConstructor0(parameterTypes, Member.DECLARED)); + return getConstructor0(parameterTypes, Member.DECLARED); } /** @@ -3056,6 +3004,180 @@ public final class Class implements java.io.Serializable, 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. @@ -3068,29 +3190,51 @@ public final class Class implements java.io.Serializable, } // No cached value available; compute value recursively. - // Start by fetching public declared methods... - PublicMethods pms = new PublicMethods(); - for (Method m : privateGetDeclaredMethods(/* publicOnly */ true)) { - pms.merge(m); + // Start by fetching public declared methods + MethodArray methods = new MethodArray(); + { + Method[] tmp = privateGetDeclaredMethods(true); + methods.addAll(tmp); } - // ...then recur over superclass methods... - Class sc = getSuperclass(); - if (sc != null) { - for (Method m : sc.privateGetPublicMethods()) { - pms.merge(m); - } + // 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()); } - // ...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); + 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; } } - - res = pms.toArray(); + // Filter out all local methods from inherited ones + for (int i = 0; i < methods.length(); i++) { + Method m = methods.get(i); + inheritedMethods.removeByNameAndDescriptor(m); + } + methods.addAllIfNotPresent(inheritedMethods); + methods.removeLessSpecifics(); + methods.compactAndTrim(); + res = methods.getArray(); if (rd != null) { rd.publicMethods = res; } @@ -3102,20 +3246,17 @@ public final class Class implements java.io.Serializable, // 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().equals(name)) { - return field; + if (field.getName() == internedName) { + return getReflectionFactory().copyField(field); } } return null; } - // 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) { + private Field getField0(String name) throws NoSuchFieldException { // Note: the intent is that the search algorithm this routine // uses be equivalent to the ordering imposed by // privateGetPublicFields(). It fetches only the declared @@ -3129,7 +3270,7 @@ public final class Class implements java.io.Serializable, return res; } // Direct superinterfaces, recursively - Class[] interfaces = getInterfaces(/* cloneArray */ false); + Class[] interfaces = getInterfaces(); for (Class c : interfaces) { if ((res = c.getField0(name)) != null) { return res; @@ -3147,85 +3288,87 @@ public final class Class implements java.io.Serializable, 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().equals(name) - && arrayContentsEq(parameterTypes, - fact.getExecutableSharedParameterTypes(m)) + if (m.getName() == internedName + && arrayContentsEq(parameterTypes, m.getParameterTypes()) && (res == null - || (res.getReturnType() != m.getReturnType() - && res.getReturnType().isAssignableFrom(m.getReturnType())))) + || res.getReturnType().isAssignableFrom(m.getReturnType()))) res = m; } - return res; + + return (res == null ? res : getReflectionFactory().copyMethod(res)); } - 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(); - } - - // 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) { + 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; - } - // 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); - } - - // ...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; + // Not found on class or superclass directly + interfaceCandidates.removeLessSpecifics(); + return interfaceCandidates.getFirst(); // may be null + } + + 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; + } + // Search superclass's methods + if (!isInterface()) { + Class c = getSuperclass(); + if (c != null) { + if ((res = c.getMethod0(name, parameterTypes, true)) != null) { + return res; + } + } + } + // 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; } - // 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, - fact.getExecutableSharedParameterTypes(constructor))) { - return constructor; + constructor.getParameterTypes())) { + return getReflectionFactory().copyConstructor(constructor); } } throw new NoSuchMethodException(getName() + "." + argumentTypesToString(parameterTypes)); diff --git a/jdk/src/java.base/share/classes/java/lang/PublicMethods.java b/jdk/src/java.base/share/classes/java/lang/PublicMethods.java deleted file mode 100644 index 02e0d051b7d..00000000000 --- a/jdk/src/java.base/share/classes/java/lang/PublicMethods.java +++ /dev/null @@ -1,272 +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. - */ -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 --git a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java index f64e84f7f37..d086879a101 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java @@ -240,11 +240,6 @@ public final class Constructor extends Executable { } - @Override - Class[] getSharedParameterTypes() { - return parameterTypes; - } - /** * {@inheritDoc} */ diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java index ae94a58f06c..dce00fdba2f 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java @@ -222,10 +222,6 @@ public abstract class Executable extends AccessibleObject */ 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 --git a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java index 027a711d3e1..54ef08ebe8a 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java @@ -290,11 +290,6 @@ public final class Method extends Executable { } else { return getReturnType();} } - @Override - Class[] getSharedParameterTypes() { - return parameterTypes; - } - /** * {@inheritDoc} */ diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java index e34b019b67f..2a6abd3d682 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java @@ -132,10 +132,6 @@ class ReflectAccess implements jdk.internal.reflect.LangReflectAccess { 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 --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java index 7637b4b6a45..0fed09ff0c4 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java @@ -96,9 +96,6 @@ public interface LangReflectAccess { /** 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 --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java index e85022939e7..c6777c37827 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java @@ -345,12 +345,6 @@ public class ReflectionFactory { return langReflectAccess().getExecutableTypeAnnotationBytes(ex); } - /** Gets the shared array of parameter types of an Executable. - */ - public Class[] getExecutableSharedParameterTypes(Executable ex) { - return langReflectAccess().getExecutableSharedParameterTypes(ex); - } - //-------------------------------------------------------------------------- // // Routines used by serialization diff --git a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java index 1992f31d5de..4a3d89836db 100644 --- a/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java +++ b/jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java @@ -36,8 +36,9 @@ import java.util.Arrays; 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; @@ -54,7 +55,7 @@ public class FilterNotMostSpecific { for (MethodDesc expected : expectedMethods) { if (expected.isGetMethodReturn()) { try { - Method m = iface.getMethod(expected.name(), expected.parameterTypes()); + Method m = iface.getMethod(expected.name()); if (!assertMatch(expected, m)) fail(failMsg(expected, m, iface)); else @@ -71,18 +72,26 @@ public class FilterNotMostSpecific { 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 (assertMatch(expected, m)) { + if (used.contains(m)) + continue; + + if(expected.name().equals(m.getName()) && + expected.declaringClass() ==m.getDeclaringClass()) { + 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 + @@ -95,11 +104,6 @@ public class FilterNotMostSpecific { 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"); @@ -124,13 +128,8 @@ public class FilterNotMostSpecific { } private String toMethodString(MethodDesc m) { - 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(", ", "(", ")")); + return m.declaringClass().getSimpleName().toString() + "." + + m.name() + "()"; } private List toMethodStrings(MethodDesc[] m) { @@ -143,16 +142,11 @@ public class FilterNotMostSpecific { @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(); @@ -178,18 +172,22 @@ public class FilterNotMostSpecific { @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=J.class, + @MethodDesc(name="nonDefault", declaringClass=I.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, @@ -200,12 +198,14 @@ public class FilterNotMostSpecific { isGetMethodReturn=true) interface K1M extends J { void nonDefault(); } - @MethodDesc(name="nonDefault", declaringClass=J.class, - isGetMethodReturn=true) - interface K2 extends I, J {} + @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) + @MethodDesc(name="nonDefault", declaringClass=I.class) interface K2O extends J, I {} @MethodDesc(name="nonDefault", declaringClass=K2M.class, @@ -244,18 +244,21 @@ public class FilterNotMostSpecific { @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=M.class, + @MethodDesc(name="nonDefault", declaringClass=L.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() {}} @@ -274,36 +277,48 @@ public class FilterNotMostSpecific { @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + @MethodDesc(name="nonDefault", declaringClass=L.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=N2DN.class, + @MethodDesc(name="nonDefault", declaringClass=L.class) + @MethodDesc(name="nonDefault", declaringClass=M.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=N2DN.class, + @MethodDesc(name="nonDefault", declaringClass=L.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=N2DN.class, + @MethodDesc(name="nonDefault", declaringClass=L.class) + @MethodDesc(name="nonDefault", declaringClass=M.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 {} @@ -330,54 +345,88 @@ public class FilterNotMostSpecific { @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + @MethodDesc(name="nonDefault", declaringClass=L.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=N2DN.class, + @MethodDesc(name="nonDefault", declaringClass=L.class) + @MethodDesc(name="nonDefault", declaringClass=M.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(); } - @MethodDesc(name="isDefault", declaringClass=R1.class, - isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + // 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, isGetMethodReturn=true) + @MethodDesc(name="nonDefault", declaringClass=M.class) + @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R4 extends L, M, N2DN, R1 {} - @MethodDesc(name="isDefault", declaringClass=R2.class, - isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class, + // 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, isGetMethodReturn=true) + @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R5 extends M, N2DN, R2, L {} - @MethodDesc(name="isDefault", declaringClass=R3.class, - isGetMethodReturn=true) + // 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="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="nonDefault", declaringClass=N2DN.class, + @MethodDesc(name="isDefault", declaringClass=N2DN.class, + kind=MethodKind.DEFAULT) + @MethodDesc(name="nonDefault", declaringClass=L.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="nonDefault", declaringClass=N2DN.class, + @MethodDesc(name="isDefault", declaringClass=N2DN.class, + kind=MethodKind.DEFAULT) + @MethodDesc(name="nonDefault", declaringClass=L.class) + @MethodDesc(name="nonDefault", declaringClass=M.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 {} @@ -396,40 +445,51 @@ public class FilterNotMostSpecific { interface Z3 extends Z2, Z1 { void z(); } - @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn = true) + @MethodDesc(name="z", declaringClass=Z2.class, + kind=MethodKind.DEFAULT, isGetMethodReturn=true) + @MethodDesc(name="z", declaringClass=Z3.class) interface Z41 extends Z1, Z2, Z3 { } - @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn = true) + @MethodDesc(name="z", declaringClass=Z2.class, + kind=MethodKind.DEFAULT, isGetMethodReturn=true) + @MethodDesc(name="z", declaringClass=Z3.class) interface Z42 extends Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn = true) + isGetMethodReturn=true) + @MethodDesc(name="z", declaringClass=Z2.class, + kind=MethodKind.DEFAULT) interface Z43 extends Z3, Z1, Z2 { } - @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn = true) + @MethodDesc(name="z", declaringClass=Z2.class, + kind=MethodKind.DEFAULT, isGetMethodReturn=true) + @MethodDesc(name="z", declaringClass=Z3.class) abstract class ZC41 implements Z1, Z2, Z3 { } - @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn = true) + @MethodDesc(name="z", declaringClass=Z2.class, + kind=MethodKind.DEFAULT, isGetMethodReturn=true) + @MethodDesc(name="z", declaringClass=Z3.class) abstract class ZC42 implements Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, - isGetMethodReturn = true) + isGetMethodReturn=true) + @MethodDesc(name="z", declaringClass=Z2.class, + kind=MethodKind.DEFAULT) 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=X2.class, - isGetMethodReturn=true) + @MethodDesc(name="x", declaringClass=X1.class, + kind=MethodKind.DEFAULT, isGetMethodReturn=true) + @MethodDesc(name="x", declaringClass=X2.class) 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, @@ -464,107 +524,85 @@ public class FilterNotMostSpecific { interface K extends I, J { void nonDefault(); } - @MethodDesc(name="nonDefault", declaringClass=K.class, + @MethodDesc(name="nonDefault", declaringClass=I.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=K.class, + @MethodDesc(name="nonDefault", declaringClass=I.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=K.class, + @MethodDesc(name="nonDefault", declaringClass=I.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... + // bridges + interface B1A { Object m(); } + interface B1B extends B1A { Map m(); } - interface B1 { Object m(); } - interface B2A extends B1 { Map m(); } - interface B2B extends B1 { HashMap m(); } - - @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, + @MethodDesc(name="m", declaringClass=B1C.class, isGetMethodReturn=true) - interface B3A extends B2A { HashMap m(); } + @MethodDesc(name="m", declaringClass=B1C.class, + kind=MethodKind.DEFAULT) + @MethodDesc(name="m", declaringClass=B1C.class, + kind=MethodKind.DEFAULT) + interface B1C extends B1B { 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, + @MethodDesc(name="m", declaringClass=B2.class, isGetMethodReturn=true) - interface B4A extends B3A { HashMap m(); } + @MethodDesc(name="m", declaringClass=B2.class, + kind=MethodKind.DEFAULT) + @MethodDesc(name="m", declaringClass=B2.class, + kind=MethodKind.DEFAULT) + interface B2 extends B1C { 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, + @MethodDesc(name="m", declaringClass=B2.class, //HahsMap isGetMethodReturn=true) - interface B5A2 extends B4A, B1 {} + @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 {} - @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, + // this one is funny since HashMap isn't a bridge thus not a default + @MethodDesc(name="m", declaringClass=B2.class, //HashMap isGetMethodReturn=true) - interface B5A4A extends B4A, B3A {} - - // ... + most specific return type for getMethod from two unrelated interfaces - - @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 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 {} + @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 {} // 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", parameterTypes = {}, declaringClass=A2A.class, - isGetMethodReturn=true) - @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2A.class, - isGetMethodReturn=true) - @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2A.class, + @MethodDesc(name="m", declaringClass=A1.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) interface A3A extends A1, A2A {} - @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2B.class, + @MethodDesc(name="m", declaringClass=A1.class, isGetMethodReturn=true) - @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2B.class, - isGetMethodReturn=true) - @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2B.class, - kind = MethodKind.DEFAULT, 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) 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 = { @@ -642,16 +680,12 @@ public class FilterNotMostSpecific { { XC42.class }, { XC43.class }, + { B1C.class }, + { B2.class }, { B3A.class }, - { B4A.class }, - { B5A2.class }, - { B5A4A.class }, - { B3AB.class }, - { B3BA.class }, + { B3B.class }, { A3A.class }, { A3B.class }, - - { H.class }, }; } diff --git a/jdk/test/java/lang/reflect/PublicMethods/Case1.results b/jdk/test/java/lang/reflect/PublicMethods/Case1.results deleted file mode 100644 index a50d8623a55..00000000000 --- a/jdk/test/java/lang/reflect/PublicMethods/Case1.results +++ /dev/null @@ -1,1379 +0,0 @@ -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 --git a/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java deleted file mode 100644 index 381cb60c6a9..00000000000 --- a/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java +++ /dev/null @@ -1,529 +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 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")) - ); - } - }); - } -} From d6019ba534477f7cafc95351c6d944e4f02f3513 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Tue, 27 Dec 2016 09:42:16 +0100 Subject: [PATCH 083/121] 8171859: Configure check for modular boot jdk needs to be updated Reviewed-by: mchung --- common/autoconf/boot-jdk.m4 | 3 +-- common/autoconf/generated-configure.sh | 19 ++----------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4 index f75f3adfa2a..7eafd2857d3 100644 --- a/common/autoconf/boot-jdk.m4 +++ b/common/autoconf/boot-jdk.m4 @@ -305,9 +305,8 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK], 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 --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 644f25ab435..4ec10883d59 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -5170,7 +5170,7 @@ VS_SDK_PLATFORM_NAME_2013= #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1482309967 +DATE_WHEN_GENERATED=1482828098 ############################################################################### # @@ -30665,24 +30665,9 @@ $as_echo "$tool_specified" >&6; } 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" From 2197905d6d6e170278e123cf2099258b5a478437 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Tue, 27 Dec 2016 09:44:54 +0100 Subject: [PATCH 084/121] 8171471: libawt_xawt and libawt_headless should not set rpath to /. Reviewed-by: tbell, redestad --- jdk/make/lib/Awt2dLibraries.gmk | 3 --- 1 file changed, 3 deletions(-) diff --git a/jdk/make/lib/Awt2dLibraries.gmk b/jdk/make/lib/Awt2dLibraries.gmk index 670434669af..72943c0afdd 100644 --- a/jdk/make/lib/Awt2dLibraries.gmk +++ b/jdk/make/lib/Awt2dLibraries.gmk @@ -362,7 +362,6 @@ ifeq ($(findstring $(OPENJDK_TARGET_OS),windows macosx),) 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), \ @@ -564,8 +563,6 @@ ifeq ($(findstring $(OPENJDK_TARGET_OS), windows macosx),) 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), \ From 608537a21843664830d68d185148b15efe93d674 Mon Sep 17 00:00:00 2001 From: Aleksei Efimov Date: Fri, 30 Dec 2016 13:02:23 +0300 Subject: [PATCH 085/121] 8067237: [TESTBUG] javax/xml/ws/xsanymixed/Test.java failed on compilation Reviewed-by: lancea --- jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh b/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh index a93050af1a0..f7493a2080e 100644 --- a/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh +++ b/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh @@ -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." From 5ad7420c603fa0752ccf67aabdb438a3d4c40f6a Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Mon, 2 Jan 2017 22:45:34 +0100 Subject: [PATCH 086/121] 8172048: Re-examine use of AtomicReference in java.security.Policy Reviewed-by: plevart, dholmes, chegar --- .../share/classes/java/security/Policy.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/security/Policy.java b/jdk/src/java.base/share/classes/java/security/Policy.java index a0f22382a1c..73737ddb525 100644 --- a/jdk/src/java.base/share/classes/java/security/Policy.java +++ b/jdk/src/java.base/share/classes/java/security/Policy.java @@ -28,7 +28,6 @@ package java.security; 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 @@ public abstract class Policy { } } - // 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 @@ public abstract class Policy { 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 @@ public abstract class Policy { */ 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 @@ public abstract class Policy { 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 @@ public abstract class Policy { * 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 @@ public abstract class Policy { } pol = polFile; } - policy.set(new PolicyInfo(pol, true)); + policyInfo = new PolicyInfo(pol, true); return pol; } @@ -274,7 +272,7 @@ public abstract class Policy { initPolicy(p); } synchronized (Policy.class) { - policy.set(new PolicyInfo(p, p != null)); + policyInfo = new PolicyInfo(p, p != null); } } @@ -326,7 +324,7 @@ public abstract class Policy { } if (policyDomain.getCodeSource() != null) { - Policy pol = policy.get().policy; + Policy pol = policyInfo.policy; if (pol != null) { policyPerms = pol.getPermissions(policyDomain); } From 37aeefce85d5f428cf8b229486838520315cfcb4 Mon Sep 17 00:00:00 2001 From: Robert Field Date: Mon, 2 Jan 2017 18:27:55 -0800 Subject: [PATCH 087/121] 8172155: jshell tool (make): include built-in startup scripts in image Reviewed-by: briangoetz --- make/CompileJavaModules.gmk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/make/CompileJavaModules.gmk b/make/CompileJavaModules.gmk index b9c7c767aff..678618ec3f0 100644 --- a/make/CompileJavaModules.gmk +++ b/make/CompileJavaModules.gmk @@ -363,6 +363,10 @@ jdk.editpad_COPY := .properties ################################################################################ +jdk.jshell_COPY := .jsh .properties + +################################################################################ + jdk.internal.le_COPY := .properties ################################################################################ From 4ff56b008f32cb922cd7e28cc6f56092c06a9d98 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Tue, 3 Jan 2017 11:33:18 +0000 Subject: [PATCH 088/121] 8169091: Method reference T::methodName for generic type T does not compile any more MethodReferenceLookupHelper should use original site to perform unbound subtype check Reviewed-by: vromero --- .../classes/com/sun/tools/javac/comp/Resolve.java | 2 +- .../test/tools/javac/lambda/8169091/T8169091.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 langtools/test/tools/javac/lambda/8169091/T8169091.java diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index ae01e8f180a..f68f0fa5986 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -3190,7 +3190,7 @@ public class Resolve { 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 --git a/langtools/test/tools/javac/lambda/8169091/T8169091.java b/langtools/test/tools/javac/lambda/8169091/T8169091.java new file mode 100644 index 00000000000..9fe2ebdedd2 --- /dev/null +++ b/langtools/test/tools/javac/lambda/8169091/T8169091.java @@ -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; + } +} From fe1956e0414221f67e7addbc8f415d500520ecb9 Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Tue, 3 Jan 2017 22:14:41 +0530 Subject: [PATCH 089/121] 8172183: Provide a javadoc description for jdk.dynalink module Reviewed-by: attila, jlaskey --- nashorn/README | 18 +- nashorn/RELEASE_README | 20 -- .../classes/jdk/dynalink/package-info.java | 193 +----------------- .../share/classes/module-info.java | 193 +++++++++++++++++- 4 files changed, 202 insertions(+), 222 deletions(-) delete mode 100644 nashorn/RELEASE_README diff --git a/nashorn/README b/nashorn/README index 9cc6c723213..279a2af01b5 100644 --- a/nashorn/README +++ b/nashorn/README @@ -24,33 +24,33 @@ and downlaoded using 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 @@ Look for samples under the directory test/src/jdk/nashorn/api/scripting/. 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 @@ Alternatively, you can check it out elsewhere and make 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 @@ Ant target to get/update external test suites: 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 --git a/nashorn/RELEASE_README b/nashorn/RELEASE_README deleted file mode 100644 index 9984be4ce32..00000000000 --- a/nashorn/RELEASE_README +++ /dev/null @@ -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 --git a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java index b89f4c2de4d..7a965e576f6 100644 --- a/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java +++ b/nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/package-info.java @@ -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 --git a/nashorn/src/jdk.dynalink/share/classes/module-info.java b/nashorn/src/jdk.dynalink/share/classes/module-info.java index 5110d016f9b..9e9fcbc3d20 100644 --- a/nashorn/src/jdk.dynalink/share/classes/module-info.java +++ b/nashorn/src/jdk.dynalink/share/classes/module-info.java @@ -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; From 342a27ab5847a00db36aad67599bbb226232a33e Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Tue, 3 Jan 2017 16:27:54 -0700 Subject: [PATCH 090/121] 8144066: StackOverflowException when computing glb Reviewed-by: mcimadamore --- .../com/sun/tools/javac/code/Types.java | 16 ++++--- .../javac/generics/inference/CaptureGLB1.java | 42 +++++++++++++++++++ .../javac/generics/inference/CaptureGLB2.java | 42 +++++++++++++++++++ 3 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 langtools/test/tools/javac/generics/inference/CaptureGLB1.java create mode 100644 langtools/test/tools/javac/generics/inference/CaptureGLB2.java diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java index 117532b356a..a8efe5ef4dc 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java @@ -3845,20 +3845,26 @@ public class Types { 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 --git a/langtools/test/tools/javac/generics/inference/CaptureGLB1.java b/langtools/test/tools/javac/generics/inference/CaptureGLB1.java new file mode 100644 index 00000000000..2fe46f56990 --- /dev/null +++ b/langtools/test/tools/javac/generics/inference/CaptureGLB1.java @@ -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 --git a/langtools/test/tools/javac/generics/inference/CaptureGLB2.java b/langtools/test/tools/javac/generics/inference/CaptureGLB2.java new file mode 100644 index 00000000000..47fc78a88b0 --- /dev/null +++ b/langtools/test/tools/javac/generics/inference/CaptureGLB2.java @@ -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; + } +} From 920965dad29e767e1294922c04bf1200701006d8 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Tue, 3 Jan 2017 17:53:34 -0800 Subject: [PATCH 091/121] 8172212: jdeps --require and --check should detect the specified module in the image Reviewed-by: psandoz, lancea --- .../sun/tools/jdeps/JdepsConfiguration.java | 33 ++++--- .../com/sun/tools/jdeps/JdepsTask.java | 87 +++++++++++++------ .../tools/jdeps/ModuleExportsAnalyzer.java | 22 +++-- .../tools/jdeps/resources/jdeps.properties | 1 + .../tools/jdeps/listdeps/ListModuleDeps.java | 22 +++++ .../tools/jdeps/modules/CheckModuleTest.java | 3 + .../test/tools/jdeps/modules/InverseDeps.java | 42 ++++++++- .../tools/jdeps/modules/SplitPackage.java | 11 ++- 8 files changed, 172 insertions(+), 49 deletions(-) diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java index fba25a5711c..b34d740d300 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java @@ -105,18 +105,18 @@ public class JdepsConfiguration implements AutoCloseable { // 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 @@ public class JdepsConfiguration implements AutoCloseable { boolean addAllApplicationModules; boolean addAllDefaultModules; boolean addAllSystemModules; + boolean allModules; Runtime.Version version; public Builder() { @@ -550,8 +551,7 @@ public class JdepsConfiguration implements AutoCloseable { * 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 @@ public class JdepsConfiguration implements AutoCloseable { .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 --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java index 08e3dda2256..faa052a9ad9 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java @@ -38,10 +38,10 @@ import java.nio.file.Path; 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 @@ class JdepsTask { }, 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 @@ class JdepsTask { 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 @@ class JdepsTask { 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 @@ class JdepsTask { 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 @@ class JdepsTask { protected Command(CommandOption option) { this.option = option; } + /** * Returns true if the command-line options are all valid; * otherwise, returns false. @@ -633,6 +633,10 @@ class JdepsTask { /** * 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 @@ class JdepsTask { 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 @@ class JdepsTask { 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 @@ class JdepsTask { return new ModuleAnalyzer(config, log, modules).run(); } + /* + * Returns true to analyze all modules + */ public boolean allModules() { return true; } @@ -957,6 +991,10 @@ class JdepsTask { 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 @@ class JdepsTask { reduced, log).run(); } - - @Override - boolean allModules() { - return true; - } } @@ -1155,7 +1188,7 @@ class JdepsTask { String systemModulePath = System.getProperty("java.home"); String upgradeModulePath; String modulePath; - String rootModule; + Set rootModules = new HashSet<>(); Set addmods = new HashSet<>(); Runtime.Version multiRelease; diff --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java index 0a5f6cb421e..d760d1b0d37 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java @@ -34,6 +34,7 @@ import java.util.HashSet; 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 @@ public class ModuleExportsAnalyzer extends DepsAnalyzer { 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 @@ public class ModuleExportsAnalyzer extends DepsAnalyzer { 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 @@ public class ModuleExportsAnalyzer extends DepsAnalyzer { }); } + /* + * 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 --git a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties index 994ebedc855..acdc6ffdf48 100644 --- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties @@ -194,6 +194,7 @@ err.invalid.path=invalid path: {0} 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 --git a/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java b/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java index 9327565881a..9d05aa149be 100644 --- a/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java +++ b/langtools/test/tools/jdeps/listdeps/ListModuleDeps.java @@ -83,6 +83,28 @@ public class ListModuleDeps { )); } + @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 --git a/langtools/test/tools/jdeps/modules/CheckModuleTest.java b/langtools/test/tools/jdeps/modules/CheckModuleTest.java index 724784147c9..128832cb4b1 100644 --- a/langtools/test/tools/jdeps/modules/CheckModuleTest.java +++ b/langtools/test/tools/jdeps/modules/CheckModuleTest.java @@ -57,6 +57,7 @@ public class CheckModuleTest { 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 @@ public class CheckModuleTest { return new Object[][] { { JAVA_BASE, new ModuleMetaData(JAVA_BASE) }, + { JAVA_COMPILER, new ModuleMetaData(JAVA_BASE) + }, }; }; diff --git a/langtools/test/tools/jdeps/modules/InverseDeps.java b/langtools/test/tools/jdeps/modules/InverseDeps.java index 1c6a83f0c5b..39e6e282ebb 100644 --- a/langtools/test/tools/jdeps/modules/InverseDeps.java +++ b/langtools/test/tools/jdeps/modules/InverseDeps.java @@ -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 @@ public class InverseDeps { } } } + @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 --git a/langtools/test/tools/jdeps/modules/SplitPackage.java b/langtools/test/tools/jdeps/modules/SplitPackage.java index bc04ac88318..844c96d4d40 100644 --- a/langtools/test/tools/jdeps/modules/SplitPackage.java +++ b/langtools/test/tools/jdeps/modules/SplitPackage.java @@ -63,10 +63,15 @@ public class SplitPackage { @Test public void runTest() throws Exception { - // Test jdeps classes - runTest(null); - // Test jdeps --add-modules + // 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("ALL-DEFAULT"); + } private void runTest(String root, String... splitPackages) throws Exception { From 1b499dbf8b0875e4cf31c893f1ba07c6c8fcb514 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Tue, 3 Jan 2017 17:49:08 -0500 Subject: [PATCH 092/121] 8172214: typo in "intersection types in cast are not supported" message Reviewed-by: mcimadamore --- .../classes/com/sun/tools/javac/resources/compiler.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 8e82787250b..3357e2b871c 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -2558,7 +2558,7 @@ compiler.err.default.methods.not.supported.in.source=\ # 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=\ From 9d783cdba20cfc27cb78d642b377d934c18e448b Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Wed, 4 Jan 2017 18:47:35 +0530 Subject: [PATCH 093/121] 8164391: Provide a javadoc description for jdk.scripting.nashorn Reviewed-by: attila, jlaskey --- nashorn/make/build.xml | 4 +- .../share/classes/module-info.java | 67 ++++++++++- .../share/classes/overview.html | 113 ------------------ 3 files changed, 67 insertions(+), 117 deletions(-) delete mode 100644 nashorn/src/jdk.scripting.nashorn/share/classes/overview.html diff --git a/nashorn/make/build.xml b/nashorn/make/build.xml index 623719169d3..6e28bc56737 100644 --- a/nashorn/make/build.xml +++ b/nashorn/make/build.xml @@ -267,7 +267,7 @@ - @@ -285,7 +285,7 @@ - diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java index 9a7dcafd465..83b41891f51 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java @@ -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 @@ module jdk.scripting.nashorn { provides jdk.dynalink.linker.GuardingDynamicLinkerExporter with jdk.nashorn.api.linker.NashornLinkerExporter; } - diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/overview.html b/nashorn/src/jdk.scripting.nashorn/share/classes/overview.html deleted file mode 100644 index e242a5b9bc0..00000000000 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/overview.html +++ /dev/null @@ -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}. - From c6ee2617dd41c5a79f99e216b1ef422b9054881f Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Wed, 4 Jan 2017 16:12:14 +0100 Subject: [PATCH 094/121] 8171922: Hotspot code coverage doesn't seem to work Reviewed-by: tbell --- common/autoconf/flags.m4 | 13 ----------- common/autoconf/generated-configure.sh | 31 ++++---------------------- common/autoconf/jdk-options.m4 | 7 ++---- 3 files changed, 6 insertions(+), 45 deletions(-) diff --git a/common/autoconf/flags.m4 b/common/autoconf/flags.m4 index 0621463ff45..f52d76762ef 100644 --- a/common/autoconf/flags.m4 +++ b/common/autoconf/flags.m4 @@ -147,15 +147,6 @@ AC_DEFUN_ONCE([FLAGS_SETUP_USER_SUPPLIED_FLAGS], 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 @@ AC_DEFUN([FLAGS_SETUP_SYSROOT_FLAGS], $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 --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 4ec10883d59..ad551b650c9 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -854,9 +854,6 @@ SYSROOT_CFLAGS 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 @@ VS_SDK_PLATFORM_NAME_2013= #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1482828098 +DATE_WHEN_GENERATED=1483542685 ############################################################################### # @@ -31290,8 +31287,6 @@ $as_echo "yes" >&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 @@ -31493,15 +31488,6 @@ fi 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" - - - - - @@ -31533,10 +31519,6 @@ fi 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" @@ -44053,10 +44035,6 @@ $as_echo "$BUILD_DEVKIT_ROOT" >&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" @@ -52779,9 +52757,8 @@ $as_echo_n "checking if native coverage is enabled... " >&6; } $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" @@ -52982,7 +52959,7 @@ $as_echo "yes, forced" >&6; } $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 --git a/common/autoconf/jdk-options.m4 b/common/autoconf/jdk-options.m4 index acc0dccf8c4..7b6b1f5fae2 100644 --- a/common/autoconf/jdk-options.m4 +++ b/common/autoconf/jdk-options.m4 @@ -320,9 +320,8 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_CODE_COVERAGE], 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_DEFUN_ONCE([JDKOPT_SETUP_STATIC_BUILD], 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 From b6fdeee5ce87af2be15aea67fed5660e40dd5d0e Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Wed, 4 Jan 2017 16:14:09 +0100 Subject: [PATCH 095/121] 8171500: Explicitly set --with-target-bits=64 in 64bit jib profiles Reviewed-by: tbell --- common/conf/jib-profiles.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/common/conf/jib-profiles.js b/common/conf/jib-profiles.js index 761bf010368..af883b892b5 100644 --- a/common/conf/jib-profiles.js +++ b/common/conf/jib-profiles.js @@ -263,6 +263,7 @@ var getJibProfilesCommon = function (input, data) { labels: "open" }; + common.configure_args_64bit = ["--with-target-bits=64"]; common.configure_args_32bit = ["--with-target-bits=32"]; /** @@ -419,7 +420,7 @@ var getJibProfilesProfiles = function (input, common, data) { target_os: "linux", target_cpu: "x64", dependencies: ["devkit"], - configure_args: ["--with-zlib=system"], + configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), default_make_targets: ["docs-bundles"], }, @@ -436,27 +437,30 @@ var getJibProfilesProfiles = function (input, common, data) { target_os: "macosx", target_cpu: "x64", dependencies: ["devkit"], - configure_args: concat(common.configure_args, "--with-zlib=system"), + configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), }, "solaris-x64": { target_os: "solaris", target_cpu: "x64", dependencies: ["devkit", "cups"], - configure_args: ["--with-zlib=system", "--enable-dtrace"], + configure_args: concat(common.configure_args_64bit, + "--with-zlib=system", "--enable-dtrace"), }, "solaris-sparcv9": { target_os: "solaris", target_cpu: "sparcv9", dependencies: ["devkit", "cups"], - configure_args: ["--with-zlib=system", "--enable-dtrace"], + configure_args: concat(common.configure_args_64bit, + "--with-zlib=system", "--enable-dtrace"), }, "windows-x64": { target_os: "windows", target_cpu: "x64", dependencies: ["devkit", "freetype"], + configure_args: concat(common.configure_args_64bit), }, "windows-x86": { @@ -518,11 +522,11 @@ var getJibProfilesProfiles = function (input, common, data) { target_os: "linux", target_cpu: "x64", dependencies: ["devkit"], - configure_args: [ + configure_args: concat(common.configure_args_64bit, [ "--with-zlib=system", "--with-jvm-variants=zero", "--enable-libffi-bundling" - ] + ]) }, "linux-x86-zero": { From 0b088d5ed8d45366395b677b7a8f36d4ab0bbaa8 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Wed, 4 Jan 2017 16:58:09 +0100 Subject: [PATCH 096/121] 8171929: "make docs" in clean forest is broken Reviewed-by: mchung, tbell --- make/Main.gmk | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/make/Main.gmk b/make/Main.gmk index 6aa135b91a8..14add7f2046 100644 --- a/make/Main.gmk +++ b/make/Main.gmk @@ -630,13 +630,12 @@ else # 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. From 3cfe5aae72fa2b17d3799e38e79d99e5483df991 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 4 Jan 2017 16:08:27 -0800 Subject: [PATCH 097/121] 8171977: Add support for latest messages from 'tidy' Reviewed-by: darcy --- langtools/test/tools/doclint/tidy/util/Main.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/langtools/test/tools/doclint/tidy/util/Main.java b/langtools/test/tools/doclint/tidy/util/Main.java index 42fd38bf17d..c06ad22d76b 100644 --- a/langtools/test/tools/doclint/tidy/util/Main.java +++ b/langtools/test/tools/doclint/tidy/util/Main.java @@ -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 @@ public class Main { 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 @@ public class Main { 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 @@ public class Main { 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; From 6fa9fb405d31dcb0a160d9a01e6af0f106d63e1c Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 4 Jan 2017 18:33:20 -0800 Subject: [PATCH 098/121] 8172260: remove tests from ProblemList Reviewed-by: rfield --- langtools/test/ProblemList.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/langtools/test/ProblemList.txt b/langtools/test/ProblemList.txt index d6f525de56e..8f26711a663 100644 --- a/langtools/test/ProblemList.txt +++ b/langtools/test/ProblemList.txt @@ -36,9 +36,6 @@ jdk/javadoc/doclet/testIOException/TestIOException.java # # 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 @@ -46,7 +43,6 @@ jdk/jshell/ReplaceTest.java # # 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 From 7b2237f2778ba758d40816a3eb42e5612ea1edca Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:09 +0000 Subject: [PATCH 099/121] Added tag jdk-9+151 for changeset 44601aa03c2d --- .hgtags-top-repo | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags-top-repo b/.hgtags-top-repo index f3f827b60b8..5e9f2c1b877 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -393,3 +393,4 @@ a22e2671d88f6b22a4aa82e3966986542ed2a381 jdk-9+146 3ffc3e886c74736e387f3685e86b557cdea706c8 jdk-9+148 b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149 6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150 +71a766d4c18041a7f833ee22823125b02e1a7f1e jdk-9+151 From 4dc65a103be13c389aa112c6e294fa0989572aa3 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:09 +0000 Subject: [PATCH 100/121] Added tag jdk-9+151 for changeset 285137a9591e --- corba/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/corba/.hgtags b/corba/.hgtags index bfc73616f2e..340cac95c4d 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -393,3 +393,4 @@ dc49e0922a8e4387cbf8670bbe1dc51c9874b74b jdk-9+147 f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148 00b19338e505690abe93d5995ed74a473d969c2c jdk-9+149 9205e980062a5c4530b51021c6e274025f4ccbdf jdk-9+150 +77f827f5bbad3ef795664bc675f72d98d156b9f8 jdk-9+151 From fd16b656658a52345fa93ba6db24f01a19d5af69 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:10 +0000 Subject: [PATCH 101/121] Added tag jdk-9+151 for changeset 56ae078e5b98 --- hotspot/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 524390321fc..c41ae6d0faa 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -553,3 +553,4 @@ a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146 5e4e893520ecdbd517c6ed6375f0885664fe62c4 jdk-9+148 30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149 98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150 +2a2ac7d9f52c8cb2b80077e515b5840b947e640c jdk-9+151 From 2670d8d32b445c7475b9fe685b701b1886e93828 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:11 +0000 Subject: [PATCH 102/121] Added tag jdk-9+151 for changeset 39c4823f6235 --- jaxp/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 8e32dd70b68..0f4ff1ca773 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -393,3 +393,4 @@ ce81d03ad7320dca3d673374c1a33bc0efd9136a jdk-9+143 c45db75bfe8bc20bb80b4a009ae3f69c9cd2d885 jdk-9+148 5978df8bfa3894f2b3d07b7256f25f78dffb1f9c jdk-9+149 f85154af719f99a3b4d81b67a8b4c18a650d10f9 jdk-9+150 +13c6906bfc861d99dc35a19c80b7a99f0b0ac58d jdk-9+151 From fb081f8391e25dd9f5c3057af42f8dee38d86361 Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:11 +0000 Subject: [PATCH 103/121] Added tag jdk-9+151 for changeset 01058fbb176d --- jaxws/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxws/.hgtags b/jaxws/.hgtags index b433013fe05..26ce3b439e7 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -396,3 +396,4 @@ be37411855de5b76035bef6f1b0d90d8607f2205 jdk-9+147 c8c9c334743caf8155c9809b6b4ac315d3a66476 jdk-9+148 72554d319b474b3636c7d02fe3c110254d111b1a jdk-9+149 77e4e30d9d111272cd4a45a2203e8f570d40b12e jdk-9+150 +c48b4d4768b1c2b8fe5d1a844ca13732e5dfbe2a jdk-9+151 From bb1aca9034e6236aaee4debd98c5d4f65e6e804c Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:12 +0000 Subject: [PATCH 104/121] Added tag jdk-9+151 for changeset ae7decb33b43 --- langtools/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/.hgtags b/langtools/.hgtags index 13cf5f1e4ba..49e6afa967e 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -393,3 +393,4 @@ cb9e896265ef45295fdd09986dee76624e4d41e4 jdk-9+145 586c93260d3b2f91a055b96118b141c05841694f jdk-9+148 4d4cd7cd731c1952d7330ea5bcfda8bd26820fa5 jdk-9+149 e5a42ddaf633fde14b983f740ae0e7e490741fd1 jdk-9+150 +4f348bd05341581df84ff1510d5b3a9b5b488367 jdk-9+151 From e640fa9b4d8210ff50d22a404a350b94b82c038e Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Thu, 5 Jan 2017 17:51:13 +0000 Subject: [PATCH 105/121] Added tag jdk-9+151 for changeset 339ad1309506 --- nashorn/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/nashorn/.hgtags b/nashorn/.hgtags index 58b0ff4ec14..f35efaa4ca0 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -384,3 +384,4 @@ a7f21ee6ed30695a6de14e74035d2857a754f62b jdk-9+144 0a4bc2f049132ddc20985565bb41b2be8a458dda jdk-9+148 c281306d33d83c92e0d870ace385d5f99678d7e7 jdk-9+149 ace1d994bca775d6545a4c874ae73d1dfc9ec18b jdk-9+150 +2a0437036a64853334e538044eb68d2df70075fa jdk-9+151 From d3f27dfe9c1f5421f208284ff91e593945e9d9e7 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Thu, 5 Jan 2017 10:04:40 -0800 Subject: [PATCH 106/121] 8065800: javac, fix diagnostic position for statement-bodied lambdas Reviewed-by: mcimadamore --- .../share/classes/com/sun/tools/javac/parser/JavacParser.java | 4 ++-- langtools/test/tools/javac/lambda/MostSpecific09.java | 2 +- langtools/test/tools/javac/lambda/MostSpecific09.out | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index e8c70d60958..f1ebab92537 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -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 @@ public class JavacParser implements Parser { accept(ARROW); return token.kind == LBRACE ? - lambdaStatement(args, pos, pos) : + lambdaStatement(args, pos, token.pos) : lambdaExpression(args, pos); } diff --git a/langtools/test/tools/javac/lambda/MostSpecific09.java b/langtools/test/tools/javac/lambda/MostSpecific09.java index 82e12d69839..d7883a45c55 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific09.java +++ b/langtools/test/tools/javac/lambda/MostSpecific09.java @@ -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 --git a/langtools/test/tools/javac/lambda/MostSpecific09.out b/langtools/test/tools/javac/lambda/MostSpecific09.out index 5359cb7f3bf..2ecd520592b 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific09.out +++ b/langtools/test/tools/javac/lambda/MostSpecific09.out @@ -2,7 +2,7 @@ MostSpecific09.java:25:9: compiler.note.verbose.resolve.multi: foo, MostSpecific 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:20: 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: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 @@ -10,7 +10,7 @@ MostSpecific09.java:29:28: compiler.note.verbose.resolve.multi: , java.lan 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:20: 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: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)} From 42a9464947db2ff7839e7bd4e3ff84af400ed5e6 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Thu, 5 Jan 2017 11:02:35 -0800 Subject: [PATCH 107/121] 8172220: Mark UserInputTest.java as intermittently failing and problem list it Reviewed-by: jlahoda --- langtools/test/ProblemList.txt | 3 ++- langtools/test/jdk/jshell/UserInputTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/langtools/test/ProblemList.txt b/langtools/test/ProblemList.txt index 8f26711a663..66d44b1ba2a 100644 --- a/langtools/test/ProblemList.txt +++ b/langtools/test/ProblemList.txt @@ -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 @@ -38,6 +38,7 @@ jdk/javadoc/doclet/testIOException/TestIOException.java jdk/jshell/ToolFormatTest.java 8170216 solaris-sparcv9 jdk/jshell/ReplaceTest.java 8170216 solaris-sparcv9 +jdk/jshell/UserInputTest.java 8169536 generic-all ########################################################################### # diff --git a/langtools/test/jdk/jshell/UserInputTest.java b/langtools/test/jdk/jshell/UserInputTest.java index 41221c009dc..323e5e4c193 100644 --- a/langtools/test/jdk/jshell/UserInputTest.java +++ b/langtools/test/jdk/jshell/UserInputTest.java @@ -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; From 01fc0b7771d9b5458c57a17187d2959ff679ffbb Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Thu, 5 Jan 2017 19:10:24 +0000 Subject: [PATCH 108/121] 8172287: improve intellij logging to cover javac internal errors Add new message kind to custom intellij ant logger Reviewed-by: jjg --- langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java b/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java index ba4ce9500a6..7f220596c4e 100644 --- a/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java +++ b/langtools/make/intellij/src/idea/LangtoolsIdeaAntLogger.java @@ -84,6 +84,8 @@ public final class LangtoolsIdeaAntLogger extends DefaultLogger { 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 @@ public final class LangtoolsIdeaAntLogger extends DefaultLogger { 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 */ From 37f7ab915cf94add10d02c903f01ece19d70e522 Mon Sep 17 00:00:00 2001 From: Bernard Blaser Date: Thu, 5 Jan 2017 11:16:39 -0800 Subject: [PATCH 109/121] 8148100: Convert lambda most specific positive tests to check runtime behavior Reviewed-by: mcimadamore --- .../test/tools/javac/lambda/MostSpecific10.java | 14 ++++++++++---- .../test/tools/javac/lambda/MostSpecific11.java | 13 +++++++++---- .../test/tools/javac/lambda/MostSpecific15.java | 16 ++++++++++------ .../test/tools/javac/lambda/MostSpecific17.java | 16 ++++++++++------ .../test/tools/javac/lambda/MostSpecific18.java | 16 ++++++++++------ .../test/tools/javac/lambda/MostSpecific20.java | 16 ++++++++++------ .../test/tools/javac/lambda/MostSpecific22.java | 16 +++++++++++----- .../test/tools/javac/lambda/MostSpecific27.java | 15 ++++++++++----- .../test/tools/javac/lambda/MostSpecific29.java | 13 +++++++++---- 9 files changed, 89 insertions(+), 46 deletions(-) diff --git a/langtools/test/tools/javac/lambda/MostSpecific10.java b/langtools/test/tools/javac/lambda/MostSpecific10.java index 4e31788d79e..715cc9caaad 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific10.java +++ b/langtools/test/tools/javac/lambda/MostSpecific10.java @@ -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 @@ class MostSpecific10 { } 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 --git a/langtools/test/tools/javac/lambda/MostSpecific11.java b/langtools/test/tools/javac/lambda/MostSpecific11.java index 9946ddd67ea..7632008deec 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific11.java +++ b/langtools/test/tools/javac/lambda/MostSpecific11.java @@ -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 --git a/langtools/test/tools/javac/lambda/MostSpecific15.java b/langtools/test/tools/javac/lambda/MostSpecific15.java index 1c2db64c9a3..09a4b42bd34 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific15.java +++ b/langtools/test/tools/javac/lambda/MostSpecific15.java @@ -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 @@ class MostSpecific15 { void test() { m1(MostSpecific15::foo); } - -} \ No newline at end of file +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific17.java b/langtools/test/tools/javac/lambda/MostSpecific17.java index 907c00d9bd4..61e64d5b915 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific17.java +++ b/langtools/test/tools/javac/lambda/MostSpecific17.java @@ -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 @@ class MostSpecific17 { 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 @@ class MostSpecific17 { void test() { m1(MostSpecific17::foo); } - -} \ No newline at end of file +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific18.java b/langtools/test/tools/javac/lambda/MostSpecific18.java index 40536982de8..d1a509ed3db 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific18.java +++ b/langtools/test/tools/javac/lambda/MostSpecific18.java @@ -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 @@ class MostSpecific18 { void test() { m1(MostSpecific18::foo); } - -} \ No newline at end of file +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific20.java b/langtools/test/tools/javac/lambda/MostSpecific20.java index 3b5d56e3e52..d94d3a5d28d 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific20.java +++ b/langtools/test/tools/javac/lambda/MostSpecific20.java @@ -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 @@ class MostSpecific20 { void test() { m1(MostSpecific20::foo); } - -} \ No newline at end of file +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific22.java b/langtools/test/tools/javac/lambda/MostSpecific22.java index 5c56f8546e2..7135b6651f4 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific22.java +++ b/langtools/test/tools/javac/lambda/MostSpecific22.java @@ -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 @@ class MostSpecific22 { m1(MostSpecific22::foo); } -} \ No newline at end of file +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific27.java b/langtools/test/tools/javac/lambda/MostSpecific27.java index 2c758b2b3e4..c70048e8558 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific27.java +++ b/langtools/test/tools/javac/lambda/MostSpecific27.java @@ -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 @@ class MostSpecific27 { m1(MostSpecific27::foo); } -} \ No newline at end of file +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific29.java b/langtools/test/tools/javac/lambda/MostSpecific29.java index d15d6cf91bd..9f7c90c1dbe 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific29.java +++ b/langtools/test/tools/javac/lambda/MostSpecific29.java @@ -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); From cedf0baa463bc18fdb8c397d586880457e0e0180 Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Thu, 5 Jan 2017 11:20:56 -0800 Subject: [PATCH 110/121] 8026699: test test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java has an extra @compile attribute that should be removed Reviewed-by: mcimadamore --- .../javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java index 9c878b822de..e18886319e5 100644 --- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java @@ -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 @@ -27,7 +27,6 @@ * @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.*; From 61175156de4225ca17b2948bbe92fd512f692579 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 5 Jan 2017 15:39:57 -0800 Subject: [PATCH 111/121] 8172311: MostSpecific09.java and PotentiallyAmbiguousWarningTest.java failing across platforms Reviewed-by: vromero --- .../tools/javac/lambda/MostSpecific09.out | 4 +-- .../PotentiallyAmbiguousWarningTest.java | 25 +------------------ .../PotentiallyAmbiguousWarningTest.out | 12 ++++----- 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/langtools/test/tools/javac/lambda/MostSpecific09.out b/langtools/test/tools/javac/lambda/MostSpecific09.out index 2ecd520592b..581294b5dc2 100644 --- a/langtools/test/tools/javac/lambda/MostSpecific09.out +++ b/langtools/test/tools/javac/lambda/MostSpecific09.out @@ -3,7 +3,7 @@ MostSpecific09.java:26:9: compiler.note.verbose.resolve.multi: foo, MostSpecific 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:20: 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: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)} @@ -11,7 +11,7 @@ MostSpecific09.java:30:9: compiler.err.ref.ambiguous: foo, kindname.method, foo( 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:20: 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: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 --git a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java index e18886319e5..7d4b07a4190 100644 --- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.java @@ -1,28 +1,5 @@ /* - * 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 - * 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 diff --git a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out index 6011a886e3d..55b50a3965d 100644 --- a/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out +++ b/langtools/test/tools/javac/lambda/T8024947/PotentiallyAmbiguousWarningTest.out @@ -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 From ad76f31ded689630a8f1f662b667107e366b1e06 Mon Sep 17 00:00:00 2001 From: Xue-Lei Andrew Fan Date: Fri, 6 Jan 2017 01:09:03 +0000 Subject: [PATCH 112/121] 8172273: SSLEngine.unwrap fails with ArrayIndexOutOfBoundsException Reviewed-by: wetmore --- .../classes/sun/security/ssl/InputRecord.java | 3 ++- .../net/ssl/TLS/TestJSSEClientProtocol.java | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java b/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java index fec0b1c4d90..82e81e2b48f 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/InputRecord.java @@ -242,8 +242,9 @@ class InputRecord implements Record, Closeable { // 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 --git a/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java b/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java index bae6ea6c822..2668d9f8dac 100644 --- a/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java +++ b/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java @@ -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 From e546b078a6f5cd0ee7eb86fed26b9b03b2f85d7c Mon Sep 17 00:00:00 2001 From: Xue-Lei Andrew Fan Date: Fri, 6 Jan 2017 02:03:47 +0000 Subject: [PATCH 113/121] 8129988: JSSE should create a single instance of the cacerts KeyStore Reviewed-by: mullan --- .../sun/security/ssl/SSLContextImpl.java | 18 +- .../security/ssl/TrustManagerFactoryImpl.java | 142 +------ .../sun/security/ssl/TrustStoreManager.java | 395 ++++++++++++++++++ .../security/ssl/X509TrustManagerImpl.java | 54 +-- .../{KeyStores.java => TrustStoreUtil.java} | 77 +--- .../sun/security/validator/Validator.java | 2 +- .../ssl/SSLContextImpl/BadTSProvider.java | 21 +- .../validator/EndEntityExtensionCheck.java | 6 +- 8 files changed, 493 insertions(+), 222 deletions(-) create mode 100644 jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java rename jdk/src/java.base/share/classes/sun/security/validator/{KeyStores.java => TrustStoreUtil.java} (52%) diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java index 24dd7e0df14..46ae8d5281e 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java @@ -935,12 +935,20 @@ public abstract class SSLContextImpl extends SSLContextSpi { } private static TrustManager[] getTrustManagers() throws Exception { - KeyStore ks = - TrustManagerFactoryImpl.getCacertsKeyStore("defaultctx"); - TrustManagerFactory tmf = TrustManagerFactory.getInstance( - TrustManagerFactory.getDefaultAlgorithm()); - tmf.init(ks); + 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); + } + return tmf.getTrustManagers(); } diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java b/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java index 8b598c333f8..96a1bdea471 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/TrustManagerFactoryImpl.java @@ -32,6 +32,7 @@ import java.security.cert.*; import javax.net.ssl.*; import sun.security.validator.Validator; +import sun.security.validator.TrustStoreUtil; abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { @@ -47,7 +48,7 @@ abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { 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 @@ abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { "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 @@ abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { }); } - /** - * 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(); - } - } - - return ks; - } - public static final class SimpleFactory extends TrustManagerFactoryImpl { @Override - X509TrustManager getInstance(KeyStore ks) throws KeyStoreException { - return new X509TrustManagerImpl(Validator.TYPE_SIMPLE, ks); + X509TrustManager getInstance( + Collection trustedCerts) { + return new X509TrustManagerImpl( + Validator.TYPE_SIMPLE, trustedCerts); } + @Override X509TrustManager getInstance(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException { @@ -253,13 +145,15 @@ abstract class TrustManagerFactoryImpl extends TrustManagerFactorySpi { ("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 --git a/jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java b/jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java new file mode 100644 index 00000000000..5681a7de1f4 --- /dev/null +++ b/jdk/src/java.base/share/classes/sun/security/ssl/TrustStoreManager.java @@ -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 --git a/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java b/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java index 816269a36a4..a8e7328b753 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java @@ -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 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager 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 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager 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 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager } 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 --git a/jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java b/jdk/src/java.base/share/classes/sun/security/validator/TrustStoreUtil.java similarity index 52% rename from jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java rename to jdk/src/java.base/share/classes/sun/security/validator/TrustStoreUtil.java index 236f5dddc2e..9d610ce62e5 100644 --- a/jdk/src/java.base/share/classes/sun/security/validator/KeyStores.java +++ b/jdk/src/java.base/share/classes/sun/security/validator/TrustStoreUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -25,76 +25,33 @@ package sun.security.validator; -import java.io.*; -import java.util.*; +import java.util.Set; +import java.util.HashSet; +import java.util.Collections; +import java.util.Enumeration; -import java.security.*; -import java.security.cert.*; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.cert.X509Certificate; import java.security.cert.Certificate; -import sun.security.action.*; - /** - * Collection of static utility methods related to KeyStores. + * Collection of static utility methods related to trust anchor KeyStores. * * @author Andreas Sterbenz */ -public class KeyStores { +public final class TrustStoreUtil { - private KeyStores() { + private TrustStoreUtil() { // 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. + * Return an unmodifiable Set with all trusted X509Certificates contained + * in the specified KeyStore. */ public static Set getTrustedCerts(KeyStore ks) { - Set set = new HashSet(); + Set set = new HashSet<>(); try { for (Enumeration e = ks.aliases(); e.hasMoreElements(); ) { String alias = e.nextElement(); @@ -113,8 +70,10 @@ public class KeyStores { } } catch (KeyStoreException e) { // ignore + // + // This should be rare, but better to log this in the future. } - return set; - } + return Collections.unmodifiableSet(set); + } } diff --git a/jdk/src/java.base/share/classes/sun/security/validator/Validator.java b/jdk/src/java.base/share/classes/sun/security/validator/Validator.java index c57c9711bea..c21fd771829 100644 --- a/jdk/src/java.base/share/classes/sun/security/validator/Validator.java +++ b/jdk/src/java.base/share/classes/sun/security/validator/Validator.java @@ -166,7 +166,7 @@ public abstract class Validator { */ 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 --git a/jdk/test/sun/security/ssl/SSLContextImpl/BadTSProvider.java b/jdk/test/sun/security/ssl/SSLContextImpl/BadTSProvider.java index bf68126c4c9..28d13157431 100644 --- a/jdk/test/sun/security/ssl/SSLContextImpl/BadTSProvider.java +++ b/jdk/test/sun/security/ssl/SSLContextImpl/BadTSProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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,18 +21,21 @@ * questions. */ +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + /* * @test * @bug 4919147 * @summary Support for token-based KeyStores * @run main/othervm BadTSProvider - * - * SunJSSE does not support dynamic system properties, no way to re-use - * system properties in samevm/agentvm mode. */ import java.io.*; import java.net.*; +import java.security.*; import javax.net.ssl.*; public class BadTSProvider { @@ -179,13 +182,19 @@ public class BadTSProvider { // XXX this test must be updated if the exception message changes Throwable cause = se.getCause(); - if (cause instanceof java.security.NoSuchAlgorithmException == false) { + if (!(cause instanceof NoSuchAlgorithmException)) { se.printStackTrace(); throw new Exception("Unexpected exception" + se); } cause = cause.getCause(); - if (cause instanceof java.security.NoSuchProviderException == false) { + if (!(cause instanceof KeyStoreException)) { + se.printStackTrace(); + throw new Exception("Unexpected exception" + se); + } + + cause = cause.getCause(); + if (!(cause instanceof NoSuchProviderException)) { se.printStackTrace(); throw new Exception("Unexpected exception" + se); } diff --git a/jdk/test/sun/security/validator/EndEntityExtensionCheck.java b/jdk/test/sun/security/validator/EndEntityExtensionCheck.java index fee67ed55d4..f24463205d2 100644 --- a/jdk/test/sun/security/validator/EndEntityExtensionCheck.java +++ b/jdk/test/sun/security/validator/EndEntityExtensionCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -45,7 +45,7 @@ import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Set; -import sun.security.validator.KeyStores; +import sun.security.validator.TrustStoreUtil; import sun.security.validator.Validator; @@ -113,7 +113,7 @@ public class EndEntityExtensionCheck { Validator v = Validator.getInstance(Validator.TYPE_SIMPLE, Validator.VAR_TLS_CLIENT, - KeyStores.getTrustedCerts(ks)); + TrustStoreUtil.getTrustedCerts(ks)); try { v.validate(chain); throw new Exception("Chain should not have validated " + From 4ec30a933abf34c157cc4ae830fc8917d1d3594b Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 6 Jan 2017 14:16:45 +0100 Subject: [PATCH 114/121] 8172158: Annotation processor not run with -source <= 8 Avoiding use of module prefix to map annotations to processors when running without modules. Reviewed-by: darcy, jjg --- .../JavacProcessingEnvironment.java | 20 ++++++----- .../javac/modules/AnnotationProcessing.java | 34 ++++++++++++++++++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index 85d5ad1345d..f6760de482a 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -114,6 +114,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea 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 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea private final Enter enter; private final Completer initialCompleter; private final Check chk; - private final ModuleSymbol defaultModule; private final Context context; @@ -230,8 +230,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea 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 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea 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 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea supportedAnnotationPatterns = new ArrayList<>(); for (String importString : processor.getSupportedAnnotationTypes()) { - supportedAnnotationPatterns.add(importStringToPattern(importString, + supportedAnnotationPatterns.add(importStringToPattern(allowModules, + importString, processor, log)); } @@ -768,7 +768,8 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea 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 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea 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 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea * 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 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea 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 --git a/langtools/test/tools/javac/modules/AnnotationProcessing.java b/langtools/test/tools/javac/modules/AnnotationProcessing.java index 20f9f825242..d0606a5c3ce 100644 --- a/langtools/test/tools/javac/modules/AnnotationProcessing.java +++ b/langtools/test/tools/javac/modules/AnnotationProcessing.java @@ -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 @@ public class AnnotationProcessing extends ModuleTestBase { } } + @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 { From 6f796f568469b1b6695674d8fb07dd119a78191b Mon Sep 17 00:00:00 2001 From: Robert Field Date: Fri, 6 Jan 2017 10:31:25 -0800 Subject: [PATCH 115/121] 8165405: jshell tool: /classpath is inconsistent 8172103: JShell: crash in TaskFactory$WrapSourceHandler.diag Reviewed-by: jlahoda --- .../jdk/internal/jshell/tool/JShellTool.java | 683 ++++++++++++------ .../jshell/tool/resources/l10n.properties | 75 +- .../share/classes/jdk/jshell/TaskFactory.java | 4 + .../jdk/jshell/CommandCompletionTest.java | 86 ++- langtools/test/jdk/jshell/ToolBasicTest.java | 8 +- langtools/test/jdk/jshell/ToolReloadTest.java | 7 +- langtools/test/jdk/jshell/ToolSimpleTest.java | 11 +- 7 files changed, 607 insertions(+), 267 deletions(-) diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java index c01cd91727b..1d55473db48 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java @@ -47,7 +47,9 @@ import java.nio.file.Paths; 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; @@ -185,10 +187,7 @@ public class JShellTool implements MessageHandler { 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; @@ -198,7 +197,6 @@ public class JShellTool implements MessageHandler { private boolean debug = false; public boolean testPrompt = false; - private String cmdlineClasspath = null; private String defaultStartup = null; private String startup = null; private String executionControlSpec = null; @@ -221,6 +219,16 @@ public class JShellTool implements MessageHandler { 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; NameSpace startNamespace; @@ -229,7 +237,278 @@ public class JShellTool implements MessageHandler { // 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 @@ -464,43 +743,45 @@ public class JShellTool implements MessageHandler { } 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 = defaultStartup(); - } - } - + 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 (regenerateOnDeath && feedback.shouldDisplayCommandFluff()) { - hardmsg("jshell.msg.welcome", version()); + // 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); + } + } + } + private void start(IOContext in) { try { while (regenerateOnDeath) { if (!live) { @@ -530,144 +811,6 @@ public class JShellTool implements MessageHandler { 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(); - OptionSpec ec = parser.accepts("execution").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 (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); - } - startup = sb.toString(); - } 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(ec)) { - executionControlSpec = options.valueOf(ec); - } - - 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")); } @@ -734,8 +877,8 @@ public class JShellTool implements MessageHandler { .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)); + .remoteVMOptions(options.remoteVmOptions()) + .compilerOptions(options.compilerOptions()); if (executionControlSpec != null) { builder.executionEngine(executionControlSpec); } @@ -748,15 +891,6 @@ public class JShellTool implements MessageHandler { }); 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; @@ -767,7 +901,7 @@ public class JShellTool implements MessageHandler { } //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 @@ -782,12 +916,11 @@ public class JShellTool implements MessageHandler { 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) { @@ -1016,6 +1149,13 @@ public class JShellTool implements MessageHandler { 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<>(); @@ -1037,11 +1177,20 @@ public class JShellTool implements MessageHandler { 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); @@ -1167,32 +1316,70 @@ public class JShellTool implements MessageHandler { }; } - 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) -> { @@ -1286,16 +1473,15 @@ public class JShellTool implements MessageHandler { 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)); @@ -1344,6 +1530,9 @@ public class JShellTool implements MessageHandler { registerCommand(new Command("shortcuts", "help.shortcuts", CommandKind.HELP_SUBJECT)); + registerCommand(new Command("context", + "help.context", + CommandKind.HELP_SUBJECT)); commandCompletions = new ContinuousCompletionProvider( commands.values().stream() @@ -1692,17 +1881,6 @@ public class JShellTool implements MessageHandler { 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; @@ -2228,7 +2406,6 @@ public class JShellTool implements MessageHandler { } - // Read a built-in file from resources or null String getResource(String name) { if (BUILTIN_FILE_PATTERN.matcher(name).matches()) { try { @@ -2266,20 +2443,22 @@ public class JShellTool implements MessageHandler { return defaultStartup; } - private boolean cmdReset() { + 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; @@ -2290,13 +2469,57 @@ public class JShellTool implements MessageHandler { 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"); diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties index a92c639548f..6a4beda15b3 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties @@ -52,6 +52,7 @@ jshell.err.unexpected.exception = Unexpected exception: {0} 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. @@ -319,21 +320,25 @@ Leave the jshell tool. No work is saved.\n\ 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\ @@ -345,12 +350,31 @@ and any /drop or /classpath commands in the order they were entered.\n\ 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 = @@ -473,6 +497,37 @@ Shift-\n\t\t\ 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 --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java index 28ed2d2acb8..fc5282122e8 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java @@ -161,6 +161,10 @@ class TaskFactory { @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 --git a/langtools/test/jdk/jshell/CommandCompletionTest.java b/langtools/test/jdk/jshell/CommandCompletionTest.java index 5671aacf432..31559d9f379 100644 --- a/langtools/test/jdk/jshell/CommandCompletionTest.java +++ b/langtools/test/jdk/jshell/CommandCompletionTest.java @@ -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 @@ public class CommandCompletionTest extends ReplToolTesting { @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 class CommandCompletionTest extends ReplToolTesting { 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 @@ public class CommandCompletionTest extends ReplToolTesting { @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 @@ public class CommandCompletionTest extends ReplToolTesting { @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 @@ public class CommandCompletionTest extends ReplToolTesting { 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 @@ public class CommandCompletionTest extends ReplToolTesting { .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 --git a/langtools/test/jdk/jshell/ToolBasicTest.java b/langtools/test/jdk/jshell/ToolBasicTest.java index 74d074d444f..389b3b5a89b 100644 --- a/langtools/test/jdk/jshell/ToolBasicTest.java +++ b/langtools/test/jdk/jshell/ToolBasicTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 + * @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 @@ public class ToolBasicTest extends ReplToolTesting { 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 @@ public class ToolBasicTest extends ReplToolTesting { 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() }, diff --git a/langtools/test/jdk/jshell/ToolReloadTest.java b/langtools/test/jdk/jshell/ToolReloadTest.java index ed4c15b013b..770b0170542 100644 --- a/langtools/test/jdk/jshell/ToolReloadTest.java +++ b/langtools/test/jdk/jshell/ToolReloadTest.java @@ -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 @@ public class ToolReloadTest extends ReplToolTesting { 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 @@ public class ToolReloadTest extends ReplToolTesting { 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 --git a/langtools/test/jdk/jshell/ToolSimpleTest.java b/langtools/test/jdk/jshell/ToolSimpleTest.java index 30955abc149..33760068cf0 100644 --- a/langtools/test/jdk/jshell/ToolSimpleTest.java +++ b/langtools/test/jdk/jshell/ToolSimpleTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 8172102 + * @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 @@ -196,7 +196,7 @@ public class ToolSimpleTest extends ReplToolTesting { @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 @@ -605,6 +605,13 @@ public class ToolSimpleTest extends ReplToolTesting { ); } + @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( From 9e8cb18419910a861dab4ad0c88d261109fcf79e Mon Sep 17 00:00:00 2001 From: Hamlin Li Date: Sun, 8 Jan 2017 23:15:57 -0800 Subject: [PATCH 116/121] 8030175: java/rmi/registry/altSecurityManager/AltSecurityManager.java fails due to timeout Reviewed-by: rriggs --- .../rmi/registry/altSecurityManager/AltSecurityManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java b/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java index 12188414001..2e10313f5fb 100644 --- a/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java +++ b/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java @@ -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 @@ public class AltSecurityManager implements Runnable { 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) { From 56088a52eb6464db4005448e6e6f2ccde4e7e32d Mon Sep 17 00:00:00 2001 From: Nishit Jain Date: Mon, 9 Jan 2017 14:06:32 +0530 Subject: [PATCH 117/121] 8169480: Inconsistencies across Format class hierarchy in their API spec and actual implementation of Exceptions Reviewed-by: naoto --- .../share/classes/java/text/ChoiceFormat.java | 15 +++++++++++- .../share/classes/java/text/DateFormat.java | 23 ++++++++++++++++++- .../classes/java/text/DecimalFormat.java | 6 ++++- .../classes/java/text/MessageFormat.java | 13 ++++++++++- .../share/classes/java/text/NumberFormat.java | 9 +++++++- .../classes/java/text/SimpleDateFormat.java | 5 ++-- 6 files changed, 64 insertions(+), 7 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java index 98c66365c1b..e8fa564ec26 100644 --- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java +++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java @@ -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 @@ public class ChoiceFormat extends NumberFormat { /** * 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 @@ public class ChoiceFormat extends NumberFormat { * 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 @@ public class ChoiceFormat extends NumberFormat { * * @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 @@ public class ChoiceFormat extends NumberFormat { * 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 @@ public class ChoiceFormat extends NumberFormat { * @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 @@ public class ChoiceFormat extends NumberFormat { * 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 --git a/jdk/src/java.base/share/classes/java/text/DateFormat.java b/jdk/src/java.base/share/classes/java/text/DateFormat.java index 3072dec87b4..3b689b534f3 100644 --- a/jdk/src/java.base/share/classes/java/text/DateFormat.java +++ b/jdk/src/java.base/share/classes/java/text/DateFormat.java @@ -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 @@ import sun.util.locale.provider.LocaleServiceProviderPool; * 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 @@ public abstract class DateFormat extends Format { * 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 --git a/jdk/src/java.base/share/classes/java/text/DecimalFormat.java b/jdk/src/java.base/share/classes/java/text/DecimalFormat.java index 724c7e8f84a..3e2a44a2d6c 100644 --- a/jdk/src/java.base/share/classes/java/text/DecimalFormat.java +++ b/jdk/src/java.base/share/classes/java/text/DecimalFormat.java @@ -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 @@ public class DecimalFormat extends NumberFormat { * @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 @@ public class DecimalFormat extends NumberFormat { * @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 --git a/jdk/src/java.base/share/classes/java/text/MessageFormat.java b/jdk/src/java.base/share/classes/java/text/MessageFormat.java index 134f84661af..b1e0eb70e21 100644 --- a/jdk/src/java.base/share/classes/java/text/MessageFormat.java +++ b/jdk/src/java.base/share/classes/java/text/MessageFormat.java @@ -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 @@ public class MessageFormat extends Format { * * @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 @@ public class MessageFormat extends Format { * @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 @@ public class MessageFormat extends Format { * * @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 @@ public class MessageFormat extends Format { * @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 @@ public class MessageFormat extends Format { * 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 @@ public class MessageFormat extends Format { * @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 @@ public class MessageFormat extends Format { * @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 --git a/jdk/src/java.base/share/classes/java/text/NumberFormat.java b/jdk/src/java.base/share/classes/java/text/NumberFormat.java index 68f30d12563..73dbfea6dab 100644 --- a/jdk/src/java.base/share/classes/java/text/NumberFormat.java +++ b/jdk/src/java.base/share/classes/java/text/NumberFormat.java @@ -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 @@ import sun.util.locale.provider.LocaleServiceProviderPool; * 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 --git a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java index d6d6787c72f..00b2b969670 100644 --- a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java +++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java @@ -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 @@ public class SimpleDateFormat extends DateFormat { * @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 @@ public class SimpleDateFormat extends DateFormat { * @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, From a658a1215822939fe71516e86e8c7ffcdd50da88 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 9 Jan 2017 11:55:37 +0100 Subject: [PATCH 118/121] 8172037: Change log message of SetupCopyFiles Reviewed-by: tbell --- make/CopyImportModules.gmk | 3 +++ make/ModuleWrapper.gmk | 1 + make/common/MakeBase.gmk | 10 ++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/make/CopyImportModules.gmk b/make/CopyImportModules.gmk index ee0de88ee84..5b38601c2e8 100644 --- a/make/CopyImportModules.gmk +++ b/make/CopyImportModules.gmk @@ -67,14 +67,17 @@ ifneq ($(LIBS_DIR), ) # 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 --git a/make/ModuleWrapper.gmk b/make/ModuleWrapper.gmk index 498bf19989e..dd6a8afebf1 100644 --- a/make/ModuleWrapper.gmk +++ b/make/ModuleWrapper.gmk @@ -76,6 +76,7 @@ else $(filter $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE)/%, \ $(TARGETS))), \ MACRO := link-file-relative, \ + LOG_ACTION := Creating symlink, \ )) endif diff --git a/make/common/MakeBase.gmk b/make/common/MakeBase.gmk index 8c033a74243..681b6d5fb6a 100644 --- a/make/common/MakeBase.gmk +++ b/make/common/MakeBase.gmk @@ -694,8 +694,9 @@ define AddFileToCopy # 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 @@ identity = \ # 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 @@ define SetupCopyFilesBody $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 @@ define SetupCopyFilesBody $$(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 From 5ddcceeba40d2e458ed9dd4a2568549acbb6d6d1 Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Mon, 9 Jan 2017 11:55:59 +0100 Subject: [PATCH 119/121] 8172037: Change log message of SetupCopyFiles Reviewed-by: tbell --- hotspot/make/CopyToExplodedJdk.gmk | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/make/CopyToExplodedJdk.gmk b/hotspot/make/CopyToExplodedJdk.gmk index 3219d572529..eee2d0cd81e 100644 --- a/hotspot/make/CopyToExplodedJdk.gmk +++ b/hotspot/make/CopyToExplodedJdk.gmk @@ -49,6 +49,7 @@ else 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) From 84149beb873d8a2234ebfe69e56b67c4ca829656 Mon Sep 17 00:00:00 2001 From: "J. Duke" Date: Wed, 5 Jul 2017 22:37:16 +0200 Subject: [PATCH 120/121] Added tag jdk-9+150 for changeset 17469f16fbb4 --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 5413b0483ef..66cc19d8039 100644 --- a/.hgtags +++ b/.hgtags @@ -392,3 +392,4 @@ d62173b931bf5b6bffc6e80a9060bb2e8b8efc75 jdk-9+143 f4e854a77aa38749bd90f722b06974a56e7233d5 jdk-9+147 5c71ea43933b6c7e8a85eb1a4eb2213011b95d82 jdk-9+148 cf139f925da04c8bd7efd33270a0315d72b338d3 jdk-9+149 +17469f16fbb406ec9f0dd262ce776ab6efbc38f1 jdk-9+150 From e20cb44ba97373f52baba2dbb2dccae0479fe09f Mon Sep 17 00:00:00 2001 From: "J. Duke" Date: Wed, 5 Jul 2017 22:39:08 +0200 Subject: [PATCH 121/121] Added tag jdk-9+151 for changeset 37b95df0042a --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 66cc19d8039..51b65df7123 100644 --- a/.hgtags +++ b/.hgtags @@ -393,3 +393,4 @@ f4e854a77aa38749bd90f722b06974a56e7233d5 jdk-9+147 5c71ea43933b6c7e8a85eb1a4eb2213011b95d82 jdk-9+148 cf139f925da04c8bd7efd33270a0315d72b338d3 jdk-9+149 17469f16fbb406ec9f0dd262ce776ab6efbc38f1 jdk-9+150 +37b95df0042ae0687324e1f7dc4a2519e230e704 jdk-9+151